Parcourir la source

车间日历修改

yusm il y a 1 semaine
Parent
commit
da7d1ecc3a

+ 10 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/constant/Constant.java

@@ -52,5 +52,14 @@ public class Constant {
     public static final int ZHONG_BAN=3;
     public static final int YI_CHANG=4;
     public static final int XIU_XI=5;
-    public static final int QING_JIA=6;
+    public static final int BAI_BAN_YI_CHANG_1=7;
+    public static final int BAI_BAN_YI_CHANG_2=8;
+    public static final int XIAO_YE_BAN_2=9;
+    public static final int XIAO_YE_BAN_YI_CHANG_1=10;
+    public static final int XIAO_YE_BAN_YI_CHANG_2=11;
+    public static final int QING_JIA=12;
+    public static final int JIA_BAN=13;
+    public static final int TI_QIAN_XIA_BAN=14;
+    public static final int TIAO_XIU=15;
+
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ApplyFormController.java

@@ -2,10 +2,12 @@ package com.management.platform.controller;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.demo.WorkingDaysRangeCalculator;
 import com.management.platform.entity.ApplyForm;
 import com.management.platform.entity.Attendance;
 import com.management.platform.entity.AttendanceStaff;
 import com.management.platform.entity.User;
+import com.management.platform.entity.dto.TimeRange;
 import com.management.platform.service.ApplyFormService;
 import com.management.platform.service.AttendanceService;
 import com.management.platform.service.UserService;

+ 3 - 15
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/demo/WorkingDaysRangeCalculator.java

@@ -1,5 +1,7 @@
 package com.management.platform.demo;
 
+import com.management.platform.entity.dto.TimeRange;
+
 import java.time.*;
 import java.util.*;
 import java.util.stream.*;
@@ -66,25 +68,11 @@ public class WorkingDaysRangeCalculator {
         return date.atTime(17, 0); // 其他工作日到17:00结束
     }
 
-    // 时间段类
-    public static class TimeRange {
-        private final LocalDateTime start;
-        private final LocalDateTime end;
-
-        public TimeRange(LocalDateTime start, LocalDateTime end) {
-            this.start = start;
-            this.end = end;
-        }
 
-        @Override
-        public String toString() {
-            return start + " → " + end + " (" + start.toLocalDate().getDayOfWeek() + ")";
-        }
-    }
 
     public static void main(String[] args) {
         // 测试案例
-        LocalDateTime start = LocalDateTime.of(2025, 6, 20, 18, 0); // 周一(工作日)
+        LocalDateTime start = LocalDateTime.of(2025, 6, 20, 16, 0); // 周一(工作日)
         LocalDateTime end = LocalDateTime.of(2025, 6, 26, 16, 0);   // 周日(非工作日)
 
         System.out.println("工作时间段(排除周末和节假日):");

+ 2 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/AttendanceStaff.java

@@ -93,12 +93,12 @@ public class AttendanceStaff extends Model<AttendanceStaff> {
     private BigDecimal workHour;
 
     /**
-     * 考勤状态 0白班,1大夜班,2小夜班,3中班,4班次异常,5休息,6调休,7请假
+     * 考勤状态 0白班,1大夜班,2小夜班,3中班,7异常白班1,8异常白班2,10异常小夜班1,11异常小夜班2, 12请假,13加班,14提前下班
      */
     @TableField("attendance_type")
     private Integer attendanceType;
 
-    @TableField(exist = false)
+    @TableField("attendance_type_name")
     private String attendanceTypeName; //考勤状态名称
 
     @TableField(exist = false)

+ 2 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/ApplyFormMapper.java

@@ -19,4 +19,6 @@ public interface ApplyFormMapper extends BaseMapper<ApplyForm> {
     List<ApplyForm> getListByDate(String date,String userId);
 
     List<ApplyForm> getListByFirstDateAndLastDate(LocalDate startDate, LocalDate endDate);
+
+    List<ApplyForm> getAllListByFirstDateAndLastDate(LocalDate startDate, LocalDate endDate);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ApplyFormService.java

@@ -19,4 +19,6 @@ public interface ApplyFormService extends IService<ApplyForm> {
     List<ApplyForm> getListByDate(String date,String userId);
 
     List<ApplyForm> getListByFirstDateAndLastDate(LocalDate startDate, LocalDate endDate);
+
+    List<ApplyForm> getAllListByFirstDateAndLastDate(LocalDate startDate, LocalDate nextMonthDate);
 }

+ 5 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ApplyFormServiceImpl.java

@@ -33,4 +33,9 @@ public class ApplyFormServiceImpl extends ServiceImpl<ApplyFormMapper, ApplyForm
     public List<ApplyForm> getListByFirstDateAndLastDate(LocalDate startDate, LocalDate endDate) {
         return applyFormMapper.getListByFirstDateAndLastDate(startDate,endDate);
     }
+
+    @Override
+    public List<ApplyForm> getAllListByFirstDateAndLastDate(LocalDate startDate, LocalDate nextMonthDate) {
+        return applyFormMapper.getAllListByFirstDateAndLastDate(startDate,nextMonthDate);
+    }
 }

+ 477 - 67
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/AttendanceStaffServiceImpl.java

@@ -51,7 +51,9 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
     @Override
     public HttpRespMsg refreshData(String month) {
         HttpRespMsg msg = new HttpRespMsg();
+        long l1 = System.currentTimeMillis();
         this.remove(new QueryWrapper<AttendanceStaff>().eq("month", month));
+        long l2 = System.currentTimeMillis();
 
 
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
@@ -60,13 +62,20 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
 
         LocalDate startDate = yearMonth.atDay(1);//本月开始日期
         LocalDate endDate = yearMonth.atEndOfMonth();//本月结束日期
+        LocalDate nextMonthDate = startDate.plusMonths(1);//下月开始第一天
         ArrayList<LocalDate> localDates = new ArrayList<>();//本月所有日期
         for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
            localDates.add(date);
         }
 
         List<Attendance> attendanceList = attendanceService.list(new QueryWrapper<Attendance>()
-                .eq("month", month).or().le("clock_time", localDate).orderByAsc("job_number","clock_time"));
+                .eq("month", month)
+//                .eq("job_number","LEW2322")
+                .or().le("clock_time", localDate)
+//                        .between("clock_time",LocalDate.of(2025,3,8),LocalDate.of(2025,3,11))
+                .orderByAsc("job_number","clock_time"));
+        //获取申请单数据
+        List<ApplyForm> applyFormList=applyFormService.getAllListByFirstDateAndLastDate(startDate,nextMonthDate);
 
         List<AttendanceStaff> addList = new ArrayList<>();
         Map<String, List<Attendance>> listMap = attendanceList.stream().collect(Collectors.groupingBy(Attendance::getJobNumber));
@@ -79,67 +88,200 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                 //遍历本月的日期,根据考勤记录,确定考勤的上班打卡时间,下班打卡时间,上班时间, 班次类型:白班,中班,小夜班,大夜班
                 for (LocalDate date : localDates) {
 
-
-                    LocalDateTime dayStartTime = date.atStartOfDay();//当日的最早时间
-                    LocalDateTime dayEndTime = date.plusDays(1).atStartOfDay().plusHours(10);//假设的当日大夜班到第二天的下班最晚时间
                     int year = date.getYear();
                     int monthValue = date.getMonthValue();
                     int dayValue = date.getDayOfMonth();
+
+                    AttendanceStaff staff = new AttendanceStaff();
+                    staff.setJobNumber(jobNumber);
+                    staff.setMonth(month);
+                    staff.setName(attendance.getName());
+                    staff.setDeptName(attendance.getDeptName());
+                    staff.setClockDate(date);
+
+                    Optional<ApplyForm> first = applyFormList.stream().filter(a -> !a.getStartTime().toLocalDate().isAfter(date)
+                            && !a.getEndTime().toLocalDate().isBefore(date)&&a.getApplyId().equals(jobNumber)).findFirst();
+
+                    if (first.isPresent()&&first.get().getType()!=6) {
+                        ApplyForm applyForm = first.get();
+                        //请假
+                        if (applyForm.getType()==3){
+                            //请假8小时
+                            if (applyForm.getSumTime().compareTo(BigDecimal.valueOf(8))>=0
+                                    ||(applyForm.getSumTime().compareTo(BigDecimal.valueOf(8)) < 0 &&applyForm.getStartTime().equals(LocalDateTime.of(date, LocalTime.of(8, 0))))    //请早上的假
+                                    ||(applyForm.getSumTime().compareTo(BigDecimal.valueOf(8)) < 0 &&applyForm.getEndTime().equals(LocalDateTime.of(date, LocalTime.of(17, 0))))   //请下午的假
+                            ){
+                                staff.setClockStartTime(LocalDateTime.of(date, LocalTime.of(8, 0)));
+                                staff.setClockEndTime(LocalDateTime.of(date, LocalTime.of(17, 0)));
+                                staff.setWorkHour(BigDecimal.valueOf(8));
+                                staff.setAttendanceType(QING_JIA);
+                                staff.setAttendanceTypeName(applyForm.getApplyBillName());
+                            }
+                        }
+
+                        //加班申请
+                        else if (applyForm.getType()==4){
+                            //一天都加班
+                            if (applyForm.getSumTime().compareTo(BigDecimal.valueOf(8))>=0){
+                                staff.setClockStartTime(LocalDateTime.of(date, LocalTime.of(8, 0)));
+                                staff.setClockEndTime(LocalDateTime.of(date, LocalTime.of(17, 0)));
+                                staff.setWorkHour(BigDecimal.valueOf(8));
+                                staff.setAttendanceType(JIA_BAN);
+                                staff.setAttendanceTypeName("加班");
+                            }
+                            //加班几个小时
+                            else if (applyForm.getSumTime().compareTo(BigDecimal.valueOf(8)) < 0 &&applyForm.getStartTime().equals(LocalDateTime.of(date, LocalTime.of(17, 0)))){
+                                staff.setClockStartTime(LocalDateTime.of(date, LocalTime.of(8, 0)));
+                                staff.setClockEndTime(applyForm.getEndTime());
+                                staff.setWorkHour(BigDecimal.valueOf(8).add(applyForm.getSumTime()));
+                                staff.setAttendanceType(JIA_BAN);
+                                staff.setAttendanceTypeName("加班");
+                            }
+                        }
+
+                        //提前下班申请
+                        else if (applyForm.getType()==5){
+                            //大夜班提前下班
+                            if(!applyForm.getEndTime().toLocalTime().isAfter(LocalTime.of(8, 0)) &&applyForm.getStartTime().toLocalTime().isAfter(LocalTime.of(0, 0))){
+                                staff.setClockStartTime(LocalDateTime.of(date, LocalTime.of(0, 0)));
+                                staff.setClockEndTime(LocalDateTime.of(date, LocalTime.of(8, 0)));
+                                staff.setWorkHour(BigDecimal.valueOf(8).subtract(applyForm.getSumTime()));
+                                staff.setClockDate(date.plusDays(-1));
+                                staff.setAttendanceType(TI_QIAN_XIA_BAN);
+                                staff.setAttendanceTypeName("提前下班");
+                            }
+                            //白班提前下班
+                            else if(applyForm.getEndTime().toLocalTime().equals(LocalTime.of(17, 0))){
+                                staff.setClockStartTime(LocalDateTime.of(date, LocalTime.of(8, 0)));
+                                staff.setClockEndTime(LocalDateTime.of(date, LocalTime.of(17, 0)));
+                                staff.setWorkHour(BigDecimal.valueOf(8).subtract(applyForm.getSumTime()));
+                                staff.setAttendanceType(TI_QIAN_XIA_BAN);
+                                staff.setAttendanceTypeName("提前下班");
+                            }
+                            //中班提前下班
+                            else if(applyForm.getEndTime().toLocalTime().equals(LocalTime.of(21, 0))){
+                                staff.setClockStartTime(LocalDateTime.of(date, LocalTime.of(13, 0)));
+                                staff.setClockEndTime(LocalDateTime.of(date, LocalTime.of(21, 0)));
+                                staff.setWorkHour(BigDecimal.valueOf(8).subtract(applyForm.getSumTime()));
+                                staff.setAttendanceType(TI_QIAN_XIA_BAN);
+                                staff.setAttendanceTypeName("提前下班");
+                            }
+                            //小夜班提前下班
+                            else if(applyForm.getEndTime().toLocalTime().equals(LocalTime.of(0, 0))&&applyForm.getStartTime().isAfter(LocalDateTime.of(date, LocalTime.of(16, 0)))){
+                                staff.setClockStartTime(LocalDateTime.of(date, LocalTime.of(13, 0)));
+                                staff.setClockEndTime(applyForm.getStartTime());
+                                staff.setWorkHour(BigDecimal.valueOf(8).subtract(applyForm.getSumTime()));
+                                staff.setAttendanceType(TI_QIAN_XIA_BAN);
+                                staff.setAttendanceTypeName("提前下班");
+                            }
+                            else if(applyForm.getEndTime().toLocalTime().equals(LocalTime.of(1, 0))&&applyForm.getStartTime().isAfter(LocalDateTime.of(date, LocalTime.of(17, 0)))){
+                                staff.setClockStartTime(LocalDateTime.of(date, LocalTime.of(14, 0)));
+                                staff.setClockEndTime(applyForm.getStartTime());
+                                staff.setWorkHour(BigDecimal.valueOf(8).subtract(applyForm.getSumTime()));
+                                staff.setAttendanceType(TI_QIAN_XIA_BAN);
+                                staff.setAttendanceTypeName("提前下班");
+                            }
+                        }
+                        addList.add(staff);
+                        continue;
+                    }
+                    else if (first.isPresent()&&first.get().getType()==6) {
+                        ApplyForm applyForm = first.get();
+                        Attendance a1 = new Attendance();
+                        a1.setClockTime(applyForm.getStartTime());
+                        attendances.add(a1);
+                        attendances = attendances.stream()
+                                .sorted(Comparator.comparing(Attendance::getClockTime))
+                                .collect(Collectors.toList());
+                    }
+
+
                     //早班上下班时间判断
-                    Optional<Attendance> zaoShangCount = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 7, 0))
+                    Optional<Attendance> zaoShangCount = attendances.stream().filter(a ->!a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 7, 0))
+                            &&!a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 8, 0))
+                    ).findFirst();
+                    Optional<Attendance> zaoXiaCount = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 16, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 20, 30))
+                    ).findFirst();
+                    //异常早班1时间判断
+                    Optional<Attendance> zaoShangYiChang1Count = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 8, 0))
                             && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 9, 0))
                     ).findFirst();
-                    Optional<Attendance> zaoXiaCount = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 16, 0))
-                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 19, 0))
-                    ).max(Comparator.comparing(Attendance::getClockTime));
+                    Optional<Attendance> zaoXiaYiChang1Count = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 16, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 20, 30))).findFirst();
+
+                    //异常早班2时间判断
+                    Optional<Attendance> zaoShangYiChang2Count = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 9, 0))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 10, 0))
+                    ).findFirst();
+                    Optional<Attendance> zaoXiaYiChang2Count = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 16, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 20, 30))
+                    ).findFirst();
+
                     //中班上下班时间判断
-                    Optional<Attendance> zhongShangCount = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 12, 0))
-                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 14, 0))
+                    Optional<Attendance> zhongShangCount = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 12, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 13, 30))
                     ).findFirst();
 
-                    Optional<Attendance> zhongXiaCount = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 20, 0))
-                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 23, 0))
-                    ).max(Comparator.comparing(Attendance::getClockTime));
-                    //小夜班上下班时间判断
-                    Optional<Attendance> xiaoYeShangCount = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 15, 0))
-                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 19, 0))
+                    Optional<Attendance> zhongXiaCount = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 20, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 21, 30))
+                    ).findFirst();
+                    //小夜班(1)上下班时间判断
+                    Optional<Attendance> xiaoYeShangCount = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 15, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 16, 30))
                     ).findFirst();
 
                     boolean isLastDay = endDate.isEqual(LocalDate.of(year, monthValue, dayValue));//是否是该月份最后一天
                     Optional<Attendance> xiaoYeXiaCount = isLastDay ?
-                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 22, 0))
-                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue+1, 1, 3, 0))
-                    ).max(Comparator.comparing(Attendance::getClockTime)) :
-                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 22, 0))
-                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue+1, 3, 0))
-                    ).max(Comparator.comparing(Attendance::getClockTime));
-                    //大夜班上下班时间判断
-                    Optional<Attendance> daYeShangCount =isLastDay?
-                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 23, 0))
-                                    && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue+1, 1, 1, 0))
+                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 23, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue+1, 1, 0, 30))
+                    ).findFirst():
+                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 23, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue+1, 0, 30))
+                    ).findFirst();
+
+                    //小夜班(2)上下班时间判断
+                    Optional<Attendance> xiaoYeShang2Count = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 16, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 17, 30))
+                    ).findFirst();
+                    Optional<Attendance> xiaoYeXia2Count = isLastDay ?
+                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue+1, 1, 0, 30))
+                                    && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue+1, 1, 1, 30))
                             ).findFirst():
-                     attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 23, 0))
-                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue + 1, 1, 0))
+                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue+1, 0, 30))
+                                    && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue+1, 1, 30))
+                            ).findFirst();
+
+                    //异常小夜班(1)上下班时间判断
+                    Optional<Attendance> xiaoYeShangYiChang1Count = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 13, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 14, 30))
                     ).findFirst();
+                    Optional<Attendance> xiaoYeXiaYiChang1Count =attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 21, 30))
+                                    && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 22, 30))).findFirst();
 
-                    Optional<Attendance> daYeXiaCount =isLastDay?
-                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue+1, 1, 6, 0))
-                                    && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue+1,  1, 10, 0))
-                            ).max(Comparator.comparing(Attendance::getClockTime))
-                            :
-                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue + 1, 6, 0))
-                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue + 1, 10, 0))
-                    ).max(Comparator.comparing(Attendance::getClockTime));
+                    //异常小夜班(2)上下班时间判断
+                    Optional<Attendance> xiaoYeShangYiChang2Count = attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 14, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 15, 30))
+                    ).findFirst();
+                    Optional<Attendance> xiaoYeXiaYiChang2Count =attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 22, 30))
+                            && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue, 23, 30))).findFirst();
 
-                    AttendanceStaff staff = new AttendanceStaff();
-                    staff.setJobNumber(jobNumber);
-                    staff.setMonth(month);
-                    staff.setName(attendance.getName());
-                    staff.setDeptName(attendance.getDeptName());
-                    staff.setClockDate(date);
-                    /**
-                     * 考勤状态 0白班,1大夜班,2小夜班,3中班,4班次异常,5休息,6调休,7请假
-                     */
+                    //大夜班上下班时间判断
+                    Optional<Attendance> daYeShangCount =isLastDay ?
+                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 23, 30))
+                                    && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue+1, 1, 0, 30))
+                            ).findFirst():
+                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue, 23, 30))
+                                    && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue+1, 0, 30))
+                            ).findFirst();
+
+                    Optional<Attendance> daYeXiaCount =isLastDay ?
+                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue+1, 1, 7, 30))
+                                    && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue+1, 1, 8, 30))
+                            ).findFirst():
+                            attendances.stream().filter(a -> a.getClockTime().isAfter(LocalDateTime.of(year, monthValue, dayValue+1, 7, 30))
+                                    && a.getClockTime().isBefore(LocalDateTime.of(year, monthValue, dayValue+1, 8, 30))
+                            ).findFirst();
 
                     //1先判断白班
                     if (zaoShangCount.isPresent()&&zaoXiaCount.isPresent()) {
@@ -150,8 +292,30 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                         BigDecimal bigDecimal = calculateWorkHours(startClockTime, endClockTime);
                         staff.setWorkHour(bigDecimal);
                         staff.setAttendanceType(BAI_BAN);
+                        staff.setAttendanceTypeName("白班");
+                    }
+                    //异常白班1
+                    else if (zaoShangYiChang1Count.isPresent()&&zaoXiaYiChang1Count.isPresent()) {
+                        LocalDateTime startClockTime = zaoShangYiChang1Count.get().getClockTime();
+                        LocalDateTime endClockTime = zaoXiaYiChang1Count.get().getClockTime();
+                        staff.setClockStartTime(startClockTime);
+                        staff.setClockEndTime(endClockTime);
+                        BigDecimal bigDecimal = calculateWorkHours(startClockTime, endClockTime);
+                        staff.setWorkHour(bigDecimal);
+                        staff.setAttendanceType(BAI_BAN_YI_CHANG_1);
+                        staff.setAttendanceTypeName("异常白班1");
+                    }
+                    //异常白班2
+                    else if (zaoShangYiChang2Count.isPresent()&&zaoXiaYiChang2Count.isPresent()) {
+                        LocalDateTime startClockTime = zaoShangYiChang2Count.get().getClockTime();
+                        LocalDateTime endClockTime = zaoXiaYiChang2Count.get().getClockTime();
+                        staff.setClockStartTime(startClockTime);
+                        staff.setClockEndTime(endClockTime);
+                        BigDecimal bigDecimal = calculateWorkHours(startClockTime, endClockTime);
+                        staff.setWorkHour(bigDecimal);
+                        staff.setAttendanceType(BAI_BAN_YI_CHANG_2);
+                        staff.setAttendanceTypeName("异常白班2");
                     }
-
                     //2再判断中班
                     else  if (zhongShangCount.isPresent()&&zhongXiaCount.isPresent()) {
                         LocalDateTime startClockTime = zhongShangCount.get().getClockTime();
@@ -161,8 +325,8 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                         BigDecimal bigDecimal = calculateWorkHours(startClockTime, endClockTime);
                         staff.setWorkHour(bigDecimal);
                         staff.setAttendanceType(ZHONG_BAN);
+                        staff.setAttendanceTypeName("中班");
                     }
-
                     //3判断小夜班
                     else if (xiaoYeShangCount.isPresent()&&xiaoYeXiaCount.isPresent()) {
                         LocalDateTime startClockTime = xiaoYeShangCount.get().getClockTime();
@@ -172,8 +336,42 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                         BigDecimal bigDecimal = calculateWorkHours(startClockTime, endClockTime);
                         staff.setWorkHour(bigDecimal);
                         staff.setAttendanceType(XIAO_YE_BAN);
+                        staff.setAttendanceTypeName("小夜班");
+                    }
+                    //3判断小夜班2
+                    else if (xiaoYeShang2Count.isPresent()&&xiaoYeXia2Count.isPresent()) {
+                        LocalDateTime startClockTime = xiaoYeShang2Count.get().getClockTime();
+                        LocalDateTime endClockTime = xiaoYeXia2Count.get().getClockTime();
+                        staff.setClockStartTime(startClockTime);
+                        staff.setClockEndTime(endClockTime);
+                        BigDecimal bigDecimal = calculateWorkHours(startClockTime, endClockTime);
+                        staff.setWorkHour(bigDecimal);
+                        staff.setAttendanceType(XIAO_YE_BAN);
+                        staff.setAttendanceTypeName("小夜班");
                     }
+                    //3判断小夜班异常1
+                    else if (xiaoYeShangYiChang1Count.isPresent()&&xiaoYeXiaYiChang1Count.isPresent()) {
+                        LocalDateTime startClockTime = xiaoYeShangYiChang1Count.get().getClockTime();
+                        LocalDateTime endClockTime = xiaoYeXiaYiChang1Count.get().getClockTime();
+                        staff.setClockStartTime(startClockTime);
+                        staff.setClockEndTime(endClockTime);
+                        BigDecimal bigDecimal = calculateWorkHours(startClockTime, endClockTime);
+                        staff.setWorkHour(bigDecimal);
+                        staff.setAttendanceType(XIAO_YE_BAN_YI_CHANG_1);
+                        staff.setAttendanceTypeName("异常小夜班1");
 
+                    }
+                    //3判断小夜班异常2
+                    else if (xiaoYeShangYiChang2Count.isPresent()&&xiaoYeXiaYiChang2Count.isPresent()) {
+                        LocalDateTime startClockTime = xiaoYeShangYiChang2Count.get().getClockTime();
+                        LocalDateTime endClockTime = xiaoYeXiaYiChang2Count.get().getClockTime();
+                        staff.setClockStartTime(startClockTime);
+                        staff.setClockEndTime(endClockTime);
+                        BigDecimal bigDecimal = calculateWorkHours(startClockTime, endClockTime);
+                        staff.setWorkHour(bigDecimal);
+                        staff.setAttendanceType(XIAO_YE_BAN_YI_CHANG_2);
+                        staff.setAttendanceTypeName("异常小夜班2");
+                    }
                     //4判断大夜班
                     else if (daYeShangCount.isPresent()&&daYeXiaCount.isPresent()) {
                         LocalDateTime startClockTime = daYeShangCount.get().getClockTime();
@@ -183,16 +381,24 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                         BigDecimal bigDecimal = calculateWorkHours(startClockTime, endClockTime);
                         staff.setWorkHour(bigDecimal);
                         staff.setAttendanceType(DA_YE_BAN);
+                        staff.setAttendanceTypeName("大夜班");
                     }
+                    //过滤掉空数据
                     if (staff.getClockStartTime()!=null){
                         addList.add(staff);
                     }
-
                 }
             }
-
         }
+
+        long l3 = System.currentTimeMillis();
+
         saveBatch(addList);
+
+        long l4 = System.currentTimeMillis();
+        System.out.println("l2-l1-->" + (l2 - l1));
+        System.out.println("l3-l2-->"+(l3-l2));
+        System.out.println("l4-l3-->"+(l4-l3));
         return msg;
     }
 
@@ -246,17 +452,17 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
             if (d.getDayOfWeek() == DayOfWeek.SATURDAY
                     || d.getDayOfWeek() == DayOfWeek.SUNDAY
                     || customHolidays.contains(d)) {
-                staff.setAttendanceType(5);//休息
+                staff.setAttendanceType(XIU_XI);//休息
                 staff.setAttendanceTypeName("休息");
                 staff.setColor("#2e2e2e");
             }
             if (freeDays.contains(d)) {
-                staff.setAttendanceType(6);//调休
+                staff.setAttendanceType(TIAO_XIU);//调休
                 staff.setAttendanceTypeName("调休");
                 staff.setColor("#2e2e2e");
             }
             if (workdays.contains(d)){
-                staff.setAttendanceType(0);//白班
+                staff.setAttendanceType(BAI_BAN);//白班
                 staff.setAttendanceTypeName("白班");
                 staff.setColor("#2e2e2e");
             }
@@ -283,24 +489,42 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
             if (first.isPresent()) {
                 AttendanceStaff s = first.get();
                 BeanUtils.copyProperties(s,staff);
-                if (staff.getAttendanceType()==0){
-                    staff.setAttendanceTypeName("白班");
+                if (staff.getAttendanceType()==BAI_BAN){
                     staff.setColor("#2e2e2e");
-                }else if (staff.getAttendanceType()==1){
-                    staff.setAttendanceTypeName("大夜班");
+                }
+                else if (staff.getAttendanceType()==BAI_BAN_YI_CHANG_1){
+                    staff.setColor("#2e2e2e");//绿色
+                }
+                else if (staff.getAttendanceType()==BAI_BAN_YI_CHANG_2){
+                    staff.setColor("#2e2e2e");//绿色
+                }
+                else if (staff.getAttendanceType()==DA_YE_BAN){
                     staff.setColor("#67C23A");//绿色
                 }
-                else if (staff.getAttendanceType()==2){
-                    staff.setAttendanceTypeName("小夜班");
+                else if (staff.getAttendanceType()==XIAO_YE_BAN){
                     staff.setColor("#67C23A");//绿色
                 }
-                else if (staff.getAttendanceType()==3){
-                    staff.setAttendanceTypeName("中班");
+                else if (staff.getAttendanceType()==XIAO_YE_BAN_YI_CHANG_1){
+                    staff.setColor("#67C23A");//绿色
+                }
+                else if (staff.getAttendanceType()==XIAO_YE_BAN_YI_CHANG_2){
+                    staff.setColor("#67C23A");//绿色
+                }
+                else if (staff.getAttendanceType()==ZHONG_BAN){
+                    staff.setColor("#909399");
+                }
+                else if (staff.getAttendanceType()==QING_JIA){
+                    staff.setColor("#909399");
+                }
+                else if (staff.getAttendanceType()==JIA_BAN){
+                    staff.setColor("#909399");
+                }
+                else if (staff.getAttendanceType()==TI_QIAN_XIA_BAN){
                     staff.setColor("#909399");
                 }
             }else {
                 if (staff.getId()==null&&staff.getAttendanceType()==null) {
-                    staff.setAttendanceType(4);//班次异常
+                    staff.setAttendanceType(YI_CHANG);//班次异常
                     staff.setAttendanceTypeName("班次异常");
                     staff.setColor("#F56C6C");
                 } else if (staff.getAttendanceType() == 5 || staff.getAttendanceType() == 6){
@@ -308,7 +532,6 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                 }
             }
         }
-
         for (AttendanceStaff staff : allList) {
             Integer type = staff.getAttendanceType();
             LocalDate clockDate = staff.getClockDate();
@@ -464,7 +687,7 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                     if (endTime.isBefore(LocalTime.of(8, 0, 0))) {
                         HashMap<String, Object> map = new HashMap<>();
                         map.put("res", "早退");
-                        String str = endTime + "下班考勤打卡:";
+                        String str = endTime + " 下班考勤打卡:";
                         Duration duration = Duration.between(endTime,LocalTime.of(8,0, 0) );
                         long v = duration.toMinutes();
                         str+= "(早退"+v+"分钟)";
@@ -483,6 +706,167 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                     }
                     staff.setAttendanceTypeName("大夜班");
                 }
+                else if (type==BAI_BAN_YI_CHANG_1) {
+                    if (startTime.isAfter(LocalTime.of(9, 0, 0))) {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", "晚点");
+                        String str = startTime + "上班考勤打卡:";
+                        Duration duration = Duration.between(LocalTime.of(9,0,0),startTime );
+                        long v = duration.toMinutes();
+                        str+= "(晚点"+v+"分钟)";
+                        map.put("msg",str );
+                        map.put("color","#F56C6C");
+                        maplist.add(map);
+                    } else {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("msg", startTime + "上班考勤打卡");
+                        map.put("res", "正常");
+                        maplist.add(map);
+                    }
+
+                    if (endTime.isBefore(LocalTime.of(18, 0, 0))) {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", "早退");
+                        String str = endTime + "下班考勤打卡:";
+                        Duration duration = Duration.between(endTime,LocalTime.of(18,0,0) );
+                        long v = duration.toMinutes();
+                        str+= "(早退"+v+"分钟)";
+                        map.put("msg",str );
+                        map.put("color","#F56C6C");
+                        maplist.add(map);
+                    } else {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", "正常");
+                        String str = endTime + "下班考勤打卡:";
+                        double v = calculateOvertimeHours(LocalTime.of(18, 0), endTime);
+                        if (v>0) {
+                            str += "(18:00-" + endTime + "加班" + v + "小时)";
+                        }
+                        map.put("msg", str);
+                        maplist.add(map);
+                    }
+
+                }
+                else if (type==BAI_BAN_YI_CHANG_2) {
+                    if (startTime.isAfter(LocalTime.of(10, 0, 0))) {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", "晚点");
+                        String str = startTime + "上班考勤打卡:";
+                        Duration duration = Duration.between(LocalTime.of(10,0,0),startTime );
+                        long v = duration.toMinutes();
+                        str+= "(晚点"+v+"分钟)";
+                        map.put("msg",str );
+                        map.put("color","#F56C6C");
+                        maplist.add(map);
+                    } else {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("msg", startTime + "上班考勤打卡");
+                        map.put("res", "正常");
+                        maplist.add(map);
+                    }
+
+                    if (endTime.isBefore(LocalTime.of(19, 0, 0))) {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", "早退");
+                        String str = endTime + "下班考勤打卡:";
+                        Duration duration = Duration.between(endTime,LocalTime.of(19,0,0) );
+                        long v = duration.toMinutes();
+                        str+= "(早退"+v+"分钟)";
+                        map.put("msg",str );
+                        map.put("color","#F56C6C");
+                        maplist.add(map);
+                    } else {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", "正常");
+                        String str = endTime + "下班考勤打卡:";
+                        double v = calculateOvertimeHours(LocalTime.of(19, 0), endTime);
+                        if (v>0) {
+                            str += "(19:00-" + endTime + "加班" + v + "小时)";
+                        }
+                        map.put("msg", str);
+                        maplist.add(map);
+                    }
+                }
+                else if (type == XIAO_YE_BAN_YI_CHANG_1) {
+                    if (startTime.isAfter(LocalTime.of(14, 0, 0))) {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", "晚点");
+                        String str = startTime + "上班考勤打卡:";
+                        Duration duration = Duration.between(LocalTime.of(14,0,0),startTime );
+                        long v = duration.toMinutes();
+                        str+= "(晚点"+v+"分钟)";
+                        map.put("msg",str );
+                        map.put("color","#F56C6C");
+                        maplist.add(map);
+                    } else {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("msg", startTime + "上班考勤打卡");
+                        map.put("res", "正常");
+                        maplist.add(map);
+                    }
+
+                    if (endTime.isBefore(LocalTime.of(22, 0, 0))) {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", "早退");
+                        String str = endTime + "下班考勤打卡:";
+                        Duration duration = Duration.between(endTime,LocalTime.of(22,0, 0) );
+                        long v = duration.toMinutes();
+                        str+= "(早退"+v+"分钟)";
+                        map.put("msg",str );
+                        map.put("color","#F56C6C");
+                        maplist.add(map);
+                    } else {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("msg", endTime + "下班考勤打卡");
+                        map.put("res", "正常");
+                        double v = calculateOvertimeHours(LocalTime.of(22, 0, 0), endTime);
+                        if (v > 0) {
+                            map.put("extra", "(22:00-" + endTime + "加班" + v + "小时)");
+                        }
+                        maplist.add(map);
+                    }
+                    staff.setAttendanceTypeName("异常小夜班1");
+                }
+                else if (type == XIAO_YE_BAN_YI_CHANG_2) {
+                    if (startTime.isAfter(LocalTime.of(15, 0, 0))) {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", "晚点");
+                        String str = startTime + "上班考勤打卡:";
+                        Duration duration = Duration.between(LocalTime.of(15,0,0),startTime );
+                        long v = duration.toMinutes();
+                        str+= "(晚点"+v+"分钟)";
+                        map.put("msg",str );
+                        map.put("color","#F56C6C");
+                        maplist.add(map);
+                    } else {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("msg", startTime + "上班考勤打卡");
+                        map.put("res", "正常");
+                        maplist.add(map);
+                    }
+
+                    if (endTime.isBefore(LocalTime.of(23, 0, 0))) {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", "早退");
+                        String str = endTime + "下班考勤打卡:";
+                        Duration duration = Duration.between(endTime,LocalTime.of(23,0, 0) );
+                        long v = duration.toMinutes();
+                        str+= "(早退"+v+"分钟)";
+                        map.put("msg",str );
+                        map.put("color","#F56C6C");
+                        maplist.add(map);
+                    } else {
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("msg", endTime + "下班考勤打卡");
+                        map.put("res", "正常");
+                        double v = calculateOvertimeHours(LocalTime.of(23, 0, 0), endTime);
+                        if (v > 0) {
+                            map.put("extra", "(23:00-" + endTime + "加班" + v + "小时)");
+                        }
+                        maplist.add(map);
+                    }
+                    staff.setAttendanceTypeName("异常小夜班1");
+                }
                 if (!maplist.isEmpty()) {
                     if (!applyFormList.isEmpty()){
                         StringBuilder stringBuilder = new StringBuilder();
@@ -511,6 +895,31 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                         }
                         maplist.add(1,map);
                     }
+                }else {
+                    if (!applyFormList.isEmpty()){
+                        StringBuilder stringBuilder = new StringBuilder();
+                        for (ApplyForm applyForm : applyFormList) {
+                            if (applyForm.getType()==3) {
+                                stringBuilder
+                                        .append(applyForm.getStartTime().format(formatter2))
+                                        .append("-").append(applyForm.getEndTime().format(formatter2))
+                                        .append(applyForm.getApplyBillName())
+                                        .append(" 时长")
+                                        .append(applyForm.getSumTime()).append("小时");
+                            }else {
+                                stringBuilder
+                                        .append(applyForm.getStartTime().format(formatter2))
+                                        .append("-").append(applyForm.getEndTime().format(formatter2))
+                                        .append(applyForm.getTypeName())
+                                        .append(" 时长")
+                                        .append(applyForm.getSumTime()).append("小时");
+                            }
+                        }
+                        HashMap<String, Object> map = new HashMap<>();
+                        map.put("res", stringBuilder.toString());
+                        map.put("color","#F56C6C");
+                        maplist.add(map);
+                    }
                 }
 
                 staff.setMaplist(maplist);
@@ -525,13 +934,14 @@ public class AttendanceStaffServiceImpl extends ServiceImpl<AttendanceStaffMappe
                         if (applyForm.getType()==3) {
                             stringBuilder.append(applyForm.getApplyBillName());
                             if ((applyForm.getStartTime().getHour()==8||applyForm.getEndTime().getHour()==17)&&staff.getAttendanceTypeName().equals("班次异常")){
-                                staff.setAttendanceType(0);
+                                staff.setAttendanceType(QING_JIA);
                                 if (applyForm.getStartTime().getHour()==8) {
                                     staff.setClockStartTime(LocalDateTime.of(clockDate, LocalTime.of(8, 0)));
-                                } else if (applyForm.getEndTime().getHour()==17) {
-                                    staff.setClockStartTime(LocalDateTime.of(clockDate, LocalTime.of(17, 0)));
                                 }
-                                staff.setAttendanceTypeName("白班");
+                                if (applyForm.getEndTime().getHour()==17) {
+                                    staff.setClockEndTime(LocalDateTime.of(clockDate, LocalTime.of(17, 0)));
+                                }
+                                staff.setAttendanceTypeName(applyForm.getApplyBillName());
                             }
 
                         }else {

+ 5 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/ApplyFormMapper.xml

@@ -31,5 +31,10 @@
         WHERE  a.start_time &gt;= #{startDate}  and  a.end_time &lt; #{endDate}
         order by a.type asc
     </select>
+    <select id="getAllListByFirstDateAndLastDate" resultType="com.management.platform.entity.ApplyForm">
+        select a.* from apply_form a
+        WHERE  a.start_time &lt; #{endDate}  and  a.end_time &gt;= #{startDate}
+        order by a.type asc
+    </select>
 
 </mapper>