Quellcode durchsuchen

教师考勤调整

dzx vor 1 Jahr
Ursprung
Commit
8fc1d23d33

+ 34 - 0
src/main/java/com/xjrsoft/common/enums/OutInStatusEnum.java

@@ -0,0 +1,34 @@
+package com.xjrsoft.common.enums;
+
+/**
+ * @description: 进出状态(0:进 1:出)
+ * @Author: dzx
+ * @Date: 2024年6月20日
+ */
+public enum OutInStatusEnum {
+
+    /**
+     * 春季招生
+     */
+    enter(0, "出场"),
+    /**
+     *  秋季招生
+     */
+    goOut(1, "进场");
+
+    final Integer code;
+    final String value;
+
+    public Integer getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    OutInStatusEnum(final Integer code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+}

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

@@ -7,15 +7,19 @@ import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.StudyStatusEnum;
 import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
 import com.xjrsoft.module.attendance.vo.TeacherStatisticsVo;
 import com.xjrsoft.module.attendance.vo.VisitorInfoVo;
 import com.xjrsoft.module.concat.service.IXjrUserService;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
+import com.xjrsoft.module.outint.entity.CarOutInRecord;
 import com.xjrsoft.module.outint.entity.StudentOutInRecord;
 import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
+import com.xjrsoft.module.outint.service.ICarOutInRecordService;
 import com.xjrsoft.module.outint.service.IStudentOutInRecordService;
 import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
+import com.xjrsoft.module.personnel.entity.CarMessageApply;
 import com.xjrsoft.module.personnel.service.IReservationSchoolService;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
@@ -60,6 +64,7 @@ public class StatisticsController {
     private final IWfTeacherleaveService wfTeacherleaveService;
     private final IStudentLeaveService studentLeaveService;
     private final IReservationSchoolService reservationSchoolService;
+    private final ICarOutInRecordService carOutInRecordService;
 
     @GetMapping(value = "/teacher-statistics")
     @ApiOperation(value="教职工考勤统计")
@@ -77,28 +82,43 @@ public class StatisticsController {
         if(dto.getDate() != null && !"".equals(dto.getDate())){
             DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE;
             LocalDate queryDate = LocalDate.parse(dto.getDate(), formatter);
-            LocalDateTime startTime, endTime;
+            LocalDateTime startTime, endTime, amEndTime = null;
             if(dto.getTimePeriod() != null && dto.getTimePeriod() == 1){
                 startTime = queryDate.atTime(5, 0, 0);
                 endTime = queryDate.atTime(12, 0, 0);
             }else if(dto.getTimePeriod() != null && dto.getTimePeriod() == 2){
                 startTime = queryDate.atTime(12, 0, 0);
                 endTime = queryDate.atTime(18, 0, 0);
+                amEndTime = queryDate.atTime(12, 0, 0);
             }else if(dto.getTimePeriod() != null && dto.getTimePeriod() == 3){
                 startTime = queryDate.atTime(18, 0, 0);
                 endTime = queryDate.atTime(23, 59, 59);
+                amEndTime = 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)
+                    new MPJLambdaWrapper<TeacherOutInRecord>()
+                            .le(TeacherOutInRecord::getRecordTime, endTime)
                             .eq(TeacherOutInRecord::getStatus, 1)
+                            .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
+                            .ge(dto.getTimePeriod() == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
                             .orderByAsc(TeacherOutInRecord::getRecordTime)
             );
 
+            List<CarOutInRecord> list = carOutInRecordService.list(
+                    new MPJLambdaWrapper<CarOutInRecord>()
+                            .select(CarOutInRecord.class, x -> VoToColumnUtil.fieldsToColumns(CarOutInRecord.class).contains(x.getProperty()))
+                            .leftJoin(CarMessageApply.class, CarMessageApply::getId, CarOutInRecord::getCarMessageApplyId)
+                            .le(CarOutInRecord::getRecordTime, endTime)
+                            .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
+                            .ge(dto.getTimePeriod() == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
+                            .eq(CarOutInRecord::getStatus, 0)
+                            .orderByAsc(CarOutInRecord::getRecordTime)
+            );
+
             Set<Long> collect = outInRecords.stream().map(TeacherOutInRecord::getUserId).collect(Collectors.toSet());
             Set<Long> userIds = new HashSet<>(collect);
             //实到人数

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

@@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.OutInStatusEnum;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -174,7 +175,7 @@ public class TeacherStatisticsController {
                 List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.list(
                     new MPJLambdaWrapper<TeacherOutInRecord>()
                             .le(TeacherOutInRecord::getRecordTime, startTime)
-                            .eq(TeacherOutInRecord::getStatus, 1)
+                            .eq(TeacherOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
                             .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", startTime.toLocalDate())
                             .eq(TeacherOutInRecord::getUserId, record.getUserId())
                             .orderByAsc(TeacherOutInRecord::getRecordTime)
@@ -196,7 +197,7 @@ public class TeacherStatisticsController {
                                     .eq("DATE_FORMAT(record_time, '%Y-%m-%d')", endTime.toLocalDate())
                                     .eq(CarMessageApply::getUserId, record.getUserId())
                                     .ge(dto.getTimePeriod() == 2 && amEndTime != null, CarOutInRecord::getRecordTime, amEndTime)
-                                    .eq(CarOutInRecord::getStatus, 0)
+                                    .eq(CarOutInRecord::getStatus, OutInStatusEnum.enter.getCode())
                                     .orderByAsc(CarOutInRecord::getRecordTime)
                     );
                     if(!list.isEmpty()){

+ 5 - 0
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceUserRelation.java

@@ -99,5 +99,10 @@ public class AttendanceUserRelation implements Serializable {
     @ApiModelProperty("最新考勤时间")
     private LocalDateTime attendanceTime;
 
+    @ApiModelProperty("考勤方式")
+    private String attendanceMode;
+
+    @ApiModelProperty("车牌号")
+    private String carNumber;
 
 }

+ 41 - 35
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceRuleCategoryServiceImpl.java

@@ -105,7 +105,7 @@ public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<Attend
                     .eq(BaseTeacher::getDeleteMark, DeleteMark.NODELETE.getCode())
                     .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
                     .in(!deptIds.isEmpty(), UserDeptRelation::getDeptId, deptIds)
-                    .in(!userIds.isEmpty(), XjrUser::getId, userIds).or()
+                    .in(!userIds.isEmpty(), XjrUser::getId, userIds)
                 );
                 //查询这部分人中是否已经有人有规则了
                 List<Long> relationUserIds = userList.stream().map(XjrUser::getId).collect(Collectors.toList());
@@ -297,25 +297,28 @@ public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<Attend
                 );
                 //查询这部分人中是否已经有人有规则了
                 List<Long> relationUserIds = userList.stream().map(XjrUser::getId).collect(Collectors.toList());
-                List<XjrUser> relations = xjrUserService.list(
-                    new MPJLambdaWrapper<XjrUser>()
-                    .select(XjrUser::getId)
-                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
-                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
-                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
-                    .in(AttendanceUserRelation::getUserId, relationUserIds)
-                    .ne(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
-                );
-                String peopleName = "";
-                for (int i = 0; i < relations.size(); i ++){
-                    if(i > 0){
-                        peopleName += ",";
+                if(!relationUserIds.isEmpty()){
+                    List<XjrUser> relations = xjrUserService.list(
+                            new MPJLambdaWrapper<XjrUser>()
+                                    .select(XjrUser::getId)
+                                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
+                                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
+                                    .in(AttendanceUserRelation::getUserId, relationUserIds)
+                                    .ne(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
+                    );
+                    String peopleName = "";
+                    for (int i = 0; i < relations.size(); i ++){
+                        if(i > 0){
+                            peopleName += ",";
+                        }
+                        peopleName += relations.get(i).getName();
+                    }
+                    if(!relations.isEmpty()){
+                        throw new MyException("以下教职工:【" + peopleName + "】已绑定其他考勤规则,无法添加");
                     }
-                    peopleName += relations.get(i).getName();
-                }
-                if(!relations.isEmpty()){
-                    throw new MyException("以下教职工:【" + peopleName + "】已绑定其他考勤规则,无法添加");
                 }
+
                 insertList.addAll(userList);
             }
         }else if(attendanceRuleCategory.getRoleId() != null && attendanceRuleCategory.getRoleId() == 3){//学生
@@ -366,25 +369,28 @@ public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<Attend
                 );
                 //查询这部分人中是否已经有人有规则了
                 List<Long> relationUserIds = userList.stream().map(XjrUser::getId).collect(Collectors.toList());
-                List<XjrUser> relations = xjrUserService.list(
-                    new MPJLambdaWrapper<XjrUser>()
-                    .select(XjrUser::getId)
-                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
-                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
-                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
-                    .in(AttendanceUserRelation::getUserId, relationUserIds)
-                    .ne(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
-                );
-                String peopleName = "";
-                for (int i = 0; i < relations.size(); i ++){
-                    if(i > 0){
-                        peopleName += ",";
+                if(!relationUserIds.isEmpty()){
+                    List<XjrUser> relations = xjrUserService.list(
+                            new MPJLambdaWrapper<XjrUser>()
+                                    .select(XjrUser::getId)
+                                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
+                                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
+                                    .in(AttendanceUserRelation::getUserId, relationUserIds)
+                                    .ne(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
+                    );
+                    String peopleName = "";
+                    for (int i = 0; i < relations.size(); i ++){
+                        if(i > 0){
+                            peopleName += ",";
+                        }
+                        peopleName += relations.get(i).getName();
+                    }
+                    if(!relations.isEmpty()){
+                        throw new MyException("以下学生:【" + peopleName + "】已绑定其他考勤规则,无法修改");
                     }
-                    peopleName += relations.get(i).getName();
-                }
-                if(!relations.isEmpty()){
-                    throw new MyException("以下学生:【" + peopleName + "】已绑定其他考勤规则,无法修改");
                 }
+
                 insertList.addAll(userList);
             }
         }

+ 6 - 5
src/main/java/com/xjrsoft/module/hikvision/util/OutInRecordUtil.java

@@ -5,6 +5,7 @@ import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import com.xjrsoft.common.enums.OutInStatusEnum;
 import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
 import com.xjrsoft.common.utils.SqlRunnerAdapterUtil;
 import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
@@ -37,7 +38,7 @@ public class OutInRecordUtil {
 
         String updSql = "UPDATE attendance_user_relation SET " +
                 "attendance_status = '" + attendanceStatus + "', attendance_time = '" + recordTime + "' " +
-                "WHERE user_id = '" + userId + "' AND delete_mark = 0";
+                "WHERE user_id = '" + userId + "', attendance_mode = '人脸' AND delete_mark = 0";
         SqlRunnerAdapter.db().update(updSql);
     }
 
@@ -51,7 +52,7 @@ public class OutInRecordUtil {
 
         String updSql = "UPDATE attendance_user_relation SET " +
                 "attendance_status = '" + attendanceStatus + "', attendance_time = '" + recordTime + "' " +
-                "WHERE user_id = '" + userId + "' AND delete_mark = 0";
+                "WHERE user_id = '" + userId + "', attendance_mode = '人脸' AND delete_mark = 0";
         SqlRunnerAdapter.db().update(updSql);
     }
 
@@ -103,7 +104,7 @@ public class OutInRecordUtil {
 
             String updSql = "UPDATE attendance_user_relation SET " +
                     "attendance_status = '" + attendanceStatus + "', attendance_time = '" + recordTime + "' " +
-                    "WHERE user_id = '" + userId + "' AND delete_mark = 0";
+                    "WHERE user_id = '" + userId + "', attendance_mode = '车辆', car_number = '" + planNo + "' AND delete_mark = 0";
             SqlRunnerAdapter.db().update(updSql);
         }
     }
@@ -248,7 +249,7 @@ public class OutInRecordUtil {
                                 .withMinute(ruleDetails.getPmEndTime().toLocalTime().getMinute())
                                 .withSecond(ruleDetails.getPmEndTime().toLocalTime().getSecond());
                     }
-                    if (status == 0) {//出
+                    if (status == OutInStatusEnum.goOut.getCode()) {//出
                         if (recordTime.isBefore(amEndTime) && recordTime.isAfter(amStartTime)) {
                             attendanceStatus = "早退";
                         } else if (recordTime.isBefore(pmEndTime) && recordTime.isAfter(pmStartTime)) {
@@ -310,7 +311,7 @@ public class OutInRecordUtil {
                             .withMinute(ruleDetails.getEveningEndTime().toLocalTime().getMinute())
                             .withSecond(ruleDetails.getEveningEndTime().toLocalTime().getSecond());
                 }
-                if(status == 0){//出
+                if(status == OutInStatusEnum.goOut.getCode()){//出
                     if(recordTime.isBefore(amEndTime) && recordTime.isAfter(amStartTime)){
                         attendanceStatus = "早退";
                     }else if(recordTime.isBefore(pmEndTime) && recordTime.isAfter(pmStartTime)){

+ 16 - 10
src/main/java/com/xjrsoft/module/job/AttendanceMessageTask.java

@@ -43,6 +43,7 @@ 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;
 
 /**
@@ -149,21 +150,26 @@ public class AttendanceMessageTask {
         String format = recentlyTime.format(formatter);
 
         int userCount = 0;
+        Set<Integer> roleTypes = list.stream().map(AttendanceMessageSet::getRoleType).collect(Collectors.toSet());
+        Set<Long> setIds = list.stream().map(AttendanceMessageSet::getId).collect(Collectors.toSet());
+
+        //查询需要通知的人
+        List<XjrUser> userList = userService.list(
+                new MPJLambdaWrapper<XjrUser>().distinct()
+                        .select(XjrUser::getId)
+                        .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                        .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
+                        .leftJoin(AttendanceMessageUserRelation.class, AttendanceMessageUserRelation::getUserId, XjrUser::getId)
+                        .in(UserRoleRelation::getRoleId, roleTypes)
+                        .in(AttendanceMessageUserRelation::getAttendanceMessageSetId, setIds)
+        );
+
 
         for (AttendanceMessageSet messageSet : list) {
             if(!messageSet.getTimePeriod().contains(timePeriod + "")){
                 continue;
             }
-            //查询需要通知的人
-            List<XjrUser> userList = userService.list(
-                new MPJLambdaWrapper<XjrUser>().distinct()
-                .select(XjrUser::getId)
-                .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
-                .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
-                .leftJoin(AttendanceMessageUserRelation.class, AttendanceMessageUserRelation::getUserId, XjrUser::getId)
-                .eq(UserRoleRelation::getRoleId, messageSet.getRoleType())
-                .eq(AttendanceMessageUserRelation::getAttendanceMessageSetId, messageSet.getId())
-            );
+
             //没有需要通知的,直接跳过
             if(userList.isEmpty()){
                 continue;