From 714fb8a069c9e87033a4201c210cb43ac438ba39 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期一, 19 十月 2026 10:57:02 +0800
Subject: [PATCH] fix(hrm): 薪酬核算修改时金额字段 null 归 0,避免实发工资与明细不一致
---
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 60 insertions(+), 0 deletions(-)
diff --git a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java
index 5f0019e..a8822da 100644
--- a/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java
+++ b/yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java
@@ -663,6 +663,66 @@
}
}
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateSalaryCalculation(HrmSalaryCalculationDO calculation) {
+ HrmSalaryCalculationDO exist = salaryCalculationMapper.selectById(calculation.getId());
+ if (exist == null) {
+ throw exception(SALARY_CALCULATION_NOT_EXISTS);
+ }
+ // 浠呭緟纭鐘舵�佸彲淇敼锛氬凡纭闇�鍏堟挙閿�锛涘凡鍙戞斁涓嶅彲鏀�
+ if (exist.getStatus() == null || !Objects.equals(exist.getStatus(), 0)) {
+ throw exception(SALARY_CALCULATION_UPDATE_FAIL);
+ }
+ // 浠ヤ笅瀛楁涓嶅厑璁搁�氳繃淇敼鎺ュ彛鍙樻洿锛屼竴寰嬩互搴撲腑涓哄噯
+ calculation.setNo(exist.getNo());
+ calculation.setPeriod(exist.getPeriod());
+ calculation.setUserId(exist.getUserId());
+ calculation.setDeptId(exist.getDeptId());
+ calculation.setStatus(exist.getStatus());
+ calculation.setConfirmTime(exist.getConfirmTime());
+ calculation.setConfirmUserId(exist.getConfirmUserId());
+ calculation.setPaymentTime(exist.getPaymentTime());
+ // 閲戦瀛楁涓� null 鏃剁粺涓�鎸� 0 澶勭悊锛歁yBatis-Plus 鐨� updateById 榛樿蹇界暐 null锛�
+ // 鍚﹀垯浼氬嚭鐜般�屽疄鍙戝伐璧勬寜 0 璁$畻銆佷絾鏄庣粏浠嶄繚鐣欐棫鍊笺�嶇殑涓嶄竴鑷�
+ calculation.setBaseSalary(nvl(calculation.getBaseSalary()));
+ calculation.setPerformanceSalary(nvl(calculation.getPerformanceSalary()));
+ calculation.setOvertimePay(nvl(calculation.getOvertimePay()));
+ calculation.setMealAllowance(nvl(calculation.getMealAllowance()));
+ calculation.setTransportAllowance(nvl(calculation.getTransportAllowance()));
+ calculation.setOtherAllowance(nvl(calculation.getOtherAllowance()));
+ calculation.setSocialSecurityDeduction(nvl(calculation.getSocialSecurityDeduction()));
+ calculation.setHousingFundDeduction(nvl(calculation.getHousingFundDeduction()));
+ calculation.setTaxDeduction(nvl(calculation.getTaxDeduction()));
+ calculation.setOtherDeduction(nvl(calculation.getOtherDeduction()));
+ calculation.setLeaveDeduction(nvl(calculation.getLeaveDeduction()));
+ // 瀹炲彂宸ヨ祫鐢卞悗绔噸绠楋紝閬垮厤鍓嶇浼犲叆鍊间笌鏄庣粏涓嶄竴鑷�
+ calculation.setActualSalary(calcActualSalary(calculation));
+ salaryCalculationMapper.updateById(calculation);
+ }
+
+ /**
+ * 璁$畻瀹炲彂宸ヨ祫 = 鏀跺叆椤瑰悎璁� - 鎵i櫎椤瑰悎璁★紝淇濈暀涓や綅灏忔暟
+ */
+ private static BigDecimal calcActualSalary(HrmSalaryCalculationDO c) {
+ BigDecimal income = nvl(c.getBaseSalary())
+ .add(nvl(c.getPerformanceSalary()))
+ .add(nvl(c.getOvertimePay()))
+ .add(nvl(c.getMealAllowance()))
+ .add(nvl(c.getTransportAllowance()))
+ .add(nvl(c.getOtherAllowance()));
+ BigDecimal deduction = nvl(c.getSocialSecurityDeduction())
+ .add(nvl(c.getHousingFundDeduction()))
+ .add(nvl(c.getTaxDeduction()))
+ .add(nvl(c.getOtherDeduction()))
+ .add(nvl(c.getLeaveDeduction()));
+ return income.subtract(deduction).setScale(2, RoundingMode.HALF_UP);
+ }
+
+ private static BigDecimal nvl(BigDecimal v) {
+ return v == null ? BigDecimal.ZERO : v;
+ }
+
/**
* 鍐呴儴鐢熸垚鍙戞斁鍙拌处鏂规硶锛堜緵鑷姩鐢熸垚璋冪敤锛�
*/
--
Gitblit v1.9.3