# 劳动用工合规 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 | 大数据集分页/流式导出 | 中 |