# U号租登录后订单列表 Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 用户完成 u号租腾讯验证码登录后,系统立即同步订单,并在外部系统详情页分页展示已同步订单。 **Architecture:** 复用现有 `UHaoZuLoginService -> SyncProcessor -> b_synced_records` 数据链路,不新增订单表。Monitoring Application 新增只读分页 Query,BuildFlow.Host 新增 Endpoint;前端详情页通过 VxeGrid 查询并展示订单,未知业务字段保留在原始 Payload 中。 **Tech Stack:** .NET 10、EF Core、MediatR、FastEndpoints、xUnit、Vue 3、TypeScript、Vben VxeGrid、Vitest。 --- ### Task 1: 建立 Monitoring 测试项目并为订单分页查询写失败测试 **Files:** - Create: `tests/BuildFlow.Monitoring.Tests/BuildFlow.Monitoring.Tests.csproj` - Create: `tests/BuildFlow.Monitoring.Tests/MonitoringTestDb.cs` - Create: `tests/BuildFlow.Monitoring.Tests/Reports/GetOrderRecordsQueryHandlerTests.cs` - Modify: `BuildFlow.slnx` - [ ] 创建测试项目,引用 Monitoring Application/Infrastructure,并使用仓库现有版本的 xUnit、FluentAssertions 和 EF Core InMemory。 - [ ] 写失败测试:两个系统、三条 order、一条非 order;断言只返回目标系统的 order,按发生时间倒序分页。 - [ ] 运行 `dotnet test tests/BuildFlow.Monitoring.Tests/BuildFlow.Monitoring.Tests.csproj --no-restore`,确认因缺少 Query/DTO/Handler 而失败。 测试核心断言: ```csharp var result = await handler.Handle(new GetOrderRecordsQuery(systemId, 1, 2), default); result.Total.Should().Be(3); result.Items.Select(x => x.ExternalId).Should().Equal("order-3", "order-2"); ``` ### Task 2: 实现订单分页 Query 和 HTTP Endpoint **Files:** - Create: `src/modules/monitoring/Application/Reports/DTOs/OrderRecordDto.cs` - Create: `src/modules/monitoring/Application/Reports/DTOs/OrderRecordPageDto.cs` - Create: `src/modules/monitoring/Application/Reports/Queries/GetOrderRecordsQuery.cs` - Create: `src/modules/monitoring/Application/Reports/Handlers/GetOrderRecordsQueryHandler.cs` - Create: `src/BuildFlow.Host/Endpoints/Monitoring/GetOrderRecordsRequest.cs` - Create: `src/BuildFlow.Host/Endpoints/Monitoring/GetOrderRecordsRequestValidator.cs` - Create: `src/BuildFlow.Host/Endpoints/Monitoring/GetOrderRecordsEndpoint.cs` - [ ] 创建一文件一类型 DTO:订单记录包含 `Id`、`ExternalSystemId`、`ExternalId`、UTC 毫秒时间戳 `OccurredAt` 和 `Payload`;分页 DTO 包含 `Items/Total/PageIndex/PageSize`。 - [ ] Handler 先校验系统存在,再过滤 `ExternalSystemId` 与 `RecordType == "order"`,按 `OccurredAt`、`UpdatedAt` 倒序分页;物化后读取 `Data.Payload`。 - [ ] Endpoint 使用 `GET /monitoring/systems/{systemId}/orders` 和 `monitoring.view` 权限。 - [ ] Validator 要求 `PageIndex > 0`,`PageSize` 在 1 到 100 之间。 - [ ] 运行 Monitoring 测试并确认 GREEN。 ### Task 3: 补齐登录请求校验并收敛敏感日志 **Files:** - Create: `src/BuildFlow.Host/Endpoints/Monitoring/LoginExternalSystemRequestValidator.cs` - Create: `src/modules/monitoring/Infrastructure/Connectors/UHaoZuLoginPayloadFactory.cs` - Modify: `src/modules/monitoring/Infrastructure/Connectors/UHaoZuLoginService.cs` - Create: `tests/BuildFlow.Monitoring.Tests/ExternalSystems/LoginExternalSystemRequestValidatorTests.cs` - Create: `tests/BuildFlow.Monitoring.Tests/Connectors/UHaoZuLoginPayloadFactoryTests.cs` - [ ] 写失败测试:空账号、密码、ticket、randstr 被拒绝;密码 `321` 生成 `caf1a3dfb505ffed0d024130f58c5cfa`,票据字段为 `verificationCode.randStr`。 - [ ] 实现 Validator 和 Payload Factory,登录服务复用工厂。 - [ ] 日志只记录 HTTP 状态、业务响应码和 Cookie 名称数量,不记录响应体、密码、票据、Cookie 值或原始 `Set-Cookie`。 - [ ] 无 `Set-Cookie` 时使用 `TryGetValues`,避免二次异常。 - [ ] 运行 Monitoring 测试并确认 GREEN。 ### Task 4: 前端订单 API、展示模型和详情页表格 **Files:** - Modify: `build-flow.web/apps/web-antdv-next/src/api/core/monitoring.ts` - Create: `build-flow.web/apps/web-antdv-next/src/views/monitoring/detail/order-record.ts` - Create: `build-flow.web/apps/web-antdv-next/src/views/monitoring/detail/order-record.test.ts` - Modify: `build-flow.web/apps/web-antdv-next/src/views/monitoring/detail/index.vue` - Create: `build-flow.web/apps/web-antdv-next/src/views/monitoring/systems/modules/uhaozu-captcha.ts` - Create: `build-flow.web/apps/web-antdv-next/src/views/monitoring/systems/modules/uhaozu-captcha.test.ts` - Modify: `build-flow.web/apps/web-antdv-next/src/views/monitoring/systems/modules/credential-form.vue` - [ ] 先写失败测试:订单展示模型从 Payload 提取订单号、状态、商品/账号、金额、租期并提供兜底;验证码编排覆盖成功和取消。 - [ ] 运行 `../../node_modules/.bin/vitest run --dom src/views/monitoring/detail/order-record.test.ts src/views/monitoring/systems/modules/uhaozu-captcha.test.ts`,确认 RED。 - [ ] 新增 `MonitoringApi.OrderRecord`、`OrderRecordPage` 和 `getMonitoringOrdersApi()`。 - [ ] 详情页增加服务端分页 VxeGrid,列为订单号、状态、商品/账号、实付金额、租期、下单时间;手动同步后刷新订单表。 - [ ] `credential-form.vue` 使用可测试的 `requestUHaoZuCaptcha()`,仍只调用腾讯原生验证码,不识别或自动点击。 - [ ] 运行两个前端测试文件并确认 GREEN。 ### Task 5: 完整验证 **Files:** - Verify only - [ ] 运行 `dotnet test tests/BuildFlow.Monitoring.Tests/BuildFlow.Monitoring.Tests.csproj --no-restore`。 - [ ] 运行 `dotnet build BuildFlow.slnx --no-restore`,要求 0 warning / 0 error。 - [ ] 运行前端两个目标 Vitest、`vue-tsc --noEmit --skipLibCheck` 和 `vite build --mode production`。 - [ ] 浏览器确认 `TencentCaptcha(192192826)` 仍渲染真实弹窗;用 mock API 验证订单表格非空且布局稳定。 - [ ] 检查没有新增数据库表或 Migration,没有敏感凭证日志,没有覆盖用户其他修改。