| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- package com.xjrsoft.module.job;
- import cn.hutool.core.util.IdUtil;
- import cn.hutool.extra.spring.SpringUtil;
- import com.alibaba.fastjson.JSONObject;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.xjrsoft.common.utils.VoToColumnUtil;
- import com.xjrsoft.common.utils.WeChatUtil;
- 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.system.entity.WechatMessageLog;
- import com.xjrsoft.module.system.service.IWechatMessageLogService;
- 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.ArrayList;
- import java.util.Collections;
- import java.util.Date;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import java.util.stream.Collectors;
- /**
- * 考勤预警通知,提醒教师和学生是否该上课等
- * @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;
- @Autowired
- private WeChatUtil weChatUtil;
- @Autowired
- private IWechatMessageLogService wechatMessageLogService;
- @Scheduled(cron = "0 */5 * * * ?")
- public void RefreshConnectionPool() {
- String active = SpringUtil.getActiveProfile();
- if("dev".equals(active)){
- log.info("测试环境,无法执行数据推送");
- return;
- }
- //获取当前时间
- 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, AttendanceUserRelation> allUserStatus = new HashMap<>();
- for (AttendanceUserRelation userRelation : relationList) {
- allUserStatus.put(userRelation.getUserId(), userRelation);
- }
- //根据规则中的用户id查询出所有绑定了微信的学生和教师
- if(allTodyRule.isEmpty()){
- log.info("未能查询出规则,不进行推送");
- return;
- }
- //获取最近的时间
- LocalDateTime recentlyTime = getRecentlyTime(ruleDetailsList, now);
- if(recentlyTime.getHour() != now.getHour() && Math.abs(recentlyTime.getMinute() - now.getMinute()) <= 2){
- log.info("未到时间,不进行推送");
- return;
- }
- String wechatTemplate = weChatUtil.getAttenDanceWarnTemplate();
- List<WechatMessageLog> list = wechatMessageLogService.list(
- new QueryWrapper<WechatMessageLog>().lambda()
- .select(WechatMessageLog.class, x -> VoToColumnUtil.fieldsToColumns(WechatMessageLog.class).contains(x.getProperty()))
- .eq(WechatMessageLog::getSendTime, recentlyTime)
- .eq(WechatMessageLog::getTemplateId, wechatTemplate)
- );
- if(!list.isEmpty()){//已经推送过,不再进行推送
- return;
- }
- //判断所有当前时间下,哪几条规则需要进行提醒
- Map<Long, Integer> ruleDetailsJudgeMap = judgeExecuteNotice(now, ruleDetailsList, recentlyTime);
- WechatMessageLog messageLog = new WechatMessageLog();
- messageLog.setTemplateId(wechatTemplate);
- messageLog.setSendTime(recentlyTime);
- 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(wechatTemplate);
- weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
- JSONObject paramJson = new JSONObject();
- JSONObject time5 = new JSONObject();
- time5.put("value", recentlyTime.format(formatter));
- paramJson.put("time5", time5);
- JSONObject thing8 = new JSONObject();
- thing8.put("value", xjrUser.getName());
- paramJson.put("thing8", thing8);
- JSONObject time9 = new JSONObject();
- time9.put("value", timeStr);
- paramJson.put("time9", time9);
- JSONObject const12 = new JSONObject();
- if(status == 1){
- const12.put("value", "未打卡");
- }else{
- const12.put("value", "待打卡");
- }
- //查询这个用户最新的考勤状态
- AttendanceUserRelation userRelation = allUserStatus.get(xjrUser.getId());
- if(userRelation != null
- && userRelation.getAttendanceTime() !=null
- && userRelation.getAttendanceTime().toLocalDate().isEqual(now.toLocalDate())
- && "到校".equals(userRelation.getAttendanceStatus())){
- const12.put("value", "已打卡");
- }
- paramJson.put("const12", const12);
- weChatSendMessageDto.setContent(paramJson);
- weChatService.sendTemplateMessage(weChatSendMessageDto);
- }
- messageLog.setCreateDate(new Date());
- messageLog.setContent("消息推送人数:" + userList.size());
- wechatMessageLogService.save(messageLog);
- }
- /**
- * 判断所有规则,哪些需要发送
- * @param judgeTime
- * @param ruleDetailsList
- * @return 0:不需要提醒,1:未打卡,2:待打卡
- */
- Map<Long, Integer> judgeExecuteNotice(LocalDateTime judgeTime, List<AttendanceRuleDetails> ruleDetailsList, LocalDateTime recentlyTime){
- Map<Long, Integer> result = new HashMap<>();
- for (AttendanceRuleDetails ruleDetails : ruleDetailsList) {
- if(ruleDetails.getIsAllowInOutSchool() != null && ruleDetails.getIsAllowInOutSchool() == 1
- && ruleDetails.getIsAttendance() != null && ruleDetails.getIsAttendance() == 1){
- if(ruleDetails.getAmStartTime() != null){
- LocalDateTime amStartTime = judgeTime.with(ruleDetails.getAmStartTime().toLocalTime());
- if(recentlyTime.isEqual(amStartTime)){
- Long amBetween = ChronoUnit.MINUTES.between(judgeTime, amStartTime);
- if(judgeTime.isBefore(amStartTime) && amBetween >= ruleDetails.getAgoMinutes() - 1 && amBetween <= ruleDetails.getAgoMinutes() + 1){//相差分钟数小于0
- result.put(ruleDetails.getId(), 1);
- }else if(judgeTime.isAfter(amStartTime) && amBetween >= ruleDetails.getOverMinutes() - 1 && amBetween <= ruleDetails.getOverMinutes() + 1){
- result.put(ruleDetails.getId(), 2);
- }
- }
- }
- if(ruleDetails.getPmStartTime() != null){
- LocalDateTime pmStartTime = judgeTime.with(ruleDetails.getPmStartTime().toLocalTime());
- if(recentlyTime.isEqual(pmStartTime)){
- Long pmBetween = ChronoUnit.MINUTES.between(judgeTime, pmStartTime);
- if(judgeTime.isBefore(pmStartTime) && pmBetween >= ruleDetails.getAgoMinutes() - 1 && pmBetween <= ruleDetails.getAgoMinutes() + 1){
- result.put(ruleDetails.getId(), 1);
- }else if(judgeTime.isAfter(pmStartTime) && pmBetween >= ruleDetails.getOverMinutes() - 1 && pmBetween <= ruleDetails.getOverMinutes() + 1){
- result.put(ruleDetails.getId(), 2);
- }
- }
- }
- if(ruleDetails.getEveningStartTime() != null){
- LocalDateTime eveningStartTime = judgeTime.with(ruleDetails.getEveningStartTime().toLocalTime());
- if(recentlyTime.isEqual(eveningStartTime)){
- Long eveningBetween = ChronoUnit.MINUTES.between(judgeTime, eveningStartTime);
- if(judgeTime.isBefore(eveningStartTime) && eveningBetween >= ruleDetails.getAgoMinutes() - 1 && eveningBetween <= ruleDetails.getAgoMinutes() + 1){
- result.put(ruleDetails.getId(), 1);
- }else if(judgeTime.isAfter(eveningStartTime) && eveningBetween >= ruleDetails.getOverMinutes() - 1 && eveningBetween <= ruleDetails.getOverMinutes() + 1){
- result.put(ruleDetails.getId(), 2);
- }
- }
- }
- 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()
- .in(XjrUser::getId, userIds)
- .isNotNull(XjrUser::getOpenId)
- );
- }
- LocalDateTime getRecentlyTime(List<AttendanceRuleDetails> ruleDetails, LocalDateTime now){
- List<LocalDateTime> result = new ArrayList<>();
- for (AttendanceRuleDetails ruleDetail : ruleDetails) {
- if(ruleDetail.getIsAllowInOutSchool() != null && ruleDetail.getIsAllowInOutSchool() == 1
- && ruleDetail.getIsAttendance() != null && ruleDetail.getIsAttendance() == 1){
- if(ruleDetail.getAmStartTime() != null){
- LocalDateTime amStartTime = now.with(ruleDetail.getAmStartTime().toLocalTime());
- result.add(amStartTime.plusDays(- ruleDetail.getAgoMinutes()));
- result.add(amStartTime.plusDays(ruleDetail.getOverMinutes()));
- }
- if(ruleDetail.getPmStartTime() != null){
- LocalDateTime pmStartTime = now.with(ruleDetail.getPmStartTime().toLocalTime());
- result.add(pmStartTime.plusDays(- ruleDetail.getAgoMinutes()));
- result.add(pmStartTime.plusDays(ruleDetail.getOverMinutes()));
- }
- if(ruleDetail.getEveningStartTime() != null){
- LocalDateTime eveningStartTime = now.with(ruleDetail.getEveningStartTime().toLocalTime());
- result.add(eveningStartTime.plusDays(- ruleDetail.getAgoMinutes()));
- result.add(eveningStartTime.plusDays(ruleDetail.getOverMinutes()));
- }
- }
- }
- if(result.isEmpty()){
- return null;
- }
- Map<Long, LocalDateTime> timeMap = new HashMap<>();
- for (LocalDateTime localDateTime : result) {
- long between = ChronoUnit.SECONDS.between(now, localDateTime);
- timeMap.put(Math.abs(between), localDateTime);
- }
- List<Long> collect = timeMap.keySet().stream().collect(Collectors.toList());
- Collections.sort(collect, Long::compare);
- return timeMap.get(collect.get(0));
- }
- }
|