Переглянути джерело

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java
dzx 1 рік тому
батько
коміт
75124350bf

+ 40 - 0
src/main/java/com/xjrsoft/common/enums/LeaveReasonEnum.java

@@ -0,0 +1,40 @@
+package com.xjrsoft.common.enums;
+
+/**
+ * @description: 班主任请假事项leave_reason
+ * @author: phoenix
+ * @create: 2023/12/21 11:27
+ * @Version 1.0
+ */
+public enum LeaveReasonEnum {
+    /**
+     * 周五学生放假
+     * */
+    LeaveReason1("leave_reason1", "周五学生放假"),
+
+    /**
+     * 课间操
+     * */
+    LeaveReason2("leave_reason2", "课间操"),
+
+    /**
+     * 周末返校(周末开会)
+     * */
+    LeaveReason3("leave_reason3", "周末返校(周末开会)");
+
+    final String code;
+    final String value;
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    LeaveReasonEnum(final String code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/teacher/entity/WfTeacherleave.java

@@ -33,7 +33,7 @@ public class WfTeacherleave implements Serializable {
     * 申请人
     */
     @ApiModelProperty("申请人")
-    private Long userId;
+    private String userId;
     /**
     * 是否中层
     */

+ 145 - 16
src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java

@@ -1,45 +1,174 @@
 package com.xjrsoft.module.teacher.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.enums.LeaveReasonEnum;
 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 java.time.*;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+
 /**
-* @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(wfTeacherleave.getIsItAHomeroomTeacher().equals("是")){
-            WfHeadTeacherLeave wfHeadTeacherLeave = new WfHeadTeacherLeave();
-            wfHeadTeacherLeave.setWfTeacherleaveId(wfTeacherleave.getId());
-            wfHeadTeacherLeave.setApplicantUserId(wfTeacherleave.getUserId());
+        if (ObjectUtil.isNotNull(wfTeacherleave) && wfTeacherleave.getIsItAHomeroomTeacher().equals("是")) {
             /*
              * 如果是周一到周四的上午,自动同步请假类型为“早自习、课间操”的数据到班主任事项请假列表,
              * 如果是周五下午自动同步请假类型为“学生放假”的数据到班主任事项请假列表。
-            */
-            //wfHeadTeacherLeave.setApplicantUserId(wfTeacherleave.getUserId());
+             */
+
+            //将请假时间段按照日分割成几段
+            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();
+
+                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();
 
+                    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);
 
-            wfHeadTeacherLeave.setStartTime(wfTeacherleave.getLeaveStartTime());
-            wfHeadTeacherLeave.setEndTime(wfTeacherleave.getLeaveEndTime());
-            wfHeadTeacherLeave.setRemark(wfTeacherleave.getReasonForLeave());
-            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 false;
+        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;
     }
 }

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

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.teacher.service.impl;
+
+import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+/**
+ * @description: 测试教师请假流程结束处理
+ * @author: phoenix
+ * @create: 2023/12/21 12:20
+ * @Version 1.0
+ */
+@SpringBootTest
+class WfTeacherleaveServiceImplTest {
+
+    @Autowired
+    private IWfTeacherleaveService wfTeacherleaveService;
+
+    @Test
+    void dataHandle() {
+        wfTeacherleaveService.dataHandle(1737737206938324992L);
+    }
+}

+ 150 - 0
src/test/java/com/xjrsoft/xjrsoftboot/StrTest.java

@@ -1,8 +1,22 @@
 package com.xjrsoft.xjrsoftboot;
 
 import cn.hutool.core.util.StrUtil;
+import com.xjrsoft.common.exception.MyException;
+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.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;
+
 public class StrTest {
     @Test
     public void formatTest() {
@@ -10,4 +24,140 @@ public class StrTest {
 
         System.out.println(StrUtil.format(f, "sdfsdf","bbbbbb"));
     }
+
+    @Test
+    public void date() throws ParseException {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = sdf.parse("2023-11-22 15:58:40");
+        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
+        String leaveStartDayStr = sdf1.format(date);//"yyyy-MM-dd"
+        String forenoonStartStr = leaveStartDayStr + " 00:00:00";//上午区间开始时间
+        String forenoonEndStr = leaveStartDayStr + " 12:00:00";//上午区间结束时间
+        String afternoonStartStr = leaveStartDayStr + " 12:00:00";//下午区间开始时间
+        String afternoonEndStr = leaveStartDayStr + " 23:59:59";//下午区间结束时间
+
+        //获取请假开始时间后一天的上午,下午区间
+        Instant instant = date.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 + " 00:00:00";//上午区间开始时间
+        String forenoonEndTomorrowStr = leaveTomorrowDayStr + " 12:00:00";//上午区间结束时间
+        String afternoonStartTomorrowStr = leaveTomorrowDayStr + " 12:00:00";//下午区间开始时间
+        String afternoonEndTomorrowStr = leaveTomorrowDayStr + " 23:59:59";//下午区间结束时间
+
+        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("出现未知错误,请联系管理员");
+        }
+        System.out.println(afternoonStartTomorrowDate.compareTo(afternoonEndTomorrowDate));
+    }
+
+    @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-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;
+    }
 }