WfTeacherleaveServiceImpl.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package com.xjrsoft.module.teacher.service.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.github.yulichang.base.MPJBaseServiceImpl;
  4. import com.xjrsoft.common.enums.LeaveReasonEnum;
  5. import com.xjrsoft.module.teacher.entity.WfHeadTeacherLeave;
  6. import com.xjrsoft.module.teacher.entity.WfTeacherleave;
  7. import com.xjrsoft.module.teacher.mapper.WfTeacherleaveMapper;
  8. import com.xjrsoft.module.teacher.service.IWfHeadTeacherLeaveService;
  9. import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
  10. import lombok.AllArgsConstructor;
  11. import lombok.Data;
  12. import org.springframework.stereotype.Service;
  13. import java.time.*;
  14. import java.time.temporal.ChronoUnit;
  15. import java.util.*;
  16. /**
  17. * @title: 教职工请假流程
  18. * @Author szs
  19. * @Date: 2023-12-20
  20. * @Version 1.0
  21. */
  22. @Service
  23. @AllArgsConstructor
  24. public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleaveMapper, WfTeacherleave> implements IWfTeacherleaveService {
  25. private final IWfHeadTeacherLeaveService wfHeadTeacherLeaveService;
  26. @Override
  27. public Boolean dataHandle(Long dataId) {
  28. WfTeacherleave wfTeacherleave = this.getById(dataId);
  29. //如果请假老师是班主任,将信息同步到班主任事项请假
  30. if (ObjectUtil.isNotNull(wfTeacherleave) && wfTeacherleave.getIsItAHomeroomTeacher().equals("是")) {
  31. /*
  32. * 如果是周一到周四的上午,自动同步请假类型为“早自习、课间操”的数据到班主任事项请假列表,
  33. * 如果是周五下午自动同步请假类型为“学生放假”的数据到班主任事项请假列表。
  34. */
  35. //将请假时间段按照日分割成几段
  36. Date leaveStartTime = wfTeacherleave.getLeaveStartTime();//请假开始时间
  37. Date leaveEndTime = wfTeacherleave.getLeaveEndTime();//请假结束时间
  38. List<DateRange> dateRangeList = splitDateRangeByDay(LocalDateTime.ofInstant(leaveStartTime.toInstant(), ZoneId.systemDefault()), LocalDateTime.ofInstant(leaveEndTime.toInstant(), ZoneId.systemDefault()));
  39. List<WfHeadTeacherLeave> wfHeadTeacherLeaveList = new ArrayList<>();
  40. for (DateRange dateRange : dateRangeList) {
  41. LocalDateTime startTime = dateRange.getBegin();
  42. LocalDateTime endTime = dateRange.getEnd();
  43. //获取星期几
  44. DayOfWeek dayOfWeek = startTime.getDayOfWeek();
  45. int dayOfWeekValue = dayOfWeek.getValue();
  46. LocalDateTime forenoonStartDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(6, 0, 0));
  47. LocalDateTime forenoonEndDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(11, 0, 0));
  48. LocalDateTime afternoonStartDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(14, 0, 0));
  49. LocalDateTime afternoonEndDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(22, 0, 0));
  50. /*
  51. *当天是在星期一到星期四,
  52. * 且开始时间早于当天上午区间的开始时间,
  53. * 结束时间晚于当天上午区间的结束时间,
  54. * 自动同步一条请假类型为“早自习、课间操”的数据到班主任事项请假列表。
  55. */
  56. if (dayOfWeekValue > 0 && dayOfWeekValue < 5
  57. && startTime.compareTo(forenoonEndDateTime) < 0
  58. && endTime.compareTo(forenoonEndDateTime) > 0) {
  59. wfHeadTeacherLeaveList.add(new WfHeadTeacherLeave(){{
  60. setWfTeacherleaveId(wfTeacherleave.getId());
  61. setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
  62. setLeaveReason(LeaveReasonEnum.LeaveReason2.getCode());
  63. Instant startTimeInstant = startTime.atZone(ZoneId.systemDefault()).toInstant();
  64. Date startTimeDate = Date.from(startTimeInstant);
  65. setStartTime(startTimeDate);
  66. Instant endTimeInstant = endTime.atZone(ZoneId.systemDefault()).toInstant();
  67. Date endTimeDate = Date.from(endTimeInstant);
  68. setEndTime(endTimeDate);
  69. setRemark(wfTeacherleave.getReasonForLeave());
  70. setStatus(1);
  71. if(wfTeacherleave.getLeaveDays() <= 1){
  72. setSubstituteUserId(wfTeacherleave.getReliefHomerooTeacherId());
  73. }
  74. if(wfTeacherleave.getLeaveDays() > 1){
  75. setSubstituteUserId(wfTeacherleave.getReliefTeacherId());
  76. }
  77. }});
  78. }
  79. /*
  80. * 当天是在星期五,
  81. * 且开始时间早于下午区间的开始时间,
  82. * 结束时间晚于下午区间的结束时间,
  83. * 自动同步一条请假类型为“学生放假”的数据到班主任事项请假列表。
  84. */
  85. if (dayOfWeekValue == 5
  86. && startTime.compareTo(afternoonEndDateTime) < 0
  87. && endTime.compareTo(afternoonEndDateTime) > 0) {
  88. WfHeadTeacherLeave wfHeadTeacherLeave = new WfHeadTeacherLeave();
  89. wfHeadTeacherLeave.setWfTeacherleaveId(wfTeacherleave.getId());
  90. wfHeadTeacherLeave.setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
  91. wfHeadTeacherLeave.setLeaveReason(LeaveReasonEnum.LeaveReason1.getCode());
  92. Instant startTimeInstant = startTime.atZone(ZoneId.systemDefault()).toInstant();
  93. Date startTimeDate = Date.from(startTimeInstant);
  94. wfHeadTeacherLeave.setStartTime(startTimeDate);
  95. Instant endTimeInstant = endTime.atZone(ZoneId.systemDefault()).toInstant();
  96. Date endTimeDate = Date.from(endTimeInstant);
  97. wfHeadTeacherLeave.setEndTime(endTimeDate);
  98. wfHeadTeacherLeave.setRemark(wfTeacherleave.getReasonForLeave());
  99. wfHeadTeacherLeave.setStatus(1);
  100. wfHeadTeacherLeaveList.add(wfHeadTeacherLeave);
  101. }
  102. }
  103. return wfHeadTeacherLeaveService.saveBatch(wfHeadTeacherLeaveList);
  104. }
  105. return true;
  106. }
  107. /**
  108. * 按日分割
  109. *
  110. * @param startTime 开始时间
  111. * @param endTime 结束时间
  112. * @return 分割后的时间段集合
  113. */
  114. private List<DateRange> splitDateRangeByDay(LocalDateTime startTime, LocalDateTime endTime) {
  115. long seconds = startTime.until(endTime, ChronoUnit.SECONDS);
  116. if (seconds < 0) {
  117. return new ArrayList<>();
  118. }
  119. //轮数
  120. long turnNum = 0;
  121. //分割的时间段集合,使用累加算法
  122. List<DateRange> dateList = new ArrayList<>();
  123. DateRange range = new DateRange();
  124. range.setBegin(startTime);
  125. while (true) {
  126. turnNum++;
  127. startTime = startTime.plusDays(1);
  128. //大于截止日期时,不再累加
  129. if (startTime.isAfter(endTime)) {
  130. range.setEnd(endTime);
  131. range.setTurnNum(turnNum);
  132. dateList.add(range);
  133. break;
  134. }
  135. //将时间调整为该天的 0时 0分 0秒
  136. startTime = LocalDateTime.of(startTime.getYear(), startTime.getMonth(), startTime.getDayOfMonth(), 0, 0, 0);
  137. LocalDateTime tmpBegin = startTime;
  138. //计算出上一天的最后一秒
  139. LocalDateTime endDate = tmpBegin.minusSeconds(1);
  140. range.setEnd(endDate);
  141. range.setTurnNum(turnNum);
  142. dateList.add(range);
  143. //创建新的时间段
  144. range = new DateRange();
  145. range.setBegin(tmpBegin);
  146. }
  147. return dateList;
  148. }
  149. @Data
  150. static class DateRange {
  151. /**
  152. * 开始时间
  153. */
  154. private LocalDateTime begin;
  155. /**
  156. * 结束时间
  157. */
  158. private LocalDateTime end;
  159. /**
  160. * 当前时间的第几轮(段)
  161. */
  162. private Long turnNum;
  163. }
  164. }