Răsfoiți Sursa

📝 docs(story-007.003): 创建Allin系统枚举常量包故事

创建故事007.003:创建Allin系统枚举常量包(@d8d/allin-enums)
- 根据PRD设计决策,将字典管理模块重构为枚举常量包
- 定义4个枚举:DisabilityType、DisabilityLevel、OrderStatus、WorkStatus
- 吸取之前故事的经验教训,明确标注迁移文件路径和参考文件路径
- 配置为pnpm workspace包,直接引用源码无需构建
- 包含完整的测试指导和验收标准

🤖 Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
yourname 3 săptămâni în urmă
părinte
comite
ff3635ec06
1 a modificat fișierele cu 278 adăugiri și 0 ștergeri
  1. 278 0
      docs/stories/007.003.create-allin-enums-package.story.md

+ 278 - 0
docs/stories/007.003.create-allin-enums-package.story.md

@@ -0,0 +1,278 @@
+# Story 007.003: 创建Allin系统枚举常量包(@d8d/allin-enums)
+
+## Status
+Draft
+
+## Story
+**As a** 开发者,
+**I want** 创建专门供Allin系统使用的枚举常量包`@d8d/allin-enums`,替换原有的数据库字典管理功能,
+**so that** 我们可以为disability-module和order-module等后续模块提供类型安全的枚举常量,提高代码可读性和维护性,同时避免不必要的数据库查询。
+
+## Acceptance Criteria
+1. ✅ 创建`allin-packages/enums`目录结构
+2. ✅ 定义残疾类型枚举:`DisabilityType`(vision, hearing, speech, physical, intellectual, mental, multiple)
+3. ✅ 定义残疾等级枚举:`DisabilityLevel`(1, 2, 3, 4)
+4. ✅ 定义订单状态枚举:`OrderStatus`(draft, confirmed, in_progress, completed, cancelled)
+5. ✅ 定义工作状态枚举:`WorkStatus`(not_working, pre_working, working, resigned)
+6. ✅ 配置package.json:包名`@d8d/allin-enums`,workspace依赖
+7. ✅ 编写类型定义测试:验证枚举值正确性
+8. ✅ 通过类型检查和导出验证
+9. ✅ 更新后续模块依赖:确保disability-module和order-module使用枚举常量
+
+## Tasks / Subtasks
+- [ ] 创建`allin-packages/enums`目录结构 (AC: 1)
+  - [ ] 创建`allin-packages/enums/`目录
+    - **迁移文件路径**: `allin-packages/enums/`
+    - **注意吸取经验**: 根据故事007.001的经验,需要在`pnpm-workspace.yaml`中添加`allin-packages/*`配置
+  - [ ] 创建`package.json`文件,配置包名`@d8d/allin-enums`和workspace依赖
+    - **参考文件**: `allin-packages/channel-module/package.json`
+    - **修改点**: 包名改为`@d8d/allin-enums`,依赖调整
+    - **关键依赖**: 作为基础常量包,不需要依赖其他allin模块
+    - **注意吸取经验**: 根据故事007.001的经验,需要正确处理workspace依赖配置
+    - **迁移文件路径**: `allin-packages/enums/package.json`
+  - [ ] 创建`tsconfig.json`文件,配置TypeScript编译选项
+    - **参考文件**: `allin-packages/channel-module/tsconfig.json`
+    - **修改点**: 调整输出目录和模块配置
+    - **迁移文件路径**: `allin-packages/enums/tsconfig.json`
+  - [ ] 创建`vitest.config.ts`文件,配置测试环境
+    - **参考文件**: `allin-packages/channel-module/vitest.config.ts`
+    - **修改点**: 调整测试配置,枚举包不需要数据库连接
+    - **迁移文件路径**: `allin-packages/enums/vitest.config.ts`
+  - [ ] 创建`src/`目录结构:`enums/`, `types/`, `index.ts`
+    - **参考结构**: `packages/shared-types/src/`目录结构
+    - **迁移文件路径**: `allin-packages/enums/src/`
+- [ ] 定义残疾类型枚举:`DisabilityType` (AC: 2)
+  - [ ] 分析源数据`allin_2025-11-25.sql`中的`sys_dict`表数据
+    - **源文件**: `allin_2025-11-25.sql`
+    - **查找关键词**: `disability_type`
+    - **预期值**: vision(视力残疾), hearing(听力残疾), speech(言语残疾), physical(肢体残疾), intellectual(智力残疾), mental(精神残疾), multiple(多重残疾)
+    - **注意**: 保持与原始数据库值一致(小写字符串)
+  - [ ] 创建枚举文件`src/enums/disability-type.enum.ts`
+    - **参考文件**: 参考现有TypeScript枚举定义模式
+    - **枚举定义**: 使用`enum DisabilityType`或`const DisabilityType`定义
+    - **值映射**: `DisabilityType.VISION = 'vision'`, `DisabilityType.HEARING = 'hearing'`等
+    - **注释**: 为每个枚举值添加中文注释说明
+    - **迁移文件路径**: `allin-packages/enums/src/enums/disability-type.enum.ts`
+- [ ] 定义残疾等级枚举:`DisabilityLevel` (AC: 3)
+  - [ ] 分析源数据`allin_2025-11-25.sql`中的`sys_dict`表数据
+    - **源文件**: `allin_2025-11-25.sql`
+    - **查找关键词**: `disability_level`
+    - **预期值**: 1(一级), 2(二级), 3(三级), 4(四级)
+    - **注意**: 数据库存储为数字,枚举值也使用数字
+  - [ ] 创建枚举文件`src/enums/disability-level.enum.ts`
+    - **枚举定义**: 使用数字枚举`enum DisabilityLevel { ONE = 1, TWO = 2, THREE = 3, FOUR = 4 }`
+    - **注释**: 为每个等级添加中文说明
+    - **迁移文件路径**: `allin-packages/enums/src/enums/disability-level.enum.ts`
+- [ ] 定义订单状态枚举:`OrderStatus` (AC: 4)
+  - [ ] 分析源数据`allin_2025-11-25.sql`中的`sys_dict`表数据
+    - **源文件**: `allin_2025-11-25.sql`
+    - **查找关键词**: `order_status`
+    - **预期值**: draft(草稿), confirmed(已确认), in_progress(进行中), completed(已完成), cancelled(已取消)
+    - **注意**: 保持与原始数据库值一致(小写字符串,下划线分隔)
+  - [ ] 创建枚举文件`src/enums/order-status.enum.ts`
+    - **枚举定义**: 使用字符串枚举
+    - **值映射**: `OrderStatus.DRAFT = 'draft'`, `OrderStatus.CONFIRMED = 'confirmed'`等
+    - **注释**: 为每个状态添加中文说明和业务含义
+    - **迁移文件路径**: `allin-packages/enums/src/enums/order-status.enum.ts`
+- [ ] 定义工作状态枚举:`WorkStatus` (AC: 5)
+  - [ ] 分析源数据`allin_2025-11-25.sql`中的`sys_dict`表数据
+    - **源文件**: `allin_2025-11-25.sql`
+    - **查找关键词**: `work_status`
+    - **预期值**: not_working(未就业), pre_working(待就业), working(已就业), resigned(已离职)
+    - **注意**: 保持与原始数据库值一致(小写字符串,下划线分隔)
+  - [ ] 创建枚举文件`src/enums/work-status.enum.ts`
+    - **枚举定义**: 使用字符串枚举
+    - **值映射**: `WorkStatus.NOT_WORKING = 'not_working'`, `WorkStatus.PRE_WORKING = 'pre_working'`等
+    - **注释**: 为每个状态添加中文说明和业务含义
+    - **迁移文件路径**: `allin-packages/enums/src/enums/work-status.enum.ts`
+- [ ] 配置package.json:包名`@d8d/allin-enums`,workspace依赖 (AC: 6)
+  - [ ] 创建`package.json`文件
+    - **参考文件**: `allin-packages/channel-module/package.json`
+    - **关键配置**:
+      - `"name": "@d8d/allin-enums"`
+      - `"type": "module"`
+      - `"main": "src/index.ts"`  # 直接引用源码,workspace中不需要构建
+      - `"types": "src/index.ts"` # 类型定义直接使用源码
+      - `"scripts"`: 添加`"test"`, `"typecheck"`等脚本(不需要`"build"`脚本)
+      - `"dependencies"`: 不需要特殊依赖
+      - `"devDependencies"`: 添加`"typescript"`, `"vitest"`, `"@types/node"`等
+    - **注意吸取经验**: 根据故事007.001的经验,需要正确配置workspace依赖
+    - **注意**: 在pnpm workspace中,枚举常量包直接引用源码,避免不必要的构建步骤
+    - **迁移文件路径**: `allin-packages/enums/package.json`
+  - [ ] 更新根目录的`pnpm-workspace.yaml`文件
+    - **源文件**: `pnpm-workspace.yaml`
+    - **修改点**: 确保包含`allin-packages/enums`路径
+    - **注意吸取经验**: 根据故事007.001的经验,需要添加`allin-packages/*`配置
+- [ ] 编写类型定义测试:验证枚举值正确性 (AC: 7)
+  - [ ] 创建测试文件`tests/unit/enums.test.ts`
+    - **参考文件**: `packages/shared-types/tests/unit/types.test.ts`
+    - **测试内容**:
+      - 验证`DisabilityType`枚举包含所有7个值
+      - 验证`DisabilityLevel`枚举包含4个数字等级
+      - 验证`OrderStatus`枚举包含5个状态值
+      - 验证`WorkStatus`枚举包含4个状态值
+      - 验证枚举值与数据库原始值一致
+    - **测试框架**: 使用Vitest
+    - **迁移文件路径**: `allin-packages/enums/tests/unit/enums.test.ts`
+  - [ ] 创建测试文件`tests/unit/export.test.ts`
+    - **测试内容**: 验证从`src/index.ts`导出的所有枚举
+    - **验证点**: 确保所有枚举都能正确导入和使用
+    - **迁移文件路径**: `allin-packages/enums/tests/unit/export.test.ts`
+- [ ] 通过类型检查和导出验证 (AC: 8)
+  - [ ] 创建`src/index.ts`文件,统一导出所有枚举
+    - **参考文件**: `packages/shared-types/src/index.ts`
+    - **导出内容**: 导出所有4个枚举类型和值
+    - **导出格式**: `export { DisabilityType } from './enums/disability-type.enum';`等
+    - **迁移文件路径**: `allin-packages/enums/src/index.ts`
+  - [ ] 运行类型检查`pnpm typecheck`
+    - **命令**: 在`allin-packages/enums`目录下运行`pnpm typecheck`
+    - **预期结果**: 无类型错误
+    - **注意**: 确保所有枚举类型定义正确
+  - [ ] 运行测试`pnpm test`
+    - **命令**: 在`allin-packages/enums`目录下运行`pnpm test`
+    - **预期结果**: 所有测试通过
+  - [ ] 验证类型定义导出
+    - **命令**: 在`allin-packages/enums`目录下运行`pnpm typecheck`
+    - **预期结果**: 无类型错误,类型定义正确导出
+    - **注意**: 枚举包在workspace中直接引用源码,不需要构建步骤
+- [ ] 更新后续模块依赖:确保disability-module和order-module使用枚举常量 (AC: 9)
+  - [ ] 在`disability-module`的`package.json`中添加对`@d8d/allin-enums`的依赖
+    - **注意**: 需要等待disability-module创建时添加
+    - **依赖配置**: `"@d8d/allin-enums": "workspace:*"`
+  - [ ] 在`order-module`的`package.json`中添加对`@d8d/allin-enums`的依赖
+    - **注意**: 需要等待order-module创建时添加
+    - **依赖配置**: `"@d8d/allin-enums": "workspace:*"`
+  - [ ] 创建使用示例文档`docs/examples/enums-usage.md`
+    - **内容**: 展示如何在disability-module和order-module中使用枚举
+    - **示例代码**: 包含导入、类型注解、值比较等示例
+    - **迁移文件路径**: `allin-packages/enums/docs/examples/enums-usage.md`
+
+## Dev Notes
+### 先前故事洞察
+- **故事007.001(channel-module)经验**:
+  - 需要在`pnpm-workspace.yaml`中添加`allin-packages/*`配置 [Source: docs/stories/007.001.transplant-channel-management-module.story.md]
+  - 需要正确处理workspace依赖配置
+  - 包结构应参考现有模块模式
+- **故事007.002(company-module)经验**:
+  - 需要处理模块依赖关系(虽然enums包是基础包,但后续模块会依赖它)
+  - 需要先创建基础包,再创建依赖它的模块
+- **设计决策背景**:
+  - 根据PRD设计决策,放弃移植`dict_management`模块,改为创建枚举常量包 [Source: docs/prd/epic-007-allin-system-transplant.md#设计决策:字典管理模块重构为枚举常量包]
+  - 原因:类型安全、性能优化、代码清晰、维护简单、避免重复
+
+### 数据模型
+- **源数据位置**:`allin_2025-11-25.sql`中的`sys_dict`表 [Source: docs/prd/epic-007-allin-system-transplant.md#设计决策:字典管理模块重构为枚举常量包]
+- **枚举定义要求**:
+  - **DisabilityType**(残疾类型):7种固定类型 - vision, hearing, speech, physical, intellectual, mental, multiple
+  - **DisabilityLevel**(残疾等级):4个固定等级 - 1, 2, 3, 4
+  - **OrderStatus**(订单状态):5种固定状态 - draft, confirmed, in_progress, completed, cancelled
+  - **WorkStatus**(工作状态):4种固定状态 - not_working, pre_working, working, resigned
+- **值映射要求**:保持与原始数据库值一致(如`disability_type='vision'` → `DisabilityType.VISION = 'vision'`)[Source: docs/prd/epic-007-allin-system-transplant.md#技术实现要求]
+
+### 文件位置
+- **包位置**:`allin-packages/enums/` [Source: docs/prd/epic-007-allin-system-transplant.md#技术实现要求]
+- **包名**:`@d8d/allin-enums` [Source: docs/prd/epic-007-allin-system-transplant.md#技术实现要求]
+- **导出方式**:通过`src/index.ts`统一导出所有枚举 [Source: docs/prd/epic-007-allin-system-transplant.md#技术实现要求]
+- **类型定义**:使用TypeScript `enum`或`const enum`定义 [Source: docs/prd/epic-007-allin-system-transplant.md#技术实现要求]
+
+### 项目结构对齐
+- **参考结构**:`packages/shared-types/`目录结构 [Source: docs/architecture/source-tree.md#实际项目结构]
+- **目录组织**:
+  ```
+  allin-packages/enums/
+  ├── package.json
+  ├── tsconfig.json
+  ├── vitest.config.ts
+  ├── src/
+  │   ├── enums/
+  │   │   ├── disability-type.enum.ts
+  │   │   ├── disability-level.enum.ts
+  │   │   ├── order-status.enum.ts
+  │   │   └── work-status.enum.ts
+  │   ├── types/ (预留,如有需要)
+  │   └── index.ts
+  ├── tests/
+  │   └── unit/
+  │       ├── enums.test.ts
+  │       └── export.test.ts
+  └── # 注意:枚举常量包在workspace中直接引用源码,不需要dist目录
+  ```
+- **workspace配置**:需要在根目录`pnpm-workspace.yaml`中添加`allin-packages/enums` [Source: 故事007.001经验]
+
+### 测试要求
+- **测试框架**:Vitest [Source: docs/architecture/testing-strategy.md#单元测试]
+- **测试位置**:`tests/unit/`目录 [Source: docs/architecture/testing-strategy.md#单元测试]
+- **测试覆盖率**:≥ 80% [Source: docs/architecture/testing-strategy.md#单元测试]
+- **测试内容**:
+  - 验证枚举值正确性
+  - 验证导出完整性
+  - 验证类型定义正确性
+- **测试模式**:参考`packages/shared-types/tests/unit/`中的测试模式
+
+### 技术约束
+- **TypeScript配置**:使用严格模式
+- **构建输出**:在pnpm workspace中直接引用源码,不需要构建输出
+- **版本管理**:作为workspace包管理
+- **依赖关系**:无外部依赖,纯TypeScript定义包
+
+### 对后续模块的影响
+1. **disability-module**:将使用`DisabilityType`和`DisabilityLevel`枚举 [Source: docs/prd/epic-007-allin-system-transplant.md#对后续模块的影响]
+2. **order-module**:将使用`OrderStatus`和`WorkStatus`枚举 [Source: docs/prd/epic-007-allin-system-transplant.md#对后续模块的影响]
+3. **其他模块**:根据需要使用相应枚举
+
+### 优势(来自PRD)
+- ✅ **类型安全**:编译时检查,避免无效值 [Source: docs/prd/epic-007-allin-system-transplant.md#优势]
+- ✅ **性能优化**:无需数据库查询 [Source: docs/prd/epic-007-allin-system-transplant.md#优势]
+- ✅ **代码提示**:IDE自动补全枚举值 [Source: docs/prd/epic-007-allin-system-transplant.md#优势]
+- ✅ **维护简单**:集中管理,一处修改处处生效 [Source: docs/prd/epic-007-allin-system-transplant.md#优势]
+- ✅ **版本控制**:枚举定义与代码一起版本控制 [Source: docs/prd/epic-007-allin-system-transplant.md#优势]
+
+## Testing
+### 测试标准
+- **测试框架**:Vitest [Source: docs/architecture/testing-strategy.md#单元测试]
+- **测试位置**:`tests/unit/`目录 [Source: docs/architecture/testing-strategy.md#单元测试]
+- **测试文件命名**:`enums.test.ts`, `export.test.ts` [Source: docs/architecture/testing-strategy.md#测试命名约定]
+- **测试描述格式**:使用「应该...」格式描述测试行为 [Source: docs/architecture/testing-strategy.md#测试命名约定]
+
+### 具体测试要求
+1. **枚举值验证测试**:
+   - 验证每个枚举包含正确的值数量
+   - 验证枚举值与数据库原始值一致
+   - 验证枚举值类型正确(字符串或数字)
+
+2. **导出验证测试**:
+   - 验证从`src/index.ts`可以正确导入所有枚举
+   - 验证导入的枚举类型正确
+   - 验证枚举值可以正常使用
+
+3. **类型安全测试**:
+   - 验证TypeScript类型检查能捕获无效枚举值
+   - 验证枚举类型可以用于函数参数和返回值类型注解
+
+### 测试执行
+- **本地测试命令**:`pnpm test`(在`allin-packages/enums`目录下)
+- **覆盖率检查**:`pnpm test:coverage`
+- **类型检查**:`pnpm typecheck`
+
+## Change Log
+| Date | Version | Description | Author |
+|------|---------|-------------|--------|
+| 2025-12-02 | 1.0 | 初始创建故事007.003 | Bob (Scrum Master) |
+
+## Dev Agent Record
+*此部分由开发代理在实施过程中填写*
+
+### Agent Model Used
+*待填写*
+
+### Debug Log References
+*待填写*
+
+### Completion Notes List
+*待填写*
+
+### File List
+*待填写*
+
+## QA Results
+*此部分由QA代理在审查完成后填写*