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

10 KiB
Raw Blame History

劳动用工合规 SaaS — 功能层面优化清单(续)

文档编号: 20260723-优化-4.md 日期: 2026-07-23 来源: 对 Contracts.tsx、Compensation.tsx、Dashboard.tsx、AIAssistant.tsx 及相关后端服务深入研究后得出


一、高优先级(核心业务缺陷)

1. Contracts — 员工详情抽屉无编辑能力

现状: EmployeeDetailDrawer 只展示员工基本信息、合同历史和附件,无法修改任何字段。员工特殊状态(孕期/医疗期/工伤)只能在「添加员工」时设置,后续无法更新,导致系统记录与实际脱节。

建议:

  • 在员工详情抽屉增加「编辑」按钮,打开编辑表单
  • 特殊状态字段改为可编辑,并记录变更时间
  • 支持修改联系方式、部门等基本信息

涉及文件: frontend/src/pages/Contracts.tsxbackend/src/routes/employee.routes.ts


2. Compensation — 计算器与 Termination.tsx 重复实现

现状: 经济补偿金计算逻辑在 Compensation.tsxSeveranceCalculatorTermination.tsxcostResult 中各实现一遍,且参数略有差异(前者有社平工资封顶,后者没有三倍封顶判断)。维护两套逻辑存在一致性问题。

建议:

  • 将经济补偿金计算逻辑抽取为共享的计算模块(shared/compensation.ts
  • 前端统一调用共享模块,后端 termination.service.tscalculateCompensation 也引用同一逻辑
  • 或改为调用后端 /compensation/calculate 接口,前端只负责展示

涉及文件: frontend/src/pages/Compensation.tsxfrontend/src/pages/Termination.tsxbackend/src/services/termination.service.ts


3. AIAssistant — 会话历史完全丢失

现状: ChatTab 的消息状态只在组件内维护,刷新页面或切换 Tab 后所有对话记录丢失。用户无法回顾之前的 AI 问答,也没法基于历史对话继续追问。

建议:

  • 后端增加会话历史存储表 AIConversation,记录 userId、messages 数组、createdAt
  • 前端加载时从 /ai/conversations 获取历史会话列表
  • 每次新对话自动保存,切换会话可恢复历史上下文
  • 增加「新建对话」和「历史会话」下拉列表

涉及文件: frontend/src/pages/AIAssistant.tsxbackend/src/routes/ai.routes.tsbackend/prisma/schema.prisma


4. Dashboard — 待办事项无批量操作

现状: 待办列表只能逐个「标记完成」或「忽略」。当 HR 需要批量处理同类风险项(如忽略所有合同即将过期的提醒)时,需重复点击 N 次,体验极差。

建议:

  • 增加「全选」复选框和批量操作栏(批量标记完成 / 批量忽略)
  • 增加「按类型批量处理」入口:点击「合同风险」标签,弹出确认框「忽略所有 {N} 项合同风险?」
  • 批量操作调用 PATCH /dashboard/todos/batch-resolvePATCH /dashboard/todos/batch-ignore

涉及文件: frontend/src/pages/Dashboard.tsxbackend/src/routes/dashboard.routes.ts


二、中优先级(高频操作体验)

5. Contracts — 无合同续签入口

现状: 员工详情抽屉只展示合同历史记录,没有「续签合同」按钮。当合同即将到期时,用户需到 Roster 页面操作续签,路径不连贯。

建议:

  • EmployeeDetailDrawer 的合同信息区域增加「续签合同」按钮
  • 点击后弹出续签表单(合同类型、期限、试用期),与 Roster 页面的续签逻辑复用
  • 续签成功后刷新合同历史列表

涉及文件: frontend/src/pages/Contracts.tsxbackend/src/routes/employee.routes.ts


6. AIAssistant — 分析结果无法关联员工

现状: 合同审查、案例匹配的结果是独立展示的文本,无法直接关联到具体员工 profile。当用户想保存 AI 的合同审查结论时,只能复制粘贴,无法在员工详情页查看历史审查记录。

建议:

  • 增加 AIContractReview 表,记录 employeeId、reviewContent、reviewedAt、reviewerId
  • 合同审查完成后,弹出「是否保存到员工档案」选项
  • EmployeeDetailDrawer 增加「AI 审查记录」tab,展示该员工的历史审查结果
  • 案例匹配结果同理,保存到 AICaseMatch

涉及文件: frontend/src/pages/AIAssistant.tsxbackend/prisma/schema.prismabackend/src/routes/ai.routes.ts


7. Compensation — 无历史计算记录

现状: 计算器每次输入都是新计算,无法查看之前的计算历史。用户想对比同一员工在不同离职日期下的补偿金额变化,只能手动记录或重新输入。

建议:

  • 后端增加 CompensationCalculation 表,记录 employeeId、parameters、result、calculatedAt
  • 前端计算完成后自动保存,点击「历史记录」可查看该员工的所有试算结果
  • 历史记录支持按日期排序和参数对比视图

涉及文件: frontend/src/pages/Compensation.tsxbackend/prisma/schema.prisma


8. Dashboard — 风险分布数据粒度太粗

现状: riskDistribution 只返回三个维度的数量(contract/salary/termination),用户无法直接看到是哪些员工/哪些合同触发了风险。当 HR 想处理高风险项时,需要跳转到花名册逐个排查。

建议:

  • GET /dashboard 返回值增加 topRisks 字段,包含最近 5 条高风险项的摘要(员工名、风险类型、描述)
  • 风险分布卡片改为可点击,点击后展开风险列表并支持快捷操作(查看详情 / 标记已处理)
  • 增加「高风险员工」快捷入口,跳转到花名册并预设高风险筛选条件

涉及文件: frontend/src/pages/Dashboard.tsxbackend/src/services/risk.service.ts


9. AIAssistant — 风险预测无触发条件

现状: PredictTab 页面加载时自动调用 /ai/predict,没有用户输入接口。预测结果是一段文本,用户无法针对性地查看某个员工或某类风险。

建议:

  • 将风险预测改为用户可选范围的上下文查询:选择「全部员工 / 某部门 / 某员工」,选择「风险类型 / 合同 / 薪酬 / 解聘」
  • 预测结果结构化展示:列出每个风险项、风险等级、建议操作
  • 支持将预测结果直接转化为待办事项

涉及文件: frontend/src/pages/AIAssistant.tsxbackend/src/routes/ai.routes.tsbackend/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 级联:只在 overviewpayroll 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.tsxbackend/prisma/schema.prisma


14. Dashboard — 薪税 tab 缺少导出功能

现状: 薪税 tab 展示本月工资汇总数据,但没有「导出」功能。企业财务需要这些数据进行账务处理时,只能截图或手动记录。

建议:

  • 在薪税 tab 右上角增加「导出」按钮
  • 支持导出 Excel 格式,包含工资构成明细、扣减项、企业成本等所有展示字段
  • 可选导出范围:仅汇总 / 含明细 / 含历史对比

涉及文件: frontend/src/pages/Dashboard.tsxbackend/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 薪税数据导出