WfTeacherleaveServiceImpl.java 16 KB

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