Files
TurboHR/20260723-优化-5.md
selfrelease 0df8aa77d9 feat: AIHR 智能人力资源管理系统初始提交
- 员工花名册管理(加密存储、导入导出)
- 薪酬管理(发薪批次、薪酬模版、加班费计算、工资条)
- 社保公积金(多城市配置、版本管理、基数调整)
- 解聘管理(6步流程、证据链、工作交接)
- AI 助手(合同审查、风险预测、RAG 知识库)
- Dashboard 仪表盘
- 设置与通知
2026-07-24 13:53:11 +08:00

219 lines
9.7 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.
# 劳动用工合规 SaaS — 功能层面优化清单(续二)
> **文档编号**: 20260723-优化-5.md
> **日期**: 2026-07-23
> **来源**: 对 Settings.tsx、export.routes.ts、import.routes.ts 及相关 Portal 页面深入研究后得出
---
## 一、高优先级(核心业务缺陷)
### 1. Settings — 企业信息表单无初始化数据回填
**现状**: `OrgSettings` 组件的 `form` state 用 `useState` 初始化,但初始化值依赖 `orgData?.data?.name`,而 `useState` 的初始值只在组件首次挂载时读取一次。当 `orgData` 异步加载完成后,state 不会自动更新,导致表单始终为空。
**建议**:
- 使用 `useEffect` 监听 `orgData` 变化,异步回填表单数据
- 或将 `form` 改为受控组件:`value={orgData?.data?.name || ''}`
**涉及文件**: `frontend/src/pages/Settings.tsx`
---
### 2. Settings — 用户管理无编辑和禁用能力
**现状**: `UserSettings` 只展示用户列表和添加用户功能,没有编辑已有用户、禁用用户、修改角色的能力。当员工离职时,管理员无法停用其账号,存在安全风险。
**建议**:
- 用户列表增加「编辑」「禁用」操作按钮
- 编辑 Modal 支持修改用户姓名、手机号、角色
- 禁用后用户无法登录,但保留历史操作记录
- 增加「最近登录」列,显示用户活跃状态
**涉及文件**: `frontend/src/pages/Settings.tsx``backend/src/routes/settings.routes.ts`
---
### 3. Import — 导入预览缺失,无法逐条确认
**现状**: Excel 导入直接上传后端解析,用户无法在提交前预览数据。错误只能在导入完成后看到,且只能看到前 10 条。用户可能上传了错误的 Excel 模板,导致大量数据导入失败后才知晓。
**建议**:
- 改为两阶段导入:上传文件 → 后端解析但不写入 → 前端展示预览列表 → 用户确认后才写入
- 预览阶段支持逐行修改(如修正姓名、部门、工资等)
- 增加「模板校验」接口,上传前先检查 Sheet 结构是否符合预期,不符合给出明确提示
- 预览界面区分「正常数据」「警告数据」「错误数据」,用户可选择只导入正常数据
**涉及文件**: `frontend/src/pages/Settings.tsx``backend/src/routes/import.routes.ts`
---
### 4. Export — 导出格式单一,无选择性导出
**现状**: `export/all` 导出全部数据的 JSON 文件,既没有 Excel 格式选择,也没有按模块选择性导出(只导出员工、只导出社保等)。对于企业财务或法务,只需要部分数据时,导出一个大 JSON 不够实用。
**建议**:
- 增加导出格式选择(JSON / Excel
- 增加按模块选择性导出(员工信息、合同信息、薪税记录、社保记录、离职记录)
- Excel 格式应包含表头和格式化,便于直接查看
- 增加导出时间范围过滤(本月/本季度/本年/自定义)
**涉及文件**: `frontend/src/pages/Settings.tsx``backend/src/routes/export.routes.ts`
---
## 二、中优先级(高频操作体验)
### 5. Import — 身份证号哈希校验缺失
**现状**: `import.routes.ts` 中多处使用 `sha256(idCard)` 匹配员工,但身份证号可能存在格式错误(如 15 位、假号、校验位错误)。脏数据进入数据库后无法关联,且没有前置校验。
**建议**:
- 增加身份证号格式校验函数(18 位正则 + 校验位算法)
- 校验不通过的行在预览阶段标红并给出提示,不写入数据库
- 15 位身份证号自动升级为 18 位(基于出生日期补全)
- 导入完成后给出数据质量报告(格式错误数、重名数等)
**涉及文件**: `backend/src/routes/import.routes.ts`
---
### 6. Settings — 通知设置无测试功能
**现状**: 用户配置了企业微信 Webhook 或邮件通知后,没有「发送测试消息」按钮验证配置是否正确。通知发不出去时用户无法定位问题。
**建议**:
- Webhook 配置行增加「测试」按钮,点击后发送测试消息到配置的地址
- 测试结果(成功/失败/错误信息)实时显示在界面上
- 邮件通知增加同样的测试功能
- 配置页面增加连接状态指示器(已连接/未配置/配置错误)
**涉及文件**: `frontend/src/pages/Settings.tsx``backend/src/routes/notification.routes.ts`
---
### 7. Import — 月度导入覆盖逻辑不清晰
**现状**: 月度导入中「考勤记录」用 `upsert` 覆盖同日记录,「加班记录」用 `increment` 累加。这些行为没有在界面上说明,用户可能误以为所有数据都是覆盖,导致数据异常。
**建议**:
- 导入界面的 Sheet 说明中明确标注每种记录的处理策略(覆盖 / 累加 / 跳过)
- 月度导入前增加「本次导入模式」选择:覆盖 / 累加 / 仅新增
- 导入完成后显示各类型记录的处理方式摘要
**涉及文件**: `frontend/src/pages/Settings.tsx``backend/src/routes/import.routes.ts`
---
### 8. Settings — 套餐升级无实际功能
**现状**: `PlanSettings` 展示三个套餐,但「升级」按钮只有 UI 没有实际逻辑。免费版和专业版的功能差异(如 AI 问答次数限制、合同审查)也未在系统中实际执行。
**建议**:
- 实现套餐切换逻辑(可对接 Stripe/微信支付等)
- 在系统各模块中实际执行用量限制(如 AI 问答次数扣减)
- 免费版用户在试用受限功能时提示升级
- 增加用量统计面板,显示本月已用 AI 次数 / 已用存储空间等
**涉及文件**: `frontend/src/pages/Settings.tsx``backend/src/routes/settings.routes.ts``backend/src/middleware/rateLimit.ts`
---
### 9. Import — 错误日志无导出
**现状**: 导入完成后如果有很多错误,只能看到前 10 条提示。用户需要截取或手动记录错误信息来修正 Excel 后重新导入。
**建议**:
- 导入完成后增加「导出错误日志」按钮,生成 CSV/Excel 文件,列出所有错误行及原因
- 错误日志包含:行号、员工姓名/身份证、错误类型、具体原因
- 错误日志文件名包含导入时间戳,便于管理
**涉及文件**: `frontend/src/pages/Settings.tsx``backend/src/routes/import.routes.ts`
---
## 三、低优先级(功能补全)
### 10. Settings — 数据导出缺少敏感字段脱敏
**现状**: `export.routes.ts` 对工资和身份证号做了解密导出,但没有脱敏处理。导出的 JSON 包含完整的身份证号、银行账号、工资数据,存在数据泄露风险。
**建议**:
- 增加「脱敏导出」模式:身份证号显示前 3 后 4 位(如 `110***********1234`),银行账号显示后 4 位
- 敏感字段脱敏后用 `(hidden)` 占位,便于识别
- 仅管理员可导出完整数据,普通 HR 角色只能导出脱敏版本
- 导出日志记录每次导出的操作人、时间、范围
**涉及文件**: `backend/src/routes/export.routes.ts`
---
### 11. Import — 加班类型字段未使用
**现状**: Excel 模板中加班类型是文本字段("工作日加班/休息日加班/法定节假日加班"),但解析时用 `includes()` 字符串匹配判断类型,这种方式无法准确区分多类型混合的加班记录。
**建议**:
- 改为三列独立填写:工作日加班时长、休息日加班时长、法定节假日加班时长
- 每列只填数值,减少歧义
- 或在解析时按分隔符拆分为数组,逐个判断类型
**涉及文件**: `backend/src/routes/import.routes.ts`
---
### 12. Settings — 通知设置 useMemo 错误使用
**现状**: `NotificationSettings``useMemo` 用于副作用(设置 form state),这违反了 React Hooks 的规则。`useMemo` 不应该在副作用中调用,应该用 `useEffect` 替代。
**建议**:
-`useMemo` 替换为 `useEffect`,正确处理数据加载后的表单回填
**涉及文件**: `frontend/src/pages/Settings.tsx`
---
### 13. Import — 社保/公积金增减员未校验基数范围
**现状**: 社保和公积金变动导入时,只记录用户填写的基数,没有校验基数是否在政策允许的上下限范围内(北京 2024 年社保基数下限 6326、上限 33891)。
**建议**:
- 增加基数上下限校验逻辑(可配置城市参数)
- 超出范围的记录在预览阶段标红提示
- 提供默认值建议(低于下限用下限,高于上限用上限)
**涉及文件**: `backend/src/routes/import.routes.ts``backend/src/routes/social.routes.ts`
---
### 14. Export — 导出无压缩,大数据集超时
**现状**: 全量导出 JSON 时,如果员工数量很多(如 1000+ 人),文件可能很大,导出接口响应时间过长甚至超时。没有分页或流式导出机制。
**建议**:
- 增加分页导出:按员工分批导出,每次最多 500 条
- 大数据集使用 Stream API 流式响应,避免内存溢出
- JSON 导出支持压缩(gzip
- 增加导出进度条,前端可实时看到导出进度
**涉及文件**: `backend/src/routes/export.routes.ts`
---
## 四、优先级总览
| 优先级 | 编号 | 功能 | 工作量 |
|--------|------|------|--------|
| P0 | 1 | 企业信息表单数据回填 | 小 |
| P0 | 2 | 用户管理编辑/禁用 | 中 |
| P0 | 3 | 导入预览+逐行编辑 | 大 |
| P0 | 4 | 选择性导出+格式选择 | 中 |
| P1 | 5 | 身份证号格式校验 | 小 |
| P1 | 6 | 通知渠道测试功能 | 中 |
| P1 | 7 | 导入覆盖逻辑说明 | 小 |
| P1 | 8 | 套餐升级+用量限制 | 大 |
| P1 | 9 | 错误日志导出 | 小 |
| P2 | 10 | 导出敏感字段脱敏 | 小 |
| P2 | 11 | 加班类型字段改进 | 小 |
| P2 | 12 | useMemo 替换为 useEffect | 小 |
| P2 | 13 | 社保基数范围校验 | 小 |
| P2 | 14 | 大数据集分页/流式导出 | 中 |