From ebe27b0d9f9cf990e34142e79ebc60ab4081f65a Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 04 十一月 2026 15:33:30 +0800
Subject: [PATCH] 九鸿:工资表所有数值字段支持自动计算后手工调整,保存以页面值为准

---
 yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java |   61 +++++++++++++++---------------
 1 files changed, 30 insertions(+), 31 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 edc86ab..e27665c 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
@@ -731,21 +731,14 @@
     }
 
     /**
-     * 淇濆瓨鍓嶆寜涔濇硴宸ヨ祫琛ㄥ彛寰勯噸绠楀悎璁★紝閬垮厤鍓嶇婕忕畻鎴栨棫瀹㈡埛绔紶鍏ヤ笉涓�鑷寸殑鍚堣鍊笺��
+     * 淇濆瓨鍓嶈ˉ榻愬悎璁″瓧娈点��
      *
-     * 鍔犻」鍚堣 = 宸ラ緞宸ヨ祫 + 澶滅彮琛ュ姪 + 瀛﹀巻琛ヨ创 + 浣撴 + 浼樼鍛樺伐濂� + 鍏朵粬琛ュ姪 + 閮ㄩ棬缁╂晥
-     * 鎵f鍚堣 = 婕忔墦鍗� + 杩熷埌鏃╅�� + 鍏朵粬鎵f
-     * 绋庡悗宸ヨ祫 = 搴斾粯宸ヨ祫 + 鍔犻」鍚堣 - 鎵f鍚堣 - 绀句繚 - 鍏Н閲� - 涓◣
-     *
-     * 浠呭綋鏈璁板綍甯︽湁銆屽簲浠樺伐璧勩�嶆椂閲嶇畻锛涘彧鏈夋棫瀛楁鐨勮�佹暟鎹繚鎸佸師鏍凤紝閬垮厤鎶婃湭缁存姢鐨勬柊瀛楁娓呮垚 0銆�
+     * 宸ヨ祫琛ㄧ殑姣忎釜鏁板�煎瓧娈甸兘鍏佽鍦ㄨ嚜鍔ㄨ绠楀悗鎵嬪伐璋冩暣锛屽洜姝よ繖閲�**鍙ˉ绌哄�笺�佷笉瑕嗙洊鎻愪氦鍊�**锛�
+     * 鍓嶇棰勮椤靛凡缁忔寜鍚屽彛寰勯噸绠楀ソ搴斾粯宸ヨ祫/鍔犻」鍚堣/鎵f鍚堣/绋庡悗宸ヨ祫骞朵竴璧锋彁浜わ紝
+     * 鐩存帴钀藉簱鎵嶈兘淇濅綇鐢ㄦ埛鎵嬪伐鏀硅繃鐨勬暟锛涘彧鏈夊瓧娈典负绌猴紙鏃у鎴风銆佹帴鍙g洿璋冿級鏃舵墠鎸夊彛寰勮ˉ绠椼��
      */
     private void normalizeSalaryTotals(HrmSalaryCalculationDO calculation) {
-        if (calculation.getPayableSalary() == null) {
-            return;
-        }
-        // 搴斾粯宸ヨ祫 = 鏍囧噯鍑哄嫟宸ヨ祫 + 鍔犵彮宸ヨ祫 + 娉曞畾鍋囧伐璧� + 瀹夊叏鐜繚濂� + 娴姩缁╂晥宸ヨ祫
-        // 浠呭綋鏈璁板綍甯︽柊鐗堟爣鍑嗛」鏃堕噸绠楋紝閬垮厤鏃ф暟鎹紙鏃犺繖浜涘垪锛夎娓呴浂
-        if (calculation.getStandardAttendancePay() != null) {
+        if (calculation.getPayableSalary() == null && calculation.getStandardAttendancePay() != null) {
             calculation.setPayableSalary(nvl(calculation.getStandardAttendancePay())
                     .add(nvl(calculation.getOvertimePay()))
                     .add(nvl(calculation.getLegalHolidayPay()))
@@ -753,25 +746,31 @@
                     .add(nvl(calculation.getFloatingPerformancePay()))
                     .setScale(2, RoundingMode.HALF_UP));
         }
-        BigDecimal additionTotal = nvl(calculation.getSeniorityPay())
-                .add(nvl(calculation.getNightShiftAllowance()))
-                .add(nvl(calculation.getEducationAllowance()))
-                .add(nvl(calculation.getHealthCheckAllowance()))
-                .add(nvl(calculation.getExcellentEmployeeAward()))
-                .add(nvl(calculation.getOtherSubsidy()))
-                .add(nvl(calculation.getDeptPerformance()));
-        BigDecimal deductionTotal = nvl(calculation.getMissedPunchDeduction())
-                .add(nvl(calculation.getLateEarlyDeduction()))
-                .add(nvl(calculation.getOtherDeduction()));
-        calculation.setAdditionTotal(additionTotal.setScale(2, RoundingMode.HALF_UP));
-        calculation.setDeductionTotal(deductionTotal.setScale(2, RoundingMode.HALF_UP));
-        calculation.setActualSalary(calculation.getPayableSalary()
-                .add(calculation.getAdditionTotal())
-                .subtract(calculation.getDeductionTotal())
-                .subtract(nvl(calculation.getSocialSecurityDeduction()))
-                .subtract(nvl(calculation.getHousingFundDeduction()))
-                .subtract(nvl(calculation.getTaxDeduction()))
-                .setScale(2, RoundingMode.HALF_UP));
+        if (calculation.getAdditionTotal() == null) {
+            BigDecimal additionTotal = nvl(calculation.getSeniorityPay())
+                    .add(nvl(calculation.getNightShiftAllowance()))
+                    .add(nvl(calculation.getEducationAllowance()))
+                    .add(nvl(calculation.getHealthCheckAllowance()))
+                    .add(nvl(calculation.getExcellentEmployeeAward()))
+                    .add(nvl(calculation.getOtherSubsidy()))
+                    .add(nvl(calculation.getDeptPerformance()));
+            calculation.setAdditionTotal(additionTotal.setScale(2, RoundingMode.HALF_UP));
+        }
+        if (calculation.getDeductionTotal() == null) {
+            BigDecimal deductionTotal = nvl(calculation.getMissedPunchDeduction())
+                    .add(nvl(calculation.getLateEarlyDeduction()))
+                    .add(nvl(calculation.getOtherDeduction()));
+            calculation.setDeductionTotal(deductionTotal.setScale(2, RoundingMode.HALF_UP));
+        }
+        if (calculation.getActualSalary() == null && calculation.getPayableSalary() != null) {
+            calculation.setActualSalary(calculation.getPayableSalary()
+                    .add(nvl(calculation.getAdditionTotal()))
+                    .subtract(nvl(calculation.getDeductionTotal()))
+                    .subtract(nvl(calculation.getSocialSecurityDeduction()))
+                    .subtract(nvl(calculation.getHousingFundDeduction()))
+                    .subtract(nvl(calculation.getTaxDeduction()))
+                    .setScale(2, RoundingMode.HALF_UP));
+        }
     }
 
     /**

--
Gitblit v1.9.3