Browse Source

解决考勤消息通知频繁的问题

dzx 8 months ago
parent
commit
f90d161194

+ 24 - 8
src/main/java/com/xjrsoft/module/job/AttenDanceWarnNoticeTask.java

@@ -59,7 +59,7 @@ public class AttenDanceWarnNoticeTask {
     @Autowired
     private IWechatMessageLogService wechatMessageLogService;
 
-    @Scheduled(cron = "0 */5 * * * ?")
+    @Scheduled(cron = "0 */1 * * * ?")
     public void RefreshConnectionPool() {
         String active = SpringUtil.getActiveProfile();
         if("dev".equals(active)){
@@ -101,7 +101,7 @@ public class AttenDanceWarnNoticeTask {
 
         //获取最近的时间
         LocalDateTime recentlyTime = getRecentlyTime(ruleDetailsList, now);
-        if(recentlyTime.getHour() != now.getHour() && Math.abs(recentlyTime.getMinute() - now.getMinute()) <= 2){
+        if(recentlyTime.getHour() != now.getHour() && Math.abs(recentlyTime.getMinute() - now.getMinute()) >= 2){
             log.info("未到时间,不进行推送");
             return;
         }
@@ -249,19 +249,35 @@ public class AttenDanceWarnNoticeTask {
                     && ruleDetail.getIsAttendance() != null && ruleDetail.getIsAttendance() == 1){
                 if(ruleDetail.getAmStartTime() != null){
                     LocalDateTime amStartTime = now.with(ruleDetail.getAmStartTime().toLocalTime());
-                    result.add(amStartTime.plusMinutes(- ruleDetail.getAgoMinutes()));
-                    result.add(amStartTime.plusMinutes(ruleDetail.getOverMinutes()));
+                    if(ruleDetail.getAgoMinutes() != null){
+                        result.add(amStartTime.plusMinutes(- ruleDetail.getAgoMinutes()));
+                    }
+
+                    if(ruleDetail.getOverMinutes() != null){
+                        result.add(amStartTime.plusMinutes(ruleDetail.getOverMinutes()));
+                    }
+
                 }
                 if(ruleDetail.getPmStartTime() != null){
                     LocalDateTime pmStartTime = now.with(ruleDetail.getPmStartTime().toLocalTime());
-                    result.add(pmStartTime.plusMinutes(- ruleDetail.getAgoMinutes()));
-                    result.add(pmStartTime.plusMinutes(ruleDetail.getOverMinutes()));
+                    if(ruleDetail.getAgoMinutes() != null){
+                        result.add(pmStartTime.plusMinutes(- ruleDetail.getAgoMinutes()));
+                    }
+
+                    if(ruleDetail.getOverMinutes() != null){
+                        result.add(pmStartTime.plusMinutes(ruleDetail.getOverMinutes()));
+                    }
                 }
 
                 if(ruleDetail.getEveningStartTime() != null){
                     LocalDateTime eveningStartTime = now.with(ruleDetail.getEveningStartTime().toLocalTime());
-                    result.add(eveningStartTime.plusMinutes(- ruleDetail.getAgoMinutes()));
-                    result.add(eveningStartTime.plusMinutes(ruleDetail.getOverMinutes()));
+                    if(ruleDetail.getAgoMinutes() != null){
+                        result.add(eveningStartTime.plusMinutes(- ruleDetail.getAgoMinutes()));
+                    }
+
+                    if(ruleDetail.getOverMinutes() != null){
+                        result.add(eveningStartTime.plusMinutes(ruleDetail.getOverMinutes()));
+                    }
                 }
             }
         }

+ 46 - 32
src/main/java/com/xjrsoft/module/job/AttendanceMessageTask.java

@@ -106,19 +106,6 @@ public class AttendanceMessageTask {
         }
         //查询今天的考勤规则
         List<AttendanceRuleDetails> ruleDetails = ruleCategoryService.getTodayRules();
-
-
-//        WechatMessageLog log = wechatMessageLogService.getOne(
-//                new QueryWrapper<WechatMessageLog>().lambda()
-//                        .select(WechatMessageLog.class, x -> VoToColumnUtil.fieldsToColumns(WechatMessageLog.class).contains(x.getProperty()))
-//                        .eq(WechatMessageLog::getSendTime, recentlyTime)
-//                        .eq(WechatMessageLog::getTemplateId, wechatTemplate)
-//        );
-//        if(log != null){//已经推送过,不再进行推送
-//            return;
-//        }
-
-
         List<AttendanceMessageSet> list = messageSetService.list();
         //判断是上午还是下午
         Integer timePeriod = null;
@@ -142,16 +129,6 @@ public class AttendanceMessageTask {
         //查询需要通知的人
 
         for (AttendanceMessageSet messageSet : list) {
-            List<XjrUser> userList = userService.list(
-                new MPJLambdaWrapper<XjrUser>().distinct()
-                .select(XjrUser::getId)
-                .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
-                .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
-                .leftJoin(AttendanceMessageUserRelation.class, AttendanceMessageUserRelation::getUserId, XjrUser::getId)
-                .in(UserRoleRelation::getRoleId, roleTypes)
-                .eq(AttendanceMessageUserRelation::getAttendanceMessageSetId, messageSet.getId())
-            );
-
             LocalDateTime recentlyTime = null;
             String characterKey = "character_string18";
             String wechatTemplate = weChatUtil.getAttendanceMsgLateTemplate();
@@ -160,16 +137,34 @@ public class AttendanceMessageTask {
                 characterKey = "character_string18";
                 //获取最近的时间
                 recentlyTime = getRecentlyTime(ruleDetails, now);
-                if(!recentlyTime.isEqual(now)){
-                    log.info("未到时间,不需要提醒");
+                if(recentlyTime.getHour() != now.getHour() && Math.abs(recentlyTime.getMinute() - now.getMinute()) >= 2){
+                    log.info("未到时间,不进行推送");
+                    continue;
+                }
+                long count = wechatMessageLogService.count(
+                        new QueryWrapper<WechatMessageLog>().lambda()
+                                .eq(WechatMessageLog::getSendTime, recentlyTime)
+                                .eq(WechatMessageLog::getTemplateId, wechatTemplate)
+                );
+                if(count > 0){//已经推送过,不再进行推送
+                    log.info("已推送过,不进行推送");
                     continue;
                 }
             }else if(messageSet.getMessageCategory() != null && messageSet.getMessageCategory() == 3){
                 wechatTemplate = weChatUtil.getAttendanceMsgAbsenceTemplate();
                 recentlyTime = getRecentlyOverTime(ruleDetails, now);
                 characterKey = "character_string36";
-                if(!recentlyTime.isEqual(now)){
-                    log.info("未到时间,不需要提醒");
+                if(recentlyTime.getHour() != now.getHour() && Math.abs(recentlyTime.getMinute() - now.getMinute()) >= 2){
+                    log.info("未到时间,不进行推送");
+                    continue;
+                }
+                long count = wechatMessageLogService.count(
+                        new QueryWrapper<WechatMessageLog>().lambda()
+                                .eq(WechatMessageLog::getSendTime, recentlyTime)
+                                .eq(WechatMessageLog::getTemplateId, wechatTemplate)
+                );
+                if(count > 0){//已经推送过,不再进行推送
+                    log.info("已推送过,不进行推送");
                     continue;
                 }
             }
@@ -178,6 +173,16 @@ public class AttendanceMessageTask {
                 continue;
             }
 
+            List<XjrUser> userList = userService.list(
+                    new MPJLambdaWrapper<XjrUser>().distinct()
+                            .select(XjrUser::getId)
+                            .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                            .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
+                            .leftJoin(AttendanceMessageUserRelation.class, AttendanceMessageUserRelation::getUserId, XjrUser::getId)
+                            .in(UserRoleRelation::getRoleId, roleTypes)
+                            .eq(AttendanceMessageUserRelation::getAttendanceMessageSetId, messageSet.getId())
+            );
+
             //没有需要通知的,直接跳过
             if(userList.isEmpty()){
                 continue;
@@ -235,7 +240,7 @@ public class AttendanceMessageTask {
                 for (XjrUser xjrUser : userList) {
                     weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
                     weChatSendMessageDto.setUserId(xjrUser.getOpenId());
-                    weChatService.sendTemplateMessage(weChatSendMessageDto);
+//                    weChatService.sendTemplateMessage(weChatSendMessageDto);
                 }
             }else if(messageSet.getRoleType() != null && messageSet.getRoleType() == 3){
                 //教师总人数
@@ -280,7 +285,7 @@ public class AttendanceMessageTask {
                 for (XjrUser xjrUser : userList) {
                     weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
                     weChatSendMessageDto.setUserId(xjrUser.getOpenId());
-                    weChatService.sendTemplateMessage(weChatSendMessageDto);
+//                    weChatService.sendTemplateMessage(weChatSendMessageDto);
                 }
             }
 
@@ -334,16 +339,25 @@ public class AttendanceMessageTask {
             if(ruleDetail.getIsAllowInOutSchool() != null && ruleDetail.getIsAllowInOutSchool() == 1
                     && ruleDetail.getIsAttendance() != null && ruleDetail.getIsAttendance() == 1){
                 if(ruleDetail.getAmStartTime() != null){
-                    LocalDateTime amStartTime = now.with(ruleDetail.getAmStartTime().toLocalTime()).plusMinutes(ruleDetail.getOverMinutes());
+                    LocalDateTime amStartTime = now.with(ruleDetail.getAmStartTime().toLocalTime());
+                    if(ruleDetail.getOverMinutes() != null){
+                        amStartTime.plusMinutes(ruleDetail.getOverMinutes());
+                    }
                     result.add(amStartTime);
                 }
                 if(ruleDetail.getPmStartTime() != null){
-                    LocalDateTime pmStartTime = now.with(ruleDetail.getPmStartTime().toLocalTime()).plusMinutes(ruleDetail.getOverMinutes());
+                    LocalDateTime pmStartTime = now.with(ruleDetail.getPmStartTime().toLocalTime());
+                    if(ruleDetail.getOverMinutes() != null){
+                        pmStartTime.plusMinutes(ruleDetail.getOverMinutes());
+                    }
                     result.add(pmStartTime);
                 }
 
                 if(ruleDetail.getEveningStartTime() != null){
-                    LocalDateTime eveningStartTime = now.with(ruleDetail.getEveningStartTime().toLocalTime()).plusMinutes(ruleDetail.getOverMinutes());
+                    LocalDateTime eveningStartTime = now.with(ruleDetail.getEveningStartTime().toLocalTime());
+                    if(ruleDetail.getOverMinutes() != null){
+                        eveningStartTime.plusMinutes(ruleDetail.getOverMinutes());
+                    }
                     result.add(eveningStartTime);
                 }
             }

+ 1 - 1
src/main/java/com/xjrsoft/module/job/InsertOutInRecordTask.java

@@ -20,7 +20,7 @@ public class InsertOutInRecordTask {
 
     OutInRecordUtil out_in_recordUtil = new OutInRecordUtil();
 
-    @Scheduled(cron = "*/60 * * * * ?")
+    @Scheduled(cron = "* */60 * * * ?")
     public void RefreshConnectionPool() {
         String active = SpringUtil.getActiveProfile();
         if(!"prod".equals(active)){