Просмотр исходного кода

Merge branch 'master' of http://47.100.37.243:10191/quyueting/manHourHousekeeper

QuYueTing 4 дней назад
Родитель
Сommit
3bc4dce1fd

+ 62 - 41
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java

@@ -2629,10 +2629,13 @@ public class UserCorpwxTimeController {
             }
             }
             monthQuery.orderByAsc("create_date", "name");
             monthQuery.orderByAsc("create_date", "name");
             List<UserCorpwxTime> monthList  = userCorpwxTimeMapper.selectList(monthQuery);
             List<UserCorpwxTime> monthList  = userCorpwxTimeMapper.selectList(monthQuery);
-            List<LocalDate> restDayDates = WorkDayCalculateUtils.getNonWorkDaysListInRange(
+            List<LocalDate> allRestDayDates = WorkDayCalculateUtils.getNonWorkDaysListInRange(
                     monthStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
                     monthStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")),
                     monthEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
                     monthEnd.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))
             );
             );
+            List<String> allRestDayList = allRestDayDates.stream().map(d -> d.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))).collect(Collectors.toList());
+            //todo 法定三倍工资工作日 法定节假日
+            List<LocalDate> restDayDates = TriplePayDayChecker.getTriplePayDaysInRange(monthStart,monthEnd);
             List<String> restDayList = restDayDates.stream().map(d -> d.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))).collect(Collectors.toList());
             List<String> restDayList = restDayDates.stream().map(d -> d.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))).collect(Collectors.toList());
 
 
             Map<String, List<UserCorpwxTime>> grouped = monthList.stream()
             Map<String, List<UserCorpwxTime>> grouped = monthList.stream()
@@ -2655,19 +2658,19 @@ public class UserCorpwxTimeController {
                 Map<String, UserCorpwxTime> dayMap = userTimes.stream()
                 Map<String, UserCorpwxTime> dayMap = userTimes.stream()
                         .collect(Collectors.toMap(t -> t.getCreateDate().format(df), t -> t, (a, b) -> a));
                         .collect(Collectors.toMap(t -> t.getCreateDate().format(df), t -> t, (a, b) -> a));
                 List<String> attendanceArray = new ArrayList<>();
                 List<String> attendanceArray = new ArrayList<>();
-                double legalHolidayCount = 0D;
-                double yearLeaveCount = 0D;
-                double marriageLeaveCount = 0D;
-                double paternityLeaveCount = 0D;
-                double maternityLeaveCount = 0D;
-                double bereavementLeaveCount = 0D;
-                double transferLeaveCount = 0D;
-                double sickLeaveCount = 0D;
-                double personalLeaveCount = 0D;
+                BigDecimal legalHolidayCount = new BigDecimal(0);
+                BigDecimal yearLeaveCount = new BigDecimal(0);
+                BigDecimal marriageLeaveCount = new BigDecimal(0);
+                BigDecimal paternityLeaveCount = new BigDecimal(0);
+                BigDecimal maternityLeaveCount = new BigDecimal(0);
+                BigDecimal bereavementLeaveCount = new BigDecimal(0);
+                BigDecimal transferLeaveCount = new BigDecimal(0);
+                BigDecimal sickLeaveCount = new BigDecimal(0);
+                BigDecimal personalLeaveCount = new BigDecimal(0);
                 int lateCount = 0;
                 int lateCount = 0;
                 int missingCardCount = 0;
                 int missingCardCount = 0;
                 Set<String> nonWorkDaySet = new HashSet<>(restDayList);
                 Set<String> nonWorkDaySet = new HashSet<>(restDayList);
-                legalHolidayCount=nonWorkDaySet.size();
+                legalHolidayCount=new BigDecimal(nonWorkDaySet.size());
                 for (int i = 1; i <= daysInMonth; i++) {
                 for (int i = 1; i <= daysInMonth; i++) {
                     LocalDate date = monthStart.withDayOfMonth(i);
                     LocalDate date = monthStart.withDayOfMonth(i);
                     String dateStr = date.format(df);
                     String dateStr = date.format(df);
@@ -2676,29 +2679,37 @@ public class UserCorpwxTimeController {
                     if (time != null) {
                     if (time != null) {
                         String leaveType = StringUtils.hasText(time.getAskLeaveType()) ? time.getAskLeaveType().trim() : "";
                         String leaveType = StringUtils.hasText(time.getAskLeaveType()) ? time.getAskLeaveType().trim() : "";
                         if (time.getAskLeaveTime() != null && time.getAskLeaveTime() > 0) {
                         if (time.getAskLeaveTime() != null && time.getAskLeaveTime() > 0) {
-                            if ("年假".equals(leaveType)) {
-                                yearLeaveCount +=1;
-                            } else if ("婚假".equals(leaveType)) {
-                                marriageLeaveCount +=1;
-                            } else if ("陪产假".equals(leaveType)) {
-                                paternityLeaveCount +=1;
-                            } else if ("产假".equals(leaveType)) {
-                                maternityLeaveCount +=1;
-                            } else if ("丧假".equals(leaveType)) {
-                                bereavementLeaveCount +=1;
-                            } else if ("T".equals(leaveType)) {
-                                transferLeaveCount +=1;
-                            } else if ("B".equals(leaveType)) {
-                                sickLeaveCount +=1;
-                            } else if ("事假".equals(leaveType)) {
-                                personalLeaveCount +=1;
+                            //如果不是工作日 排除掉计算
+                            if(WorkDayCalculateUtils.isWorkDay(date)){
+                                Double askLeaveTime = time.getAskLeaveTime();
+                                BigDecimal decimal = new BigDecimal(askLeaveTime);
+                                BigDecimal bigDecimal = new BigDecimal(8);
+                                BigDecimal divide = decimal.divide(bigDecimal, 3,RoundingMode.HALF_UP);
+                                if ("年假".equals(leaveType)) {
+                                    yearLeaveCount=yearLeaveCount.add(divide);
+                                } else if ("婚假".equals(leaveType)) {
+                                    marriageLeaveCount=marriageLeaveCount.add(divide);
+                                } else if ("陪产假".equals(leaveType)) {
+                                    paternityLeaveCount=paternityLeaveCount.add(divide);
+                                } else if ("产假".equals(leaveType)) {
+                                    maternityLeaveCount=maternityLeaveCount.add(divide);
+                                } else if ("丧假".equals(leaveType)) {
+                                    bereavementLeaveCount=bereavementLeaveCount.add(divide);
+                                } else if ("T".equals(leaveType)) {
+                                    transferLeaveCount=transferLeaveCount.add(divide);
+                                } else if ("B".equals(leaveType)) {
+                                    sickLeaveCount=sickLeaveCount.add(divide);
+                                } else if ("事假".equals(leaveType)) {
+                                    personalLeaveCount=personalLeaveCount.add(divide);
+                                }
+                                value = leaveType+askLeaveTime;
                             }
                             }
-                            value = leaveType+time.getAskLeaveTime();
                         } else if (time.getWorkHours() != null && time.getWorkHours() > 0) {
                         } else if (time.getWorkHours() != null && time.getWorkHours() > 0) {
                             value ="√";
                             value ="√";
-                        } else if (time.getCardTime() != null && time.getCardTime() > 0) {
-                            value = String.valueOf(time.getCardTime());
                         }
                         }
+//                        else if (time.getCardTime() != null && time.getCardTime() > 0) {
+//                            value = String.valueOf(time.getCardTime());
+//                        }
                         if (time.getOtStatus() != null && time.getOtStatus() == 2) {
                         if (time.getOtStatus() != null && time.getOtStatus() == 2) {
                             missingCardCount += 1;
                             missingCardCount += 1;
                         }
                         }
@@ -2708,19 +2719,29 @@ public class UserCorpwxTimeController {
                     }
                     }
                     attendanceArray.add(value);
                     attendanceArray.add(value);
                 }
                 }
+                legalHolidayCount.setScale(3,RoundingMode.HALF_UP);
+                yearLeaveCount.setScale(3,RoundingMode.HALF_UP);
+                marriageLeaveCount.setScale(3,RoundingMode.HALF_UP);
+                paternityLeaveCount.setScale(3,RoundingMode.HALF_UP);
+                maternityLeaveCount.setScale(3,RoundingMode.HALF_UP);
+                bereavementLeaveCount.setScale(3,RoundingMode.HALF_UP);
+                transferLeaveCount.setScale(3,RoundingMode.HALF_UP);
+                sickLeaveCount.setScale(3,RoundingMode.HALF_UP);
+                personalLeaveCount.setScale(3,RoundingMode.HALF_UP);
+
                 row.put("attendanceArray", attendanceArray);
                 row.put("attendanceArray", attendanceArray);
-                row.put("legalHolidayCount", legalHolidayCount);
-                row.put("yearLeaveCount", yearLeaveCount);
-                row.put("marriageLeaveCount", marriageLeaveCount);
-                row.put("paternityLeaveCount", paternityLeaveCount);
-                row.put("maternityLeaveCount", maternityLeaveCount);
-                row.put("bereavementLeaveCount", bereavementLeaveCount);
-                row.put("transferLeaveCount", transferLeaveCount);
-                row.put("sickLeaveCount", sickLeaveCount);
-                row.put("personalLeaveCount", personalLeaveCount);
+                row.put("legalHolidayCount", legalHolidayCount.doubleValue());
+                row.put("yearLeaveCount", yearLeaveCount.doubleValue());
+                row.put("marriageLeaveCount", marriageLeaveCount.doubleValue());
+                row.put("paternityLeaveCount", paternityLeaveCount.doubleValue());
+                row.put("maternityLeaveCount", maternityLeaveCount.doubleValue());
+                row.put("bereavementLeaveCount", bereavementLeaveCount.doubleValue());
+                row.put("transferLeaveCount", transferLeaveCount.doubleValue());
+                row.put("sickLeaveCount", sickLeaveCount.doubleValue());
+                row.put("personalLeaveCount", personalLeaveCount.doubleValue());
                 row.put("lateCount", lateCount);
                 row.put("lateCount", lateCount);
                 row.put("missingCardCount", missingCardCount);
                 row.put("missingCardCount", missingCardCount);
-                row.put("shouldAttendCount", daysInMonth - restDayList.size());
+                row.put("shouldAttendCount", daysInMonth - allRestDayDates.size());
                 row.put("actualAttendanceCount", attendanceArray.stream().filter(s -> s != null && !s.isEmpty() && "√".equals(s)).count());
                 row.put("actualAttendanceCount", attendanceArray.stream().filter(s -> s != null && !s.isEmpty() && "√".equals(s)).count());
                 row.put("daysCount", daysInMonth);
                 row.put("daysCount", daysInMonth);
                 attendanceList.add(row);
                 attendanceList.add(row);
@@ -2745,7 +2766,7 @@ public class UserCorpwxTimeController {
             }
             }
             result.put("dateList", dateList);
             result.put("dateList", dateList);
             result.put("weekList", weekList);
             result.put("weekList", weekList);
-            result.put("restDayList", restDayList);
+            result.put("restDayList", allRestDayList);
             result.put("list", attendanceList);
             result.put("list", attendanceList);
             result.put("records", attendanceList);
             result.put("records", attendanceList);
             result.put("total", userPage.getTotal());
             result.put("total", userPage.getTotal());

+ 139 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/util/TriplePayDayChecker.java

@@ -0,0 +1,139 @@
+package com.management.platform.util;
+
+import java.time.LocalDate;
+import java.time.Month;
+import java.util.*;
+
+/**
+ * 法定三倍工资日判断工具(2026年数据)
+ * 依据:《劳动法》第四十四条 法定休假日安排工作支付300%工资
+ */
+public class TriplePayDayChecker {
+
+    // 存储所有法定三倍工资日(支持未来扩展多年份)
+    private static final Set<LocalDate> TRIPLE_PAY_DAYS = new HashSet<>();
+
+    static {
+        // ==================== 2026年数据 ====================
+        // 1. 元旦(1天)
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.JANUARY, 1));
+
+        // 2. 春节(4天:除夕至初三)
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.FEBRUARY, 16));
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.FEBRUARY, 17));
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.FEBRUARY, 18));
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.FEBRUARY, 19));
+
+        // 3. 清明节(1天)
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.APRIL, 5));
+
+        // 4. 劳动节(2天)
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.MAY, 1));
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.MAY, 2));
+
+        // 5. 端午节(1天)
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.JUNE, 19));
+
+        // 6. 中秋节(1天)
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.SEPTEMBER, 25));
+
+        // 7. 国庆节(3天)
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.OCTOBER, 1));
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.OCTOBER, 2));
+        TRIPLE_PAY_DAYS.add(LocalDate.of(2026, Month.OCTOBER, 3));
+
+        // ==================== 未来年份可在此追加 ====================
+        // 例如:TRIPLE_PAY_DAYS.add(LocalDate.of(2027, ...));
+    }
+
+    /**
+     * 判断单日是否为三倍工资日
+     */
+    public static boolean isTriplePayDay(LocalDate date) {
+        return date != null && TRIPLE_PAY_DAYS.contains(date);
+    }
+
+    /**
+     * 获取日期范围内所有的三倍工资日列表
+     * @param start 开始日期(包含)
+     * @param end   结束日期(包含)
+     * @return 符合条件的日期列表(按日期升序),若参数非法则返回空列表
+     */
+    public static List<LocalDate> getTriplePayDaysInRange(LocalDate start, LocalDate end) {
+        if (start == null || end == null || start.isAfter(end)) {
+            return Collections.emptyList();
+        }
+
+        List<LocalDate> result = new ArrayList<>();
+        LocalDate current = start;
+        while (!current.isAfter(end)) {
+            if (isTriplePayDay(current)) {
+                result.add(current);
+            }
+            current = current.plusDays(1);
+        }
+        return result;
+    }
+
+    /**
+     * 统计日期范围内三倍工资日的总天数
+     * @param start 开始日期(包含)
+     * @param end   结束日期(包含)
+     * @return 符合条件的总天数
+     */
+    public static long countTriplePayDaysInRange(LocalDate start, LocalDate end) {
+        if (start == null || end == null || start.isAfter(end)) {
+            return 0L;
+        }
+
+        long count = 0;
+        LocalDate current = start;
+        while (!current.isAfter(end)) {
+            if (isTriplePayDay(current)) {
+                count++;
+            }
+            current = current.plusDays(1);
+        }
+        return count;
+    }
+
+    // ==================== 测试用例 ====================
+    public static void main(String[] args) {
+        // 场景1:查询2026年1月1日至1月5日
+        LocalDate start1 = LocalDate.of(2026, 1, 1);
+        LocalDate end1 = LocalDate.of(2026, 1, 5);
+        System.out.println("范围1: " + start1 + " 至 " + end1);
+        System.out.println("三倍工资日列表: " + getTriplePayDaysInRange(start1, end1));
+        System.out.println("三倍工资天数: " + countTriplePayDaysInRange(start1, end1));
+        // 输出: [2026-01-01],共1天
+
+        System.out.println("------------------------");
+
+        // 场景2:查询2026年春节前后(2月14日至2月20日)
+        LocalDate start2 = LocalDate.of(2026, 2, 14);
+        LocalDate end2 = LocalDate.of(2026, 2, 20);
+        System.out.println("范围2: " + start2 + " 至 " + end2);
+        System.out.println("三倍工资日列表: " + getTriplePayDaysInRange(start2, end2));
+        System.out.println("三倍工资天数: " + countTriplePayDaysInRange(start2, end2));
+        // 输出: [2026-02-16, 2026-02-17, 2026-02-18, 2026-02-19],共4天
+
+        System.out.println("------------------------");
+
+        // 场景3:查询国庆+中秋假期(9月25日至10月7日)
+        LocalDate start3 = LocalDate.of(2026, 9, 25);
+        LocalDate end3 = LocalDate.of(2026, 10, 7);
+        System.out.println("范围3: " + start3 + " 至 " + end3);
+        System.out.println("三倍工资日列表: " + getTriplePayDaysInRange(start3, end3));
+        System.out.println("三倍工资天数: " + countTriplePayDaysInRange(start3, end3));
+        // 输出: [2026-09-25, 2026-10-01, 2026-10-02, 2026-10-03],共4天
+
+        System.out.println("------------------------");
+
+        // 场景4:跨年查询(2026年底至2027年初)——2027年暂未录入,只显示2026年的
+        LocalDate start4 = LocalDate.of(2026, 12, 31);
+        LocalDate end4 = LocalDate.of(2027, 1, 5);
+        System.out.println("范围4: " + start4 + " 至 " + end4);
+        System.out.println("三倍工资日列表: " + getTriplePayDaysInRange(start4, end4));
+        // 输出: [](因为2027年元旦未录入,且2026年12月31日不是三倍日)
+    }
+}