Ver Fonte

docs(epic-13): 补充缺失的跨端同步测试 Story

根据测试覆盖度分析发现的 33.3% 覆盖率缺口,新增 4 个 Story:
- Story 13.4: 人员状态更新跨端同步
- Story 13.5: 跨端数据同步稳定性验证
- Story 13.8: 订单列表页完整验证
- Story 13.9: 人才列表页完整验证

预期将测试覆盖率从 33.3% 提升至 85-90%

Co-Authored-By: Claude <noreply@anthropic.com>
yourname há 3 dias atrás
pai
commit
d2dc891173

+ 319 - 0
_bmad-output/implementation-artifacts/13-4-status-update-sync.md

@@ -0,0 +1,319 @@
+# Story 13.4: 人员状态更新跨端同步
+
+Status: backlog
+
+<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
+
+## 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<void>
+async updatePersonWorkStatus(personId: string, workStatus: string): Promise<FormSubmitResult>
+async setPersonHireDate(personId: string, hireDate: string): Promise<FormSubmitResult>
+async setPersonResignDate(personId: string, resignDate: string): Promise<FormSubmitResult>
+
+// 获取人员状态
+async getPersonStatus(personId: string): Promise<PersonStatus>
+```
+
+**工作状态枚举:**
+```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<void>
+async getOrderPersonList(): Promise<PersonStatus[]>
+async getPersonStatus(personId: string): Promise<PersonStatus>
+```
+
+**TalentMiniPage 可用方法:**
+```typescript
+// 订单详情
+async openOrderDetail(orderName: string): Promise<void>
+async getOrderPersonList(): Promise<PersonStatus[]>
+async getPersonStatus(personId: string): Promise<PersonStatus>
+```
+
+### 状态更新选择器策略
+
+**后台人员管理对话框选择器(待验证):**
+| 功能 | 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<boolean> {
+  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

+ 405 - 0
_bmad-output/implementation-artifacts/13-5-cross-platform-stability.md

@@ -0,0 +1,405 @@
+# Story 13.5: 跨端数据同步稳定性验证
+
+Status: backlog
+
+<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
+
+## Story
+
+作为测试开发者,
+我想要验证跨端数据同步测试的稳定性和可靠性,
+以便确保测试在各种条件下都能正确运行并返回一致结果。
+
+## Acceptance Criteria
+
+### AC1: 数据一致性验证
+**Given** 跨端测试涉及后台和小程序
+**When** 执行多次跨端数据同步操作
+**Then** 测试应验证以下场景:
+- 后台创建订单后,小程序显示数据完全一致
+- 后台编辑订单后,小程序显示更新后的数据
+- 后台添加人员后,小程序显示新增的人员
+- 后台更新状态后,小程序显示更新后的状态
+- 验证所有字段在后台和小程序中保持一致
+
+### AC2: 并发操作验证
+**Given** 多个测试可能同时运行
+**When** 执行并发跨端测试
+**Then** 测试应验证以下场景:
+- 多个测试同时创建订单不会相互干扰
+- 多个测试同时编辑不同订单不会冲突
+- 多个测试同时添加人员不会产生数据混乱
+- 验证测试隔离策略正确实施
+- 验证测试数据清理不会影响其他测试
+
+### AC3: 边界情况验证
+**Given** 系统可能遇到各种边界情况
+**When** 执行跨端测试
+**Then** 测试应验证以下场景:
+- 网络延迟情况下的数据同步(模拟慢速网络)
+- 大数据量情况下的数据同步(模拟大量人员)
+- 特殊字符和Unicode字符的处理
+- 超时情况下的错误处理
+- 失败重试机制的正确性
+
+### AC4: 稳定性测试(多次运行)
+**Given** 跨端测试需要在各种情况下保持稳定
+**When** 连续运行测试 10 次
+**Then** 测试应满足以下标准:
+- 所有测试 100% 通过
+- 无 flaky 失败
+- 平均执行时间稳定(± 10% 波动)
+- 数据同步时间稳定(无异常延迟)
+
+### AC5: 错误恢复验证
+**Given** 测试过程中可能出现错误
+**When** 发生错误或失败
+**Then** 测试应验证以下场景:
+- 单个测试失败不影响其他测试
+- 测试失败后正确清理数据
+- 错误消息清晰且有助于调试
+- 失败测试可以独立重新运行
+
+### AC6: 代码质量标准
+**Given** 遵循项目测试规范
+**When** 编写测试代码
+**Then** 代码应符合以下标准:
+- 使用 TIMEOUTS 常量定义超时
+- 使用 data-testid 选择器(优先级高于文本选择器)
+- 测试文件命名:`cross-platform-stability.spec.ts`
+- 完整的测试描述和注释
+- TypeScript 类型安全
+- 通过 `pnpm typecheck` 类型检查
+
+## Tasks / Subtasks
+
+### 阶段 1: EXPLORE - Playwright MCP 探索(RED 之前)
+
+- [ ] **任务 0: Playwright MCP 探索验证**
+  - [ ] 0.1 启动子代理使用 Playwright MCP 手动验证边界情况
+  - [ ] 0.2 记录验证的选择器和交互模式
+  - [ ] 0.3 测试网络延迟场景(使用 Playwright 的网络模拟)
+  - [ ] 0.4 测试大数据量场景(创建包含多个人员的订单)
+  - [ ] 0.5 记录数据同步时间基准
+  - [ ] 0.6 生成测试代码骨架
+  - [ ] 0.7 将探索结果更新到本文档 Dev Notes
+
+### 阶段 2: RED - 编写测试(基于任务 0 的探索结果)
+
+- [ ] 任务 1: 创建稳定性测试文件 (AC: #6)
+  - [ ] 1.1 创建 `web/tests/e2e/specs/cross-platform/cross-platform-stability.spec.ts`
+  - [ ] 1.2 配置测试 fixtures(多 Page 对象)
+  - [ ] 1.3 添加测试前置条件(测试数据准备)
+
+- [ ] 任务 2: 实现数据一致性验证测试 (AC: #1)
+  - [ ] 2.1 编写"后台创建订单 → 小程序数据一致性"测试
+  - [ ] 2.2 编写"后台编辑订单 → 小程序数据一致性"测试
+  - [ ] 2.3 编写"后台添加人员 → 小程序数据一致性"测试
+  - [ ] 2.4 编写"后台更新状态 → 小程序数据一致性"测试
+  - [ ] 2.5 验证所有字段完全一致
+
+- [ ] 任务 3: 实现并发操作验证测试 (AC: #2)
+  - [ ] 3.1 编写"多个测试同时创建订单"测试(使用 test.describe.parallel)
+  - [ ] 3.2 编写"多个测试同时编辑不同订单"测试
+  - [ ] 3.3 验证测试隔离策略
+  - [ ] 3.4 验证数据清理不影响其他测试
+
+### 阶段 3: GREEN - 实现代码(让测试通过)
+
+- [ ] 任务 4: 实现边界情况验证测试 (AC: #3)
+  - [ ] 4.1 编写"网络延迟情况下数据同步"测试(模拟慢速网络)
+  - [ ] 4.2 编写"大数据量情况下数据同步"测试(10+ 人员)
+  - [ ] 4.3 编写"特殊字符处理"测试(Unicode、emoji等)
+  - [ ] 4.4 编写"超时处理"测试
+  - [ ] 4.5 编写"失败重试"测试
+
+- [ ] 任务 5: 实现错误恢复验证测试 (AC: #5)
+  - [ ] 5.1 编写"单个测试失败不影响其他测试"测试
+  - [ ] 5.2 编写"测试失败后正确清理数据"测试
+  - [ ] 5.3 验证错误消息清晰度
+
+### 阶段 4: STABILITY - 稳定性验证
+
+- [ ] 任务 6: 执行稳定性测试 (AC: #4)
+  - [ ] 6.1 创建稳定性测试脚本(连续运行 10 次)
+  - [ ] 6.2 运行稳定性测试并记录结果
+  - [ ] 6.3 分析测试通过率(目标:100%)
+  - [ ] 6.4 分析执行时间波动(目标:± 10%)
+  - [ ] 6.5 如不达标,修复问题并重新测试
+
+### 阶段 5: REFACTOR - 优化代码质量
+
+- [ ] 任务 7: 验证代码质量 (AC: #6)
+  - [ ] 7.1 运行 `pnpm typecheck` 验证类型检查
+  - [ ] 7.2 运行测试确保所有测试通过
+  - [ ] 7.3 验证选择器使用 data-testid
+  - [ ] 7.4 优化测试执行时间
+
+## Dev Notes
+
+### Epic 13 背景和依赖
+
+**Epic 13: 跨端数据同步测试 (Epic E)**
+
+- **目标**: 验证后台操作后小程序端的数据同步,覆盖完整的业务流程
+- **业务分组**: Epic E(跨端数据同步测试)
+- **背景**: 真实用户旅程跨越管理后台和小程序,需要验证数据同步的正确性和时效性
+- **依赖**:
+  - Epic 10: ✅ 已完成(订单管理 E2E 测试)
+  - Epic 12: ✅ 已完成(小程序登录测试)
+  - Story 13.1-13.4: 🔄 进行中(跨端数据同步测试)
+
+**Epic 13 Story 依赖关系:**
+```
+Story 13.1: 后台创建订单 → 企业小程序验证 ✅
+Story 13.2: 后台编辑订单 → 企业小程序验证
+Story 13.3: 后台添加人员 → 人才小程序验证
+Story 13.4: 后台更新状态 → 双小程序验证
+Story 13.5: 跨端测试稳定性验证 ← 当前 Story
+Story 13.6: 首页看板数据联动专项测试 ✅
+Story 13.7: 首页导航和交互测试
+```
+
+### 稳定性测试策略
+
+**测试执行模式:**
+```typescript
+// 使用 Playwright 的 test.describe.parallel 实现并发测试
+test.describe.parallel('跨端数据同步稳定性验证', () => {
+  test('并发测试 1: 创建订单', async ({ adminPage, miniPage }) => {
+    // 测试代码
+  });
+
+  test('并发测试 2: 编辑订单', async ({ adminPage, miniPage }) => {
+    // 测试代码
+  });
+
+  test('并发测试 3: 添加人员', async ({ adminPage, miniPage }) => {
+    // 测试代码
+  });
+});
+```
+
+**稳定性测试脚本:**
+```bash
+#!/bin/bash
+# run-cross-platform-stability-test.sh
+
+PASSED=0
+FAILED=0
+TIMES=()
+
+for i in {1..10}; do
+  echo "=== 运行 #$i ==="
+  START=$(date +%s)
+
+  if pnpm test:e2e:chromium cross-platform-stability; then
+    PASSED=$((PASSED + 1))
+    echo "✅ 运行 #$i 通过"
+  else
+    FAILED=$((FAILED + 1))
+    echo "❌ 运行 #$i 失败"
+  fi
+
+  END=$(date +%s)
+  DURATION=$((END - START))
+  TIMES+=($DURATION)
+  echo "⏱️  耗时: ${DURATION}s"
+  echo ""
+done
+
+echo "=== 稳定性测试结果 ==="
+echo "通过: $PASSED/10"
+echo "失败: $FAILED/10"
+echo "平均时间: $(awk '{sum+=$1} END {print sum/NR}' <<< "${TIMES[@]}")s"
+
+if [ $PASSED -eq 10 ]; then
+  echo "✅ 100% 稳定性通过!"
+  exit 0
+else
+  echo "❌ 稳定性不足,需要修复"
+  exit 1
+fi
+```
+
+### 网络延迟模拟
+
+**使用 Playwright 模拟慢速网络:**
+```typescript
+test('网络延迟情况下数据同步', async ({ adminPage, miniPage }) => {
+  // 模拟慢速 3G 网络
+  await adminPage.context().setOffline(false);
+  await miniPage.context().setOffline(false);
+
+  const slow3G = {
+    download: 500 * 1024 / 8,  // 500 Kbps
+    upload: 500 * 1024 / 8,    // 500 Kbps
+    latency: 100,               // 100ms 延迟
+  };
+
+  await adminPage.route('**/*', async (route) => {
+    // 应用网络限制
+    await route.continue();
+  });
+
+  // 执行测试...
+  // 验证数据在慢速网络下仍能正确同步
+});
+```
+
+### 数据一致性验证策略
+
+**字段级数据对比:**
+```typescript
+async verifyDataConsistency(
+  adminData: OrderData,
+  miniData: OrderData
+): Promise<boolean> {
+  // 验证所有字段一致
+  expect(adminData.name).toBe(miniData.name);
+  expect(adminData.status).toBe(miniData.status);
+  expect(adminData.workStatus).toBe(miniData.workStatus);
+  expect(adminData.expectedStartDate).toBe(miniData.expectedStartDate);
+
+  // 验证人员列表一致
+  expect(adminData.persons.length).toBe(miniData.persons.length);
+  for (let i = 0; i < adminData.persons.length; i++) {
+    expect(adminData.persons[i].id).toBe(miniData.persons[i].id);
+    expect(adminData.persons[i].workStatus).toBe(miniData.persons[i].workStatus);
+  }
+
+  return true;
+}
+```
+
+### 大数据量测试策略
+
+**创建包含多个人员的订单:**
+```typescript
+test('大数据量情况下数据同步', async ({ orderManagementPage, enterpriseMiniPage }) => {
+  // 创建包含 10 个人员的订单
+  const persons = [];
+  for (let i = 0; i < 10; i++) {
+    persons.push({
+      name: `测试人员_${Date.now()}_${i}`,
+      idCard: generateUniqueIdCard(Date.now() + i),
+    });
+  }
+
+  const orderData = {
+    name: `大数据量测试订单_${Date.now()}`,
+    persons: persons,
+  };
+
+  await orderManagementPage.createOrder(orderData);
+
+  // 验证小程序能正确显示所有人员
+  const miniOrderData = await enterpriseMiniPage.getOrderDetail(orderData.name);
+  expect(miniOrderData.persons.length).toBe(10);
+});
+```
+
+### 特殊字符测试策略
+
+**Unicode 和 Emoji 测试:**
+```typescript
+test('特殊字符处理', async ({ orderManagementPage, enterpriseMiniPage }) => {
+  const orderData = {
+    name: `测试订单_🎉_${Date.now()}_中文_日本語_한국어`,
+    description: '包含 emoji: 😊👍❤️ 和特殊符号: @#$%^&*()',
+  };
+
+  await orderManagementPage.createOrder(orderData);
+
+  // 验证小程序正确显示特殊字符
+  const miniOrderData = await enterpriseMiniPage.getOrderDetail(orderData.name);
+  expect(miniOrderData.name).toContain('🎉');
+  expect(miniOrderData.name).toContain('中文');
+  expect(miniOrderData.description).toContain('😊');
+});
+```
+
+### 测试隔离策略
+
+**确保测试之间不相互干扰:**
+```typescript
+// 使用唯一时间戳确保数据唯一
+const timestamp = Date.now();
+const testId = `test_${timestamp}_${Math.random().toString(36).substr(2, 9)}`;
+
+// 使用 test.each 进行参数化测试
+test.each([
+  { scenario: '创建订单', action: 'create' },
+  { scenario: '编辑订单', action: 'edit' },
+  { scenario: '添加人员', action: 'addPerson' },
+])('并发测试: $scenario', async ({ adminPage, miniPage, action }) => {
+  // 每个测试使用独立的数据
+  const testData = {
+    name: `${action}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
+  };
+  // ...
+});
+```
+
+### 错误恢复策略
+
+**测试失败后的清理:**
+```typescript
+test.afterEach(async ({ orderManagementPage, testData }) => {
+  try {
+    // 清理测试数据
+    await orderManagementPage.deleteOrder(testData.orderName);
+  } catch (error) {
+    // 清理失败,记录但不影响其他测试
+    console.error('清理失败:', error);
+  }
+});
+
+test('单个测试失败不影响其他测试', async ({ adminPage, miniPage }) => {
+  // 测试代码
+});
+```
+
+### 参考文档
+
+**架构文档:**
+- `_bmad-output/planning-artifacts/epics.md#Epic 13`
+- `_bmad-output/project-context.md`
+- `docs/standards/e2e-radix-testing.md`
+
+**相关 Story 文档:**
+- `10-14-order-stability-test.md` (订单管理稳定性验证)
+- `13-1-order-create-sync.md` (订单列表同步测试)
+- `13-2-order-edit-sync.md` (订单编辑同步测试)
+- `13-3-person-add-sync.md` (人员添加同步测试)
+- `13-4-status-update-sync.md` (状态更新同步测试)
+
+## Dev Agent Record
+
+### Agent Model Used
+
+_Created by create-story workflow_
+
+### Debug Log References
+
+_Story 13.5 created - not yet started_
+
+### Completion Notes List
+
+_Story 13.5 创建完成,状态:backlog_
+
+### File List
+
+_Created files:_
+- `/mnt/code/188-179-template-6/_bmad-output/implementation-artifacts/13-5-cross-platform-stability.md`
+
+## Change Log
+
+- 2026-01-14: Story 13.5 创建完成
+  - 跨端数据同步稳定性验证需求
+  - 数据一致性验证
+  - 并发操作验证
+  - 边界情况验证
+  - 稳定性测试(多次运行)
+  - 错误恢复验证
+  - 状态:backlog

+ 407 - 0
_bmad-output/implementation-artifacts/13-8-order-list-validation.md

@@ -0,0 +1,407 @@
+# Story 13.8: 订单列表页完整验证
+
+Status: backlog
+
+<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
+
+## Story
+
+作为测试开发者,
+我想要验证企业小程序订单列表页的完整功能,
+以便确保用户能够正确查看、筛选和搜索订单信息,并且后台编辑后能正确同步。
+
+## Acceptance Criteria
+
+### AC1: 订单列表基础功能验证
+**Given** 企业用户已登录小程序
+**When** 进入订单列表页
+**Then** 测试应验证以下功能:
+- 验证订单列表按预期加载
+- 验证订单卡片显示正确的订单名称
+- 验证订单状态徽章显示正确(草稿、已确认、进行中、已完成)
+- 验证工作状态徽章显示正确(未就业、待就业、已就业、已离职)
+- 验证订单人数显示正确
+- 验证订单日期显示正确
+
+### AC2: 订单状态筛选功能验证
+**Given** 订单列表页已加载
+**When** 使用订单状态筛选器
+**Then** 测试应验证以下场景:
+- 验证可以按订单状态筛选(草稿、已确认、进行中、已完成)
+- 验证筛选后列表只显示符合状态的订单
+- 验证筛选器状态切换正确
+- 验证重置筛选后显示所有订单
+- 验证后台编辑订单状态后,小程序筛选结果正确
+
+### AC3: 订单卡片所有字段显示验证
+**Given** 订单列表显示多个订单
+**When** 查看订单卡片
+**Then** 测试应验证以下字段:
+- 订单名称(orderName)正确显示
+- 订单编号(orderNumber)正确显示
+- 订单状态(orderStatus)正确显示
+- 工作状态(workStatus)正确显示
+- 关联人数(personCount)正确显示
+- 预计开始日期(expectedStartDate)正确显示
+- 企业名称(companyName)正确显示(如适用)
+- 验证所有字段在后台编辑后正确同步
+
+### AC4: 订单搜索功能验证
+**Given** 订单列表页已加载
+**When** 使用订单搜索功能
+**Then** 测试应验证以下场景:
+- 验证可以按订单名称搜索
+- 验证搜索结果正确显示匹配的订单
+- 验证搜索不区分大小写(如适用)
+- 验证搜索后可以清除搜索条件
+- 验证搜索 + 筛选组合使用正确
+
+### AC5: 后台编辑后订单列表同步验证
+**Given** 后台已创建订单
+**When** 在后台编辑订单信息
+**Then** 测试应验证以下场景:
+- 后台修改订单名称后,小程序列表显示更新后的名称
+- 后台修改订单状态后,小程序列表显示更新后的状态
+- 后台修改工作状态后,小程序列表显示更新后的工作状态
+- 后台添加人员后,小程序列表显示更新后的人数
+- 后台修改日期后,小程序列表显示更新后的日期
+- 验证所有更新在合理时间内同步(≤ 10 秒)
+
+### AC6: 分页功能验证(如适用)
+**Given** 订单列表包含多个订单
+**When** 订单数量超过单页显示数量
+**Then** 测试应验证以下功能:
+- 验证分页控件显示正确
+- 验证可以切换到下一页
+- 验证可以切换到上一页
+- 验证可以跳转到指定页
+- 验证分页后订单列表正确更新
+
+### AC7: 订单列表交互功能验证
+**Given** 订单列表已加载
+**When** 用户与订单列表交互
+**Then** 测试应验证以下功能:
+- 验证点击订单卡片跳转到订单详情页
+- 验证详情页显示正确的订单信息
+- 验证可以从详情页返回列表页
+- 验证列表页保持原有筛选和搜索状态
+
+### AC8: 代码质量标准
+**Given** 遵循项目测试规范
+**When** 编写测试代码
+**Then** 代码应符合以下标准:
+- 使用 TIMEOUTS 常量定义超时
+- 使用 data-testid 选择器(优先级高于文本选择器)
+- 测试文件命名:`order-list-validation.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 验证筛选和搜索功能的交互模式
+  - [ ] 0.5 记录数据同步时间(后台编辑后小程序更新时间)
+  - [ ] 0.6 生成测试代码骨架
+  - [ ] 0.7 将探索结果更新到本文档 Dev Notes
+
+### 阶段 2: RED - 编写测试(基于任务 0 的探索结果)
+
+- [ ] 任务 1: 创建订单列表验证测试文件 (AC: #8)
+  - [ ] 1.1 基于任务 0 的探索结果创建 `web/tests/e2e/specs/cross-platform/order-list-validation.spec.ts`
+  - [ ] 1.2 配置测试 fixtures(enterpriseMiniPage)
+  - [ ] 1.3 添加测试前置条件(企业用户登录、测试订单数据)
+
+- [ ] 任务 2: 实现订单列表基础功能测试 (AC: #1, #7)
+  - [ ] 2.1 编写"订单列表加载并显示订单卡片"测试
+  - [ ] 2.2 编写"订单卡片显示所有字段"测试
+  - [ ] 2.3 编写"点击订单卡片跳转到详情页"测试
+  - [ ] 2.4 编写"从详情页返回列表页"测试
+
+- [ ] 任务 3: 实现订单状态筛选测试 (AC: #2)
+  - [ ] 3.1 编写"按订单状态筛选 - 草稿"测试
+  - [ ] 3.2 编写"按订单状态筛选 - 已确认"测试
+  - [ ] 3.3 编写"按订单状态筛选 - 进行中"测试
+  - [ ] 3.4 编写"按订单状态筛选 - 已完成"测试
+  - [ ] 3.5 编写"重置筛选显示所有订单"测试
+
+- [ ] 任务 4: 实现订单搜索测试 (AC: #4)
+  - [ ] 4.1 编写"按订单名称搜索"测试
+  - [ ] 4.2 编写"搜索结果正确显示"测试
+  - [ ] 4.3 编写"清除搜索条件"测试
+  - [ ] 4.4 编写"搜索 + 筛选组合使用"测试
+
+### 阶段 3: GREEN - 实现代码(让测试通过)
+
+- [ ] 任务 5: 实现后台编辑后订单列表同步测试 (AC: #3, #5)
+  - [ ] 5.1 编写"后台修改订单名称后小程序同步"测试
+  - [ ] 5.2 编写"后台修改订单状态后小程序同步"测试
+  - [ ] 5.3 编写"后台修改工作状态后小程序同步"测试
+  - [ ] 5.4 编写"后台添加人员后小程序人数同步"测试
+  - [ ] 5.5 编写"后台修改日期后小程序同步"测试
+  - [ ] 5.6 验证数据同步时间(≤ 10 秒)
+
+- [ ] 任务 6: 实现分页功能测试 (AC: #6)(如适用)
+  - [ ] 6.1 编写"分页控件显示正确"测试
+  - [ ] 6.2 编写"切换到下一页"测试
+  - [ ] 6.3 编写"切换到上一页"测试
+  - [ ] 6.4 编写"跳转到指定页"测试
+
+### 阶段 4: REFACTOR - 优化代码质量
+
+- [ ] 任务 7: 验证代码质量 (AC: #8)
+  - [ ] 7.1 运行 `pnpm typecheck` 验证类型检查
+  - [ ] 7.2 运行测试确保所有测试通过
+  - [ ] 7.3 验证选择器使用 data-testid
+  - [ ] 7.4 优化测试执行时间
+
+## 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 13.5: 跨端测试稳定性验证
+Story 13.6: 后台添加人员 → 企业小程序**首页 dashboard** 人才数据验证 ✅
+Story 13.7: 企业小程序首页 **导航和交互**测试
+Story 13.8: 企业小程序**订单列表页**完整验证 ← 当前 Story
+Story 13.9: 人才小程序**人才列表页**完整验证
+```
+
+### 与 Story 13.1 和 13.2 的关系
+
+| Story | 验证目标 | 测试场景 |
+|-------|---------|---------|
+| Story 13.1 | 后台创建订单 → 企业小程序订单列表验证 | 验证新订单出现在列表中 |
+| Story 13.2 | 后台编辑订单 → 企业小程序订单列表验证 | 验证编辑后订单信息更新 |
+| Story 13.8 | 订单列表页完整功能验证 | 验证列表页所有功能:筛选、搜索、分页、字段显示、交互 |
+
+**Story 13.8 是 Story 13.1 和 13.2 的扩展和深化**:
+- 13.1 和 13.2 只验证了基本的数据同步
+- 13.8 验证订单列表页的所有功能点
+
+### 企业小程序订单列表页结构
+
+**订单列表页结构(待验证):**
+```
+┌─────────────────────────────────┐
+│  订单列表 (mini-order-list)      │
+├─────────────────────────────────┤
+│  筛选区域:                       │
+│  ┌─────────┬─────────┬─────────┐│
+│  │状态筛选 │搜索框   │重置按钮 ││
+│  └─────────┴─────────┴─────────┘│
+├─────────────────────────────────┤
+│  订单列表:                       │
+│  ┌─────────────────────────────┐│
+│  │ 订单卡片 1                  ││
+│  │ - 订单名称                  ││
+│  │ - 订单状态徽章              ││
+│  │ - 工作状态徽章              ││
+│  │ - 人数 / 日期               ││
+│  └─────────────────────────────┘│
+│  ┌─────────────────────────────┐│
+│  │ 订单卡片 2                  ││
+│  │ - ...                       ││
+│  └─────────────────────────────┘│
+├─────────────────────────────────┤
+│  分页控件(如适用)             │
+│  ┌────┬────┬────┬────┬────┐    │
+│  │< 1 │ 2 │ 3 │... │ > │    │
+│  └────┴────┴────┴────┴────┘    │
+└─────────────────────────────────┘
+```
+
+### EnterpriseMiniPage 扩展方法
+
+需要添加以下方法到 `enterprise-mini.page.ts`:
+
+```typescript
+/**
+ * 获取订单列表
+ */
+async getOrderList(): Promise<OrderListItem[]> {
+  // 实现获取订单列表的逻辑
+}
+
+/**
+ * 按状态筛选订单
+ * @param status 订单状态
+ */
+async filterByOrderStatus(status: string): Promise<void> {
+  // 实现状态筛选逻辑
+}
+
+/**
+ * 搜索订单
+ * @param keyword 搜索关键词
+ */
+async searchOrders(keyword: string): Promise<void> {
+  // 实现搜索逻辑
+}
+
+/**
+ * 重置筛选和搜索
+ */
+async resetFilters(): Promise<void> {
+  // 实现重置逻辑
+}
+
+/**
+ * 获取订单卡片详细信息
+ * @param orderName 订单名称
+ */
+async getOrderCardInfo(orderName: string): Promise<OrderCardInfo> {
+  // 实现获取订单卡片信息的逻辑
+}
+```
+
+### 订单卡片字段定义
+
+**订单卡片数据结构:**
+```typescript
+interface OrderCardInfo {
+  /** 订单 ID */
+  orderId: string;
+  /** 订单名称 */
+  orderName: string;
+  /** 订单编号 */
+  orderNumber: string;
+  /** 订单状态 */
+  orderStatus: '草稿' | '已确认' | '进行中' | '已完成';
+  /** 工作状态 */
+  workStatus: '未就业' | '待就业' | '已就业' | '已离职';
+  /** 关联人数 */
+  personCount: number;
+  /** 预计开始日期 */
+  expectedStartDate: string;
+  /** 企业名称 */
+  companyName?: string;
+}
+```
+
+### 选择器策略(待验证)
+
+**订单列表页选择器(待 Playwright MCP 验证):**
+| 功能 | data-testid |
+|------|-------------|
+| 订单列表容器 | `mini-order-list` |
+| 订单卡片 | `mini-order-card` |
+| 订单名称 | `mini-order-name` |
+| 订单编号 | `mini-order-number` |
+| 订单状态 | `mini-order-status` |
+| 工作状态 | `mini-work-status` |
+| 人数 | `mini-person-count` |
+| 日期 | `mini-order-date` |
+| 状态筛选器 | `mini-order-status-filter` |
+| 搜索框 | `mini-order-search` |
+| 重置按钮 | `mini-filter-reset` |
+
+### 测试数据准备策略
+
+**前置条件:**
+1. 需要企业用户数据(使用 Story 12.2 创建的企业用户)
+2. 需要测试订单数据(使用 Story 13.1 创建的订单)
+
+**测试数据准备:**
+```typescript
+// 创建不同状态的订单用于筛选测试
+const orders = {
+  draft: await createOrder({ status: '草稿', name: `草稿订单_${Date.now()}` }),
+  confirmed: await createOrder({ status: '已确认', name: `已确认订单_${Date.now()}` }),
+  inProgress: await createOrder({ status: '进行中', name: `进行中订单_${Date.now()}` }),
+  completed: await createOrder({ status: '已完成', name: `已完成订单_${Date.now()}` }),
+};
+```
+
+### 后台编辑同步验证策略
+
+**后台编辑后验证小程序同步:**
+```typescript
+test('后台修改订单名称后小程序同步', async ({ orderManagementPage, enterpriseMiniPage }) => {
+  // 1. 后台创建订单
+  const originalName = `测试订单_${Date.now()}`;
+  await orderManagementPage.createOrder({ name: originalName });
+
+  // 2. 小程序验证订单显示
+  await enterpriseMiniPage.goto();
+  await enterpriseMiniPage.login(TEST_USER.phone, TEST_USER.password);
+  await enterpriseMiniPage.gotoOrderList();
+  let orderInfo = await enterpriseMiniPage.getOrderCardInfo(originalName);
+  expect(orderInfo.orderName).toBe(originalName);
+
+  // 3. 后台修改订单名称
+  const updatedName = `${originalName}_更新`;
+  await orderManagementPage.editOrder(originalName, { name: updatedName });
+
+  // 4. 小程序验证订单名称更新
+  await enterpriseMiniPage.waitForOrderUpdate(originalName, TIMEOUTS.SYNC);
+  orderInfo = await enterpriseMiniPage.getOrderCardInfo(updatedName);
+  expect(orderInfo.orderName).toBe(updatedName);
+});
+```
+
+### 参考文档
+
+**架构文档:**
+- `_bmad-output/planning-artifacts/epics.md#Epic 13`
+- `_bmad-output/project-context.md`
+- `docs/standards/e2e-radix-testing.md`
+
+**相关 Story 文档:**
+- `10-2-order-list-tests.md` (后台订单列表测试)
+- `12-4-enterprise-mini-page-object.md` (企业小程序 Page Object)
+- `12-5-enterprise-mini-login.md` (企业小程序登录测试)
+- `13-1-order-create-sync.md` (订单创建同步测试)
+- `13-2-order-edit-sync.md` (订单编辑同步测试)
+
+## Dev Agent Record
+
+### Agent Model Used
+
+_Created by create-story workflow_
+
+### Debug Log References
+
+_Story 13.8 created - not yet started_
+
+### Completion Notes List
+
+_Story 13.8 创建完成,状态:backlog_
+
+### File List
+
+_Created files:_
+- `/mnt/code/188-179-template-6/_bmad-output/implementation-artifacts/13-8-order-list-validation.md`
+
+## Change Log
+
+- 2026-01-14: Story 13.8 创建完成
+  - 订单列表页完整验证需求
+  - 订单列表基础功能验证
+  - 订单状态筛选功能验证
+  - 订单卡片所有字段显示验证
+  - 订单搜索功能验证
+  - 后台编辑后订单列表同步验证
+  - 分页功能验证(如适用)
+  - 订单列表交互功能验证
+  - 状态:backlog

+ 462 - 0
_bmad-output/implementation-artifacts/13-9-talent-list-validation.md

@@ -0,0 +1,462 @@
+# Story 13.9: 人才列表页完整验证
+
+Status: backlog
+
+<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
+
+## Story
+
+作为测试开发者,
+我想要验证企业小程序人才列表页的完整功能,
+以便确保用户能够正确查看、筛选和搜索人才信息,并且后台添加/编辑人员后能正确同步。
+
+## Acceptance Criteria
+
+### AC1: 人才列表基础功能验证
+**Given** 企业用户已登录小程序
+**When** 进入人才列表页
+**Then** 测试应验证以下功能:
+- 验证人才列表按预期加载
+- 验证人才卡片显示正确的姓名
+- 验证残疾类型显示正确(视力残疾、听力残疾、肢体残疾等)
+- 验证残疾等级显示正确(一级、二级、三级、四级)
+- 验证性别显示正确(男、女)
+- 验证年龄显示正确
+- 验证工作状态显示正确(未就业、待就业、已就业、已离职)
+
+### AC2: 人才状态筛选功能验证
+**Given** 人才列表页已加载
+**When** 使用人才状态筛选器
+**Then** 测试应验证以下场景:
+- 验证可以按工作状态筛选(未就业、待就业、已就业、已离职)
+- 验证可以按残疾类型筛选(视力残疾、听力残疾、肢体残疾等)
+- 验证可以按残疾等级筛选(一级、二级、三级、四级)
+- 验证筛选后列表只显示符合条件的人才
+- 验证筛选器状态切换正确
+- 验证重置筛选后显示所有人才
+- 验证后台更新状态后,小程序筛选结果正确
+
+### AC3: 人才卡片所有信息显示验证
+**Given** 人才列表显示多个人才
+**When** 查看人才卡片
+**Then** 测试应验证以下字段:
+- 姓名(name)正确显示
+- 残疾类型(disabilityType)正确显示
+- 残疾等级(disabilityLevel)正确显示
+- 性别(gender)正确显示
+- 年龄(age)正确显示
+- 工作状态(workStatus)正确显示
+- 身份证号(idCard)脱敏显示(如适用)
+- 联系电话(phone)脱敏显示(如适用)
+- 所属订单(orderName)正确显示(如已分配)
+- 验证所有字段在后台编辑后正确同步
+
+### AC4: 人才搜索功能验证
+**Given** 人才列表页已加载
+**When** 使用人才搜索功能
+**Then** 测试应验证以下场景:
+- 验证可以按姓名搜索
+- 验证可以按身份证号搜索(脱敏)
+- 验证可以按联系电话搜索(脱敏)
+- 验证搜索结果正确显示匹配的人才
+- 验证搜索后可以清除搜索条件
+- 验证搜索 + 筛选组合使用正确
+
+### AC5: 后台添加/编辑人员后人才列表同步验证
+**Given** 后台可以操作残疾人数据
+**When** 在后台添加或编辑人员信息
+**Then** 测试应验证以下场景:
+- 后台添加人员后,小程序人才列表显示新增人员
+- 后台修改人员姓名后,小程序列表显示更新后的姓名
+- 后台修改残疾类型后,小程序列表显示更新后的残疾类型
+- 后台修改残疾等级后,小程序列表显示更新后的残疾等级
+- 后台修改工作状态后,小程序列表显示更新后的工作状态
+- 后台分配人员到订单后,小程序列表显示所属订单
+- 验证所有更新在合理时间内同步(≤ 10 秒)
+
+### AC6: 分页功能验证(如适用)
+**Given** 人才列表包含多个人才
+**When** 人才数量超过单页显示数量
+**Then** 测试应验证以下功能:
+- 验证分页控件显示正确
+- 验证可以切换到下一页
+- 验证可以切换到上一页
+- 验证可以跳转到指定页
+- 验证分页后人才列表正确更新
+
+### AC7: 人才列表交互功能验证
+**Given** 人才列表已加载
+**When** 用户与人才列表交互
+**Then** 测试应验证以下功能:
+- 验证点击人才卡片跳转到人才详情页
+- 验证详情页显示正确的人才信息
+- 验证可以从详情页返回列表页
+- 验证列表页保持原有筛选和搜索状态
+
+### AC8: 代码质量标准
+**Given** 遵循项目测试规范
+**When** 编写测试代码
+**Then** 代码应符合以下标准:
+- 使用 TIMEOUTS 常量定义超时
+- 使用 data-testid 选择器(优先级高于文本选择器)
+- 测试文件命名:`talent-list-validation.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 验证筛选和搜索功能的交互模式
+  - [ ] 0.5 记录数据同步时间(后台编辑后小程序更新时间)
+  - [ ] 0.6 生成测试代码骨架
+  - [ ] 0.7 将探索结果更新到本文档 Dev Notes
+
+### 阶段 2: RED - 编写测试(基于任务 0 的探索结果)
+
+- [ ] 任务 1: 创建人才列表验证测试文件 (AC: #8)
+  - [ ] 1.1 基于任务 0 的探索结果创建 `web/tests/e2e/specs/cross-platform/talent-list-validation.spec.ts`
+  - [ ] 1.2 配置测试 fixtures(enterpriseMiniPage)
+  - [ ] 1.3 添加测试前置条件(企业用户登录、测试人才数据)
+
+- [ ] 任务 2: 实现人才列表基础功能测试 (AC: #1, #7)
+  - [ ] 2.1 编写"人才列表加载并显示人才卡片"测试
+  - [ ] 2.2 编写"人才卡片显示所有字段"测试
+  - [ ] 2.3 编写"点击人才卡片跳转到详情页"测试
+  - [ ] 2.4 编写"从详情页返回列表页"测试
+
+- [ ] 任务 3: 实现人才状态筛选测试 (AC: #2)
+  - [ ] 3.1 编写"按工作状态筛选 - 未就业"测试
+  - [ ] 3.2 编写"按工作状态筛选 - 待就业"测试
+  - [ ] 3.3 编写"按工作状态筛选 - 已就业"测试
+  - [ ] 3.4 编写"按工作状态筛选 - 已离职"测试
+  - [ ] 3.5 编写"按残疾类型筛选"测试
+  - [ ] 3.6 编写"按残疾等级筛选"测试
+  - [ ] 3.7 编写"重置筛选显示所有人才"测试
+
+- [ ] 任务 4: 实现人才搜索测试 (AC: #4)
+  - [ ] 4.1 编写"按姓名搜索"测试
+  - [ ] 4.2 编写"按身份证号搜索"测试
+  - [ ] 4.3 编写"按联系电话搜索"测试
+  - [ ] 4.4 编写"清除搜索条件"测试
+  - [ ] 4.5 编写"搜索 + 筛选组合使用"测试
+
+### 阶段 3: GREEN - 实现代码(让测试通过)
+
+- [ ] 任务 5: 实现后台添加/编辑人员后人才列表同步测试 (AC: #3, #5)
+  - [ ] 5.1 编写"后台添加人员后小程序同步"测试
+  - [ ] 5.2 编写"后台修改人员姓名后小程序同步"测试
+  - [ ] 5.3 编写"后台修改残疾类型后小程序同步"测试
+  - [ ] 5.4 编写"后台修改残疾等级后小程序同步"测试
+  - [ ] 5.5 编写"后台修改工作状态后小程序同步"测试
+  - [ ] 5.6 编写"后台分配人员到订单后小程序同步"测试
+  - [ ] 5.7 验证数据同步时间(≤ 10 秒)
+
+- [ ] 任务 6: 实现分页功能测试 (AC: #6)(如适用)
+  - [ ] 6.1 编写"分页控件显示正确"测试
+  - [ ] 6.2 编写"切换到下一页"测试
+  - [ ] 6.3 编写"切换到上一页"测试
+  - [ ] 6.4 编写"跳转到指定页"测试
+
+### 阶段 4: REFACTOR - 优化代码质量
+
+- [ ] 任务 7: 验证代码质量 (AC: #8)
+  - [ ] 7.1 运行 `pnpm typecheck` 验证类型检查
+  - [ ] 7.2 运行测试确保所有测试通过
+  - [ ] 7.3 验证选择器使用 data-testid
+  - [ ] 7.4 优化测试执行时间
+
+## Dev Notes
+
+### Epic 13 背景和依赖
+
+**Epic 13: 跨端数据同步测试 (Epic E)**
+
+- **目标**: 验证后台操作后小程序端的数据同步,覆盖完整的业务流程
+- **业务分组**: Epic E(跨端数据同步测试)
+- **背景**: 真实用户旅程跨越管理后台和小程序,需要验证数据同步的正确性和时效性
+- **依赖**:
+  - Epic 9: ✅ 已完成(残疾人管理 E2E 测试)
+  - Epic 12: ✅ 已完成(小程序登录测试)
+  - Story 13.3: 🔄 进行中(后台添加人员 → 人才小程序验证)
+  - Story 13.6: ✅ 已完成(后台添加人员 → 企业小程序首页验证)
+
+**Epic 13 Story 依赖关系:**
+```
+Story 13.1: 后台创建订单 → 企业小程序**订单列表**验证 ✅
+Story 13.2: 后台编辑订单 → 企业小程序验证
+Story 13.3: 后台添加人员 → 人才小程序**人才列表**验证
+Story 13.4: 后台更新状态 → 双小程序验证
+Story 13.5: 跨端测试稳定性验证
+Story 13.6: 后台添加人员 → 企业小程序**首页 dashboard** 人才数据验证 ✅
+Story 13.7: 企业小程序首页 **导航和交互**测试
+Story 13.8: 企业小程序**订单列表页**完整验证
+Story 13.9: 企业小程序**人才列表页**完整验证 ← 当前 Story
+```
+
+### 与 Story 13.3 和 13.6 的关系
+
+| Story | 验证目标 | 测试场景 |
+|-------|---------|---------|
+| Story 13.3 | 后台添加人员 → 人才小程序人才列表验证 | 验证新增人员出现在列表中 |
+| Story 13.6 | 后台添加人员 → 企业小程序首页人才卡片验证 | 验证首页人才卡片显示正确 |
+| Story 13.9 | 企业小程序人才列表页完整功能验证 | 验证列表页所有功能:筛选、搜索、分页、字段显示、交互 |
+
+**Story 13.9 是 Story 13.3 的扩展和深化**:
+- 13.3 只验证了基本的人员添加同步
+- 13.9 验证人才列表页的所有功能点
+
+### 企业小程序人才列表页结构
+
+**人才列表页结构(待验证):**
+```
+┌─────────────────────────────────┐
+│  人才列表 (mini-talent-list)     │
+├─────────────────────────────────┤
+│  筛选区域:                       │
+│  ┌─────────┬─────────┬─────────┐│
+│  │状态筛选 │类型筛选 │等级筛选 ││
+│  ├─────────┴─────────┴─────────┤│
+│  │搜索框           │重置按钮   ││
+│  └─────────────────────────────┘│
+├─────────────────────────────────┤
+│  人才列表:                       │
+│  ┌─────────────────────────────┐│
+│  │ 人才卡片 1                  ││
+│  │ - 姓名 (张三)               ││
+│  │ - 残疾类型 (视力残疾)       ││
+│  │ - 等级 (一级)               ││
+│  │ - 性别/年龄 (男/30)         ││
+│  │ - 工作状态 (待就业)         ││
+│  └─────────────────────────────┘│
+│  ┌─────────────────────────────┐│
+│  │ 人才卡片 2                  ││
+│  │ - ...                       ││
+│  └─────────────────────────────┘│
+├─────────────────────────────────┤
+│  分页控件(如适用)             │
+└─────────────────────────────────┘
+```
+
+### EnterpriseMiniPage 扩展方法
+
+需要添加以下方法到 `enterprise-mini.page.ts`:
+
+```typescript
+/**
+ * 获取人才列表
+ */
+async getTalentList(): Promise<TalentListItem[]> {
+  // 实现获取人才列表的逻辑
+}
+
+/**
+ * 按工作状态筛选人才
+ * @param workStatus 工作状态
+ */
+async filterByWorkStatus(workStatus: string): Promise<void> {
+  // 实现状态筛选逻辑
+}
+
+/**
+ * 按残疾类型筛选人才
+ * @param disabilityType 残疾类型
+ */
+async filterByDisabilityType(disabilityType: string): Promise<void> {
+  // 实现残疾类型筛选逻辑
+}
+
+/**
+ * 按残疾等级筛选人才
+ * @param disabilityLevel 残疾等级
+ */
+async filterByDisabilityLevel(disabilityLevel: string): Promise<void> {
+  // 实现残疾等级筛选逻辑
+}
+
+/**
+ * 搜索人才
+ * @param keyword 搜索关键词
+ */
+async searchTalents(keyword: string): Promise<void> {
+  // 实现搜索逻辑
+}
+
+/**
+ * 重置筛选和搜索
+ */
+async resetTalentFilters(): Promise<void> {
+  // 实现重置逻辑
+}
+
+/**
+ * 获取人才卡片详细信息
+ * @param talentName 人才姓名
+ */
+async getTalentCardInfo(talentName: string): Promise<TalentCardInfo> {
+  // 实现获取人才卡片信息的逻辑
+}
+```
+
+### 人才卡片字段定义
+
+**人才卡片数据结构:**
+```typescript
+interface TalentCardInfo {
+  /** 人员 ID */
+  personId: string;
+  /** 姓名 */
+  name: string;
+  /** 残疾类型 */
+  disabilityType: '视力残疾' | '听力残疾' | '言语残疾' | '肢体残疾' | '智力残疾' | '精神残疾' | '多重残疾';
+  /** 残疾等级 */
+  disabilityLevel: '一级' | '二级' | '三级' | '四级';
+  /** 性别 */
+  gender: '男' | '女';
+  /** 年龄 */
+  age: number;
+  /** 工作状态 */
+  workStatus: '未就业' | '待就业' | '已就业' | '已离职';
+  /** 身份证号(脱敏) */
+  idCard?: string;
+  /** 联系电话(脱敏) */
+  phone?: string;
+  /** 所属订单 */
+  orderName?: string;
+}
+```
+
+### 选择器策略(待验证)
+
+**人才列表页选择器(待 Playwright MCP 验证):**
+| 功能 | data-testid |
+|------|-------------|
+| 人才列表容器 | `mini-talent-list` |
+| 人才卡片 | `mini-talent-card` |
+| 姓名 | `mini-talent-name` |
+| 残疾类型 | `mini-disability-type` |
+| 残疾等级 | `mini-disability-level` |
+| 性别 | `mini-gender` |
+| 年龄 | `mini-age` |
+| 工作状态 | `mini-work-status` |
+| 身份证号 | `mini-id-card` |
+| 联系电话 | `mini-phone` |
+| 所属订单 | `mini-order-name` |
+| 工作状态筛选器 | `mini-work-status-filter` |
+| 残疾类型筛选器 | `mini-disability-type-filter` |
+| 残疾等级筛选器 | `mini-disability-level-filter` |
+| 搜索框 | `mini-talent-search` |
+| 重置按钮 | `mini-talent-filter-reset` |
+
+### 测试数据准备策略
+
+**前置条件:**
+1. 需要企业用户数据(使用 Story 12.2 创建的企业用户)
+2. 需要测试残疾人数据(使用 Story 9.5 创建的残疾人数据)
+
+**测试数据准备:**
+```typescript
+// 创建不同状态的残疾人用于筛选测试
+const persons = {
+  unemployed: await createDisabilityPerson({
+    workStatus: '未就业',
+    name: `未就业_${Date.now()}`,
+    disabilityType: '视力残疾',
+    disabilityLevel: '一级',
+  }),
+  pending: await createDisabilityPerson({
+    workStatus: '待就业',
+    name: `待就业_${Date.now()}`,
+    disabilityType: '听力残疾',
+    disabilityLevel: '二级',
+  }),
+  employed: await createDisabilityPerson({
+    workStatus: '已就业',
+    name: `已就业_${Date.now()}`,
+    disabilityType: '肢体残疾',
+    disabilityLevel: '三级',
+  }),
+};
+```
+
+### 后台编辑同步验证策略
+
+**后台编辑后验证小程序同步:**
+```typescript
+test('后台修改人员姓名后小程序同步', async ({ disabilityPersonPage, enterpriseMiniPage }) => {
+  // 1. 后台创建残疾人
+  const originalName = `测试残疾人_${Date.now()}`;
+  await disabilityPersonPage.create({
+    name: originalName,
+    disabilityType: '视力残疾',
+    disabilityLevel: '一级',
+  });
+
+  // 2. 小程序验证残疾人显示
+  await enterpriseMiniPage.goto();
+  await enterpriseMiniPage.login(TEST_USER.phone, TEST_USER.password);
+  await enterpriseMiniPage.gotoTalentList();
+  let talentInfo = await enterpriseMiniPage.getTalentCardInfo(originalName);
+  expect(talentInfo.name).toBe(originalName);
+
+  // 3. 后台修改残疾人姓名
+  const updatedName = `${originalName}_更新`;
+  await disabilityPersonPage.edit(originalName, { name: updatedName });
+
+  // 4. 小程序验证残疾人姓名更新
+  await enterpriseMiniPage.waitForTalentUpdate(originalName, TIMEOUTS.SYNC);
+  talentInfo = await enterpriseMiniPage.getTalentCardInfo(updatedName);
+  expect(talentInfo.name).toBe(updatedName);
+});
+```
+
+### 参考文档
+
+**架构文档:**
+- `_bmad-output/planning-artifacts/epics.md#Epic 13`
+- `_bmad-output/project-context.md`
+- `docs/standards/e2e-radix-testing.md`
+
+**相关 Story 文档:**
+- `9-5-crud-tests.md` (残疾人管理 CRUD 测试)
+- `12-4-enterprise-mini-page-object.md` (企业小程序 Page Object)
+- `12-5-enterprise-mini-login.md` (企业小程序登录测试)
+- `13-3-person-add-sync.md` (人员添加同步测试)
+- `13-6-dashboard-sync.md` (首页看板数据联动测试)
+
+## Dev Agent Record
+
+### Agent Model Used
+
+_Created by create-story workflow_
+
+### Debug Log References
+
+_Story 13.9 created - not yet started_
+
+### Completion Notes List
+
+_Story 13.9 创建完成,状态:backlog_
+
+### File List
+
+_Created files:_
+- `/mnt/code/188-179-template-6/_bmad-output/implementation-artifacts/13-9-talent-list-validation.md`
+
+## Change Log
+
+- 2026-01-14: Story 13.9 创建完成
+  - 人才列表页完整验证需求
+  - 人才列表基础功能验证
+  - 人才状态筛选功能验证
+  - 人才卡片所有信息显示验证
+  - 人才搜索功能验证
+  - 后台添加/编辑人员后人才列表同步验证
+  - 分页功能验证(如适用)
+  - 人才列表交互功能验证
+  - 状态:backlog

+ 4 - 2
_bmad-output/implementation-artifacts/sprint-status.yaml

@@ -213,10 +213,12 @@ development_status:
   13-1-order-create-sync: done   # 后台创建订单 → 企业小程序验证 ✅ 完成 (2026-01-14) - 跨端数据同步测试、Playwright MCP 探索、DisabledPersonSelector 组件修复
   13-2-order-edit-sync: in-progress       # 后台编辑订单 → 企业小程序验证
   13-3-person-add-sync: in-progress            # 后台添加人员 → 人才小程序验证
-  13-4-work-status-sync: backlog           # 后台更新状态 → 双小程序验证
-  13-5-cross-platform-stability: backlog   # 跨端测试稳定性验证
+  13-4-status-update-sync: ready-for-dev   # 后台更新状态 → 双小程序验证(2026-01-14 新增)
+  13-5-cross-platform-stability: ready-for-dev   # 跨端测试稳定性验证(2026-01-14 新增)
   13-6-dashboard-sync: done       # 首页看板数据联动专项测试 ✅ 完成 (2026-01-14) - 所有4个测试通过
   13-7-dashboard-navigation: ready-for-dev   # 首页导航和交互测试 - 测试快捷操作按钮、查看全部链接、人才卡片点击
+  13-8-order-list-validation: ready-for-dev   # 订单列表页完整验证(2026-01-14 新增)- 验证订单列表页所有功能:筛选、搜索、分页、字段显示、交互
+  13-9-talent-list-validation: ready-for-dev   # 人才列表页完整验证(2026-01-14 新增)- 验证人才列表页所有功能:筛选、搜索、分页、字段显示、交互
   epic-13-retrospective: optional
 
 # Epic 组织架构 (2026-01-13):