feat: idCardHash匹配、Roster分页过滤、社保基数调整修复、Modal size支持、Termination版本对比、UI优化

This commit is contained in:
freedakgmail
2026-07-23 23:26:10 +08:00
parent 32a57873cf
commit 559a567b9b
38 changed files with 4068 additions and 205 deletions
+216
View File
@@ -0,0 +1,216 @@
# 劳动用工合规 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 | 薪税数据导出 | 中 |