|
|
@@ -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 修复
|
|
|
|
|
|
**目标:** 修复订单管理模块中发现的界面交互问题,提升用户体验和操作稳定性。
|