# 史诗012 - 用人方小程序API补充与数据库扩展

## 史诗目标
为用人方小程序补充缺失的API接口并扩展数据库schema，基于现有allin系统移植模块的基础，为企业用户管理功能提供完整的数据支持。

## 史诗描述

### 现有系统上下文

**当前相关功能：**
- **mini项目**：基础小程序前端，现有登录、注册、个人资料等基础页面
- **API客户端**：已集成auth、user、role、file模块的RPC客户端（api.ts）
- **史诗7,8,9,10成果**：已移植allin系统的7个后端模块和对应UI模块（channel、company、disability_person、order、platform、salary等）
- **数据库现状**：PostgreSQL数据库包含19个业务表，已支持核心业务数据存储

**数据库分析发现：**
- **企业用户认证缺失**：`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`表已包含必要关联关系

**技术栈：**
- 后端：TypeScript、Hono、Zod OpenAPI、TypeORM
- 数据库：PostgreSQL 17
- API通信：基于Hono RPC的API客户端模式
- 测试：Vitest（后端模块使用Vitest）
- 包管理：pnpm workspace

**集成点：**
- 基于史诗7,8,9,10移植的allin系统模块进行扩展
- 保持现有数据库schema的向后兼容性
- 遵循现有的模块结构和API设计模式

### 增强详情

**新增/变更内容：**
补充用人方小程序所需的9大类API接口，包括：
1. 数据库schema扩展：添加`birth_date`字段、扩展`asset_type`枚举、添加`company_id`关联字段
2. 企业用户认证API：支持企业用户手机号密码登录、获取企业用户信息
3. 企业统计API：企业概览统计、企业维度人才统计
4. 人才扩展API：工作历史查询、薪资历史查询、个人征信信息查询、视频关联查询
5. 订单统计API：打卡数据统计、视频统计、企业维度订单查询
6. 数据统计API：残疾类型分布、性别分布、年龄分布、户籍分布、在职状态统计、薪资分布
7. 视频管理API：视频分类管理、企业/个人维度视频查询、批量下载功能
8. 系统设置API：账号信息管理、安全设置、消息通知设置
9. API文档与测试：OpenAPI文档、TypeScript类型定义、单元测试

**API路径约定：**
所有用人方小程序的API路径统一使用 `api/v1/yongren` 前缀，与现有管理后台的API路径做区分。例如：
- 企业用户登录：`POST /api/v1/yongren/auth/login`
- 企业概览统计：`GET /api/v1/yongren/company/overview`
- 人才工作历史：`GET /api/v1/yongren/disability-person/{id}/work-history`

现有管理后台API保持不变，新增的用人方小程序API使用独立的路由前缀，避免路径冲突。

**成功标准：**
1. 所有补充API功能完整，符合用人方小程序需求
2. 数据库schema扩展不影响现有数据操作
3. API与现有allin系统移植模块无缝集成
4. 通过Vitest测试验证，包括单元测试和集成测试
5. 提供完整的OpenAPI文档和TypeScript类型定义

## 故事列表

**API路径约定说明：**
所有新增的用人方小程序API必须遵循 `api/v1/yongren` 前缀约定，确保与现有管理后台API路径隔离。每个故事在实现API接口时需确保路径前缀正确。

### 故事012-01：数据库schema扩展
**背景：** 现有数据库表结构缺少支持用人方小程序完整功能的关键字段，需要在不影响现有数据的前提下扩展schema。

**任务列表：**

注：数据库迁移脚本将在上线前统一生成，开发阶段通过TypeORM自动同步。
1. 在`disabled_person`表添加可为空的`birth_date`字段（DATE类型），用于准确年龄统计
2. 扩展`order_person_asset`表的`asset_type`枚举，新增视频类型：`salary_video`（工资视频）、`tax_video`（个税视频）、`checkin_video`（打卡视频）、`work_video`（工作视频）
3. 在`users2`表添加可为空的`company_id`字段（外键引用`employer_company.company_id`），建立企业用户关联
4. 更新对应的TypeORM实体定义
5. 验证现有数据不受影响，新增字段可为空

**验收标准：**
- [ ] `disabled_person`表成功添加`birth_date`字段，现有记录该字段值为NULL
- [ ] `order_person_asset`表的`asset_type`枚举扩展完成，新增视频类型枚举值
- [ ] `users2`表成功添加`company_id`字段，现有admin用户的该字段值为NULL
- [ ] TypeORM实体定义更新完成
- [ ] 现有业务功能不受影响，测试通过

### 故事012-02：企业用户认证API扩展
**背景：** 现有auth-module仅支持管理员用户认证，需要扩展以支持企业用户手机号密码登录和企业信息关联。

**任务列表：**
1. 扩展auth-module，添加企业用户手机号密码登录接口
2. 添加企业用户退出登录接口
3. 添加获取企业用户信息接口，包含关联的企业详情（从`employer_company`表获取）
4. 基于`users2`表的`company_id`字段验证企业用户权限
5. 更新认证中间件，支持企业用户身份识别
6. 添加企业用户注册接口（如需要）
7. 编写单元测试和集成测试

**验收标准：**
- [ ] 企业用户可使用手机号和密码成功登录
- [ ] 企业用户登录后可获取包含企业详情的用户信息
- [ ] 企业用户可成功退出登录
- [ ] 认证中间件正确识别企业用户身份
- [ ] 企业用户权限验证逻辑正确
- [ ] 所有新增接口通过单元测试和集成测试
- [ ] API文档完整，包含OpenAPI定义和TypeScript类型

### 故事012-03：企业统计与人才扩展API
**背景：** 企业需要查看概览统计和人才详细信息，现有company-module和disability-module需要扩展聚合查询接口。

**任务列表：**
1. **企业统计API**（company-module扩展）：
   - 基于`employer_company`、`employment_order`、`order_person`表实时计算企业概览统计
   - 接口返回：在职人员数、进行中订单数、已完成订单数、累计订单数
   - 企业维度人才统计：分配人才列表、人才状态分布

2. **人才扩展API**（disability-module扩展）：
   - 工作历史查询：基于`order_person`表查询个人的历史工作记录（关联`employment_order`表）
   - 薪资历史查询：基于`order_person.salary_detail`字段和`order`表查询历史薪资记录
   - 个人征信信息查询：基于`disabled_bank_card.file_id`关联`files`表获取征信截图信息
   - 视频关联查询：基于`order_person_asset`表查询关联的视频文件（按扩展的asset_type分类）

3. 添加适当的数据库索引优化查询性能
4. 编写单元测试和集成测试

**验收标准：**
- [ ] 企业概览统计接口返回正确的在职人员数、订单数等数据
- [ ] 企业维度人才统计接口返回分配人才列表和状态分布
- [ ] 人才工作历史查询接口返回个人的历史工作记录
- [ ] 人才薪资历史查询接口返回历史薪资记录
- [ ] 个人征信信息查询接口返回征信截图信息
- [ ] 视频关联查询接口返回按类型分类的关联视频列表
- [ ] 查询性能优化，添加必要的数据索引
- [ ] 所有接口通过单元测试和集成测试

### 故事012-04：订单统计与数据统计API
**背景：** 企业需要订单管理数据统计和整体数据可视化统计，需要扩展order-module和创建统计模块。

**任务列表：**
1. **订单统计API**（order-module扩展）：
   - 打卡数据统计：基于`order_person_asset`表（asset_type为`checkin_video`）统计打卡视频数量
   - 视频统计：按视频类型（工资、个税、打卡、工作）分类统计
   - 企业维度订单查询：支持按企业ID过滤订单列表，包含订单状态、人员关联等详细信息

2. **数据统计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`统计薪资范围分布

3. 优化实时统计查询性能，添加汇总视图或物化视图（如需要）
4. 编写单元测试和集成测试

**验收标准：**
- [ ] 订单打卡数据统计接口返回正确的打卡视频数量
- [ ] 订单视频统计接口按类型分类返回统计结果
- [ ] 企业维度订单查询接口支持按企业ID过滤，返回完整订单信息
- [ ] 所有数据统计接口返回正确的统计结果
- [ ] 年龄统计基于`birth_date`字段准确计算
- [ ] 统计查询性能良好，大数据量下响应时间可接受
- [ ] 所有接口通过单元测试和集成测试

### 故事012-05：视频管理API扩展
**背景：** 企业需要管理各类工作视频，现有file-module需要扩展以支持视频分类管理和批量下载。

**任务列表：**
1. 扩展file-module或创建视频管理模块：
   - 视频分类管理：支持按扩展的asset_type枚举分类查询
   - 企业维度视频查询：基于企业ID查询关联的所有视频（通过`employment_order`→`order_person`→`order_person_asset`关联链）
   - 个人维度视频查询：基于人员ID查询关联的视频
   - 批量下载功能：支持按企业或个人维度批量下载视频文件

2. 添加视频元数据管理（上传时间、类型、关联订单/人员等）
3. 优化视频查询性能，添加适当的数据库索引
4. 实现视频文件流式下载，支持大文件高效传输
5. 编写单元测试和集成测试

**验收标准：**
- [ ] 视频分类查询接口支持按asset_type过滤
- [ ] 企业维度视频查询接口返回企业关联的所有视频
- [ ] 个人维度视频查询接口返回个人关联的视频
- [ ] 批量下载功能支持按企业或个人维度下载多个视频文件
- [ ] 视频元数据管理完整，包含上传时间、类型等
- [ ] 视频查询性能优化，添加必要的数据索引
- [ ] 所有接口通过单元测试和集成测试

### 故事012-06：系统设置API
**背景：** 企业用户需要管理账号设置、安全设置和消息通知，需要添加企业用户专属的设置接口。

**任务列表：**
1. 添加企业用户专属的设置接口：
   - 账号信息管理：修改手机号、密码等
   - 安全设置：登录设备管理、登录日志查询
   - 消息通知设置：订单状态通知、人才分配通知等开关设置

2. 创建或扩展现有的设置模块
3. 实现设置数据的持久化存储
4. 添加设置变更的历史记录
5. 编写单元测试和集成测试

**验收标准：**
- [ ] 账号信息管理接口支持修改手机号、密码等
- [ ] 安全设置接口提供登录设备管理和登录日志查询
- [ ] 消息通知设置接口支持各类通知的开关控制
- [ ] 设置数据正确持久化存储
- [ ] 设置变更历史记录完整
- [ ] 所有接口通过单元测试和集成测试

### 故事012-07：API文档与测试完善
**背景：** 所有新增API需要完整的文档和测试覆盖，确保代码质量和可维护性。

**任务列表：**
1. 为所有新增API编写完整的OpenAPI文档
2. 生成TypeScript类型定义文件，供前端使用
3. 编写全面的单元测试，覆盖正常流程和异常情况
4. 编写集成测试，验证API与数据库的集成
5. 添加API性能测试，确保响应时间符合要求
6. 更新模块的README文档，说明新增功能
7. 验证所有测试通过，代码覆盖率达标

**验收标准：**
- [ ] 所有新增API都有完整的OpenAPI文档
- [ ] TypeScript类型定义文件生成完成
- [ ] 单元测试覆盖率达标（建议80%以上）
- [ ] 集成测试覆盖主要业务场景
- [ ] API性能测试通过，响应时间符合要求
- [ ] 模块README文档更新完成
- [ ] 所有测试通过，代码质量检查通过

## 兼容性要求

- [ ] 现有数据库schema变化保持向后兼容
- [ ] 现有API接口不受影响，功能正常
- [ ] 新增字段可为空，不影响现有数据
- [ ] 枚举扩展保留原有枚举值，确保兼容
- [ ] 现有业务逻辑不受影响
- [ ] 性能影响最小化，不影响现有功能响应速度

## 风险缓解

**主要风险：**
1. **数据库schema变更风险**：新增字段和枚举扩展可能影响现有数据操作和查询
2. **API集成风险**：新API可能影响现有模块的稳定性
3. **性能风险**：实时统计查询可能影响数据库性能
4. **兼容性风险**：新增功能可能影响现有系统集成

**缓解措施：**
1. **数据库变更分步实施**：
   - 先添加可为空的`birth_date`字段，不影响现有记录
   - 扩展`asset_type`枚举时保留原有枚举值，确保向后兼容
   - `users2`表添加可为空的`company_id`字段，现有admin用户不受影响
2. **逐步集成**：每个故事独立实现和测试，分阶段集成验证
3. **性能优化**：
   - 实时统计查询添加适当的数据库索引
   - 考虑使用物化视图缓存高频统计结果
   - 大数据量查询添加分页和查询条件优化
4. **兼容性保障**：
   - 保持现有API接口不变
   - 新增功能通过新接口提供
   - 充分测试现有功能回归

**回滚计划：**
1. 如果新增功能导致严重问题，可临时禁用新增API路由
2. 数据库schema变更支持可逆回滚：
   - `birth_date`字段：如需要可删除该字段，不影响核心业务数据
   - `asset_type`枚举扩展：新增的枚举值不影响原有数据，可安全保留
   - `company_id`字段：如需要可删除该字段，企业用户可暂时通过其他方式关联
3. 数据库迁移脚本将在上线前统一生成，开发阶段通过TypeORM自动同步
4. API客户端变更可通过版本控制回退到上一个稳定版本

## 完成定义

- [ ] 所有7个故事完成，验收标准全部满足
- [ ] 数据库schema扩展完成，不影响现有数据
- [ ] 所有补充API功能完整，符合用人方小程序需求
- [ ] API与现有allin系统移植模块无缝集成
- [ ] 通过Vitest测试验证，单元测试和集成测试覆盖率达标
- [ ] 提供完整的OpenAPI文档和TypeScript类型定义
- [ ] 性能测试通过，查询响应时间符合要求
- [ ] 代码符合项目编码规范，通过代码审查

## 依赖关系

- 依赖史诗7,8,9,10移植的API模块作为基础
- 依赖现有数据库schema，在基础上进行扩展
- 故事012-01（数据库schema扩展）是其他故事的基础依赖
- 故事012-07（API文档与测试）依赖其他所有故事完成
- 史诗011（用人方小程序功能实现）依赖本史诗完成

## 测试策略

1. **单元测试**：对每个新增API接口、服务函数、工具函数进行Vitest单元测试
2. **集成测试**：测试API与数据库的集成，验证数据操作正确性
3. **性能测试**：验证实时统计查询的性能，确保响应时间符合要求
4. **兼容性测试**：验证新增功能不影响现有API接口
5. **回归测试**：确保现有业务功能不受影响
6. **数据库schema变更测试**：验证数据库schema变更的正确性和兼容性

## 执行顺序建议

1. **先完成故事012-01**：数据库schema扩展是基础，其他故事依赖
2. **然后并行执行故事012-02至012-06**：这些故事相对独立，可并行开发
3. **最后完成故事012-07**：在所有API实现完成后进行文档和测试完善
4. **按模块分组**：同一模块的扩展建议由同一开发者完成，确保一致性

---

**故事经理交接说明：**

请为这个API补充史诗开发详细用户故事。关键考虑：

- 这是对现有allin系统移植模块的API扩展，技术栈：TypeScript、Hono、Zod OpenAPI、TypeORM、PostgreSQL
- 集成点：史诗7,8,9,10移植的allin系统API模块（channel、company、disability_person、order、platform、salary等）
- 现有模式：遵循现有模块的API设计模式、数据库schema模式
- 关键兼容要求：不影响现有API接口，数据库schema变化保持向后兼容
- 每个故事必须验证现有功能保持完整

史诗应在保持系统兼容性的同时，为企业用户管理功能提供完整的API支持，为史诗011（用人方小程序功能实现）奠定基础。