|
|
@@ -0,0 +1,326 @@
|
|
|
+# Story 008.007: 移植订单管理UI(order → @d8d/allin-order-management-ui)
|
|
|
+
|
|
|
+## Status
|
|
|
+Draft
|
|
|
+
|
|
|
+## Story
|
|
|
+**As a** 开发者,
|
|
|
+**I want** 将order管理页面从allin_system-master/client移植为独立UI包@d8d/allin-order-management-ui,完成技术栈转换并集成文件上传、区域选择器组件和枚举常量,
|
|
|
+**so that** 我们可以将Allin系统的订单管理UI模块集成到当前项目中,遵循现有的UI包结构和编码标准,并正确集成文件上传、区域选择器和枚举常量功能。
|
|
|
+
|
|
|
+## Acceptance Criteria
|
|
|
+1. 创建`allin-packages/order-management-ui`目录结构
|
|
|
+2. 完成组件转换:订单表格、人员选择、资产关联组件
|
|
|
+3. **文件上传集成**:资产文件关联组件
|
|
|
+4. **区域包集成**:集成`@d8d/area-management-ui`的区域选择器组件用于订单相关区域信息管理
|
|
|
+5. **枚举常量集成**:使用`@d8d/allin-enums`包中的订单状态枚举
|
|
|
+6. 完成API客户端转换:复杂业务API(使用rpcClient + ClientManager模式)
|
|
|
+7. 完成状态管理转换:订单工作流状态
|
|
|
+8. 完成表单转换:多实体关联表单(包含区域选择)
|
|
|
+9. 配置package.json:复杂依赖管理(包含`@d8d/area-management-ui`)
|
|
|
+10. 编写组件测试:覆盖订单全生命周期(包含区域相关功能测试)
|
|
|
+11. 通过类型检查和基本测试验证
|
|
|
+
|
|
|
+## Tasks / Subtasks
|
|
|
+- [ ] 任务1:创建订单管理UI包基础结构 (AC: 1, 9)
|
|
|
+ - [ ] 创建目录结构:`allin-packages/order-management-ui/`
|
|
|
+ - **目标目录**:`allin-packages/order-management-ui/`
|
|
|
+ - **参考结构**:`allin-packages/platform-management-ui/`目录结构
|
|
|
+ - [ ] 创建package.json:配置包名、依赖、脚本
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/package.json`
|
|
|
+ - **包名**:`@d8d/allin-order-management-ui`
|
|
|
+ - **依赖**:`@d8d/allin-order-module`、`@d8d/area-management-ui`、`@d8d/file-management-ui`、`@d8d/allin-enums`、`@d8d/shared-ui-components`、`@tanstack/react-query`、`react-hook-form`、`zod`
|
|
|
+ - **参考文件**:`allin-packages/platform-management-ui/package.json`
|
|
|
+ - [ ] 创建TypeScript配置:`tsconfig.json`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/tsconfig.json`
|
|
|
+ - **参考文件**:`allin-packages/platform-management-ui/tsconfig.json`
|
|
|
+ - [ ] 创建测试配置:`vitest.config.ts`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/vitest.config.ts`
|
|
|
+ - **参考文件**:`allin-packages/platform-management-ui/vitest.config.ts`
|
|
|
+ - [ ] 创建主入口文件:`src/index.ts`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/src/index.ts`
|
|
|
+ - **参考文件**:`allin-packages/platform-management-ui/src/index.ts`
|
|
|
+
|
|
|
+- [ ] 任务2:分析源系统文件并创建API客户端 (AC: 6)
|
|
|
+ - [ ] 分析源系统订单管理页面:`allin_system-master/client/app/admin/dashboard/order/page.tsx`
|
|
|
+ - **源文件**:`allin_system-master/client/app/admin/dashboard/order/page.tsx`
|
|
|
+ - **查看要点**:数据结构、API调用方式、表单字段、人员选择逻辑、资产关联逻辑
|
|
|
+ - [ ] **查看订单模块RPC路由定义**:`allin-packages/order-module/src/routes/order-custom.routes.ts`
|
|
|
+ - **路由文件**:`allin-packages/order-module/src/routes/order-custom.routes.ts`
|
|
|
+ - **查看要点**:路由路径、请求方法、Schema定义
|
|
|
+ - **关键路由路径**:
|
|
|
+ - `POST /order/create` - 创建订单
|
|
|
+ - `PUT /order/update/{id}` - 更新订单
|
|
|
+ - `DELETE /order/delete/{id}` - 删除订单
|
|
|
+ - `GET /order/list` - 分页查询订单
|
|
|
+ - `GET /order/detail/{id}` - 获取订单详情
|
|
|
+ - `POST /order/activate/{orderId}` - 激活订单
|
|
|
+ - `POST /order/close/{orderId}` - 关闭订单
|
|
|
+ - `POST /order/{orderId}/persons/batch` - 批量添加人员到订单
|
|
|
+ - `POST /order/assets/create` - 创建订单人员资产
|
|
|
+ - `GET /order/assets/query` - 查询订单人员资产
|
|
|
+ - `DELETE /order/assets/delete/{id}` - 删除订单人员资产
|
|
|
+ - [ ] **查看订单模块集成测试**:`allin-packages/order-module/tests/integration/order.integration.test.ts`
|
|
|
+ - **测试文件**:`allin-packages/order-module/tests/integration/order.integration.test.ts`
|
|
|
+ - **查看要点**:API调用方式、请求参数、响应格式、错误处理
|
|
|
+ - **关键API调用示例**:
|
|
|
+ - `client.create.$post({ json: createData })` - 创建订单
|
|
|
+ - `client.list.$get({ query: {} })` - 获取订单列表
|
|
|
+ - [ ] 查看订单模块Schema定义:`allin-packages/order-module/src/schemas/order.schema.ts`
|
|
|
+ - **源文件**:`allin-packages/order-module/src/schemas/order.schema.ts`
|
|
|
+ - **查看要点**:`CreateOrderSchema`、`UpdateOrderSchema`、`EmploymentOrderSchema`、字段定义、验证规则(仅用于了解字段结构,不直接导入)
|
|
|
+ - [ ] **创建API客户端**:`src/api/orderClient.ts`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/src/api/orderClient.ts`
|
|
|
+ - **重要原则**:使用ClientManager单例模式管理RPC客户端生命周期
|
|
|
+ - **类型推导**:使用`InferRequestType`和`InferResponseType`从RPC客户端推导类型
|
|
|
+ - **参考模式**:参考现有UI包的API客户端模式
|
|
|
+ - `allin-packages/platform-management-ui/src/api/platformClient.ts` - 平台管理UI API客户端
|
|
|
+ - `allin-packages/platform-management-ui/src/api/types.ts` - 平台管理UI类型定义
|
|
|
+ - `allin-packages/disability-person-management-ui/src/api/disabilityClient.ts` - 残疾人个人管理UI API客户端(最新实现)
|
|
|
+
|
|
|
+- [ ] 任务3:实现文件上传集成 (AC: 3)
|
|
|
+ - [ ] 分析源系统资产文件上传逻辑:`allin_system-master/client/app/admin/dashboard/order/OrderAssetModal.tsx`
|
|
|
+ - **源文件**:`allin_system-master/client/app/admin/dashboard/order/OrderAssetModal.tsx`
|
|
|
+ - **查看要点**:资产文件上传组件、文件处理逻辑、预览功能
|
|
|
+ - [ ] 查看文件管理UI包组件:`packages/file-management-ui/src/components/FileSelector.tsx`
|
|
|
+ - **组件文件**:`packages/file-management-ui/src/components/FileSelector.tsx`
|
|
|
+ - **查看要点**:组件API、事件处理、文件类型限制
|
|
|
+ - [ ] 创建资产文件上传组件:`src/components/AssetUploadField.tsx`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/src/components/AssetUploadField.tsx`
|
|
|
+ - **功能**:集成`FileSelector`组件,支持资产文件上传、预览、删除
|
|
|
+ - **参考文件**:`packages/file-management-ui/src/components/FileSelector.tsx`
|
|
|
+ - [ ] 集成资产文件上传到表单:在订单人员资产表单中添加文件上传字段
|
|
|
+ - **字段**:`fileId`(文件ID字段)
|
|
|
+ - **表单集成**:使用`AssetUploadField`组件,表单接收`fileId`参数
|
|
|
+ - [ ] 创建资产文件预览组件:`src/components/AssetPreview.tsx`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/src/components/AssetPreview.tsx`
|
|
|
+ - **功能**:使用`FilePreview`组件显示资产文件
|
|
|
+ - **参考文件**:`packages/file-management-ui/src/components/FilePreview.tsx`
|
|
|
+
|
|
|
+- [ ] 任务4:实现区域选择器集成 (AC: 4)
|
|
|
+ - [ ] 查看区域管理UI包组件:`packages/area-management-ui/src/components/AreaSelect.tsx`
|
|
|
+ - **组件文件**:`packages/area-management-ui/src/components/AreaSelect.tsx`
|
|
|
+ - **查看要点**:组件API、三级联动逻辑、数据格式
|
|
|
+ - [ ] 集成区域选择器到表单:在订单表单中添加区域选择字段
|
|
|
+ - **字段**:`provinceId`、`cityId`、`districtId`
|
|
|
+ - **表单集成**:直接使用`AreaSelect`组件,支持三级联动
|
|
|
+ - [ ] 实现区域数据转换:将源系统的字符串区域信息转换为区域ID
|
|
|
+ - **数据加载时**:区域ID → 区域名称显示
|
|
|
+ - **数据提交时**:区域ID → 后端API
|
|
|
+
|
|
|
+- [ ] 任务5:实现枚举常量集成 (AC: 5)
|
|
|
+ - [ ] 查看Allin枚举包:`allin-packages/enums/src/index.ts`
|
|
|
+ - **枚举文件**:`allin-packages/enums/src/index.ts`
|
|
|
+ - **查看要点**:订单相关枚举定义(订单状态、工作状态等)
|
|
|
+ - [ ] 集成枚举选择器到表单:在订单表单中添加枚举选择字段
|
|
|
+ - **字段**:`orderStatus`、`workStatus`等
|
|
|
+ - **表单集成**:使用Select组件,从枚举包获取选项
|
|
|
+
|
|
|
+- [ ] 任务6:实现复杂表单组件 (AC: 2, 7, 8)
|
|
|
+ - [ ] 创建订单管理主组件:`src/components/OrderManagement.tsx`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/src/components/OrderManagement.tsx`
|
|
|
+ - **功能**:主管理组件,包含表格、搜索、创建、编辑、人员管理、资产管理功能
|
|
|
+ - **参考文件**:`allin-packages/platform-management-ui/src/components/PlatformManagement.tsx`
|
|
|
+ - [ ] 创建订单表单组件:`src/components/OrderForm.tsx`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/src/components/OrderForm.tsx`
|
|
|
+ - **功能**:复杂表单组件,集成区域选择、枚举选择
|
|
|
+ - **参考模式**:必须使用条件渲染两个独立的Form组件(创建和编辑)
|
|
|
+ - [ ] 创建人员选择组件:`src/components/PersonSelector.tsx`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/src/components/PersonSelector.tsx`
|
|
|
+ - **功能**:人员选择组件,支持批量添加人员到订单
|
|
|
+ - **参考文件**:`allin_system-master/client/app/admin/dashboard/order/SelectPersonModal.tsx`
|
|
|
+ - [ ] 创建资产关联组件:`src/components/AssetAssociation.tsx`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/src/components/AssetAssociation.tsx`
|
|
|
+ - **功能**:资产关联组件,支持添加、编辑、删除订单人员资产
|
|
|
+ - **参考文件**:`allin_system-master/client/app/admin/dashboard/order/OrderAssetModal.tsx`
|
|
|
+ - [ ] 创建订单工作流状态管理:使用React状态管理订单状态转换
|
|
|
+ - **状态转换**:草稿 → 已确认 → 进行中 → 已结束/已取消
|
|
|
+ - **状态管理**:使用React Context或useReducer管理订单工作流状态
|
|
|
+
|
|
|
+- [ ] 任务7:编写集成测试 (AC: 10)
|
|
|
+ - [ ] 创建主测试文件:`tests/integration/order.integration.test.tsx`
|
|
|
+ - **目标文件**:`allin-packages/order-management-ui/tests/integration/order.integration.test.tsx`
|
|
|
+ - **参考文件**:`allin-packages/platform-management-ui/tests/integration/platform.integration.test.tsx`
|
|
|
+ - [ ] 实现完整CRUD流程测试:创建订单 → 查询列表 → 更新 → 删除
|
|
|
+ - **测试场景**:创建订单记录 → 查询订单列表 → 更新记录 → 删除记录
|
|
|
+ - **测试ID**:为关键交互元素添加`data-testid`属性,避免使用文本查找
|
|
|
+ - [ ] 实现文件上传集成测试:验证资产文件上传功能
|
|
|
+ - **测试场景**:资产文件上传组件集成,文件选择、预览、删除功能
|
|
|
+ - **验证点**:文件ID正确传递,表单验证正常工作
|
|
|
+ - [ ] 实现区域选择器集成测试:验证区域选择功能
|
|
|
+ - **测试场景**:区域选择器组件集成,三级联动功能
|
|
|
+ - **验证点**:区域ID正确传递,表单验证正常工作
|
|
|
+ - [ ] 实现枚举选择器集成测试:验证枚举选择功能
|
|
|
+ - **测试场景**:枚举选择器组件集成,选项加载和选择
|
|
|
+ - **验证点**:枚举值正确传递,表单验证正常工作
|
|
|
+ - [ ] 实现人员管理测试:验证批量添加人员功能
|
|
|
+ - **测试场景**:人员选择组件集成,批量添加人员到订单
|
|
|
+ - **验证点**:人员ID正确传递,API调用正常工作
|
|
|
+ - [ ] 实现资产管理测试:验证资产关联功能
|
|
|
+ - **测试场景**:资产关联组件集成,添加、编辑、删除资产
|
|
|
+ - **验证点**:资产文件ID正确传递,API调用正常工作
|
|
|
+ - [ ] 实现订单工作流测试:验证订单状态转换
|
|
|
+ - **测试场景**:订单激活、关闭功能
|
|
|
+ - **验证点**:状态转换逻辑正确,API调用正常工作
|
|
|
+ - [ ] 实现表单验证测试:验证必填字段、业务规则等
|
|
|
+ - **测试场景**:必填字段验证、业务规则验证
|
|
|
+ - **参考模式**:订单模块集成测试中的验证逻辑
|
|
|
+ - [ ] 实现错误处理测试:API错误、网络错误、验证错误
|
|
|
+ - **测试场景**:API错误、网络错误、表单验证错误
|
|
|
+ - **参考模式**:平台管理集成测试中的错误处理
|
|
|
+
|
|
|
+- [ ] 任务8:验证和测试 (AC: 11)
|
|
|
+ - [ ] 运行`pnpm typecheck`确保无类型错误
|
|
|
+ - [ ] 运行`pnpm test`确保所有集成测试通过
|
|
|
+ - [ ] 验证文件上传组件集成正常工作
|
|
|
+ - [ ] 验证区域选择器组件集成正常工作
|
|
|
+ - [ ] 验证枚举选择器组件集成正常工作
|
|
|
+ - [ ] 验证人员管理功能正常工作
|
|
|
+ - [ ] 验证资产管理功能正常工作
|
|
|
+ - [ ] 验证订单工作流状态转换正常工作
|
|
|
+ - [ ] 验证表单验证和错误处理功能
|
|
|
+
|
|
|
+## Dev Notes
|
|
|
+
|
|
|
+### 吸取前面故事的经验(基于故事008.006)
|
|
|
+
|
|
|
+1. **API路径映射验证**:必须验证故事中的API路径映射与实际后端路由定义的一致性。根据查看`order-custom.routes.ts`,实际路由路径与Epic描述一致。
|
|
|
+
|
|
|
+2. **路由结构确认**:通过查看`order.integration.test.ts`确认正确的路由结构:
|
|
|
+ - 创建订单:`client.create.$post({ json: createData })`
|
|
|
+ - 获取订单列表:`client.list.$get({ query: {} })`
|
|
|
+
|
|
|
+3. **参考现有UI包**:必须参考现有UI包(如平台管理UI、残疾人个人管理UI)的实现模式,遵循[UI包开发规范](../architecture/ui-package-standards.md)。
|
|
|
+
|
|
|
+4. **表单组件模式规范**:当组件需要支持创建和编辑两种表单模式时,必须使用条件渲染两个独立的Form组件,避免在单个Form组件上动态切换props。
|
|
|
+
|
|
|
+5. **类型推断最佳实践**:必须使用RPC推断类型,而不是直接导入schema类型,避免Date/string类型不匹配问题。使用`InferRequestType`和`InferResponseType`从RPC客户端推导类型。
|
|
|
+
|
|
|
+6. **测试选择器优化**:必须为关键交互元素添加`data-testid`属性,避免使用文本查找导致的测试冲突。使用kebab-case格式:`{action}-{element}-{purpose}`。
|
|
|
+
|
|
|
+### 技术架构信息 [Source: architecture/ui-package-standards.md]
|
|
|
+
|
|
|
+#### 包结构规范
|
|
|
+- **标准目录结构**:`packages/<module-name>-ui/`包含`src/`、`tests/`等目录
|
|
|
+- **package.json配置**:使用`@d8d/allin-order-management-ui`包名,`"type": "module"`,主入口为`src/index.ts`
|
|
|
+- **依赖管理**:使用workspace依赖:`"@d8d/allin-order-module": "workspace:*"`
|
|
|
+
|
|
|
+#### RPC客户端实现规范
|
|
|
+- **客户端管理器模式**:必须实现`ClientManager`类来管理RPC客户端生命周期
|
|
|
+- **单例模式**:使用静态`getInstance()`方法确保单例
|
|
|
+- **延迟初始化**:客户端在第一次调用`get()`方法时初始化
|
|
|
+
|
|
|
+#### 组件开发规范
|
|
|
+- **组件结构**:使用React Query进行数据管理,使用RPC客户端进行API调用
|
|
|
+- **表单处理**:使用React Hook Form + Zod进行表单验证
|
|
|
+- **状态管理**:使用React Query + React状态(useState/useContext)
|
|
|
+
|
|
|
+#### 类型定义规范
|
|
|
+- **类型推断**:使用RPC推断类型:`export type OrderResponse = InferResponseType<typeof orderClient.list.$get, 200>['data'][0];`
|
|
|
+- **避免直接导入schema**:不直接导入`@d8d/allin-order-module/schemas`中的类型
|
|
|
+
|
|
|
+#### 测试规范
|
|
|
+- **测试文件结构**:`tests/integration/`、`tests/components/`、`tests/unit/`
|
|
|
+- **Mock响应工具函数**:使用标准mock响应函数
|
|
|
+- **测试选择器**:优先使用`data-testid`属性
|
|
|
+
|
|
|
+### 项目结构对齐 [Source: architecture/source-tree.md]
|
|
|
+
|
|
|
+#### 文件位置规范
|
|
|
+- **UI包位置**:`allin-packages/order-management-ui/`(Allin系统专属包目录)
|
|
|
+- **源系统文件**:`allin_system-master/client/app/admin/dashboard/order/`
|
|
|
+- **参考UI包**:`allin-packages/platform-management-ui/`(基础参考)
|
|
|
+- **参考最新实现**:`allin-packages/disability-person-management-ui/`(最新复杂实现)
|
|
|
+
|
|
|
+#### 需要迁移的源系统文件路径
|
|
|
+1. **主页面**:`allin_system-master/client/app/admin/dashboard/order/page.tsx`
|
|
|
+2. **订单服务**:`allin_system-master/client/app/admin/dashboard/order/orderService.ts`
|
|
|
+3. **模态框组件**:
|
|
|
+ - `allin_system-master/client/app/admin/dashboard/order/AddOrderModal.tsx`
|
|
|
+ - `allin_system-master/client/app/admin/dashboard/order/AssetPreviewModal.tsx`
|
|
|
+ - `allin_system-master/client/app/admin/dashboard/order/AttendanceModal.tsx`
|
|
|
+ - `allin_system-master/client/app/admin/dashboard/order/OrderAssetModal.tsx`
|
|
|
+ - `allin_system-master/client/app/admin/dashboard/order/OrderDetailModal.tsx`
|
|
|
+ - `allin_system-master/client/app/admin/dashboard/order/SelectPersonModal.tsx`
|
|
|
+
|
|
|
+#### 需要参考对照的文件路径
|
|
|
+1. **后端模块路由**:`allin-packages/order-module/src/routes/order-custom.routes.ts`
|
|
|
+2. **后端模块集成测试**:`allin-packages/order-module/tests/integration/order.integration.test.ts`
|
|
|
+3. **后端模块Schema**:`allin-packages/order-module/src/schemas/order.schema.ts`
|
|
|
+4. **现有UI包参考**:
|
|
|
+ - `allin-packages/platform-management-ui/src/api/platformClient.ts`
|
|
|
+ - `allin-packages/platform-management-ui/src/components/PlatformManagement.tsx`
|
|
|
+ - `allin-packages/disability-person-management-ui/src/api/disabilityClient.ts`
|
|
|
+ - `allin-packages/disability-person-management-ui/src/components/DisabilityPersonManagement.tsx`
|
|
|
+5. **共享组件参考**:
|
|
|
+ - `packages/file-management-ui/src/components/FileSelector.tsx`
|
|
|
+ - `packages/area-management-ui/src/components/AreaSelect.tsx`
|
|
|
+6. **枚举包参考**:`allin-packages/enums/src/index.ts`
|
|
|
+
|
|
|
+### 订单模块RPC路由调用路径(基于后端集成测试验证)
|
|
|
+根据`allin-packages/order-module/tests/integration/order.integration.test.ts`确认的API调用路径:
|
|
|
+
|
|
|
+1. **创建订单**:`client.create.$post({ json: createData })`
|
|
|
+2. **获取订单列表**:`client.list.$get({ query: {} })`
|
|
|
+3. **获取订单详情**:`client.detail[':id'].$get({ param: { id } })`(需要验证实际路径)
|
|
|
+4. **更新订单**:`client.update[':id'].$put({ param: { id }, json: updateData })`
|
|
|
+5. **删除订单**:`client.delete[':id'].$delete({ param: { id } })`
|
|
|
+6. **激活订单**:`client.activate[':orderId'].$post({ param: { orderId } })`
|
|
|
+7. **关闭订单**:`client.close[':orderId'].$post({ param: { orderId } })`
|
|
|
+8. **批量添加人员**:`client[':orderId'].persons.batch.$post({ param: { orderId }, json: { persons } })`
|
|
|
+9. **创建订单人员资产**:`client.assets.create.$post({ json: assetData })`
|
|
|
+10. **查询订单人员资产**:`client.assets.query.$get({ query: assetQuery })`
|
|
|
+11. **删除订单人员资产**:`client.assets.delete[':id'].$delete({ param: { id } })`
|
|
|
+
|
|
|
+**注意**:实际路由结构需要通过查看`order-custom.routes.ts`和集成测试文件确认,上述路径为初步推断。
|
|
|
+
|
|
|
+### 技术栈转换要求
|
|
|
+- **UI框架**:Ant Design → @d8d/shared-ui-components
|
|
|
+- **状态管理**:Jotai → React Query + React状态
|
|
|
+- **表单处理**:Ant Design Form → React Hook Form + Zod
|
|
|
+- **API客户端**:自定义fetch API → Hono RPC (rpcClient + ClientManager模式)
|
|
|
+- **文件上传**:直接文件上传 → 集成`@d8d/file-management-ui`文件选择器组件
|
|
|
+- **区域选择**:自定义区域选择 → 集成`@d8d/area-management-ui`区域选择器组件
|
|
|
+- **枚举常量**:硬编码枚举 → 使用`@d8d/allin-enums`包中的枚举
|
|
|
+
|
|
|
+### Testing
|
|
|
+
|
|
|
+#### 测试标准 [Source: architecture/ui-package-standards.md#测试规范]
|
|
|
+- **测试框架**:Vitest + Testing Library
|
|
|
+- **测试文件位置**:`tests/integration/`、`tests/components/`、`tests/unit/`
|
|
|
+- **测试选择器**:优先使用`data-testid`属性,避免文本查找
|
|
|
+- **Mock响应**:使用标准mock响应工具函数
|
|
|
+- **测试覆盖**:必须覆盖所有主要组件和用户交互
|
|
|
+
|
|
|
+#### 特定测试要求
|
|
|
+- **集成测试**:验证完整的CRUD流程、文件上传、区域选择、枚举选择、人员管理、资产管理、订单工作流
|
|
|
+- **组件测试**:验证各个组件的渲染和交互
|
|
|
+- **表单验证测试**:验证必填字段、业务规则、错误处理
|
|
|
+- **错误处理测试**:验证API错误、网络错误、验证错误的处理
|
|
|
+
|
|
|
+#### 测试ID命名约定
|
|
|
+- 使用kebab-case格式:`{action}-{element}-{purpose}`
|
|
|
+- 示例:`create-order-modal-title`、`edit-order-button-1`、`delete-confirm-dialog-title`
|
|
|
+
|
|
|
+## Change Log
|
|
|
+| Date | Version | Description | Author |
|
|
|
+|------|---------|-------------|--------|
|
|
|
+| 2025-12-04 | 1.0 | 初始创建故事008.007 | Bob (Scrum Master) |
|
|
|
+
|
|
|
+## Dev Agent Record
|
|
|
+*此部分由开发代理在实施期间填写*
|
|
|
+
|
|
|
+### Agent Model Used
|
|
|
+*记录用于开发的特定AI代理模型和版本*
|
|
|
+
|
|
|
+### Debug Log References
|
|
|
+*引用开发期间生成的任何调试日志或跟踪*
|
|
|
+
|
|
|
+### Completion Notes List
|
|
|
+*关于任务完成情况和遇到的任何问题的说明*
|
|
|
+
|
|
|
+### File List
|
|
|
+*列出故事实施期间创建、修改或影响的所有文件*
|
|
|
+
|
|
|
+## QA Results
|
|
|
+*来自QA代理对已完成故事实施的QA审查结果*
|