Parcourir la source

wf_teacherleave_node 教师请假流程结束处理规则重构

phoenix il y a 1 an
Parent
commit
898e588bc2

+ 136 - 133
src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java

@@ -1,171 +1,174 @@
 package com.xjrsoft.module.teacher.service.impl;
 
-import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.enums.LeaveReasonEnum;
-import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.module.teacher.entity.WfHeadTeacherLeave;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 import com.xjrsoft.module.teacher.mapper.WfTeacherleaveMapper;
 import com.xjrsoft.module.teacher.service.IWfHeadTeacherLeaveService;
 import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import lombok.AllArgsConstructor;
+import lombok.Data;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.time.Instant;
+import java.time.*;
+import java.time.temporal.ChronoUnit;
 import java.util.*;
-import java.util.stream.Collectors;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-
-import static java.util.Calendar.DAY_OF_MONTH;
 
 /**
-* @title: 教职工请假流程
-* @Author szs
-* @Date: 2023-12-20
-* @Version 1.0
-*/
+ * @title: 教职工请假流程
+ * @Author szs
+ * @Date: 2023-12-20
+ * @Version 1.0
+ */
 @Service
 @AllArgsConstructor
 public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleaveMapper, WfTeacherleave> implements IWfTeacherleaveService {
 
     private final IWfHeadTeacherLeaveService wfHeadTeacherLeaveService;
+
     @Override
     public Boolean dataHandle(Long dataId) {
         WfTeacherleave wfTeacherleave = this.getById(dataId);
         //如果请假老师是班主任,将信息同步到班主任事项请假
-        if(ObjectUtil.isNotNull(wfTeacherleave) && wfTeacherleave.getIsItAHomeroomTeacher().equals("是")){
+        if (ObjectUtil.isNotNull(wfTeacherleave) && wfTeacherleave.getIsItAHomeroomTeacher().equals("是")) {
             /*
              * 如果是周一到周四的上午,自动同步请假类型为“早自习、课间操”的数据到班主任事项请假列表,
              * 如果是周五下午自动同步请假类型为“学生放假”的数据到班主任事项请假列表。
-            */
+             */
+
+            //将请假时间段按照日分割成几段
             Date leaveStartTime = wfTeacherleave.getLeaveStartTime();//请假开始时间
             Date leaveEndTime = wfTeacherleave.getLeaveEndTime();//请假结束时间
+            List<DateRange> dateRangeList = splitDateRangeByDay(LocalDateTime.ofInstant(leaveStartTime.toInstant(), ZoneId.systemDefault()), LocalDateTime.ofInstant(leaveEndTime.toInstant(), ZoneId.systemDefault()));
+            List<WfHeadTeacherLeave> wfHeadTeacherLeaveList = new ArrayList<>();
+            for (DateRange dateRange : dateRangeList) {
+                LocalDateTime startTime = dateRange.getBegin();
+                LocalDateTime endTime = dateRange.getEnd();
+                //获取星期几
+                DayOfWeek dayOfWeek = startTime.getDayOfWeek();
+                int dayOfWeekValue = dayOfWeek.getValue();
 
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
-            //根据请假开始时间获取请假开始时间当天的上午,下午区间
-            String leaveStartDayStr = sdf1.format(leaveStartTime);//"yyyy-MM-dd"
-            String forenoonStartStr = leaveStartDayStr + " 06:00:00";//上午区间开始时间
-            String forenoonEndStr = leaveStartDayStr + " 11:00:00";//上午区间结束时间
-            String afternoonStartStr = leaveStartDayStr + " 14:00:00";//下午区间开始时间
-            String afternoonEndStr = leaveStartDayStr + " 22:00:00";//下午区间结束时间
-
-            //获取请假开始时间后一天的上午,下午区间
-            Instant instant = leaveStartTime.toInstant();
-            Calendar calendar = Calendar.getInstance();
-            calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
-            calendar.setTimeInMillis(instant.toEpochMilli());
-
-            int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;//获取请假开始的星期(从星期日开始算,所以需要减1)
-
-            calendar.add(DAY_OF_MONTH, 1);
-            Date leaveStartDayTomorrow = calendar.getTime();
-
-            String leaveTomorrowDayStr = sdf1.format(leaveStartDayTomorrow);//"yyyy-MM-dd"
-            String forenoonStartTomorrowStr = leaveTomorrowDayStr + " 06:00:00";//上午区间开始时间
-            String forenoonEndTomorrowStr = leaveTomorrowDayStr + " 11:00:00";//上午区间结束时间
-            String afternoonStartTomorrowStr = leaveTomorrowDayStr + " 14:00:00";//下午区间开始时间
-            String afternoonEndTomorrowStr = leaveTomorrowDayStr + " 22:00:00";//下午区间结束时间
-
-            Date forenoonStartDate;
-            Date forenoonEndDate;
-            Date afternoonStartDate;
-            Date afternoonEndDate;
-            Date forenoonStartTomorrowDate;
-            Date forenoonEndTomorrowDate;
-            Date afternoonStartTomorrowDate;
-            Date afternoonEndTomorrowDate;
-            try {
-                forenoonStartDate = sdf.parse(forenoonStartStr);
-                forenoonEndDate = sdf.parse(forenoonEndStr);
-                afternoonStartDate = sdf.parse(afternoonStartStr);
-                afternoonEndDate = sdf.parse(afternoonEndStr);
-                forenoonStartTomorrowDate = sdf.parse(forenoonStartTomorrowStr);
-                forenoonEndTomorrowDate = sdf.parse(forenoonEndTomorrowStr);
-                afternoonStartTomorrowDate = sdf.parse(afternoonStartTomorrowStr);
-                afternoonEndTomorrowDate = sdf.parse(afternoonEndTomorrowStr);
-            } catch (ParseException e) {
-                throw new MyException("出现未知错误,请联系管理员");
-            }
-            /*
-            *当请假开始的星期是在星期一到星期四,
-            * 且开始时间早于请假当天上午区间的开始时间,
-            * 结束时间晚于当天上午区间的结束时间,
-            * 结束时间早于第二天上午区间的开始时间,
-            * 自动同步一条请假类型为“早自习、课间操”的数据到班主任事项请假列表。
-            */
-            if(dayOfWeek > 0 && dayOfWeek < 5
-                    && leaveStartTime.compareTo(forenoonStartDate) < 0
-                    && leaveEndTime.compareTo(forenoonEndDate) > 0
-                    && leaveEndTime.compareTo(forenoonStartTomorrowDate) < 0){
-                WfHeadTeacherLeave wfHeadTeacherLeave = new WfHeadTeacherLeave();
-                wfHeadTeacherLeave.setWfTeacherleaveId(wfTeacherleave.getId());
-                wfHeadTeacherLeave.setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
-                wfHeadTeacherLeave.setLeaveReason(LeaveReasonEnum.LeaveReason2.getCode());
-                wfHeadTeacherLeave.setStartTime(wfTeacherleave.getLeaveStartTime());
-                wfHeadTeacherLeave.setEndTime(wfTeacherleave.getLeaveEndTime());
-                wfHeadTeacherLeave.setRemark(wfTeacherleave.getReasonForLeave());
-                wfHeadTeacherLeave.setStatus(1);
-                return wfHeadTeacherLeaveService.save(wfHeadTeacherLeave);
-            }
+                LocalDateTime forenoonStartDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(6, 0, 0));
+                LocalDateTime forenoonEndDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(11, 0, 0));
+                LocalDateTime afternoonStartDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(14, 0, 0));
+                LocalDateTime afternoonEndDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(22, 0, 0));
+                /*
+                 *当请假开始的星期是在星期一到星期四,
+                 * 且开始时间早于请假当天上午区间的开始时间,
+                 * 结束时间晚于当天上午区间的结束时间,
+                 * 自动同步一条请假类型为“早自习、课间操”的数据到班主任事项请假列表。
+                 */
+                if (dayOfWeekValue > 0 && dayOfWeekValue < 5
+                        && startTime.compareTo(forenoonStartDateTime) < 0
+                        && endTime.compareTo(forenoonEndDateTime) > 0) {
+                    WfHeadTeacherLeave wfHeadTeacherLeave = new WfHeadTeacherLeave();
 
-            /*
-             *当请假开始的星期是在星期一到星期四,
-             * 且开始时间早于请假当天上午区间的开始时间,
-             * 结束时间晚于第二天上午区间的结束时间,
-             * 自动同步2条请假类型为“早自习、课间操”的数据到班主任事项请假列表。
-             */
-            if(dayOfWeek > 0 && dayOfWeek < 5
-                    && leaveStartTime.compareTo(forenoonStartDate) < 0
-                    && leaveEndTime.compareTo(forenoonEndTomorrowDate) > 0){
-                List<WfHeadTeacherLeave> list = new ArrayList<>();
-                WfHeadTeacherLeave wfHeadTeacherLeave1 = new WfHeadTeacherLeave();
-                wfHeadTeacherLeave1.setWfTeacherleaveId(wfTeacherleave.getId());
-                wfHeadTeacherLeave1.setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
-                wfHeadTeacherLeave1.setLeaveReason(LeaveReasonEnum.LeaveReason2.getCode());
-                wfHeadTeacherLeave1.setStartTime(wfTeacherleave.getLeaveStartTime());
-                wfHeadTeacherLeave1.setEndTime(forenoonStartTomorrowDate);
-                wfHeadTeacherLeave1.setRemark(wfTeacherleave.getReasonForLeave());
-                wfHeadTeacherLeave1.setStatus(1);
-                list.add(wfHeadTeacherLeave1);
-
-                WfHeadTeacherLeave wfHeadTeacherLeave2 = new WfHeadTeacherLeave();
-                wfHeadTeacherLeave2.setWfTeacherleaveId(wfTeacherleave.getId());
-                wfHeadTeacherLeave2.setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
-                wfHeadTeacherLeave2.setLeaveReason(LeaveReasonEnum.LeaveReason2.getCode());
-                wfHeadTeacherLeave2.setStartTime(forenoonStartTomorrowDate);
-                wfHeadTeacherLeave2.setEndTime(wfTeacherleave.getLeaveEndTime());
-                wfHeadTeacherLeave2.setRemark(wfTeacherleave.getReasonForLeave());
-                wfHeadTeacherLeave2.setStatus(1);
-                list.add(wfHeadTeacherLeave2);
-
-                return wfHeadTeacherLeaveService.saveBatch(list);
-            }
+                    wfHeadTeacherLeave.setWfTeacherleaveId(wfTeacherleave.getId());
+                    wfHeadTeacherLeave.setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
+                    wfHeadTeacherLeave.setLeaveReason(LeaveReasonEnum.LeaveReason2.getCode());
+                    Instant startTimeInstant = startTime.atZone(ZoneId.systemDefault()).toInstant();
+                    Date startTimeDate = Date.from(startTimeInstant);
+                    wfHeadTeacherLeave.setStartTime(startTimeDate);
+                    Instant endTimeInstant = endTime.atZone(ZoneId.systemDefault()).toInstant();
+                    Date endTimeDate = Date.from(endTimeInstant);
+                    wfHeadTeacherLeave.setEndTime(endTimeDate);
+                    wfHeadTeacherLeave.setRemark(wfTeacherleave.getReasonForLeave());
+                    wfHeadTeacherLeave.setStatus(1);
 
-            /*
-            *当请假开始的时间是在星期五,
-            * 且开始时间早于下午区间的开始时间,
-            * 结束时间晚于下午区间的结束时间,
-            * 自动同步一条请假类型为“学生放假”的数据到班主任事项请假列表。
-            */
-            if(dayOfWeek == 5 && leaveStartTime.compareTo(afternoonStartDate) < 0 && leaveEndTime.compareTo(afternoonEndDate) > 0){
-                WfHeadTeacherLeave wfHeadTeacherLeave = new WfHeadTeacherLeave();
-                wfHeadTeacherLeave.setWfTeacherleaveId(wfTeacherleave.getId());
-                wfHeadTeacherLeave.setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
-                wfHeadTeacherLeave.setLeaveReason(LeaveReasonEnum.LeaveReason1.getCode());
-                wfHeadTeacherLeave.setStartTime(wfTeacherleave.getLeaveStartTime());
-                wfHeadTeacherLeave.setEndTime(wfTeacherleave.getLeaveEndTime());
-                wfHeadTeacherLeave.setRemark(wfTeacherleave.getReasonForLeave());
-                wfHeadTeacherLeave.setStatus(1);
-                return wfHeadTeacherLeaveService.save(wfHeadTeacherLeave);
+                    wfHeadTeacherLeaveList.add(wfHeadTeacherLeave);
+                }
+                /*
+                 * 当请假开始的时间是在星期五,
+                 * 且开始时间早于下午区间的开始时间,
+                 * 结束时间晚于下午区间的结束时间,
+                 * 自动同步一条请假类型为“学生放假”的数据到班主任事项请假列表。
+                 */
+                if (dayOfWeekValue == 5
+                        && startTime.compareTo(afternoonStartDateTime) < 0
+                        && endTime.compareTo(afternoonEndDateTime) > 0) {
+                    WfHeadTeacherLeave wfHeadTeacherLeave = new WfHeadTeacherLeave();
+
+                    wfHeadTeacherLeave.setWfTeacherleaveId(wfTeacherleave.getId());
+                    wfHeadTeacherLeave.setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
+                    wfHeadTeacherLeave.setLeaveReason(LeaveReasonEnum.LeaveReason1.getCode());
+                    Instant startTimeInstant = startTime.atZone(ZoneId.systemDefault()).toInstant();
+                    Date startTimeDate = Date.from(startTimeInstant);
+                    wfHeadTeacherLeave.setStartTime(startTimeDate);
+                    Instant endTimeInstant = endTime.atZone(ZoneId.systemDefault()).toInstant();
+                    Date endTimeDate = Date.from(endTimeInstant);
+                    wfHeadTeacherLeave.setEndTime(endTimeDate);
+                    wfHeadTeacherLeave.setRemark(wfTeacherleave.getReasonForLeave());
+                    wfHeadTeacherLeave.setStatus(1);
+
+                    wfHeadTeacherLeaveList.add(wfHeadTeacherLeave);
+                }
             }
+            return wfHeadTeacherLeaveService.saveBatch(wfHeadTeacherLeaveList);
         }
         return true;
     }
+
+    /**
+     * 按日分割
+     *
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     * @return 分割后的时间段集合
+     */
+    private List<DateRange> splitDateRangeByDay(LocalDateTime startTime, LocalDateTime endTime) {
+        long seconds = startTime.until(endTime, ChronoUnit.SECONDS);
+        if (seconds < 0) {
+            return new ArrayList<>();
+        }
+        //轮数
+        long turnNum = 0;
+        //分割的时间段集合,使用累加算法
+        List<DateRange> dateList = new ArrayList<>();
+        DateRange range = new DateRange();
+        range.setBegin(startTime);
+        while (true) {
+            turnNum++;
+            startTime = startTime.plusDays(1);
+            //大于截止日期时,不再累加
+            if (startTime.isAfter(endTime)) {
+                range.setEnd(endTime);
+                range.setTurnNum(turnNum);
+                dateList.add(range);
+                break;
+            }
+            //将时间调整为该天的 0时 0分 0秒
+            startTime = LocalDateTime.of(startTime.getYear(), startTime.getMonth(), startTime.getDayOfMonth(), 0, 0, 0);
+            LocalDateTime tmpBegin = startTime;
+            //计算出上一天的最后一秒
+            LocalDateTime endDate = tmpBegin.minusSeconds(1);
+            range.setEnd(endDate);
+            range.setTurnNum(turnNum);
+            dateList.add(range);
+            //创建新的时间段
+            range = new DateRange();
+            range.setBegin(tmpBegin);
+        }
+        return dateList;
+    }
+
+    @Data
+    class DateRange {
+
+        /**
+         * 开始时间
+         */
+        private LocalDateTime begin;
+
+        /**
+         * 结束时间
+         */
+        private LocalDateTime end;
+
+        /**
+         * 当前时间的第几轮(段)
+         */
+        private Long turnNum;
+    }
 }

+ 1 - 1
src/test/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImplTest.java

@@ -19,6 +19,6 @@ class WfTeacherleaveServiceImplTest {
 
     @Test
     void dataHandle() {
-        wfTeacherleaveService.dataHandle(1735584368372076547L);
+        wfTeacherleaveService.dataHandle(1737737206938324992L);
     }
 }

+ 88 - 8
src/test/java/com/xjrsoft/xjrsoftboot/StrTest.java

@@ -2,15 +2,18 @@ package com.xjrsoft.xjrsoftboot;
 
 import cn.hutool.core.util.StrUtil;
 import com.xjrsoft.common.exception.MyException;
-import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
+import lombok.Data;
 import org.junit.jupiter.api.Test;
 
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.time.DayOfWeek;
 import java.time.Instant;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.TimeZone;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.TextStyle;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
 
 import static java.util.Calendar.DAY_OF_MONTH;
 
@@ -75,9 +78,86 @@ public class StrTest {
 
     @Test
     public void date01() throws ParseException {
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        Date date = sdf.parse("2023-11-23 15:58:40");
-        Date date01 = sdf.parse("2023-11-23 12:58:40");
-        System.err.println(date.compareTo(date01));
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        Date date = sdf.parse("2023-11-23 15:58:40");
+//        Date date01 = sdf.parse("2023-11-25 12:58:40");
+//        List<DateRange> list = splitDateRangeByDay(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()),LocalDateTime.ofInstant(date01.toInstant(), ZoneId.systemDefault()));
+//        // 添加元素到列表中
+//        list.stream().forEach(element -> {
+//            // 对元素进行操作
+//            System.out.println(element.getBegin());
+//            System.out.println(element.getEnd());
+//        });
+        LocalDateTime dateTime = LocalDateTime.now();
+        DayOfWeek dayOfWeek = dateTime.getDayOfWeek();
+        System.out.println(dayOfWeek); // 输出星期几的英文表示,例如:MONDAY, TUESDAY, 等等
+
+        int dayOfWeekValue = dayOfWeek.getValue();
+        System.out.println(dayOfWeekValue); // 输出星期几的数字表示,1 表示星期一,2 表示星期二,等等
+
+        String dayOfWeekChinese = dayOfWeek.getDisplayName(TextStyle.FULL, Locale.CHINESE);
+        System.out.println(dayOfWeekChinese); // 输出星期几的中文表示,例如:星期一,星期二,等等
+    }
+
+    @Data
+    public class DateRange {
+
+        /**
+         * 开始时间
+         */
+        private LocalDateTime begin;
+
+        /**
+         * 结束时间
+         */
+        private LocalDateTime end;
+
+        /**
+         * 当前时间的第几轮(段)
+         */
+        private Long turnNum;
+    }
+
+    /**
+     * 按日分割
+     *
+     * @param startTime 开始时间
+     * @param endTime   结束时间
+     * @return 分割后的时间段集合
+     */
+    private List<DateRange> splitDateRangeByDay(LocalDateTime startTime, LocalDateTime endTime) {
+        long seconds = startTime.until(endTime, ChronoUnit.SECONDS);
+        if (seconds < 0) {
+            return new ArrayList<>();
+        }
+        //轮数
+        long turnNum = 0;
+        //分割的时间段集合,使用累加算法
+        List<DateRange> dateList = new ArrayList<>();
+        DateRange range = new DateRange();
+        range.setBegin(startTime);
+        while (true) {
+            turnNum++;
+            startTime = startTime.plusDays(1);
+            //大于截止日期时,不再累加
+            if (startTime.isAfter(endTime)) {
+                range.setEnd(endTime);
+                range.setTurnNum(turnNum);
+                dateList.add(range);
+                break;
+            }
+            //将时间调整为该天的 0时 0分 0秒
+            startTime = LocalDateTime.of(startTime.getYear(), startTime.getMonth(), startTime.getDayOfMonth(), 0, 0, 0);
+            LocalDateTime tmpBegin = startTime;
+            //计算出上一天的最后一秒
+            LocalDateTime endDate = tmpBegin.minusSeconds(1);
+            range.setEnd(endDate);
+            range.setTurnNum(turnNum);
+            dateList.add(range);
+            //创建新的时间段
+            range = new DateRange();
+            range.setBegin(tmpBegin);
+        }
+        return dateList;
     }
 }