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