| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 |
- import { Injectable } from '@angular/core';
- import { Observable, of } from 'rxjs';
- import { DocumentSession, DocumentType, createEmptyDocumentSessions } from '../models/document.model';
-
- @Injectable({
- providedIn: 'root'
- })
- export class MockDataService {
- // 模拟项目ID
- private mockProjectId = 'proj_mock_001';
-
- // 模拟文档会话数据
- private mockDocumentSessions: DocumentSession[] = [
- {
- id: DocumentType.UserRequirement,
- sessionId: 'session_user_req_001',
- title: '用户原始需求',
- content: `帮我建立自动补货:要求先按销售业绩进行店铺分组,商品按爆畅平滞分类,后,按照售罄率进行补货等等来编写sql代码,分步骤建立临时表保存过度数据,最后测试通过,发布。
-
- 具体要求:
- 1. 店铺分组:按最近30天销售额分为A、B、C三类店铺
- 2. 商品分类:按销售表现分为爆款、畅款、平款、滞销款
- 3. 补货逻辑:基于售罄率计算补货数量
- 4. 临时表:每个步骤建立临时表保存中间结果
- 5. 最终输出:完整的补货建议报告`,
- type: DocumentType.UserRequirement,
- lastUpdated: new Date('2025-02-13T10:00:00'),
- isLoading: false,
- hasContent: true
- },
- {
- id: DocumentType.Requirement,
- sessionId: 'session_req_002',
- title: '需求文档',
- content: `# 自动补货系统需求文档
-
- ## 1. 业务目标
- 建立智能补货系统,基于销售数据和库存情况自动生成补货建议。
-
- ## 2. 核心功能
- ### 2.1 店铺分级
- - 输入:店铺最近30天销售数据
- - 逻辑:按销售额排序,分为A(前30%)、B(中间40%)、C(后30%)
- - 输出:店铺分级表
-
- ### 2.2 商品分类
- - 输入:商品销售数据(销量、销售额、库存)
- - 逻辑:按销售表现分类:
- - 爆款:销量Top 20%,售罄率>80%
- - 畅款:销量中间60%,售罄率40-80%
- - 平款:销量较低但稳定
- - 滞销款:30天无销售或售罄率<20%
- - 输出:商品分类表
-
- ### 2.3 补货计算
- - 输入:商品分类、店铺分级、当前库存、销售预测
- - 逻辑:基于售罄率计算建议补货数量
- - 公式:建议补货量 = (销售预测 × 补货系数) - 当前库存
- - 输出:补货建议表
-
- ## 3. 数据流程
- 1. 原始销售数据 → 店铺分级
- 2. 商品销售数据 → 商品分类
- 3. 分级+分类+库存 → 补货计算
- 4. 输出补货建议报告`,
- type: DocumentType.Requirement,
- lastUpdated: new Date('2025-02-13T11:30:00'),
- isLoading: false,
- hasContent: true
- },
- {
- id: DocumentType.Technical,
- sessionId: 'session_tech_003',
- title: '技术文档',
- content: `# 自动补货系统技术方案
-
- ## 1. 系统架构
- ### 1.1 数据层
- - 数据源:销售事实表、店铺维度表、商品维度表
- - 存储:MySQL + Redis缓存
- - ETL:每日定时任务更新数据
-
- ### 1.2 计算层
- - 临时表设计:
- \`\`\`sql
- -- 临时表1:店铺分级
- CREATE TEMPORARY TABLE tmp_store_level AS
- SELECT
- store_id,
- sales_amount,
- CASE
- WHEN sales_percentile <= 0.3 THEN 'A'
- WHEN sales_percentile <= 0.7 THEN 'B'
- ELSE 'C'
- END AS store_level
- FROM (
- SELECT
- store_id,
- SUM(sales_amount) as sales_amount,
- PERCENT_RANK() OVER (ORDER BY SUM(sales_amount)) as sales_percentile
- FROM sales_fact
- WHERE sale_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
- GROUP BY store_id
- ) t;
- \`\`\`
-
- ### 1.3 业务层
- - 补货算法实现
- - 参数配置管理
- - 结果输出接口
-
- ## 2. 关键技术
- - SQL窗口函数(PERCENT_RANK)
- - 临时表管理
- - 参数化查询
- - 批量数据处理`,
- type: DocumentType.Technical,
- lastUpdated: new Date('2025-02-13T13:15:00'),
- isLoading: false,
- hasContent: true
- },
- {
- id: DocumentType.Implementation,
- sessionId: 'session_impl_004',
- title: '业务实现',
- content: `# 自动补货SQL实现代码
-
- ## 步骤1:店铺分级
- \`\`\`sql
- -- 创建店铺分级临时表
- DROP TEMPORARY TABLE IF EXISTS tmp_store_level;
- CREATE TEMPORARY TABLE tmp_store_level AS
- WITH store_sales AS (
- SELECT
- s.store_id,
- st.store_name,
- SUM(f.sales_amount) as total_sales,
- COUNT(DISTINCT f.sale_date) as sales_days,
- ROW_NUMBER() OVER (ORDER BY SUM(f.sales_amount) DESC) as rank,
- COUNT(*) OVER () as total_stores
- FROM sales_fact f
- JOIN store_dim s ON f.store_id = s.store_id
- WHERE f.sale_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
- GROUP BY s.store_id, st.store_name
- )
- SELECT
- store_id,
- store_name,
- total_sales,
- sales_days,
- CASE
- WHEN rank <= total_stores * 0.3 THEN 'A'
- WHEN rank <= total_stores * 0.7 THEN 'B'
- ELSE 'C'
- END as store_level
- FROM store_sales;
- \`\`\`
-
- ## 步骤2:商品分类
- \`\`\`sql
- -- 创建商品分类临时表
- DROP TEMPORARY TABLE IF EXISTS tmp_product_category;
- CREATE TEMPORARY TABLE tmp_product_category AS
- SELECT
- p.product_id,
- p.product_name,
- SUM(f.quantity) as total_sales_qty,
- SUM(f.sales_amount) as total_sales_amount,
- AVG(p.current_stock) as avg_stock,
- CASE
- WHEN SUM(f.quantity) > PERCENTILE_CONT(0.8) WITHIN GROUP (ORDER BY SUM(f.quantity)) OVER ()
- AND (SUM(f.quantity) / (AVG(p.current_stock) + SUM(f.quantity))) > 0.8
- THEN '爆款'
- WHEN SUM(f.quantity) > PERCENTILE_CONT(0.2) WITHIN GROUP (ORDER BY SUM(f.quantity)) OVER ()
- THEN '畅款'
- WHEN SUM(f.quantity) > 0 THEN '平款'
- ELSE '滞销款'
- END as product_category
- FROM sales_fact f
- JOIN product_dim p ON f.product_id = p.product_id
- WHERE f.sale_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
- GROUP BY p.product_id, p.product_name;
- \`\`\`
-
- ## 步骤3:补货计算
- \`\`\`sql
- -- 最终补货建议
- SELECT
- s.store_id,
- s.store_name,
- s.store_level,
- p.product_id,
- p.product_name,
- p.product_category,
- p.current_stock,
- f.avg_daily_sales,
- ROUND(f.avg_daily_sales * 7 - p.current_stock, 0) as suggested_replenishment
- FROM store_dim s
- CROSS JOIN product_dim p
- JOIN (
- SELECT
- store_id,
- product_id,
- AVG(quantity) as avg_daily_sales
- FROM sales_fact
- WHERE sale_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)
- GROUP BY store_id, product_id
- ) f ON s.store_id = f.store_id AND p.product_id = f.product_id
- WHERE p.current_stock < f.avg_daily_sales * 3 -- 库存小于3天销量
- ORDER BY s.store_level, p.product_category, suggested_replenishment DESC;
- \`\`\``,
- type: DocumentType.Implementation,
- lastUpdated: new Date('2025-02-13T14:45:00'),
- isLoading: false,
- hasContent: true
- },
- {
- id: DocumentType.Test,
- sessionId: 'session_test_005',
- title: '测试文档',
- content: `# 自动补货系统测试方案
-
- ## 1. 测试数据准备
- ### 1.1 模拟数据
- \`\`\`sql
- -- 创建测试店铺数据
- INSERT INTO store_dim (store_id, store_name, region, create_time) VALUES
- ('S001', '测试店铺A', '华东', NOW()),
- ('S002', '测试店铺B', '华南', NOW()),
- ('S003', '测试店铺C', '华北', NOW());
-
- -- 创建测试商品数据
- INSERT INTO product_dim (product_id, product_name, category, current_stock, create_time) VALUES
- ('P001', '测试商品1', '服装', 100, NOW()),
- ('P002', '测试商品2', '鞋类', 50, NOW()),
- ('P003', '测试商品3', '配件', 200, NOW());
-
- -- 创建测试销售数据
- INSERT INTO sales_fact (sale_id, store_id, product_id, sale_date, quantity, sales_amount) VALUES
- (UUID(), 'S001', 'P001', DATE_SUB(CURDATE(), INTERVAL 1 DAY), 10, 1000),
- (UUID(), 'S001', 'P002', DATE_SUB(CURDATE(), INTERVAL 2 DAY), 5, 750),
- (UUID(), 'S002', 'P001', DATE_SUB(CURDATE(), INTERVAL 3 DAY), 8, 800);
- \`\`\`
-
- ## 2. 功能测试用例
- ### 2.1 店铺分级测试
- - 输入:30天销售数据
- - 预期:正确分为A、B、C三级
- - 验证:检查分级逻辑和比例
-
- ### 2.2 商品分类测试
- - 输入:商品销售数据
- - 预期:正确分为爆、畅、平、滞四类
- - 验证:检查分类算法准确性
-
- ### 2.3 补货计算测试
- - 输入:分级+分类+库存
- - 预期:合理的补货建议
- - 验证:检查计算公式和阈值
-
- ## 3. 性能测试
- - 数据量:1000店铺 × 10000商品
- - 响应时间:< 30秒
- - 内存使用:< 2GB
-
- ## 4. 集成测试
- - 数据流:源系统 → 临时表 → 结果表
- - 异常处理:空数据、异常值、连接中断
- - 恢复机制:失败重试、数据回滚`,
- type: DocumentType.Test,
- lastUpdated: new Date('2025-02-13T16:00:00'),
- isLoading: false,
- hasContent: true
- }
- ];
-
- constructor() { }
-
- /**
- * 获取项目文档会话数据
- */
- getProjectDocuments(projectId: string): Observable<DocumentSession[]> {
- if (projectId === this.mockProjectId) {
- return of(this.mockDocumentSessions);
- }
- // 其他项目返回空数据
- return of(createEmptyDocumentSessions(projectId));
- }
-
- /**
- * 获取项目文档会话映射
- */
- getProjectDocumentSessionIds(projectId: string): Observable<Record<DocumentType, string>> {
- const sessionIds: Record<DocumentType, string> = {
- [DocumentType.UserRequirement]: 'session_user_req_001',
- [DocumentType.Requirement]: 'session_req_002',
- [DocumentType.Technical]: 'session_tech_003',
- [DocumentType.Implementation]: 'session_impl_004',
- [DocumentType.Test]: 'session_test_005'
- };
-
- return of(sessionIds);
- }
-
- /**
- * 模拟SSE事件流
- * 在实际中将被真实的EventService替换
- */
- simulateSSEEvent(sessionId: string, content: string): Observable<string> {
- // 模拟打字机效果
- return new Observable<string>(observer => {
- let index = 0;
- const interval = setInterval(() => {
- if (index < content.length) {
- observer.next(content.charAt(index));
- index++;
- } else {
- clearInterval(interval);
- observer.complete();
- }
- }, 50);
- });
- }
-
- /**
- * 获取模拟AI回复
- */
- getMockAIResponse(): string {
- return `# 自动补货系统实现建议
-
- 我已经分析了您的需求,以下是完整的实现方案:
-
- ## 1. 架构设计
- 采用**分层临时表**策略,确保数据处理流程清晰:
-
- 1. **店铺分级表** (tmp_store_level)
- 2. **商品分类表** (tmp_product_category)
- 3. **销售预测表** (tmp_sales_forecast)
- 4. **补货建议表** (tmp_replenishment_suggestion)
-
- ## 2. 关键技术点
-
- ### 2.1 窗口函数应用
- \`\`\`sql
- -- 使用PERCENT_RANK进行店铺分级
- PERCENT_RANK() OVER (ORDER BY sales_amount) as sales_percentile
- \`\`\`
-
- ### 2.2 临时表管理
- \`\`\`sql
- -- 创建临时表保存中间结果
- CREATE TEMPORARY TABLE tmp_intermediate AS ...
- \`\`\`
-
- ### 2.3 性能优化
- - 索引优化:在store_id, product_id, sale_date上建立索引
- - 分区策略:按日期分区销售事实表
- - 批量处理:分批次处理大数据量
-
- ## 3. 完整实现代码
- [详见业务实现文档]
-
- ## 4. 测试建议
- 1. 单元测试:每个临时表独立测试
- 2. 集成测试:完整流程测试
- 3. 性能测试:大数据量压力测试
-
- ## 5. 部署建议
- 1. 生产环境:每日凌晨执行
- 2. 监控:执行时间、数据质量
- 3. 报警:异常情况及时通知`;
- }
- }
|