- 将AI模型相关端点、命令、处理器移动到模块内部统一管理 - 优化数据库迁移脚本,添加对不同环境表状态的兼容处理逻辑 - 为异常处理添加错误码枚举参数,统一错误处理方式 - 重构多处业务逻辑中的异常抛出方式,增强代码一致性 - 移除独立的组件清单分组和项目定义,简化前端物料面板数据结构 - 修复测试代码中实体引用路径错误问题 - 添加新的监控模块测试项目到解决方案文件中
93 lines
6.2 KiB
Markdown
93 lines
6.2 KiB
Markdown
# 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,没有敏感凭证日志,没有覆盖用户其他修改。
|