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 { if (projectId === this.mockProjectId) { return of(this.mockDocumentSessions); } // 其他项目返回空数据 return of(createEmptyDocumentSessions(projectId)); } /** * 获取项目文档会话映射 */ getProjectDocumentSessionIds(projectId: string): Observable> { const sessionIds: Record = { [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 { // 模拟打字机效果 return new Observable(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. 报警:异常情况及时通知`; } }