AttenDanceWarnNoticeTask.java 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package com.xjrsoft.module.job;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
  5. import com.xjrsoft.module.attendance.entity.AttendanceUserRelation;
  6. import com.xjrsoft.module.attendance.mapper.AttendanceUserRelationMapper;
  7. import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
  8. import com.xjrsoft.module.concat.service.IXjrUserService;
  9. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  10. import com.xjrsoft.module.organization.service.IWeChatService;
  11. import com.xjrsoft.module.teacher.entity.XjrUser;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.scheduling.annotation.Scheduled;
  15. import org.springframework.stereotype.Component;
  16. import java.time.LocalDateTime;
  17. import java.time.format.DateTimeFormatter;
  18. import java.time.temporal.ChronoUnit;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.Set;
  23. /**
  24. * 考勤预警通知
  25. * @author dzx
  26. * @date 2024年5月21日
  27. */
  28. @Component
  29. @Slf4j
  30. public class AttenDanceWarnNoticeTask {
  31. @Autowired
  32. private IAttendanceRuleCategoryService categoryService;
  33. @Autowired
  34. private IXjrUserService userService;
  35. @Autowired
  36. private AttendanceUserRelationMapper relationMapper;
  37. @Autowired
  38. private IWeChatService weChatService;
  39. @Scheduled(cron = "0 */10 * * * ?")
  40. public void RefreshConnectionPool() {
  41. //获取当前时间
  42. LocalDateTime now = LocalDateTime.now();
  43. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  44. String timeStr = now.format(formatter);
  45. //查询今天所有的考勤规则
  46. List<AttendanceRuleDetails> ruleDetailsList = categoryService.getTodayRules();
  47. Map<Long, AttendanceRuleDetails> ruleDetailsMap = new HashMap<>();
  48. for (AttendanceRuleDetails ruleDetail : ruleDetailsList) {
  49. ruleDetailsMap.put(ruleDetail.getAttendanceRuleCategoryId(), ruleDetail);
  50. }
  51. //查询出所有人的考勤规则
  52. List<AttendanceUserRelation> relationList = relationMapper.selectList(
  53. new QueryWrapper<AttendanceUserRelation>().lambda()
  54. .eq(AttendanceUserRelation::getDeleteMark, 0)
  55. );
  56. Map<Long, AttendanceRuleDetails> allTodyRule = new HashMap<>();
  57. for (AttendanceUserRelation userRelation : relationList) {
  58. allTodyRule.put(userRelation.getUserId(), ruleDetailsMap.get(userRelation.getAttendanceRuleCategoryId()));
  59. }
  60. //判断所有当前时间下,哪几条规则需要进行提醒
  61. Map<Long, Integer> ruleDetailsJudgeMap = judgeExecuteNotice(now, ruleDetailsList);
  62. //查询
  63. //根据规则中的用户id查询出所有绑定了微信的学生和教师
  64. List<XjrUser> userList = getUserList(allTodyRule.keySet());
  65. for (XjrUser xjrUser : userList) {
  66. AttendanceRuleDetails ruleDetails = allTodyRule.get(xjrUser.getId());
  67. Integer status = ruleDetailsJudgeMap.get(ruleDetails.getId());
  68. if(status == 0){
  69. continue;
  70. }
  71. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  72. weChatSendMessageDto.setUserId(xjrUser.getOpenId());
  73. weChatSendMessageDto.setTemplateId("Fg4AWVQRGernl0PiJQ8gRgCUFHEGZuizlClQNuVhqu4");
  74. weChatSendMessageDto.setMsgId(xjrUser.getId().toString());
  75. JSONObject paramJson = new JSONObject();
  76. paramJson.put("thing8", xjrUser.getName());
  77. paramJson.put("time9", timeStr);
  78. if(status == 1){
  79. paramJson.put("const12", "进校");
  80. }else{
  81. paramJson.put("const12", "出校");
  82. }
  83. weChatSendMessageDto.setContent(paramJson);
  84. weChatService.sendTemplateMessage(weChatSendMessageDto);
  85. }
  86. }
  87. /**
  88. * 判断所有规则,哪些需要发送
  89. * @param judgeTime
  90. * @param ruleDetailsList
  91. * @return 0:不需要提醒,-1:待打卡,1:未打卡
  92. */
  93. Map<Long, Integer> judgeExecuteNotice(LocalDateTime judgeTime, List<AttendanceRuleDetails> ruleDetailsList){
  94. Map<Long, Integer> result = new HashMap<>();
  95. for (AttendanceRuleDetails ruleDetails : ruleDetailsList) {
  96. if(ruleDetails.getIsAllowInOutSchool() != null && ruleDetails.getIsAllowInOutSchool() != 1
  97. && ruleDetails.getIsAttendance() != null && ruleDetails.getIsAttendance() == 1){
  98. LocalDateTime amStartTime = judgeTime.with(ruleDetails.getAmStartTime());
  99. long amBetween = ChronoUnit.MINUTES.between(judgeTime, amStartTime);
  100. if(amBetween == ruleDetails.getAgoMinutes()){
  101. result.put(ruleDetails.getId(), - 1);
  102. }else if(amBetween == ruleDetails.getOverMinutes()){
  103. result.put(ruleDetails.getId(), - 1);
  104. }
  105. LocalDateTime pmStartTime = judgeTime.with(ruleDetails.getPmStartTime());
  106. long pmBetween = ChronoUnit.MINUTES.between(judgeTime, pmStartTime);
  107. if(pmBetween == ruleDetails.getAgoMinutes()){
  108. result.put(ruleDetails.getId(), - 1);
  109. }else if(pmBetween == ruleDetails.getOverMinutes()){
  110. result.put(ruleDetails.getId(), - 1);
  111. }
  112. LocalDateTime eveningStartTime = judgeTime.with(ruleDetails.getEveningStartTime());
  113. long eveningBetween = ChronoUnit.MINUTES.between(judgeTime, eveningStartTime);
  114. if(eveningBetween == ruleDetails.getAgoMinutes()){
  115. result.put(ruleDetails.getId(), - 1);
  116. }else if(eveningBetween == ruleDetails.getOverMinutes()){
  117. result.put(ruleDetails.getId(), - 1);
  118. }
  119. if(!result.containsKey(ruleDetails.getId())){
  120. result.put(ruleDetails.getId(), 0);
  121. }
  122. }else{
  123. result.put(ruleDetails.getId(), 0);
  124. }
  125. }
  126. return result;
  127. }
  128. /**
  129. * 查询出所有用户信息(openId不为空的)
  130. * @param userIds 需要插叙的userid
  131. * @return 用户信息
  132. */
  133. List<XjrUser> getUserList(Set<Long> userIds){
  134. return userService.list(
  135. new QueryWrapper<XjrUser>().lambda()
  136. .eq(XjrUser::getId, userIds)
  137. .isNotNull(XjrUser::getOpenId)
  138. );
  139. }
  140. }