1、工作角色：是否只有HR，老板、员工是否也有小程序入口。
2、人力成本分析维度是什么，是否有按工资、社保分类；按部门、产品线分类；
3、人力信息总览不够详细：性别、年龄、学历等分类没看到
4、加班费、考勤：每个企业计算方法不同，是否有灵活的配置比如一小时多少钱的计算方法，不是按照比例
5、年度价值：好高端啊，教育客户会有时间成本，可以考虑简单粗暴点，使用程序前后的成本对比（比如预控风险支付的成本和没有预控风险支付的成本对比，比如没给这个员工上保险，但是有了小程序我及时上了。那么就用无赔付和双倍工资对比）
6、这个小程序主要解决用工的问题，主要角色也是HR，帮助HR去做工作，那么，考虑从不同行业的HR的工作调研入手。比如零工招聘，涉及到商险了，这里只有社保。制造业HR需要更详细的绩效配置，小程序是否可实现。有的计件、有的计时，发放工资的方式等等。有的侧重招聘端，有的侧重日常管理。目前看来，各项分类过于单薄。
7、HR如果报工伤、医疗、失业等，是否需要再小程序上线上处理或者留痕？这里只有一些医疗期计算等，作为工具来使用，那么作为HR，用这个小程序，并没有实现所有员工情况的数据和工作留痕。连接到人力成本分析，数据来源很少。
8、AI辅助这里，是否还需要接入人工端？
9、是否支持直接用AI出具单位人力分析报告？
10、是否考虑按产品付费分段来解锁模块？
11、是否考虑仲裁、出庭等法律服务的付费端口？或者连接人工端去选择其他相关联的服务。
12、工作台没有日历功能
13、创建公积金新政策没有反映
14、唐山社保医保基数上下限不一致，系统无法实现
15、唐山有多公积金比例的公积金账户，系统无法实现
16、批量导入人员，无法选择参保城市，需要逐个为员工添加参保城市，并且“参保城市变更原因（必填）”还是必填项，增加工作量
17、显示条目上限是50条，有些少
18、员工花名册不展示身份证号，也不支持身份证证号筛选，如果企业有重名员工，无法使用
19、“薪税管理”，中的下载模板功能，无法下载模板，点击跳转后打开新网页，显示{"success":false,"error":{"code":"UNAUTHORIZED","message":"未提供认证令牌"}}
20、人员：任职录入、晋升调动，离职，最好有审批流程，合同协议可以有到期提醒及续签审批流程
21、考勤因为看不到东西，我的需求是：班次设定，班表导入，每日出勤查询，月度出勤报表，休假、加班汇总，考勤流程审批及管控
22、薪资社保：需要调薪审核模块，薪资项目不够细化，薪资汇总表及明细表生成
各项查询可按照部门、工作职位，日期等进行细化筛选，并可以生成报表。

---

# TurboHR 优化方案（20260728）

> 基于代码现状分析，按优先级分为 P0（紧急修复）、P1（核心功能补全）、P2（增强优化）三档。

---

## P0：紧急修复（用户已遇到的阻断性问题）

### 1. 模板下载 401 错误（对应第19项）

**现状**：`Settings.tsx` 中的 `GET /import/template` 和 `GET /import/monthly-template` 已修复（使用 `fetch` + Authorization header）。但 `Money.tsx:657` 中下载工资表模板仍使用 `window.open('/api/v1/import/payroll-template', '_blank')`，新窗口不携带 JWT token，后端 `authMiddleware` 返回 401。

**修复方案**：将 `Money.tsx` 中的 `window.open()` 改为 `fetch` + `Blob` 方式下载，携带 Authorization header。

**涉及文件**：
- `frontend/src/pages/Money.tsx:657` — 修改工资表模板下载按钮的 onClick 逻辑
- 涉及端点：`GET /import/payroll-template`

**实现要点**：
```typescript
// Money.tsx 中替换 window.open() 为：
const handleDownloadPayrollTemplate = async () => {
  const token = useAuthStore.getState().accessToken
  const res = await fetch('/api/v1/import/payroll-template', {
    headers: token ? { Authorization: `Bearer ${token}` } : {},
  })
  const blob = await res.blob()
  const url = URL.createObjectURL(blob)
  const a = document.createElement('a')
  a.href = url
  a.download = 'payroll-import-template.xlsx'
  a.click()
  URL.revokeObjectURL(url)
}
```

---

### 2. 员工花名册不展示身份证号、不支持身份证筛选（对应第18项）

**根因**：身份证号加密存储，列表接口返回时不解密；筛选逻辑未支持身份证号。

**修复方案**：
- 列表接口增加身份证号脱敏显示（`138****1234` 格式），仅管理员可查看完整号码
- 列表查询支持按身份证号后4位或完整号码筛选

**涉及文件**：
- `backend/src/routes/roster.routes.ts` — 列表查询增加身份证号筛选参数
- `frontend/src/pages/Roster.tsx` 或 `roster/` 子组件 — 列表增加身份证号脱敏列 + 筛选输入框

---

### 3. 分页上限50条过少（对应第17项）

**现状**：前端 `Pagination.tsx` 默认 `pageSizeOptions = [10, 20, 50]`，最大选项仅50条。后端 `roster.routes.ts` 已支持 `Math.min(pageSize, 999)`，但其他路由（`audit.routes.ts`、`notification.routes.ts` 等）默认20条且无上限校验。

**修复方案**：
- 前端 Pagination 组件 `pageSizeOptions` 增加 100、200 选项
- 后端各列表接口统一增加 `Math.min(pageSize, 200)` 上限校验

**涉及文件**：
- `frontend/src/components/ui/Pagination.tsx:19` — `pageSizeOptions` 默认值改为 `[10, 20, 50, 100, 200]`
- 后端各路由文件 — 统一增加 pageSize 上限校验（`roster.routes.ts` 已支持，其余需补充）

---

## P1：核心功能补全

### 4. 考勤模块完整化（对应第21项）

**现状**：仅有月度考勤确认（AttendanceConfirmation）+ 员工维度考勤记录 CRUD，缺少班次、班表、日报、报表、休假、审批。

**实施方案**：

#### 4.1 班次设定
- 新增 `Shift` 模型：班次名称、上班时间、下班时间、弹性时长、休息时长
- 新增 `GET/POST/PUT/DELETE /attendance/shifts` 端点
- 前端新增班次管理页面

#### 4.2 班表导入
- 导入模板增加"班表"sheet：员工姓名 + 日期 + 班次名称
- 后端解析 Excel 批量创建排班记录
- 新增 `ShiftAssignment` 模型：员工ID + 日期 + 班次ID

#### 4.3 每日出勤查询
- 前端新增日历视图，按日期查看全员出勤状态
- 支持按部门、状态筛选
- 后端新增 `GET /attendance/daily?date=YYYY-MM-DD` 端点

#### 4.4 月度出勤报表
- 后端新增 `GET /attendance/monthly-report?month=YYYY-MM` 端点
- 汇总每员工：出勤天数、迟到次数、早退次数、缺勤天数、加班工时
- 前端报表页面 + Excel 导出

#### 4.5 休假/加班汇总
- 休假申请流程：员工提交 → HR审批 → 记录到 AttendanceRecord
- 加班汇总：从 OvertimeRecord 聚合，关联考勤确认

#### 4.6 考勤审批流程
- 请假申请：`LeaveRequest` 模型，状态机 PENDING → APPROVED/REJECTED
- 加班申请：`OvertimeRequest` 模型，状态机同上
- 前端新增审批列表页面

**涉及文件**：
- `backend/prisma/schema.prisma` — 新增 Shift、ShiftAssignment、LeaveRequest、OvertimeRequest 模型
- `backend/src/routes/attendance.routes.ts` — 扩展端点
- `backend/src/services/attendance.service.ts` — 扩展服务
- `frontend/src/pages/Attendance.tsx` — 重构为多 Tab 页面（班次/排班/日报/月报/审批）

---

### 5. 人事审批流程（对应第20项）

**现状**：仅解聘有完整审批流程（DRAFT → PENDING_APPROVAL → APPROVED/REJECTED → EXECUTING → COMPLETED），晋升调动、薪资调整、合同续签均无审批。

**实施方案**：

#### 5.1 通用审批引擎
- 新增 `ApprovalFlow` 模型：类型（PROMOTION/SALARY_CHANGE/CONTRACT_RENEW/TERMINATION）、状态、发起人、审批人、审批意见
- 通用状态机：DRAFT → PENDING_APPROVAL → APPROVED/REJECTED → EXECUTED
- 支持多级审批（可选）

#### 5.2 晋升调动审批
- 发起调动申请 → 审批通过后执行 `updateEmployee` 部门变更
- 记录审批链到 `EmployeeDepartmentRecord`

#### 5.3 薪资调整审批
- 发起调薪申请 → 审批通过后执行薪资变更 + `SalaryChangeRecord`
- 防止未审批直接改薪

#### 5.4 合同续签审批
- 合同到期提醒触发 → 发起续签申请 → 审批通过后执行 `batchRenew`
- 续签记录关联审批流

**涉及文件**：
- `backend/prisma/schema.prisma` — 新增 ApprovalFlow 模型
- `backend/src/services/approval.service.ts` — 新建通用审批服务
- `backend/src/routes/approval.routes.ts` — 新建审批端点
- `frontend/src/pages/Approvals.tsx` — 新建审批中心页面
- `frontend/src/pages/Termination.tsx` — 解聘审批改用通用审批引擎

---

### 6. 薪资调薪审核 + 薪资项目细化 + 报表（对应第22项）

**现状**：薪资调整直接在 `updateEmployee` 中执行，无审核；薪资项目仅基本工资/加班费/津贴/扣款/奖金5项；无汇总表/明细表生成。

**实施方案**：

#### 6.1 调薪审核模块
- 调薪申请走通用审批流程（与第5项联动）
- 审批通过后才写入 `SalaryChangeRecord` 和员工月薪

#### 6.2 薪资项目细化
- `BatchEntry` 增加更多薪资项字段：岗位工资、绩效工资、工龄工资、交通补贴、餐补、住房补贴、通讯补贴、社保扣款、公积金扣款、个税、其他扣款
- 薪资模板支持自定义项目配置

#### 6.3 薪资汇总表及明细表
- 后端新增 `GET /payroll/batch/:id/summary` — 汇总表（部门维度统计）
- 后端新增 `GET /payroll/batch/:id/detail` — 明细表（全员明细）
- 支持 Excel 导出

**涉及文件**：
- `backend/prisma/schema.prisma` — BatchEntry 扩展字段
- `backend/src/routes/payroll.routes.ts` — 新增报表端点
- `backend/src/services/payroll.service.ts` — 扩展计算逻辑
- `frontend/src/pages/Money.tsx` — 薪资管理页面增加报表导出

---

### 7. 批量导入支持参保城市（对应第16项）

**现状**：导入模板"员工信息"sheet 无"参保城市"列；`createEmployee` 默认 city='北京'。

**修复方案**：
- 导入模板"员工信息"sheet 增加"参保城市"列
- 导入逻辑读取城市值，传入 `createEmployee`
- 批量导入场景下城市变更原因默认"批量导入"，不要求逐个填写

**涉及文件**：
- `backend/src/routes/import.routes.ts` — 模板生成增加城市列 + 导入解析读取城市
- `backend/src/services/contract.service.ts` — `createEmployee` 已支持 city 参数，无需改动

---

### 8. 社保医保基数上下限不一致（对应第14项）

**现状**：`SocialInsuranceConfig` 已有 `medicalBaseMin`/`medicalBaseMax` 字段，`calcSocialInsurance` 已支持独立医疗基数上下限。

**验证**：功能已实现，需确认唐山配置数据是否正确录入。检查前端配置页面是否支持填写独立的医疗基数上下限。

**涉及文件**：
- `frontend/src/pages/Money.tsx` 或社保配置页面 — 确认 UI 暴露了 medicalBaseMin/medicalBaseMax 输入框

---

### 9. 多公积金比例账户（对应第15项）

**现状**：`HousingFundConfig` 每个城市仅一条当前配置，不支持多比例账户。

**修复方案**：
- `HousingFundConfig` 增加 `accountType` 字段（如"基本公积金"/"补充公积金"）
- 同一城市可创建多条不同类型配置，各自独立比例
- 员工可关联多个公积金账户

**涉及文件**：
- `backend/prisma/schema.prisma` — HousingFundConfig 增加 accountType
- `backend/src/routes/social.routes.ts` — 查询/创建支持多账户
- `frontend` 社保配置页面 — 展示多账户列表

---

## P2：增强优化

### 10. 自定义工作日历功能（对应第12项）

**现状**：Dashboard 已有只读的"本月关键日期"列表（展示合同到期、试用期到期等系统自动生成的事件），但不支持自定义工作日历，HR 无法手动添加、编辑或管理日历事件。

**实施方案**：
- 新增 `CalendarEvent` 模型：标题、日期、类型（自定义/系统）、提醒、关联人
- HR 可手动创建/编辑/删除日历事件（如会议、团建、培训、面试等）
- 日历视图从列表升级为月历网格视图，支持点击日期添加事件
- 系统自动事件与自定义事件合并展示，用颜色区分
- 支持按类型筛选

**涉及文件**：
- `backend/prisma/schema.prisma` — 新增 CalendarEvent 模型
- `backend/src/routes/calendar.routes.ts` — 新建 CRUD 端点
- `frontend/src/pages/Dashboard.tsx` — 日历列表升级为月历网格 + 自定义事件管理
- `frontend/src/components/Calendar.tsx` — 新建日历组件

---

### 11. 人力信息总览增强（对应第3项）

**实施方案**：
- Dashboard 增加统计卡片：性别分布、年龄段分布、学历分布、司龄分布
- Employee 模型确认已有 `gender` 字段；增加 `education`、`birthDate`（可从身份证号提取）字段
- 后端新增 `GET /dashboard/workforce-stats` 端点返回聚合数据

**涉及文件**：
- `backend/prisma/schema.prisma` — Employee 增加 education 字段
- `backend/src/routes/dashboard.routes.ts` — 新增聚合统计端点
- `frontend/src/pages/Dashboard.tsx` — 增加分布图表

---

### 12. 人力成本分析维度扩展（对应第2项）

**现状**：`risk.service.ts` 中有成本分析，但维度有限。

**实施方案**：
- 按维度分类：工资成本、社保成本（企业部分）、公积金成本（企业部分）、补偿金成本
- 按部门/岗位聚合
- 支持时间趋势对比（月度/季度/年度）
- 前端增加筛选器：部门、岗位、日期范围

**涉及文件**：
- `backend/src/services/risk.service.ts` — 扩展成本分析函数
- `backend/src/routes/dashboard.routes.ts` — 新增维度查询端点
- `frontend` 人力成本分析页面 — 增加筛选器和图表

---

### 13. 年度价值报告简化（对应第5项）

**实施方案**：
- 增加"前后对比"维度：无系统预估损失 vs 有系统实际损失
- 具体案例：未缴社保双倍工资赔付风险 vs 系统提醒后及时缴纳的零赔付
- 简化展示：用具体案例替代抽象 ROI 数字

**涉及文件**：
- `backend/src/services/risk.service.ts` — `getAnnualValueReport` 增加对比案例
- `frontend/src/pages/tools/AnnualValueReport.tsx` — 增加"前后对比"卡片

---

### 14. AI 人力分析报告（对应第9项）

**实施方案**：
- 新增 `POST /ai/hr-report` 端点
- 基于企业数据（员工概况、风险项、成本分析、考勤统计）自动生成结构化报告
- 报告包含：人力概况、风险提示、成本分析、合规建议、改进方向
- 支持 Markdown 导出

**涉及文件**：
- `backend/src/services/ai.service.ts` — 新增 `generateHRReport` 函数
- `backend/src/routes/ai.routes.ts` — 新增端点
- `frontend/src/pages/AIAssistant.tsx` — 增加"生成报告"Tab

---

### 15. AI 人工端接入（对应第8、11项）

**实施方案**：
- AI 问答中增加"转人工"入口
- 新增 `Consultation` 模型：类型（法律咨询/仲裁代理/出庭服务）、状态、关联AI会话
- 前端 AI 助手页面增加"联系专业律师"按钮
- 付费服务入口（仲裁/出庭）跳转外部表单或显示联系方式

**涉及文件**：
- `backend/prisma/schema.prisma` — 新增 Consultation 模型
- `backend/src/routes/ai.routes.ts` — 新增转人工端点
- `frontend/src/pages/AIAssistant.tsx` — 增加转人工 UI

---

### 16. 查询筛选增强 + 报表生成（对应第23项）

**实施方案**：
- 各列表页面统一增加筛选器：部门、岗位、日期范围
- 后端列表端点统一支持 `department`、`position`、`dateFrom`、`dateTo` 查询参数
- 增加"导出报表"按钮，支持 Excel 导出筛选结果

**涉及文件**：
- 后端各路由文件 — 统一增加筛选参数
- 前端各列表页面 — 增加筛选器组件
- `backend/src/services/export.service.ts` — 新建通用导出服务

---

## 实施优先级排序

| 优先级 | 编号 | 项目 | 预估工作量 |
|--------|------|------|-----------|
| P0 | 1 | 工资表模板下载 401 修复（仅剩 Money.tsx） | 0.5天 |
| P0 | 2 | 花名册身份证号显示+筛选 | 1天 |
| P0 | 3 | 分页上限扩展 | 0.5天 |
| P0 | 7 | 批量导入参保城市 | 0.5天 |
| P0 | 8 | 社保医疗基数上下限验证 | 0.5天 |
| P1 | 4 | 考勤模块完整化 | 5-7天 |
| P1 | 5 | 人事审批流程 | 3-5天 |
| P1 | 6 | 薪资调薪审核+报表 | 3-5天 |
| P1 | 9 | 多公积金比例账户 | 2天 |
| P2 | 10 | 自定义工作日历 | 2-3天 |
| P2 | 11 | 人力信息总览增强 | 2天 |
| P2 | 12 | 人力成本分析维度 | 2-3天 |
| P2 | 13 | 年度价值报告简化 | 1天 |
| P2 | 14 | AI 人力分析报告 | 2天 |
| P2 | 15 | AI 人工端接入 | 2天 |
| P2 | 16 | 查询筛选+报表 | 3天 |

**P0 合计**：约 3 天
**P1 合计**：约 13-19 天
**P2 合计**：约 13-16 天
**总计**：约 29-38 天