Selaa lähdekoodia

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

phoenix 1 vuosi sitten
vanhempi
commit
e1f7d55836

+ 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

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

+ 132 - 12
src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java

@@ -1,7 +1,11 @@
 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;
@@ -10,11 +14,16 @@ import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import java.util.List;
-import java.util.Objects;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+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
@@ -30,22 +39,133 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
     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();//请假结束时间
+
+            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)
 
-            wfHeadTeacherLeave.setStartTime(wfTeacherleave.getLeaveStartTime());
-            wfHeadTeacherLeave.setEndTime(wfTeacherleave.getLeaveEndTime());
-            wfHeadTeacherLeave.setRemark(wfTeacherleave.getReasonForLeave());
-            return wfHeadTeacherLeaveService.save(wfHeadTeacherLeave);
+            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);
+            }
+
+            /*
+             *当请假开始的星期是在星期一到星期四,
+             * 且开始时间早于请假当天上午区间的开始时间,
+             * 结束时间晚于第二天上午区间的结束时间,
+             * 自动同步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);
+            }
+
+            /*
+            *当请假开始的时间是在星期五,
+            * 且开始时间早于下午区间的开始时间,
+            * 结束时间晚于下午区间的结束时间,
+            * 自动同步一条请假类型为“学生放假”的数据到班主任事项请假列表。
+            */
+            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);
+            }
         }
-        return false;
+        return true;
     }
 }

+ 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(1735584368372076547L);
+    }
+}

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

@@ -1,8 +1,19 @@
 package com.xjrsoft.xjrsoftboot;
 
 import cn.hutool.core.util.StrUtil;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import org.junit.jupiter.api.Test;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+import static java.util.Calendar.DAY_OF_MONTH;
+
 public class StrTest {
     @Test
     public void formatTest() {
@@ -10,4 +21,63 @@ 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-23 12:58:40");
+        System.err.println(date.compareTo(date01));
+    }
 }