Sfoglia il codice sorgente

feat(story): 创建故事012.013 - 工作状态统一优化方案

- 创建史诗012的最后一个故事:基于order_person.work_status的统一方案
- 采用技术改进方案:前端直接传递WorkStatus枚举值,Schema使用z.nativeEnum验证
- 包含详细的任务分解、架构引用和开发指南

🤖 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 4 settimane fa
parent
commit
a293629cdd
1 ha cambiato i file con 12 aggiunte e 11 eliminazioni
  1. 12 11
      docs/stories/012.013.story.md

+ 12 - 11
docs/stories/012.013.story.md

@@ -15,10 +15,10 @@ Draft
 2. [ ] 人才列表API的"待入职"筛选精确返回`work_status='pre_working'`的人员
 3. [ ] 人才列表API的"离职"筛选精确返回`work_status='resigned'`的人员
 4. [ ] 人才详情页工作状态显示准确,基于最新的`order_person.work_status`
-5. [ ] 状态映射完整:前端中文状态、Schema验证、数据库枚举值保持一致
+5. [ ] 状态类型安全:前端直接传递`WorkStatus`枚举值,Schema使用`z.nativeEnum(WorkStatus)`验证,数据库存储枚举值
 6. [ ] 查询性能优化,添加必要的数据库索引,响应时间<200ms
 7. [ ] 集成测试全面覆盖所有状态场景,测试覆盖率≥60%
-8. [ ] API文档更新,包含完整的状态映射说明
+8. [ ] API文档更新,包含完整的枚举值说明
 9. [ ] 现有功能不受影响,企业统计等依赖工作状态的功能仍能正常工作
 
 ## 任务 / 子任务
@@ -29,12 +29,12 @@ Draft
   - [ ] 在`disabled-person.service.ts`的`findAllForCompany`方法中,修改查询逻辑:使用`order_person.work_status`而不是`disabled_person.job_status`作为工作状态源
   - [ ] 获取人员最新的`order_person`记录(按`join_date`降序)来确定当前工作状态
   - [ ] 在SELECT语句中添加`MAX(op.work_status)`或通过子查询获取最新状态
-  - [ ] 更新结果映射逻辑,将`WorkStatus`枚举值转换为中文状态:'working'→"在职"、'pre_working'→"待入职"、'resigned'→"离职"、'not_working'→"未就业"(后备)
+  - [ ] 更新API响应映射逻辑,为前端显示提供中文状态标签:'working'→"在职"、'pre_working'→"待入职"、'resigned'→"离职"、'not_working'→"未就业"(后备)
 
 - [ ] 任务2:筛选条件优化(AC: 1, 2, 3, 5)
   - [ ] 修改`jobStatus`筛选逻辑,直接使用`order_person.work_status`进行过滤
-  - [ ] 支持前端中文状态到`WorkStatus`枚举值的映射:"在职"→'working'、"待入职"→'pre_working'、"离职"→'resigned'
-  - [ ] 更新Schema验证(`CompanyPersonListQuerySchema`),明确状态映射关系
+  - [ ] 更新Schema验证(`CompanyPersonListQuerySchema`),使用`z.nativeEnum(WorkStatus)`直接验证枚举值
+  - [ ] 前端直接传递`WorkStatus`枚举值('working'、'pre_working'、'resigned'),无需中文状态映射
 
 - [ ] 任务3:人才详情API统一(AC: 4, 5)
   - [ ] 在`findOneForCompany`方法中,同样使用`order_person.work_status`作为工作状态源
@@ -47,18 +47,18 @@ Draft
   - [ ] 验证查询性能,确保响应时间<200ms
 
 - [ ] 任务5:Schema和类型更新(AC: 5, 8)
-  - [ ] 更新`CompanyPersonListQuerySchema`,明确状态筛选选项和映射关系
-  - [ ] 更新`CompanyPersonListSchema`和`CompanyPersonDetailSchema`,使用一致的枚举类型
+  - [ ] 更新`CompanyPersonListQuerySchema`,使用`z.nativeEnum(WorkStatus)`进行枚举验证,前端直接传递枚举值
+  - [ ] 更新`CompanyPersonListSchema`和`CompanyPersonDetailSchema`,包含`workStatus`(枚举值)和`workStatusLabel`(中文标签)字段
   - [ ] 生成准确的TypeScript类型定义,确保前端类型安全
 
 - [ ] 任务6:前端状态显示统一(AC: 5)
-  - [ ] 更新人才管理UI包中的状态显示逻辑,使用新的状态
-  - [ ] 确保人才列表页、人才详情页的状态标签显示一致
-  - [ ] 更新状态筛选组件的选项说明
+  - [ ] 更新人才管理UI包中的状态显示逻辑:UI显示中文标签,但传递给API的是`WorkStatus`枚举
+  - [ ] 确保人才列表页、人才详情页的状态标签显示一致(使用API返回的`workStatusLabel`字段)
+  - [ ] 更新状态筛选组件:显示中文选项,但传递枚举值给API
 
 - [ ] 任务7:集成测试全面覆盖(AC: 7)
   - [ ] 在`person-extension.integration.test.ts`中新增测试用例,覆盖所有状态场景
-  - [ ] 测试状态筛选的精确性:"待入职"和"离职"筛选应返回不同结果
+  - [ ] 测试状态筛选的精确性:`work_status='pre_working'`(待入职)和`work_status='resigned'`(离职)筛选应返回不同结果
   - [ ] 测试边界条件:无订单关联的人员状态(显示"未就业"或空值)
   - [ ] 测试性能:大数据量下的状态查询性能
   - [ ] 确保测试覆盖率≥60%
@@ -144,6 +144,7 @@ Draft
 ## 变更日志
 | 日期 | 版本 | 描述 | 作者 |
 |------|------|------|------|
+| 2025-12-20 | 1.1 | 技术决策更新:前端直接传递`WorkStatus`枚举值,Schema使用`z.nativeEnum(WorkStatus)`验证 | Bob (Scrum Master) |
 | 2025-12-20 | 1.0 | 初始故事创建 | Bob (Scrum Master) |
 
 ## Dev Agent Record