|
|
@@ -0,0 +1,163 @@
|
|
|
+package com.xjrsoft.module.job;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
|
|
|
+import com.xjrsoft.module.attendance.entity.AttendanceUserRelation;
|
|
|
+import com.xjrsoft.module.attendance.mapper.AttendanceUserRelationMapper;
|
|
|
+import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
|
|
|
+import com.xjrsoft.module.concat.service.IXjrUserService;
|
|
|
+import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
|
|
|
+import com.xjrsoft.module.organization.service.IWeChatService;
|
|
|
+import com.xjrsoft.module.teacher.entity.XjrUser;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.scheduling.annotation.Scheduled;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.time.temporal.ChronoUnit;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 考勤预警通知
|
|
|
+ * @author dzx
|
|
|
+ * @date 2024年5月21日
|
|
|
+ */
|
|
|
+@Component
|
|
|
+@Slf4j
|
|
|
+public class AttenDanceWarnNoticeTask {
|
|
|
+ @Autowired
|
|
|
+ private IAttendanceRuleCategoryService categoryService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IXjrUserService userService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private AttendanceUserRelationMapper relationMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IWeChatService weChatService;
|
|
|
+
|
|
|
+ @Scheduled(cron = "0 */10 * * * ?")
|
|
|
+ public void RefreshConnectionPool() {
|
|
|
+ //获取当前时间
|
|
|
+ LocalDateTime now = LocalDateTime.now();
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ String timeStr = now.format(formatter);
|
|
|
+
|
|
|
+ //查询今天所有的考勤规则
|
|
|
+ List<AttendanceRuleDetails> ruleDetailsList = categoryService.getTodayRules();
|
|
|
+ Map<Long, AttendanceRuleDetails> ruleDetailsMap = new HashMap<>();
|
|
|
+ for (AttendanceRuleDetails ruleDetail : ruleDetailsList) {
|
|
|
+ ruleDetailsMap.put(ruleDetail.getAttendanceRuleCategoryId(), ruleDetail);
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询出所有人的考勤规则
|
|
|
+ List<AttendanceUserRelation> relationList = relationMapper.selectList(
|
|
|
+ new QueryWrapper<AttendanceUserRelation>().lambda()
|
|
|
+ .eq(AttendanceUserRelation::getDeleteMark, 0)
|
|
|
+ );
|
|
|
+ Map<Long, AttendanceRuleDetails> allTodyRule = new HashMap<>();
|
|
|
+ for (AttendanceUserRelation userRelation : relationList) {
|
|
|
+ allTodyRule.put(userRelation.getUserId(), ruleDetailsMap.get(userRelation.getAttendanceRuleCategoryId()));
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断所有当前时间下,哪几条规则需要进行提醒
|
|
|
+ Map<Long, Integer> ruleDetailsJudgeMap = judgeExecuteNotice(now, ruleDetailsList);
|
|
|
+
|
|
|
+ //查询
|
|
|
+
|
|
|
+ //根据规则中的用户id查询出所有绑定了微信的学生和教师
|
|
|
+ List<XjrUser> userList = getUserList(allTodyRule.keySet());
|
|
|
+ for (XjrUser xjrUser : userList) {
|
|
|
+ AttendanceRuleDetails ruleDetails = allTodyRule.get(xjrUser.getId());
|
|
|
+ Integer status = ruleDetailsJudgeMap.get(ruleDetails.getId());
|
|
|
+ if(status == 0){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
|
|
|
+ weChatSendMessageDto.setUserId(xjrUser.getOpenId());
|
|
|
+ weChatSendMessageDto.setTemplateId("Fg4AWVQRGernl0PiJQ8gRgCUFHEGZuizlClQNuVhqu4");
|
|
|
+ weChatSendMessageDto.setMsgId(xjrUser.getId().toString());
|
|
|
+ JSONObject paramJson = new JSONObject();
|
|
|
+
|
|
|
+ paramJson.put("thing8", xjrUser.getName());
|
|
|
+ paramJson.put("time9", timeStr);
|
|
|
+ if(status == 1){
|
|
|
+ paramJson.put("const12", "进校");
|
|
|
+ }else{
|
|
|
+ paramJson.put("const12", "出校");
|
|
|
+ }
|
|
|
+
|
|
|
+ weChatSendMessageDto.setContent(paramJson);
|
|
|
+ weChatService.sendTemplateMessage(weChatSendMessageDto);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断所有规则,哪些需要发送
|
|
|
+ * @param judgeTime
|
|
|
+ * @param ruleDetailsList
|
|
|
+ * @return 0:不需要提醒,-1:待打卡,1:未打卡
|
|
|
+ */
|
|
|
+ Map<Long, Integer> judgeExecuteNotice(LocalDateTime judgeTime, List<AttendanceRuleDetails> ruleDetailsList){
|
|
|
+ Map<Long, Integer> result = new HashMap<>();
|
|
|
+ for (AttendanceRuleDetails ruleDetails : ruleDetailsList) {
|
|
|
+ if(ruleDetails.getIsAllowInOutSchool() != null && ruleDetails.getIsAllowInOutSchool() != 1
|
|
|
+ && ruleDetails.getIsAttendance() != null && ruleDetails.getIsAttendance() == 1){
|
|
|
+
|
|
|
+ LocalDateTime amStartTime = judgeTime.with(ruleDetails.getAmStartTime());
|
|
|
+ long amBetween = ChronoUnit.MINUTES.between(judgeTime, amStartTime);
|
|
|
+ if(amBetween == ruleDetails.getAgoMinutes()){
|
|
|
+ result.put(ruleDetails.getId(), - 1);
|
|
|
+ }else if(amBetween == ruleDetails.getOverMinutes()){
|
|
|
+ result.put(ruleDetails.getId(), - 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ LocalDateTime pmStartTime = judgeTime.with(ruleDetails.getPmStartTime());
|
|
|
+ long pmBetween = ChronoUnit.MINUTES.between(judgeTime, pmStartTime);
|
|
|
+ if(pmBetween == ruleDetails.getAgoMinutes()){
|
|
|
+ result.put(ruleDetails.getId(), - 1);
|
|
|
+ }else if(pmBetween == ruleDetails.getOverMinutes()){
|
|
|
+ result.put(ruleDetails.getId(), - 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ LocalDateTime eveningStartTime = judgeTime.with(ruleDetails.getEveningStartTime());
|
|
|
+ long eveningBetween = ChronoUnit.MINUTES.between(judgeTime, eveningStartTime);
|
|
|
+ if(eveningBetween == ruleDetails.getAgoMinutes()){
|
|
|
+ result.put(ruleDetails.getId(), - 1);
|
|
|
+ }else if(eveningBetween == ruleDetails.getOverMinutes()){
|
|
|
+ result.put(ruleDetails.getId(), - 1);
|
|
|
+ }
|
|
|
+ if(!result.containsKey(ruleDetails.getId())){
|
|
|
+ result.put(ruleDetails.getId(), 0);
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ result.put(ruleDetails.getId(), 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 查询出所有用户信息(openId不为空的)
|
|
|
+ * @param userIds 需要插叙的userid
|
|
|
+ * @return 用户信息
|
|
|
+ */
|
|
|
+ List<XjrUser> getUserList(Set<Long> userIds){
|
|
|
+ return userService.list(
|
|
|
+ new QueryWrapper<XjrUser>().lambda()
|
|
|
+ .eq(XjrUser::getId, userIds)
|
|
|
+ .isNotNull(XjrUser::getOpenId)
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|