Browse Source

教师考勤调整

dzx 9 months ago
parent
commit
7deec34406

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

@@ -9,7 +9,10 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.attendance.dto.TeacherDetailsDto;
+import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo;
 import com.xjrsoft.module.attendance.vo.TeacherStatisticsPageVo;
 import com.xjrsoft.module.holiday.entity.HolidayDate;
 import com.xjrsoft.module.holiday.service.IHolidayDateService;
@@ -22,6 +25,7 @@ import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import com.xjrsoft.module.teacher.entity.WfHeadTeacherLeave;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
+import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.service.IWfHeadTeacherLeaveService;
 import com.xjrsoft.module.teacher.service.IWfTeacherleaveService;
 import io.swagger.annotations.Api;
@@ -35,9 +39,9 @@ import javax.validation.Valid;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
 * @title: 教师考勤
@@ -57,7 +61,7 @@ public class TeacherStatisticsController {
     private final IWfTeacherleaveService wfTeacherleaveService;
     private final IHolidayDateService holidayDateService;
     private final IWfHeadTeacherLeaveService headTeacherLeaveService;
-
+    private final IAttendanceRuleCategoryService attendanceRuleCategoryService;
 
     @GetMapping(value = "/teacher-details")
     @ApiOperation(value="教师考勤")
@@ -88,49 +92,85 @@ public class TeacherStatisticsController {
                 return RT.ok(ConventPage.getPageOutput(voIPage, TeacherStatisticsPageVo.class));
             }
 
-            LocalDateTime startTime, endTime;
-
-            if(dto.getTimePeriod() == 1){
-                startTime = queryDate.atTime(5, 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);
-            }
-
-            //查询当前时间段存在请假的教师
-            Map<Long, WfTeacherleave> leaveList = wfTeacherleaveService.getLeaveList(startTime, endTime);
-
-            Map<Long, WfHeadTeacherLeave> teacherLeaveMap = headTeacherLeaveService.getLeaveList(startTime, endTime);
-            //查询进入记录
-            List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.list(
-                    new QueryWrapper<TeacherOutInRecord>().lambda()
-                            .between(TeacherOutInRecord::getRecordTime, startTime, endTime)
-                            .eq(TeacherOutInRecord::getStatus, 1)
-                            .orderByAsc(TeacherOutInRecord::getRecordTime)
-            );
-            Map<Long, TeacherOutInRecord> outInMap = new HashMap<>();
-            for (TeacherOutInRecord inRecord : outInRecords) {
-                if(outInMap.containsKey(inRecord.getUserId())){
-                    continue;
-                }
-                outInMap.put(inRecord.getUserId(), inRecord);
-            }
+            List<Long> userIds = voIPage.getRecords().stream().map(TeacherStatisticsPageVo::getUserId).collect(Collectors.toList());
+            Map<Long, AttendanceRuleDetailsUserVo> teacherTodyRuleByUserId = attendanceRuleCategoryService.getTeacherTodyRuleByUserId(userIds);
+            
+//            //查询当前时间段存在请假的教师
+//            Map<Long, WfTeacherleave> leaveList = wfTeacherleaveService.getLeaveList(startTime, endTime);
+//
+//            Map<Long, WfHeadTeacherLeave> teacherLeaveMap = headTeacherLeaveService.getLeaveList(startTime, endTime);
+//            //查询进入记录
+//            List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.list(
+//                    new QueryWrapper<TeacherOutInRecord>().lambda()
+//                            .between(TeacherOutInRecord::getRecordTime, startTime, endTime)
+//                            .eq(TeacherOutInRecord::getStatus, 1)
+//                            .orderByAsc(TeacherOutInRecord::getRecordTime)
+//            );
+//            Map<Long, TeacherOutInRecord> outInMap = new HashMap<>();
+//            for (TeacherOutInRecord inRecord : outInRecords) {
+//                if(outInMap.containsKey(inRecord.getUserId())){
+//                    continue;
+//                }
+//                outInMap.put(inRecord.getUserId(), inRecord);
+//            }
             for (TeacherStatisticsPageVo record : voIPage.getRecords()) {
-                WfTeacherleave studentLeave = leaveList.get(record.getUserId());
+                LocalDateTime startTime, endTime;
+                AttendanceRuleDetailsUserVo detailsUserVo = teacherTodyRuleByUserId.get(record.getUserId());
+                if(dto.getTimePeriod() == 1){
+                    startTime = queryDate.atTime(5, 0, 0);
+                    if(detailsUserVo.getAmStartTime() != null){
+                        startTime = queryDate.atTime(detailsUserVo.getAmStartTime());
+                    }
+                    endTime = queryDate.atTime(12, 0, 0);
+                    if(detailsUserVo.getAmEndTime() != null){
+                        endTime = queryDate.atTime(detailsUserVo.getAmEndTime());
+                    }
+                }else if(dto.getTimePeriod() == 2){
+                    startTime = queryDate.atTime(12, 0, 0);
+                    if(detailsUserVo.getPmStartTime() != null){
+                        startTime = queryDate.atTime(detailsUserVo.getPmStartTime());
+                    }
+                    endTime = queryDate.atTime(18, 0, 0);
+                    if(detailsUserVo.getPmEndTime() != null){
+                        endTime = queryDate.atTime(detailsUserVo.getPmEndTime());
+                    }
+                }else{
+                    startTime = queryDate.atTime(0, 0, 0);
+                    if(detailsUserVo.getEveningStartTime() != null){
+                        startTime = queryDate.atTime(detailsUserVo.getEveningStartTime());
+                    }
+                    endTime = queryDate.atTime(23, 59, 59);
+                    if(detailsUserVo.getEveningEndTime() != null){
+                        endTime = queryDate.atTime(detailsUserVo.getEveningEndTime());
+                    }
+                }
+                
+                WfTeacherleave studentLeave = wfTeacherleaveService.getLeaveByUserId(startTime, endTime, record.getUserId());
                 if(studentLeave != null){
                     record.setStatus(studentLeave.getLeaveType());
                     continue;
                 }
-                WfHeadTeacherLeave teacherLeave = teacherLeaveMap.get(record.getUserId());
+
+                WfHeadTeacherLeave teacherLeave = headTeacherLeaveService.selectJoinOne(WfHeadTeacherLeave.class,
+                        new MPJLambdaWrapper<WfHeadTeacherLeave>()
+                                .select(WfHeadTeacherLeave.class, x -> VoToColumnUtil.fieldsToColumns(WfHeadTeacherLeave.class).contains(x.getProperty()))
+                                .innerJoin(XjrUser.class, XjrUser::getId, WfHeadTeacherLeave::getApplicantUserId)
+                                .eq(WfHeadTeacherLeave::getStatus, 1)
+                                .eq(WfHeadTeacherLeave::getApplicantUserId, record.getUserId())
+                                .between(WfHeadTeacherLeave::getStartTime, startTime, endTime)
+                );
                 if(teacherLeave != null){
                     record.setStatus(teacherLeave.getLeaveReason());
                     continue;
                 }
-                TeacherOutInRecord outInRecord = outInMap.get(record.getUserId());
+                List<TeacherOutInRecord> outInRecords = teacherOutInRecordService.list(
+                    new QueryWrapper<TeacherOutInRecord>().lambda()
+                            .between(TeacherOutInRecord::getRecordTime, startTime, endTime)
+                            .eq(TeacherOutInRecord::getStatus, 1)
+                            .eq(TeacherOutInRecord::getUserId, record.getUserId())
+                            .orderByAsc(TeacherOutInRecord::getRecordTime)
+            );
+                TeacherOutInRecord outInRecord = outInRecords.get(0);
                 if(outInRecord != null){
                     record.setRecordTime(outInRecord.getRecordTime());
                     record.setStatus(outInRecord.getAttendanceStatus());

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

@@ -22,4 +22,7 @@ public interface AttendanceRuleDetailsMapper extends MPJBaseMapper<AttendanceRul
 
     List<AttendanceRuleDetailsUserVo> getAllStudentTodyRule(@Param("dayOfWeek") String dayOfWeek);
 
+
+    List<AttendanceRuleDetailsUserVo> getTodayRulesByUserId(@Param("dayOfWeek") String dayOfWeek, @Param("userIds")List<Long> userIds);
+
 }

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

@@ -55,4 +55,6 @@ public interface IAttendanceRuleCategoryService extends MPJBaseService<Attendanc
 
     Map<String, Map<Long, AttendanceRuleDetailsUserVo>> getAllStudentTodyRule(List<String> dayOfWeek);
 
+    Map<Long, AttendanceRuleDetailsUserVo> getTeacherTodyRuleByUserId(List<Long> teacherIds);
+
 }

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

@@ -478,4 +478,19 @@ public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<Attend
 
         return result;
     }
+
+    /**
+     * 查询教师的当前的考勤规则
+     */
+    @Override
+    public Map<Long, AttendanceRuleDetailsUserVo> getTeacherTodyRuleByUserId(List<Long> teacherIds) {
+        LocalDateTime now = LocalDateTime.now();
+        DayOfWeek dayOfWeek = now.getDayOfWeek();
+        List<AttendanceRuleDetailsUserVo> todayRulesByUserId = detailsMapper.getTodayRulesByUserId(dayOfWeek.name(), teacherIds);
+        Map<Long, AttendanceRuleDetailsUserVo> dataMap = new HashMap<>();
+        for (AttendanceRuleDetailsUserVo userVo : todayRulesByUserId) {
+            dataMap.put(userVo.getUserId(), userVo);
+        }
+        return dataMap;
+    }
 }

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

@@ -20,4 +20,6 @@ public interface WfTeacherleaveMapper extends MPJBaseMapper<WfTeacherleave> {
     Long getLeaveCount(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
 
     List<WfTeacherleave> getLeaveList(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
+
+    WfTeacherleave getLeaveByUserId(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("userId")Long userId);
 }

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

@@ -26,4 +26,6 @@ public interface IWfTeacherleaveService extends MPJBaseService<WfTeacherleave> {
     Long getLeaveCount(LocalDateTime startTime, LocalDateTime endTime);
 
     Map<Long, WfTeacherleave> getLeaveList(LocalDateTime startTime, LocalDateTime endTime);
+
+    WfTeacherleave getLeaveByUserId(LocalDateTime startTime, LocalDateTime endTime, Long userId);
 }

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

@@ -202,6 +202,11 @@ public class WfTeacherleaveServiceImpl extends MPJBaseServiceImpl<WfTeacherleave
         return result;
     }
 
+    @Override
+    public WfTeacherleave getLeaveByUserId(LocalDateTime startTime, LocalDateTime endTime, Long userId) {
+        return this.baseMapper.getLeaveByUserId(startTime, endTime, userId);
+    }
+
     JsonArray selectResource(ApiUtil apiUtil){
         String apiPath = "/api/irds/v2/resource/resourcesByParams";
         JsonObject jsonObject = new JsonObject();

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

@@ -27,4 +27,20 @@
         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="getTodayRulesByUserId" 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_student 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}
+        <if test="dto.ids != null and !dto.ids.isEmpty()">
+            and t5.user_id in
+            <foreach item="id" index="index" collection="userIds" open="(" close=")" separator=",">
+            #{id}
+            </foreach>
+        </if>
+    </select>
 </mapper>

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

@@ -26,4 +26,16 @@
                 OR (#{startTime} > leave_start_time and leave_end_time > #{endTime})
             )
     </select>
+    <select id="getLeaveByUserId" resultType="com.xjrsoft.module.teacher.entity.WfTeacherleave">
+        SELECT * 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_start_time > #{startTime} and #{endTime} > leave_end_time)
+                OR (#{startTime} > leave_start_time and leave_end_time > #{endTime})
+            )
+        and t2.id = #{userId}
+    </select>
 </mapper>