| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- 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)
- );
- }
- }
|