Browse Source

教职工考勤统计

dzx 1 year ago
parent
commit
e296770eb7

+ 115 - 0
src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java

@@ -0,0 +1,115 @@
+package com.xjrsoft.module.attendance.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.github.yulichang.toolkit.MPJWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
+import com.xjrsoft.module.attendance.service.IAttendanceMessageSetService;
+import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo;
+import com.xjrsoft.module.attendance.vo.TeacherStatisticsVo;
+import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.concat.service.IXjrUserService;
+import com.xjrsoft.module.organization.entity.UserDeptRelation;
+import com.xjrsoft.module.organization.service.IDepartmentService;
+import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
+import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
+import com.xjrsoft.module.teacher.entity.BaseTeacher;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+
+/**
+* @title: 考勤消息设置
+* @Author dzx
+* @Date: 2024-05-21
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/statistics")
+@Api(value = "/statistics" ,tags = "考勤统计")
+@AllArgsConstructor
+public class StatisticsController {
+
+
+    private final IAttendanceMessageSetService attendanceMessageSetService;
+    private final IBaseClassService classService;
+    private final IDepartmentService departmentService;
+    private final IXjrUserService xjrUserService;
+    private final ITeacherOutInRecordService teacherOutInRecordService;
+    private final IAttendanceRuleCategoryService ruleCategoryService;
+    private final IWfTeacherleaveService wfTeacherleaveService;
+    @GetMapping(value = "/teacher-statistics")
+    @ApiOperation(value="教职工考勤统计")
+    @SaCheckPermission("statistics:detail")
+    public RT<TeacherStatisticsVo> teacherStatistics(@Valid AttendanceStatisticDto dto){
+        TeacherStatisticsVo statisticsVo = new TeacherStatisticsVo();
+        //查询总人数
+        MPJLambdaWrapper<XjrUser> queryWrapper = MPJWrappers.<XjrUser>lambdaJoin()
+                .disableSubLogicDel()
+                .innerJoin(BaseTeacher.class,BaseTeacher::getUserId,XjrUser::getId)
+                .innerJoin(UserDeptRelation.class, UserDeptRelation::getUserId, XjrUser::getId);
+        long allCount = xjrUserService.count(queryWrapper);
+        statisticsVo.setAllCount(allCount);
+        if(dto.getDate() != null && !"".equals(dto.getDate())){
+            DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
+            LocalDate queryDate = LocalDate.parse(dto.getDate(), formatter);
+            LocalDateTime startTime, endTime;
+            if(dto.getTimePeriod() == 1){
+                startTime = queryDate.atTime(9, 0, 0);
+                endTime = queryDate.atTime(12, 0, 0);
+            }else if(dto.getTimePeriod() == 2){
+                startTime = queryDate.atTime(12, 0, 0);
+                endTime = queryDate.atTime(18, 0, 0);
+            }else{
+                startTime = queryDate.atTime(0, 0, 0);
+                endTime = queryDate.atTime(23, 59, 59);
+            }
+
+            List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.list(
+                    new QueryWrapper<TeacherOutInRecord>().lambda()
+                            .between(TeacherOutInRecord::getRecordTime, startTime, endTime)
+            );
+            //实到人数
+            statisticsVo.setActualCount(Long.valueOf(outInRecords.size()));
+
+            //查询教师请假人数
+            Long leaveCount = wfTeacherleaveService.getLeaveCount(startTime, endTime);
+            statisticsVo.setLeaveCount(leaveCount);
+
+            //查询每个人当天的考勤规则
+            Map<Long, AttendanceRuleDetailsUserVo> allTeacherTodyRule = ruleCategoryService.getAllTeacherTodyRule(queryDate.getDayOfWeek().name());
+            //通过考勤规则和实到人数信息,计算迟到的
+            Long lateCount = 0L;
+            for (TeacherOutInRecord outInRecord : outInRecords) {
+                AttendanceRuleDetailsUserVo ruleDetails = allTeacherTodyRule.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 ++;
+                }
+            }
+            statisticsVo.setLateCount(lateCount);
+
+            //最后通过总人数-实到人数-请假人数计算出缺勤人数
+            statisticsVo.setAbsenteeismCount(statisticsVo.getAllCount() - statisticsVo.getLeaveCount() - statisticsVo.getActualCount());
+        }
+
+        return RT.ok(statisticsVo);
+    }
+
+}

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

@@ -0,0 +1,18 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDate;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AttendanceStatisticDto {
+
+    @ApiModelProperty("时间段(1:上午 2:下午)")
+    private Integer timePeriod;
+
+    @ApiModelProperty("查询时间")
+    private String date;
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceRuleDetailsMapper.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.attendance.mapper;
 
 import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -16,4 +17,6 @@ import java.util.List;
 @Mapper
 public interface AttendanceRuleDetailsMapper extends MPJBaseMapper<AttendanceRuleDetails> {
     List<AttendanceRuleDetails> getTodayRules(@Param("dayOfWeek") String dayOfWeek);
+
+    List<AttendanceRuleDetailsUserVo> getAllTeacherTodyRule(@Param("dayOfWeek") String dayOfWeek);
 }

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

@@ -5,8 +5,10 @@ import com.xjrsoft.module.attendance.dto.AddAttendanceRuleCategoryDto;
 import com.xjrsoft.module.attendance.dto.UpdateAttendanceRuleCategoryDto;
 import com.xjrsoft.module.attendance.entity.AttendanceRuleCategory;
 import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo;
 
 import java.util.List;
+import java.util.Map;
 
 /**
 * @title: 考勤规则
@@ -41,4 +43,8 @@ public interface IAttendanceRuleCategoryService extends MPJBaseService<Attendanc
     Boolean delete(List<Long> ids);
 
     List<AttendanceRuleDetails> getTodayRules();
+
+    AttendanceRuleDetails getTodayRulesByParam(String dayOfWeek);
+
+    Map<Long, AttendanceRuleDetailsUserVo> getAllTeacherTodyRule(String dayOfWeek);
 }

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

@@ -19,6 +19,7 @@ import com.xjrsoft.module.attendance.mapper.AttendanceRuleCategoryMapper;
 import com.xjrsoft.module.attendance.mapper.AttendanceRuleDetailsMapper;
 import com.xjrsoft.module.attendance.mapper.AttendanceUserRelationMapper;
 import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo;
 import com.xjrsoft.module.concat.service.IXjrUserService;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.student.entity.BaseStudent;
@@ -34,7 +35,9 @@ import java.time.DayOfWeek;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
@@ -415,4 +418,20 @@ public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<Attend
         DayOfWeek dayOfWeek = now.getDayOfWeek();
         return detailsMapper.getTodayRules(dayOfWeek.name());
     }
+
+    @Override
+    public AttendanceRuleDetails getTodayRulesByParam(String dayOfWeek) {
+        return null;
+    }
+
+    @Override
+    public Map<Long, AttendanceRuleDetailsUserVo> getAllTeacherTodyRule(String dayOfWeek) {
+        List<AttendanceRuleDetailsUserVo> teacherTodyRule = detailsMapper.getAllTeacherTodyRule(dayOfWeek);
+        Map<Long, AttendanceRuleDetailsUserVo> result = new HashMap<>();
+        for (AttendanceRuleDetailsUserVo userVo : teacherTodyRule) {
+            result.put(userVo.getUserId(), userVo);
+        }
+
+        return result;
+    }
 }

+ 172 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceRuleDetailsUserVo.java

@@ -0,0 +1,172 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+
+/**
+* @title: 考勤规则细则表单出参
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+public class AttendanceRuleDetailsUserVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 
+    */
+    /**
+    * 周几(星期一~日或节假日)
+    */
+    @ApiModelProperty("周几(星期一~日或节假日)")
+    private String dateType;
+    /**
+    * 是否允许进出校
+    */
+    @ApiModelProperty("是否允许进出校")
+    private Integer isAllowInOutSchool;
+    /**
+    * 是否考勤
+    */
+    @ApiModelProperty("是否考勤")
+    private Integer isAttendance;
+    /**
+    * 上学时间前多少分钟进行提醒
+    */
+    @ApiModelProperty("上学时间前多少分钟进行提醒")
+    private Integer agoMinutes;
+    /**
+    * 超过上学时间多少分钟未打卡进行提醒
+    */
+    @ApiModelProperty("超过上学时间多少分钟未打卡进行提醒")
+    private Integer overMinutes;
+    /**
+    * 上学时间内是否允许进出
+    */
+    @ApiModelProperty("上学时间内是否允许进出")
+    private Integer isAllowInOutSchoolTime;
+    /**
+    * 上午是否启用(1:是 0:否)
+    */
+    @ApiModelProperty("上午是否启用(1:是 0:否)")
+    private Integer amStatus;
+    /**
+    * 上午上学时间
+    */
+    @ApiModelProperty("上午上学时间")
+    private LocalTime amStartTime;
+    /**
+    * 上午放学时间
+    */
+    @ApiModelProperty("上午放学时间")
+    private LocalTime amEndTime;
+    /**
+    * 上午迟到旷课分钟数
+    */
+    @ApiModelProperty("上午迟到旷课分钟数")
+    private Integer amLateMinutes;
+    /**
+    * 上午是否为节假日(1:是 0:否)
+    */
+    @ApiModelProperty("上午是否为节假日(1:是 0:否)")
+    private Integer amIsHolidays;
+    /**
+    * 上午为节假日前一天时上学时间
+    */
+    @ApiModelProperty("上午为节假日前一天时上学时间")
+    private LocalTime amHolidaysStartTime;
+    /**
+    * 上午为节假日前一天时放学时间
+    */
+    @ApiModelProperty("上午为节假日前一天时放学时间")
+    private LocalTime amHolidaysEndTime;
+    /**
+    * 下午是否启用(1:是 0:否)
+    */
+    @ApiModelProperty("下午是否启用(1:是 0:否)")
+    private Integer pmStatus;
+    /**
+    * 下午上学时间
+    */
+    @ApiModelProperty("下午上学时间")
+    private LocalTime pmStartTime;
+    /**
+    * 下午放学时间
+    */
+    @ApiModelProperty("下午放学时间")
+    private LocalTime pmEndTime;
+    /**
+    * 下午迟到旷课分钟数
+    */
+    @ApiModelProperty("下午迟到旷课分钟数")
+    private Integer pmLateMinutes;
+    /**
+    * 下午是否为节假日(1:是 0:否)
+    */
+    @ApiModelProperty("下午是否为节假日(1:是 0:否)")
+    private Integer pmIsHolidays;
+    /**
+    * 下午为节假日前一天时上学时间
+    */
+    @ApiModelProperty("下午为节假日前一天时上学时间")
+    private LocalTime pmHolidaysStartTime;
+    /**
+    * 下午为节假日前一天时放学时间
+    */
+    @ApiModelProperty("下午为节假日前一天时放学时间")
+    private LocalTime pmHolidaysEndTime;
+    /**
+    * 晚上是否启用(1:是 0:否)
+    */
+    @ApiModelProperty("晚上是否启用(1:是 0:否)")
+    private Integer eveningStatus;
+    /**
+    * 晚上上学时间
+    */
+    @ApiModelProperty("晚上上学时间")
+    private LocalTime eveningStartTime;
+    /**
+    * 晚上放学时间
+    */
+    @ApiModelProperty("晚上放学时间")
+    private LocalTime eveningEndTime;
+    /**
+    * 晚上迟到旷课分钟数
+    */
+    @ApiModelProperty("晚上迟到旷课分钟数")
+    private Integer eveningLateMinutes;
+    /**
+    * 晚上是否为节假日(1:是 0:否)
+    */
+    @ApiModelProperty("晚上是否为节假日(1:是 0:否)")
+    private Integer eveningIsHolidays;
+    /**
+    * 晚上为节假日前一天时上学时间
+    */
+    @ApiModelProperty("晚上为节假日前一天时上学时间")
+    private LocalTime eveningHolidaysStartTime;
+    /**
+    * 晚上为节假日前一天时放学时间
+    */
+    @ApiModelProperty("晚上为节假日前一天时放学时间")
+    private LocalTime eveningHolidaysEndTime;
+    /**
+    * 考勤规则(attendance_rule_category)
+    */
+    @ApiModelProperty("考勤规则(attendance_rule_category)")
+    private Long attendanceRuleCategoryId;
+
+    @ApiModelProperty("为节假日前一天时放学时间")
+    private LocalTime holidaysEndTime;
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+}

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

@@ -0,0 +1,40 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+
+/**
+* @title: 教职工统计
+* @Author dzx
+* @Date: 2024年5月24日
+* @Version 1.0
+*/
+@Data
+public class TeacherStatisticsVo {
+
+    @ApiModelProperty("总人数")
+    private Long allCount;
+    /**
+    * 实到人数
+    */
+    @ApiModelProperty("实到人数")
+    private Long actualCount;
+    /**
+    * 请假人数
+    */
+    @ApiModelProperty("请假人数")
+    private Long leaveCount;
+    /**
+    * 迟到人数
+    */
+    @ApiModelProperty("迟到人数")
+    private Long lateCount;
+    /**
+    * 上学时间前多少分钟进行提醒
+    */
+    @ApiModelProperty("缺勤人数")
+    private Long absenteeismCount;
+
+}

+ 2 - 1
src/main/java/com/xjrsoft/module/outint/entity/TeacherOutInRecord.java

@@ -10,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 import java.util.Date;
 
 
@@ -78,7 +79,7 @@ public class TeacherOutInRecord implements Serializable {
     * 记录时间
     */
     @ApiModelProperty("记录时间")
-    private String recordTime;
+    private LocalDateTime recordTime;
     /**
     * 人脸照片
     */

+ 4 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/WfTeacherleaveMapper.java

@@ -3,6 +3,9 @@ package com.xjrsoft.module.teacher.mapper;
 import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDateTime;
 
 /**
 * @title: 教职工请假流程
@@ -13,4 +16,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface WfTeacherleaveMapper extends MPJBaseMapper<WfTeacherleave> {
 
+    Long getLeaveCount(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/teacher/service/IWfTeacherleaveService.java

@@ -4,6 +4,8 @@ import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.personnel.entity.ReservationSchool;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 
+import java.time.LocalDateTime;
+
 /**
 * @title: 教职工请假流程
 * @Author szs
@@ -20,4 +22,6 @@ public interface IWfTeacherleaveService extends MPJBaseService<WfTeacherleave> {
      * @return
      */
     Boolean hikvisionLeave(Long id);
+
+    Long getLeaveCount(LocalDateTime startTime, LocalDateTime endTime);
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java

@@ -45,6 +45,7 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
 
     private final IWfHeadTeacherLeaveService wfHeadTeacherLeaveService;
     private final HikvisionDataMapper hikvisionDataMapper;
+    private final WfTeacherleaveMapper wfTeacherleaveMapper;
     @Override
     public Boolean dataHandle(Long dataId) {
         WfTeacherleave wfTeacherleave = this.getById(dataId);
@@ -183,6 +184,11 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
         return true;
     }
 
+    @Override
+    public Long getLeaveCount(LocalDateTime startTime, LocalDateTime endTime) {
+        return wfTeacherleaveMapper.getLeaveCount(startTime, endTime);
+    }
+
     JsonArray selectResource(ApiUtil apiUtil){
         String apiPath = "/api/irds/v2/resource/resourcesByParams";
         JsonObject jsonObject = new JsonObject();

+ 16 - 2
src/main/resources/mapper/attendance/AttendanceRuleDetailsMapper.xml

@@ -2,12 +2,26 @@
 <!DOCTYPE mapper
         PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.xjrsoft.module.attendance.mapper.AttendanceRuleCategoryMapper">
+<mapper namespace="com.xjrsoft.module.attendance.mapper.AttendanceRuleDetailsMapper">
     <select id="getTodayRules" resultType="com.xjrsoft.module.attendance.entity.AttendanceRuleDetails">
         SELECT t2.* FROM attendance_rule_category t1
         INNER JOIN attendance_rule_details t2 ON t1.id = t2.attendance_rule_category_id
         WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND NOW() BETWEEN start_date AND end_date
         AND t2.date_type = #{dayOfWeek}
     </select>
-
+    <select id="getAllTeacherTodyRule" resultType="com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo">
+        SELECT t2.*,t5.user_id FROM attendance_rule_category t1
+        INNER JOIN attendance_rule_details t2 ON t1.id = t2.attendance_rule_category_id
+        INNER JOIN attendance_user_relation t3 ON t1.id = t3.attendance_rule_category_id
+        INNER JOIN xjr_user t4 ON t3.user_id = t4.id
+        INNER JOIN base_teacher t5 ON t4.id = t5.user_id
+        WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND NOW() BETWEEN start_date AND end_date
+        AND t2.date_type = #{dayOfWeek}
+    </select>
+    <select id="getAllStudentTodyRule" resultType="com.xjrsoft.module.attendance.entity.AttendanceRuleDetails">
+        SELECT t2.* FROM attendance_rule_category t1
+                             INNER JOIN attendance_rule_details t2 ON t1.id = t2.attendance_rule_category_id
+        WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND NOW() BETWEEN start_date AND end_date
+          AND t2.date_type = #{dayOfWeek}
+    </select>
 </mapper>

+ 17 - 0
src/main/resources/mapper/teacher/WfTeacherleaveMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xjrsoft.module.teacher.mapper.WfTeacherleaveMapper">
+    <select id="getLeaveCount" resultType="java.lang.Long">
+        SELECT COUNT(*) FROM wf_teacherleave t1
+        INNER JOIN xjr_user t2 ON t1.user_id = t2.id
+        WHERE t1.status = 1 AND t2.delete_mark = 0
+        AND (
+        (leave_start_time BETWEEN #{startTime} and #{endTime})
+        OR (leave_end_time BETWEEN #{startTime} and #{endTime})
+        OR (leave_end_time > #{startTime} and #{endTime} > leave_end_time)
+        OR (#{startTime} > leave_end_time and leave_end_time > #{endTime})
+        )
+    </select>
+</mapper>