Преглед изворни кода

📝 docs(stories): 新增购物车和订单规格支持故事文档

- 新增故事文档 006.007,描述购物车和订单对商品规格的支持需求
- 包含用户故事、验收标准、开发任务、数据模型、API规范和测试要求
- 详细说明父子商品关系、多租户兼容性和向后兼容性约束
- 提供技术实现细节和文件位置参考,为后续开发提供指导
yourname пре 1 месец
родитељ
комит
20f2223d3d
1 измењених фајлова са 169 додато и 0 уклоњено
  1. 169 0
      docs/stories/006.007.story.md

+ 169 - 0
docs/stories/006.007.story.md

@@ -0,0 +1,169 @@
+# Story 006.007: 购物车和订单规格支持
+
+## Status
+Draft
+
+## Story
+**As a** 用户(消费者),
+**I want** 在商品详情页选择规格后,能将正确的子商品信息添加到购物车和订单中,
+**so that** 我可以购买特定规格的商品,并且购物车和订单能显示完整的规格信息
+
+## Acceptance Criteria
+1. 购物车能正确添加子商品(使用子商品信息填充CartItem)
+2. 订单中通过`name`字段显示完整规格信息
+3. 现有单规格商品不受影响,保持向后兼容性
+4. 确保父子商品在同一租户下(多租户兼容性)
+
+## Tasks / Subtasks
+- [ ] 任务1:适配购物车`addToCart`逻辑支持子商品 (AC: 1, 4)
+  - [ ] 修改`CartContext.tsx`中的`addToCart`函数,支持传入子商品ID
+  - [ ] 更新`CartItem`接口,确保包含完整的商品规格信息
+  - [ ] 验证父子商品在同一租户下的约束
+- [ ] 任务2:更新商品详情页的购物车和立即购买逻辑 (AC: 1, 3)
+  - [ ] 修改`mini/src/pages/goods-detail/index.tsx`中的购物车添加逻辑
+  - [ ] 确保规格选择后使用子商品ID、价格、库存信息
+  - [ ] 保持无规格商品(单规格)的现有行为不变
+- [ ] 任务3:确保订单创建使用正确的商品ID (AC: 2, 4)
+  - [ ] 验证订单创建API (`CreateOrderRequestDto`) 支持子商品ID
+  - [ ] 检查`orders-module-mt`中的订单创建逻辑
+  - [ ] 确保`OrderGoodsMt`实体中的`goodsId`字段能正确存储子商品ID
+- [ ] 任务4:更新订单显示逻辑以显示完整规格信息 (AC: 2)
+  - [ ] 修改订单详情页面,显示完整的商品名称(包含规格)
+  - [ ] 更新订单列表中的商品信息显示
+  - [ ] 确保`goodsName`字段包含规格信息
+- [ ] 任务5:编写单元测试和集成测试 (AC: 1-4)
+  - [ ] 为购物车上下文添加规格支持测试
+  - [ ] 为商品详情页的规格选择添加集成测试
+  - [ ] 验证订单创建API的子商品支持测试
+- [ ] 任务6:验证多租户兼容性 (AC: 4)
+  - [ ] 测试父子商品在不同租户下的场景
+  - [ ] 验证租户ID过滤在购物车和订单逻辑中正确应用
+
+## Dev Notes
+
+### 数据模型
+- **商品实体 (`GoodsMt`)**:
+  - `spuId`字段:0表示父商品或单规格商品,>0表示子商品
+  - `spuName`字段:父商品名称
+  - 父子商品在同一租户下(`tenantId`相同)
+  - [Source: packages/goods-module-mt/src/entities/goods.entity.mt.ts#L77-L81]
+
+- **购物车项 (`CartItem`)**:
+  - `id`: 商品ID(可能是子商品ID)
+  - `name`: 商品名称(应包含规格信息)
+  - `price`: 商品价格
+  - `stock`: 库存数量
+  - `spec?`: 可选规格字段
+  - [Source: mini/src/contexts/CartContext.tsx#L4-L12]
+
+- **订单商品实体 (`OrderGoodsMt`)**:
+  - `goodsId`: 商品ID(存储子商品ID)
+  - `goodsName`: 商品名称(应显示完整规格信息)
+  - `price`: 商品价格
+  - `num`: 购买数量
+  - [Source: packages/orders-module-mt/src/entities/order-goods.mt.entity.ts#L26-L45]
+
+- **创建订单请求 (`CreateOrderRequestDto`)**:
+  - `products`: 商品数组,每个包含`id`(商品ID)和`num`(数量)
+  - 当前Schema支持商品ID,无需修改即可支持子商品ID
+  - [Source: packages/orders-module-mt/src/schemas/create-order.schema.ts#L4-L13]
+
+### API 规范
+- **购物车API**:前端本地存储,无需后端API修改
+- **订单创建API**:`POST /api/v1/orders/create-order`
+  - 使用现有`CreateOrderRequestDto`,`products`数组中的`id`字段可以是子商品ID
+  - [Source: packages/orders-module-mt/src/schemas/create-order.schema.ts#L16-L37]
+
+- **商品API**:已支持父子商品查询
+  - 商品详情API返回父商品详情和子商品列表
+  - 子商品API:`GET /api/v1/goods/:id/children` (故事2已实现)
+
+### 组件规范
+- **购物车上下文 (`CartContext`)**:
+  - 位于`mini/src/contexts/CartContext.tsx`
+  - 需要修改`addToCart`函数以支持子商品逻辑
+  - [Source: mini/src/contexts/CartContext.tsx#L90-L127]
+
+- **商品详情页 (`goods-detail/index.tsx`)**:
+  - 已集成`GoodsSpecSelector`组件(故事5-6完成)
+  - 需要更新"加入购物车"和"立即购买"按钮逻辑
+  - [Source: mini/src/pages/goods-detail/index.tsx]
+
+- **规格选择器 (`GoodsSpecSelector`)**:
+  - 已支持父子商品规格选择(故事5完成)
+  - 选择规格时返回子商品ID和名称
+  - [Source: mini/tests/unit/components/goods-spec-selector/goods-spec-selector.test.tsx]
+
+### 文件位置
+- 购物车上下文:`mini/src/contexts/CartContext.tsx`
+- 商品详情页:`mini/src/pages/goods-detail/index.tsx`
+- 订单创建Schema:`packages/orders-module-mt/src/schemas/create-order.schema.ts`
+- 订单商品实体:`packages/orders-module-mt/src/entities/order-goods.mt.entity.ts`
+- 商品实体:`packages/goods-module-mt/src/entities/goods.entity.mt.ts`
+
+### 技术约束
+- **多租户要求**:所有操作必须包含`tenantId`过滤,父子商品必须在同一租户下
+- **向后兼容性**:现有单规格商品(`spuId=0`且无子商品)必须继续正常工作
+- **性能考虑**:购物车使用本地存储,订单创建使用现有API,无额外性能影响
+
+### 先前故事洞察
+- **故事5-6**:已实现`GoodsSpecSelector`组件和商品详情页集成
+- **故事4**:商品API已支持父子商品关系,详情API返回子商品列表
+- **故事2**:已实现子商品管理API,包括获取子商品列表
+- **关键设计决策**:规格=子商品名称,规格选择=选择子商品,购物车逻辑简化(使用子商品的`id`、`name`、`price`、`stock`)
+
+## Testing
+
+### 测试标准
+- **测试框架**:使用Vitest进行单元测试,Testing Library进行组件测试
+- **测试位置**:遵循项目测试目录结构,与源码并列的`tests`文件夹
+- **测试覆盖率**:核心业务逻辑 > 80%,关键模块 > 90%
+- **测试模式**:单元测试 + 集成测试 + E2E测试
+
+### 具体测试要求
+1. **购物车规格支持测试**:
+   - 测试`addToCart`函数正确处理子商品
+   - 验证`CartItem`包含完整规格信息
+   - 测试父子商品租户一致性验证
+
+2. **商品详情页集成测试**:
+   - 测试规格选择后购物车添加逻辑
+   - 验证立即购买流程使用正确商品信息
+   - 测试无规格商品的向后兼容性
+
+3. **订单创建测试**:
+   - 测试订单创建API接受子商品ID
+   - 验证`OrderGoodsMt`正确存储子商品信息
+   - 测试订单显示完整商品名称
+
+4. **多租户兼容性测试**:
+   - 测试父子商品跨租户场景的防错机制
+   - 验证租户ID过滤在购物车和订单中的正确应用
+
+### 测试文件位置
+- 购物车测试:`mini/tests/unit/contexts/CartContext.test.tsx`(需要创建)
+- 商品详情页测试:`mini/tests/unit/pages/goods-detail/goods-detail.test.tsx`(现有)
+- 订单API测试:`packages/orders-module-mt/tests/integration/create-order.integration.test.ts`(现有)
+
+## Change Log
+| Date | Version | Description | Author |
+|------|---------|-------------|--------|
+| 2025-12-13 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
+
+## Dev Agent Record
+*此部分由开发代理在实施过程中填写*
+
+### Agent Model Used
+*待开发代理填写*
+
+### Debug Log References
+*待开发代理填写*
+
+### Completion Notes List
+*待开发代理填写*
+
+### File List
+*待开发代理填写*
+
+## QA Results
+*此部分由QA代理在审查完成后填写*