|
|
@@ -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;
|
|
|
}
|
|
|
}
|