Files
TurboHR/20260728-优化.md
freedakgmail fb36b10402 feat: 工作日历/考勤管理重构/AI人力报告/工作台员工分布/筛选优化/导入导出增强
- 新增工作日历页面(月历视图、事件管理、自定义事件)
- 考勤管理重构为6 Tab模块(班次/排班/每日出勤/月度报表/休假记录)
- AI顾问新增人力报告Tab,支持流式生成+Word导出
- 工作台总览新增员工分布统计(性别/年龄/学历/司龄饼图)+部门成本拆分
- 花名册/合同/解聘补偿新增部门和状态筛选
- 薪税管理新增工资表导入模板下载、银行代发CSV导出
- 社保公积金支持多公积金账户类型显示
- 数据导出新增花名册/解聘记录导出,中文文件名编码修复
- 数据导入新增模板下载(员工/增减员/工资表)+错误日志导出
- 移除工作台日历卡片(已迁移至独立工作日历页面)
- 新增20260728/20260729更新测试指导文档
2026-07-29 08:35:29 +08:00

372 lines
17 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 天