Răsfoiți Sursa

feat: 添加 Story 15.9 - 身份证有效期支持长期选项

- 在 Epic 15 中添加 Story 15.9 定义
- 支持身份证和残疾证有效期"长期有效"选项
- 使用单选组合控件(指定日期/长期有效)
- NULL 表示长期有效
- 更新 sprint-status.yaml 添加 15-9 到 backlog

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 1 zi în urmă
părinte
comite
0edd376c3e

+ 1 - 0
_bmad-output/implementation-artifacts/sprint-status.yaml

@@ -329,6 +329,7 @@ development_status:
   15-5-employment-date-edit: ready-for-dev   # 订单人员入职/离职日期编辑功能(2026-01-20 新增)- 在订单详情对话框中使入职日期和离职日期可编辑,支持修正错误记录和设置离职日期
   15-6-guardian-phone-layout-optimization: ready-for-dev   # 监护人电话布局优化(2026-01-20 新增)- 将"残疾人本人电话"和"监护人电话"组织到相邻区域,本人电话支持多号码动态添加
   15-8-disability-person-company-query-union-table: review   # 残疾人企业查询页面并集查询与表格增强(2026-01-22 新增)- 新增姓名和身份证号筛选框,实现并集查询逻辑(姓名 OR 身份证号 OR 平台 OR 公司),表格新增4列(离职日期、在职状态、入职地点、籍贯)
+  15-9-id-valid-date-long-term-support: backlog   # 身份证有效期支持长期选项(2026-02-09 新增)- 身份证和残疾证有效期支持"长期有效"选项,单选组合控件(指定日期/长期有效),NULL 表示长期
   epic-15-retrospective: optional
 
 # 技术改进完成状态 (2026-01-10):

+ 134 - 0
_bmad-output/planning-artifacts/epics.md

@@ -3028,6 +3028,140 @@ echo "✅ 稳定性验证通过"
 
 ---
 
+### Story 15.9: 身份证有效期支持长期选项
+
+作为用户,
+我想要在残疾人管理表单中选择身份证有效期为"长期有效",
+以便准确记录长期有效的身份证信息,而不需要被迫填写一个虚假的截止日期。
+
+**背景:**
+- 中国居民身份证存在"长期有效"的情况(通常为高龄老人或特殊人群)
+- 当前系统只支持选择具体日期,无法表达"长期有效"状态
+- 用户被迫填写一个虚假日期(如 2099-12-31),导致数据不准确
+- 残疾证有效期也存在同样的"长期有效"需求
+
+**验收标准:**
+
+### AC1: 表单支持选择"长期有效"
+1. **Given** 用户在残疾人管理创建/编辑表单页面
+2. **When** 用户查看身份证有效期字段
+3. **Then** 显示两个选项:"指定日期"和"长期有效"
+4. **And** 使用单选按钮(RadioGroup)让用户选择
+5. **And** 默认选中"指定日期"选项
+6. **And** "指定日期"选项下显示日期选择器
+7. **And** "长期有效"选项显示辅助说明"身份证无固定期限时选择"
+
+### AC2: 选项互斥逻辑
+1. **Given** 用户在残疾人管理表单页面
+2. **When** 用户选择"长期有效"选项
+3. **Then** 日期选择器自动禁用或隐藏
+4. **And** 已选择的日期值被清空
+5. **When** 用户选择"指定日期"选项
+6. **Then** "长期有效"选项自动取消选中
+7. **And** 日期选择器恢复可用状态
+
+### AC3: 数据存储
+1. **Given** 用户选择了"长期有效"选项
+2. **When** 用户提交表单
+3. **Then** 数据库中 `id_valid_date` 字段存储为 `NULL`
+4. **Given** 用户选择了"指定日期"选项
+5. **When** 用户提交表单
+6. **Then** 数据库中 `id_valid_date` 字段存储为选定的日期
+
+### AC4: 编辑时数据回显
+1. **Given** 数据库中某残疾人的 `id_valid_date` 为 `NULL`(长期有效)
+2. **When** 用户打开编辑表单
+3. **Then** "长期有效"选项自动选中
+4. **And** 日期选择器显示为空或禁用
+5. **Given** 数据库中某残疾人的 `id_valid_date` 为具体日期
+6. **When** 用户打开编辑表单
+7. **Then** "指定日期"选项自动选中
+8. **And** 日期选择器显示存储的日期值
+
+### AC5: 查看和列表页面显示
+1. **Given** 残疾人的身份证有效期为长期(`id_valid_date` 为 `NULL`)
+2. **When** 用户在列表或查看页面查看信息
+3. **Then** 身份证有效期字段显示"长期"或"长期有效"
+4. **And** 不显示具体日期
+5. **Given** 残疾人的身份证有效期为具体日期
+6. **When** 用户在列表或查看页面查看信息
+7. **Then** 身份证有效期字段显示格式化的日期(如"2026-12-31")
+
+### AC6: 残疾证有效期同步支持(可选)
+1. **Given** 用户在残疾人管理表单页面
+2. **When** 用户查看残疾证有效期字段
+3. **Then** 残疾证有效期也支持"长期有效"选项
+4. **And** 实现逻辑与身份证有效期一致
+5. **And** 两个字段可以独立选择(一个长期,一个具体日期)
+
+### AC7: 表单验证
+1. **Given** 用户在残疾人管理表单页面
+2. **When** 用户未选择任何选项(既未选择日期,也未选择长期)
+3. **Then** 字段可以为空(因为是可选字段)
+4. **When** 用户选择"指定日期"但未选择日期
+5. **Then** 显示验证错误"请选择身份证有效期"
+6. **When** 用户选择"长期有效"
+7. **Then** 不需要额外的验证
+
+**实现要点:**
+
+**前端组件修改:**
+- 文件:`allin-packages/disability-person-management-ui/src/components/DisabilityPersonManagement.tsx`
+- 将现有的 `<Input type="date" />` 替换为 RadioGroup 组件
+- 使用 shadcn/ui 的 RadioGroup 或类似组件
+- 两个选项的状态管理:`idValidDateType: 'date' | 'long_term'`
+
+**数据结构设计:**
+```typescript
+// 表单状态
+{
+  idValidDateType: 'date' | 'long_term',
+  idValidDate: Date | null  // 当 type='date' 时有值,type='long_term' 时为 null
+}
+
+// API 提交
+{
+  idValidDate: Date | null  // null 表示长期有效
+}
+```
+
+**Schema 修改(如需要):**
+- 文件:`allin-packages/disability-module/src/schemas/disabled-person.schema.ts`
+- `idValidDate` 保持为 `z.coerce.date<Date>().nullable()`
+- 现有 Schema 已支持 `nullable`,无需修改
+
+**数据库修改:**
+- 无需修改,`id_valid_date` 字段已支持 `NULL`
+
+**UI 设计参考:**
+```
+┌─────────────────────────────────────────┐
+│ 身份证有效期 *                          │
+│ ○ 指定日期                              │
+│   ┌─────────────────┐                  │
+│   │ 2026-02-09     │ (日期选择器)     │
+│   └─────────────────┘                  │
+│ ○ 长期有效                              │
+│   <身份证无固定期限时选择>              │
+└─────────────────────────────────────────┘
+```
+
+**测试场景:**
+1. 创建残疾人-选择"长期有效"
+2. 创建残疾人-选择"指定日期"
+3. 编辑残疾人-从长期改为具体日期
+4. 编辑残疾人-从具体日期改为长期
+5. 编辑残疾人-长期选项正确回显
+6. 编辑残疾人-具体日期正确回显
+7. 查看页面-长期显示为"长期"
+8. 列表页面-长期显示为"长期"
+9. 表单验证-未选择日期时的错误提示
+10. 残疾证有效期同步功能(如实现)
+
+**测试文件:** `web/tests/e2e/specs/admin/disability-person-id-valid-date-longterm.spec.ts`
+
+---
+
 ## Epic 016: 订单管理界面 Bug 修复
 
 **目标:** 修复订单管理模块中发现的界面交互问题,提升用户体验和操作稳定性。