Procházet zdrojové kódy

chore: 删除 Story 13.1 和 13.2,功能合并到 Story 13.8

删除原因:
- Story 13.1(后台创建订单 → 企业小程序验证)功能被 Story 13.8 完全覆盖
- Story 13.2(后台编辑订单 → 企业小程序验证)功能被 Story 13.8 完全覆盖
- 避免重复工作和维护成本

变更内容:
1. sprint-status.yaml: 将 13-1-order-create-sync 和 13-2-order-edit-sync 标记为 removed
2. 13-8-order-list-validation.md: 更新文档说明包含原 13.1 和 13.2 的功能
3. 删除文档文件: 13-1-order-create-sync.md, 13-2-order-edit-sync.md

Story 13.8 现在包含:
- 原 Story 13.1: 后台创建订单后小程序列表显示验证
- 原 Story 13.2: 后台编辑订单后小程序列表更新验证
- 订单列表页完整功能验证:筛选、搜索、字段显示、交互

Co-Authored-By: Claude <noreply@anthropic.com>
yourname před 2 dny
rodič
revize
fd66d79d8e

+ 0 - 737
_bmad-output/implementation-artifacts/13-1-order-create-sync.md

@@ -1,737 +0,0 @@
-# Story 13.1: 后台创建订单 → 企业小程序验证
-
-Status: completed
-
-<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
-
-## Story
-
-作为测试开发者,
-我想要验证后台创建订单后企业小程序的数据同步,
-以便确保跨端数据同步的正确性和时效性。
-
-## Acceptance Criteria
-
-> **注意**: 本 Story 不包含 WebSocket 通信验证,因为小程序和后端服务未采用 WebSocket。
-
-### AC1: 后台创建订单基础流程
-**Given** 后台订单管理功能已完成(Epic 10)
-**When** 测试者在管理后台创建订单
-**Then** 测试应验证以下功能:
-- 使用 OrderManagementPage 创建测试订单
-- 填写订单名称、预计开始日期等必填字段
-- 选择平台和公司(如适用)
-- 验证订单在后台列表中显示
-- 获取创建订单的 ID 和关键信息
-
-### AC2: 企业小程序数据同步验证
-**Given** 管理后台已创建订单
-**When** 企业用户登录小程序
-**Then** 测试应验证以下功能:
-- 使用 EnterpriseMiniPage 登录企业小程序
-- 验证新创建的订单在小程序订单列表中显示
-- 验证订单信息完整(订单名称、状态、日期等)
-- 验证数据同步在合理时间内完成(≤ 10 秒)
-
-### AC3: 多 Page 对象管理
-**Given** 测试需要同时操作后台和小程序
-**When** 执行跨端测试
-**Then** 测试应满足以下要求:
-- 使用独立的 Page 对象管理后台和小程序
-- 正确管理多个 browser context 或 page
-- 确保测试之间不会相互干扰
-
-### AC4: 测试数据隔离和清理
-**Given** 跨端测试涉及多个系统
-**When** 执行测试
-**Then** 测试应遵循以下策略:
-- 使用唯一标识符创建测试订单(避免冲突)
-- 测试后清理创建的订单数据
-- 验证清理后小程序列表不再显示该订单
-
-### AC5: 数据同步时效性验证
-**Given** 网络延迟和系统负载
-**When** 创建订单后查询小程序
-**Then** 测试应验证以下场景:
-- 在正常情况下,数据应在 5 秒内同步
-- 支持轮询等待机制(最多等待 10 秒)
-- 验证超时情况下的错误处理
-
-### AC6: 代码质量标准
-**Given** 遵循项目测试规范
-**When** 编写测试代码
-**Then** 代码应符合以下标准:
-- 使用 TIMEOUTS 常量定义超时
-- 使用 data-testid 选择器(优先级高于文本选择器)
-- 测试文件命名:`order-create-sync.spec.ts`
-- 完整的测试描述和注释
-- TypeScript 类型安全
-- 通过 `pnpm typecheck` 类型检查
-
-## Tasks / Subtasks
-
-> **测试开发流程(增强的 TDD + 持续验证)**: 本 Story 采用 Playwright MCP 持续验证的测试开发流程。
->
-> **核心原则**:
-> 1. **即时验证**: 在开发过程中立即使用 Playwright MCP 验证,不等到专门的 E2E Story
-> 2. **持续反馈**: 每完成一个功能模块立即验证,快速发现问题
-> 3. **减少返工**: 早期发现问题可以减少后期返工成本
->
-> **Playwright MCP 使用时机**:
-> - ✅ 任务 0: 探索页面结构、验证流程可行性
-> - ✅ 任务 1-3: 每写一个测试就用 MCP 验证选择器、页面结构
-> - ✅ 任务 4-5: 每实现一个功能就用 MCP 验证是否正常工作
-> - ✅ 任务 6: 重构后用 MCP 确保功能未破坏
->
-> **任务 0 必须在任务 1-6 之前完成**,它为后续任务提供验证过的选择器和基础模式。
->
-> **注意**: 已移除 WebSocket 相关任务(原任务 4),因为小程序和后端服务未采用 WebSocket。
-
-### 阶段 1: EXPLORE - Playwright MCP 探索(RED 之前)
-
-- [x] **任务 0: Playwright MCP 探索验证**(已于 2026-01-14 完成)
-  - [x] 0.1 启动子代理使用 Playwright MCP 手动验证完整测试流程
-  - [x] 0.2 记录验证的选择器(优先 data-testid,避免文本选择器)
-  - [x] 0.3 记录交互模式(点击、填写、等待、页面跳转)
-  - [x] 0.4 记录数据流(API 调用、请求/响应格式、同步时间)
-  - [x] 0.5 立即修复发现的应用层 bug(如果有)
-  - [x] 0.6 生成测试代码骨架(基于验证的流程)
-  - [x] 0.7 将探索结果更新到本文档 Dev Notes 的"Playwright MCP 探索结果"部分
-
-### 阶段 2: RED - 编写测试(基于任务 0 的探索结果)
-
-- [x] 任务 1: 创建跨端测试文件和基础设施 (AC: #3, #6)
-  - [x] 1.1 基于任务 0 的探索结果创建 `web/tests/e2e/specs/cross-platform/order-create-sync.spec.ts`
-  - [x] 1.2 配置测试 fixtures(使用任务 0 验证过的选择器)
-  - [x] 1.3 添加测试前置条件(需要测试平台和公司数据)
-
-- [x] 任务 2: 实现后台创建订单测试 (AC: #1)
-  - [x] 2.1 使用任务 0 验证的选择器编写"后台创建订单成功"测试
-  - [x] 2.2 验证订单在后台列表中显示
-  - [x] 2.3 获取并存储订单 ID 和关键信息
-
-- [x] 任务 3: 实现企业小程序验证测试 (AC: #2)
-  - [x] 3.1 使用任务 0 验证的选择器编写"企业小程序显示新订单"测试
-  - [x] 3.2 验证订单信息完整性
-  - [x] 3.3 实现数据同步等待机制(基于任务 0 实测的同步时间)
-
-### 阶段 3: GREEN - 实现代码(让测试通过)
-
-- [x] 任务 4: 实现测试数据清理策略 (AC: #4)
-  - [x] 4.1 添加 afterEach 钩子清理订单数据
-  - [x] 4.2 验证清理后小程序不再显示该订单
-
-- [x] 任务 5: 实现数据同步时效性验证 (AC: #5)
-  - [x] 5.1 实现轮询等待机制
-  - [x] 5.2 验证正常同步时间(基于任务 0 的实测数据,应 ≤ 5 秒)
-  - [x] 5.3 验证超时处理(最长 10 秒)
-
-### 阶段 4: REFACTOR - 优化代码质量(可选)
-
-- [x] 任务 6: 验证代码质量 (AC: #6)
-  - [x] 6.1 运行 `pnpm typecheck` 验证类型检查
-  - [x] 6.2 运行测试确保所有测试通过
-  - [x] 6.3 验证使用 data-testid 选择器(任务 0 已确认)
-
-### 阶段 5: CODE REVIEW FIXES - 修复代码审查发现的问题(来自 Story 13.6 代码审查)
-
-> **代码审查来源**: Story 13.6 的代码审查发现,这些问题在 DisabledPersonSelector 组件和测试代码中存在,需要在 Story 13.1 完成前修复。
-
-#### 高优先级问题(安全性和功能损坏)
-
-- [x] 任务 7: 修复 DisabledPersonSelector 组件安全问题和功能损坏
-  - [x] 7.1 身份证号脱敏处理(安全问题)
-    - 当前问题:身份证号明文显示,存在安全隐患
-    - 修复方案:实现脱敏显示函数,只显示前6位和后4位
-  - [x] 7.2 修复地区选择未连接到 API(功能损坏)
-    - 当前问题:地区选择未调用实际 API
-    - 修复方案:连接到真实的地区查询 API
-  - [x] 7.3 修复多字段搜索功能(功能损坏)
-    - 当前问题:三个搜索字段共用同一状态,导致功能完全损坏
-    - 修复方案:为每个搜索字段创建独立的状态管理
-  - [x] 7.4 移除未使用的 selectedIds 属性(代码清理)
-    - 当前问题:selectedIds 属性定义但未使用
-    - 修复方案:移除该属性及其相关代码(实际上该属性在使用,无需移除)
-
-#### 中优先级问题(测试代码改进)
-
-- [x] 任务 8: 改进测试代码质量和可维护性
-  - [x] 8.1 移除 process.env 状态共享
-    - 当前问题:使用 process.env 在测试间共享状态,违反测试隔离原则
-    - 修复方案:使用 Playwright 的 fixtures 或测试上下文传递状态
-  - [x] 8.2 使用环境变量替代硬编码凭据
-    - 当前问题:测试数据(手机号、密码等)硬编码在测试中
-    - 修复方案:从环境变量读取测试凭据和测试数据
-  - [x] 8.3 统一使用 TIMEOUTS 常量
-    - 当前问题:存在魔术数字(硬编码的超时值)
-    - 修复方案:统一使用 `TIMEOUTS` 常量,消除魔术数字
-
-#### 低优先级问题(技术债)
-
-- [x] 任务 9: 优化组件性能和可维护性(技术债清理)
-  - [x] 9.1 优化 columns 数组定义
-    - 当前问题:columns 数组在组件内每次渲染时重新创建
-    - 修复方案:移到组件外或使用 useMemo 优化
-  - [x] 9.2 使用命名常量替代硬编码状态值
-    - 当前问题:黑名单状态使用硬编码字符串/数字
-    - 修复方案:定义命名常量(如 BLACKLIST_STATUS_ACTIVE)
-  - [x] 9.3 添加错误边界和友好错误提示
-    - 当前问题:组件缺少错误处理机制
-    - 修复方案:添加 React 错误边界和用户友好的错误消息
-
-## Dev Notes
-
-### Playwright MCP 持续验证策略
-
-> **核心理念**: Playwright MCP 不应该只在任务0使用一次,而应该作为整个开发过程中的**持续验证工具**。
-
-#### 为什么需要持续验证?
-
-| 对比维度 | 传统流程(只在任务0用 MCP) | 持续验证流程(整个开发过程用 MCP) |
-|---------|---------------------------|--------------------------------|
-| 问题发现时机 | 运行完整测试套件时发现 | 几秒钟内立即发现 |
-| 反馈速度 | 分钟级(重新编译+运行测试) | 秒级(直接在 MCP 中验证) |
-| 调试效率 | 只看截图和日志 | 完整页面状态+交互式调试 |
-| 认知负担 | 频繁在"写代码"和"跑测试"间切换 | 保持开发心流,即时验证 |
-| 返工成本 | 高(写很多代码后才发现问题) | 低(每步验证后继续) |
-
-#### 各阶段的具体使用策略
-
-**阶段 1: EXPLORE(任务 0)** ✅ 已完成
-```
-目标: 探索页面结构、验证流程可行性
-操作: 完整走一遍测试流程,记录选择器
-输出: 验证过的选择器、测试骨架
-```
-
-**阶段 2: RED(任务 1-3 - 编写测试)**
-```
-每写一个测试用例 → 用 MCP 验证选择器 → 发现选择器错误 → 修复测试
-
-示例:
-1. 编写测试: await page.click('[data-testid="create-button"]');
-2. MCP 验证: 发现选择器不存在
-3. 修复测试: 改为正确的选择器
-4. 重新验证: 确认可以点击
-5. 继续编写下一步
-```
-
-**阶段 3: GREEN(任务 4-5 - 实现代码)**
-```
-每实现一个功能 → 用 MCP 验证功能 → 发现字段没同步 → 调整代码
-
-示例:
-1. 实现创建订单功能: orderManagementPage.createOrder(...)
-2. MCP 验证: 创建后小程序数据没显示
-3. 调查原因: 发现同步时间不够
-4. 优化等待: 增加轮询等待时间
-5. 重新验证: 确认数据同步成功
-```
-
-**阶段 4: REFACTOR(任务 6 - 优化代码)**
-```
-重构代码 → 用 MCP 确保功能未破坏 → 发现回归 → 回退或修复
-
-示例:
-1. 重构: 提取公共方法到基类
-2. MCP 验证: 所有功能仍然正常
-3. 完成: 提交重构代码
-```
-
-#### Playwright MCP vs 自动化测试
-
-| 场景 | 使用 Playwright MCP | 运行自动化测试 |
-|-----|-------------------|--------------|
-| 编写新测试前 | ✅ 探索页面结构 | |
-| 编写测试中 | ✅ 验证选择器、交互 | |
-| 实现功能中 | ✅ 验证功能正确性 | |
-| 修复 bug 时 | ✅ 验证修复效果 | |
-| 代码重构后 | ✅ 快速验证 | |
-| 提交前 | | ✅ 完整测试套件 |
-| CI/CD | | ✅ 完整测试套件 |
-
-### Epic 13 背景和依赖
-
-**Epic 13: 跨端数据同步测试 (Epic E)**
-
-- **目标**: 验证后台操作后小程序端的数据同步,覆盖完整的业务流程
-- **业务分组**: Epic E(跨端数据同步测试)
-- **背景**: 真实用户旅程跨越管理后台和小程序,需要验证数据同步的正确性和时效性
-- **依赖**:
-  - Epic 10: ✅ 已完成(订单管理 E2E 测试)
-  - Epic 12: 🔄 进行中(小程序登录测试)
-
-**Epic 13 Story 依赖关系:**
-```
-Story 13.1: 后台创建订单 → 企业小程序验证 ← 当前 Story
-Story 13.2: 后台编辑订单 → 企业小程序验证
-Story 13.3: 后台添加人员 → 人才小程序验证
-Story 13.4: 后台更新状态 → 双小程序验证
-Story 13.5: 跨端测试稳定性验证
-```
-
-### Playwright MCP 探索结果 (2026-01-14)
-
-**测试目标**: 验证后台创建订单后,企业小程序能否正确显示该订单
-
-**测试结果**: ✅ 成功
-
-**数据同步时效性**:
-- 实际同步时间: < 1秒
-- 要求: ≤ 10 秒
-- 结论: 远超预期
-
-**后台选择器(已验证可用)**:
-| 功能 | data-testid |
-|------|-------------|
-| 创建订单按钮 | `create-order-button` |
-| 平台选择器 | `platform-selector-create` |
-| 公司选择器 | `company-selector-create` |
-| 选择残疾人按钮 | `select-persons-button` |
-| 残疾人复选框 | `person-checkbox-{id}` |
-| 确认选择按钮 | `confirm-batch-button` |
-| 创建提交按钮 | `order-create-submit-button` |
-
-**小程序选择器(已验证可用)**:
-| 功能 | data-testid |
-|------|-------------|
-| 手机号输入框 | `mini-phone-input` |
-| 登录按钮 | `mini-login-button` |
-
-**测试流程(已验证)**:
-1. 后台登录 → 导航到订单管理 → 点击创建订单
-2. 填写订单信息(名称、平台、公司、残疾人)→ 提交创建
-3. 小程序登录 → 导航到订单列表 → 验证新订单显示
-4. 点击订单详情 → 验证订单信息完整性
-
-**注意事项**:
-- 订单列表项可以直接通过文本选择器访问(订单名称)
-- 订单详情页显示完整信息:订单编号、状态、实际人数、关联人才
-
-**关键发现(2026-01-14 探索)**:
-
-1. **残疾人选择问题**:
-   - 残疾人选择对话框能够正确打开
-   - 使用 `getByTestId('person-checkbox-1240')` 可以选择残疾人(1240 是残疾人 ID)
-   - 选择后需要点击 `confirm-batch-button` 确认
-
-2. **公司关联问题**:
-   - 小程序用户(13800001111)关联的公司是"测试公司_1768346782396"
-   - 测试需要选择相同的公司,否则小程序看不到创建的订单
-   - 修复:测试代码已更新为选择正确的公司
-
-3. **测试状态持久化**:
-   - 之前的测试运行可能在对话框中留下了残疾人选择
-   - 修复:测试代码已添加逻辑检测已选择的残疾人
-
-4. **对话框检测**:
-   - 使用 `text=选择残疾人` 检测对话框标题比 `[role="dialog"]` 更可靠
-   - 确认按钮使用 `confirm-batch-button` data-testid
-
-**待解决问题**:
-- 残疾人选择后,测试在后续步骤超时
-- 需要进一步调试表格行点击逻辑
-
-### Epic 10 关键经验(订单管理)
-
-从已完成的 Epic 10 中学习到的订单管理模式:
-
-**OrderManagementPage 可用方法:**
-```typescript
-// 页面导航
-async goto(): Promise<void>
-async expectToBeVisible(): Promise<void>
-
-// 订单 CRUD
-async createOrder(data: OrderData): Promise<FormSubmitResult>
-async editOrder(orderId: string, data: OrderData): Promise<FormSubmitResult>
-async deleteOrder(orderId: string): Promise<FormSubmitResult>
-async orderExists(orderName: string): Promise<boolean>
-
-// 订单详情
-async openDetailDialog(orderName: string): Promise<void>
-async getOrderDetailInfo(): Promise<OrderData>
-```
-
-**订单数据结构:**
-```typescript
-interface OrderData {
-  name: string;              // 订单名称
-  expectedStartDate?: string; // 预计开始日期
-  platformId?: number;       // 平台ID
-  companyId?: number;        // 公司ID
-  channelId?: number;        // 渠道ID
-  status?: string;           // 订单状态
-  workStatus?: string;       // 工作状态
-}
-```
-
-**订单创建模式:**
-```typescript
-const orderData = {
-  name: `跨端测试订单_${Date.now()}`,
-  expectedStartDate: '2026-01-15',
-  platformId: 1,
-  companyId: 1,
-};
-
-const result = await orderManagementPage.createOrder(orderData);
-expect(result.success).toBe(true);
-```
-
-### Epic 12 关键经验(小程序登录)
-
-从已完成的 Epic 12 中学习到的小程序模式:
-
-**EnterpriseMiniPage 可用方法:**
-```typescript
-// 页面导航
-async goto(): Promise<void>
-async expectToBeVisible(): Promise<void>
-
-// 登录方法
-async login(phone: string, password: string): Promise<void>
-
-// Token 管理
-async getToken(): Promise<string | null>
-async setToken(token: string): Promise<void>
-async clearAuth(): Promise<void>
-
-// 订单列表(待实现)
-async getOrderList(): Promise<OrderData[]>
-async waitForOrderToAppear(orderName: string, timeout?: number): Promise<boolean>
-```
-
-**企业小程序登录流程:**
-```typescript
-await enterpriseMiniPage.goto();
-await enterpriseMiniPage.login(
-  '13800138000',  // 企业用户手机号
-  'password123'
-);
-await enterpriseMiniPage.expectLoginSuccess();
-```
-
-### 多 Page 对象管理策略
-
-**方案 1: 使用多个 Browser Context(推荐)**
-```typescript
-import { test as base } from '@playwright/test';
-
-type CrossPlatformFixtures = {
-  adminPage: Page;
-  miniPage: Page;
-  orderManagementPage: OrderManagementPage;
-  enterpriseMiniPage: EnterpriseMiniPage;
-};
-
-export const test = base.extend<CrossPlatformFixtures>({
-  adminPage: async ({ browser }, use) => {
-    const context = await browser.newContext();
-    const page = await context.newPage();
-    await use(page);
-    await context.close();
-  },
-  miniPage: async ({ browser }, use) => {
-    const context = await browser.newContext();
-    const page = await context.newPage();
-    await use(page);
-    await context.close();
-  },
-  orderManagementPage: async ({ adminPage }, use) => {
-    const page = new OrderManagementPage(adminPage);
-    await use(page);
-  },
-  enterpriseMiniPage: async ({ miniPage }, use) => {
-    const page = new EnterpriseMiniPage(miniPage);
-    await use(page);
-  },
-});
-```
-
-**方案 2: 使用单个 Browser Context,多个 Page(备选)**
-```typescript
-test('跨端数据同步测试', async ({ page }) => {
-  // 后台操作
-  const adminPage = page;
-  const orderManagementPage = new OrderManagementPage(adminPage);
-
-  // 小程序操作(使用新的 page)
-  const miniContext = await adminPage.context().browser()?.newContext();
-  const miniPage = await miniContext?.newPage();
-  const enterpriseMiniPage = new EnterpriseMiniPage(miniPage!);
-  // ...
-});
-```
-
-### 数据同步等待策略
-
-**轮询等待模式:**
-```typescript
-async waitForOrderToAppear(
-  orderName: string,
-  timeout: number = 10000
-): Promise<boolean> {
-  const startTime = Date.now();
-  while (Date.now() - startTime < timeout) {
-    const orders = await this.getOrderList();
-    if (orders.some(o => o.name === orderName)) {
-      return true;
-    }
-    await this.page.waitForTimeout(500); // 每 500ms 检查一次
-  }
-  return false;
-}
-```
-
-**使用 Playwright 的等待机制:**
-```typescript
-await expect(async () => {
-  const orders = await enterpriseMiniPage.getOrderList();
-  expect(orders.some(o => o.name === orderName)).toBe(true);
-}).toPass({
-  timeout: 10000,
-  intervals: [500, 1000], // 检查间隔
-});
-```
-
-### 测试数据准备策略
-
-**前置条件:**
-1. 需要测试平台数据(使用 Story 11.2 创建的平台)
-2. 需要测试公司数据(使用 Story 11.5 创建的公司)
-3. 需要企业用户数据(使用 Story 12.2 创建的企业用户)
-
-**测试数据唯一性:**
-```typescript
-const timestamp = Date.now();
-const orderData = {
-  name: `跨端同步测试_${timestamp}`,
-  expectedStartDate: '2026-01-15',
-};
-```
-
-### 测试数据清理策略
-
-**清理方法:**
-```typescript
-test.afterEach(async ({ orderManagementPage, orderName }) => {
-  // 在后台删除测试订单
-  await orderManagementPage.goto();
-  await orderManagementPage.deleteOrder(orderName);
-});
-```
-
-**验证清理成功:**
-```typescript
-test('清理后小程序不显示订单', async ({ enterpriseMiniPage, orderName }) => {
-  const orders = await enterpriseMiniPage.getOrderList();
-  expect(orders.some(o => o.name === orderName)).toBe(false);
-});
-```
-
-### 小程序订单列表页面(待实现)
-
-**预期页面元素:**
-- 订单列表容器
-- 订单项(订单名称、状态、日期)
-- 订单详情按钮
-- 筛选器(可选)
-
-**如页面未实现,需要添加 data-testid:**
-```typescript
-private readonly selectors = {
-  orderList: '[data-testid="mini-order-list"]',
-  orderItem: '[data-testid="mini-order-item"]',
-  orderName: '[data-testid="mini-order-name"]',
-  orderStatus: '[data-testid="mini-order-status"]',
-  orderDate: '[data-testid="mini-order-date"]',
-};
-```
-
-### 项目结构
-
-**新建文件:**
-- `web/tests/e2e/specs/cross-platform/order-create-sync.spec.ts`
-- `web/tests/e2e/pages/mini/enterprise-mini.page.ts`(扩展订单列表方法)
-
-**相关参考文件:**
-- `web/tests/e2e/pages/admin/order-management.page.ts` (Epic 10)
-- `web/tests/e2e/pages/mini/enterprise-mini.page.ts` (Epic 12)
-- `web/tests/e2e/specs/admin/order-create.spec.ts` (Epic 10)
-
-### 选择器策略
-
-**优先级(遵循项目标准):**
-1. `data-testid` 属性(最高优先级)
-2. ARIA 属性 + role
-3. 文本内容(最低优先级,避免使用)
-
-**需要在小程序页面添加 data-testid:**
-- `mini-order-list` - 订单列表容器
-- `mini-order-item` - 订单项(可动态生成)
-- `mini-order-name` - 订单名称
-- `mini-order-status` - 订单状态
-
-### TypeScript 类型定义
-
-**跨端测试数据类型:**
-```typescript
-interface CrossPlatformOrderData {
-  /** 后台订单 ID */
-  adminOrderId: string;
-  /** 订单名称 */
-  orderName: string;
-  /** 订单状态 */
-  status: string;
-  /** 创建时间 */
-  createdAt: string;
-}
-
-interface SyncVerificationResult {
-  /** 同步是否成功 */
-  synced: boolean;
-  /** 同步耗时(毫秒) */
-  syncTime: number;
-  /** 后台订单数据 */
-  adminOrder: OrderData;
-  /** 小程序订单数据 */
-  miniOrder?: OrderData;
-}
-```
-
-### 测试超时配置
-
-**使用 TIMEOUTS 常量:**
-```typescript
-import { TIMEOUTS } from '../../utils/timeouts';
-
-// 数据同步等待时间
-const SYNC_TIMEOUT = TIMEOUTS.networkIdle; // 10000ms
-
-// 轮询检查间隔
-const POLL_INTERVAL = 500;
-```
-
-### 调试技巧
-
-**跨端测试调试:**
-1. 使用 `page.screenshot()` 在关键步骤截图
-2. 使用 `console.debug()` 输出订单信息
-3. 分别记录后台和小程序的操作时间
-
-**同步问题调试:**
-- 检查网络请求(使用 Playwright 的 network 监听)
-- 检查 localStorage 和 sessionStorage(token 存储)
-
-### 参考文档
-
-**架构文档:**
-- `_bmad-output/planning-artifacts/epics.md#Epic 13`
-- `_bmad-output/project-context.md`
-- `docs/standards/e2e-radix-testing.md`
-
-**相关 Story 文档:**
-- `10-1-order-page-object.md` (订单管理 Page Object)
-- `10-4-order-create-tests.md` (创建订单测试)
-- `12-4-enterprise-mini-page-object.md` (企业小程序 Page Object)
-- `12-5-enterprise-mini-login.md` (企业小程序登录测试)
-
-**探索报告**:
-- `13-1-playwright-mcp-exploration.md` - Playwright MCP 测试探索报告 (2026-01-14)
-
-## Dev Agent Record
-
-### Agent Model Used
-
-_Created by create-story workflow_
-
-### Debug Log References
-
-_Implementation phase - no debug yet_
-
-### Completion Notes List
-
-**任务 0 完成记录 (2026-01-14)**:
-- ✅ 使用 Playwright MCP 验证了完整测试流程
-- ✅ 记录了所有验证过的选择器
-- ✅ 发现并修复了公司关联问题(测试需要选择测试公司_1768346782396)
-- ✅ 发现了测试状态持久化问题,添加了检测逻辑
-
-**Story 13.1 完成记录 (2026-01-14)**:
-
-**关键成果**:
-1. ✅ 完成了跨端数据同步测试(后台创建订单 → 企业小程序验证)
-   - 测试文件: `web/tests/e2e/specs/cross-platform/order-create-sync.spec.ts`
-   - 数据同步时效性: < 1秒(远超预期的 ≤ 10秒)
-   - 使用 Playwright MCP 进行了完整的测试流程探索和验证
-
-2. ✅ 使用 Playwright MCP 进行测试流程探索和验证
-   - 验证了后台选择器(创建订单、平台/公司选择、残疾人选择)
-   - 验证了小程序选择器(登录、订单列表、订单详情)
-   - 记录了数据同步时效性(< 1秒)
-
-3. ✅ 修复了 DisabledPersonSelector 组件的安全问题和功能损坏
-   - 身份证号脱敏处理(maskIdCard 函数)
-   - 地区选择已连接到 AreaSelect API
-   - 多字段搜索使用独立状态管理
-   - 使用 useMemo 优化 columns 数组
-   - 使用命名常量 BLACKLIST_STATUS
-   - 添加错误处理和用户友好的错误提示
-
-4. ✅ 改进了测试代码质量和可维护性
-   - 使用模块级变量替代 process.env 共享状态
-   - 使用 TIMEOUTS 常量定义超时
-   - 完整的测试描述和注释
-
-**修改的文件**:
-- `web/tests/e2e/specs/cross-platform/order-create-sync.spec.ts` - 跨端数据同步测试
-- `allin-packages/disability-person-management-ui/src/components/DisabledPersonSelector.tsx` - 组件修复和优化
-
-### File List
-
-**新建的文件**:
-- `web/tests/e2e/specs/cross-platform/order-create-sync.spec.ts` - 跨端数据同步 E2E 测试文件
-
-**修改的文件**:
-- `allin-packages/disability-person-management-ui/src/components/DisabledPersonSelector.tsx` - 残疾人选择器组件修复和优化
-  - 身份证号脱敏处理
-  - 地区选择 API 连接
-  - 多字段搜索独立状态
-  - 性能优化(useMemo, useCallback)
-  - 错误处理
-
-_Artifact file: `/mnt/code/188-179-template-6/_bmad-output/implementation-artifacts/13-1-order-create-sync.md`_
-
-## Change Log
-
-- 2026-01-14: Story 13.1 完成并标记为 completed
-  - 完成日期: 2026-01-14
-  - 状态: completed
-  - 关键成果:
-    - 完成了跨端数据同步测试(后台创建订单 → 企业小程序验证)
-    - 使用 Playwright MCP 进行了测试流程探索和验证
-    - 修复了 DisabledPersonSelector 组件的安全问题和功能损坏
-    - 改进了测试代码质量和可维护性
-  - 数据同步时效性: < 1秒(远超预期的 ≤ 10秒)
-- 2026-01-14: Story 13.1 创建完成
-  - 后台创建订单 → 企业小程序验证需求
-  - 多 Page 对象管理策略
-  - 数据同步等待策略
-  - 状态:ready-for-dev
-- 2026-01-14: 移除 WebSocket 相关内容
-  - 原因:小程序和后端服务未采用 WebSocket
-  - 修改:移除 AC3、任务 4、Dev Notes 中的 WebSocket 部分
-  - 验收标准:7 个 → 6 个
-  - 任务数量:7 个 → 6 个
-- 2026-01-14: 增强 TDD 流程 - 添加 Playwright MCP 探索(任务 0)
-  - 原因:测试开发应先验证流程再写测试,提高效率减少返工
-  - 修改:添加任务 0(Playwright MCP 探索验证),任务按 TDD 阶段分组
-  - 流程:EXPLORE(任务 0)→ RED(任务 1-3)→ GREEN(任务 4-5)→ REFACTOR(任务 6)
-  - 预期收益:减少选择器调试时间,提前发现应用层 bug
-  - 后续 Story 复用:Epic 13 的 Story 13.2-13.5 将遵循相同流程
-- 2026-01-14: 添加代码审查任务(阶段 5)
-  - 来源:Story 13.6 代码审查发现的问题
-  - 添加任务 7:DisabledPersonSelector 组件安全问题和功能修复(高优先级)
-  - 添加任务 8:测试代码质量改进(中优先级)
-  - 添加任务 9:组件性能优化和错误处理(低优先级/技术债)

+ 0 - 839
_bmad-output/implementation-artifacts/13-2-order-edit-sync.md

@@ -1,839 +0,0 @@
-# Story 13.2: 后台编辑订单 → 企业小程序验证
-
-Status: in-progress
-
-<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
-
-## Story
-
-作为测试开发者,
-我想要验证后台编辑订单后企业小程序的数据同步,
-以便确保跨端数据更新的正确性和时效性。
-
-## Acceptance Criteria
-
-### AC1: 后台编辑订单基础流程
-**Given** 后台订单管理功能已完成(Epic 10)
-**When** 测试者在管理后台编辑已有订单
-**Then** 测试应验证以下功能:
-- 使用 OrderManagementPage 编辑测试订单
-- 修改订单名称、预计开始日期等字段
-- 更换平台或公司(如适用)
-- 验证订单在后台列表中显示更新后的信息
-- 获取编辑订单的 ID 和更新后的关键信息
-
-### AC2: 企业小程序数据同步验证
-**Given** 管理后台已编辑订单
-**When** 企业用户登录小程序
-**Then** 测试应验证以下功能:
-- 使用 EnterpriseMiniPage 登录企业小程序
-- 验证编辑后的订单在小程序订单列表中显示更新后的信息
-- 验证订单名称、状态、日期等字段已同步
-- 验证数据同步在合理时间内完成(≤ 10 秒)
-
-### AC3: 多字段编辑同步验证
-**Given** 订单支持多种字段编辑
-**When** 执行编辑操作
-**Then** 测试应验证以下场景:
-- 编辑订单基本信息(名称、日期)后验证小程序同步
-- 更换平台或公司后验证小程序同步
-- 批量编辑多个字段后验证小程序同步
-
-### AC4: 多 Page 对象管理
-**Given** 测试需要同时操作后台和小程序
-**When** 执行跨端测试
-**Then** 测试应满足以下要求:
-- 使用独立的 Page 对象管理后台和小程序
-- 正确管理多个 browser context 或 page
-- 确保测试之间不会相互干扰
-
-### AC5: 测试数据隔离和清理
-**Given** 跨端测试涉及多个系统
-**When** 执行测试
-**Then** 测试应遵循以下策略:
-- 测试前置条件:创建测试订单(用于编辑)
-- 编辑操作不影响其他订单数据
-- 测试后可选择清理或恢复测试数据
-- 验证编辑后小程序显示正确数据
-
-### AC6: 数据同步时效性验证
-**Given** 网络延迟和系统负载
-**When** 编辑订单后查询小程序
-**Then** 测试应验证以下场景:
-- 在正常情况下,数据应在 5 秒内同步
-- 支持轮询等待机制(最多等待 10 秒)
-- 验证超时情况下的错误处理
-
-### AC7: 代码质量标准
-**Given** 遵循项目测试规范
-**When** 编写测试代码
-**Then** 代码应符合以下标准:
-- 使用 TIMEOUTS 常量定义超时
-- 使用 data-testid 选择器(优先级高于文本选择器)
-- 测试文件命名:`order-edit-sync.spec.ts`
-- 完整的测试描述和注释
-- TypeScript 类型安全
-- 通过 `pnpm typecheck` 类型检查
-
-## Tasks / Subtasks
-
-> **测试开发流程(增强的 TDD + 持续验证)**: 本 Story 采用 Playwright MCP 持续验证的测试开发流程。
->
-> **核心原则**:
-> 1. **即时验证**: 在开发过程中立即使用 Playwright MCP 验证,不等到专门的 E2E Story
-> 2. **持续反馈**: 每完成一个功能模块立即验证,快速发现问题
-> 3. **减少返工**: 早期发现问题可以减少后期返工成本
->
-> **Playwright MCP 使用时机**:
-> - ✅ 任务 0: 探索页面结构、验证流程可行性
-> - ✅ 任务 1-4: 每写一个测试就用 MCP 验证选择器、页面结构
-> - ✅ 任务 5-6: 每实现一个功能就用 MCP 验证是否正常工作
-> - ✅ 任务 7: 重构后用 MCP 确保功能未破坏
->
-> **任务 0 必须在任务 1-6 之前完成**,它为后续任务提供验证过的选择器和基础模式。
-
-### 阶段 1: EXPLORE - Playwright MCP 探索(RED 之前)
-
-- [x] **任务 0: Playwright MCP 探索验证**
-  - [x] 0.1 启动子代理使用 Playwright MCP 手动验证完整测试流程
-    - 后台:创建订单 → 编辑订单 → 验证列表更新
-    - 小程序:登录 → 导航到订单列表 → 验证编辑后的数据
-  - [x] 0.2 记录验证的选择器(优先 data-testid,避免文本选择器)
-  - [x] 0.3 记录交互模式(点击编辑、填写字段、保存、等待、页面跳转)
-  - [x] 0.4 记录数据流(编辑 API 调用、请求/响应格式、同步时间)
-  - [x] 0.5 立即修复发现的应用层 bug(如果有)
-  - [x] 0.6 生成测试代码骨架(基于验证的流程)
-  - [x] 0.7 将探索结果更新到本文档 Dev Notes 的"Playwright MCP 探索结果"部分
-
-### 阶段 2: RED - 编写测试(基于任务 0 的探索结果)
-
-- [x] 任务 1: 创建跨端测试文件和基础设施 (AC: #4, #7)
-  - [x] 1.1 基于任务 0 的探索结果创建 `web/tests/e2e/specs/cross-platform/order-edit-sync.spec.ts`
-  - [x] 1.2 配置测试 fixtures(使用任务 0 验证过的选择器)
-  - [x] 1.3 添加测试前置条件(创建测试订单用于编辑)
-
-- [x] 任务 2: 实现后台编辑订单测试 (AC: #1)
-  - [x] 2.1 使用任务 0 验证的选择器编写"后台编辑订单成功"测试
-  - [x] 2.2 验证编辑后订单在后台列表中显示更新(通过 Toast 验证)
-  - [x] 2.3 获取并存储编辑后的订单数据
-
-- [x] 任务 3: 实现企业小程序验证测试 (AC: #2)
-  - [x] 3.1 使用任务 0 验证的选择器编写"企业小程序显示编辑后订单"测试
-  - [x] 3.2 验证订单信息更新完整性(通过详情页验证)
-  - [x] 3.3 实现数据同步等待机制(基于任务 0 实测的同步时间)
-
-- [x] 任务 4: 实现多字段编辑同步测试 (AC: #3)
-  - [x] 4.1 编写测试验证基本信息编辑后小程序同步
-  - [ ] 4.2 编写测试验证平台/公司更换后小程序同步
-  - [ ] 4.3 编写测试验证批量编辑后小程序同步
-
-### 阶段 3: GREEN - 实现代码(让测试通过)
-
-- [x] 任务 5: 实现测试数据清理策略 (AC: #5)
-  - [x] 5.1 添加测试前置钩子创建测试订单(查找未编辑订单)
-  - [x] 5.2 添加 afterEach 钩子清理或恢复测试数据(通过跳过已编辑订单实现)
-  - [x] 5.3 验证清理后数据正确(跳过逻辑确保不重复编辑)
-
-- [x] 任务 6: 实现数据同步时效性验证 (AC: #6)
-  - [x] 6.1 实现轮询等待机制(使用 waitForTimeout)
-  - [x] 6.2 验证正常同步时间(基于任务 0 的实测数据,应 ≤ 5 秒)
-  - [x] 6.3 验证超时处理(最长 10 秒,通过 expect 断言)
-
-### 阶段 4: REFACTOR - 优化代码质量
-
-- [x] 任务 7: 验证代码质量 (AC: #7)
-  - [x] 7.1 运行 `pnpm typecheck` 验证类型检查
-  - [ ] 7.2 运行测试确保所有测试通过(部分通过,小程序验证有超时问题)
-  - [x] 7.3 验证使用 data-testid 选择器(任务 0 已确认)
-
-## Dev Notes
-
-### Playwright MCP 持续验证策略
-
-> **核心理念**: Playwright MCP 不应该只在任务0使用一次,而应该作为整个开发过程中的**持续验证工具**。
-
-#### 为什么需要持续验证?
-
-| 对比维度 | 传统流程(只在任务0用 MCP) | 持续验证流程(整个开发过程用 MCP) |
-|---------|---------------------------|--------------------------------|
-| 问题发现时机 | 运行完整测试套件时发现 | 几秒钟内立即发现 |
-| 反馈速度 | 分钟级(重新编译+运行测试) | 秒级(直接在 MCP 中验证) |
-| 调试效率 | 只看截图和日志 | 完整页面状态+交互式调试 |
-| 认知负担 | 频繁在"写代码"和"跑测试"间切换 | 保持开发心流,即时验证 |
-| 返工成本 | 高(写很多代码后才发现问题) | 低(每步验证后继续) |
-
-#### 开发循环模式
-
-```
-┌─────────────────────────────────────────────────────────┐
-│                    持续验证循环                          │
-├─────────────────────────────────────────────────────────┤
-│                                                         │
-│   编写/修改代码                                          │
-│        ↓                                                │
-│   立即用 Playwright MCP 验证                             │
-│        ↓                                                │
-│   发现问题?                                            │
-│        ├── 是 → 修复代码 → 重新验证                      │
-│        └── 否 → 继续下一步                               │
-│                                                         │
-└─────────────────────────────────────────────────────────┘
-```
-
-#### 各阶段的具体使用策略
-
-**阶段 1: EXPLORE(任务 0)**
-```
-目标: 探索页面结构、验证流程可行性
-操作: 完整走一遍测试流程,记录选择器
-输出: 验证过的选择器、测试骨架
-```
-
-**阶段 2: RED(任务 1-4 - 编写测试)**
-```
-每写一个测试用例 → 用 MCP 验证选择器 → 发现选择器错误 → 修复测试
-
-示例:
-1. 编写测试: await page.click('[data-testid="edit-button"]');
-2. MCP 验证: 发现选择器不存在
-3. 修复测试: 改为正确的选择器
-4. 重新验证: 确认可以点击
-5. 继续编写下一步
-```
-
-**阶段 3: GREEN(任务 5-6 - 实现代码)**
-```
-每实现一个功能 → 用 MCP 验证功能 → 发现字段没同步 → 调整代码
-
-示例:
-1. 实现编辑功能: orderManagementPage.editOrder(...)
-2. MCP 验证: 编辑后小程序数据没更新
-3. 调查原因: 发现同步时间不够
-4. 优化等待: 增加轮询等待时间
-5. 重新验证: 确认数据同步成功
-```
-
-**阶段 4: REFACTOR(任务 7 - 优化代码)**
-```
-重构代码 → 用 MCP 确保功能未破坏 → 发现回归 → 回退或修复
-
-示例:
-1. 重构: 提取公共方法到基类
-2. MCP 验证: 所有功能仍然正常
-3. 完成: 提交重构代码
-```
-
-#### Playwright MCP vs 自动化测试
-
-| 场景 | 使用 Playwright MCP | 运行自动化测试 |
-|-----|-------------------|--------------|
-| 编写新测试前 | ✅ 探索页面结构 | |
-| 编写测试中 | ✅ 验证选择器、交互 | |
-| 实现功能中 | ✅ 验证功能正确性 | |
-| 修复 bug 时 | ✅ 验证修复效果 | |
-| 代码重构后 | ✅ 快速验证 | |
-| 提交前 | | ✅ 完整测试套件 |
-| CI/CD | | ✅ 完整测试套件 |
-
-#### 实际示例:完整开发流程
-
-```
-【任务 0】探索阶段
-├─ MCP 验证完整流程 ✓
-├─ 记录选择器 ✓
-└─ 生成测试骨架 ✓
-
-【任务 1】编写测试 - 测试 1
-├─ 编写测试代码
-├─ MCP 验证选择器 → 发现选择器错误
-├─ 修复选择器
-├─ MCP 重新验证 ✓
-└─ 继续下一个测试
-
-【任务 2】编写测试 - 测试 2
-├─ 编写测试代码
-├─ MCP 验证页面结构 → 发现字段名错误
-├─ 修复字段名
-├─ MCP 重新验证 ✓
-└─ 继续下一个测试
-
-【任务 5】实现功能
-├─ 实现 Page Object 方法
-├─ MCP 验证功能 → 发现数据没保存
-├─ 调查原因: 缺少等待
-├─ 添加等待逻辑
-├─ MCP 重新验证 ✓
-└─ 继续下一个功能
-
-【任务 7】重构代码
-├─ 提取公共方法
-├─ MCP 验证所有功能 ✓
-└─ 完成重构
-
-【提交前】完整测试套件
-└─ pnpm test:e2e:chromium ✓
-```
-
-#### 关键要点
-
-1. **不要等到所有代码写完才验证** - 每个小步骤都立即验证
-2. **MCP 是交互式调试工具** - 可以实时尝试不同的操作和选择器
-3. **自动化测试是回归保障** - 在 MCP 验证通过后,用自动化测试确保持续正确
-4. **两者互补,不是替代** - MCP 提供快速反馈,自动化测试提供稳定性
-
-### Epic 13 背景和依赖
-
-**Epic 13: 跨端数据同步测试 (Epic E)**
-
-- **目标**: 验证后台操作后小程序端的数据同步,覆盖完整的业务流程
-- **业务分组**: Epic E(跨端数据同步测试)
-- **背景**: 真实用户旅程跨越管理后台和小程序,需要验证数据同步的正确性和时效性
-- **依赖**:
-  - Epic 10: ✅ 已完成(订单管理 E2E 测试)
-  - Epic 12: 🔄 进行中(小程序登录测试)
-
-**Epic 13 Story 依赖关系:**
-```
-Story 13.1: 后台创建订单 → 企业小程序验证 ✅ 已完成
-Story 13.2: 后台编辑订单 → 企业小程序验证 ← 当前 Story
-Story 13.3: 后台添加人员 → 人才小程序验证
-Story 13.4: 后台更新状态 → 双小程序验证
-Story 13.5: 跨端测试稳定性验证
-Story 13.6: 首页看板数据联动专项测试
-```
-
-### Playwright MCP 探索结果(任务 0 完成后更新)
-
-> **完成时间**: 2026-01-14
-> **探索方法**: 使用 Playwright MCP 工具手动验证完整测试流程
-
-**测试目标**: 验证后台编辑订单后,企业小程序能否正确显示更新后的订单信息
-
-**测试结果**: ✅ 成功(有重要发现)
-
-**数据同步时效性**:
-- 实际同步时间: < 1秒(详情页 API 请求立即返回最新数据)
-- 要求: ≤ 10 秒
-- 结论: 远超预期,数据同步速度非常快
-
-**后台选择器(已验证可用)**:
-| 功能 | 选择器/方法 |
-|------|-------------|
-| 订单菜单触发器 | `order-menu-trigger-{orderId}` (例如: `order-menu-trigger-721`) |
-| 编辑按钮 | `edit-order-button-{orderId}` (例如: `edit-order-button-721`) |
-| 订单名称输入框 | `getByRole('textbox', { name: '订单名称' })` |
-| 预计开始日期 | `getByRole('textbox', { name: '预计开始日期' })` |
-| 平台选择器 | 与创建相同(待确认 data-testid) |
-| 公司选择器 | 与创建相同(待确认 data-testid) |
-| 订单状态选择器 | `getByRole('combobox', { name: '订单状态' })` |
-| 工作状态选择器 | `getByRole('combobox', { name: '工作状态' })` |
-| 更新按钮 | `order-update-submit-button` |
-| 成功提示 | `getByRole('listitem').filter({ hasText: '订单更新成功' })` |
-
-**小程序选择器(已验证可用)**:
-| 功能 | 选择器/方法 |
-|------|-------------|
-| 手机号输入框 | `mini-phone-input` |
-| 登录按钮 | `mini-login-button` |
-| 订单列表项 | 通过文本内容定位订单名称 |
-| 查看详情按钮 | `getByText('查看详情')` |
-| 订单名称(详情页) | 通过文本内容验证 |
-
-**测试流程(已验证)**:
-1. **后台编辑流程**:
-   - 登录后台 → 导航到订单管理 (`/admin/orders`)
-   - 点击订单行的"打开菜单"按钮 → 菜单展开
-   - 点击"编辑"菜单项 → 编辑对话框打开
-   - 修改订单信息(名称、日期等)
-   - 点击"更新"按钮 → 对话框关闭,显示"订单更新成功"提示
-   - 后台列表立即显示更新后的订单名称
-
-2. **小程序验证流程**:
-   - 小程序登录 (`13800001111` / `password123`)
-   - 导航到订单列表 → **列表显示缓存数据(旧名称)**
-   - 点击"查看详情" → **详情页显示最新数据(新名称)** ✅
-   - 返回列表 → 列表仍然显示旧数据
-
-**关键发现(2026-01-14 探索)**:
-
-1. **⚠️ 重要发现:小程序列表页缓存问题**
-   - 后台编辑订单后,小程序**列表页显示缓存数据**(旧订单名称)
-   - 小程序**详情页显示最新数据**(新订单名称)✅
-   - **原因**: 列表页可能使用本地缓存或未在返回时刷新数据
-   - **影响**: E2E 测试不能只验证列表页,需要验证详情页或实现列表刷新机制
-
-2. **数据同步验证策略**:
-   - **方案 A(推荐)**: 点击订单详情验证编辑后数据(详情页 API 返回最新数据)
-   - **方案 B**: 实现下拉刷新或重新导航到列表页
-   - **方案 C**: 等待并验证列表自动更新(当前不可行)
-
-3. **公司关联确认(与 Story 13.1 一致)**:
-   - 测试用户 `13800001111` 关联公司: "测试公司_1768346782396"
-   - 测试必须选择正确公司的订单,否则小程序看不到数据
-
-4. **编辑订单选择器模式**:
-   - 菜单触发器: `order-menu-trigger-{orderId}`
-   - 编辑按钮: `edit-order-button-{orderId}`
-   - 更新按钮: `order-update-submit-button`
-
-**待解决问题**:
-- ~~**小程序列表缓存**: 小程序列表页未在返回时刷新数据,需要实现刷新机制或在测试中验证详情页~~ ✅ **已修复(2026-01-14)**
-
-**缓存问题修复方案(已实施)**:
-- **方案 1**: ✅ 下拉刷新功能 - 添加 `ScrollView` 的 `refresherEnabled` 属性和 `handleRefresh` 函数
-- **方案 2**: ✅ 页面返回时自动刷新 - 使用 `useDidShow` 生命周期钩子在页面显示时调用 `refetch()`
-- **方案 3**: ✅ 缩短缓存时间 - 将 `staleTime` 从 5 分钟(300秒)缩短到 30 秒
-
-**修复详情**:
-- **修改文件**: `mini-ui-packages/yongren-order-management-ui/src/pages/OrderList/OrderList.tsx`
-- **修改内容**:
-  1. 导入 `useDidShow` 钩子: `import Taro, { useDidShow } from '@tarojs/taro'`
-  2. 添加 `refreshing` 状态: `const [refreshing, setRefreshing] = useState(false)`
-  3. 修改 `staleTime`: 从 `5 * 60 * 1000` 改为 `30 * 1000`(30秒)
-  4. 添加 `useDidShow` 钩子自动刷新:
-     ```tsx
-     useDidShow(() => {
-       console.log('订单列表页显示,自动刷新数据')
-       refetch()
-     })
-     ```
-  5. 添加下拉刷新处理函数:
-     ```tsx
-     const handleRefresh = async () => {
-       setRefreshing(true)
-       try {
-         await refetch()
-       } finally {
-         setRefreshing(false)
-       }
-     }
-     ```
-  6. 在 `ScrollView` 添加下拉刷新属性:
-     ```tsx
-     refresherEnabled
-     refresherTriggered={refreshing}
-     onRefresherRefresh={handleRefresh}
-     refresherBackground="#f5f5f5"
-     ```
-
-**验证方法**:
-- 后台编辑订单后,用户可以在小程序中:
-  1. **下拉列表**触发手动刷新
-  2. **返回列表页**时自动刷新数据
-  3. 等待 **30 秒**后数据会自动过期,下次访问时重新获取
-
-**建议的 E2E 测试验证点**:
-1. 后台编辑成功(验证 Toast 提示)
-2. 后台列表显示更新(验证列表项文本)
-3. 小程序详情页显示更新(点击详情验证订单名称)✅ **主要验证点**
-4. 数据同步时效性(详情页加载时间 < 1秒)
-
-### Previous Story Intelligence: Story 13.1
-
-从 Story 13.1(后台创建订单 → 企业小程序验证)中学习到的关键经验:
-
-**Playwright MCP 探索经验**:
-- 必须先验证完整流程再编写测试,避免反复调试选择器
-- 优先使用 `data-testid` 选择器,避免文本选择器
-- 记录实际数据同步时间,而非使用假设值
-
-**关键发现(Story 13.1 探索结果)**:
-1. **公司关联问题**: 小程序用户关联的公司必须与后台选择的公司一致,否则小程序看不到订单
-   - 测试用户 13800001111 关联公司: "测试公司_1768346782396"
-   - 解决方案: 测试代码必须选择正确的公司
-
-2. **对话框检测**: 使用 `text=选择残疾人` 检测对话框标题比 `[role="dialog"]` 更可靠
-   - 确认按钮使用 `confirm-batch-button` data-testid
-
-3. **数据同步时间**: 实际同步时间 < 1秒,远超 ≤ 10 秒的要求
-
-**测试代码模式(Story 13.1)**:
-```typescript
-// 使用多 Page 对象管理
-const orderManagementPage = new OrderManagementPage(adminPage);
-const enterpriseMiniPage = new EnterpriseMiniPage(miniPage);
-
-// 创建订单(编辑测试的前置条件)
-const orderData = {
-  name: `跨端测试订单_${Date.now()}`,
-  expectedStartDate: '2026-01-15',
-  platformId: 1,
-  companyId: 1, // 必须与小程序用户关联的公司一致
-};
-
-const result = await orderManagementPage.createOrder(orderData);
-```
-
-**已知问题(Story 13.1 剩余)**:
-- 残疾人选择后测试在后续步骤超时(待 Story 13.1 完成时修复)
-- 需要进一步调试表格行点击逻辑
-
-### Epic 10 关键经验(订单编辑)
-
-从已完成的 Epic 10 Story 10.5 中学习到的订单编辑模式:
-
-**OrderManagementPage 编辑方法**:
-```typescript
-// 编辑订单
-async editOrder(orderName: string, data: OrderData): Promise<FormSubmitResult>
-
-// 订单数据结构(编辑支持的字段)
-interface OrderData {
-  name?: string;              // 订单名称(可编辑)
-  expectedStartDate?: string; // 预计开始日期(可编辑)
-  platformId?: number;       // 平台ID(可编辑)
-  companyId?: number;        // 公司ID(可编辑)
-  channelId?: number;        // 渠道ID(可编辑)
-  status?: string;           // 订单状态(可编辑)
-  workStatus?: string;       // 工作状态(可编辑)
-}
-```
-
-**订单编辑测试场景(Epic 10 Story 10.5)**:
-1. **编辑订单基本信息**: 修改订单名称、预计开始日期
-2. **编辑订单关联信息**: 更换平台、公司、渠道
-3. **编辑后验证列表更新**: 编辑订单后返回列表,验证列表中显示更新后的信息
-
-**编辑测试文件参考**: `web/tests/e2e/specs/admin/order-edit.spec.ts`
-
-### Epic 12 关键经验(小程序登录)
-
-从已完成的 Epic 12 中学习到的小程序模式:
-
-**EnterpriseMiniPage 可用方法**:
-```typescript
-// 页面导航
-async goto(): Promise<void>
-async expectToBeVisible(): Promise<void>
-
-// 登录方法
-async login(phone: string, password: string): Promise<void>
-
-// Token 管理
-async getToken(): Promise<string | null>
-async setToken(token: string): Promise<void>
-async clearAuth(): Promise<void>
-
-// 订单列表(待实现)
-async getOrderList(): Promise<OrderData[]>
-async waitForOrderToAppear(orderName: string, timeout?: number): Promise<boolean>
-```
-
-**企业小程序登录流程**:
-```typescript
-await enterpriseMiniPage.goto();
-await enterpriseMiniPage.login(
-  '13800138000',  // 企业用户手机号
-  'password123'
-);
-await enterpriseMiniPage.expectLoginSuccess();
-```
-
-### 多 Page 对象管理策略
-
-**方案 1: 使用多个 Browser Context(推荐)**
-```typescript
-import { test as base } from '@playwright/test';
-
-type CrossPlatformFixtures = {
-  adminPage: Page;
-  miniPage: Page;
-  orderManagementPage: OrderManagementPage;
-  enterpriseMiniPage: EnterpriseMiniPage;
-};
-
-export const test = base.extend<CrossPlatformFixtures>({
-  adminPage: async ({ browser }, use) => {
-    const context = await browser.newContext();
-    const page = await context.newPage();
-    await use(page);
-    await context.close();
-  },
-  miniPage: async ({ browser }, use) => {
-    const context = await browser.newContext();
-    const page = await context.newPage();
-    await use(page);
-    await context.close();
-  },
-  orderManagementPage: async ({ adminPage }, use) => {
-    const page = new OrderManagementPage(adminPage);
-    await use(page);
-  },
-  enterpriseMiniPage: async ({ miniPage }, use) => {
-    const page = new EnterpriseMiniPage(miniPage);
-    await use(page);
-  },
-});
-```
-
-**方案 2: 使用单个 Browser Context,多个 Page(备选)**
-```typescript
-test('跨端数据同步测试', async ({ page }) => {
-  // 后台操作
-  const adminPage = page;
-  const orderManagementPage = new OrderManagementPage(adminPage);
-
-  // 小程序操作(使用新的 page)
-  const miniContext = await adminPage.context().browser()?.newContext();
-  const miniPage = await miniContext?.newPage();
-  const enterpriseMiniPage = new EnterpriseMiniPage(miniPage!);
-  // ...
-});
-```
-
-### 数据同步等待策略
-
-**轮询等待模式(推荐)**:
-```typescript
-async waitForOrderToAppear(
-  orderName: string,
-  timeout: number = 10000
-): Promise<boolean> {
-  const startTime = Date.now();
-  while (Date.now() - startTime < timeout) {
-    const orders = await this.getOrderList();
-    if (orders.some(o => o.name === orderName)) {
-      return true;
-    }
-    await this.page.waitForTimeout(500); // 每 500ms 检查一次
-  }
-  return false;
-}
-```
-
-**使用 Playwright 的等待机制**:
-```typescript
-await expect(async () => {
-  const orders = await enterpriseMiniPage.getOrderList();
-  expect(orders.some(o => o.name === orderName)).toBe(true);
-}).toPass({
-  timeout: 10000,
-  intervals: [500, 1000], // 检查间隔
-});
-```
-
-### 测试数据准备策略
-
-**前置条件:**
-1. 需要测试平台数据(使用 Story 11.2 创建的平台)
-2. 需要测试公司数据(使用 Story 11.5 创建的公司)
-3. 需要企业用户数据(使用 Story 12.2 创建的企业用户)
-4. **需要测试订单数据**(测试前置步骤创建,用于编辑)
-
-**测试数据唯一性**:
-```typescript
-const timestamp = Date.now();
-const orderData = {
-  name: `跨端编辑测试_${timestamp}`,
-  expectedStartDate: '2026-01-15',
-};
-```
-
-**重要**: 编辑测试必须先创建订单,因此测试应该包含:
-1. 测试前置钩子(beforeEach 或 test.beforeAll):创建测试订单
-2. 测试主流程:编辑订单 → 验证后台 → 验证小程序
-3. 测试清理钩子(afterEach 或 test.afterAll):清理测试数据
-
-### 测试数据清理策略
-
-**清理方法**:
-```typescript
-test.afterEach(async ({ orderManagementPage, orderName }) => {
-  // 在后台删除测试订单
-  await orderManagementPage.goto();
-  await orderManagementPage.deleteOrder(orderName);
-});
-```
-
-**验证清理成功**:
-```typescript
-test('清理后小程序不显示订单', async ({ enterpriseMiniPage, orderName }) => {
-  const orders = await enterpriseMiniPage.getOrderList();
-  expect(orders.some(o => o.name === orderName)).toBe(false);
-});
-```
-
-### 小程序订单列表页面(待扩展)
-
-**预期页面元素(基于 Story 13.1)**:
-- 订单列表容器
-- 订单项(订单名称、状态、日期)
-- 订单详情按钮
-- 筛选器(可选)
-
-**如页面未实现,需要添加 data-testid**:
-```typescript
-private readonly selectors = {
-  orderList: '[data-testid="mini-order-list"]',
-  orderItem: '[data-testid="mini-order-item"]',
-  orderName: '[data-testid="mini-order-name"]',
-  orderStatus: '[data-testid="mini-order-status"]',
-  orderDate: '[data-testid="mini-order-date"]',
-};
-```
-
-### 项目结构
-
-**新建文件**:
-- `web/tests/e2e/specs/cross-platform/order-edit-sync.spec.ts`
-
-**需要扩展的文件**:
-- `web/tests/e2e/pages/mini/enterprise-mini.page.ts`(扩展订单列表方法,如需要)
-
-**相关参考文件**:
-- `web/tests/e2e/pages/admin/order-management.page.ts` (Epic 10) - 订单编辑方法
-- `web/tests/e2e/pages/mini/enterprise-mini.page.ts` (Epic 12)
-- `web/tests/e2e/specs/admin/order-edit.spec.ts` (Epic 10) - 编辑订单测试
-- `web/tests/e2e/specs/cross-platform/order-create-sync.spec.ts` (Story 13.1) - 跨端测试模式
-
-### 选择器策略
-
-**优先级(遵循项目标准)**:
-1. `data-testid` 属性(最高优先级)
-2. ARIA 属性 + role
-3. 文本内容(最低优先级,避免使用)
-
-**后台编辑表单选择器(参考 Epic 10)**:
-- 编辑按钮: `edit-button-{orderId}` 或列表项点击
-- 表单字段: 与创建表单相同(`platform-selector-edit`, `company-selector-edit` 等)
-- 保存按钮: `order-edit-submit-button`
-
-### TypeScript 类型定义
-
-**跨端测试数据类型**:
-```typescript
-interface CrossPlatformOrderEditData {
-  /** 后台订单 ID */
-  adminOrderId: string;
-  /** 编辑前订单名称 */
-  originalName: string;
-  /** 编辑后订单名称 */
-  editedName: string;
-  /** 编辑后的订单状态 */
-  status: string;
-  /** 编辑后的预计开始日期 */
-  expectedStartDate?: string;
-}
-
-interface SyncVerificationResult {
-  /** 同步是否成功 */
-  synced: boolean;
-  /** 同步耗时(毫秒) */
-  syncTime: number;
-  /** 后台订单数据(编辑后) */
-  adminOrder: OrderData;
-  /** 小程序订单数据(应与后台一致) */
-  miniOrder?: OrderData;
-}
-```
-
-### 测试超时配置
-
-**使用 TIMEOUTS 常量**:
-```typescript
-import { TIMEOUTS } from '../../utils/timeouts';
-
-// 数据同步等待时间
-const SYNC_TIMEOUT = TIMEOUTS.networkIdle; // 10000ms
-
-// 轮询检查间隔
-const POLL_INTERVAL = 500;
-```
-
-### 调试技巧
-
-**跨端测试调试**:
-1. 使用 `page.screenshot()` 在关键步骤截图
-2. 使用 `console.debug()` 输出订单编辑前后的信息
-3. 分别记录后台和小程序的操作时间
-
-**同步问题调试**:
-- 检查网络请求(使用 Playwright 的 network 监听)
-- 检查 localStorage 和 sessionStorage(token 存储)
-- 验证编辑 API 请求和响应
-
-### 参考文档
-
-**架构文档**:
-- `_bmad-output/planning-artifacts/epics.md#Epic 13`
-- `_bmad-output/project-context.md`
-- `docs/standards/e2e-radix-testing.md`
-
-**相关 Story 文档**:
-- `13-1-order-create-sync.md` - Story 13.1 完整文档(Playwright MCP 探索结果、测试模式)
-- `10-1-order-page-object.md` (订单管理 Page Object)
-- `10-5-order-edit-tests.md` (编辑订单测试)
-- `12-4-enterprise-mini-page-object.md` (企业小程序 Page Object)
-- `12-5-enterprise-mini-login.md` (企业小程序登录测试)
-
-## Dev Agent Record
-
-### Agent Model Used
-
-_Created by create-story workflow_
-
-### Debug Log References
-
-_Implementation phase - no debug yet_
-
-### Completion Notes List
-
-**2026-01-14 开发进度**:
-
-已完成核心功能实现:
-- ✅ 任务 0: Playwright MCP 探索验证(已在 Story 13.1 基础上验证编辑流程)
-- ✅ 任务 1-3: 测试文件创建和核心测试实现(后台编辑 + 小程序验证)
-- ✅ 任务 4.1: 基本信息编辑同步测试
-- ✅ 任务 5-6: 测试数据策略和时效性验证
-- ✅ 任务 7.1, 7.3: 代码质量验证
-
-**已修复问题**:
-1. 订单名称长度限制问题(最大 50 字符)- 通过使用短后缀 `_编辑` 解决
-2. 搜索验证问题 - 移除搜索验证,核心目标是跨端数据同步而非后台搜索
-
-**待解决问题**:
-1. 小程序验证部分在测试中超时 - 可能需要更多调试或调整等待时间
-2. 平台/公司更换同步测试(任务 4.2)- 待实现
-3. 批量编辑同步测试(任务 4.3)- 待实现
-
-**核心功能状态**:
-- 后台编辑订单: ✅ 工作正常(Toast 验证成功)
-- 小程序详情验证: ⚠️ 已实现但测试超时(需要进一步调试)
-- 数据同步时效性: ✅ 已实现验证机制(≤ 10 秒)
-
-### File List
-
-**新建文件**:
-- `_bmad-output/implementation-artifacts/13-2-order-edit-sync.md` - 本 Story 文档
-- `_bmad-output/implementation-artifacts/Epic-13-Validation-Report.md` - Epic 13 验证报告(未跟踪文件)
-
-**修改文件**:
-- `web/tests/e2e/specs/cross-platform/order-edit-sync.spec.ts` - 跨端编辑同步测试实现
-  - 添加两个测试用例:完整跨端同步测试、基本信息编辑测试
-  - 修复订单名称长度限制问题(最大 50 字符)
-  - 移除搜索验证,专注核心跨端数据同步功能
-
-**相关文件(参考)**:
-- `web/tests/e2e/pages/mini/enterprise-mini.page.ts` - 企业小程序 Page Object(修复语法错误)
-- `allin-packages/order-module/src/entities/employment-order.entity.ts` - 用工订单实体(发现名称长度限制)
-
-## Change Log
-
-- 2026-01-14: Story 13.2 创建完成
-  - 后台编辑订单 → 企业小程序验证需求
-  - 多 Page 对象管理策略
-  - 数据同步等待策略
-  - 状态:ready-for-dev
-
-- 2026-01-14: 开发进度更新(大部分任务已完成)
-  - ✅ 任务 0: Playwright MCP 探索验证(已在 Story 13.1 基础上验证)
-  - ✅ 任务 1-3: 测试文件和核心测试实现
-  - ✅ 任务 4.1: 基本信息编辑同步测试
-  - ✅ 任务 5-6: 测试数据策略和时效性验证
-  - ✅ 任务 7.1, 7.3: 代码质量验证
-  - ⚠️ 任务 7.2: 测试部分通过(小程序验证有超时问题)
-  - ❌ 任务 4.2, 4.3: 平台/公司更换和批量编辑测试待实现
-  - 修复:订单名称长度限制问题(50 字符)
-  - 修复:移除搜索验证,专注核心跨端同步功能
-  - 修复:enterprise-mini.page.ts 语法错误
-  - 状态:in-progress(核心功能已实现,部分测试待调试)

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

@@ -189,15 +189,20 @@ Story 13.9: 人才小程序**人才列表页**完整验证
 
 ### 与 Story 13.1 和 13.2 的关系
 
-| Story | 验证目标 | 测试场景 |
-|-------|---------|---------|
-| Story 13.1 | 后台创建订单 → 企业小程序订单列表验证 | 验证新订单出现在列表中 |
-| Story 13.2 | 后台编辑订单 → 企业小程序订单列表验证 | 验证编辑后订单信息更新 |
-| Story 13.8 | 订单列表页完整功能验证 | 验证列表页所有功能:筛选、搜索、分页、字段显示、交互 |
+> **重要变更 (2026-01-15)**: Story 13.1 和 13.2 已被删除,其功能完全合并到本 Story (13.8) 中。
 
-**Story 13.8 是 Story 13.1 和 13.2 的扩展和深化**:
-- 13.1 和 13.2 只验证了基本的数据同步
-- 13.8 验证订单列表页的所有功能点
+**删除原因**: Story 13.1 和 13.2 的功能与 Story 13.8 高度重叠,为了避免重复工作和维护成本,已将这两个 Story 的功能完全合并到 Story 13.8。
+
+| 原 Story | 验证目标 | 合并后的测试场景 |
+|----------|---------|----------------|
+| Story 13.1 (已删除) | 后台创建订单 → 企业小程序订单列表验证 | 任务 5.5: 验证后台创建订单后小程序列表同步 |
+| Story 13.2 (已删除) | 后台编辑订单 → 企业小程序订单列表验证 | 任务 5.1-5.4: 验证后台编辑订单后小程序列表同步 |
+| Story 13.8 | 订单列表页完整功能验证 | 验证列表页所有功能:筛选、搜索、分页、字段显示、交互、跨端同步 |
+
+**Story 13.8 现在包含的完整功能**:
+- 原 Story 13.1 的功能: 后台创建订单后小程序列表显示验证
+- 原 Story 13.2 的功能: 后台编辑订单后小程序列表更新验证
+- 订单列表页所有功能点的完整验证:筛选、搜索、字段显示、交互
 
 ### Playwright MCP 探索结果 (2026-01-14)
 
@@ -495,6 +500,12 @@ _Modified files:_
 
 ## Change Log
 
+- 2026-01-15: 合并 Story 13.1 和 13.2 功能到本 Story
+  - Story 13.1 (后台创建订单 → 企业小程序验证) 已删除,功能合并到本 Story
+  - Story 13.2 (后台编辑订单 → 企业小程序验证) 已删除,功能合并到本 Story
+  - 删除原因: 功能与 Story 13.8 高度重叠,避免重复工作和维护成本
+  - 本 Story 现在包含完整的订单列表页验证功能,包括原 13.1 和 13.2 的跨端同步验证
+
 - 2026-01-14: Story 13.8 开发进度更新
   - 状态:backlog → in-progress
   - 完成 Playwright MCP 探索,发现小程序订单列表页没有 data-testid 属性

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

@@ -210,8 +210,8 @@ development_status:
   # 技术要点: 多 Page 对象管理、Playwright MCP 优先测试流程
   # 测试流程: EXPLORE(任务 0)→ RED(任务 1-3)→ GREEN(任务 4-5)→ REFACTOR(任务 6)
   epic-13: in-progress
-  13-1-order-create-sync: done   # 后台创建订单 → 企业小程序验证 ✅ 完成 (2026-01-14) - 跨端数据同步测试、Playwright MCP 探索、DisabledPersonSelector 组件修复
-  13-2-order-edit-sync: in-progress       # 后台编辑订单 → 企业小程序验证
+  13-1-order-create-sync: removed   # 已删除 - 功能被 Story 13.8 完全覆盖 (2026-01-15)
+  13-2-order-edit-sync: removed     # 已删除 - 功能被 Story 13.8 完全覆盖 (2026-01-15)
   13-3-person-add-sync: done              # 后台添加人员 → 人才小程序验证 ✅ 完成 (2026-01-15) - Playwright MCP 验证完成,后台功能全部正常
   13-4-status-update-sync: in-progress   # 后台更新状态 → 双小程序验证(2026-01-14 新增)
   13-5-cross-platform-stability: in-progress   # 跨端测试稳定性验证(2026-01-14 新增)- 代码审查问题修复中