|
|
@@ -0,0 +1,160 @@
|
|
|
+# Story 006.004: 商品API父子商品支持优化
|
|
|
+
|
|
|
+## Status
|
|
|
+Draft
|
|
|
+
|
|
|
+## Story
|
|
|
+**As a** 商品管理员和普通用户
|
|
|
+**I want** 商品API能正确处理父子商品关系,提供优化的查询性能和清晰的父子关系展示
|
|
|
+**so that** 管理员能有效管理父子商品,用户能获得正确的商品信息,系统性能良好
|
|
|
+
|
|
|
+## Acceptance Criteria
|
|
|
+1. 商品详情API:根据商品类型返回相应数据(父商品+子商品列表或子商品+父商品信息)
|
|
|
+2. 管理员商品API:增强父子商品关系展示和查询优化,**不默认过滤父商品**(管理员需要完整视图)
|
|
|
+3. 商品列表查询性能优化
|
|
|
+4. 添加spuId查询参数支持,管理员可通过`spuId=0`过滤只显示父商品
|
|
|
+5. **管理员商品管理列表页面调整**:
|
|
|
+ - 在商品列表页面添加父子商品关系展示(如显示"父商品"、"子商品"标签)
|
|
|
+ - 添加"只显示父商品"筛选选项,使用spuId=0参数过滤
|
|
|
+ - 优化父子商品关系的可视化展示,便于管理员识别和管理
|
|
|
+
|
|
|
+## Tasks / Subtasks
|
|
|
+- [ ] 优化商品详情API,支持父子商品信息返回 (AC: 1)
|
|
|
+ - [ ] 修改商品详情查询逻辑,根据商品类型返回相应数据
|
|
|
+ - [ ] 父商品详情:返回商品详情 + 子商品列表(作为规格选项)
|
|
|
+ - [ ] 子商品详情:返回子商品详情 + 父商品基本信息
|
|
|
+ - [ ] 保持API向后兼容性
|
|
|
+- [ ] 增强管理员商品API查询功能 (AC: 2, 4)
|
|
|
+ - [ ] 移除管理员商品列表的默认spuId过滤(保持完整视图)
|
|
|
+ - [ ] 添加spuId查询参数支持,支持spuId=0过滤只显示父商品
|
|
|
+ - [ ] 添加spuId查询参数支持,支持spuId>0过滤显示指定父商品的子商品
|
|
|
+ - [ ] 优化查询性能,添加适当的数据库索引
|
|
|
+- [ ] 优化商品列表查询性能 (AC: 3)
|
|
|
+ - [ ] 分析现有查询性能瓶颈
|
|
|
+ - [ ] 优化数据库查询语句,减少不必要的关联查询
|
|
|
+ - [ ] 添加spuId字段的数据库索引(如果不存在)
|
|
|
+ - [ ] 确保多租户查询性能良好
|
|
|
+- [ ] 增强管理员商品管理列表页面 (AC: 5)
|
|
|
+ - [ ] 在商品列表表格中添加父子关系展示列
|
|
|
+ - [ ] 添加"父商品"、"子商品"标签或图标标识
|
|
|
+ - [ ] 添加"只显示父商品"筛选选项,调用API时传递spuId=0参数
|
|
|
+ - [ ] 优化父子商品关系的可视化展示
|
|
|
+ - [ ] 保持现有UI功能不变,仅增强展示和筛选
|
|
|
+- [ ] 添加单元测试和集成测试 (AC: 1-5)
|
|
|
+ - [ ] 为商品详情API添加测试,验证父子商品信息返回
|
|
|
+ - [ ] 为管理员商品API添加测试,验证spuId查询参数功能
|
|
|
+ - [ ] 为商品列表查询性能添加测试
|
|
|
+ - [ ] 更新现有测试,确保向后兼容性
|
|
|
+ - [ ] 添加前端组件测试,验证父子关系展示和筛选功能
|
|
|
+
|
|
|
+## Dev Notes
|
|
|
+
|
|
|
+### 技术栈信息 [Source: architecture/tech-stack.md]
|
|
|
+- **后端框架**: Hono 4.8.5 + TypeScript
|
|
|
+- **数据库**: PostgreSQL 17 + TypeORM 0.3.25
|
|
|
+- **验证**: Zod schema验证
|
|
|
+- **API设计**: RESTful API,使用通用CRUD服务
|
|
|
+- **多租户支持**: 租户ID字段过滤,数据隔离
|
|
|
+
|
|
|
+### 源码树信息 [Source: architecture/source-tree.md]
|
|
|
+- **商品模块包**: `packages/goods-module-mt/` - 多租户商品管理模块
|
|
|
+- **商品管理UI包**: `packages/goods-management-ui-mt/` - 多租户商品管理界面
|
|
|
+- **API路由位置**: `packages/goods-module-mt/src/routes/`
|
|
|
+- **实体位置**: `packages/goods-module-mt/src/entities/goods.entity.mt.ts`
|
|
|
+- **Schema位置**: `packages/goods-module-mt/src/schemas/`
|
|
|
+- **前端组件位置**: `packages/goods-management-ui-mt/src/components/GoodsManagement.tsx`
|
|
|
+
|
|
|
+### 数据模型信息 [Source: architecture/data-model-schema-changes.md]
|
|
|
+- **商品实体字段**:
|
|
|
+ - `spuId`: number - 主商品ID,0表示父商品或单规格商品,>0表示子商品
|
|
|
+ - `spuName`: string | null - 主商品名称
|
|
|
+ - `tenantId`: number - 租户ID,用于多租户数据隔离
|
|
|
+ - `state`: number - 状态(1可用,2不可用)
|
|
|
+- **父子商品关系**: 通过spuId字段建立父子关系,子商品的spuId指向父商品的id
|
|
|
+
|
|
|
+### API信息
|
|
|
+- **公共商品列表API**: `publicGoodsRoutesMt` - 默认只返回父商品(spuId=0)[Source: packages/goods-module-mt/src/routes/public-goods-routes.mt.ts:34]
|
|
|
+- **管理员商品列表API**: `adminGoodsRoutesMt` - 无默认过滤,显示所有商品 [Source: packages/goods-module-mt/src/routes/admin-goods-routes.mt.ts]
|
|
|
+- **获取子商品列表API**: `GET /api/v1/goods/{id}/children` - 已实现 [Source: packages/goods-module-mt/src/routes/public-goods-children.mt.ts]
|
|
|
+- **API聚合**: 通过`admin-goods-aggregated.mt.ts`聚合基础CRUD和父子商品管理路由
|
|
|
+
|
|
|
+### 现有组件分析
|
|
|
+- **`GoodsManagement.tsx`当前状态**:
|
|
|
+ - 显示商品列表表格,包含基本商品信息
|
|
|
+ - 支持搜索、分页、创建、编辑、删除功能
|
|
|
+ - 集成父子商品管理面板(`GoodsParentChildPanel`)
|
|
|
+ - **缺失功能**: 父子关系展示列、"只显示父商品"筛选选项
|
|
|
+- **`publicGoodsRoutesMt`当前状态**:
|
|
|
+ - 默认过滤:`defaultFilters: { state: 1, spuId: 0 }`
|
|
|
+ - 只返回可用状态的父商品
|
|
|
+- **`adminGoodsRoutesMt`当前状态**:
|
|
|
+ - 无默认过滤,显示所有商品
|
|
|
+ - 支持完整CRUD操作
|
|
|
+
|
|
|
+### 文件位置
|
|
|
+- **后端路由文件**:
|
|
|
+ - `packages/goods-module-mt/src/routes/public-goods-routes.mt.ts` - 公共商品路由
|
|
|
+ - `packages/goods-module-mt/src/routes/admin-goods-routes.mt.ts` - 管理员商品路由
|
|
|
+ - `packages/goods-module-mt/src/routes/admin-goods-aggregated.mt.ts` - 聚合路由
|
|
|
+ - `packages/goods-module-mt/src/routes/public-goods-children.mt.ts` - 获取子商品列表路由
|
|
|
+- **前端组件文件**:
|
|
|
+ - `packages/goods-management-ui-mt/src/components/GoodsManagement.tsx` - 商品管理主组件
|
|
|
+- **实体文件**:
|
|
|
+ - `packages/goods-module-mt/src/entities/goods.entity.mt.ts` - 商品实体定义
|
|
|
+- **Schema文件**:
|
|
|
+ - `packages/goods-module-mt/src/schemas/public-goods.schema.mt.ts` - 公共商品Schema
|
|
|
+ - `packages/goods-module-mt/src/schemas/admin-goods.schema.mt.ts` - 管理员商品Schema
|
|
|
+
|
|
|
+### 编码标准 [Source: architecture/coding-standards.md]
|
|
|
+- **测试框架**: Vitest + Testing Library + hono/testing
|
|
|
+- **测试位置**: `tests`文件夹与源码并列(例如:`packages/goods-module-mt/tests/` 与 `packages/goods-module-mt/src/` 并列)
|
|
|
+- **覆盖率目标**: 核心业务逻辑 > 80%
|
|
|
+- **测试类型**: 单元测试、集成测试
|
|
|
+- **RPC客户端架构**: 使用单例模式的客户端管理器,通过`clientManager.get().api.$method`调用
|
|
|
+
|
|
|
+### Testing
|
|
|
+- **测试框架**: Vitest + Testing Library + hono/testing
|
|
|
+- **测试文件位置**:
|
|
|
+ - 后端: `packages/goods-module-mt/tests/integration/`
|
|
|
+ - 前端: `packages/goods-management-ui-mt/tests/unit/`
|
|
|
+- **测试标准**:
|
|
|
+ - API端点功能测试
|
|
|
+ - 查询参数验证测试
|
|
|
+ - 父子商品关系逻辑测试
|
|
|
+ - 性能测试验证
|
|
|
+ - 前端组件渲染和交互测试
|
|
|
+- **测试模式**:
|
|
|
+ - 使用`vi.mock()` mock API客户端
|
|
|
+ - 使用测试数据库进行集成测试
|
|
|
+ - 验证API响应格式和状态码
|
|
|
+ - 验证前端组件状态变化
|
|
|
+- **具体测试要求**:
|
|
|
+ - 测试商品详情API的父子商品信息返回
|
|
|
+ - 测试管理员商品API的spuId查询参数功能
|
|
|
+ - 测试"只显示父商品"筛选功能
|
|
|
+ - 测试父子关系展示列的正确显示
|
|
|
+ - 确保现有功能不受影响
|
|
|
+
|
|
|
+### 项目结构注意事项
|
|
|
+- 保持多租户支持完整,所有查询必须包含tenantId过滤
|
|
|
+- 父子商品必须在同一租户下
|
|
|
+- 保持API向后兼容性,不影响现有客户端
|
|
|
+- 性能优化不能影响现有功能
|
|
|
+
|
|
|
+## Change Log
|
|
|
+| Date | Version | Description | Author |
|
|
|
+|------|---------|-------------|--------|
|
|
|
+| 2025-12-12 | 1.1 | 更新测试目录描述,从 `__tests__` 修正为 `tests` | Bob (Scrum Master) |
|
|
|
+| 2025-12-12 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
|
|
|
+
|
|
|
+## Dev Agent Record
|
|
|
+
|
|
|
+### Agent Model Used
|
|
|
+
|
|
|
+### Debug Log References
|
|
|
+
|
|
|
+### Completion Notes List
|
|
|
+
|
|
|
+### File List
|
|
|
+
|
|
|
+## QA Results
|