Ready for Review
作为企业用户, 我希望管理残疾人就业订单和查看打卡数据, 以便跟踪就业进展和进行薪资核算。
docs/小程序原型/yongren.html中的订单管理页面import { Navbar } from '@d8d/mini-shared-ui-components/components/navbar'title="订单列表",leftIcon="",leftText=""activeTab="order"px-4 pb-4 pt-0(移除顶部内边距适配navbar占位)title="订单详情",leftIcon="i-heroicons-chevron-left-20-solid",leftText="返回"h-screen overflow-y-auto px-4 pb-4 pt-0依赖故事:
订单管理API(order模块)- 通用版本:
mini/src/api.ts中统一注册,为通用版本。按照史诗011的mini-ui-packages架构,企业用户应使用UI包内创建的企业专用订单API客户端,而非此通用版本。orderClient(在mini/src/api.ts中可用,由故事011.001集成的通用版本)/api/v1/orderGET / - 订单列表查询接口(支持搜索、筛选、分页)search?(订单号、订单名称)、status?(订单状态)、page?、limit?GET /{id} - 订单详情查询接口PUT /{id} - 订单状态更新接口POST / - 订单创建接口(如有权限)PUT /{id} - 订单编辑接口(如有权限)使用示例(仅用于参考,企业用户不应使用):
import { orderClient } from '@/api'
// 获取订单列表(带搜索和筛选)
const orderList = await orderClient.get({
query: {
search: '阿里巴巴',
status: 'in_progress',
page: 1,
limit: 20
}
})
// 获取订单详情
const orderDetail = await orderClient[':id'].get({
param: { id: '123' }
})
企业专用订单API(order模块扩展):
/api/v1/order)返回所有订单数据,未按企业过滤。企业专用订单API(/api/v1/yongren/order)只返回当前企业用户关联的订单数据,确保数据安全隔离。mini/src/api.ts中注册。客户端创建:在@d8d/yongren-order-management-ui包内创建企业专用订单API客户端,参考@d8d/mini-enterprise-auth-ui包的模式:
// 文件:mini-ui-packages/yongren-order-management-ui/src/api/enterpriseOrderClient.ts
// 故事012.014已实现,使用enterpriseOrderRoutes类型(仅包含企业专用路由)
// 原orderRoutes类型包含混合路由,已不适用于企业专用API客户端
import type { enterpriseOrderRoutes } from '@d8d/order-module';
import { rpcClient } from '@d8d/mini-shared-ui-components/utils/rpc/rpc-client';
// 注意:企业专用订单API通过enterpriseAuthMiddleware中间件保护,确保仅限企业用户访问
// **重要安全要求**:企业专用API必须严格验证JWT token中的`companyId`字段,确保数据隔离安全
// **当前实现**:验证`companyId`为必需,`enterprise`角色验证可暂时忽略(未来需要补充)
// 路径前缀 /api/v1/yongren/order 在路由层配置
export const enterpriseOrderClient = rpcClient<typeof enterpriseOrderRoutes>('/api/v1/yongren/order');
路径前缀:/api/v1/yongren/order
主要接口:
GET /list - 订单列表查询接口(支持搜索、筛选、分页,自动过滤当前企业订单)
orderName?(订单名称搜索)、orderStatus?(订单状态过滤)、page?、limit?GET /detail/{id} - 订单详情查询接口(验证订单是否属于当前企业,通过enterpriseAuthMiddleware保护)POST /create - 订单创建接口PUT /update/{id} - 订单更新接口(验证订单权限)DELETE /delete/{id} - 订单删除接口(验证订单权限)POST /activate/{orderId} - 激活订单接口POST /close/{orderId} - 关闭订单接口POST /{orderId}/persons/batch - 批量添加人员到订单POST /assets/create - 创建订单人员资产GET /assets/query - 查询订单人员资产DELETE /assets/delete/{id} - 删除订单人员资产PUT /persons/work-status - 更新订单人员工作状态GET /checkin-statistics - 打卡数据统计接口(按企业维度统计打卡视频数量)
companyId?(企业ID,从认证用户获取)GET /video-statistics - 视频分类统计接口(按企业维度统计视频类型分布)
companyId?(企业ID)、assetType?(视频类型过滤)GET /company-orders - 企业维度订单查询接口(专为企业用户设计的订单列表,支持完整查询参数)
companyId?(企业ID)、orderName?、orderStatus?、page?、pageSize?、sortBy?、sortOrder?GET /company-videos - 企业维度视频查询接口(按企业筛选视频资产,支持分页和排序)
companyId?(企业ID)、assetType?(资产类型)、page?、pageSize?、sortBy?、sortOrder?POST /batch-download - 批量下载视频接口(支持企业维度和个人维度下载)
downloadScope(下载范围:company/person)、companyId?、personId?(个人维度需要)、assetTypes?、fileIds?PUT /videos/{id}/status - 更新视频审核状态接口(支持pending/verified/rejected状态更新)
id(视频资产ID)status(审核状态)使用示例:
// 在订单管理UI包内使用
import { enterpriseOrderClient } from '../api/enterpriseOrderClient'
// 获取企业维度订单列表(带搜索和筛选)
const orderList = await enterpriseOrderClient['company-orders'].$get({
query: {
orderName: '阿里巴巴',
orderStatus: 'confirmed',
page: 1,
pageSize: 20
}
})
// 获取订单详情(基础CRUD接口)- 企业专用版本
const orderDetail = await enterpriseOrderClient.detail[':id'].$get({
param: { id: 123 }
})
// 替代方案:使用company-orders接口获取企业订单列表(适用于批量查询)
const companyOrders = await enterpriseOrderClient['company-orders'].$get({
query: {
companyId: 1,
page: 1,
pageSize: 20,
orderName: '特定订单名称' // 可选过滤条件
}
})
// 获取打卡数据统计
const checkinStats = await enterpriseOrderClient['checkin-statistics'].$get({
query: {
companyId: 1 // 可选,默认从认证用户获取
}
})
// 获取视频分类统计
const videoStats = await enterpriseOrderClient['video-statistics'].$get({
query: {
companyId: 1,
assetType: 'checkin_video'
}
})
// 批量下载企业维度视频
const downloadResult = await enterpriseOrderClient['batch-download'].$post({
body: {
downloadScope: 'company',
companyId: 1,
assetTypes: ['checkin_video', 'work_video']
}
})
// 更新视频审核状态
const updateResult = await enterpriseOrderClient.videos[':id'].status.$put({
param: { id: '456' },
body: {
status: 'verified'
}
})
订单统计API(史诗012提供):
checkin-statistics和video-statistics路由访问
/api/v1/yongren/order/checkin-statistics - 打卡数据统计接口(按企业维度统计打卡视频数量)/api/v1/yongren/order/video-statistics - 视频统计接口(按企业维度统计视频类型分布)视频管理API(史诗012提供):
company-videos(视频列表查询)、video-statistics(视频统计)、batch-download(批量下载)、videos/{id}/status(状态更新)等路由访问GET /company-videos - 视频列表查询接口(按企业筛选视频资产,支持分页和排序)POST /batch-download - 批量下载视频接口(支持企业维度和个人维度下载)PUT /videos/{id}/status - 更新视频审核状态接口(支持pending/verified/rejected状态更新)GET /video-statistics - 视频统计接口(分类统计、类型分布)技术集成:
@d8d/mini-shared-ui-components/utils/rpc/rpc-client提供的RPC客户端工具,在UI包内创建企业专用API客户端api/v1/yongren@d8d/order-module)导入路由类型定义,确保类型安全订单管理页设计规范:
必须严格对照原型文件 docs/小程序原型/yongren.html 第1114-1301行的订单管理页面设计实现:
页面结构:
h-[calc(100%-60px)] overflow-y-auto(仅减去底部导航60px)订单筛选区域(第1129-1136行):
p-4 border-b border-gray-200flex space-x-2 overflow-x-auto pb-2
bg-blue-100 text-blue-800 text-xs px-3 py-1 rounded-full whitespace-nowrap(激活状态)bg-gray-100 text-gray-800 text-xs px-3 py-1 rounded-full whitespace-nowrap列表标题区域(第1140-1145行):
flex justify-between items-center mb-4<h3 class="font-semibold text-gray-700">订单列表</h3>bg-blue-500 text-white text-xs px-3 py-1 rounded-lg
<i class="fas fa-plus mr-1"></i>订单卡片列表(第1147-1301行):
space-y-4card bg-white p-4订单卡片头部(第1150-1156行):
flex justify-between items-start mb-3
<h4 class="font-semibold text-gray-800">阿里巴巴2023-11</h4>,创建时间 <p class="text-xs text-gray-500">2023-11-01 创建</p><span class="bg-green-100 text-green-800 text-xs px-2 py-1 rounded-full">进行中</span>订单信息网格(第1157-1174行):
grid grid-cols-2 gap-3 text-sm mb-3<p class="text-gray-500">预计人数</p>,值 <p class="text-gray-800">30人</p>打卡数据统计网格(第1176-1192行):
grid grid-cols-3 gap-2 mb-3bg-blue-50 rounded-lg p-2 text-center(三种颜色:blue-50, green-50, purple-50)
<p class="text-xs text-gray-600">本月打卡</p><p class="text-sm font-bold text-gray-800">24/30</p><p class="text-xs text-gray-500">80%</p>操作按钮区域(第1193-1200行):
flex justify-between text-sm
text-blue-500,图标 <i class="fas fa-eye mr-1"></i>,文字"查看详情"text-gray-500,图标 <i class="fas fa-download mr-1"></i>,文字"下载视频"订单详情设计规范: 原型文件中没有单独的订单详情页面,需要基于人才详情页面(页面4)的设计风格创建:
设计原则:
建议页面结构:
样式参考:
.card bg-white p-4 mb-4<h3 class="font-semibold text-gray-700 mb-3">grid grid-cols-2 gap-3 text-sm 或 space-y-3 text-smUI组件使用:
YongrenTabBarLayout - 从@d8d/yongren-shared-ui/components/YongrenTabBarLayout导入(底部导航布局组件,主页面必须使用,订单标签激活状态)Navbar - 从@d8d/mini-shared-ui-components/components/navbar导入(顶部导航栏组件,所有页面必须使用)PageContainer - 从@d8d/mini-shared-ui-components/components/page-container导入(页面容器组件)YongrenTabBarLayout + Navbar组合title="订单列表",leftIcon="",leftText=""(无返回按钮)px-4 pb-4 pt-0(移除顶部内边距适配navbar占位)Navbar(移除YongrenTabBarLayout包裹)title="订单详情",leftIcon="i-heroicons-chevron-left-20-solid",leftText="返回"(带返回按钮)h-screen overflow-y-auto px-4 pb-4 pt-0@d8d/allin-*系列UI包当前架构(已按mini-ui-packages拆分):
订单管理UI包:
@d8d/yongren-order-management-ui(位于mini-ui-packages/yongren-order-management-ui/)src/pages/OrderList/OrderList.tsx - 订单列表页面组件YongrenTabBarLayout布局,activeTab="order"Navbar组件,标题"订单列表",隐藏左侧返回按钮(主页面)ScrollView作为内容容器,布局px-4 pb-4 pt-0适配navbar占位pages/yongren/order/listsrc/pages/OrderDetail/OrderDetail.tsx - 订单详情页面组件Navbar组件,标题"订单详情",带左侧返回按钮(二级页面)YongrenTabBarLayout包裹(二级页不需要底部导航)ScrollView作为内容容器,布局h-screen overflow-y-auto px-4 pb-4 pt-0pages/yongren/order/detail@d8d/yongren-shared-ui/components/YongrenTabBarLayout - 底部导航布局组件(主页面使用)@d8d/mini-shared-ui-components/components/navbar - 顶部导航栏组件(所有页面使用)@d8d/mini-shared-ui-components/components/page-container - 页面容器组件@d8d/allin-order-module - 订单管理模块类型定义桥接文件位置(在mini项目中):
mini/src/pages/yongren/order/list/index.tsx - 订单列表页面桥接文件
@d8d/yongren-order-management-ui导入OrderList组件pages/yongren/order/listmini/src/pages/yongren/order/detail/index.tsx - 订单详情页面桥接文件
@d8d/yongren-order-management-ui导入OrderDetail组件pages/yongren/order/detail基于史诗012扩展的数据库schema:
order_person_asset表的asset_type枚举已扩展视频类型 [来源:docs/stories/012.001.story.md#数据模型]
salary_video、tax_video、checkin_video、work_videoflex flex-col强制垂直排列,确保布局符合原型设计测试框架:Jest + Testing Library 关键测试场景:
| 日期 | 版本 | 描述 | 作者 |
|---|---|---|---|
| 2025-12-17 | 1.0 | 初始创建(订单管理故事) | Bob(Scrum Master) |
| 2025-12-20 | 1.1 | 更新Navbar集成规范,添加页面层级结构,反映mini-ui-packages架构 | Claude Code |
| 2025-12-20 | 1.2 | 实施订单管理功能:订单列表页、订单详情页、打卡统计、视频统计、集成测试 | James (Developer) |
| 2025-12-21 | 1.3 | 更新企业专用订单API规范,反映史诗012实现和架构变更,修正客户端类型引用 | Claude Code |
| 2025-12-21 | 1.4 | 添加故事012.014路由分离说明,更新API客户端类型引用,添加enterpriseOrderRoutes迁移指引 | Claude Code |
| 2025-12-21 | 1.5 | 故事012.014已实施完成,确认enterpriseOrderRoutes类型可用,更新企业专用订单API客户端示例 | Claude Code |
| 2025-12-21 | 1.6 | 修复企业专用订单API缺失的订单详情接口,更新订单详情页代码,修正类型错误 | James (Developer) |
| 2025-12-21 | 1.7 | 为企业专用订单详情API添加集成测试,验证权限控制和数据隔离安全性 | Claude Code |
| 2025-12-22 | 1.8 | 验证订单详情页API调用与企业专用订单API实现的匹配性,优化订单ID获取方式(Taro.useRouter),更新调试日志和发现的问题部分 | Claude Code |
| 2025-12-22 | 1.9 | 优化订单详情页样式和Taro适配:统一按钮样式(Button→View)、修复Text组件垂直排列(flex flex-col)、修复API类型错误、通过类型检查 | James (Developer) |
| 2025-12-22 | 1.10 | 更新故事:由于用人小程序仅用于查看,明确订单详情页只用于查看,写操作只在管理后台执行 | James (Developer) |
| 2025-12-22 | 1.11 | 重构订单详情页数据流:使用React Query管理所有子状态,实现并行数据获取和更好的错误处理 | James (Developer) |
| 2025-12-22 | 1.12 | 集成企业专用订单统计和视频API,完成打卡数据统计和视频统计功能 | James (Developer) |
claude-sonnet
enterpriseOrderClient.detail[':id'].$get调用企业专用订单详情路由GET /detail/{id},路径、方法、参数和认证中间件均匹配正确(基于故事012.014的路由分离实现)Taro.useRouter()替代useEffect和状态管理,简化代码并提高性能,移除冗余的useEffect和setOrderId状态mini-ui-packages/yongren-order-management-ui/src/pages/OrderList/OrderList.tsxmini-ui-packages/yongren-order-management-ui/src/pages/OrderDetail/OrderDetail.tsxmini-ui-packages/yongren-order-management-ui/src/api/orderClient.tsOrderList.test.tsx和OrderDetail.test.tsxmini/src/pages/yongren/order/list/index.tsx和mini/src/pages/yongren/order/detail/index.tsxYongrenTabBarLayout基础布局组件Navbar导航栏组件,标题"订单列表",隐藏左侧返回按钮(主页面配置)px-4 pb-4 pt-0适配navbar占位Navbar导航栏组件,标题"订单详情",带左侧返回按钮(二级页面配置)YongrenTabBarLayout包裹(二级页不需要底部导航)h-screen overflow-y-auto px-4 pb-4 pt-0import { Navbar } from '@d8d/mini-shared-ui-components/components/navbar'title="订单列表",leftIcon="",leftText=""activeTab="order"px-4 pb-4 pt-0(移除顶部内边距适配navbar占位)title="订单详情",leftIcon="i-heroicons-chevron-left-20-solid",leftText="返回"h-screen overflow-y-auto px-4 pb-4 pt-0✅ 编写基础测试:
OrderList.test.tsxOrderDetail.test.tsx✅ 检查类型错误和API客户端集成:
enterpriseOrderRoutes类型✅ 对照原型检查并修复订单列表项卡片:
docs/小程序原型/yongren.html第1114-1301行进行详细UI验证pnpm typecheck通过,无TypeScript错误✅ 优化按钮组件样式(使用View替代Button组件):
<Button>组件替换为<View className="flex items-center">,实现纯文本按钮样式,与原型设计完全一致<Button>替换为<View className="flex justify-center items-center">,移除按钮默认交互样式<Button>替换为<View className="flex items-center">,保持背景色但移除按钮默认样式Button导入,仅保留View, Text, ScrollView, Inputpnpm typecheck通过,无TypeScript错误✅ 修复OrderDetail组件null读取错误并使用React Query重构:
pnpm typecheck通过,无TypeScript错误✅ 优化订单详情页订单ID获取方式:
Taro.useRouter()替代useEffect和setOrderId状态管理,简化代码结构useEffect,提高组件性能,减少不必要的渲染✅ 优化订单详情页样式和Taro适配:
flex flex-col类,解决Taro小程序中文本垂直排列问题getStatusLabel和getStatusClass函数支持undefined参数pnpm typecheck通过,无TypeScript错误✅ 重构订单详情页数据流:
enterpriseOrderClient.ts,使用enterpriseOrderRoutes类型,订单列表和详情组件已集成使用docs/小程序原型/yongren.html 第1114-1301行进行详细UI验证
/api/v1/yongren/order)的GET /detail/{id}路由,数据安全隔离已验证(基于故事012.014的路由分离实现)flex flex-col类,确保垂直排列符合原型设计,优化订单详情页样式和Taro适配enterpriseOrderClient.ts文件已创建,使用enterpriseOrderRoutes类型enterpriseOrderClientGET /detail/{id}已通过故事012.014实现并验证OrderList.tsx和OrderDetail.tsx中导入并使用enterpriseOrderClientdocs/小程序原型/yongren.html第1114-1301行的订单管理页面设计/api/v1/yongren/orderflex flex-col类pnpm typecheck确保无TypeScript错误OrderList.test.tsx和OrderDetail.test.tsx测试真实API集成getRightButtonConfig函数,根据订单状态返回按钮配置(图标、文字、处理器)handleDataReport(数据报告)、handleEdit(编辑订单)文档更新记录 (2025-12-20):
来自QA代理对已完成故事实施的QA审查结果