Browse Source

教师考勤查询

dzx 4 months ago
parent
commit
2b73f19fb3

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

@@ -85,13 +85,17 @@ public class StatisticsController {
         Long lateCount = 0L;
         Long leaveCount = 0L;
         Long absenteeismCount = 0L;
+        Integer dividendCount = 0;
         for (TeacherStatisticsPageVo recordVo : list) {
             if("迟到".equals(recordVo.getStatus())){
                 lateCount ++;
+                dividendCount ++;
             }else if("请假".equals(recordVo.getStatus())){
                 leaveCount ++;
+                dividendCount ++;
             }else if("缺勤".equals(recordVo.getStatus())){
                 absenteeismCount ++;
+                dividendCount ++;
             }
             if(recordVo.getRecordTime() != null){
                 actualCount ++;
@@ -102,13 +106,10 @@ public class StatisticsController {
         statisticsVo.setLeaveCount(leaveCount);
         statisticsVo.setAbsenteeismCount(absenteeismCount);
 
-        //最后通过总人数-实到人数-请假人数计算出缺勤人数
-        statisticsVo.setAbsenteeismCount(statisticsVo.getAllCount() - statisticsVo.getLeaveCount() - statisticsVo.getActualCount());
-
         //计算出勤率
         BigDecimal divide = BigDecimal.ZERO;
         if(statisticsVo.getAllCount() != null && statisticsVo.getAllCount() != 0){
-            divide = BigDecimal.valueOf(statisticsVo.getActualCount()).divide(BigDecimal.valueOf(statisticsVo.getAllCount()), 4, RoundingMode.HALF_UP);
+            divide = BigDecimal.valueOf(statisticsVo.getActualCount()).divide(BigDecimal.valueOf(dividendCount), 4, RoundingMode.HALF_UP);
         }
         statisticsVo.setAttendanceRate(divide.doubleValue() + "");
 

+ 132 - 122
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java

@@ -10,6 +10,7 @@ import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AddAttendanceStatisticsDto;
@@ -30,6 +31,7 @@ import com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.vo.UserIdDeptNameVo;
+import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import lombok.AllArgsConstructor;
 import me.zhyd.oauth.log.Log;
 import org.apache.poi.ss.usermodel.Cell;
@@ -159,126 +161,7 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
     @Transactional(rollbackFor = Exception.class)
     public Boolean refreshRecord(Long id) {
         try {
-            //1、修改状态为统计中
-            AttendanceStatistics statistics = this.getById(id);
-            statistics.setStatus(0);
-            statistics.setModifyDate(new Date());
-            this.updateById(statistics);
-
-            //2、删除以前的数据
-            statisticsRecordService.remove(
-                    new QueryWrapper<AttendanceStatisticsRecord>().lambda()
-                            .eq(AttendanceStatisticsRecord::getAttendanceStatisticsId, id)
-            );
-
-            /**
-             * 3、重新计算数据并入库
-             */
-            //3.1、根据考勤规则和统计的时间段查询这个规则下面所涉及到的老师
-            List<User> userList = userService.list(
-                    new MPJLambdaWrapper<User>()
-                            .select(User::getId)
-                            .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
-                            .innerJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, User::getId)
-                            .eq(AttendanceUserRelation::getAttendanceRuleCategoryId, statistics.getAttendanceRuleCategoryId())
-            );
-            if(userList.isEmpty()){
-               throw new MyException("该规则下无考勤人员");
-            }
-            List<Long> userIds = userList.stream().map(User::getId).collect(Collectors.toList());
-
-            //查询固化的考勤数据
-            List<TeacherAttendanceRecord> attendanceRecords = recordService.list(
-                    new QueryWrapper<TeacherAttendanceRecord>().lambda()
-                            .eq(TeacherAttendanceRecord::getTimeInterval, statistics.getTimePeriod())
-                            .in(TeacherAttendanceRecord::getUserId, userIds)
-                            .between(TeacherAttendanceRecord::getCreateDate, statistics.getStartDate(), statistics.getEndDate())
-            );
-
-            //3.2、准备相关需要的数据
-            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
-            DateTimeFormatter timeDtf = DateTimeFormatter.ofPattern("HH:mm");
-            Map<String, String> weekCnMap = initWeekCn();
-            Map<String, String> weekEnMap = initWeekEn();
-            List<UserIdDeptNameVo> teacherDeptName = userService.getTeacherDeptName();
-            Map<Long, UserIdDeptNameVo> userDeptMap = teacherDeptName.stream().collect(Collectors.toMap(UserIdDeptNameVo::getId, x -> x));
-
-            //3.3、查询这个考勤规则下面的所有细则并转换成map
-            List<AttendanceRuleDetails> ruleList = ruleCategoryService.getRules(statistics.getAttendanceRuleCategoryId());
-            Map<String, AttendanceRuleDetails> ruleMap = ruleList.stream().collect(Collectors.toMap(AttendanceRuleDetails::getDateType, x -> x));
-
-            //3.4、计算出所有的天数
-            List<LocalDate> dateList = getDatesBetween(statistics.getStartDate(), statistics.getEndDate(), ruleMap, weekEnMap);
-
-            //3.5、循环计算,并存入insertList,方便后续批量入库
-            List<AttendanceStatisticsRecord> insertList = new ArrayList<>();
-            for (User user : userList) {
-                AttendanceStatisticsRecord record = new AttendanceStatisticsRecord();
-                record.setUserId(user.getId());
-                Long normalCount = 0L;
-                Long leaveCount = 0L;
-                Long absenteeCount = 0L;
-                JsonArray daysData = new JsonArray();
-                int sortCode = 1;
-                for (LocalDate localDate : dateList) {
-                    String dayOfWeekName = localDate.getDayOfWeek().name();
-                    AttendanceRuleDetails ruleDetails = ruleMap.get(weekEnMap.get(dayOfWeekName));
-                    if(ruleDetails != null && (ruleDetails.getIsAttendance() == null || ruleDetails.getIsAttendance() == 0)){
-                        continue;
-                    }
-                    JsonObject daysJson = new JsonObject();
-                    daysJson.addProperty("date", localDate.format(dtf));
-                    daysJson.addProperty("week", weekCnMap.get(dayOfWeekName));
-                    String content = "";
-                    if(statistics.getTimePeriod() == 1){
-                        content += "(" + ruleDetails.getAmStartTime().toLocalTime().format(timeDtf) + ")上班 ";
-                    }else if(statistics.getTimePeriod() == 2){
-                        content += "(" + ruleDetails.getPmStartTime().toLocalTime().format(timeDtf) + ")上班 ";
-                    }
-                    List<TeacherAttendanceRecord> collect = attendanceRecords.stream().filter(el -> el.getRecordTime().toLocalDate().equals(localDate)).collect(Collectors.toList());
-                    for (TeacherAttendanceRecord attendanceRecord : collect) {
-                        if("到校".equals(attendanceRecord.getAttendanceStatus())){
-                            normalCount ++;
-                            content += "正常(" + attendanceRecord.getRecordTime().toLocalTime().format(timeDtf) + ")";
-                        }else if("请假".equals(attendanceRecord.getAttendanceStatus())){
-                            leaveCount ++;
-                            content += "请假";
-                        }else if("不考勤".equals(attendanceRecord.getAttendanceStatus())){
-
-                        }else{
-                            absenteeCount ++;
-                            content += "缺勤";
-                        }
-                    }
-                    daysJson.addProperty("content", content);
-                    daysJson.addProperty("sortCode", sortCode);
-                    daysData.add(daysJson);
-                    sortCode ++;
-                }
-                record.setNormalCount(normalCount);
-                record.setLeaveCount(leaveCount);
-                record.setAbsenteeCount(absenteeCount);
-                record.setDaysData(daysData.toString());
-                UserIdDeptNameVo deptNameVo = userDeptMap.get(record.getUserId());
-                if(deptNameVo != null){
-                    record.setDeptIds(deptNameVo.getDeptIds());
-                    record.setDeptName(deptNameVo.getDeptName());
-                }
 
-                insertList.add(record);
-            }
-
-            //3.6、插入数据
-            if(!insertList.isEmpty()){
-                statisticsRecordService.saveBatch(insertList);
-            }
-
-            //4、将状态改为统计完成
-            statistics = this.getById(id);
-            statistics.setStatus(1);
-            statistics.setModifyDate(new Date());
-            statistics.setAttendanceDays(dateList.size());
-            this.updateById(statistics);
         }catch (Exception e){
             Log.error(e.getMessage(), e);
             if(e.getClass().equals(MyException.class)){
@@ -288,6 +171,133 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
             }
         }
 
+        //1、修改状态为统计中
+        AttendanceStatistics statistics = this.getById(id);
+        statistics.setStatus(0);
+        statistics.setModifyDate(new Date());
+        this.updateById(statistics);
+
+        //2、删除以前的数据
+        statisticsRecordService.remove(
+                new QueryWrapper<AttendanceStatisticsRecord>().lambda()
+                        .eq(AttendanceStatisticsRecord::getAttendanceStatisticsId, id)
+        );
+
+        /**
+         * 3、重新计算数据并入库
+         */
+        //3.1、根据考勤规则和统计的时间段查询这个规则下面所涉及到的老师
+        List<User> userList = userService.list(
+                new MPJLambdaWrapper<User>()
+                        .select(User::getId)
+                        .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
+                        .innerJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, User::getId)
+                        .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
+                        .eq(AttendanceUserRelation::getAttendanceRuleCategoryId, statistics.getAttendanceRuleCategoryId())
+                        .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        if(userList.isEmpty()){
+            throw new MyException("该规则下无考勤人员");
+        }
+        List<Long> userIds = userList.stream().map(User::getId).collect(Collectors.toList());
+
+        //查询固化的考勤数据
+        List<TeacherAttendanceRecord> attendanceRecords = recordService.list(
+                new QueryWrapper<TeacherAttendanceRecord>().lambda()
+                        .eq(TeacherAttendanceRecord::getTimeInterval, statistics.getTimePeriod())
+                        .in(TeacherAttendanceRecord::getUserId, userIds)
+                        .between(TeacherAttendanceRecord::getAttendanceDate, statistics.getStartDate(), statistics.getEndDate())
+                        .eq(TeacherAttendanceRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        //3.2、准备相关需要的数据
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
+        DateTimeFormatter timeDtf = DateTimeFormatter.ofPattern("HH:mm");
+        Map<String, String> weekCnMap = initWeekCn();
+        Map<String, String> weekEnMap = initWeekEn();
+        List<UserIdDeptNameVo> teacherDeptName = userService.getTeacherDeptName();
+        Map<Long, UserIdDeptNameVo> userDeptMap = teacherDeptName.stream().collect(Collectors.toMap(UserIdDeptNameVo::getId, x -> x));
+
+        //3.3、查询这个考勤规则下面的所有细则并转换成map
+        List<AttendanceRuleDetails> ruleList = ruleCategoryService.getRules(statistics.getAttendanceRuleCategoryId());
+        Map<String, AttendanceRuleDetails> ruleMap = ruleList.stream().collect(Collectors.toMap(AttendanceRuleDetails::getDateType, x -> x));
+
+        //3.4、计算出所有的天数
+        List<LocalDate> dateList = getDatesBetween(statistics.getStartDate(), statistics.getEndDate(), ruleMap, weekEnMap);
+
+        //3.5、循环计算,并存入insertList,方便后续批量入库
+        List<AttendanceStatisticsRecord> insertList = new ArrayList<>();
+        for (User user : userList) {
+            AttendanceStatisticsRecord record = new AttendanceStatisticsRecord();
+            record.setUserId(user.getId());
+            record.setAttendanceStatisticsId(statistics.getId());
+            Long normalCount = 0L;
+            Long leaveCount = 0L;
+            Long absenteeCount = 0L;
+            JsonArray daysData = new JsonArray();
+            int sortCode = 1;
+            for (LocalDate localDate : dateList) {
+                String dayOfWeekName = localDate.getDayOfWeek().name();
+                AttendanceRuleDetails ruleDetails = ruleMap.get(weekEnMap.get(dayOfWeekName));
+                if(ruleDetails != null && (ruleDetails.getIsAttendance() == null || ruleDetails.getIsAttendance() == 0)){
+                    continue;
+                }
+                JsonObject daysJson = new JsonObject();
+                daysJson.addProperty("date", localDate.format(dtf));
+                daysJson.addProperty("week", weekCnMap.get(dayOfWeekName));
+                String content = "";
+                if(statistics.getTimePeriod() == 1){
+                    content += "(" + ruleDetails.getAmStartTime().toLocalTime().format(timeDtf) + ")上班 ";
+                }else if(statistics.getTimePeriod() == 2){
+                    content += "(" + ruleDetails.getPmStartTime().toLocalTime().format(timeDtf) + ")上班 ";
+                }
+                List<TeacherAttendanceRecord> collect = attendanceRecords.stream()
+                        .filter(el -> el.getAttendanceDate().equals(localDate) && el.getUserId().equals(user.getId())
+                                && !"不考勤".equals(el.getAttendanceStatus())
+                        )
+                        .collect(Collectors.toList());
+                for (TeacherAttendanceRecord attendanceRecord : collect) {
+                    if("到校".equals(attendanceRecord.getAttendanceStatus())){
+                        normalCount ++;
+                        content += "正常(" + attendanceRecord.getRecordTime().toLocalTime().format(timeDtf) + ")";
+                    }else if("请假".equals(attendanceRecord.getAttendanceStatus())){
+                        leaveCount ++;
+                        content += "请假";
+                    }else{
+                        absenteeCount ++;
+                        content += "缺勤";
+                    }
+                }
+                daysJson.addProperty("content", content);
+                daysJson.addProperty("sortCode", sortCode);
+                daysData.add(daysJson);
+                sortCode ++;
+            }
+            record.setNormalCount(normalCount);
+            record.setLeaveCount(leaveCount);
+            record.setAbsenteeCount(absenteeCount);
+            record.setDaysData(daysData.toString());
+            UserIdDeptNameVo deptNameVo = userDeptMap.get(record.getUserId());
+            if(deptNameVo != null){
+                record.setDeptIds(deptNameVo.getDeptIds());
+                record.setDeptName(deptNameVo.getDeptName());
+            }
+
+            insertList.add(record);
+        }
+
+        //3.6、插入数据
+        if(!insertList.isEmpty()){
+            statisticsRecordService.saveBatch(insertList);
+        }
+
+        //4、将状态改为统计完成
+        statistics = this.getById(id);
+        statistics.setStatus(1);
+        statistics.setModifyDate(new Date());
+        statistics.setAttendanceDays(dateList.size());
+        this.updateById(statistics);
+
         return true;
     }
 
@@ -396,11 +406,11 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
                 Font font = workbook.createFont();
                 font.setBold(false);// 设置为粗体
                 font.setFontName("宋体");
-                if(content.contains("缺勤")){
+                if(content != null && content.contains("缺勤")){
                     font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
-                }else if(content.contains("正常")){
+                }else if(content != null && content.contains("正常")){
                     font.setColor(IndexedColors.BLUE.getIndex()); // 设置字体颜色为蓝色
-                }else if(content.contains("请假")){
+                }else if(content != null && content.contains("请假")){
                     font.setColor(IndexedColors.YELLOW.getIndex()); // 设置字体颜色为黄色
                 }
                 font.setFontHeightInPoints((short)12);

+ 1 - 1
src/main/resources/mapper/attendance/AttendanceStatisticsMapper.xml

@@ -24,7 +24,7 @@
     </select>
 
     <select id="getRecordList" parameterType="com.xjrsoft.module.attendance.dto.AttendanceStatisticsRecordDto" resultType="com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo">
-        SELECT t1.id,t2.name,t2.user_name,t1.normal_count,t1.leave_count,t1.absentee_count,t1.dept_name FROM attendance_statistics_record t1
+        SELECT t1.id,t2.name,t2.user_name,t1.normal_count,t1.leave_count,t1.absentee_count,t1.dept_name,t1.days_data FROM attendance_statistics_record t1
         INNER JOIN xjr_user t2 ON t1.user_id = t2.id
         WHERE t1.delete_mark = 0 AND t1.attendance_statistics_id = #{dto.id}
         <if test="dto.name != null and dto.name != ''">

+ 1 - 0
src/test/java/com/xjrsoft/module/job/AttendanceRecordTaskTest.java

@@ -103,6 +103,7 @@ class AttendanceRecordTaskTest {
             record.setCreateDate(LocalDateTime.now());
             record.setUserId(user.getId());
             record.setTimeInterval(timePeriod);
+            record.setAttendanceDate(queryDate);
             AttendanceRuleDetailsUserVo detailsUserVo = teacherTodyRuleByUserId.get(user.getId());
             if(detailsUserVo == null){
                 record.setAttendanceStatus("不考勤");