WfTeacherleaveServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. package com.xjrsoft.module.teacher.service.impl;
  2. import cn.hutool.core.util.ObjectUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  5. import com.github.yulichang.base.MPJBaseServiceImpl;
  6. import com.google.gson.JsonArray;
  7. import com.google.gson.JsonElement;
  8. import com.google.gson.JsonObject;
  9. import com.google.gson.JsonParser;
  10. import com.xjrsoft.common.enums.LeaveReasonEnum;
  11. import com.xjrsoft.module.attendance.entity.TeacherAttendanceRecord;
  12. import com.xjrsoft.module.attendance.mapper.TeacherAttendanceRecordMapper;
  13. import com.xjrsoft.module.hikvision.entity.HikvisionData;
  14. import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
  15. import com.xjrsoft.module.hikvision.util.ApiUtil;
  16. import com.xjrsoft.module.teacher.entity.WfHeadTeacherLeave;
  17. import com.xjrsoft.module.teacher.entity.WfTeacherleave;
  18. import com.xjrsoft.module.teacher.mapper.WfTeacherleaveMapper;
  19. import com.xjrsoft.module.teacher.service.IWfHeadTeacherLeaveService;
  20. import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
  21. import lombok.AllArgsConstructor;
  22. import lombok.Data;
  23. import org.apache.ibatis.annotations.Param;
  24. import org.springframework.stereotype.Service;
  25. import java.text.SimpleDateFormat;
  26. import java.time.DayOfWeek;
  27. import java.time.Instant;
  28. import java.time.LocalDateTime;
  29. import java.time.LocalTime;
  30. import java.time.ZoneId;
  31. import java.time.temporal.ChronoUnit;
  32. import java.util.ArrayList;
  33. import java.util.Date;
  34. import java.util.HashMap;
  35. import java.util.List;
  36. import java.util.Map;
  37. import java.util.stream.Collectors;
  38. /**
  39. * @title: 教职工请假流程
  40. * @Author szs
  41. * @Date: 2023-12-20
  42. * @Version 1.0
  43. */
  44. @Service
  45. @AllArgsConstructor
  46. public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleaveMapper, WfTeacherleave> implements IWfTeacherleaveService {
  47. private final IWfHeadTeacherLeaveService wfHeadTeacherLeaveService;
  48. private final HikvisionDataMapper hikvisionDataMapper;
  49. private final WfTeacherleaveMapper wfTeacherleaveMapper;
  50. private final TeacherAttendanceRecordMapper attendanceRecordMapper;
  51. @Override
  52. public Boolean dataHandle(Long dataId) {
  53. WfTeacherleave wfTeacherleave = this.getById(dataId);
  54. //如果请假老师是班主任,将信息同步到班主任事项请假
  55. if (ObjectUtil.isNotNull(wfTeacherleave) && wfTeacherleave.getIsItAHomeroomTeacher().equals("是")) {
  56. /*
  57. * 如果是周一到周四的上午,自动同步请假类型为“早自习、课间操”的数据到班主任事项请假列表,
  58. * 如果是周五下午自动同步请假类型为“学生放假”的数据到班主任事项请假列表。
  59. */
  60. //将请假时间段按照日分割成几段
  61. Date leaveStartTime = wfTeacherleave.getLeaveStartTime();//请假开始时间
  62. Date leaveEndTime = wfTeacherleave.getLeaveEndTime();//请假结束时间
  63. List<DateRange> dateRangeList = splitDateRangeByDay(LocalDateTime.ofInstant(leaveStartTime.toInstant(), ZoneId.systemDefault()), LocalDateTime.ofInstant(leaveEndTime.toInstant(), ZoneId.systemDefault()));
  64. List<WfHeadTeacherLeave> wfHeadTeacherLeaveList = new ArrayList<>();
  65. for (DateRange dateRange : dateRangeList) {
  66. LocalDateTime startTime = dateRange.getBegin();
  67. LocalDateTime endTime = dateRange.getEnd();
  68. //获取星期几
  69. DayOfWeek dayOfWeek = startTime.getDayOfWeek();
  70. int dayOfWeekValue = dayOfWeek.getValue();
  71. //LocalDateTime forenoonStartDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(9, 50, 0));
  72. LocalDateTime forenoonEndDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(10, 30, 0));
  73. //LocalDateTime afternoonStartDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(14, 0, 0));
  74. LocalDateTime afternoonEndDateTime = LocalDateTime.of(startTime.toLocalDate(), LocalTime.of(15, 30, 0));
  75. /*
  76. *当天是在星期一到星期四,
  77. * 且开始时间早于当天上午区间的结束时间,
  78. * 结束时间晚于当天上午区间的结束时间,
  79. * 自动同步一条请假类型为“早自习、课间操”的数据到班主任事项请假列表。
  80. */
  81. if (dayOfWeekValue > 0 && dayOfWeekValue < 5
  82. && startTime.compareTo(forenoonEndDateTime) < 0
  83. && endTime.compareTo(forenoonEndDateTime) > 0) {
  84. wfHeadTeacherLeaveList.add(new WfHeadTeacherLeave(){{
  85. setWfTeacherleaveId(wfTeacherleave.getId());
  86. setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
  87. setLeaveReason(LeaveReasonEnum.LeaveReason2.getCode());
  88. Instant startTimeInstant = startTime.atZone(ZoneId.systemDefault()).toInstant();
  89. Date startTimeDate = Date.from(startTimeInstant);
  90. setStartTime(startTimeDate);
  91. setTimePeriod(1);
  92. setRemark(wfTeacherleave.getReasonForLeave());
  93. setStatus(1);
  94. if(wfTeacherleave.getLeaveDays() <= 1){
  95. setSubstituteUserId(wfTeacherleave.getReliefHomerooTeacherId());
  96. }
  97. if(wfTeacherleave.getLeaveDays() > 1){
  98. setSubstituteUserId(wfTeacherleave.getReliefTeacherId());
  99. }
  100. setCreateDate(new Date());
  101. //setCreateUserId(StpUtil.getLoginIdAsLong());
  102. QueryWrapper<WfHeadTeacherLeave> queryWrapperSortcode = new QueryWrapper<>();
  103. queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
  104. WfHeadTeacherLeave w = wfHeadTeacherLeaveService.getOne(queryWrapperSortcode);
  105. setSortCode(w.getSortCode() + 1);
  106. }});
  107. }
  108. /*
  109. * 当天是在星期五,
  110. * 且开始时间早于下午区间的结束时间,
  111. * 结束时间晚于下午区间的结束时间,
  112. * 自动同步一条请假类型为“学生放假”的数据到班主任事项请假列表。
  113. */
  114. if (dayOfWeekValue == 5
  115. && startTime.compareTo(afternoonEndDateTime) < 0
  116. && endTime.compareTo(afternoonEndDateTime) > 0) {
  117. WfHeadTeacherLeave wfHeadTeacherLeave = new WfHeadTeacherLeave();
  118. wfHeadTeacherLeave.setWfTeacherleaveId(wfTeacherleave.getId());
  119. wfHeadTeacherLeave.setApplicantUserId(Long.valueOf(wfTeacherleave.getUserId()));
  120. wfHeadTeacherLeave.setLeaveReason(LeaveReasonEnum.LeaveReason1.getCode());
  121. Instant startTimeInstant = startTime.atZone(ZoneId.systemDefault()).toInstant();
  122. Date startTimeDate = Date.from(startTimeInstant);
  123. wfHeadTeacherLeave.setStartTime(startTimeDate);
  124. wfHeadTeacherLeave.setTimePeriod(2);
  125. wfHeadTeacherLeave.setRemark(wfTeacherleave.getReasonForLeave());
  126. wfHeadTeacherLeave.setStatus(1);
  127. wfHeadTeacherLeave.setCreateDate(new Date());
  128. //wfHeadTeacherLeave.setCreateUserId(StpUtil.getLoginIdAsLong());
  129. QueryWrapper<WfHeadTeacherLeave> queryWrapperSortcode = new QueryWrapper<>();
  130. queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
  131. WfHeadTeacherLeave w = wfHeadTeacherLeaveService.getOne(queryWrapperSortcode);
  132. wfHeadTeacherLeave.setSortCode(w.getSortCode() + 1);
  133. wfHeadTeacherLeaveList.add(wfHeadTeacherLeave);
  134. }
  135. }
  136. return wfHeadTeacherLeaveService.saveBatch(wfHeadTeacherLeaveList);
  137. }
  138. return true;
  139. }
  140. @Override
  141. public Boolean hikvisionLeave(Long id) {
  142. WfTeacherleave teacherleave = this.getById(id);
  143. //查询学生在海康的id
  144. HikvisionData hikvisionData = hikvisionDataMapper.selectOne(
  145. new QueryWrapper<HikvisionData>().lambda()
  146. .eq(HikvisionData::getSourceId, teacherleave.getUserId())
  147. .eq(HikvisionData::getTableName, "base_teacher")
  148. );
  149. ApiUtil apiUtil = new ApiUtil();
  150. String apiPath = "/api/acps/v1/auth_config/add";
  151. String outputFormat = "yyyy-MM-dd'T'HH:mm:ss+08:00";
  152. SimpleDateFormat sdf = new SimpleDateFormat(outputFormat);
  153. JsonObject paramJson = new JsonObject();
  154. paramJson.addProperty("startTime", sdf.format(teacherleave.getLeaveStartTime()));
  155. paramJson.addProperty("endTime", sdf.format(teacherleave.getLeaveEndTime()));
  156. //组装人员数据
  157. JsonArray personDatas = new JsonArray();
  158. JsonObject personData = new JsonObject();
  159. personData.addProperty("personDataType", "person");
  160. JsonArray indexCodes = new JsonArray();
  161. indexCodes.add(hikvisionData.getHikvisionId());
  162. personData.add("indexCodes", indexCodes);
  163. personDatas.add(personData);
  164. paramJson.add("personDatas", personDatas);
  165. JsonArray resourceInfos = selectResource(apiUtil);
  166. paramJson.add("resourceInfos", resourceInfos);
  167. Map<String, String> header = new HashMap<>();
  168. header.put("tagId", "studentleave");
  169. //调用接口获取到返回内容,并将其存到数据库中
  170. String result = apiUtil.doPost(apiPath, paramJson.toString(), null, header);
  171. teacherleave.setHikvisionResult(result);
  172. this.updateById(teacherleave);
  173. return true;
  174. }
  175. @Override
  176. public Long getLeaveCount(LocalDateTime startTime, LocalDateTime endTime) {
  177. return wfTeacherleaveMapper.getLeaveCount(startTime, endTime);
  178. }
  179. @Override
  180. public Map<Long, WfTeacherleave> getLeaveList(LocalDateTime startTime, LocalDateTime endTime) {
  181. List<WfTeacherleave> leaveList = wfTeacherleaveMapper.getLeaveList(startTime, endTime);
  182. Map<Long, WfTeacherleave> result = new HashMap<>();
  183. for (WfTeacherleave teacherleave : leaveList) {
  184. String[] teacherIds = teacherleave.getUserId().split(",");
  185. for (String teacherId : teacherIds) {
  186. result.put(Long.valueOf(teacherId), teacherleave);
  187. }
  188. }
  189. return result;
  190. }
  191. @Override
  192. public WfTeacherleave getLeaveByUserId(LocalDateTime startTime, LocalDateTime endTime, Long userId) {
  193. return this.baseMapper.getLeaveByUserId(startTime, endTime, userId);
  194. }
  195. @Override
  196. public void updateAttendancestatus(Long id) {
  197. WfTeacherleave teacherleave = this.getById(id);
  198. List<TeacherAttendanceRecord> leaveList = attendanceRecordMapper.getLeaveList(teacherleave);
  199. for (TeacherAttendanceRecord teacherAttendanceRecord : leaveList) {
  200. UpdateWrapper<TeacherAttendanceRecord> updateWrapper = new UpdateWrapper<>();
  201. updateWrapper.eq("id", teacherAttendanceRecord.getId());
  202. updateWrapper.setSql("attendance_mode = null");
  203. updateWrapper.setSql("car_number = null");
  204. updateWrapper.setSql("record_time = null");
  205. updateWrapper.setSql("attendance_status = '" + teacherleave.getLeaveType() + "'");
  206. attendanceRecordMapper.update(teacherAttendanceRecord, updateWrapper);
  207. }
  208. }
  209. JsonArray selectResource(ApiUtil apiUtil){
  210. String apiPath = "/api/irds/v2/resource/resourcesByParams";
  211. JsonObject jsonObject = new JsonObject();
  212. jsonObject.addProperty("pageNo", 1);
  213. jsonObject.addProperty("pageSize", 500);
  214. jsonObject.addProperty("resourceType", "door");
  215. String result = apiUtil.doPost(apiPath, jsonObject.toString(), null, null);
  216. JsonParser parser = new JsonParser();
  217. JsonObject resultJson = parser.parse(result).getAsJsonObject();
  218. JsonArray resourceInfos = new JsonArray();
  219. if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
  220. JsonArray list = resultJson.get("data").getAsJsonObject().get("list").getAsJsonArray();
  221. for (JsonElement jsonElement : list) {
  222. JsonObject listOne = jsonElement.getAsJsonObject();
  223. JsonObject resourceInfo = new JsonObject();
  224. resourceInfo.add("resourceIndexCode", listOne.get("indexCode"));
  225. resourceInfo.add("resourceType", listOne.get("resourceType"));
  226. JsonArray channelNos = new JsonArray();
  227. channelNos.add(listOne.get("channelNo"));
  228. resourceInfo.add("channelNos", channelNos);
  229. resourceInfos.add(resourceInfo);
  230. }
  231. }
  232. return resourceInfos;
  233. }
  234. /**
  235. * 按日分割
  236. *
  237. * @param startTime 开始时间
  238. * @param endTime 结束时间
  239. * @return 分割后的时间段集合
  240. */
  241. private List<DateRange> splitDateRangeByDay(LocalDateTime startTime, LocalDateTime endTime) {
  242. long seconds = startTime.until(endTime, ChronoUnit.SECONDS);
  243. if (seconds < 0) {
  244. return new ArrayList<>();
  245. }
  246. //轮数
  247. long turnNum = 0;
  248. //分割的时间段集合,使用累加算法
  249. List<DateRange> dateList = new ArrayList<>();
  250. DateRange range = new DateRange();
  251. range.setBegin(startTime);
  252. while (true) {
  253. turnNum++;
  254. startTime = startTime.plusDays(1);
  255. //大于截止日期时,不再累加
  256. if (startTime.isAfter(endTime)) {
  257. range.setEnd(endTime);
  258. range.setTurnNum(turnNum);
  259. dateList.add(range);
  260. break;
  261. }
  262. //将时间调整为该天的 0时 0分 0秒
  263. startTime = LocalDateTime.of(startTime.getYear(), startTime.getMonth(), startTime.getDayOfMonth(), 0, 0, 0);
  264. LocalDateTime tmpBegin = startTime;
  265. //计算出上一天的最后一秒
  266. LocalDateTime endDate = tmpBegin.minusSeconds(1);
  267. range.setEnd(endDate);
  268. range.setTurnNum(turnNum);
  269. dateList.add(range);
  270. //创建新的时间段
  271. range = new DateRange();
  272. range.setBegin(tmpBegin);
  273. }
  274. return dateList;
  275. }
  276. @Data
  277. static class DateRange {
  278. /**
  279. * 开始时间
  280. */
  281. private LocalDateTime begin;
  282. /**
  283. * 结束时间
  284. */
  285. private LocalDateTime end;
  286. /**
  287. * 当前时间的第几轮(段)
  288. */
  289. private Long turnNum;
  290. }
  291. @Override
  292. public Map<String, List<WfTeacherleave>> getUserLeaveList(LocalDateTime startTime, LocalDateTime endTime, List<Long> userIds) {
  293. List<WfTeacherleave> leaveList = wfTeacherleaveMapper.getUserLeaveList(startTime, endTime, userIds);
  294. Map<String, List<WfTeacherleave>> result = leaveList.stream().collect(Collectors.groupingBy(WfTeacherleave::getUserId));
  295. return result;
  296. }
  297. }