审查日期: 2026-01-15 审查类型: 对抗性代码审查 (ADVERSARIAL Senior Developer Code Review) 审查范围: Story 13.13 - 订单统计字段显示修复
文件: allin-packages/order-module/src/routes/order-custom.routes.ts
问题描述:
orderStatsRoute 定义为扁平路径 /company-orders/{id}/statscompany-orders → :id → statsenterpriseOrderClient['company-orders'][':id']['stats'] 访问统计接口根本原因: Hono 的 RPC 客户端使用类型推断生成客户端结构,需要后端路由使用嵌套结构才能正确映射。
修复方案:
// 修复前:扁平路由
const orderStatsRoute = createRoute({
path: '/company-orders/{id}/stats', // 错误:扁平路径
...
});
// 修复后:嵌套路由结构
enterpriseOrderCustomRoutes
.route('/company-orders',
new OpenAPIHono<AuthContext>()
.openapi({ ...companyOrdersRoute, path: '' }, async (c) => { ... }) // 列表
.openapi(orderStatsRoute, async (c) => { ... }) // 统计 (path: '/:id/stats')
)
修改的文件:
allin-packages/order-module/src/routes/order-custom.routes.ts (行 856-907, 1399-1487)文件: mini-ui-packages/yongren-order-management-ui/src/pages/OrderList/OrderList.tsx
问题描述: 通过 Playwright MCP 实际测试验证发现:
0/0 0%/company-orders/{id}/stats 接口useOrderStats hook 静默失败,没有抛出错误根本原因: 与问题 1 相关,由于路由结构不匹配,RPC 客户端无法正确访问统计接口。
修复方案: 修复后端路由结构(见问题 1)后,前端需要重新编译以获取更新后的类型定义。
文件: mini-ui-packages/yongren-order-management-ui/src/pages/OrderList/OrderList.tsx (行 65-67)
问题描述:
const checkinStats = statsData?.checkinStats || { current: 0, total: order.actualPeople, percentage: 0 }
const salaryVideoStats = statsData?.salaryVideoStats || { current: 0, total: order.actualPeople, percentage: 0 }
const taxVideoStats = statsData?.taxVideoStats || { current: 0, total: order.actualPeople, percentage: 0 }
当 API 调用失败时,前端会回退到默认值 { current: 0, total: order.actualPeople, percentage: 0 },这会掩盖 API 调用的真实问题。
建议改进:
// 添加错误处理和日志记录
const { data: statsData, isLoading: statsLoading, error: statsError } = useOrderStats(order.id);
if (statsError) {
console.error(`获取订单 ${order.id} 统计数据失败:`, statsError);
}
// 区分加载状态、错误状态和无数据状态
const checkinStats = statsData?.checkinStats;
const showFallback = !statsLoading && !statsData;
文件: web/tests/e2e/specs/cross-platform/order-stats-fix.spec.ts (行 26-27)
问题描述:
const TEST_USER_PHONE = '13800001111'; // 错误的手机号
const TEST_USER_PASSWORD = process.env.TEST_ENTERPRISE_PASSWORD || 'password123';
测试使用的企业账号与实际测试环境不匹配。
修复方案:
const TEST_USER_PHONE = '13800138002'; // 修正为正确的手机号
const TEST_USER_PASSWORD = process.env.TEST_ENTERPRISE_PASSWORD || '123123';
order.service.ts - getOrderStats 方法 (行 1206-1271)发现的问题:
时区处理不明确:
const monthStart = new Date(year, month - 1, 1);
const monthEnd = new Date(year, month, 1);
related_time 字段存储的是 timestamp查询逻辑正确但可优化:
DISTINCT asset.personId 统计去重人员数是正确的relatedTime 筛选本月数据逻辑正确状态: 未发现单元测试覆盖 getOrderStats 方法
建议: 添加以下测试用例:
文件: web/tests/e2e/specs/cross-platform/order-stats-fix.spec.ts
覆盖率: 适中
改进建议:
// allin-packages/order-module/src/routes/order-custom.routes.ts
enterpriseOrderCustomRoutes
.route('/company-orders',
new OpenAPIHono<AuthContext>()
// GET /company-orders - 企业订单列表
.openapi({ ...companyOrdersRoute, path: '' }, async (c) => { ... })
// GET /company-orders/:id/stats - 订单统计
.openapi(orderStatsRoute, async (c) => { ... })
)
路径映射:
enterpriseOrderClient['company-orders'].$get() → /company-ordersenterpriseOrderClient['company-orders'][':id']['stats'].$get() → /company-orders/:id/statsallin-packages/order-module/src/routes/order-custom.routes.ts
orderStatsRoute 路径从 /company-orders/{id}/stats 到 /:id/statscompanyOrdersRoute 和 orderStatsRoute 放在同一嵌套路由下web/tests/e2e/specs/cross-platform/order-stats-fix.spec.ts
重新编译后端代码
cd /mnt/code/188-179-template-6
pnpm build
重启开发服务器(如需要)
验证路由可用性
curl -X GET 'http://localhost:8080/api/v1/yongren/order/company-orders/1/stats?year=2026&month=1' \
-H 'Authorization: Bearer <token>'
运行 E2E 测试
cd web
timeout 60 pnpm test:e2e:chromium order-stats-fix
手动验证
/company-orders/:id/stats 被调用getOrderStats 方法