Files
TurboHR/docs/20260730-优化-1.md
T
selfrelease 55286819ae fix: HR系统优化批次1 - P0/P1问题修复
P0-3: 修复合同状态判断逻辑,有合同记录但signDate为null时不再误判未签
P0-5: 修复参保城市默认北京问题,导入和预览均改为null
P0-11: 添加全局ErrorBoundary防止白屏,三处布局均包裹
P1-2: 合同附件改为可选,允许先保存再补充上传
P1-7.2: 排班弹窗增加员工搜索(姓名/部门)
P1-8.2: 加班费导入支持Excel(xlsx/xls)格式,兼容中英文列名
P1-9: 社保/公积金基数月度办理支持逐人修改,后端返回recordId
2026-07-30 18:34:36 +08:00

216 lines
9.8 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.
# 20260730 优化需求清单 - 1
> 来源:用户测试反馈
> 日期:2026-07-30
> 代码验证:已完成逐条核查
---
## 1. 批量导入:员工信息分步导入后无法补充导入合同
**问题**:员工导入模板支持多 Sheet,如果第一次只导入了员工基本信息(未填写合同 Sheet),后续无法再通过批量导入补充合同信息,只能逐条手录。
**代码验证**:⚠️ 部分确认
- 后端 `import.routes.ts` 合同 Sheet 导入依赖 `empByHash`/`empByName` 匹配已有员工,**合同 Sheet 可以单独导入**(只要员工已存在)
- 但员工 Sheet 导入时 `prisma.employee.create` 没有去重逻辑,第二次导入员工会报唯一约束错误
- **实际问题**:用户不知道可以只上传含合同 Sheet 的 Excel 来补充合同,需要 UI 引导或分开的导入入口
**期望**:支持对已有员工进行合同信息的批量补充导入(后端已支持,前端需增加独立入口或引导)。
---
## 2. 手动录入劳动合同:未上传附件前无法保存
**问题**:手动录入劳动合同时,在上传附件之前没有保存按钮,退出后再进入需要重新录入所有合同基本信息。
**代码验证**:✅ 确认真实问题
- `ContractInfo.tsx:211-214`:保存按钮 disabled 条件包含 `form.signMethod === 'PAPER' && form.attachments.length === 0`
- 纸质签署必须先上传附件才能保存,没有草稿/暂存机制
**期望**:允许先保存合同基本信息(草稿状态),附件后续再上传。
---
## 3. 合同录入后状态异常 + 附件无法预览/下载
**问题**
- 合同手工录入保存成功后,员工仍显示"未签订劳动合同"
- 批量导入合同成功后,已签订合同的附件不能预览也不能下载
**代码验证**:✅ 确认真实问题(状态异常)+ ❌ 附件功能正常
- `contract.service.ts:38``if (!contract.signDate || contract.contractType === 'UNSIGNED')` — 如果 `signDate` 为 null,直接判定为"未签合同"
- 手工录入合同时签订日期非必填,未填则 `signDate` 为 null → 状态显示"未签订"
- **根因**`getContractStatus` 判断逻辑应以合同记录是否存在为准,而非 `signDate`
- 附件预览/下载:`ContractInfo.tsx:296-347` 已实现完整的预览弹窗(支持 PDF/图片预览 + 下载),功能正常
**期望**
- 修复 `getContractStatus`:有合同记录且非 UNSIGNED 类型时,即使 `signDate` 为 null 也应显示"已签订"
- 附件功能已正常,无需修改
---
## 4. 绩效考核:签字流程不明确
**问题**
- 被考核人签字入口不明确,不知道在哪里签字
- 考核结果通过什么形式发给员工并签字未定义
- 员工对考核结果有异议时,是通过系统提出还是直接跟考核人沟通?
**代码验证**:✅ 确认真实问题(功能缺失)
- 当前绩效模块只有 HR 端录入功能,没有员工端签字/确认流程
- 员工 Portal 中无绩效考核相关页面
**期望**
- 明确签字入口和流程(如员工端 Portal 推送 + 签字确认)
- 提供异议申诉通道(系统内提交异议 → 考核人/HR 复核)
---
## 5. 批量导入:参保地区导入后统一变成北京
**问题**:批量导入员工信息时,参保地区不管填写哪个城市,导入后都变成"北京",需要二次修改。
**代码验证**:✅ 确认真实问题
- `import.routes.ts:288``city: val(getField(r, '参保城市')) || '北京'`
- 如果 Excel 中参保城市列名为空或列名不匹配,`getField` 返回空 → 默认"北京"
- **根因**`getField` 匹配列名可能不精确,或用户填写了列但列名与代码中的 `'参保城市'` 不完全一致
**期望**:导入时正确识别参保城市列,空值时不用默认"北京",改为 null 或提示用户。
---
## 6. 员工离职:离职原因细分的目的和输出不明确
**问题**:离职原因细分为"个人原因/职业发展/薪资原因"等,不确定细分目的。是否能导出不同离职原因占比?
**代码验证**:✅ 确认真实问题(缺少分析报表)
- 离职原因分类已存在,但没有统计分析报表功能
- 无离职原因占比导出功能
**期望**
- 明确离职原因分类体系
- 提供离职原因统计分析报表(占比、趋势、部门对比)
---
## 7. 考勤确认:多个子问题
### 7.1 批量导入不显示上传状态 + 服务器内部错误
**代码验证**:⚠️ 部分确认
- 前端 `Attendance.tsx:315-338`:有导入弹窗和文件选择,但上传后只显示 `toast.success``toast.error`,不显示详细导入结果
- 后端 `import.routes.ts:439-468`:考勤记录导入逻辑正常,但可能因 Sheet 名不匹配(需为"考勤记录")导致无数据导入
- "服务器内部错误"可能是其他 Sheet 数据导入失败导致整体 500
### 7.2 排班:不能搜索,只能下拉勾选
**代码验证**:✅ 确认真实问题
- `Attendance.tsx:592-620`:排班弹窗中员工列表无搜索框,只有滚动勾选
### 7.3 每日出勤:无导入按钮
**代码验证**:✅ 确认真实问题
- `Attendance.tsx:626-695`:DailyTab 只有日期选择和表格展示,无导入按钮
- 但考勤确认 Tab 有导入功能,每日出勤数据来源于考勤记录导入
### 7.4 休假记录:能否接入企业微信请假记录
**代码验证**:✅ 确认只能手动录入
- `Attendance.tsx:793+`:休假记录只有手动新增,无导入功能,无企业微信对接
---
## 8. 薪酬管理:多个子问题
### 8.1 薪酬模板:可编辑项手工录入不能保存
**代码验证**:❌ 无法确认
- 模板管理 `TemplateManager` 有完整 CRUD(新增/编辑/删除),`isEditable` 字段可设置
- 发薪批次详情 `BatchDetail``editableFields` 包含 `baseSalary/overtimePay/allowance/deduction/bonus` 等,支持点击单元格编辑
- **可能原因**:用户指的是发薪批次中某些自定义模板项无法编辑,或编辑后保存接口报错(需实际测试确认)
### 8.2 加班费计算:导入考勤数据不能导入
**代码验证**:✅ 确认真实问题
- `Money.tsx:1527-1555`:加班费导入只支持 **CSV 格式**(逗号分隔),不支持 Excel
- 按姓名匹配员工,如果姓名不匹配则跳过
- 用户可能上传了 Excel 文件导致解析失败
### 8.3 工资条税率试算:加班费计算方式不明确
**代码验证**:✅ 确认真实问题
- 加班费按统一规则计算(工作日 1.5 倍 / 休息日 2 倍 / 法定节假日 3 倍),不支持按员工个人配置工资构成
---
## 9. 社保公积金:无法按个人修改基数
**代码验证**:⚠️ 部分确认
- 后端 `social.routes.ts:1185``PUT /records/social/:id/correct` 接口支持修正单条社保记录
- 后端 `social.routes.ts:244``POST /config/:id/adjust-apply` 支持批量调基
- **但前端 `SocialInsurance.tsx` 中未找到调用 correct 接口的 UI 入口**,只有批量调基预览/应用
- 前端缺少逐人修改基数的操作入口
**期望**:前端增加逐人修改社保/公积金基数的 UI 入口。
---
## 10. 考勤机数据导入后自动计算加班工资
**代码验证**:✅ 确认功能缺失
- 当前考勤导入只创建 `AttendanceRecord`,不自动计算加班费
- 加班费需要单独在薪酬模块录入或 CSV 导入
---
## 11. 系统不稳定:新模块常出现"系统出错了"闪退
**代码验证**:✅ 确认真实问题
- 前端无 `ErrorBoundary` 组件,模块加载失败时直接白屏
- 无全局错误处理和降级 UI
**期望**:添加全局 `ErrorBoundary`,模块加载失败时显示降级页面而非白屏。
---
## 12. 社保城市:可选城市较少,不能录入新城市
**代码验证**:✅ 确认真实问题
- `import.routes.ts:54-60`:社保基数校验只支持 5 个城市(北京/上海/广州/深圳/杭州)
- 社保配置 `social.routes.ts` 支持按城市配置,但城市列表来源于已配置数据,无预设全量城市
- 前端无自定义录入新城市的入口
---
## 13. 发薪时考勤数据自动生成奖惩类数据
**代码验证**:✅ 确认功能缺失
- 考勤导入和薪酬模块之间无自动联动
- 迟到/早退/缺勤等考勤异常不会自动生成薪酬扣款明细
---
## 14. 新增人工成本模板
**代码验证**:✅ 确认功能缺失
- 系统中无人工成本模板功能
---
## 优先级建议(已根据验证结果调整)
| 优先级 | 编号 | 问题 | 验证结果 |
|--------|------|------|----------|
| P0-紧急 | 3 | 合同状态异常(signDate 判断逻辑) | ✅ 确认,根因已定位 |
| P0-紧急 | 11 | 系统无 ErrorBoundary 闪退 | ✅ 确认 |
| P0-紧急 | 5 | 参保地区默认"北京" | ✅ 确认,代码行已定位 |
| P1-高 | 2 | 合同录入必须先传附件 | ✅ 确认 |
| P1-高 | 9 | 社保基数前端无逐人修改入口 | ⚠️ 后端已有接口,前端缺 UI |
| P1-高 | 7.2 | 排班不支持搜索 | ✅ 确认 |
| P1-高 | 8.2 | 加班费只支持 CSV 不支持 Excel | ✅ 确认 |
| P2-中 | 1 | 分步导入(后端已支持,前端缺引导) | ⚠️ 需前端优化 |
| P2-中 | 7.1 | 考勤导入错误提示不清晰 | ⚠️ 需改善错误反馈 |
| P2-中 | 4 | 绩效签字流程缺失 | ✅ 确认 |
| P2-中 | 6 | 离职原因分析报表缺失 | ✅ 确认 |
| P2-中 | 12 | 社保城市列表少 | ✅ 确认 |
| P2-中 | 13 | 考勤自动生成奖惩数据 | ✅ 功能缺失 |
| P3-低 | 7.3 | 每日出勤无导入(考勤Tab已有) | ✅ 确认 |
| P3-低 | 7.4 | 休假无导入/企业微信对接 | ✅ 确认 |
| P3-低 | 8.1 | 薪酬模板可编辑项 | ❌ 需实际测试确认 |
| P3-低 | 8.3 | 加班费按统一规则计算 | ✅ 确认 |
| P3-低 | 10 | 考勤自动计算加班工资 | ✅ 功能缺失 |
| P3-低 | 14 | 人工成本模板 | ✅ 功能缺失 |