Implemented
作为企业用户, 我希望查看订单统计数据和整体数据可视化统计, 以便更好地管理企业订单和了解人才数据分布,减少人工统计时间,提升管理决策准确性。
史诗上下文:此故事是史诗012(用人方小程序API补充与数据库扩展)的第4个核心故事,为企业用户提供订单管理和数据可视化统计功能,支持用人方小程序的完整管理能力。
从史诗文件复制的验收标准编号列表
birth_date字段准确计算将故事分解为实施所需的具体任务和子任务。 在相关处引用适用的验收标准编号。
[x] 任务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导出新的路由[x] 任务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个统计接口(参考allin-packages/order-module/src/routes/order-custom.routes.ts的路由定义模式):GET /statistics/disability-type-distribution(企业维度,基于disabled_person.disability_type统计)GET /statistics/gender-distribution(企业维度,基于disabled_person.gender统计)GET /statistics/age-distribution(企业维度,基于birth_date字段计算年龄分组:18-25、26-35、36-45、46+)GET /statistics/household-distribution(企业维度,基于disabled_person.household_province和household_city统计)GET /statistics/job-status-distribution(企业维度,基于disabled_person.job_status统计)GET /statistics/salary-distribution(企业维度,基于order_person.salary_detail统计薪资范围分布)src/services/statistics.service.ts服务文件,实现统计业务逻辑(参考allin-packages/order-module/src/services/order.service.ts的服务类结构):DisabledPersonRepository、OrderPersonRepository等实体仓库company_id关联过滤(employment_order→order_person→disabled_person关联链)src/schemas/statistics.schema.tsSchema文件,定义Zod验证(参考allin-packages/order-module/src/schemas/order.schema.ts的Schema定义模式):src/index.ts包入口文件,导出路由、服务、schema(参考allin-packages/order-module/src/index.ts的导出结构):tests/integration/statistics.integration.test.ts集成测试文件(参考allin-packages/order-module/tests/integration/order.integration.test.ts的集成测试结构):[x] 任务3:性能优化与数据库索引(AC:6)
order_person_asset.asset_type、disabled_person.disability_type等统计字段索引)[x] 任务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包统一注册 史诗012文档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) |
| 2025-12-17 | 1.4 | 为statistics-module新建文件添加具体的参考文件路径,确保开发者有清晰的对照参考(services、schemas、index.ts、集成测试等文件参考现有模块的对应文件) | Bob(Scrum Master) |
| 2025-12-17 | 1.5 | 根据故事草稿检查清单反馈修复:1) 引用格式标准化(使用Markdown链接格式),2) 补充环境变量说明,3) 明确编码模式例外(TypeORM QueryBuilder和CTE使用) | Bob(Scrum Master) |
此部分由开发代理在实施过程中填充
companyName与name不匹配,残疾人实体字段jobStatus类型为数字而非字符串@d8d/allin-disability-module/schemas缺少DisabilityType、Gender、JobStatus导出disabledPersonId应为personId,缺少必填字段joinDateorderPersonId应为orderId和personId两个字段,缺少必填字段orderId和personId✅ 订单统计API扩展完成
GET /order/checkin-statisticsGET /order/video-statisticsGET /order/company-orders✅ statistics-module创建与实现
GET /statistics/disability-type-distributionGET /statistics/gender-distributionGET /statistics/age-distributionGET /statistics/household-distributionGET /statistics/job-status-distributionGET /statistics/salary-distributionemployment_order → order_person → disabled_person 过滤✅ 性能优化文档
docs/database-indexes.md✅ 测试实现
✅ 路由与验证改进
parseWithAwait 验证所有响应数据✅ 测试修复与验证完成
joinDate、orderId、personIdallin-packages/statistics-module/package.json
allin-packages/statistics-module/src/index.ts
allin-packages/statistics-module/src/routes/statistics.routes.ts
allin-packages/statistics-module/src/schemas/statistics.schema.ts
allin-packages/statistics-module/src/services/statistics.service.ts
allin-packages/statistics-module/tests/integration/statistics.integration.test.ts
allin-packages/statistics-module/docs/database-indexes.md
allin-packages/statistics-module/tsconfig.json
allin-packages/statistics-module/vitest.config.ts
allin-packages/order-module/src/routes/order-custom.routes.ts
allin-packages/order-module/src/schemas/order.schema.ts
allin-packages/order-module/src/services/order.service.ts
allin-packages/order-module/tests/integration/order.integration.test.ts
docs/stories/012.004.story.md
pnpm-lock.yaml
company_id 过滤条件虽然核心功能已全部实现,但仍有少量技术债务需要后续迭代中处理:
路由类型兼容性调整
测试模块导入问题
@d8d/user-module、@d8d/file-module 等模块依赖优化
@d8d/allin-disability-module/schemas 的依赖需要调整来自QA代理对已完成故事实施的QA审查结果