# TurboHR 系统优化清单（20260804）

> 基于用户反馈的 23 项问题，逐条对照系统代码进行检查，记录现状、问题及优化方案。

---

## 一、花名册模块

### 1.1 搜索功能（反馈 #7：无身份证号搜索）

**现状**：后端 `roster.routes.ts:58` 已支持身份证后N位搜索（`isIdCardSearch` 逻辑：输入 ≥2 位数字时按身份证尾号匹配），前端搜索框 placeholder 已提示"搜索姓名、部门或身份证后4位"。

**结论**：✅ 已实现，无需修改。

### 1.2 身份证号显示（反馈 #5：身份证号隐藏，不便于复制）

**现状**：`Roster.tsx:466` 显示 `e.idCardMasked`（脱敏格式 `110****1234`），完整身份证号需点进员工详情才能查看。

**问题**：用户需要复制完整身份证号到其他模块（如开具离职证明），操作不便。

**优化方案**：
- 花名册列表中身份证号列增加「点击复制」功能：点击脱敏号码自动复制完整身份证号到剪贴板，toast 提示"已复制"
- 员工详情页 BasicInfo 中身份证号也增加复制按钮

**涉及文件**：`frontend/src/pages/Roster.tsx:466`、`frontend/src/pages/roster/BasicInfo.tsx`

### 1.3 显示字段不足（反馈 #6、#20：显示信息太少，缺少合同起止时间、社保状态）

**现状**：`Roster.tsx:431-559` 表格列包含姓名、身份证号（脱敏）、部门、状态、月薪、合同类型、合同状态，但合同到期日期列（`th` 和 `td`）使用了 `hidden` CSS 类未显示。入职日期、离职日期同样隐藏。社保缴纳状态未展示。

**问题**：用户需点进员工详情才能看到合同起止时间和社保信息。

**优化方案**：
- 取消隐藏「合同到期」列，直接在花名册表格中展示合同到期日期（已有渲染逻辑，只需移除 `hidden` 类）
- 新增「社保状态」列：显示"已缴纳/未缴纳/待办理"（需后端 roster API 返回社保缴纳状态摘要）
- 取消隐藏「入职日期」列

**涉及文件**：`frontend/src/pages/Roster.tsx:441-446`（表头）、`540-558`（合同到期单元格）、`486`（入职日期）

### 1.4 附件上传（反馈 #15：多条上传附件）

**现状**：`AttachmentInfo.tsx` 和 `BasicInfo.tsx` 已支持多附件上传，类型包括身份证、银行卡、学历证书、其他，支持 PDF/JPG/PNG 等格式，最大 10MB。

**问题**：附件类型选项较少，缺少"职业资格证书"、"毕业证"等常见类型。

**优化方案**：
- 扩展附件类型：增加 `CERTIFICATE`（职业资格证书）、`CONTRACT`（合同扫描件）、`PHOTO`（员工照片）等选项

**涉及文件**：`frontend/src/pages/roster/AttachmentInfo.tsx:13,52`、`frontend/src/pages/roster/BasicInfo.tsx:16,49`

### 1.5 发薪按钮无效（反馈 #11：发薪功能点击无反应）

**现状**：`Roster.tsx:590-593` 发薪按钮使用 `window.location.hash = '#/money'` 进行跳转，这种 hash 路由方式可能与 React Router 的 BrowserRouter 不兼容，导致跳转失败。

**优化方案**：
- 改用 `useNavigate` hook 进行路由跳转：`navigate('/money')`
- 或直接使用 `<Link to="/money">` 组件

**涉及文件**：`frontend/src/pages/Roster.tsx:592`

---

## 二、用工办理模块

### 2.1 姓名检索替代 ID 检索（反馈 #1：用员工ID和合同ID检索不便）

**现状**：`WorkProcess.tsx:53-141` 的 `FORM_FIELDS` 中，ONBOARD/CONFIRM/CHANGE/RENEW/SUSPEND/TERMINATE/RESCIND 等流程类型使用 `employeeId`（文本输入）和 `contractId`（文本输入）作为字段，用户需要手动输入 UUID。

**问题**：操作人员不知道员工ID和合同ID，使用不便。

**优化方案**：
- 将 `employeeId` 字段类型改为 `employee-select`（自定义组件）：输入姓名时模糊搜索员工列表，选择后自动填入 ID
- 将 `contractId` 字段类型改为 `contract-select`：根据选中员工自动列出其合同供选择
- 利用已有的 `/api/v1/employees/list` 接口（返回 id/name/department）实现搜索下拉

**涉及文件**：`frontend/src/pages/WorkProcess.tsx:53-141`（FORM_FIELDS 配置）、新增 `EmployeeSelect` 组件

### 2.2 填写界面增加提交按钮（反馈 #12：只能存草稿后再提交）

**现状**：`WorkProcess.tsx:400-404` 创建弹窗底部只有"存草稿"按钮，用户必须先存草稿，再在详情中点击"提交办理"。

**优化方案**：
- 在填写信息界面增加"直接提交"按钮，调用 `createMutation` 创建后立即调用 `submitMutation` 提交
- 保持"存草稿"按钮供用户选择

**涉及文件**：`frontend/src/pages/WorkProcess.tsx:400-408`

### 2.3 查看已生成文书（反馈 #12：已提交的证明类业务无法查看生成文书）

**现状**：`WorkProcess.tsx:489-501` 详情弹窗中显示已生成文书列表（`data.documents`），但仅展示文件名，无下载/预览链接。`previewContent` 仅在 DRAFT 状态下可预览。

**问题**：已提交/已完成的业务无法查看和下载生成的文书。

**优化方案**：
- 在文书列表中每项增加"查看"和"下载"按钮
- 调用后端 `workProcessApi.preview(id)` 获取文书内容展示
- 增加文书下载功能（PDF/Word 格式）

**涉及文件**：`frontend/src/pages/WorkProcess.tsx:488-501`

### 2.4 收入证明后续处理指引（反馈 #2：提交后找不到后续需要处理的事情）

**现状**：收入证明提交后在"办理记录"列表中显示，但用户不清楚下一步去哪里查看文书或跟进。

**优化方案**：
- 提交成功后 toast 提示中增加跳转链接："已提交，点击查看办理详情"
- 在办理记录列表中，已完成的业务增加"查看文书"快捷按钮
- 在首页工作台待办列表中自动汇总"待查看文书的办理项"

**涉及文件**：`frontend/src/pages/WorkProcess.tsx:176-183`（createMutation onSuccess）

### 2.5 整体逻辑与模块关联性（反馈 #3：不知道下一步做什么）

**现状**：各模块相对独立，缺少流程引导。

**优化方案**：
- 在关键操作完成后增加"下一步"引导提示（如：入职登记完成 → 提示"前往签订劳动合同"）
- 首页工作台待办列表已有跨模块汇总，可强化提示
- 各模块顶部 `PageGuide` 中增加关联模块说明

**涉及文件**：各模块页面

---

## 三、离职管理模块

### 3.1 离职证明下载（反馈 #4：离职员工无法下载离职证明、交接清单）

**现状**：`Termination.tsx` 解聘补偿模块有 5 步向导（选择员工→解聘方式→合规检查→费用结算→工作交接→确认提交），工作交接步骤有交接清单勾选项（`DEFAULT_HANDOVER_ITEMS`），但无文书生成和下载功能。`WorkProcess.tsx` 中有 `LEAVING_CERT` 流程类型，但与解聘补偿模块未打通。

**问题**：离职流程完成后，无法生成和下载《解除劳动合同证明书》和《工作交接清单》。

**优化方案**：
- 在 Termination.tsx 第 5 步（确认提交）完成后，自动跳转到 WorkProcess 的 `LEAVING_CERT` 流程，预填员工信息
- 或在 Termination 详情页增加"生成离职证明"和"生成交接清单"按钮
- 交接清单支持导出 PDF（已有 jsPDF 依赖）

**涉及文件**：`frontend/src/pages/Termination.tsx:135-142`（交接项）、提交成功后的跳转逻辑

### 3.2 员工端辞职申请（反馈 #23：员工端提交辞职申请并附件辞职信照片）

**现状**：员工门户 `portal/MyLeave.tsx` 有休假申请功能，但无辞职申请入口。辞职目前只能由 HR 在花名册中发起。

**优化方案**：
- 在员工门户增加"辞职申请"入口
- 表单包含：辞职原因、预计离职日期、辞职信照片上传（多张）
- 提交后 HR 端花名册自动收到通知，创建离职草稿
- HR 确认纸质辞职信后进入正式离职流程

**涉及文件**：新增 `frontend/src/pages/portal/MyResignation.tsx`，修改员工门户路由

---

## 四、风险中心模块

### 4.1 跳转后不自动筛选（反馈 #13：点击风险提示跳转后需手动搜索）

**现状**：`RiskCenter.tsx:27` 风险类型配置中 `CONTRACT` 类型 link 为 `/roster`，无查询参数。点击后跳转到花名册首页，不携带任何筛选条件。`Roster.tsx:74-85` 支持从 URL 参数 `employee` 自动选中员工，但风险中心未使用此机制。

**问题**：用户点击风险提示后需手动搜索员工，体验不如首页工作台。

**优化方案**：
- 风险列表项的 Link 增加查询参数：`/roster?employee=员工名&contractStatus=expired`
- 或增加 `riskType` 参数，Roster 页面读取后自动设置对应筛选条件
- 对标 Dashboard.tsx 中工作台的风险处理逻辑（直接选择人员处理）

**涉及文件**：`frontend/src/pages/compliance/RiskCenter.tsx:26-33,183-206`

### 4.2 与工作台对比（反馈 #13：风险中心不如工作台便捷）

**现状**：`Dashboard.tsx` 工作台的风险待办列表可直接勾选员工并处理（批量续签/解聘），而 `RiskCenter.tsx` 只能查看和跳转。

**优化方案**：
- 风险中心列表项增加快捷操作按钮（如：合同到期→"续签"/"办理离职"）
- 增加批量选择和处理功能，与工作台体验对齐
- 风险中心作为独立模块应比工作台更强大，而非更弱

**涉及文件**：`frontend/src/pages/compliance/RiskCenter.tsx:177-206`

---

## 五、日历模块

### 5.1 合同到期点击进入员工（反馈 #14：点击进入员工）

**现状**：`Calendar.tsx:238-246` 日历事件仅显示标题，点击日期格子触发 `handleDayClick` 创建新事件，无点击事件跳转到对应员工的功能。

**优化方案**：
- 事件项增加点击事件：`onClick` 阻止冒泡，跳转到 `/roster?employee=员工名`
- 合同到期事件点击后跳转到花名册并自动筛选该员工

**涉及文件**：`frontend/src/pages/Calendar.tsx:238-246`

### 5.2 按紧急程度分类（反馈 #14：7天紧急/15天预警/35天提醒）

**现状**：`Calendar.tsx` 事件列表按日期排列，无紧急程度分类。`PRIORITY_DOT` 有 high/medium/low 颜色点但未按时间窗口分组。

**优化方案**：
- 事件列表增加分组：🔴 7天内紧急、🟡 15天预警、🔵 35天提醒、⚫ 已逾期
- 日历格子中事件按优先级排序展示

**涉及文件**：`frontend/src/pages/Calendar.tsx:260-279`（事件列表区域）

### 5.3 逾期天数统计（反馈 #14：新增逾期天数统计）

**现状**：无逾期统计展示。

**优化方案**：
- 日历顶部增加统计卡片：本月到期 X 项、已逾期 Y 项、逾期总天数 Z 天
- 逾期事件在列表中红色高亮并显示"逾期 N 天"

**涉及文件**：`frontend/src/pages/Calendar.tsx:161-189`（顶部工具栏区域）

---

## 六、社保模块

### 6.1 各项保险比例显示（反馈 #8：未显示各项保险比例）

**现状**：`SocialInsurance.tsx:500-526` 社保配置 Tab 已显示各项比例（养老企业/个人、医疗企业/个人、失业企业/个人、工伤企业、生育企业）。但月度办理 Tab 中仅显示变更明细，未显示各项保险的具体比例和金额分解。

**问题**：用户在月度办理时看不到每项保险的缴费比例和金额明细。

**优化方案**：
- 月度办理结果中每条记录增加"明细展开"功能，显示养老/医疗/失业/工伤/生育各项的企业和个人缴费金额及比例
- 利用已有的 `socialInsuranceApi.calculate(base, city)` 接口获取明细

**涉及文件**：`frontend/src/pages/SocialInsurance.tsx` 月度办理 Tab 区域、`frontend/src/pages/social-insurance/MonthlyRows.tsx`

---

## 七、休假审批流程

### 7.1 审批流程可发现性（反馈 #9：没有找到休假的审批流程）

**现状**：系统已有完整的休假审批流程：
- HR 端：`LeaveApproval.tsx` 休假审批页面，支持批准/驳回/撤回
- 员工端：`portal/MyLeave.tsx` 员工提交休假申请

**问题**：用户找不到休假审批入口，可能是因为导航菜单中未明显展示。

**优化方案**：
- 确认侧边栏菜单中是否包含"休假审批"入口
- 在考勤管理页面的"休假记录"Tab 中增加"前往审批"链接
- 在首页工作台待办中自动汇总"待审批休假申请"

**涉及文件**：导航配置、`frontend/src/pages/Attendance.tsx`（休假记录 Tab）

---

## 八、考勤管理

### 8.1 在职人员直接编辑（反馈 #10：无法直接编辑在职人员考勤）

**现状**：`Attendance.tsx` ConfirmTab 有批量导入和批量确认功能，但无单条记录编辑功能。`singleConfirmMutation` 仅支持确认操作。

**优化方案**：
- 考勤列表增加"编辑"按钮，支持修改单条考勤记录（出勤天数、加班时长、请假天数等）
- 保留批量导入功能，同时支持导入后逐条修改

**涉及文件**：`frontend/src/pages/Attendance.tsx` ConfirmTab

### 8.2 按月按人导出考勤（反馈 #22）

**现状**：无考勤导出功能。

**优化方案**：
- 考勤确认 Tab 增加"导出"按钮，支持按月份导出全部员工考勤表（Excel）
- 支持按单个员工导出月度考勤明细
- 利用已有的 `exceljs` 依赖生成 Excel 文件

**涉及文件**：`frontend/src/pages/Attendance.tsx` ConfirmTab、后端增加导出接口

---

## 九、工资条模块

### 9.1 状态标记与签收跟踪（反馈 #18：增加已发送/未查看/已查看状态）

**现状**：`PayslipTab.tsx:64-65,142-149` 仅有"已确认/未确认"两种状态，无发送和查看状态跟踪。

**优化方案**：
- 工资条状态扩展为：`未发送` → `已发送` → `已查看` → `已确认`
- 列表增加状态列，用不同颜色标签区分
- 后端 Payslip 模型增加 `sentAt`、`viewedAt` 字段
- 员工端查看工资条时自动更新 `viewedAt`

**涉及文件**：`frontend/src/pages/money/PayslipTab.tsx`、后端 payslip 模型和路由

### 9.2 导出工资流水和工资表（反馈 #21）

**现状**：`PayslipTab.tsx` 无导出功能。

**优化方案**：
- 增加"导出工资表"按钮：按月份导出全部工资条为 Excel
- 增加"导出工资流水"按钮：按员工导出多月工资明细（用于银行流水证明）
- 利用 `exceljs` 生成 Excel 文件

**涉及文件**：`frontend/src/pages/money/PayslipTab.tsx`、后端增加导出接口

---

## 十、其他建议

### 10.1 通讯录（反馈 #16）

**现状**：系统无通讯录页面。

**优化方案**：
- 新增通讯录页面，按部门分组展示所有在职员工姓名、职务、手机号、地址
- 支持搜索和按部门筛选
- 支持导出通讯录 Excel

**涉及文件**：新增 `frontend/src/pages/Directory.tsx`

### 10.2 批量开具证明（反馈 #17）

**现状**：`WorkProcess.tsx` 仅支持单个办理，无批量开具证明功能。

**优化方案**：
- 在用工办理页面增加"批量开具证明"入口
- 选择多人和证明类型（收入证明/离职证明等）
- 批量生成文书，支持批量下载（ZIP 打包）

**涉及文件**：`frontend/src/pages/WorkProcess.tsx`

### 10.3 人效成本分部门（反馈 #19）

**现状**：`Dashboard.tsx` 有"人效成本"Tab（`activeTab === 'cost'`），但具体实现需进一步检查是否支持分部门展示。

**优化方案**：
- 人效成本 Tab 增加部门维度筛选和对比
- 按部门展示人数、总薪资成本、人均成本、同比变化

**涉及文件**：`frontend/src/pages/Dashboard.tsx` cost Tab

---

## 优先级排序

| 优先级 | 编号 | 问题 | 影响范围 |
|--------|------|------|----------|
| P0 | 1.5 | 发薪按钮无效 | 功能不可用 |
| P0 | 2.1 | 用工办理需姓名检索 | 严重影响操作效率 |
| P0 | 2.2 | 填写界面增加提交按钮 | 操作流程繁琐 |
| P0 | 4.1 | 风险中心跳转不筛选 | 用户体验差 |
| P1 | 1.2 | 身份证号复制 | 操作不便 |
| P1 | 1.3 | 花名册显示字段不足 | 信息不充分 |
| P1 | 2.3 | 查看已生成文书 | 功能缺失 |
| P1 | 3.1 | 离职证明下载 | 功能缺失 |
| P1 | 9.1 | 工资条状态标记 | 跟踪不足 |
| P1 | 9.2 | 导出工资表 | 功能缺失 |
| P2 | 1.4 | 附件类型扩展 | 体验优化 |
| P2 | 2.4 | 收入证明后续指引 | 引导不足 |
| P2 | 2.5 | 模块关联性引导 | 体验优化 |
| P2 | 3.2 | 员工端辞职申请 | 新功能 |
| P2 | 4.2 | 风险中心快捷操作 | 体验优化 |
| P2 | 5.1-5.3 | 日历优化 | 体验优化 |
| P2 | 6.1 | 社保比例明细 | 信息不充分 |
| P2 | 7.1 | 休假审批可发现性 | 导航问题 |
| P2 | 8.1 | 考勤直接编辑 | 操作不便 |
| P2 | 8.2 | 考勤导出 | 功能缺失 |
| P3 | 10.1 | 通讯录 | 新功能 |
| P3 | 10.2 | 批量开具证明 | 新功能 |
| P3 | 10.3 | 人效成本分部门 | 体验优化 |

---

## 已确认无需修改

| 编号 | 问题 | 原因 |
|------|------|------|
| #7 | 花名册无身份证号搜索 | 后端已实现 `isIdCardSearch` 逻辑，前端 placeholder 已提示 |
| #15 | 花名册多条上传附件 | `AttachmentInfo.tsx` 已支持多附件上传 |
| #9 | 休假审批流程 | 系统已有 `LeaveApproval.tsx` 和 `MyLeave.tsx`，需确认导航入口 |
