Browse Source

考勤历史

dzx 1 year ago
parent
commit
575269196e

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

@@ -13,21 +13,17 @@ import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
 import com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo;
 import com.xjrsoft.module.attendance.vo.ClassStatisticsVo;
 import com.xjrsoft.module.attendance.vo.StudentStatisticsPageVo;
-import com.xjrsoft.module.attendance.vo.VisitorInfoVo;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.outint.entity.StudentOutInRecord;
 import com.xjrsoft.module.outint.service.IStudentOutInRecordService;
-import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
 import com.xjrsoft.module.outint.vo.StudentOutInRecordVo;
-import com.xjrsoft.module.personnel.service.IReservationSchoolService;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.StudentLeave;
 import com.xjrsoft.module.student.service.IStudentLeaveService;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
-import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -42,6 +38,7 @@ import java.time.DayOfWeek;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -62,18 +59,15 @@ public class StudentStatisticsController {
 
 
     private final IUserService xjrUserService;
-    private final ITeacherOutInRecordService teacherOutInRecordService;
     private final IStudentOutInRecordService studentOutInRecordService;
     private final IAttendanceRuleCategoryService ruleCategoryService;
-    private final IWfTeacherleaveService wfTeacherleaveService;
     private final IStudentLeaveService studentLeaveService;
-    private final IReservationSchoolService reservationSchoolService;
     private final IBaseClassService classService;
 
     @GetMapping(value = "/class-statistics")
     @ApiOperation(value="班级考勤统计")
     @SaCheckPermission("statistics:detail")
-    public RT<PageOutput<ClassStatisticsVo>> teacherStatistics(@Valid AttendanceStatisticDto dto){
+    public RT<PageOutput<ClassStatisticsVo>> classStatistics(@Valid AttendanceStatisticDto dto){
         Page<ClassStatisticsVo> attendancePage = classService.getAttendancePage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         List<Long> classIds = new ArrayList<>();
         for (ClassStatisticsVo record : attendancePage.getRecords()) {
@@ -221,12 +215,77 @@ public class StudentStatisticsController {
     }
 
 
-    @GetMapping(value = "/visitor-list")
-    @ApiOperation(value="访客列表")
+    @GetMapping(value = "/class-history")
+    @ApiOperation(value="历史考勤")
     @SaCheckPermission("statistics:detail")
-    public RT<List<VisitorInfoVo>> visitorList(@Valid AttendanceStatisticDto dto){
-        List<VisitorInfoVo> visionList = reservationSchoolService.getVisionList(dto.getDate());
-        return RT.ok(visionList);
+    public RT<PageOutput<ClassStatisticsVo>> classHistory(@Valid AttendanceStatisticDto dto){
+        Page<ClassStatisticsVo> attendancePage = classService.getAttendancePage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        List<Long> classIds = new ArrayList<>();
+        for (ClassStatisticsVo record : attendancePage.getRecords()) {
+            classIds.add(record.getId());
+        }
+        if(dto.getStartTime() != null && !"".equals(dto.getStartTime()) && dto.getEndTime() != null && !"".equals(dto.getEndTime())){
+            DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
+            LocalDateTime startTime = LocalDate.parse(dto.getStartTime(), formatter).atTime(0, 0, 0);
+            LocalDateTime endTime = LocalDate.parse(dto.getEndTime(), formatter).atTime(23, 59, 59);
+
+            //查询每个班的走读生实到人数
+            Map<Long, List<StudentOutInRecordVo>> notStayMap = studentOutInRecordService.getNotStayList(startTime, endTime, classIds);
+            //查询住校生的实到情况
+            Map<Long, List<StudentOutInRecordVo>> stayMap = studentOutInRecordService.getStayList(startTime, endTime, classIds);
+
+            //查询各班的请假人数
+            Map<Long, Integer> classLeaveCount = studentLeaveService.getClassLeaveCount(startTime, endTime);
+
+            //计算2个时间相差的天数
+            long days = ChronoUnit.DAYS.between(startTime.toLocalDate(), endTime.toLocalDate());
+            List<String> dayOfWeeks = new ArrayList<>();
+            for (int i = 0; i <= days; i ++){
+                dayOfWeeks.add(startTime.plusDays(i).getDayOfWeek().name());
+            }
+
+            //查询走读生的考勤规则
+            Map<String, Map<Long, AttendanceRuleDetailsUserVo>> notStayTodyRule = ruleCategoryService.getAllStudentTodyRule(dayOfWeeks);
+            //查询住校生生的考勤规则
+            Map<String, Map<Long, AttendanceRuleDetailsUserVo>> staySundayRule = ruleCategoryService.getAllStudentTodyRule(dayOfWeeks);
+
+            for (ClassStatisticsVo record: attendancePage.getRecords()) {
+                record.setLeaveCount(classLeaveCount.get(record.getId()) == null ? 0:classLeaveCount.get(record.getId()));
+                record.setActualCount(notStayMap.get(record.getId()).size() + stayMap.get(record.getId()).size());
+                record.setStudentCount(record.getStudentCount() * dayOfWeeks.size());
+
+                Integer lateCount = 0;
+                for (String dayOfWeek : dayOfWeeks) {
+                    for (StudentOutInRecordVo outInRecord : notStayMap.get(record.getId())) {
+                        AttendanceRuleDetailsUserVo ruleDetails = notStayTodyRule.get(dayOfWeek).get(outInRecord.getUserId());
+                        if(dto.getTimePeriod() == 1 && outInRecord.getRecordTime().toLocalTime().compareTo(ruleDetails.getAmStartTime()) > 0){
+                            lateCount ++;
+                        }else if(dto.getTimePeriod() == 2 && outInRecord.getRecordTime().toLocalTime().compareTo(ruleDetails.getPmStartTime()) > 0){
+                            lateCount ++;
+                        }
+                    }
+                    for (StudentOutInRecordVo outInRecord : stayMap.get(record.getId())) {
+                        AttendanceRuleDetailsUserVo ruleDetails = staySundayRule.get(dayOfWeek).get(outInRecord.getUserId());
+                        if(dto.getTimePeriod() == 1 && outInRecord.getRecordTime().toLocalTime().compareTo(ruleDetails.getAmStartTime()) > 0){
+                            lateCount ++;
+                        }else if(dto.getTimePeriod() == 2 && outInRecord.getRecordTime().toLocalTime().compareTo(ruleDetails.getPmStartTime()) > 0){
+                            lateCount ++;
+                        }
+                    }
+                }
+
+                record.setLateCount(lateCount);
+
+                //最后通过总人数-实到人数-请假人数计算出缺勤人数
+                record.setAbsenteeismCount(record.getStudentCount() - record.getLeaveCount() - record.getActualCount());
+
+                //计算出勤率
+                BigDecimal divide = BigDecimal.valueOf(record.getActualCount()).divide(BigDecimal.valueOf(record.getStudentCount()), 2, RoundingMode.HALF_UP);
+                record.setAttendanceRate(divide.doubleValue());
+            }
+        }
+        PageOutput<ClassStatisticsVo> pageOutput = ConventPage.getPageOutput(attendancePage, ClassStatisticsVo.class);
+        return RT.ok(pageOutput);
     }
 
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/attendance/controller/TeacherStatisticsController.java

@@ -55,7 +55,7 @@ public class TeacherStatisticsController {
 
 
     @GetMapping(value = "/teacher-details")
-    @ApiOperation(value="学生考勤")
+    @ApiOperation(value="教师考勤")
     @SaCheckPermission("statistics:detail")
     public RT<PageOutput<TeacherStatisticsPageVo>> studentDetails(@Valid AttendanceStatisticDto dto){
         MPJLambdaWrapper<User> queryUser = new MPJLambdaWrapper<>();

+ 6 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AttendanceStatisticDto.java

@@ -16,4 +16,10 @@ public class AttendanceStatisticDto extends PageInput {
 
     @ApiModelProperty("查询时间")
     private String date;
+
+    @ApiModelProperty("查询开始时间")
+    private String startTime;
+
+    @ApiModelProperty("查询结束时间")
+    private String endTime;
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/attendance/service/IAttendanceRuleCategoryService.java

@@ -49,4 +49,10 @@ public interface IAttendanceRuleCategoryService extends MPJBaseService<Attendanc
     Map<Long, AttendanceRuleDetailsUserVo> getAllTeacherTodyRule(String dayOfWeek);
 
     Map<Long, AttendanceRuleDetailsUserVo> getAllStudentTodyRule(String dayOfWeek);
+
+
+    Map<String, Map<Long, AttendanceRuleDetailsUserVo>> getAllTeacherTodyRule(List<String> dayOfWeek);
+
+    Map<String, Map<Long, AttendanceRuleDetailsUserVo>> getAllStudentTodyRule(List<String> dayOfWeek);
+
 }

+ 31 - 0
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceRuleCategoryServiceImpl.java

@@ -445,4 +445,35 @@ public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<Attend
 
         return result;
     }
+
+    @Override
+    public Map<String, Map<Long, AttendanceRuleDetailsUserVo>> getAllTeacherTodyRule(List<String> dayOfWeek) {
+
+        Map<String, Map<Long, AttendanceRuleDetailsUserVo>> result = new HashMap<>();
+        for (String s : dayOfWeek) {
+            List<AttendanceRuleDetailsUserVo> teacherTodyRule = detailsMapper.getAllTeacherTodyRule(s);
+            Map<Long, AttendanceRuleDetailsUserVo> dataMap = new HashMap<>();
+            for (AttendanceRuleDetailsUserVo userVo : teacherTodyRule) {
+                dataMap.put(userVo.getUserId(), userVo);
+            }
+            result.put(s, dataMap);
+        }
+
+        return result;
+    }
+
+    @Override
+    public Map<String, Map<Long, AttendanceRuleDetailsUserVo>> getAllStudentTodyRule(List<String> dayOfWeek) {
+        Map<String, Map<Long, AttendanceRuleDetailsUserVo>> result = new HashMap<>();
+        for (String s : dayOfWeek) {
+            List<AttendanceRuleDetailsUserVo> teacherTodyRule = detailsMapper.getAllStudentTodyRule(s);
+            Map<Long, AttendanceRuleDetailsUserVo> dataMap = new HashMap<>();
+            for (AttendanceRuleDetailsUserVo userVo : teacherTodyRule) {
+                dataMap.put(userVo.getUserId(), userVo);
+            }
+            result.put(s, dataMap);
+        }
+
+        return result;
+    }
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/outint/vo/StudentOutInRecordVo.java

@@ -43,7 +43,7 @@ public class StudentOutInRecordVo {
     * 人脸照片
     */
     @ApiModelProperty("人脸照片")
-    private Long facePhoto;
+    private String facePhoto;
     /**
     * 进出状态(0:进 1:出)
     */

+ 4 - 4
src/main/resources/mapper/outin/StudentOutInRecordMapper.xml

@@ -7,7 +7,7 @@
         SELECT t1.class_id AS id,COUNT(t1.user_id) FROM student_out_in_record t1
         INNER JOIN base_student_school_roll t2 ON t1.user_id = t2.user_id
         WHERE t1.delete_mark = 0 AND t1.status = 0 AND t2.delete_mark = 0
-        AND t1.stduy_status = 'FB3002'
+        AND t2.stduy_status = 'FB3002'
         AND t1.record_time BETWEEN #{startTime} AND #{endTime}
         GROUP BY t1.class_id
     </select>
@@ -15,7 +15,7 @@
         SELECT t1.class_id AS id,COUNT(t1.user_id) FROM student_out_in_record t1
         INNER JOIN base_student_school_roll t2 ON t1.user_id = t2.user_id
         WHERE t1.delete_mark = 0 AND t1.status = 0 AND t2.delete_mark = 0
-        AND t1.stduy_status = 'FB3001'
+        AND t2.stduy_status = 'FB3001'
         AND t1.record_time BETWEEN #{startTime} AND #{endTime}
         GROUP BY t1.class_id
     </select>
@@ -24,14 +24,14 @@
         SELECT t1.* FROM student_out_in_record t1
         INNER JOIN base_student_school_roll t2 ON t1.user_id = t2.user_id
         WHERE t1.delete_mark = 0 AND t1.status = 0 AND t2.delete_mark = 0
-        AND t1.stduy_status = 'FB3002'
+        AND t2.stduy_status = 'FB3002'
         AND t1.record_time BETWEEN #{startTime} AND #{endTime}
     </select>
     <select id="getStayList" resultType="com.xjrsoft.module.outint.vo.StudentOutInRecordVo">
         SELECT t1.* FROM student_out_in_record t1
         INNER JOIN base_student_school_roll t2 ON t1.user_id = t2.user_id
         WHERE t1.delete_mark = 0 AND t1.status = 0 AND t2.delete_mark = 0
-        AND t1.stduy_status = 'FB3001'
+        AND t2.stduy_status = 'FB3001'
         AND t1.record_time BETWEEN #{startTime} AND #{endTime}
     </select>
 </mapper>

+ 3 - 3
src/main/resources/mapper/student/StudentLeaveMapper.xml

@@ -5,7 +5,7 @@
 <mapper namespace="com.xjrsoft.module.student.mapper.StudentLeaveMapper">
     <select id="getLeaveCount" resultType="java.lang.Long">
         SELECT COUNT(*) FROM student_leave t1
-        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        INNER JOIN xjr_user t2 ON t1.student_user_id = t2.id
         WHERE t1.status = 1 AND t2.delete_mark = 0
         AND (
         (start_date BETWEEN #{startTime} and #{endTime})
@@ -16,7 +16,7 @@
     </select>
     <select id="getClassLeaveCount" resultType="com.xjrsoft.module.outint.vo.IdCountVo">
         SELECT t1.class_id as id, COUNT(*) FROM student_leave t1
-        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        INNER JOIN xjr_user t2 ON t1.student_user_id = t2.id
         WHERE t1.status = 1 AND t2.delete_mark = 0
         AND (
         (start_date BETWEEN #{startTime} and #{endTime})
@@ -27,7 +27,7 @@
     </select>
     <select id="getLeaveList" resultType="com.xjrsoft.module.student.entity.StudentLeave">
         SELECT t1.* FROM student_leave t1
-        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        INNER JOIN xjr_user t2 ON t1.student_user_id = t2.id
         WHERE t1.status = 1 AND t2.delete_mark = 0
         AND (
         (start_date BETWEEN #{startTime} and #{endTime})