build-flow.api/docs/superpowers/plans/2026-07-19-uhaozu-order-list.md
xiangning 51eea796e2 refactor(rag): 重构AI模型相关代码结构和数据库迁移逻辑
- 将AI模型相关端点、命令、处理器移动到模块内部统一管理
- 优化数据库迁移脚本,添加对不同环境表状态的兼容处理逻辑
- 为异常处理添加错误码枚举参数,统一错误处理方式
- 重构多处业务逻辑中的异常抛出方式,增强代码一致性
- 移除独立的组件清单分组和项目定义,简化前端物料面板数据结构
- 修复测试代码中实体引用路径错误问题
- 添加新的监控模块测试项目到解决方案文件中
2026-07-20 08:25:18 +08:00

93 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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,没有敏感凭证日志,没有覆盖用户其他修改。