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 ruleDetailsList = categoryService.getTodayRules(); Map ruleDetailsMap = new HashMap<>(); for (AttendanceRuleDetails ruleDetail : ruleDetailsList) { ruleDetailsMap.put(ruleDetail.getAttendanceRuleCategoryId(), ruleDetail); } //查询出所有人的考勤规则 List relationList = relationMapper.selectList( new QueryWrapper().lambda() .eq(AttendanceUserRelation::getDeleteMark, 0) ); Map allTodyRule = new HashMap<>(); for (AttendanceUserRelation userRelation : relationList) { allTodyRule.put(userRelation.getUserId(), ruleDetailsMap.get(userRelation.getAttendanceRuleCategoryId())); } //判断所有当前时间下,哪几条规则需要进行提醒 Map ruleDetailsJudgeMap = judgeExecuteNotice(now, ruleDetailsList); //查询 //根据规则中的用户id查询出所有绑定了微信的学生和教师 List 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 judgeExecuteNotice(LocalDateTime judgeTime, List ruleDetailsList){ Map 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 getUserList(Set userIds){ return userService.list( new QueryWrapper().lambda() .eq(XjrUser::getId, userIds) .isNotNull(XjrUser::getOpenId) ); } }