Bläddra i källkod

Merge remote-tracking branch 'origin/dev' into dev

大数据与最优化研究所 8 månader sedan
förälder
incheckning
644647dcf7

+ 5 - 4
src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java

@@ -128,7 +128,7 @@ public class StatisticsController {
             if(statisticsVo.getAllCount() != null && statisticsVo.getAllCount() != 0){
                 divide = BigDecimal.valueOf(statisticsVo.getActualCount()).divide(BigDecimal.valueOf(statisticsVo.getAllCount()), 4, RoundingMode.HALF_UP);
             }
-            statisticsVo.setAttendanceRate(divide.doubleValue());
+            statisticsVo.setAttendanceRate(divide.doubleValue() + "");
         }
 
         return RT.ok(statisticsVo);
@@ -172,7 +172,8 @@ public class StatisticsController {
                             .eq(StudentOutInRecord::getStatus, 1)
             );
             //实到人数
-            statisticsVo.setActualCount(Long.valueOf(outInRecords.size()));
+            List<Long> collect = outInRecords.stream().map(StudentOutInRecord::getUserId).collect(Collectors.toList());
+            statisticsVo.setActualCount(Long.valueOf(collect.size()));
 
             //查询教师请假人数
             Long leaveCount = studentLeaveService.getLeaveCount(startTime, endTime, dto);
@@ -200,9 +201,9 @@ public class StatisticsController {
                 //最后通过总人数-实到人数-请假人数计算出缺勤人数
                 statisticsVo.setAbsenteeismCount(statisticsVo.getAllCount() - statisticsVo.getLeaveCount() - statisticsVo.getActualCount());
                 BigDecimal divide = BigDecimal.valueOf(statisticsVo.getActualCount()).divide(BigDecimal.valueOf(statisticsVo.getAllCount()), 4, RoundingMode.HALF_UP);
-                statisticsVo.setAttendanceRate(divide.doubleValue());
+                statisticsVo.setAttendanceRate(divide.doubleValue() + "");
             }else{
-                statisticsVo.setAttendanceRate(0D);
+                statisticsVo.setAttendanceRate("0");
                 statisticsVo.setAbsenteeismCount(0L);
             }
 

+ 3 - 3
src/main/java/com/xjrsoft/module/attendance/controller/StudentStatisticsController.java

@@ -151,7 +151,7 @@ public class StudentStatisticsController {
                 if(record.getStudentCount() != null && record.getStudentCount() != 0){
                     divide = BigDecimal.valueOf(record.getActualCount()).divide(BigDecimal.valueOf(record.getStudentCount()), 4, RoundingMode.HALF_UP);
                 }
-                record.setAttendanceRate(divide.doubleValue());
+                record.setAttendanceRate(divide.doubleValue() + "");
             }
         }
         PageOutput<ClassStatisticsVo> pageOutput = ConventPage.getPageOutput(attendancePage, ClassStatisticsVo.class);
@@ -302,7 +302,7 @@ public class StudentStatisticsController {
                 if(record.getStudentCount() != null && record.getStudentCount() != 0){
                     divide = BigDecimal.valueOf(record.getActualCount()).divide(BigDecimal.valueOf(record.getStudentCount()), 4, RoundingMode.HALF_UP);
                 }
-                record.setAttendanceRate(divide.doubleValue());
+                record.setAttendanceRate(divide.doubleValue() + "");
             }
         }
         PageOutput<ClassStatisticsVo> pageOutput = ConventPage.getPageOutput(attendancePage, ClassStatisticsVo.class);
@@ -376,7 +376,7 @@ public class StudentStatisticsController {
 
                 //计算出勤率
                 BigDecimal divide = BigDecimal.valueOf(record.getActualCount()).divide(BigDecimal.valueOf(record.getStudentCount()), 4, RoundingMode.HALF_UP);
-                record.setAttendanceRate(divide.doubleValue());
+                record.setAttendanceRate(divide.doubleValue() + "");
             }
         }
         PageOutput<ClassStatisticsVo> pageOutput = ConventPage.getPageOutput(attendancePage, ClassStatisticsVo.class);

+ 1 - 1
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceRuleDetails.java

@@ -227,7 +227,7 @@ public class AttendanceRuleDetails implements Serializable {
     private Time returnEndTime;
 
     @ApiModelProperty("节假日迟到旷课时间")
-    private Time holidaysLateMinutes;
+    private Integer holidaysLateMinutes;
 
     @ApiModelProperty("为节假日前一天时放学时间")
     private Time holidaysEndTime;

+ 1 - 1
src/main/java/com/xjrsoft/module/attendance/vo/ClassStatisticsVo.java

@@ -46,7 +46,7 @@ public class ClassStatisticsVo {
     private Integer absenteeismCount;
 
     @ApiModelProperty("出勤率")
-    private Double attendanceRate;
+    private String attendanceRate;
 
     @ApiModelProperty("应该离校人数")
     private Integer ygLeaveSchoolCount;

+ 1 - 1
src/main/java/com/xjrsoft/module/attendance/vo/StudentStatisticsVo.java

@@ -36,6 +36,6 @@ public class StudentStatisticsVo {
     private Long absenteeismCount;
 
     @ApiModelProperty("出勤率")
-    private Double attendanceRate;
+    private String attendanceRate;
 
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/attendance/vo/TeacherStatisticsVo.java

@@ -36,7 +36,7 @@ public class TeacherStatisticsVo {
     private Long absenteeismCount;
 
     @ApiModelProperty("出勤率")
-    private Double attendanceRate;
+    private String attendanceRate;
 
     @ApiModelProperty("旷课人数")
     private Integer playTruantCount;

+ 57 - 3
src/main/java/com/xjrsoft/module/job/AttenDanceWarnNoticeTask.java

@@ -4,6 +4,7 @@ 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;
@@ -25,11 +26,14 @@ 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;
 
 /**
  * 考勤预警通知,提醒教师和学生是否该上课等
@@ -101,10 +105,27 @@ public class AttenDanceWarnNoticeTask {
             log.info("未能查询出规则,不进行推送");
             return;
         }
+
+        //获取最近的时间
+        LocalDateTime recentlyTime = getRecentlyTime(ruleDetailsList, now);
+        if(!recentlyTime.isEqual(now)){
+            log.info("未到时间,不进行推送");
+            return;
+        }
         String wechatTemplate = weChatUtil.getAttenDanceWarnTemplate();
+        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;
+        }
+
         WechatMessageLog messageLog = new WechatMessageLog();
         messageLog.setTemplateId(wechatTemplate);
-//        messageLog.setSendTime(recentlyTime);
+        messageLog.setSendTime(recentlyTime);
 
         List<XjrUser> userList = getUserList(allTodyRule.keySet());
         for (XjrUser xjrUser : userList) {
@@ -113,9 +134,10 @@ public class AttenDanceWarnNoticeTask {
             if(status == 0){
                 continue;
             }
+            //查询这个用户最新的考勤状态
             AttendanceUserRelation userRelation = allUserStatus.get(xjrUser.getId());
-            if(userRelation.getAttendanceTime().toLocalDate().isEqual(now.toLocalDate())){
-
+            if(userRelation.getAttendanceTime().toLocalDate().isEqual(now.toLocalDate()) && "到校".equals(userRelation.getAttendanceStatus())){
+                continue;
             }
 
             WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
@@ -215,6 +237,38 @@ public class AttenDanceWarnNoticeTask {
         );
     }
 
+    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);
+                }
+                if(ruleDetail.getPmStartTime() != null){
+                    LocalDateTime pmStartTime = now.with(ruleDetail.getPmStartTime().toLocalTime());
+                    result.add(pmStartTime);
+                }
 
+                if(ruleDetail.getEveningStartTime() != null){
+                    LocalDateTime eveningStartTime = now.with(ruleDetail.getEveningStartTime().toLocalTime());
+                    result.add(eveningStartTime);
+                }
+            }
+        }
+        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));
+    }
 
 }