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/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} - 订单详情查询接口(验证订单是否属于当前企业)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' }
})
// 获取打卡数据统计
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 |
claude-sonnet
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-0OrderList.test.tsxOrderDetail.test.tsxorderClient.ts),需要集成真实的企业专用订单APIdocs/小程序原型/yongren.html 第1114-1301行进行详细UI验证/api/v1/yongren/order)而非通用订单API,确保数据安全隔离flex flex-col类,确保垂直排列符合原型设计集成真实的企业专用订单API客户端:
mini-ui-packages/yongren-order-management-ui/src/api/目录创建enterpriseOrderClient.ts文件参考@d8d/mini-enterprise-auth-ui包的模式创建客户端:
// 故事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/v1/yongren/order 在路由层配置
export const enterpriseOrderClient = rpcClient<typeof enterpriseOrderRoutes>('/api/v1/yongren/order');
注意:企业专用订单API已通过史诗012在order-module中实现。故事012.014已提供enterpriseOrderRoutes类型(仅包含企业专用路由),实现更安全的类型检查。所有企业专用API(包括基础CRUD接口和扩展API)均通过enterpriseAuthMiddleware中间件保护,确保数据安全隔离。
更新src/api/index.ts导出新的客户端
更新订单列表和详情组件:
OrderList.tsx和OrderDetail.tsx中导入并使用enterpriseOrderClient对照原型文件进行详细UI验证:
docs/小程序原型/yongren.html第1114-1301行的订单管理页面设计验证企业专用API路径和权限控制:
/api/v1/yongren/order解决Taro小程序Text组件垂直排列问题:
flex flex-col类完善类型检查和测试:
pnpm typecheck确保无TypeScript错误OrderList.test.tsx和OrderDetail.test.tsx测试真实API集成文档更新记录 (2025-12-20):
来自QA代理对已完成故事实施的QA审查结果