Files
TurboHR/20260803-优化.md
T
freedakgmail 2968484d2d 优化: 大文件拆分+代码分割+按需加载+console清理+any类型替换
- Money.tsx (2260行→54行): 拆分为 money/ 子目录4个组件, React.lazy二级分割
- AIAssistant.tsx (2038行→63行): 拆分为 ai-assistant/ 子目录6个组件, React.lazy二级分割
- xlsx改为动态导入, OvertimeTab从345KB降至12.7KB
- api-services.ts: 请求参数 any→Record<string,unknown>
- 移除前端3处console.log残留
- 后端console替换为pino logger
- 前后端未使用import/变量清理
- Zod schema验证: termination/platform/special-status/work-process
- 新增 leave.routes.ts, acceptance-test.routes.ts
- UI组件: PageGuide, QueryError, Stepper
2026-08-04 07:53:37 +08:00

135 lines
9.0 KiB
Markdown
Raw 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.
# 20260803 优化清单
## 一、验收测试清单(问题 1-3)
### 问题 1:保存不提示成功,重新进入记录丢失
- **根因**acceptance-test.html 使用 localStorage 按验收人姓名保存(STORAGE_PREFIX + name),但在 iframe 中 localStorage 可能因跨域限制无法写入。autoSave() 静默执行无反馈,saveCurrent() 虽有 showToast 但用户可能未看到。
- **修复方向**
1. 保存按钮增加明显 toast 提示
2. 检查 iframe 中 localStorage 是否可用,不可用时降级到服务端存储
3. 进入页面时自动加载已保存的验收人记录
- **优先级**P1 高
### 问题 2:无提交按钮,重新进入记录不显示
- **根因**acceptance-test.html 只有「保存」「下载」「打印」按钮,没有「提交」功能。重新进入时需手动在验收人输入框输入姓名触发 loadSaved,但用户可能不知道这个操作。
- **修复方向**
1. 增加「提交验收报告」按钮,将数据发送到后端持久化
2. 页面加载时自动显示已保存的验收人列表供选择
3. 优化交互流程,进入时自动加载上次记录
- **优先级**P1 高
### 问题 3:总体结论不应手动勾选
- **根因**:当前 conclusion-section 中总体结论是 radio 按钮手动选择(acceptance-test.html:592-598),updateStats() 已计算了通过/失败/部分通过/未测试数量,但未自动推导结论。
- **修复方向**:移除手动 radio,根据测试结果自动计算:通过率 100% → 通过,有 fail → 不通过,仅有 partial → 有条件通过。汇总主要问题从 fail/partial 的备注中提取。
- **优先级**P1 高
## 二、花名册导入(问题 4-5、11)
### 问题 4:导入错误不提示具体内容
- **根因**Settings.tsx:1077-1127 的导入结果已有错误详情展示(result.errors 数组,最多显示前 10 条),但仅在导入后显示。如果用户跳过「预览」直接导入,错误信息只在结果区域展示,可能被忽略。预览功能(handlePreview)已有完整错误展示。
- **修复方向**
1. 导入失败时增加醒目 toast 提示「有 N 条错误,请查看详情」
2. 错误区域默认展开,不折叠
3. 增加「跳过错误行,仅导入正常行」选项
- **优先级**P1 高
### 问题 5:按人为员工办理入职提示乱码
- **根因**WorkProcess.tsx:453-456 中表单数据以 key 原始字段名显示(如 employeeName、idCardNumber),未做中文标签映射。generateDocument() 生成的文书内容是中文,但 formData 的 key 是英文,显示为「乱码」感。
- **修复方向**:在 WorkProcess.tsx 的表单信息展示区域增加字段名中文映射表,将 employeeName → 员工姓名、idCardNumber → 身份证号 等。
- **优先级**P0 紧急
### 问题 11:导入后无员工ID显示
- **根因**import.routes.ts:326-327 导入成功后 result.details 记录了 { sheet, row, name, status: 'success', message: '导入成功' },但未返回 employeeId。前端 Settings.tsx:1077-1086 只显示「成功导入 N 人」,不显示具体 ID。
- **修复方向**
1. 后端导入时在 result.details 中加入 employeeId
2. 前端结果展示中增加员工 ID 列
3. 花名册列表中确保 ID 列可见
- **优先级**P1 高
## 三、工资薪税(问题 6-7
### 问题 6:批量选择部分人员 + 个税未算出
- **根因**
- 批量选人:Money.tsx 已有 mode: 'custom' 和 CustomEmployeeSelector 组件(Money.tsx:331-333),支持按部门筛选、搜索、勾选员工。但用户可能不知道此功能。
- 个税未算出:payroll.service.ts:230-256 使用累计预扣法,需要已归档批次的历史数据来计算累计应纳税所得额。如果是首次使用或当月无已归档批次,ytdTaxableIncome 可能 ≤ 5000 起征点,导致个税为 0。税前工资超 5000 但个税为 0 的原因可能是:①累计减除费用(5000×月数)后应纳税所得额 ≤ 0;②社保公积金扣除后剩余 ≤ 5000/月。
- **修复方向**
1. UI 上更突出「自定义选择员工」模式
2. 个税计算增加明细展示,让用户看到「累计收入 - 累计减除 - 累计社保 = 应纳税所得额」,理解为何个税为 0
3. 检查是否有 bug 导致 ytdTaxableIncome 计算错误
- **优先级**P1 高
### 问题 7:个人保费与实缴一致 + 手动调整
- **根因**payroll.service.ts:165-206 社保计算基于 socialInsuranceConfig 配置表的比例自动计算。如果配置比例与实际社保局核定金额有差异,无法自动匹配。overrideSocial 参数已支持手动覆盖(payroll2.routes.ts:462-472),但前端可能未暴露此编辑入口。
- **修复方向**
1. 工资表条目编辑界面增加「个人社保」「个人公积金」可编辑字段
2. 显示「系统计算值」和「实际缴纳值」对比,允许手动调整差异
3. 增加「匹配参保地政策」自动拉取配置功能
- **优先级**P2 中
## 四、审批流程(问题 8
### 问题 8:休假审批需要审批流程
- **现状**:系统中没有独立的休假审批模块和审批流引擎。WorkProcess 有简单的状态流转(DRAFT → PENDING → APPROVED/REJECTED),但不是通用审批流。
- **修复方向**:需要新建审批流模块,包括:
1. 审批流配置(审批节点、审批人、条件)
2. 休假申请提交
3. 审批进度追踪
4. 审批通知
- **优先级**:P3 规划(较大的功能开发,建议单独规划)
## 五、证明开具(问题 9
### 问题 9:证明开具添加自定义模板
- **现状**work-process.service.ts:247-275 的 generateDocument 只支持 INCOME_CERT 和 LEAVING_CERT 两种硬编码模板。EnterpriseTemplate 模块支持自定义模板(Templates.tsx),但 WorkProcess 的证明开具未调用企业模板。
- **修复方向**
1. WorkProcess 证明开具功能关联 EnterpriseTemplate 表,允许选择企业自定义模板
2. 支持变量替换({{employeeName}} 等)
3. 允许用户新建模板并分类管理
- **优先级**P2 中
## 六、工作台布局(问题 10
### 问题 10:工作台内容杂乱,需分区分类
- **现状**Dashboard.tsx 已有 Tab 分区(概览/风险提醒/月度任务),TaskCenter 也按分类分组展示。但概览 Tab 下内容较多(统计卡片、任务中心、成本分析、活动统计等)可能显得杂乱。
- **修复方向**
1. 概览 Tab 按「待办事项」「人力概览」「薪税概览」「合规风险」分区展示,用卡片或分隔线区分
2. 增加折叠/展开功能
3. 调整信息密度,次要信息收起
- **优先级**P2 中
- **状态**:✅ 已完成 — 已拆分为 5 个 Tab(概览/风险提醒/月度任务/人力成本/人员分析),支持 Tab 级别和区域级别的显示设置
## 七、离职操作(问题 12-13)
### 问题 12:离职操作全选填,可跳过必填项
- **根因**Termination.tsx:527-534 的 canProceed() 函数中,step 2/3/4 都直接 return true,没有校验必填项。termination.schema.ts 的 schema 中只有 employeeId 和 reason 是必填,其他字段都可选。
- **修复方向**
1. step 1(解聘方式)增加 terminationDate 必填校验(已有)
2. step 2(合规检查)要求至少勾选所有 suggestionType: 'required' 的检查项
3. step 3(费用结算)如果有补偿金,要求确认金额
4. step 4(工作交接)要求至少完成关键交接项
- **优先级**P1 高
### 问题 13:补偿金手动修改后确认阶段仍显示系统预估
- **根因**Termination.tsx:536-547 的 handleSave() 使用 costResult?.totalSeverance(系统计算值),而非用户可能手动调整后的值。handleSaveDraft() 使用 costResult?.grandTotal,也未考虑手动调整。compAdjustments 状态存在但未在保存时正确应用到最终补偿金。
- **修复方向**
1. 保存时使用 costResult.grandTotal + compAdjustments 的合计值
2. 确认步骤显示「系统预估 ¥X + 手动调整 ¥Y = 实际补偿 ¥Z」
3. 后端 createDraft/updateDraft 已支持 compensationBreakdown.adjustments,前端需正确传递
- **优先级**P0 紧急
## 八、用工文本模板(问题 14
### 问题 14:用工文本模板优化为公司统一版本
- **现状**work-process.service.ts 的 generateDocument 使用硬编码模板,EnterpriseTemplate 表支持自定义但未关联。
- **修复方向**:与问题 9 同一方案——将 WorkProcess 的文书生成改为从 EnterpriseTemplate 表读取模板内容,支持变量替换,管理员可统一维护模板版本。
- **优先级**P2 中
## 优先级汇总
| 优先级 | 问题 | 原因 | 状态 |
|--------|------|------|------|
| P0 紧急 | 5、13 | 功能性 bug,影响业务正确性 | 待修复 |
| P1 高 | 1、2、3、4、6、11、12 | 用户体验差或操作不完整 | 待修复 |
| P2 中 | 7、9、10、14 | 功能增强和优化 | 问题10已完成 |
| P3 规划 | 8 | 新功能开发,需单独规划 | 待规划 |