From 9e9f0e2d9f6fcce7dcea88b181b3c7e6069e8a1b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 02 十一月 2026 16:51:55 +0800
Subject: [PATCH] fix(hrm): 请假跨月按天分摊扣款,加班工资按薪酬结构倍率计算
---
yudao-module-hrm/src/main/java/cn/iocoder/yudao/module/hrm/service/salary/HrmSalaryCalculationServiceImpl.java | 37 ++++++++++++++++++++++++++++++++++++-
1 files changed, 36 insertions(+), 1 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 6cf8b19..5e24cc8 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
@@ -43,6 +43,7 @@
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.YearMonth;
+import java.time.temporal.ChronoUnit;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -358,7 +359,8 @@
BigDecimal totalLeaveDeduction = BigDecimal.ZERO;
for (HrmLeaveApplicationDO application : leaveApplications) {
Integer leaveType = application.getLeaveType();
- BigDecimal duration = application.getDuration() != null ? application.getDuration() : BigDecimal.ZERO;
+ // 璺ㄦ湀璇峰亣鎸夎惤鍦ㄦ湰鏍哥畻鏈堝唴鐨勫ぉ鏁版姌绠楋紝閬垮厤鏁存潯璇峰亣琚烦杩囨垨琚噸澶嶈鍏�
+ BigDecimal duration = resolveDurationInMonth(application, monthStart, monthEnd);
BigDecimal deductionRatio = configMap.getOrDefault(leaveType, BigDecimal.ZERO);
// 璇峰亣鎵f = 鏃ュ伐璧� 脳 璇峰亣澶╂暟 脳 鎵f姣斾緥
@@ -371,6 +373,39 @@
}
/**
+ * 璁$畻涓�绗旇鍋囪惤鍦ㄦ湰鏍哥畻鏈堝唴鐨勮鍋囨椂闀�
+ *
+ * 1锛夎鍋囨暣娈甸兘鍦ㄦ湰鏈堝唴锛氱洿鎺ュ彇璇峰亣鍗曚笂鐨勬椂闀匡紱
+ * 2锛夎鍋囪法鏈堬細鎸夈�屾湰鏈堝唴鍗犵敤鐨勮嚜鐒舵棩 / 璇峰亣鎬昏嚜鐒舵棩銆嶆姌绠楋紝渚嬪 10-28 ~ 11-03 鍏� 7 澶╋紝
+ * 鍏朵腑 10 鏈堝崰 4 澶╋紝鍒� 10 鏈堟牳绠楁寜 鏃堕暱 脳 4 / 7 璁★紝11 鏈堟寜 鏃堕暱 脳 3 / 7 璁★紝閬垮厤閲嶅鎴栨紡绠椼��
+ */
+ private BigDecimal resolveDurationInMonth(HrmLeaveApplicationDO application,
+ LocalDateTime monthStart, LocalDateTime monthEnd) {
+ BigDecimal duration = application.getDuration() != null ? application.getDuration() : BigDecimal.ZERO;
+ LocalDateTime start = application.getStartTime();
+ LocalDateTime end = application.getEndTime();
+ if (start == null || end == null) {
+ return duration;
+ }
+ // 鏁存閮藉湪鏈湀鍐�
+ if (!start.isBefore(monthStart) && !end.isAfter(monthEnd)) {
+ return duration;
+ }
+ long totalDays = ChronoUnit.DAYS.between(start.toLocalDate(), end.toLocalDate()) + 1;
+ if (totalDays <= 0) {
+ return duration;
+ }
+ LocalDateTime overlapStart = start.isBefore(monthStart) ? monthStart : start;
+ LocalDateTime overlapEnd = end.isAfter(monthEnd) ? monthEnd : end;
+ if (overlapStart.isAfter(overlapEnd)) {
+ return BigDecimal.ZERO;
+ }
+ long overlapDays = ChronoUnit.DAYS.between(overlapStart.toLocalDate(), overlapEnd.toLocalDate()) + 1;
+ return duration.multiply(BigDecimal.valueOf(overlapDays))
+ .divide(BigDecimal.valueOf(totalDays), 4, RoundingMode.HALF_UP);
+ }
+
+ /**
* 姹囨�诲綋鏈堝鎵归�氳繃鐨勫姞鐝敵璇枫�傚皬鏃跺伐璧勬寜鍩烘湰宸ヨ祫 / 21.75 / 8 璁$畻锛�
* 宸ヤ綔鏃ラ粯璁� 1.5 鍊嶃�佷紤鎭棩榛樿 2 鍊嶃�佹硶瀹氳妭鍋囨棩榛樿 3 鍊嶏紝鍧囧彲鐢辫柂閰粨鏋勮鐩栥��
*/
--
Gitblit v1.9.3