|
@@ -1,171 +1,174 @@
|
|
package com.xjrsoft.module.teacher.service.impl;
|
|
package com.xjrsoft.module.teacher.service.impl;
|
|
|
|
|
|
-import cn.hutool.core.date.DateUtil;
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
import com.github.yulichang.base.MPJBaseServiceImpl;
|
|
import com.github.yulichang.base.MPJBaseServiceImpl;
|
|
import com.xjrsoft.common.enums.LeaveReasonEnum;
|
|
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.WfHeadTeacherLeave;
|
|
import com.xjrsoft.module.teacher.entity.WfTeacherleave;
|
|
import com.xjrsoft.module.teacher.entity.WfTeacherleave;
|
|
import com.xjrsoft.module.teacher.mapper.WfTeacherleaveMapper;
|
|
import com.xjrsoft.module.teacher.mapper.WfTeacherleaveMapper;
|
|
import com.xjrsoft.module.teacher.service.IWfHeadTeacherLeaveService;
|
|
import com.xjrsoft.module.teacher.service.IWfHeadTeacherLeaveService;
|
|
import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
|
|
import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.AllArgsConstructor;
|
|
|
|
+import lombok.Data;
|
|
import org.springframework.stereotype.Service;
|
|
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.*;
|
|
-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
|
|
@Service
|
|
@AllArgsConstructor
|
|
@AllArgsConstructor
|
|
public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleaveMapper, WfTeacherleave> implements IWfTeacherleaveService {
|
|
public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleaveMapper, WfTeacherleave> implements IWfTeacherleaveService {
|
|
|
|
|
|
private final IWfHeadTeacherLeaveService wfHeadTeacherLeaveService;
|
|
private final IWfHeadTeacherLeaveService wfHeadTeacherLeaveService;
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public Boolean dataHandle(Long dataId) {
|
|
public Boolean dataHandle(Long dataId) {
|
|
WfTeacherleave wfTeacherleave = this.getById(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 leaveStartTime = wfTeacherleave.getLeaveStartTime();//请假开始时间
|
|
Date leaveEndTime = wfTeacherleave.getLeaveEndTime();//请假结束时间
|
|
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;
|
|
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;
|
|
|
|
+ }
|
|
}
|
|
}
|