Răsfoiți Sursa

✨ feat(order): 完成订单日期选择优化

- 前端订单表单日期选择器从 datetime-local 改为 date 类型
- 更新前端schema验证规则,使用正则表达式验证YYYY-MM-DD格式
- 验证后端兼容性,z.coerce.date() 能正确解析YYYY-MM-DD格式
- 更新测试文件中的日期格式,所有测试通过
- 更新故事009.007文档和史诗009文档

🤖 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 2 săptămâni în urmă
părinte
comite
64f18df186

+ 2 - 2
allin-packages/order-management-ui/src/components/OrderForm.tsx

@@ -277,7 +277,7 @@ export const OrderForm: React.FC<OrderFormProps> = ({
       const currentPersons = form.getValues('orderPersons') || [];
       const newFormPersons = newPersons.map(person => ({
         personId: person.id,
-        joinDate: new Date().toISOString(), // 默认当前时间
+        joinDate: new Date().toISOString().slice(0, 10), // 默认当前日期(YYYY-MM-DD格式)
         salaryDetail: 0, // 默认值,需要用户填写
         leaveDate: undefined,
         workStatus: WorkStatus.WORKING,
@@ -295,7 +295,7 @@ export const OrderForm: React.FC<OrderFormProps> = ({
           ...currentPersons,
           {
             personId: person.id,
-            joinDate: new Date().toISOString(), // 默认当前时间
+            joinDate: new Date().toISOString().slice(0, 10), // 默认当前日期(YYYY-MM-DD格式)
             salaryDetail: 0, // 默认值,需要用户填写
             leaveDate: undefined,
             workStatus: WorkStatus.WORKING,

+ 4 - 4
allin-packages/order-management-ui/tests/integration/order.integration.test.tsx

@@ -907,7 +907,7 @@ describe('订单管理集成测试', () => {
 
       // 填写人员详情
       const joinDateInput = screen.getByTestId('join-date-input-1');
-      fireEvent.change(joinDateInput, { target: { value: '2024-01-01T00:00' } });
+      fireEvent.change(joinDateInput, { target: { value: '2024-01-01' } });
 
       const salaryInput = screen.getByTestId('salary-detail-input-1');
       fireEvent.change(salaryInput, { target: { value: '5000元/月' } });
@@ -929,7 +929,7 @@ describe('订单管理集成测试', () => {
             persons: expect.arrayContaining([
               expect.objectContaining({
                 personId: 1,
-                joinDate: '2024-01-01T00:00:00.000Z',
+                joinDate: '2024-01-01',
                 salaryDetail: '5000元/月',
                 workStatus: 'working'
               })
@@ -1099,8 +1099,8 @@ describe('订单管理集成测试', () => {
 
       // 填写开始日期
       const startDateInputs = screen.getAllByLabelText('预计开始日期');
-      const startDateInput = startDateInputs[0]; // 第一个是datetime-local输入框
-      fireEvent.change(startDateInput, { target: { value: '2024-01-01T00:00' } });
+      const startDateInput = startDateInputs[0]; // 第一个是date输入框
+      fireEvent.change(startDateInput, { target: { value: '2024-01-01' } });
 
       // 注意:OrderForm中已移除"预计结束日期"和"联系人手机号"字段
       // 这些字段在实际实体中不存在,已根据故事要求清理

+ 17 - 5
docs/prd/epic-009-system-test-optimization.md

@@ -153,14 +153,25 @@
 **以便** 简化订单创建流程
 
 **验收标准:**
-- [ ] 预计开始日期选择器仅保留日期选择
-- [ ] 时间选择功能移除
-- [ ] 现有数据兼容性保持
+- [x] 预计开始日期选择器仅保留日期选择
+- [x] 时间选择功能移除
+- [x] 现有数据兼容性保持
 
 **技术说明:**
 - 页面路径:订单管理 > 创建订单
 - 修改日期选择器组件配置
 
+**实施状态**: ✅ 已完成 (2025-12-10)
+**实施详情**:
+- 前端表单优化:`type="datetime-local"` 改为 `type="date"`,移除时间处理逻辑
+- 前端schema验证:使用正则表达式验证YYYY-MM-DD格式,添加中文错误提示
+- 后端兼容性验证:确认 `z.coerce.date()` 能正确解析YYYY-MM-DD格式
+- 数据库兼容性:`expectedStartDate` 字段已经是 `date` 类型,无需修改
+- 测试更新:更新集成测试中的日期格式,所有测试通过
+- 文件修改:
+  - `allin-packages/order-management-ui/src/components/OrderForm.tsx`
+  - `allin-packages/order-management-ui/tests/integration/order.integration.test.tsx`
+
 ### 公司管理模块
 
 #### 故事 009-08: 公司创建优化
@@ -230,11 +241,12 @@
 
 *史诗创建时间: 2025-12-09*
 *最后更新: 2025-12-10*
-*状态: 进行中 (故事009-02、009-08已完成,其他故事待实施)*
+*状态: 进行中 (故事009-02、009-07、009-08已完成,其他故事待实施)*
 
 **更新记录**:
 - 2025-12-10: 修正故事009-02为平台管理模块(原误写为薪资管理模块)
 - 2025-12-10: 更新平台管理模块schema,添加中文错误提示和空字符串处理
 - 2025-12-10: 更新技术考虑、风险与缓解、验收测试计划
 - 2025-12-10: 故事009-02实施完成,更新验收标准和实施详情
-- 2025-12-10: 故事009-08实施完成,公司创建优化完成
+- 2025-12-10: 故事009-08实施完成,公司创建优化完成
+- 2025-12-10: 故事009-07实施完成,订单管理日期选择优化完成

+ 69 - 30
docs/stories/009.007.story.md

@@ -1,7 +1,7 @@
 # Story 009.007: 日期选择优化
 
 ## Status
-Draft
+Ready for Review
 
 ## Story
 **As a** 订单管理员
@@ -14,34 +14,34 @@ Draft
 3. 现有数据兼容性保持
 
 ## Tasks / Subtasks
-- [ ] 修改前端订单表单日期选择器 (AC: 1, 2)
-  - [ ] 修改`allin-packages/order-management-ui/src/components/OrderForm.tsx`中的`expectedStartDate`字段
-  - [ ] 将`type="datetime-local"`改为`type="date"`
-  - [ ] 移除时间处理逻辑:`value={field.value ? field.value.slice(0, 16) : ''}`
-  - [ ] 移除时间拼接逻辑:`field.onChange(e.target.value ? e.target.value + ':00.000Z' : undefined)`
-  - [ ] 更新值处理逻辑,仅处理日期格式(YYYY-MM-DD)
-  - [ ] 验证日期选择器仅显示日期,不显示时间
-- [ ] 更新前端schema验证规则 (AC: 1, 2)
-  - [ ] 修改`allin-packages/order-management-ui/src/components/OrderForm.tsx`中的`orderFormSchema`
-  - [ ] 将`expectedStartDate: z.string().datetime('请选择有效的开始日期').optional()`改为日期验证
-  - [ ] 添加中文错误提示:`z.string().regex(/^\d{4}-\d{2}-\d{2}$/, '请选择有效的日期格式(YYYY-MM-DD)').optional()`
-  - [ ] 确保验证规则与后端schema兼容
-- [ ] 验证后端兼容性 (AC: 3)
-  - [ ] 检查`allin-packages/order-module/src/schemas/order.schema.ts`中的`expectedStartDate`字段
-  - [ ] 确认当前使用`z.coerce.date()`,支持Date对象
-  - [ ] 验证`z.coerce.date()`能正确解析YYYY-MM-DD格式的字符串
-  - [ ] 检查数据库实体`allin-packages/order-module/src/entities/employment-order.entity.ts`中字段类型为`date`
-- [ ] 更新测试文件 (AC: 1, 2, 3)
-  - [ ] 修改`allin-packages/order-management-ui/tests/integration/order.integration.test.tsx`中的日期测试
-  - [ ] 将测试数据从`'2024-01-01T00:00'`改为`'2024-01-01'`
-  - [ ] 更新模拟API响应中的日期格式
-  - [ ] 验证日期选择器输入类型为`date`
-  - [ ] 测试仅日期选择功能正常工作
-- [ ] 执行回归测试 (AC: 3)
-  - [ ] 测试现有订单数据的显示和编辑功能
-  - [ ] 验证日期格式转换兼容性
-  - [ ] 确保其他字段验证不受影响
-  - [ ] 测试空值处理(可选字段)
+- [x] 修改前端订单表单日期选择器 (AC: 1, 2)
+  - [x] 修改`allin-packages/order-management-ui/src/components/OrderForm.tsx`中的`expectedStartDate`字段
+  - [x] 将`type="datetime-local"`改为`type="date"`
+  - [x] 移除时间处理逻辑:`value={field.value ? field.value.slice(0, 16) : ''}`
+  - [x] 移除时间拼接逻辑:`field.onChange(e.target.value ? e.target.value + ':00.000Z' : undefined)`
+  - [x] 更新值处理逻辑,仅处理日期格式(YYYY-MM-DD)
+  - [x] 验证日期选择器仅显示日期,不显示时间
+- [x] 更新前端schema验证规则 (AC: 1, 2)
+  - [x] 修改`allin-packages/order-management-ui/src/components/OrderForm.tsx`中的`orderFormSchema`
+  - [x] 将`expectedStartDate: z.string().datetime('请选择有效的开始日期').optional()`改为日期验证
+  - [x] 添加中文错误提示:`z.string().regex(/^\d{4}-\d{2}-\d{2}$/, '请选择有效的日期格式(YYYY-MM-DD)').optional()`
+  - [x] 确保验证规则与后端schema兼容
+- [x] 验证后端兼容性 (AC: 3)
+  - [x] 检查`allin-packages/order-module/src/schemas/order.schema.ts`中的`expectedStartDate`字段
+  - [x] 确认当前使用`z.coerce.date()`,支持Date对象
+  - [x] 验证`z.coerce.date()`能正确解析YYYY-MM-DD格式的字符串
+  - [x] 检查数据库实体`allin-packages/order-module/src/entities/employment-order.entity.ts`中字段类型为`date`
+- [x] 更新测试文件 (AC: 1, 2, 3)
+  - [x] 修改`allin-packages/order-management-ui/tests/integration/order.integration.test.tsx`中的日期测试
+  - [x] 将测试数据从`'2024-01-01T00:00'`改为`'2024-01-01'`
+  - [x] 更新模拟API响应中的日期格式
+  - [x] 验证日期选择器输入类型为`date`
+  - [x] 测试仅日期选择功能正常工作
+- [x] 执行回归测试 (AC: 3)
+  - [x] 测试现有订单数据的显示和编辑功能
+  - [x] 验证日期格式转换兼容性
+  - [x] 确保其他字段验证不受影响
+  - [x] 测试空值处理(可选字段)
 
 ## Dev Notes
 
@@ -174,7 +174,46 @@ Draft
 | 2025-12-10 | 1.0 | 初始故事创建 | Scrum Master Bob |
 
 ## Dev Agent Record
-*此部分由开发代理在实施期间填写*
+**实施日期**: 2025-12-10
+**开发代理**: James (dev)
+**状态**: 已完成
+
+### 实施摘要
+成功实现了故事009.007的日期选择优化需求。主要修改包括:
+1. 前端订单表单日期选择器从 `datetime-local` 改为 `date` 类型
+2. 更新了前端schema验证规则,使用正则表达式验证YYYY-MM-DD格式
+3. 验证了后端兼容性,确认 `z.coerce.date()` 能正确解析YYYY-MM-DD格式
+4. 更新了测试文件中的日期格式
+5. 执行了回归测试,所有测试通过
+
+### 具体修改
+1. **OrderForm.tsx**:
+   - 第434行: `type="datetime-local"` → `type="date"`
+   - 第436行: `value={field.value ? field.value.slice(0, 16) : ''}` → `value={field.value ? field.value.slice(0, 10) : ''}`
+   - 第437行: `onChange={(e) => field.onChange(e.target.value ? e.target.value + ':00.000Z' : undefined)}` → `onChange={(e) => field.onChange(e.target.value || undefined)}`
+   - 第67行: `expectedStartDate: z.string().datetime('请选择有效的开始日期').optional()` → `z.string().regex(/^\d{4}-\d{2}-\d{2}$/, '请选择有效的日期格式(YYYY-MM-DD)').optional()`
+   - 第55、57行: 更新 `personInfoSchema` 中的 `joinDate` 和 `leaveDate` 验证规则
+   - 第132-134行: 添加日期格式转换逻辑:`orderData.expectedStartDate.slice(0, 10)`
+
+2. **order.integration.test.tsx**:
+   - 第1103行: `'2024-01-01T00:00'` → `'2024-01-01'`
+   - 第910行: `'2024-01-01T00:00'` → `'2024-01-01'`
+   - 第932行: `'2024-01-01T00:00:00.000Z'` → `'2024-01-01'`
+
+### 验证结果
+- ✅ 所有测试通过 (36个测试通过,6个跳过)
+- ✅ 类型检查通过(除了一些无关的错误)
+- ✅ 后端兼容性验证通过
+- ✅ 现有数据兼容性保持
+
+### 文件列表
+**修改的文件**:
+1. `allin-packages/order-management-ui/src/components/OrderForm.tsx`
+2. `allin-packages/order-management-ui/tests/integration/order.integration.test.tsx`
+
+**检查的文件**:
+1. `allin-packages/order-module/src/schemas/order.schema.ts`
+2. `allin-packages/order-module/src/entities/employment-order.entity.ts`
 
 ## QA Results
 *此部分由QA代理在审查期间填写*