为用人方小程序补充缺失的API接口并扩展数据库schema,基于现有allin系统移植模块的基础,为企业用户管理功能提供完整的数据支持。
当前相关功能:
数据库分析发现:
users2表只有admin用户,缺乏企业用户与employer_company表的关联order_person_asset表已支持文件关联,但asset_type枚举需要扩展以支持工资视频、个税视频、打卡视频、工作视频等类型disabled_person、employment_order、order_person等表实时计算disabled_person表只有age字段,缺乏birth_date字段用于准确年龄统计disabled_bank_card.file_id关联files表存储个人征信截图employer_company、employment_order、order_person表已包含必要关联关系技术栈:
集成点:
新增/变更内容: 补充用人方小程序所需的9大类API接口,包括:
birth_date字段、扩展asset_type枚举、添加company_id关联字段API路径约定:
所有用人方小程序的API路径统一使用 api/v1/yongren 前缀,与现有管理后台的API路径做区分。例如:
POST /api/v1/yongren/auth/loginGET /api/v1/yongren/company/overviewGET /api/v1/yongren/disability-personGET /api/v1/yongren/disability-person/{id}GET /api/v1/yongren/disability-person/{id}/work-history现有管理后台API保持不变,新增的用人方小程序API使用独立的路由前缀,避免路径冲突。
成功标准:
API路径约定说明:
所有新增的用人方小程序API必须遵循 api/v1/yongren 前缀约定,确保与现有管理后台API路径隔离。每个故事在实现API接口时需确保路径前缀正确。
故事概览: 本史诗包含14个故事,其中12个为核心故事(012-01到012-05、012-08到012-15),1个延期故事(012-06),1个冗余故事(012-07)。核心故事已实现11个,剩余1个待实现。
背景: 现有数据库表结构缺少支持用人方小程序完整功能的关键字段,需要在不影响现有数据的前提下扩展schema。
任务列表:
注:数据库迁移脚本将在上线前统一生成,开发阶段通过TypeORM自动同步。
disabled_person表添加可为空的birth_date字段(DATE类型),用于准确年龄统计order_person_asset表的asset_type枚举,新增视频类型:salary_video(工资视频)、tax_video(个税视频)、checkin_video(打卡视频)、work_video(工作视频)users2表添加可为空的company_id字段(外键引用employer_company.company_id),建立企业用户关联验收标准:
disabled_person表成功添加birth_date字段,现有记录该字段值为NULLorder_person_asset表的asset_type枚举扩展完成,新增视频类型枚举值users2表成功添加company_id字段,现有admin用户的该字段值为NULL背景: 现有auth-module仅支持管理员用户认证,需要扩展以支持企业用户手机号密码登录和企业信息关联。
任务列表:
employer_company表获取)users2表的company_id字段验证企业用户权限验收标准:
背景: 企业需要查看概览统计和人才详细信息,现有company-module和disability-module需要扩展聚合查询接口。
任务列表:
企业统计API(company-module扩展):
employer_company、employment_order、order_person表实时计算企业概览统计人才扩展API(disability-module扩展):
order_person表查询个人的历史工作记录(关联employment_order表)order_person.salary_detail字段和order表查询历史薪资记录disabled_bank_card.file_id关联files表获取征信截图信息order_person_asset表查询关联的视频文件(按扩展的asset_type分类)添加适当的数据库索引优化查询性能
编写单元测试和集成测试
验收标准:
背景: 企业需要订单管理数据统计和整体数据可视化统计,需要扩展order-module和创建统计模块。
任务列表:
订单统计API(order-module扩展):
order_person_asset表(asset_type为checkin_video)统计打卡视频数量数据统计API(创建统计模块或扩展现有模块):
disabled_person.disability_type统计disabled_person.gender统计birth_date字段计算年龄分组(18-25、26-35、36-45、46+)disabled_person.household_province和household_city统计disabled_person.job_status统计order_person.salary_detail统计薪资范围分布优化实时统计查询性能,添加汇总视图或物化视图(如需要)
编写单元测试和集成测试
验收标准:
birth_date字段准确计算背景: 企业需要管理各类工作视频,视频作为订单附件存储在order_person_asset表中(关联files表)。个人维度视频查询已在故事012-03中实现(GET /disability-person/{id}/videos),本故事主要实现企业维度视频查询和批量下载功能。
技术说明: 视频作为订单人员资产(order_person_asset表)存储,asset_type枚举已扩展支持:salary_video(工资视频)、tax_video(个税视频)、checkin_video(打卡视频)、work_video(工作视频)。不需要修改file-module,视频文件通过file_id关联files表。
任务列表:
企业维度视频查询API(在order-module或company-module中实现):
employment_order→order_person→order_person_asset关联链)asset_type视频类型过滤查询批量下载功能:
视频状态管理增强:
order_person_asset表添加status字段(枚举:pending待审核、verified已验证、rejected已拒绝)性能优化:
编写单元测试和集成测试
验收标准:
背景: 企业用户账号信息在管理后台配置,用户无需自助修改手机号、密码等。登录设备管理、登录日志查询、消息通知设置等功能不是当前用人方小程序MVP必需功能,可延期到后期优化阶段实现。
优先级说明: P2优先级,非当前MVP必需功能。企业账号由管理员在管理后台创建和维护,用户使用固定账号登录。安全设置和消息通知功能可在后续版本中根据用户反馈逐步添加。
任务列表:
(延期)添加企业用户专属的设置接口:
(延期)创建或扩展现有的设置模块
(延期)实现设置数据的持久化存储
(延期)添加设置变更的历史记录
(延期)编写单元测试和集成测试
验收标准:
背景: 项目使用@hono/zod-openapi实现OpenAPI文档自动生成,在路由定义时通过Zod Schema添加OpenAPI元数据,文档在server包中自动聚合。各故事已包含测试要求(单元测试≥80%,集成测试≥60%),无需专门的故事进行文档和测试完善。
冗余说明:
@hono/zod-openapi自动生成,路由定义时通过.openapi()方法添加文档元数据建议: 此故事作为基础设施任务已由各故事分别覆盖,无需单独实现。保持各故事的文档和测试要求即可。
背景: 故事012-02和012-03实现的企业用户认证API、企业统计与人才扩展API中,路由路径在模块包内包含了/api/v1/yongren前缀,违反了架构规范。根据项目标准,模块包内路由定义不应包含API前缀,前缀应在server包注册时统一添加。
任务列表:
enterprise-login.route.ts、enterprise-logout.route.ts、enterprise-me.route.ts中的/api/v1/yongren前缀company-statistics.route.ts中的/api/v1/yongren前缀person-extension.route.ts中的/api/v1/yongren前缀/api/v1/yongren前缀验收标准:
/api/v1/yongren前缀,改为/auth/login、/auth/logout、/auth/me/api/v1/yongren前缀,改为/company/overview和/company/{id}/talents/api/v1/yongren前缀,改为/disability-person/{id}/*格式api.route('/api/v1/yongren/...', ...)背景: 故事012-01已在users2表添加company_id字段支持企业用户关联,但管理后台的用户管理表单中缺少配置用户所属企业的交互界面。需要扩展user-management-ui包,在用户创建和编辑表单中添加企业选择字段,支持管理员为用户分配企业关联。
任务列表:
验收标准:
背景: 企业用户需要查看近期分配的人才(最近30天入职),以便快速了解最新的人力资源动态,及时跟进新员工的管理和培养。
任务列表:
近期分配人才查询API开发(company-module扩展):
company-recent-allocations.route.ts,路径为/api/v1/yongren/company/allocations/recentcompany.service.ts中添加getRecentAllocations方法,基于order_person表关联employment_order和disabled_person表查询近期分配人才order_person.join_date在最近30天内,且order_person.work_status = 'working'的记录join_date降序排列employment_order.company_id匹配用户company_id)的数据order_person.join_date、order_person.work_status等字段索引)RecentAllocationsSchemaAPI路由集成和认证中间件配置:
company-statistics.route.ts或新建路由文件中集成近期分配人才查询路由enterpriseAuthMiddleware)company_id验证)/api/v1/yongren/数据库性能优化:
order_person.join_date、order_person.work_status、employment_order.company_idorder_person.order_id + join_date)集成测试开发:
company-recent-allocations.integration.test.tsAPI文档完善:
验收标准:
背景: 当前用人方小程序使用通用人才API接口(/api/v1/disability),该接口返回所有人才数据,未按企业过滤。而企业专用API(/api/v1/yongren/disability-person)只包含扩展接口(工作历史、薪资历史、征信信息、视频关联),缺少基础的人才列表和详情接口。需要补充企业专用的人才列表和详情API,确保企业用户只能访问自己企业的人才数据。
任务列表:
企业专用人才列表API开发(disability-module扩展):
person-extension.route.ts中添加企业专用人才列表路由:GET /,路径为/api/v1/yongren/disability-persondisabled-person.service.ts中添加findAllForCompany方法,基于order_person表关联employment_order和disabled_person表查询企业人才order_person表中关联到该企业(employment_order.company_id匹配用户company_id)的残疾人员工employment_order.company_id匹配用户company_id)的数据order_person.person_id、employment_order.company_id等字段索引)CompanyPersonListSchema企业专用人才详情API开发(disability-module扩展):
person-extension.route.ts中添加企业专用人才详情路由:GET /{id},路径为/api/v1/yongren/disability-person/{id}disabled-person.service.ts中添加findOneForCompany方法,基于order_person表关联验证人员是否属于该企业order_person表关联到该企业(使用现有的validatePersonBelongsToCompany方法)API路由集成和认证中间件配置:
person-extension.route.ts中集成企业专用人才列表和详情路由enterpriseAuthMiddleware)company_id验证)/api/v1/yongren/disability-personenterpriseDisabilityApiRoutes已存在,无需修改)数据库性能优化:
order_person.person_id、order_person.order_id、employment_order.company_idemployment_order.company_id + order_person.person_id)集成测试开发:
person-extension.integration.test.ts(扩展现有测试)API文档完善:
验收标准:
背景: 在企业专用人才列表API(findAllForCompany方法)的实现中,当前SELECT语句缺少birth_date和salary_detail字段,导致用人方小程序的人才列表页无法正确显示年龄和薪资信息。虽然数据库schema已在故事012-01中扩展了disabled_person.birth_date字段,order_person.salary_detail字段也已存在,但API响应中未包含这些字段。
任务列表:
更新SELECT语句和字段映射(disability-module扩展):
disabled-person.service.ts的findAllForCompany方法中,更新SELECT语句包含缺失的字段:
person.birth_date字段,用于计算年龄op.salary_detail字段,用于显示薪资信息birthDate和salaryDetail字段正确包含在返回数据中更新Schema验证和类型定义:
CompanyPersonListSchemaZod Schema,添加birthDate和salaryDetail字段验证前端数据映射更新:
birthDate字段计算年龄(如字段不存在或为null则显示"未知岁")salaryDetail字段显示薪资(如字段不存在或为0则显示"待定")集成测试更新:
person-extension.integration.test.ts中更新测试用例birthDate和salaryDetail字段数据库查询性能验证:
birth_date字段的索引优化年龄相关查询验收标准:
birthDate和salaryDetail字段birthDate计算)和薪资信息birthDate或salaryDetail的记录)背景: 在当前的企业专用人才API中,工作状态筛选存在数据类型不匹配问题:前端传递中文状态("在职"、"待入职"、"离职"),Schema验证为字符串,但数据库disabled_person.job_status字段为smallint类型(0-未在职,1-已在职)。短期修复通过状态映射解决了基本筛选功能,但"待入职"和"离职"都映射到0,无法精确区分。本故事实施长期理想方案:使用order_person.work_status字段(enum类型:'not_working'、'pre_working'、'working'、'resigned')作为统一的工作状态源,解决状态不一致问题。
技术优势分析:
order_person.work_status直接记录人员在订单中的工作状态,更准确反映业务实际WorkStatus枚举、WorkStatusLabels中文映射已存在,可直接使用关键挑战:
order_person表获取最新工作状态(一人可能有多条记录)WorkStatus枚举值('working')需要转换为前端期望的中文状态("在职")任务列表:
查询逻辑重构(disability-module扩展):
disabled-person.service.ts的findAllForCompany方法中,修改查询逻辑:
order_person.work_status而不是disabled_person.job_status作为工作状态源order_person记录(按join_date降序)来确定当前工作状态MAX(op.work_status)或通过子查询获取最新状态WorkStatus枚举值转换为中文状态
筛选条件优化:
jobStatus筛选逻辑,直接使用order_person.work_status进行过滤WorkStatus枚举值的映射:
人才详情API统一:
findOneForCompany方法中,同样使用order_person.work_status作为工作状态源数据库性能优化:
order_person表已有['personId', 'workStatus']、['joinDate']等索引['personId', 'joinDate', 'workStatus']Schema和类型更新:
CompanyPersonListQuerySchema,明确状态筛选选项和映射关系CompanyPersonListSchema和CompanyPersonDetailSchema,使用一致的枚举类型前端状态显示统一:
集成测试全面覆盖:
person-extension.integration.test.ts中新增测试用例,覆盖所有状态场景兼容性保障:
work_status值验收标准:
work_status='working'的人员work_status='pre_working'的人员work_status='resigned'的人员order_person.work_status技术决策说明:
选择order_person.work_status而不是扩展disabled_person.job_status的原因:
order_person表记录了状态变化历史,disabled_person.job_status只是当前快照WorkStatus枚举体系完整,有对应的中文映射和业务描述disabled_person和order_person表中维护相同状态信息回滚保障:
disabled_person.job_status字段不变,作为备用状态源背景: 在当前的订单模块实现中,orderRoutes实例混合了通用CRUD路由(使用authMiddleware)和企业专用路由(使用enterpriseAuthMiddleware),导致前端UI包使用orderRoutes类型创建企业专用API客户端时,会包含通用CRUD路由,存在权限泄露风险。本故事基于auth-module的正确模式(分离authRoutes和enterpriseAuthRoutes),重构订单模块路由,实现清晰的职责分离。
问题分析:
order-custom.routes.ts文件混合了12个通用CRUD路由和6个企业专用路由orderRoutes类型时包含企业专用路由,存在权限泄露风险authRoutes(通用)和enterpriseAuthRoutes(企业专用)任务列表:
order-module/src/routes/index.ts中创建独立的enterpriseOrderRoutes实例,只包含企业专用路由orderRoutes实例只包含通用CRUD路由,移除企业专用路由orderRoutes(通用)和enterpriseOrderRoutes(企业专用)enterpriseOrderRoutesenterpriseOrderRoutes类型验收标准:
orderRoutes实例只包含通用CRUD路由,使用authMiddleware中间件enterpriseOrderRoutes实例包含所有企业专用路由,使用enterpriseAuthMiddleware中间件enterpriseOrderRoutes类型创建企业专用API客户端技术决策说明: 选择路由分离而非混合模式的原因:
兼容性保障:
/api/v1/order,企业专用API使用/api/v1/yongren/order背景: 在故事012.004已实现的数据统计API中存在安全漏洞和路由集成缺失问题:1) statistics-module和order-module的企业统计API接受companyId查询参数,允许覆盖认证用户的企业ID,违反企业数据隔离安全要求;2) statistics-module路由未在server包中注册,导致API端点实际不可用;3) server包未导出EnterpriseStatisticsRoutes类型,前端无法获得类型安全的API客户端。本故事修复这些安全和技术债务问题。
问题分析:
@d8d/allin-statistics-module已实现但未在server包注册,前端无法访问/api/v1/yongren/statistics路径EnterpriseStatisticsRoutes类型,影响前端类型安全任务列表:
companyId查询参数,强制从认证token获取企业IDcompanyId参数@d8d/allin-statistics-module依赖,注册/api/v1/yongren/statistics路由,导出EnterpriseStatisticsRoutes类型验收标准:
companyId查询参数,企业ID强制从认证用户的JWT token中获取companyId查询参数,强制从认证token获取企业ID/api/v1/yongren/statistics@d8d/allin-statistics-module依赖,并导出EnterpriseStatisticsRoutes类型安全原则:
企业数据隔离实现:
enterpriseAuthMiddleware中间件验证company_id字段获取,添加到contextemployment_order→order_person→disabled_person关联链过滤当前状态:史诗核心功能基本完成,13个核心故事中12个已实现(012-01到012-05、012-08到012-12、012-14、012-15),为企业用户管理功能提供了完整的API支持。故事012-12已补充企业专用人才列表API的出生日期和薪资字段,解决人才列表页年龄和薪资显示问题。故事012-14已解决订单模块路由混合问题,实现通用订单API和企业专用订单API的清晰分离。故事012-15解决数据统计API安全漏洞和路由集成问题。新增故事012-13解决工作状态数据一致性问题,采用基于order_person.work_status的长期优化方案。故事012-06(系统设置API)延期至后期优化阶段,故事012-07(API文档与测试完善)作为基础设施任务已由各故事分别覆盖。
故事完成状态:
总体进度:12/15 故事完成(80%) MVP进度:12/13 核心故事完成(92%,排除012-06延期和012-07冗余,包含012-13、012-14、012-15)
最近更新:2025-12-23 - 添加故事012-15(数据统计API安全修复与路由集成):修复statistics-module和order-module企业统计API的安全漏洞(移除companyId查询参数),完成server包路由注册和类型导出,确保企业数据隔离安全性。2025-12-21 - 故事012-14完成:重构订单模块路由,分离通用订单API和企业专用订单API,解决路由混合导致的权限泄露风险,确保前端UI包的类型安全。2025-12-21 - 添加故事012-14(重构订单模块路由):实现通用订单API和企业专用订单API的清晰分离,解决路由混合导致的权限泄露风险,确保前端UI包的类型安全。2025-12-20 - 添加故事012-13(工作状态统一优化):采用基于order_person.work_status的长期优化方案,解决前端中文状态、Schema验证、数据库类型不匹配问题,实现"在职"、"待入职"、"离职"状态的精确筛选和显示。2025-12-20 - 故事012-12完成:企业专用人才列表API的出生日期和薪资字段已补充,人才列表页年龄和薪资显示问题已解决。2025-12-20 - 添加故事012-12(补充企业专用人才列表API的出生日期和薪资字段)以解决人才列表页年龄和薪资显示"未知岁"和"待定"的问题。2025-12-19 - 故事011.003企业专用API使用修复:人才详情页已改为使用enterpriseDisabilityClient企业专用API,确保企业用户数据安全隔离。2025-12-18 - 故事012.011完成,企业专用人才管理API已实现。2025-12-18 - 故事012.010完成,近期分配人才查询API已实现。2025-12-18 - 故事012.009完成,管理后台企业用户配置表单扩展已实现。2025-12-18 - 添加故事012-09(管理后台企业用户配置表单扩展)以解决管理后台用户表单缺失企业选择字段的问题。2025-12-17 - 故事012.005完成,视频管理API扩展已实现。史诗012核心功能全部完成。故事012.004完成,订单统计与数据统计API已实现。史诗012故事优先级调整:故事012-08标记为已完成;故事012-06调整为P2延期(系统设置API);故事012-07标记为冗余(API文档与测试完善);故事012-05重新设计(基于order_person_asset实体)。故事012.003完成,企业统计与人才扩展API已实现;故事012.008创建并完成,路由路径规范修复。
主要风险:
缓解措施:
birth_date字段,不影响现有记录asset_type枚举时保留原有枚举值,确保向后兼容users2表添加可为空的company_id字段,现有admin用户不受影响回滚计划:
birth_date字段:如需要可删除该字段,不影响核心业务数据asset_type枚举扩展:新增的枚举值不影响原有数据,可安全保留company_id字段:如需要可删除该字段,企业用户可暂时通过其他方式关联故事经理交接说明:
请为这个API补充史诗开发详细用户故事。关键考虑:
史诗应在保持系统兼容性的同时,为企业用户管理功能提供完整的API支持,为史诗011(用人方小程序功能实现)奠定基础。