| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- 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
- */
- @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("是")) {
- /*
- * 如果是周一到周四的上午,自动同步请假类型为“早自习、课间操”的数据到班主任事项请假列表,
- * 如果是周五下午自动同步请假类型为“学生放假”的数据到班主任事项请假列表。
- */
- //将请假时间段按照日分割成几段
- 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(forenoonEndDateTime) < 0
- && endTime.compareTo(forenoonEndDateTime) > 0) {
- wfHeadTeacherLeaveList.add(new WfHeadTeacherLeave(){{
- setWfTeacherleaveId(wfTeacherleave.getId());
- setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
- setLeaveReason(LeaveReasonEnum.LeaveReason2.getCode());
- Instant startTimeInstant = startTime.atZone(ZoneId.systemDefault()).toInstant();
- Date startTimeDate = Date.from(startTimeInstant);
- setStartTime(startTimeDate);
- Instant endTimeInstant = endTime.atZone(ZoneId.systemDefault()).toInstant();
- Date endTimeDate = Date.from(endTimeInstant);
- setEndTime(endTimeDate);
- setRemark(wfTeacherleave.getReasonForLeave());
- setStatus(1);
- if(wfTeacherleave.getLeaveDays() <= 1){
- setSubstituteUserId(wfTeacherleave.getReliefHomerooTeacherId());
- }
- if(wfTeacherleave.getLeaveDays() > 1){
- setSubstituteUserId(wfTeacherleave.getReliefTeacherId());
- }
- }});
- }
- /*
- * 当天是在星期五,
- * 且开始时间早于下午区间的开始时间,
- * 结束时间晚于下午区间的结束时间,
- * 自动同步一条请假类型为“学生放假”的数据到班主任事项请假列表。
- */
- if (dayOfWeekValue == 5
- && startTime.compareTo(afternoonEndDateTime) < 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
- static class DateRange {
- /**
- * 开始时间
- */
- private LocalDateTime begin;
- /**
- * 结束时间
- */
- private LocalDateTime end;
- /**
- * 当前时间的第几轮(段)
- */
- private Long turnNum;
- }
- }
|