Draft
作为企业用户, 我希望查看订单统计数据和整体数据可视化统计, 以便更好地管理企业订单和了解人才数据分布,减少人工统计时间,提升管理决策准确性。
史诗上下文:此故事是史诗012(用人方小程序API补充与数据库扩展)的第4个核心故事,为企业用户提供订单管理和数据可视化统计功能,支持用人方小程序的完整管理能力。
从史诗文件复制的验收标准编号列表
birth_date字段准确计算将故事分解为实施所需的具体任务和子任务。 在相关处引用适用的验收标准编号。
[ ] 任务1:订单统计API实现(order-module扩展)(AC:1,2,3)
allin-packages/order-module/src/routes/order-custom.routes.ts中添加订单统计路由:GET /order/checkin-statistics(企业维度,基于order_person_asset表的checkin_video类型统计)GET /order/video-statistics(企业维度,支持按asset_type视频类型过滤)GET /order/company-orders(支持企业ID过滤、分页、排序)allin-packages/order-module/src/services/order.service.ts中添加统计服务方法:getCheckinStatistics(companyId: number): Promise<number> - 统计打卡视频数量getVideoStatistics(companyId: number, assetType?: string): Promise<VideoStats> - 视频分类统计getCompanyOrders(companyId: number, filters: OrderFilters): Promise<OrderList> - 企业维度订单查询allin-packages/order-module/src/schemas/order.schema.ts中添加对应的Zod Schema验证:CheckinStatisticsResponseSchema - 打卡统计响应schemaVideoStatisticsResponseSchema - 视频统计响应schemaCompanyOrdersQuerySchema - 企业订单查询参数schemacompany_id条件(通过employment_order.company_id关联过滤)allin-packages/order-module/src/routes/index.ts导出新的路由[ ] 任务2:数据统计API实现(创建独立的statistics-module)(AC:4,5)
allin-packages/statistics-module/目录结构,遵循后端模块包标准,参考现有模块的文件结构和配置:package.json - 包配置(名称:@d8d/allin-statistics-module,参考allin-packages/order-module/package.json的配置结构和依赖模式,主要依赖:@d8d/allin-disability-module、@d8d/allin-order-module、@d8d/shared-types、@d8d/shared-utils、@d8d/shared-crud、@hono/zod-openapi、typeorm、zod等)tsconfig.json - TypeScript配置(参考allin-packages/order-module/tsconfig.json的配置)vitest.config.ts - 测试配置(参考allin-packages/order-module/vitest.config.ts的配置)src/ - 源代码目录,参考现有模块的目录结构组织src/routes/statistics.routes.ts路由文件,实现6个统计接口:GET /statistics/disability-type-distributionGET /statistics/gender-distributionGET /statistics/age-distribution(基于birth_date字段计算年龄分组:18-25、26-35、36-45、46+)GET /statistics/household-distributionGET /statistics/job-status-distributionGET /statistics/salary-distributionsrc/services/statistics.service.ts服务文件,实现统计业务逻辑:DisabledPersonRepository、OrderPersonRepository等实体仓库company_id关联过滤(employment_order→order_person→disabled_person关联链)src/schemas/statistics.schema.tsSchema文件,定义Zod验证:src/index.ts包入口文件,导出路由、服务、schematests/integration/statistics.integration.test.ts集成测试文件:[ ] 任务3:性能优化与数据库索引(AC:6)
order_person_asset.asset_type、disabled_person.disability_type等统计字段索引)[ ] 任务4:测试实现(AC:7)
allin-packages/order-module/tests/integration/order.integration.test.ts中添加订单统计接口的集成测试order_person_asset表数据)allin-packages/statistics-module/tests/integration/statistics.integration.test.ts中实现6个统计接口的完整集成测试birth_date字段)birth_date为空)的优雅处理仅填充从docs文件夹中的实际工件提取的相关信息,与此故事相关:
基于故事012.001-012.003和012.008的已完成实施:
birth_date、扩展的asset_type枚举)enterpriseAuthMiddleware/api/v1/yongren在server包统一注册基于现有实体定义和故事012.001的数据库schema扩展:
OrderPersonAsset实体(allin-packages/order-module/src/entities/order-person-asset.entity.ts):
asset_type = checkin_video)asset_type枚举值:salary_video、tax_video、checkin_video、work_video)order_person_id关联order_person表,进而关联employment_order表EmploymentOrder实体(allin-packages/order-module/src/entities/order.entity.ts):
company_id)关联DisabledPerson实体(allin-packages/disability-module/src/entities/disabled-person.entity.ts):
disability_type、gender、household_province、household_city、job_statusbirth_date字段用于准确年龄计算(故事012.001添加)OrderPerson实体(allin-packages/order-module/src/entities/order-person.entity.ts):
salary_detail字段用于薪资分布统计API路径约定:
所有新增API必须遵循/api/v1/yongren前缀约定,路由在模块包内不应包含此前缀,前缀在server包注册时统一添加。
订单统计API接口设计(order-module扩展):
GET /order/checkin-statistics(企业维度)GET /order/video-statistics(企业维度,支持按类型过滤)GET /order/company-orders(支持企业ID过滤、分页、排序)数据统计API接口设计(决策:创建独立的statistics-module,专注于跨实体通用数据统计,与故事012.003的企业统计互补):
模块职责范围:
具体接口列表:
GET /statistics/disability-type-distributionGET /statistics/gender-distributionGET /statistics/age-distribution(基于birth_date字段)GET /statistics/household-distributionGET /statistics/job-status-distributionGET /statistics/salary-distribution认证要求:
enterpriseAuthMiddleware中间件company_id验证)企业数据隔离实现细节:
company_id条件(从认证用户的company_id字段获取)employment_order.company_id过滤employment_order→order_person→disabled_person关联链)company_id不为空,服务层验证查询结果的企业ID与用户企业ID匹配不适用(后端API故事)。
基于项目结构和后端模块包规范:
订单模块位置:
allin-packages/order-module/src/routes/ - 路由文件位置allin-packages/order-module/src/services/ - 服务层文件位置allin-packages/order-module/src/schemas/ - Schema验证文件位置allin-packages/order-module/tests/integration/ - 集成测试位置统计模块位置(决策:创建独立的statistics-module):
allin-packages/statistics-module/ - 新模块根目录allin-packages/statistics-module/package.json - 包配置(依赖:@d8d/allin-disability-module、@d8d/allin-order-module、@d8d/shared-types、@d8d/shared-utils、@d8d/shared-crud等)allin-packages/statistics-module/src/routes/statistics.routes.ts - 路由文件allin-packages/statistics-module/src/services/statistics.service.ts - 服务层文件allin-packages/statistics-module/src/schemas/statistics.schema.ts - Schema验证文件allin-packages/statistics-module/tests/integration/statistics.integration.test.ts - 集成测试文件残疾人模块位置(用于数据统计):
allin-packages/disability-module/src/entities/ - 实体定义allin-packages/disability-module/src/repositories/ - 数据访问层/api/v1/yongren前缀,前缀在server包统一注册 [来源:docs/prd/epic-012-api-supplement-for-employer-mini-program.md#故事012-08]company_id验证birth_date字段已添加且部分记录有值,asset_type枚举已扩展),统计查询应考虑空数据情况的优雅处理allin-packages/用于业务模块列出开发者需要遵循的相关测试标准:
allin-packages/{模块名称}/tests/unit/**/*.test.tsallin-packages/{模块名称}/tests/integration/**/*.test.tsbirth_date字段准确计算年龄分组birth_date为空)时的优雅处理跟踪对此故事文档所做的更改
| 日期 | 版本 | 描述 | 作者 |
|---|---|---|---|
| 2025-12-17 | 1.0 | 初始故事创建 | Bob(Scrum Master) |
| 2025-12-17 | 1.1 | 根据检查清单反馈更新:添加史诗上下文、修正引用格式、明确统计模块决策、添加企业数据隔离实现细节、完善性能优化策略和边缘情况测试 | Bob(Scrum Master) |
| 2025-12-17 | 1.2 | 架构决策更新:采用方案A,明确statistics-module职责范围仅限跨实体通用统计,与故事012.003的企业统计功能职责划分清晰 | Bob(Scrum Master) |
| 2025-12-17 | 1.3 | 任务重写:根据创建新模块决策,重写任务1-4,提供具体的文件路径、package.json依赖、集成测试等详细实施指导 | Bob(Scrum Master) |
此部分由开发代理在实施过程中填充
来自QA代理对已完成故事实施的QA审查结果