分支
用户 tuqin <tuqin@tuqin.cn>
星期二, 十一月 3, 2026 19:40 +0800
提交者 tuqin <tuqin@tuqin.cn>
星期二, 十一月 3, 2026 19:40 +0800
提交1fd52d7784a8b0b963cf38d63175cdf9082e8f43
目录 11ff59cf8ea07c36ae69a62717d873122aefd067 目录 | zip | gz
上一版本 19af7352b7ef6497f7bbb66d7ae5a248f905c072 查看 | 对比
fix(hrm): 薪酬核算按出勤天数联动扣款、个税配置可保存、离职提交报错

一、薪酬核算:应出/实出天数真正参与工资计算(客户反馈"改了天数实发不变")
- 新增「缺勤扣款」算法:日工资 = 基本工资 / 应出天数;
请假天数按「请假扣款配置」比例扣(调休等未配置=不扣,病假按配置比例),
未被请假单覆盖的缺勤按旷工 100% 扣,扣款封顶为基本工资。
- 应出天数优先取考勤汇总的 work_days(客户按实际月份维护,如 30 天),
其次排班累计,最后回退 22;实出天数取考勤汇总 actual_days。
- 未生成考勤汇总时不做缺勤扣款(视为满勤,只按请假单扣),
避免一重算就把没录考勤的员工工资扣光。
- 实发工资统一走 calcActualSalary:新建核算原本是独立算的,导致"新建正确、改单变少";
并且实发不允许为负(缺勤扣满后社保叠加会出现负数,按本月无工资处理置 0)。
- 修改核算单 / 批量保存时同样重算缺勤扣款与实发,列表里改天数后金额立刻跟着变。

二、个税税率配置:税率填 0 保存报「生效日期不能为空」
- 前端表单缺「配置名称」「生效日期」两个字段,后端这两个是必填。
- 前端补上两个字段;后端改为可选并兜底:生效日期默认当月1号,
配置名称自动生成(如「2026年11月个税税率表」),速算扣除数/上限缺省按 0。

三、离职申请:提交报错
- 提交接口的 processDefinitionKey 为必填但前端只传 id,改为可选,
不传时自动取「离职审批(hrm_resignation_approve)」分类下最新活跃流程(与调岗一致)。
- 新增申请报 NPE:adminUserApi.getUser(userId) 返回 null 时只重置了 userId 没重新查,
后面 user.getDeptId() 直接空指针;改为回退后重新查询,部门依次取
请求参数 → 账号部门 → 0。

实测(mom-zyjc):
- 应出30/实出0 → 缺勤扣款 1950(封顶)→ 实发 0.00 ✔
- 应出30/实出20 → 缺勤扣款 650(10天×65)→ 实发 749.17 ✔
- 个税税率 0 + 不传生效日期 → 保存成功,名称/日期自动生成 ✔
已修改5个文件
238 ■■■■■ 文件已修改
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/approval/HrmResignationApplicationController.java 4 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/controller/admin/salary/vo/HrmTaxRateConfigSaveReqVO.java 6 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/approval/HrmResignationApplicationServiceImpl.java 36 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java 167 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmTaxRateConfigServiceImpl.java 25 ●●●●● 对比 | 查看 | 原始文档 | blame | 历史