Files
TurboHR/20260723-优化-4.md
T

216 lines
10 KiB
Markdown
Raw 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.
# 劳动用工合规 SaaS — 功能层面优化清单(续)
> **文档编号**: 20260723-优化-4.md
> **日期**: 2026-07-23
> **来源**: 对 Contracts.tsx、Compensation.tsx、Dashboard.tsx、AIAssistant.tsx 及相关后端服务深入研究后得出
---
## 一、高优先级(核心业务缺陷)
### 1. Contracts — 员工详情抽屉无编辑能力
**现状**: `EmployeeDetailDrawer` 只展示员工基本信息、合同历史和附件,无法修改任何字段。员工特殊状态(孕期/医疗期/工伤)只能在「添加员工」时设置,后续无法更新,导致系统记录与实际脱节。
**建议**:
- 在员工详情抽屉增加「编辑」按钮,打开编辑表单
- 特殊状态字段改为可编辑,并记录变更时间
- 支持修改联系方式、部门等基本信息
**涉及文件**: `frontend/src/pages/Contracts.tsx``backend/src/routes/employee.routes.ts`
---
### 2. Compensation — 计算器与 Termination.tsx 重复实现
**现状**: 经济补偿金计算逻辑在 `Compensation.tsx``SeveranceCalculator``Termination.tsx``costResult` 中各实现一遍,且参数略有差异(前者有社平工资封顶,后者没有三倍封顶判断)。维护两套逻辑存在一致性问题。
**建议**:
- 将经济补偿金计算逻辑抽取为共享的计算模块(`shared/compensation.ts`
- 前端统一调用共享模块,后端 `termination.service.ts``calculateCompensation` 也引用同一逻辑
- 或改为调用后端 `/compensation/calculate` 接口,前端只负责展示
**涉及文件**: `frontend/src/pages/Compensation.tsx``frontend/src/pages/Termination.tsx``backend/src/services/termination.service.ts`
---
### 3. AIAssistant — 会话历史完全丢失
**现状**: `ChatTab` 的消息状态只在组件内维护,刷新页面或切换 Tab 后所有对话记录丢失。用户无法回顾之前的 AI 问答,也没法基于历史对话继续追问。
**建议**:
- 后端增加会话历史存储表 `AIConversation`,记录 userId、messages 数组、createdAt
- 前端加载时从 `/ai/conversations` 获取历史会话列表
- 每次新对话自动保存,切换会话可恢复历史上下文
- 增加「新建对话」和「历史会话」下拉列表
**涉及文件**: `frontend/src/pages/AIAssistant.tsx``backend/src/routes/ai.routes.ts``backend/prisma/schema.prisma`
---
### 4. Dashboard — 待办事项无批量操作
**现状**: 待办列表只能逐个「标记完成」或「忽略」。当 HR 需要批量处理同类风险项(如忽略所有合同即将过期的提醒)时,需重复点击 N 次,体验极差。
**建议**:
- 增加「全选」复选框和批量操作栏(批量标记完成 / 批量忽略)
- 增加「按类型批量处理」入口:点击「合同风险」标签,弹出确认框「忽略所有 {N} 项合同风险?」
- 批量操作调用 `PATCH /dashboard/todos/batch-resolve``PATCH /dashboard/todos/batch-ignore`
**涉及文件**: `frontend/src/pages/Dashboard.tsx``backend/src/routes/dashboard.routes.ts`
---
## 二、中优先级(高频操作体验)
### 5. Contracts — 无合同续签入口
**现状**: 员工详情抽屉只展示合同历史记录,没有「续签合同」按钮。当合同即将到期时,用户需到 Roster 页面操作续签,路径不连贯。
**建议**:
-`EmployeeDetailDrawer` 的合同信息区域增加「续签合同」按钮
- 点击后弹出续签表单(合同类型、期限、试用期),与 Roster 页面的续签逻辑复用
- 续签成功后刷新合同历史列表
**涉及文件**: `frontend/src/pages/Contracts.tsx``backend/src/routes/employee.routes.ts`
---
### 6. AIAssistant — 分析结果无法关联员工
**现状**: 合同审查、案例匹配的结果是独立展示的文本,无法直接关联到具体员工 profile。当用户想保存 AI 的合同审查结论时,只能复制粘贴,无法在员工详情页查看历史审查记录。
**建议**:
- 增加 `AIContractReview` 表,记录 employeeId、reviewContent、reviewedAt、reviewerId
- 合同审查完成后,弹出「是否保存到员工档案」选项
-`EmployeeDetailDrawer` 增加「AI 审查记录」tab,展示该员工的历史审查结果
- 案例匹配结果同理,保存到 `AICaseMatch`
**涉及文件**: `frontend/src/pages/AIAssistant.tsx``backend/prisma/schema.prisma``backend/src/routes/ai.routes.ts`
---
### 7. Compensation — 无历史计算记录
**现状**: 计算器每次输入都是新计算,无法查看之前的计算历史。用户想对比同一员工在不同离职日期下的补偿金额变化,只能手动记录或重新输入。
**建议**:
- 后端增加 `CompensationCalculation` 表,记录 employeeId、parameters、result、calculatedAt
- 前端计算完成后自动保存,点击「历史记录」可查看该员工的所有试算结果
- 历史记录支持按日期排序和参数对比视图
**涉及文件**: `frontend/src/pages/Compensation.tsx``backend/prisma/schema.prisma`
---
### 8. Dashboard — 风险分布数据粒度太粗
**现状**: `riskDistribution` 只返回三个维度的数量(contract/salary/termination),用户无法直接看到是哪些员工/哪些合同触发了风险。当 HR 想处理高风险项时,需要跳转到花名册逐个排查。
**建议**:
- `GET /dashboard` 返回值增加 `topRisks` 字段,包含最近 5 条高风险项的摘要(员工名、风险类型、描述)
- 风险分布卡片改为可点击,点击后展开风险列表并支持快捷操作(查看详情 / 标记已处理)
- 增加「高风险员工」快捷入口,跳转到花名册并预设高风险筛选条件
**涉及文件**: `frontend/src/pages/Dashboard.tsx``backend/src/services/risk.service.ts`
---
### 9. AIAssistant — 风险预测无触发条件
**现状**: `PredictTab` 页面加载时自动调用 `/ai/predict`,没有用户输入接口。预测结果是一段文本,用户无法针对性地查看某个员工或某类风险。
**建议**:
- 将风险预测改为用户可选范围的上下文查询:选择「全部员工 / 某部门 / 某员工」,选择「风险类型 / 合同 / 薪酬 / 解聘」
- 预测结果结构化展示:列出每个风险项、风险等级、建议操作
- 支持将预测结果直接转化为待办事项
**涉及文件**: `frontend/src/pages/AIAssistant.tsx``backend/src/routes/ai.routes.ts``backend/src/services/ai.service.ts`
---
## 三、低优先级(功能补全)
### 10. Contracts — 附件上传无类型校验
**现状**: `EmployeeDetailDrawer` 的文件上传没有文件类型和大小限制,用户可以上传任意格式和大小的文件。合同扫描件以 DataURL 存储,过大的文件会影响数据库性能。
**建议**:
- 上传前增加文件类型过滤(仅允许 PDF、JPG、PNG、HEIC),并在界面上显示支持的格式
- 增加大小限制提示(最大 10MB),上传前校验文件大小,超限给出友好提示
- 建议后续改用文件存储服务(如 S3/OSS),避免大文件塞满数据库
**涉及文件**: `frontend/src/pages/Contracts.tsx`
---
### 11. Dashboard — 刷新按钮语义不准确
**现状**: `refresh` 按钮固定显示在顶部,但只有 `overview` tab 下有意义,其他 tabpayroll/risk/task)点击它也会触发 `refetch()`,但用户不清楚刷新的是什么数据。
**建议**:
- 将刷新按钮改为 Tab 级联:只在 `overview``payroll` tab 下显示刷新按钮(这两个 tab 依赖 `dashboard` 查询)
- 或在点击刷新时显示 toast 提示「已刷新 {tab名称} 数据」
- 或者将刷新按钮移到具体数据区域内部,而非全局顶部
**涉及文件**: `frontend/src/pages/Dashboard.tsx`
---
### 12. Compensation — 双倍工资计算逻辑不完整
**现状**: `DoubleSalaryCalculator` 假设入职 1 年内必须签合同,只考虑了「入职第 2 个月起」的双倍工资。实际场景更复杂:续签劳动合同时首份合同到期后未及时续签、合同到期后继续用工但未签新合同等情况也会产生双倍工资。
**建议**:
- 增加「合同到期后续签」场景的支持,输入首份合同到期日期,判断是否应签未签
- 增加「实际用工但未签合同」的日期范围输入
- 将双倍工资计算逻辑同步到后端,支持更复杂的法律判断
**涉及文件**: `frontend/src/pages/Compensation.tsx`
---
### 13. AIAssistant — 合同审查无版本对比
**现状**: 用户粘贴合同文本后审查,审查结果是一段文本。如果同一合同经过修改后再次审查,无法对比两次审查结果的差异。
**建议**:
- 增加「历史审查」列表,展示该合同的所有审查版本及时间
- 选择两个历史版本后,展示新增问题、已解决问题、变化点
- 支持审查结论的结构化存储(问题类型、条款位置、严重程度)
**涉及文件**: `frontend/src/pages/AIAssistant.tsx``backend/prisma/schema.prisma`
---
### 14. Dashboard — 薪税 tab 缺少导出功能
**现状**: 薪税 tab 展示本月工资汇总数据,但没有「导出」功能。企业财务需要这些数据进行账务处理时,只能截图或手动记录。
**建议**:
- 在薪税 tab 右上角增加「导出」按钮
- 支持导出 Excel 格式,包含工资构成明细、扣减项、企业成本等所有展示字段
- 可选导出范围:仅汇总 / 含明细 / 含历史对比
**涉及文件**: `frontend/src/pages/Dashboard.tsx``backend/src/routes/export.routes.ts`
---
## 四、优先级总览
| 优先级 | 编号 | 功能 | 工作量 |
|--------|------|------|--------|
| P0 | 1 | 员工详情可编辑 | 中 |
| P0 | 2 | 计算逻辑统一(避免重复实现) | 小 |
| P0 | 3 | AI 会话历史保存 | 中 |
| P0 | 4 | 待办批量操作 | 小 |
| P1 | 5 | 合同续签入口(详情页) | 小 |
| P1 | 6 | AI 结果关联员工档案 | 中 |
| P1 | 7 | 计算历史记录 | 中 |
| P1 | 8 | 风险分布可下钻 | 中 |
| P1 | 9 | 风险预测上下文查询 | 中 |
| P2 | 10 | 附件上传类型校验 | 小 |
| P2 | 11 | 刷新按钮 Tab 级联 | 小 |
| P2 | 12 | 双倍工资计算补全 | 中 |
| P2 | 13 | 合同审查版本对比 | 中 |
| P2 | 14 | 薪税数据导出 | 中 |