# Story 13.4: 人员状态更新跨端同步 Status: backlog ## Story 作为测试开发者, 我想要验证后台更新人员状态后双小程序的数据同步, 以便确保跨端数据同步的正确性和时效性。 ## Acceptance Criteria ### AC1: 后台更新人员工作状态 → 企业小程序验证 **Given** 后台订单管理功能已完成(Epic 10) **When** 测试者在管理后台更新人员的工作状态 **Then** 测试应验证以下功能: - 使用 OrderManagementPage 打开订单人员管理对话框 - 修改人员工作状态(如:未就业 → 待就业 → 已就业) - 验证后台列表中状态更新正确 - 在企业小程序订单详情中验证人员状态同步正确 - 验证数据同步在合理时间内完成(≤ 10 秒) ### AC2: 后台更新人员工作状态 → 人才小程序验证 **Given** 后台订单管理功能已完成(Epic 10) **When** 测试者在管理后台更新人员的工作状态 **Then** 测试应验证以下功能: - 使用 OrderManagementPage 修改人员工作状态 - 在人才小程序订单列表中验证人员状态同步正确 - 在人才小程序订单详情中验证人员状态同步正确 - 验证数据同步在合理时间内完成(≤ 10 秒) ### AC3: 多种工作状态流转测试 **Given** 人员工作状态有多种可能值 **When** 测试者在后台更新不同状态 **Then** 测试应验证以下状态流转: - 未就业 → 待就业 - 待就业 → 已就业 - 已就业 → 已离职 - 已离职 → 未就业(重新入职) - 验证所有状态流转在双小程序中正确同步 ### AC4: 状态字段完整性验证 **Given** 人员状态包含多个字段 **When** 测试者在后台更新状态 **Then** 测试应验证以下字段: - 工作状态(workStatus)正确同步 - 入职日期(hireDate)正确同步 - 离职日期(resignDate)正确同步 - 验证所有字段在双小程序中正确显示 ### AC5: 测试数据隔离和清理 **Given** 跨端测试涉及多个系统 **When** 执行测试 **Then** 测试应遵循以下策略: - 使用唯一标识符创建测试人员(避免冲突) - 测试后恢复人员到原始状态 - 验证恢复后双小程序显示原始状态 ### AC6: 代码质量标准 **Given** 遵循项目测试规范 **When** 编写测试代码 **Then** 代码应符合以下标准: - 使用 TIMEOUTS 常量定义超时 - 使用 data-testid 选择器(优先级高于文本选择器) - 测试文件命名:`status-update-sync.spec.ts` - 完整的测试描述和注释 - TypeScript 类型安全 - 通过 `pnpm typecheck` 类型检查 ## Tasks / Subtasks ### 阶段 1: EXPLORE - Playwright MCP 探索(RED 之前) - [ ] **任务 0: Playwright MCP 探索验证** - [ ] 0.1 启动子代理使用 Playwright MCP 手动验证完整测试流程 - [ ] 0.2 记录验证的选择器(优先 data-testid,避免文本选择器) - [ ] 0.3 记录交互模式(打开对话框、选择状态、保存) - [ ] 0.4 记录数据流(API 调用、请求/响应格式、同步时间) - [ ] 0.5 立即修复发现的应用层 bug(如果有) - [ ] 0.6 生成测试代码骨架(基于验证的流程) - [ ] 0.7 将探索结果更新到本文档 Dev Notes 的"Playwright MCP 探索结果"部分 ### 阶段 2: RED - 编写测试(基于任务 0 的探索结果) - [ ] 任务 1: 创建跨端测试文件和基础设施 (AC: #6) - [ ] 1.1 基于任务 0 的探索结果创建 `web/tests/e2e/specs/cross-platform/status-update-sync.spec.ts` - [ ] 1.2 配置测试 fixtures(使用任务 0 验证过的选择器) - [ ] 1.3 添加测试前置条件(需要测试订单和人员数据) - [ ] 任务 2: 实现后台更新状态测试 (AC: #1, #3, #4) - [ ] 2.1 使用任务 0 验证的选择器编写"后台更新人员工作状态"测试 - [ ] 2.2 验证后台列表中状态更新正确 - [ ] 2.3 获取并存储人员和订单关键信息 - [ ] 任务 3: 实现企业小程序验证测试 (AC: #1, #2, #4) - [ ] 3.1 使用任务 0 验证的选择器编写"企业小程序显示更新后状态"测试 - [ ] 3.2 验证工作状态字段同步正确 - [ ] 3.3 验证入职日期和离职日期字段同步正确 - [ ] 3.4 实现数据同步等待机制(基于任务 0 实测的同步时间) - [ ] 任务 4: 实现人才小程序验证测试 (AC: #2, #4) - [ ] 4.1 使用任务 0 验证的选择器编写"人才小程序显示更新后状态"测试 - [ ] 4.2 验证工作状态字段同步正确 - [ ] 4.3 验证入职日期和离职日期字段同步正确 ### 阶段 3: GREEN - 实现代码(让测试通过) - [ ] 任务 5: 实现测试数据清理策略 (AC: #5) - [ ] 5.1 添加 afterEach 钩子恢复人员状态 - [ ] 5.2 验证恢复后双小程序显示原始状态 - [ ] 任务 6: 实现数据同步时效性验证 (AC: #1, #2) - [ ] 6.1 实现轮询等待机制 - [ ] 6.2 验证正常同步时间(基于任务 0 的实测数据,应 ≤ 5 秒) - [ ] 6.3 验证超时处理(最长 10 秒) ### 阶段 4: REFACTOR - 优化代码质量 - [ ] 任务 7: 验证代码质量 (AC: #6) - [ ] 7.1 运行 `pnpm typecheck` 验证类型检查 - [ ] 7.2 运行测试确保所有测试通过 - [ ] 7.3 验证使用 data-testid 选择器(任务 0 已确认) ## Dev Notes ### Epic 13 背景和依赖 **Epic 13: 跨端数据同步测试 (Epic E)** - **目标**: 验证后台操作后小程序端的数据同步,覆盖完整的业务流程 - **业务分组**: Epic E(跨端数据同步测试) - **背景**: 真实用户旅程跨越管理后台和小程序,需要验证数据同步的正确性和时效性 - **依赖**: - Epic 10: ✅ 已完成(订单管理 E2E 测试) - Epic 12: ✅ 已完成(小程序登录测试) - Story 13.1: ✅ 已完成(后台创建订单 → 企业小程序验证) **Epic 13 Story 依赖关系:** ``` Story 13.1: 后台创建订单 → 企业小程序验证 ✅ Story 13.2: 后台编辑订单 → 企业小程序验证 Story 13.3: 后台添加人员 → 人才小程序验证 Story 13.4: 后台更新状态 → 双小程序验证 ← 当前 Story Story 13.5: 跨端测试稳定性验证 Story 13.6: 首页看板数据联动专项测试 ✅ Story 13.7: 首页导航和交互测试 ``` ### Epic 10 关键经验(订单管理) 从已完成的 Epic 10 中学习到的订单管理模式: **OrderManagementPage 可用方法:** ```typescript // 订单人员管理 async openPersonManagementDialog(orderName: string): Promise async updatePersonWorkStatus(personId: string, workStatus: string): Promise async setPersonHireDate(personId: string, hireDate: string): Promise async setPersonResignDate(personId: string, resignDate: string): Promise // 获取人员状态 async getPersonStatus(personId: string): Promise ``` **工作状态枚举:** ```typescript enum WorkStatus { UNEMPLOYED = '未就业', // 未就业 PENDING = '待就业', // 待就业 EMPLOYED = '已就业', // 已就业 RESIGNED = '已离职', // 已离职 } ``` **人员状态数据结构:** ```typescript interface PersonStatus { personId: string; personName: string; workStatus: WorkStatus; hireDate?: string; resignDate?: string; orderId: string; orderName: string; } ``` ### Epic 12 关键经验(小程序登录) 从已完成的 Epic 12 中学习到的小程序模式: **EnterpriseMiniPage 可用方法:** ```typescript // 订单详情 async openOrderDetail(orderName: string): Promise async getOrderPersonList(): Promise async getPersonStatus(personId: string): Promise ``` **TalentMiniPage 可用方法:** ```typescript // 订单详情 async openOrderDetail(orderName: string): Promise async getOrderPersonList(): Promise async getPersonStatus(personId: string): Promise ``` ### 状态更新选择器策略 **后台人员管理对话框选择器(待验证):** | 功能 | data-testid | |------|-------------| | 人员管理按钮 | `person-management-button` | | 工作状态下拉框 | `work-status-selector` | | 入职日期输入框 | `hire-date-input` | | 离职日期输入框 | `resign-date-input` | | 保存按钮 | `save-person-button` | **小程序订单详情选择器(待验证):** | 功能 | data-testid | |------|-------------| | 订单详情容器 | `mini-order-detail` | | 人员列表容器 | `mini-person-list` | | 人员状态标签 | `mini-person-status-{personId}` | | 入职日期标签 | `mini-hire-date-{personId}` | | 离职日期标签 | `mini-resign-date-{personId}` | ### 数据同步等待策略 **轮询等待模式:** ```typescript async waitForStatusUpdate( personId: string, expectedStatus: string, timeout: number = 10000 ): Promise { const startTime = Date.now(); while (Date.now() - startTime < timeout) { const status = await this.getPersonStatus(personId); if (status.workStatus === expectedStatus) { return true; } await this.page.waitForTimeout(500); // 每 500ms 检查一次 } return false; } ``` ### 测试数据准备策略 **前置条件:** 1. 需要测试订单数据(使用 Story 11.2 创建的平台、Story 11.5 创建的公司) 2. 需要测试人员数据(使用 Story 12.3 创建的人才用户) 3. 需要订单关联人员(使用 Story 13.3 的方法) **测试数据唯一性:** ```typescript const timestamp = Date.now(); const personData = { name: `状态同步测试人员_${timestamp}`, idCard: generateUniqueIdCard(timestamp), }; ``` ### 测试数据清理策略 **清理方法:** ```typescript test.afterEach(async ({ orderManagementPage, originalStatus }) => { // 在后台恢复人员到原始状态 await orderManagementPage.updatePersonWorkStatus( personId, originalStatus.workStatus ); }); ``` ### 参考文档 **架构文档:** - `_bmad-output/planning-artifacts/epics.md#Epic 13` - `_bmad-output/project-context.md` - `docs/standards/e2e-radix-testing.md` **相关 Story 文档:** - `10-9-order-person-tests.md` (人员关联功能测试) - `12-4-enterprise-mini-page-object.md` (企业小程序 Page Object) - `12-6-talent-mini-page-object.md` (人才小程序 Page Object) - `13-1-order-create-sync.md` (订单列表同步测试) - `13-3-person-add-sync.md` (后台添加人员测试) ## Dev Agent Record ### Agent Model Used _Created by create-story workflow_ ### Debug Log References _Story 13.4 created - not yet started_ ### Completion Notes List _Story 13.4 创建完成,状态:backlog_ ### File List _Created files:_ - `/mnt/code/188-179-template-6/_bmad-output/implementation-artifacts/13-4-status-update-sync.md` ## Change Log - 2026-01-14: Story 13.4 创建完成 - 人员状态更新跨端同步需求 - 工作状态流转测试 - 状态字段完整性验证 - 状态:backlog