Browse Source

教师考勤查询

dzx 4 months ago
parent
commit
3356a6e7f9

+ 133 - 145
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java

@@ -154,14 +154,140 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
      * 2、删除以前的数据
      * 3、重新计算数据并入库
      * 4、将状态改为统计完成
-     * @param id
-     * @return
      */
     @Override
     @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)
+                            .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.setPersonCount(insertList.size());
+            statistics.setAttendanceDays(dateList.size());
+            this.updateById(statistics);
 
+            return true;
         }catch (Exception e){
             Log.error(e.getMessage(), e);
             if(e.getClass().equals(MyException.class)){
@@ -170,135 +296,6 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
                 throw new MyException("刷新出错,请联系管理员");
             }
         }
-
-        //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;
     }
 
 
@@ -322,11 +319,11 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
         Map<String, String> result = new HashMap<>();
 
         result.put("MONDAY", "周一");
-        result.put("TUESDAY", "周");
-        result.put("WEDNESDAY", "周");
-        result.put("THURSDAY", "周");
-        result.put("FRIDAY", "周");
-        result.put("SATURDAY", "周");
+        result.put("TUESDAY", "周");
+        result.put("WEDNESDAY", "周");
+        result.put("THURSDAY", "周");
+        result.put("FRIDAY", "周");
+        result.put("SATURDAY", "周");
         result.put("SUNDAY", "周日");
 
         return result;
@@ -434,8 +431,6 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
 
     /**
      * 创建第一行表头
-     * @param workbook
-     * @param sheet
      * @param mergeCoulmn 合并后面多少列(不包含自己)
      */
     void createFirstTitle(Workbook workbook, Sheet sheet, int mergeCoulmn) {
@@ -465,9 +460,6 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
 
     /**
      * 生成第二行表头
-     * @param workbook
-     * @param sheet
-     * @param statistics
      * @param mergeCoulmn 合并后面多少列(不包含自己)
      */
     void createSecondTitle(Workbook workbook, Sheet sheet, AttendanceStatistics statistics, int mergeCoulmn) {
@@ -498,8 +490,6 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
     /**
      * 生成第三行表头
      * 表头:序号、姓名、工号、部门、正常考勤次数、请假次数、缺勤次数,后续周几
-     * @param workbook
-     * @param sheet
      * @param weekList 周几
      */
     void createThirdTitle(Workbook workbook, Sheet sheet, List<String> weekList) {
@@ -560,8 +550,6 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
 
     /**
      *
-     * @param workbook
-     * @param sheet
      * @param startColumn 开始列
      * @param dateList 2024年10月20日
      */

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

@@ -4,7 +4,7 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.xjrsoft.module.attendance.mapper.AttendanceStatisticsMapper">
     <select id="getPage" parameterType="com.xjrsoft.module.attendance.dto.AttendanceStatisticsPageDto" resultType="com.xjrsoft.module.attendance.vo.AttendanceStatisticsPageVo">
-        SELECT t1.id,t1.year,t1.month,t1.name,t1.start_date,t2.end_date,t2.name AS rule_name,
+        SELECT t1.id,t1.year,t1.month,t1.name,t1.start_date,t1.end_date,t2.name AS rule_name,
         t1.person_count,t1.attendance_days, t1.status,t1.is_need_refresh,t1.time_period FROM attendance_statistics t1
         LEFT JOIN attendance_rule_category t2 ON t1.attendance_rule_category_id = t2.id
         WHERE t1.delete_mark = 0