From 52e4ba6897d5d808c4ed08720bbebad9cb006103 Mon Sep 17 00:00:00 2001
From: tuqin <tuqin@tuqin.cn>
Date: 星期四, 05 十一月 2026 13:48:56 +0800
Subject: [PATCH] fix(hrm): 修复生成考勤统计报错、实出天数翻倍;调岗/离职审批通过同步人员信息
---
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java | 43 +++++++++++++++++++++++++++----------------
1 files changed, 27 insertions(+), 16 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 faa80ef..647f3a1 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
@@ -314,9 +314,14 @@
.setScale(2, RoundingMode.HALF_UP);
}
- // 璁$畻璇峰亣鎵f
- // 璁$畻缂哄嫟鎵f锛堣鍋� + 鏃峰伐锛�
- BigDecimal leaveDeduction = calculateAttendanceDeduction(employee, period, baseSalary, workDays, actualDays);
+ // 缂哄嫟鎵f锛堣鍋� + 鏃峰伐锛�
+ // 璁¤柂鍩烘暟 = 鍩烘湰宸ヨ祫 + 宀椾綅宸ヨ祫 + 宸ラ緞宸ヨ祫 + 缁╂晥宸ヨ祫锛堣繖浜涗笌鍑哄嫟澶╂暟鐩存帴鐩稿叧锛夛紱
+ // 涓嶅惈鍔犵彮璐�/鍚勯」琛ヨ创/鍏ㄥ嫟濂栵紙杩欎簺涓嶉殢鍑哄嫟澶╂暟鎶樼畻锛夈��
+ // 娉ㄦ剰锛氫笉鑳界敤"鍩烘湰宸ヨ祫"褰撳熀鏁扳�斺�斿緢澶氬憳宸ュ伐璧勪富浣撴槸宀椾綅宸ヨ祫锛屽惁鍒欏疄鍑� 0 澶╂椂鍙墸鎺夊熀鏈伐璧勶紝宀椾綅宸ヨ祫鐓у彂銆�
+ BigDecimal attendanceBaseSalary = baseSalary
+ .add(postSalary).add(senioritySalary).add(performanceSalary);
+ BigDecimal leaveDeduction = calculateAttendanceDeduction(
+ employee, period, attendanceBaseSalary, workDays, actualDays);
// 璁$畻涓◣鎵i櫎
// 搴旂撼绋庢墍寰楅 = 搴斿彂宸ヨ祫 - 绀句繚鎵i櫎 - 鍏Н閲戞墸闄� - 璧峰緛鐐�(5000)
@@ -376,18 +381,18 @@
* <li>鎵f鎬婚灏侀《涓哄熀鏈伐璧勶紝閬垮厤鍑虹幇璐熷伐璧勩��</li>
* </ol>
*
- * @param employee 鍛樺伐淇℃伅
- * @param period 鏍哥畻鍛ㄦ湡锛堝 2026-02锛�
- * @param baseSalary 鍩烘湰宸ヨ祫
- * @param workDays 搴斿嚭澶╂暟锛堟帓鐝疮璁★紝鏃犳帓鐝椂浼� 22锛�
- * @param actualDays 瀹炲嚭澶╂暟锛堝彇鑷�冨嫟姹囨�伙紱null 琛ㄧず璇ユ湀鏈敓鎴愭眹鎬伙級
- * @return 缂哄嫟鎵f閲戦
+ * @param employee 鍛樺伐淇℃伅
+ * @param period 鏍哥畻鍛ㄦ湡锛堝 2026-02锛�
+ * @param attendanceBase 璁¤柂鍩烘暟 = 鍩烘湰 + 宀椾綅 + 宸ラ緞 + 缁╂晥锛堜笌鍑哄嫟鐩存帴鐩稿叧鐨勫浐瀹氬伐璧勶級
+ * @param workDays 搴斿嚭澶╂暟锛堟帓鐝疮璁★紝鏃犳帓鐝椂浼� 22锛�
+ * @param actualDays 瀹炲嚭澶╂暟锛堝彇鑷�冨嫟姹囨�伙紱null 琛ㄧず璇ユ湀鏈敓鎴愭眹鎬伙級
+ * @return 缂哄嫟鎵f閲戦锛堝皝椤朵负璁¤柂鍩烘暟锛�
*/
private BigDecimal calculateAttendanceDeduction(HrmEmployeeDO employee, String period,
- BigDecimal baseSalary, Integer workDays, Integer actualDays) {
+ BigDecimal attendanceBase, Integer workDays, Integer actualDays) {
int shouldDays = (workDays != null && workDays > 0) ? workDays : 22;
- // 鏃ュ伐璧� = 鍩烘湰宸ヨ祫 / 搴斿嚭澶╂暟锛堜繚鐣� 4 浣嶏紝鏈�鍚庣粺涓�淇濈暀 2 浣嶏級
- BigDecimal dailySalary = baseSalary.divide(new BigDecimal(shouldDays), 4, RoundingMode.HALF_UP);
+ // 鏃ュ伐璧� = 璁¤柂鍩烘暟 / 搴斿嚭澶╂暟锛堜繚鐣� 4 浣嶏紝鏈�鍚庣粺涓�淇濈暀 2 浣嶏級
+ BigDecimal dailySalary = attendanceBase.divide(new BigDecimal(shouldDays), 4, RoundingMode.HALF_UP);
BigDecimal totalDeduction = BigDecimal.ZERO;
BigDecimal leaveDays = BigDecimal.ZERO;
@@ -428,7 +433,7 @@
// 3. 灏侀《锛氭墸娆句笉瓒呰繃鍩烘湰宸ヨ祫
BigDecimal result = totalDeduction.setScale(2, RoundingMode.HALF_UP);
- BigDecimal cap = baseSalary.setScale(2, RoundingMode.HALF_UP);
+ BigDecimal cap = attendanceBase.setScale(2, RoundingMode.HALF_UP);
return result.compareTo(cap) > 0 ? cap : result;
}
@@ -766,16 +771,22 @@
* 閲嶇畻銆岀己鍕ゆ墸娆俱�嶄笌銆屽疄鍙戝伐璧勩��
*
* <p>鏍哥畻鍗� userId 瀛樼殑鏄憳宸D锛坔rm_employee.id锛夈�傛寜銆屽簲鍑哄ぉ鏁� / 瀹炲嚭澶╂暟 + 璇峰亣鍗曘�嶉噸绠�
- * 缂哄嫟鎵f锛堣鍋囨寜閰嶇疆姣斾緥鎵c�佹椃宸ユ寜 100% 鎵c�佸皝椤跺熀鏈伐璧勶級锛屽啀閲嶇畻瀹炲彂宸ヨ祫锛堜笉鍙负璐燂級銆�
- * 鏌ヤ笉鍒板憳宸ユ垨鏍哥畻鍛ㄦ湡鏃讹紝淇濈暀鍘熺己鍕ゆ墸娆撅紝鍙噸绠楀疄鍙戙��
+ * 缂哄嫟鎵f锛堣鍋囨寜閰嶇疆姣斾緥鎵c�佹椃宸ユ寜 100% 鎵c�佸皝椤惰钖熀鏁帮級锛屽啀閲嶇畻瀹炲彂宸ヨ祫锛堜笉鍙负璐燂級銆�
+ *
+ * <p>璁¤柂鍩烘暟 = 鍩烘湰 + 宀椾綅 + 宸ラ緞 + 缁╂晥锛堜笌鍑哄嫟鐩存帴鐩稿叧鐨勫浐瀹氬伐璧勯儴鍒嗭級锛�
+ * 涓嶈兘鐢ㄥ熀鏈伐璧勫崟鐙皝椤讹紝鍚﹀垯宸ヨ祫涓讳綋涓哄矖浣嶅伐璧勭殑鍛樺伐瀹炲嚭 0 澶╂椂浠嶄細鍙戞斁澶ч儴鍒嗗伐璧勩��
*/
private void recalcAttendanceDeduction(HrmSalaryCalculationDO calculation) {
HrmEmployeeDO employee = calculation.getUserId() != null
? employeeMapper.selectById(calculation.getUserId()) : null;
if (employee != null && calculation.getPeriod() != null) {
+ BigDecimal attendanceBaseSalary = nvl(calculation.getBaseSalary())
+ .add(nvl(calculation.getPostSalary()))
+ .add(nvl(calculation.getSenioritySalary()))
+ .add(nvl(calculation.getPerformanceSalary()));
BigDecimal deduction = calculateAttendanceDeduction(
employee, calculation.getPeriod(),
- nvl(calculation.getBaseSalary()),
+ attendanceBaseSalary,
calculation.getWorkDays(),
calculation.getActualDays());
calculation.setLeaveDeduction(deduction);
--
Gitblit v1.9.3