Browse Source

Merge branch 'pre'

dzx 1 year ago
parent
commit
637bfd2080
52 changed files with 1182 additions and 182 deletions
  1. 207 0
      src/main/java/com/xjrsoft/module/attendance/controller/StatisticsController.java
  2. 18 0
      src/main/java/com/xjrsoft/module/attendance/dto/AttendanceStatisticDto.java
  3. 9 0
      src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceRuleDetailsMapper.java
  4. 11 0
      src/main/java/com/xjrsoft/module/attendance/service/IAttendanceRuleCategoryService.java
  5. 39 0
      src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceRuleCategoryServiceImpl.java
  6. 172 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceRuleDetailsUserVo.java
  7. 41 0
      src/main/java/com/xjrsoft/module/attendance/vo/StudentStatisticsVo.java
  8. 43 0
      src/main/java/com/xjrsoft/module/attendance/vo/TeacherStatisticsVo.java
  9. 44 0
      src/main/java/com/xjrsoft/module/attendance/vo/VisitorInfoVo.java
  10. 14 0
      src/main/java/com/xjrsoft/module/hikvision/mapper/HikvisionDataMapper.java
  11. 9 0
      src/main/java/com/xjrsoft/module/hikvision/util/ApiUtil.java
  12. 4 6
      src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java
  13. 9 8
      src/main/java/com/xjrsoft/module/hikvision/util/FaceImportUtil.java
  14. 77 73
      src/main/java/com/xjrsoft/module/hikvision/util/Teacher_Student_OutIn_RecordUtil.java
  15. 45 0
      src/main/java/com/xjrsoft/module/job/AttendanceMessageTask.java
  16. 57 0
      src/main/java/com/xjrsoft/module/job/InsertOutInRecordTask.java
  17. 13 2
      src/main/java/com/xjrsoft/module/liteflow/node/ImportStudentFaceNode.java
  18. 13 3
      src/main/java/com/xjrsoft/module/liteflow/node/ImportTeacherFaceNode.java
  19. 11 0
      src/main/java/com/xjrsoft/module/organization/controller/UserController.java
  20. 4 0
      src/main/java/com/xjrsoft/module/organization/dto/UserPageDto.java
  21. 2 0
      src/main/java/com/xjrsoft/module/organization/vo/UserPageVo.java
  22. 0 8
      src/main/java/com/xjrsoft/module/outint/controller/CarOutInRecordController.java
  23. 0 5
      src/main/java/com/xjrsoft/module/outint/controller/StudentOutInRecordController.java
  24. 1 10
      src/main/java/com/xjrsoft/module/outint/controller/TeacherOutInRecordController.java
  25. 0 9
      src/main/java/com/xjrsoft/module/outint/controller/VisitorOutInRecordController.java
  26. 3 1
      src/main/java/com/xjrsoft/module/outint/entity/StudentOutInRecord.java
  27. 3 2
      src/main/java/com/xjrsoft/module/outint/entity/TeacherOutInRecord.java
  28. 4 4
      src/main/java/com/xjrsoft/module/outint/vo/StudentOutInRecordPageVo.java
  29. 24 15
      src/main/java/com/xjrsoft/module/personnel/controller/CarMessageApplyController.java
  30. 1 2
      src/main/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessController.java
  31. 24 16
      src/main/java/com/xjrsoft/module/personnel/controller/TeacherFaceProcessController.java
  32. 5 0
      src/main/java/com/xjrsoft/module/personnel/mapper/ReservationSchoolMapper.java
  33. 5 0
      src/main/java/com/xjrsoft/module/personnel/service/IReservationSchoolService.java
  34. 6 0
      src/main/java/com/xjrsoft/module/personnel/service/impl/ReservationSchoolServiceImpl.java
  35. 7 2
      src/main/java/com/xjrsoft/module/student/mapper/StudentLeaveMapper.java
  36. 4 0
      src/main/java/com/xjrsoft/module/student/service/IStudentLeaveService.java
  37. 6 0
      src/main/java/com/xjrsoft/module/student/service/impl/StudentLeaveServiceImpl.java
  38. 4 3
      src/main/java/com/xjrsoft/module/teacher/controller/TeacherbaseManagerController.java
  39. 10 1
      src/main/java/com/xjrsoft/module/teacher/mapper/FaceImportMapper.java
  40. 4 0
      src/main/java/com/xjrsoft/module/teacher/mapper/WfTeacherleaveMapper.java
  41. 4 0
      src/main/java/com/xjrsoft/module/teacher/service/IWfTeacherleaveService.java
  42. 6 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/WfTeacherleaveServiceImpl.java
  43. 5 0
      src/main/java/com/xjrsoft/module/teacher/vo/XjrUserPageVo.java
  44. 30 0
      src/main/resources/mapper/attendance/AttendanceRuleDetailsMapper.xml
  45. 13 0
      src/main/resources/mapper/hikvision/HikvisionDataMapper.xml
  46. 15 0
      src/main/resources/mapper/personnel/ReservationSchoolMapper.xml
  47. 17 0
      src/main/resources/mapper/student/StudentLeaveMapper.xml
  48. 39 9
      src/main/resources/mapper/teacher/TeacherFaceImportMapper.xml
  49. 17 0
      src/main/resources/mapper/teacher/WfTeacherleaveMapper.xml
  50. 26 0
      src/test/java/com/xjrsoft/module/job/AttendanceMessageTaskTest.java
  51. 11 3
      src/test/java/com/xjrsoft/module/job/HikvisionBaseDataTaskTest.java
  52. 46 0
      src/test/java/com/xjrsoft/module/liteflow/node/ImportTeacherFaceNodeTest.java

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

@@ -0,0 +1,207 @@
+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.IAttendanceRuleCategoryService;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleDetailsUserVo;
+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.StudentOutInRecord;
+import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
+import com.xjrsoft.module.outint.service.IStudentOutInRecordService;
+import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
+import com.xjrsoft.module.personnel.service.IReservationSchoolService;
+import com.xjrsoft.module.student.entity.BaseStudent;
+import com.xjrsoft.module.student.entity.StudentLeave;
+import com.xjrsoft.module.student.service.IStudentLeaveService;
+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.math.BigDecimal;
+import java.math.RoundingMode;
+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 IXjrUserService 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;
+
+    @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);
+            if(leaveCount == null){
+                leaveCount = 0L;
+            }
+            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(ruleDetails == null){
+                    continue;
+                }
+                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());
+
+            //计算出勤率
+            BigDecimal divide = BigDecimal.valueOf(statisticsVo.getActualCount()).divide(BigDecimal.valueOf(statisticsVo.getAllCount()), 2, RoundingMode.HALF_UP);
+            statisticsVo.setAttendanceRate(divide.doubleValue());
+        }
+
+        return RT.ok(statisticsVo);
+    }
+
+
+    @GetMapping(value = "/student-statistics")
+    @ApiOperation(value="学生考勤统计")
+    @SaCheckPermission("statistics:detail")
+    public RT<TeacherStatisticsVo> studentStatistics(@Valid AttendanceStatisticDto dto){
+        TeacherStatisticsVo statisticsVo = new TeacherStatisticsVo();
+        //查询总人数
+        MPJLambdaWrapper<XjrUser> queryWrapper = MPJWrappers.<XjrUser>lambdaJoin()
+                .disableSubLogicDel()
+                .innerJoin(BaseStudent.class, BaseStudent::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<StudentOutInRecord> outInRecords = studentOutInRecordService.list(
+                    new QueryWrapper<StudentOutInRecord>().lambda()
+                            .between(StudentOutInRecord::getRecordTime, startTime, endTime)
+            );
+            //实到人数
+            statisticsVo.setActualCount(Long.valueOf(outInRecords.size()));
+
+            //查询教师请假人数
+            Long leaveCount = studentLeaveService.getLeaveCount(startTime, endTime);
+            if(leaveCount == null){
+                leaveCount = 0L;
+            }
+            statisticsVo.setLeaveCount(leaveCount);
+
+            //查询每个人当天的考勤规则
+            Map<Long, AttendanceRuleDetailsUserVo> allTeacherTodyRule = ruleCategoryService.getAllStudentTodyRule(queryDate.getDayOfWeek().name());
+            //通过考勤规则和实到人数信息,计算迟到的
+            Long lateCount = 0L;
+            for (StudentOutInRecord 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());
+
+            //计算出勤率
+            BigDecimal divide = BigDecimal.valueOf(statisticsVo.getActualCount()).divide(BigDecimal.valueOf(statisticsVo.getAllCount()), 2, RoundingMode.HALF_UP);
+            statisticsVo.setAttendanceRate(divide.doubleValue());
+        }
+
+        return RT.ok(statisticsVo);
+    }
+
+
+    @GetMapping(value = "/visitor-list")
+    @ApiOperation(value="访客列表")
+    @SaCheckPermission("statistics:detail")
+    public RT<List<VisitorInfoVo>> visitorList(@Valid AttendanceStatisticDto dto){
+        List<VisitorInfoVo> visionList = reservationSchoolService.getVisionList(dto.getDate());
+        return RT.ok(visionList);
+    }
+
+}

+ 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;
+}

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

@@ -2,7 +2,11 @@ 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;
+
+import java.util.List;
 
 /**
 * @title: 考勤规则细则
@@ -12,5 +16,10 @@ import org.apache.ibatis.annotations.Mapper;
 */
 @Mapper
 public interface AttendanceRuleDetailsMapper extends MPJBaseMapper<AttendanceRuleDetails> {
+    List<AttendanceRuleDetails> getTodayRules(@Param("dayOfWeek") String dayOfWeek);
+
+    List<AttendanceRuleDetailsUserVo> getAllTeacherTodyRule(@Param("dayOfWeek") String dayOfWeek);
+
+    List<AttendanceRuleDetailsUserVo> getAllStudentTodyRule(@Param("dayOfWeek") String dayOfWeek);
 
 }

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

@@ -4,8 +4,11 @@ import com.github.yulichang.base.MPJBaseService;
 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: 考勤规则
@@ -38,4 +41,12 @@ public interface IAttendanceRuleCategoryService extends MPJBaseService<Attendanc
     * @return
     */
     Boolean delete(List<Long> ids);
+
+    List<AttendanceRuleDetails> getTodayRules();
+
+    AttendanceRuleDetails getTodayRulesByParam(String dayOfWeek);
+
+    Map<Long, AttendanceRuleDetailsUserVo> getAllTeacherTodyRule(String dayOfWeek);
+
+    Map<Long, AttendanceRuleDetailsUserVo> getAllStudentTodyRule(String dayOfWeek);
 }

+ 39 - 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;
@@ -30,9 +31,13 @@ import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+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;
 
@@ -406,4 +411,38 @@ public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<Attend
 
         return true;
     }
+
+    @Override
+    public List<AttendanceRuleDetails> getTodayRules() {
+        LocalDateTime now = LocalDateTime.now();
+        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;
+    }
+
+    @Override
+    public Map<Long, AttendanceRuleDetailsUserVo> getAllStudentTodyRule(String dayOfWeek) {
+        List<AttendanceRuleDetailsUserVo> teacherTodyRule = detailsMapper.getAllStudentTodyRule(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;
+
+}

+ 41 - 0
src/main/java/com/xjrsoft/module/attendance/vo/StudentStatisticsVo.java

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

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

@@ -0,0 +1,43 @@
+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;
+
+    @ApiModelProperty("出勤率")
+    private Double attendanceRate;
+
+}

+ 44 - 0
src/main/java/com/xjrsoft/module/attendance/vo/VisitorInfoVo.java

@@ -0,0 +1,44 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+* @title: 访客信息
+* @Author dzx
+* @Date: 2024年5月27日
+* @Version 1.0
+*/
+@Data
+public class VisitorInfoVo {
+
+    @ApiModelProperty("访客姓名")
+    private String name;
+
+    @ApiModelProperty("访客身份证")
+    private String identityCard;
+
+    @ApiModelProperty("电话")
+    private String phone;
+
+    @ApiModelProperty("被访人")
+    private String respondentUserName;
+
+    @ApiModelProperty("被访部门")
+    private String deptName;
+
+    @ApiModelProperty("到访结束时间")
+    private LocalDateTime endTime;
+
+    @ApiModelProperty("到访开始时间")
+    private LocalDateTime startTime;
+
+    @ApiModelProperty("申请时间")
+    private LocalDateTime createDate;
+
+    @ApiModelProperty("进校事由")
+    private String reason;
+
+}

+ 14 - 0
src/main/java/com/xjrsoft/module/hikvision/mapper/HikvisionDataMapper.java

@@ -13,4 +13,18 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface HikvisionDataMapper extends MPJBaseMapper<HikvisionData> {
 
+    /**
+     * 查询教师在海康中的id
+     * @param sourceId
+     * @return
+     */
+    String getTeacherHikvisionId(Long sourceId);
+
+
+    /**
+     * 查询学生在海康中的id
+     * @param sourceId
+     * @return
+     */
+    String getStudentHikvisionId(Long sourceId);
 }

+ 9 - 0
src/main/java/com/xjrsoft/module/hikvision/util/ApiUtil.java

@@ -2,6 +2,7 @@ package com.xjrsoft.module.hikvision.util;
 
 import com.hikvision.artemis.sdk.ArtemisHttpUtil;
 import com.hikvision.artemis.sdk.config.ArtemisConfig;
+import org.apache.http.HttpResponse;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -64,4 +65,12 @@ public class ApiUtil {
     public String doPost(String apiPath, String body, Map<String, String> querys){
         return doPost(apiPath, body, querys, null);
     }
+
+    public static String GetRedirectURL(String uri){
+        if (uri != null)
+            return "https://" + ApiUtil.host + "/" + uri;
+        else
+            return null;
+    }
+
 }

+ 4 - 6
src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java

@@ -468,10 +468,6 @@ public class DataUtil {
         String existingPlatesSql = "SELECT source_id FROM hikvision_data";
         List<String> existingPlates = db.query(existingPlatesSql, String.class);
 
-        for (String h : existingPlates){
-            System.out.println(h + "qqq");
-        }
-
         JsonArray dataArray = new JsonArray();
         String result = null;
         int clientId = 1;
@@ -483,7 +479,9 @@ public class DataUtil {
             JsonObject paramJson = new JsonObject();
             paramJson.addProperty("clientId", clientId);
             paramJson.addProperty("plateNo", carMessageApply.getCarNumber());
-            paramJson.addProperty("personId", faceImportMapper.GetHikvisonPersonId(Long.valueOf(Long.parseLong(carMessageApply.getId().toString()))));
+            System.out.println(faceImportMapper.GetHikvisonPersonId(carMessageApply.getId().toString()));
+            System.out.println(faceImportMapper.GetHikvisonPersonId(carMessageApply.getId().toString()));
+            paramJson.addProperty("personId", faceImportMapper.GetHikvisonPersonId(carMessageApply.getId().toString()));
 
             int vehicleTypeNum;
             switch (carMessageApply.getVehicleType()) {
@@ -513,7 +511,7 @@ public class DataUtil {
             paramJsonTime.addProperty("plateNo", carMessageApply.getCarNumber());
             paramJsonTime.addProperty("startTime", String.valueOf(carMessageApply.getStartTime()));
             paramJsonTime.addProperty("endTime", String.valueOf(carMessageApply.getEndTime()));
-            String aa = apiUtil.doPost(apiPathTime, String.valueOf(paramJsonTime), tagMap, null);
+            apiUtil.doPost(apiPathTime, String.valueOf(paramJsonTime), tagMap, null);
         }
 
         JsonElement parse = jsonParser.parse(result);

+ 9 - 8
src/main/java/com/xjrsoft/module/hikvision/util/FaceImportUtil.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.hikvision.util;
 
 import com.google.gson.JsonObject;
+import com.xjrsoft.module.personnel.entity.TeacherFaceProcess;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 
 import java.io.ByteArrayOutputStream;
@@ -13,13 +14,13 @@ import java.util.Map;
 
 
 public class FaceImportUtil {
-    private static FaceImportMapper faceImportMapper;
-    private static ApiUtil apiUtil;
 
-    public static String ImportTeacherFace(Long id) {
+    private static ApiUtil apiUtil = new ApiUtil();
+
+    public static String ImportTeacherFace(String personId, String fileUrl) {
         JsonObject paramJson = new JsonObject();
-        paramJson.addProperty("personId", faceImportMapper.GetTeacherUserIdById(id));
-        paramJson.addProperty("faceData", ImageToBase64(faceImportMapper.GetTeacherHikvisionImgById(id)));
+        paramJson.addProperty("personId", personId);
+        paramJson.addProperty("faceData", ImageToBase64(fileUrl));
 
         Map<String, String> querys = new HashMap<>();
         querys.put("tagId", "frs");
@@ -30,10 +31,10 @@ public class FaceImportUtil {
         return response;
     }
 
-    public static String ImportStudentFace(Long id) {
+    public static String ImportStudentFace(String personId, String fileUrl) {
         JsonObject paramJson = new JsonObject();
-        paramJson.addProperty("personId", faceImportMapper.GetStudentUserIdById(id));
-        paramJson.addProperty("faceData", ImageToBase64(faceImportMapper.GetStudentHikvisionImgById(id)));
+        paramJson.addProperty("personId", personId);
+        paramJson.addProperty("faceData", ImageToBase64(fileUrl));
 
         Map<String, String> querys = new HashMap<>();
         querys.put("tagId", "frs");

+ 77 - 73
src/main/java/com/xjrsoft/module/hikvision/util/Teacher_Student_OutIn_RecordUtil.java

@@ -1,109 +1,106 @@
 package com.xjrsoft.module.hikvision.util;
 
-import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.db.Db;
 import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
-import io.swagger.annotations.ApiOperation;
-import lombok.var;
-import org.springframework.web.bind.annotation.GetMapping;
+import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 
 import java.sql.SQLException;
-import java.util.HashMap;
-import java.util.Map;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 
 
 public class Teacher_Student_OutIn_RecordUtil {
-//    void tearcherInsertRecord(Db db, Long userId, String recordTime, Long facePhoto,int status) throws SQLException {
-//
-//        String sql = "INSERT INTO teacher_out_in_record(create_date, ...) " +
-//                "VALUES(now(), '"  + userId + "', '" + teacherId + "', '" +
-//                classId + "', '" + recordTime + "', '" + facePhoto + "', '" + status + "', '" + entry.getValue() + "')";
-//        db.execute(sql);
-//    }
-
-    public void studentInsertRecord(Db db, Long userId, Long teacherId, Long classId, String recordTime,Long facePhoto, int status) throws SQLException {
-        String sql = "INSERT INTO teacher_out_in_record(create_date, ...) " +
-                "VALUES(now(), '"  + userId + "', '" + teacherId + "', '" +
-                classId + "', '" + recordTime + "', '" + facePhoto + "', '" + status + "', '" + "')";
+    public void teacherInsertRecord(Db db, Long userId, String recordTime, String facePhoto,int status, String eventId) throws SQLException {
+
+        String sql = "INSERT INTO teacher_out_in_record(create_date, user_id, record_time, face_photo, eventId, status,delete_mark,enabled_mark) " +
+                "VALUES(now(), '"  + userId + "', '" + recordTime + "', '" +
+                facePhoto + "', '" + eventId + "', '" +status + "',0,1)";
         db.execute(sql);
     }
 
+    public void studentInsertRecord(Db db, Long userId, Long teacherId, Long classId, String facePhoto, String recordTime, int status, String eventId) throws SQLException {
+        String sql = "INSERT INTO student_out_in_record(create_date, user_id, teacher_id, class_id, face_photo, record_time , eventId,status,delete_mark,enabled_mark) " +
+                "VALUES(now(), '" + userId + "', '" + teacherId + "', '" +
+                classId + "', '" + facePhoto + "', '" + recordTime + "', '" + eventId + "', '" + status + "',0,1)";
+        db.execute(sql);
+    }
+
+
     public void visitInsertRecord(Db db, Long reservation_school_people_id, String recordTime,Long facePhoto, int status) throws SQLException {
-        String sql = "INSERT INTO visitor_out_in_record(create_date, ...) " +
+        String sql = "INSERT INTO visitor_out_in_record(create_date, reservation_school_people_id, record_time, face_photo, status,delete_mark,enabled_mark) " +
                 "VALUES(now(), '"  + reservation_school_people_id + "', '" +
-                 recordTime + "', '" + facePhoto + "', '" + status + "', '" + "')";
+                 recordTime + "', '" + facePhoto + "', '" + status +  "',0,1)";
         db.execute(sql);
     }
 
-
-    @GetMapping(value = "/adada")
-    @ApiOperation(value = "新www价项")
-    @SaCheckPermission("evaluateitem:add")
-    public String GetAccessConsole(){
+    public String GetDoorEvents(Db use, FaceImportMapper faceImportMapper) throws SQLException, ParseException {
         ApiUtil apiUtil = new ApiUtil();
-        JsonObject paramJson = new JsonObject();
-        paramJson.addProperty("pageNo", 1);
-        paramJson.addProperty("pageSize", 100);
 
-        Map<String, String> querys = new HashMap<>();
-        querys.put("tagId", "frs");
+        String apiPath = "/api/acs/v2/door/events";
+        JsonArray responseBuilder = new JsonArray();
 
-        String apiPath = "/api/resource/v2/acsDevice/search";
-        String response = apiUtil.doPost(apiPath, String.valueOf(paramJson), querys);
+        AtomicInteger pageNo = new AtomicInteger(1);
+        int pageSize = 100;
+        boolean hasMorePages = true;
 
-        return GetDoorEvents(response);
-    }
+        while (hasMorePages) {
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("pageNo", pageNo.get());
+            paramJson.addProperty("pageSize", pageSize);
 
-    public String GetDoorEvents(String accessPointResponse){
-        ApiUtil apiUtil = new ApiUtil();
+            String response = apiUtil.doPost(apiPath, String.valueOf(paramJson), null);
+            JsonElement responseElement = new Gson().fromJson(response, JsonElement.class);
+            JsonArray dataList = responseElement.getAsJsonObject().getAsJsonObject("data").getAsJsonArray("list");
 
-        JsonObject accessPointJson = new Gson().fromJson(accessPointResponse, JsonObject.class);
-        JsonArray dataList = accessPointJson.getAsJsonObject("data").getAsJsonArray("list");
-        String apiPath = "/api/acs/v2/door/events";
-        String response = null;
-        for(JsonElement element : dataList){
-            JsonObject item = element.getAsJsonObject();
-            JsonObject paramJson = new JsonObject();
-            JsonArray doorIndexCodes = new JsonArray();
-            paramJson.addProperty("pageNo", 1);
-            paramJson.addProperty("pageSize", 10);
-            doorIndexCodes.add(item.get("indexCode"));
-            paramJson.add("doorIndexCodes", doorIndexCodes);
-            response = apiUtil.doPost(apiPath, String.valueOf(paramJson), null);
-            // 执行四中人员的导入
-            stProcessRecords(response);
-
-//            doorIndexCodes.add(item.get("indexCode").getAsString());
-            System.out.println(response);
-        }
+            for (JsonElement item : dataList) {
+                responseBuilder.add(item);
+            }
 
-        return response;
+            JsonObject responseJson = new Gson().fromJson(response, JsonObject.class);
+            int totalCount = responseJson.getAsJsonObject("data").get("totalPage").getAsInt();
+            hasMorePages = pageNo.getAndIncrement() < totalCount;
+        }
+        // Process the records
+        InsertTeacherStudentRecords(use, responseBuilder, faceImportMapper);
+        return responseBuilder.toString();
     }
 
-    public void stProcessRecords(String doorEventsResponse) {
-        JsonObject doorEventsJson = new Gson().fromJson(doorEventsResponse, JsonObject.class);
-        JsonArray dataList = doorEventsJson.getAsJsonObject("data").getAsJsonArray("list");
 
-        for (JsonElement element : dataList) {
+    public void InsertTeacherStudentRecords(Db use, JsonArray doorEventsResponse, FaceImportMapper faceImportMapper) throws SQLException, ParseException {
+        Teacher_Student_OutIn_RecordUtil teacherStudentOutInRecordUtil = new Teacher_Student_OutIn_RecordUtil();
+        List<String> teacherEventIdList = faceImportMapper.GetTeacherUrlList();
+        List<String> studentEventIdList = faceImportMapper.GetStudentUrlList();
+
+        for (JsonElement element : doorEventsResponse) {
             JsonObject item = element.getAsJsonObject();
-            if (item.get("studentId").isJsonNull()) {
-                // 老师记录
-                String personId = item.get("personId").isJsonNull() ? null : item.get("personId").getAsString();
-                int inAndOutType = item.get("inAndOutType").getAsInt();
 
+            Long personId;
+            try {
+                personId = item.get("personId").isJsonNull() ? null : item.get("personId").getAsLong();
+            }catch (Exception e){
+                continue;
+            }
+            if (personId == null) continue;
+
+            int status = item.get("inAndOutType").getAsInt();
+            String uri = item.get("picUri").isJsonNull() ? null : item.get("picUri").getAsString();
+            String recordTime = item.get("eventTime").isJsonNull() ? null : item.get("eventTime").getAsString();
+            String eventId = item.get("eventId").isJsonNull() ? null : item.get("eventId").getAsString();
+
+            if (!Objects.equals(faceImportMapper.IsStudentTypeByPersonId(personId), "学生")) {
+                // 老师记录
+                if (teacherEventIdList.contains(eventId)) continue;
+                teacherStudentOutInRecordUtil.teacherInsertRecord(use, personId, ChangeTime(recordTime), ApiUtil.GetRedirectURL(uri),status,eventId);
             } else {
                 // 学生记录
-                String studentId = item.get("studentId").getAsString();
-                String personId = item.get("personId").isJsonNull() ? null : item.get("personId").getAsString();
-                int status = item.get("inAndOutType").getAsInt();
-                String receiveTime = item.get("receiveTime").getAsString();
-
-                // 执行mapper获取例如班主任等数据 然后执行
-//                Teacher_Student_OutIn_RecordUtil teacherStudentOutInRecordUtil = new Teacher_Student_OutIn_RecordUtil();
-//                teacherStudentOutInRecordUtil.studentInsertRecord(db...);
+                if (studentEventIdList.contains(eventId)) continue;
+                teacherStudentOutInRecordUtil.studentInsertRecord(use, personId, faceImportMapper.GetTeacherIdByPersonId(personId),
+                        faceImportMapper.GetClassIdByPersonId(personId), ApiUtil.GetRedirectURL(uri), ChangeTime(recordTime), status,eventId);
             }
         }
     }
@@ -117,7 +114,7 @@ public class Teacher_Student_OutIn_RecordUtil {
         Map<String, String> querys = new HashMap<>();
         querys.put("tagId", "frs");
 
-        String apiPath = "/api/visitor/v2/visiting/records\n";
+        String apiPath = "/api/visitor/v2/visiting/records";
         String response = apiUtil.doPost(apiPath, String.valueOf(paramJson), querys);
 
         JsonObject doorEventsJson = new Gson().fromJson(response, JsonObject.class);
@@ -140,4 +137,11 @@ public class Teacher_Student_OutIn_RecordUtil {
         }
     }
 
+    private String ChangeTime(String recordTime) throws ParseException {
+        SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
+        SimpleDateFormat mysqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = isoFormat.parse(recordTime);
+        return mysqlFormat.format(date);
+    }
+
 }

+ 45 - 0
src/main/java/com/xjrsoft/module/job/AttendanceMessageTask.java

@@ -0,0 +1,45 @@
+package com.xjrsoft.module.job;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.utils.DatasourceUtil;
+import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
+import com.xjrsoft.module.attendance.service.IAttendanceMessageSetService;
+import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.List;
+
+/**
+ * 考勤消息通知
+ * @author dzx
+ * @date 2024年5月21日
+ */
+@Component
+@Slf4j
+public class AttendanceMessageTask {
+    @Autowired
+    private IAttendanceMessageSetService messageSetService;
+
+    @Autowired
+    private IAttendanceRuleCategoryService ruleCategoryService;
+    @Scheduled(cron = "0 */15 * * * ?")
+    public void RefreshConnectionPool() {
+        String active = SpringUtil.getActiveProfile();
+        if(!"prod".equals(active)){
+            log.info("非正式环境,无法执行数据推送");
+            return;
+        }
+
+        List<AttendanceRuleDetails> ruleDetails = ruleCategoryService.getTodayRules();
+
+        try {
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+}

+ 57 - 0
src/main/java/com/xjrsoft/module/job/InsertOutInRecordTask.java

@@ -0,0 +1,57 @@
+package com.xjrsoft.module.job;
+
+import cn.hutool.db.Db;
+import cn.hutool.extra.spring.SpringUtil;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.utils.DatasourceUtil;
+import com.xjrsoft.module.hikvision.entity.HikvisionData;
+import com.xjrsoft.module.hikvision.util.DataUtil;
+import com.xjrsoft.module.hikvision.util.Teacher_Student_OutIn_RecordUtil;
+import com.xjrsoft.module.schedule.entity.JianyueData;
+import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.sql.DataSource;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author dzx
+ * @date 2024/5/8
+ */
+@Component
+@Slf4j
+public class InsertOutInRecordTask {
+    @Autowired
+    private FaceImportMapper faceImportMapper;
+
+    Teacher_Student_OutIn_RecordUtil teacherStudentOutInRecordUtil = new Teacher_Student_OutIn_RecordUtil();
+
+    @Scheduled(cron = "0 */15 * * * ?")
+    public void RefreshConnectionPool() {
+        String active = SpringUtil.getActiveProfile();
+        if(!"prod".equals(active)){
+            log.info("非正式环境,无法执行数据推送");
+            return;
+        }
+        log.info("开始推送海康威视基础数据");
+        DataSource datasource = DatasourceUtil.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
+        try {
+            Db use = Db.use(datasource);
+
+            //教师&学生拉取数据
+            teacherStudentOutInRecordUtil.GetDoorEvents(use, faceImportMapper);
+
+            log.info("数据推送完成");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+}
+

+ 13 - 2
src/main/java/com/xjrsoft/module/liteflow/node/ImportStudentFaceNode.java

@@ -1,9 +1,11 @@
 package com.xjrsoft.module.liteflow.node;
 
 import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
 import com.xjrsoft.module.hikvision.util.FaceImportUtil;
 import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
 import com.xjrsoft.module.personnel.service.IStundentFaceProcessService;
+import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import com.yomahub.liteflow.core.NodeComponent;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -17,6 +19,13 @@ import java.util.Map;
 public class ImportStudentFaceNode extends NodeComponent {
     @Autowired
     private IStundentFaceProcessService stundentFaceProcessService;
+
+    @Autowired
+    private HikvisionDataMapper hikvisionDataMapper;
+
+    @Autowired
+    private FaceImportMapper faceImportMapper;
+
     @Override
     public void process() throws Exception {
         // 获取表单中数据编号
@@ -24,14 +33,16 @@ public class ImportStudentFaceNode extends NodeComponent {
         Object value = util.getFormDatKey(params,"id");
         Long formId = Convert.toLong(value);
         if (formId != null) {
+            String fileUrl = faceImportMapper.GetStudentHikvisionImgById(formId);
             // 数据处理
             StundentFaceProcess dataObj = stundentFaceProcessService.getById(formId);
             dataObj.setStatus(1);
             dataObj.setExamStatus(1);
-
+            String result = FaceImportUtil.ImportStudentFace(hikvisionDataMapper.getStudentHikvisionId(dataObj.getUserId()), fileUrl);
+            dataObj.setHikvisionResult(result);
             stundentFaceProcessService.updateById(dataObj);
 
-            FaceImportUtil.ImportStudentFace(formId);
+
         }
     }
 }

+ 13 - 3
src/main/java/com/xjrsoft/module/liteflow/node/ImportTeacherFaceNode.java

@@ -1,8 +1,10 @@
 package com.xjrsoft.module.liteflow.node;
 
 import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
 import com.xjrsoft.module.personnel.entity.TeacherFaceProcess;
 import com.xjrsoft.module.personnel.service.ITeacherFaceProcessService;
+import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import com.yomahub.liteflow.core.NodeComponent;
 import com.xjrsoft.module.hikvision.util.FaceImportUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +21,12 @@ public class ImportTeacherFaceNode extends NodeComponent {
     @Autowired
     private ITeacherFaceProcessService teacherFaceProcessService;
 
+    @Autowired
+    private HikvisionDataMapper hikvisionDataMapper;
+
+    @Autowired
+    private FaceImportMapper faceImportMapper;
+
     @Override
     public void process() throws Exception {
         // 获取表单中数据编号
@@ -26,14 +34,16 @@ public class ImportTeacherFaceNode extends NodeComponent {
         Object value = util.getFormDatKey(params,"id");
         Long formId = Convert.toLong(value);
         if (formId != null) {
+
+            String fileUrl = faceImportMapper.GetTeacherHikvisionImgById(formId);
+
             // 数据处理
             TeacherFaceProcess dataObj = teacherFaceProcessService.getById(formId);
             dataObj.setStatus(1);
             dataObj.setExamStatus(1);
-
+            String reslut = FaceImportUtil.ImportTeacherFace(hikvisionDataMapper.getTeacherHikvisionId(dataObj.getUserId()), fileUrl);
+            dataObj.setHikvisionResult(reslut);
             teacherFaceProcessService.updateById(dataObj);
-
-            FaceImportUtil.ImportTeacherFace(formId);
         }
     }
 }

+ 11 - 0
src/main/java/com/xjrsoft/module/organization/controller/UserController.java

@@ -67,6 +67,7 @@ import com.xjrsoft.module.oss.factory.OssFactory;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.service.IFileService;
+import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import com.xjrsoft.module.workflow.constant.WorkflowConstant;
 import com.xjrsoft.module.workflow.entity.WorkflowExtra;
 import com.xjrsoft.module.workflow.mapper.WorkflowExtraMapper;
@@ -189,11 +190,16 @@ public class UserController {
                     .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 3), BaseStudentSchoolRoll::getGradeId, dto.getTreeId())
                     .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 4), BaseStudentSchoolRoll::getClassId, dto.getTreeId())
                     .eq(ObjectUtil.isNotNull(dto.getUserType()), Role::getId, dto.getUserType())
+                    .eq(ObjectUtil.isNotNull(dto.getEmployType()), BaseTeacher::getEmployType, dto.getEmployType())
+                    .eq(ObjectUtil.isNotNull(dto.getEmployWay()), BaseTeacher::getEmployWay, dto.getEmployWay())
                     .orderByDesc(User::getId)
                     .select(User::getId)
+                    .selectAs(BaseTeacher::getEmployWay, UserPageVo::getEmployWay)
+                    .selectAs(BaseTeacher::getEmployType, UserPageVo::getEmployType)
                     .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
                     .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, User::getId)
                     .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
+                    .leftJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
                     .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
                     .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
             IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class, queryUser);
@@ -232,12 +238,17 @@ public class UserController {
                             .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 2), UserDeptRelation::getDeptId, dto.getTreeId())
                             .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 3), BaseStudentSchoolRoll::getGradeId, dto.getTreeId())
                             .eq((ObjectUtil.isNotNull(dto.getTreeType()) && dto.getTreeType() == 4), BaseStudentSchoolRoll::getClassId, dto.getTreeId())
+                            .eq(ObjectUtil.isNotNull(dto.getEmployType()), BaseTeacher::getEmployType, dto.getEmployType())
+                            .eq(ObjectUtil.isNotNull(dto.getEmployWay()), BaseTeacher::getEmployWay, dto.getEmployWay())
                             .orderByDesc(User::getId)
                             .select(User::getId)
+                            .selectAs(BaseTeacher::getEmployWay, UserPageVo::getEmployWay)
+                            .selectAs(BaseTeacher::getEmployType, UserPageVo::getEmployType)
                             .select(User.class, x -> VoToColumnUtil.fieldsToColumns(UserPageVo.class).contains(x.getProperty()))
                             .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, User::getId)
                             .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
                             .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, User::getId)
+                            .leftJoin(BaseTeacher.class, BaseTeacher::getUserId, User::getId)
                             .leftJoin(Role.class, Role::getId, UserRoleRelation::getRoleId);
             IPage<UserPageVo> page = userService.selectJoinListPage(ConventPage.getPage(dto), UserPageVo.class,queryUser);
             for (UserPageVo record : page.getRecords()) {

+ 4 - 0
src/main/java/com/xjrsoft/module/organization/dto/UserPageDto.java

@@ -39,4 +39,8 @@ public class UserPageDto extends PageInput {
 
     @ApiModelProperty("树id")
     private Long treeId;
+
+    private String employType;
+
+    private String employWay;
 }

+ 2 - 0
src/main/java/com/xjrsoft/module/organization/vo/UserPageVo.java

@@ -99,5 +99,7 @@ public class UserPageVo implements Serializable {
 
     private LocalDateTime modifyDate;
 
+    private String employType;
 
+    private String employWay;
 }

+ 0 - 8
src/main/java/com/xjrsoft/module/outint/controller/CarOutInRecordController.java

@@ -1,11 +1,9 @@
 package com.xjrsoft.module.outint.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.xjrsoft.common.model.result.RT;
@@ -20,13 +18,8 @@ import com.xjrsoft.module.outint.service.ICarOutInRecordService;
 import com.xjrsoft.module.outint.vo.CarOutInRecordPageVo;
 import com.xjrsoft.module.outint.vo.CarOutInRecordVo;
 import com.xjrsoft.module.personnel.entity.CarMessageApply;
-import com.xjrsoft.module.personnel.entity.ReservationSchool;
 import com.xjrsoft.module.personnel.entity.ReservationSchoolPeople;
-import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
-import com.xjrsoft.module.personnel.vo.ReservationSchoolVisitorPageVo;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
-import com.xjrsoft.module.system.entity.File;
-import com.xjrsoft.module.teacher.entity.XjrUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -78,7 +71,6 @@ public class CarOutInRecordController {
                         .select(CarMessageApply::getVehicleType)
                         .leftJoin(ReservationSchoolPeople.class,ReservationSchoolPeople::getId,CarOutInRecord::getReservationSchoolPeopleId)
                         .leftJoin(CarMessageApply.class,CarMessageApply::getId,CarOutInRecord::getCarMessageApplyId)
-                        .leftJoin(File.class,File::getFolderId, CarOutInRecord::getFacePhoto,ext->ext.selectAs(File::getFileUrl,CarOutInRecordPageVo::getFacePhotoUrl))
                         .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, ReservationSchoolPeople::getGender, ext->ext.selectAs(DictionaryDetail::getName, CarOutInRecordPageVo::getGender))
                 );
 

+ 0 - 5
src/main/java/com/xjrsoft/module/outint/controller/StudentOutInRecordController.java

@@ -4,7 +4,6 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
@@ -17,14 +16,11 @@ import com.xjrsoft.module.outint.dto.AddStudentOutInRecordDto;
 import com.xjrsoft.module.outint.dto.StudentOutInRecordPageDto;
 import com.xjrsoft.module.outint.dto.UpdateStudentOutInRecordDto;
 import com.xjrsoft.module.outint.entity.StudentOutInRecord;
-import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
 import com.xjrsoft.module.outint.service.IStudentOutInRecordService;
 import com.xjrsoft.module.outint.vo.StudentOutInRecordPageVo;
 import com.xjrsoft.module.outint.vo.StudentOutInRecordVo;
-import com.xjrsoft.module.outint.vo.TeacherOutInRecordPageVo;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
-import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -79,7 +75,6 @@ public class StudentOutInRecordController {
                 .leftJoin(BaseStudentSchoolRoll.class,BaseStudentSchoolRoll::getUserId,StudentOutInRecord::getUserId)
                 .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, XjrUser::getGender, ext->ext.selectAs(DictionaryDetail::getName, StudentOutInRecordPageVo::getGender))
                 .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, BaseStudentSchoolRoll::getStduyStatus, ext->ext.selectAs(DictionaryDetail::getName, StudentOutInRecordPageVo::getStduyStatusCn))
-                .leftJoin(File.class,File::getFolderId, StudentOutInRecord::getFacePhoto, ext->ext.selectAs(File::getFileUrl, StudentOutInRecordPageVo::getFacePhotoUrl))
                 ;
         IPage<StudentOutInRecordPageVo> page = studentOutInRecordService.selectJoinListPage(ConventPage.getPage(dto),StudentOutInRecordPageVo.class, queryWrapper);
         PageOutput<StudentOutInRecordPageVo> pageOutput = ConventPage.getPageOutput(page, StudentOutInRecordPageVo.class);

+ 1 - 10
src/main/java/com/xjrsoft/module/outint/controller/TeacherOutInRecordController.java

@@ -4,9 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.github.yulichang.interfaces.MPJBaseJoin;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.model.result.RT;
@@ -18,16 +16,10 @@ import com.xjrsoft.module.outint.dto.AddTeacherOutInRecordDto;
 import com.xjrsoft.module.outint.dto.TeacherOutInRecordPageDto;
 import com.xjrsoft.module.outint.dto.UpdateTeacherOutInRecordDto;
 import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
-import com.xjrsoft.module.outint.entity.VisitorOutInRecord;
 import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
 import com.xjrsoft.module.outint.vo.TeacherOutInRecordPageVo;
 import com.xjrsoft.module.outint.vo.TeacherOutInRecordVo;
-import com.xjrsoft.module.outint.vo.VisitorOutInRecordPageVo;
-import com.xjrsoft.module.personnel.entity.ReservationSchool;
-import com.xjrsoft.module.personnel.entity.ReservationSchoolPeople;
-import com.xjrsoft.module.student.entity.BaseStudentAssessmentProject;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
-import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -74,10 +66,9 @@ public class TeacherOutInRecordController {
                 .select(TeacherOutInRecord.class,x -> VoToColumnUtil.fieldsToColumns(TeacherOutInRecordPageVo.class).contains(x.getProperty()))
                 .select(XjrUser::getName,XjrUser::getMobile,XjrUser::getCredentialNumber)
                 .leftJoin(XjrUser.class,XjrUser::getId,TeacherOutInRecord::getUserId)
-                .leftJoin(File.class,File::getFolderId, TeacherOutInRecord::getFacePhoto, ext->ext.selectAs(File::getFileUrl, TeacherOutInRecordPageVo::getFacePhotoUrl))
                 .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, XjrUser::getGender, ext->ext.selectAs(DictionaryDetail::getName, TeacherOutInRecordPageVo::getGender));
 
-        if(ObjectUtil.isNotNull(dto.getDeptId())&&dto.getDeptId()!=0){
+        if(ObjectUtil.isNotNull(dto.getDeptId()) && dto.getDeptId() != 0){
             queryWrapper.leftJoin(UserDeptRelation.class,UserDeptRelation::getUserId,XjrUser::getId)
                     .eq(UserDeptRelation::getDeptId,dto.getDeptId());
         }

+ 0 - 9
src/main/java/com/xjrsoft/module/outint/controller/VisitorOutInRecordController.java

@@ -4,7 +4,6 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.toolkit.MPJWrappers;
 import com.xjrsoft.common.model.result.RT;
@@ -15,18 +14,13 @@ import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.outint.dto.AddVisitorOutInRecordDto;
 import com.xjrsoft.module.outint.dto.UpdateVisitorOutInRecordDto;
 import com.xjrsoft.module.outint.dto.VisitorOutInRecordPageDto;
-import com.xjrsoft.module.outint.entity.CarOutInRecord;
 import com.xjrsoft.module.outint.entity.VisitorOutInRecord;
 import com.xjrsoft.module.outint.service.IVisitorOutInRecordService;
-import com.xjrsoft.module.outint.vo.CarOutInRecordPageVo;
 import com.xjrsoft.module.outint.vo.VisitorOutInRecordPageVo;
 import com.xjrsoft.module.outint.vo.VisitorOutInRecordVo;
-import com.xjrsoft.module.personnel.entity.CarMessageApply;
 import com.xjrsoft.module.personnel.entity.ReservationSchool;
 import com.xjrsoft.module.personnel.entity.ReservationSchoolPeople;
-import com.xjrsoft.module.personnel.vo.ReservationSchoolVisitorPageVo;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
-import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -78,9 +72,6 @@ public class VisitorOutInRecordController {
                         .select(ReservationSchool::getReason)
                         .leftJoin(ReservationSchoolPeople.class,ReservationSchoolPeople::getId,VisitorOutInRecord::getReservationSchoolPeopleId)
                         .leftJoin(ReservationSchool.class,ReservationSchool::getId,ReservationSchoolPeople::getReservationSchooId)
-
-                        .leftJoin(File.class,File::getFolderId, VisitorOutInRecord::getFacePhoto, ext->ext.selectAs(File::getFileUrl, VisitorOutInRecordPageVo::getFacePhotoUrl))
-
                         .leftJoin(XjrUser.class,XjrUser::getId,ReservationSchool::getRespondentUserId,ext->ext.selectAs(XjrUser::getName,VisitorOutInRecordPageVo::getRespondentUserCn))
                         .leftJoin(Department.class,Department::getId,ReservationSchool::getDeptId,ext->ext.selectAs(Department::getName,VisitorOutInRecordPageVo::getDeptCn))
                         .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, ReservationSchoolPeople::getGender, ext->ext.selectAs(DictionaryDetail::getName, VisitorOutInRecordPageVo::getGender))

+ 3 - 1
src/main/java/com/xjrsoft/module/outint/entity/StudentOutInRecord.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;
 
 
@@ -88,7 +89,8 @@ public class StudentOutInRecord implements Serializable {
     * 记录时间
     */
     @ApiModelProperty("记录时间")
-    private String recordTime;
+    private LocalDateTime recordTime;
+
     /**
     * 人脸照片
     */

+ 3 - 2
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,12 +79,12 @@ public class TeacherOutInRecord implements Serializable {
     * 记录时间
     */
     @ApiModelProperty("记录时间")
-    private String recordTime;
+    private LocalDateTime recordTime;
     /**
     * 人脸照片
     */
     @ApiModelProperty("人脸照片")
-    private Long facePhoto;
+    private String facePhoto;
     /**
     * 进出状态(0:进 1:出)
     */

+ 4 - 4
src/main/java/com/xjrsoft/module/outint/vo/StudentOutInRecordPageVo.java

@@ -73,7 +73,7 @@ public class StudentOutInRecordPageVo {
     * 人脸照片
     */
     @ApiModelProperty("人脸照片")
-    private Long facePhoto;
+    private String facePhoto;
     /**
     * 进出状态(0:进 1:出)
     */
@@ -116,8 +116,8 @@ public class StudentOutInRecordPageVo {
     @ApiModelProperty("班级")
     private String classCn;
     /**
-     * 班主
+     * 班主
      */
-    @ApiModelProperty("班主")
-    private Long teacherCn;
+    @ApiModelProperty("班主")
+    private String teacherCn;
 }

+ 24 - 15
src/main/java/com/xjrsoft/module/personnel/controller/CarMessageApplyController.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.toolkit.MPJWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
@@ -19,6 +20,8 @@ import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.app.dto.UpdateEnableMarkDto;
 import com.xjrsoft.module.app.entity.AppFuncDesign;
 import com.xjrsoft.module.app.entity.AppMenu;
+import com.xjrsoft.module.attendance.entity.StudentAttendanceRecord;
+import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.personnel.dto.AddCarMessageApplyDto;
 import com.xjrsoft.module.personnel.dto.UpdateCarMessageApplyDto;
 import cn.dev33.satoken.annotation.SaCheckPermission;
@@ -64,20 +67,26 @@ public class CarMessageApplyController {
     @ApiOperation(value="车辆信息审核列表(分页)")
     @SaCheckPermission("carmessageapply:detail")
     public RT<PageOutput<CarMessageApplyPageVo>> page(@Valid CarMessageApplyPageDto dto){
-        IPage<CarMessageApplyPageVo> page = carMessageApplyService.selectJoinListPage(ConventPage.getPage(dto), CarMessageApplyPageVo.class,
-                MPJWrappers.<CarMessageApply>lambdaJoin()
-                        .orderByDesc(CarMessageApply::getId)
-                        .disableSubLogicDel()
-                        .like(StrUtil.isNotBlank(dto.getName()), XjrUser::getName,dto.getName())
-                        .eq(StrUtil.isNotBlank(dto.getUserName()), XjrUser::getUserName,dto.getUserName())
-                        .like(StrUtil.isNotBlank(dto.getMobile()),XjrUser::getMobile,dto.getMobile())
-                        .eq(ObjectUtil.isNotNull(dto.getDepId())&&dto.getDepId()!=0, CarMessageApply::getDeptId,dto.getDepId())
-                        .eq(ObjectUtil.isNotNull(dto.getStatus())&&dto.getStatus()!=0, CarMessageApply::getStatus,dto.getStatus())
-                        .select(CarMessageApply.class,x -> VoToColumnUtil.fieldsToColumns(CarMessageApplyPageVo.class).contains(x.getProperty()))
-                        .select(CarMessageApply::getId)
-                        .leftJoin(XjrUser.class,XjrUser::getId,CarMessageApply::getUserId, ext->ext.selectAs(XjrUser::getUserName, CarMessageApplyPageVo::getUserName).select(XjrUser::getMobile))
-                        .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,CarMessageApply::getGender, ext->ext.selectAs(DictionaryDetail::getName, CarMessageApplyPageVo::getGender))
-                );
+
+        MPJLambdaWrapper<CarMessageApply> queryWrapper =  MPJWrappers.<CarMessageApply>lambdaJoin()
+                .orderByDesc(CarMessageApply::getId)
+                .disableSubLogicDel()
+                .like(StrUtil.isNotBlank(dto.getName()), XjrUser::getName,dto.getName())
+                .eq(StrUtil.isNotBlank(dto.getUserName()), XjrUser::getUserName,dto.getUserName())
+                .like(StrUtil.isNotBlank(dto.getMobile()),XjrUser::getMobile,dto.getMobile())
+                .eq(ObjectUtil.isNotNull(dto.getStatus())&&dto.getStatus()!=0, CarMessageApply::getStatus,dto.getStatus())
+                .select(CarMessageApply.class,x -> VoToColumnUtil.fieldsToColumns(CarMessageApplyPageVo.class).contains(x.getProperty()))
+                .select(CarMessageApply::getId)
+                .leftJoin(XjrUser.class,XjrUser::getId,CarMessageApply::getUserId, ext->ext.selectAs(XjrUser::getUserName, CarMessageApplyPageVo::getUserName).select(XjrUser::getMobile))
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,CarMessageApply::getGender, ext->ext.selectAs(DictionaryDetail::getName, CarMessageApplyPageVo::getGender))
+                ;
+
+        if(ObjectUtil.isNotNull(dto.getDepId())&&dto.getDepId()!=0) { // 要用用户关联部门查询
+            queryWrapper.leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, CarMessageApply::getUserId)
+                    .eq(UserDeptRelation::getDeptId, dto.getDepId());
+        }
+
+        IPage<CarMessageApplyPageVo> page = carMessageApplyService.selectJoinListPage(ConventPage.getPage(dto), CarMessageApplyPageVo.class,queryWrapper);
         PageOutput<CarMessageApplyPageVo> pageOutput = ConventPage.getPageOutput(page, CarMessageApplyPageVo.class);
         return RT.ok(pageOutput);
     }
@@ -90,7 +99,7 @@ public class CarMessageApplyController {
                 MPJWrappers.<CarMessageApply>lambdaJoin()
                         .orderByDesc(CarMessageApply::getId)
                         .eq(CarMessageApply::getUserId, StpUtil.getLoginIdAsLong())
-                        .eq(CarMessageApply::getExamStatus,1)
+                        .eq(CarMessageApply::getStatus,1)
                         .select(CarMessageApply::getId)
                         .select(CarMessageApply.class,x -> VoToColumnUtil.fieldsToColumns(CarMessageApplyPageVo.class).contains(x.getProperty())));
         return RT.ok(list);

+ 1 - 2
src/main/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessController.java

@@ -205,7 +205,6 @@ public class StundentFaceProcessController {
         JsonParser parser = new JsonParser();
 
         ApiUtil apiUtil = new ApiUtil();
-        Long folderId = IdWorker.getId();
         ZipFile zipFile = FileZipUtil.convertToZipFile(file);
         Enumeration<? extends ZipEntry> entries = zipFile.entries();
         while (entries.hasMoreElements()){
@@ -236,7 +235,7 @@ public class StundentFaceProcessController {
             //存入数据库
             long fileId = IdUtil.getSnowflakeNextId();
             String suffix = StringUtils.substringAfterLast(filename, StringPool.DOT);
-
+            Long folderId = IdWorker.getId();
             File fileEntity = new File();
             fileEntity.setId(fileId);
             fileEntity.setFolderId(folderId);

+ 24 - 16
src/main/java/com/xjrsoft/module/personnel/controller/TeacherFaceProcessController.java

@@ -14,11 +14,13 @@ import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.personnel.dto.AddTeacherFaceProcessDto;
 import com.xjrsoft.module.personnel.dto.UpdateTeacherFaceProcessDto;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 
 import com.xjrsoft.module.personnel.dto.TeacherFaceProcessPageDto;
+import com.xjrsoft.module.personnel.entity.CarMessageApply;
 import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
 import com.xjrsoft.module.personnel.entity.TeacherFaceProcess;
 import com.xjrsoft.module.personnel.service.ITeacherFaceProcessService;
@@ -62,22 +64,28 @@ public class TeacherFaceProcessController {
         if(ObjectUtil.isNull(dto.getStatus())){
             dto.setStatus(1);
         }
-        IPage<TeacherFaceProcessPageVo> page=teacherFaceProcessService.selectJoinListPage(ConventPage.getPage(dto),TeacherFaceProcessPageVo.class,
-                MPJWrappers.<TeacherFaceProcess>lambdaJoin()
-                        .orderByDesc(TeacherFaceProcess::getId)
-                        .disableSubLogicDel()
-                        .like(StrUtil.isNotBlank(dto.getName()),XjrUser::getName,dto.getName())
-                        .like(StrUtil.isNotBlank(dto.getUserName()),XjrUser::getUserName,dto.getUserName())
-                        .like(StrUtil.isNotBlank(dto.getMobile()),XjrUser::getMobile,dto.getMobile())
-                        .eq(ObjectUtil.isNotNull(dto.getDepId())&&dto.getDepId()!=0,TeacherFaceProcess::getDepId,dto.getDepId())
-                        .eq(TeacherFaceProcess::getExamStatus,dto.getStatus())
-                        .select(TeacherFaceProcess::getId,TeacherFaceProcess::getUserId,TeacherFaceProcess::getDepId,TeacherFaceProcess::getFacePhoto)
-                        .innerJoin(XjrUser.class,XjrUser::getId, TeacherFaceProcess::getUserId)
-                        .leftJoin(File.class,File::getFolderId,TeacherFaceProcess::getFacePhoto)
-                        .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,TeacherFaceProcess::getGender, ext->ext.selectAs(DictionaryDetail::getName, TeacherFaceProcessPageVo::getGender))
-                        .selectAs(XjrUser::getName,TeacherFaceProcessPageVo::getName)
-                        .select("t2.file_url AS face_photo_url,t1.user_name AS user_name,t1.mobile")
-        );
+
+        MPJLambdaWrapper<TeacherFaceProcess> queryWrapper =MPJWrappers.<TeacherFaceProcess>lambdaJoin()
+                .orderByDesc(TeacherFaceProcess::getId)
+                .disableSubLogicDel()
+                .like(StrUtil.isNotBlank(dto.getName()),XjrUser::getName,dto.getName())
+                .like(StrUtil.isNotBlank(dto.getUserName()),XjrUser::getUserName,dto.getUserName())
+                .like(StrUtil.isNotBlank(dto.getMobile()),XjrUser::getMobile,dto.getMobile())
+                .eq(TeacherFaceProcess::getExamStatus,dto.getStatus())
+                .select(TeacherFaceProcess::getId,TeacherFaceProcess::getUserId,TeacherFaceProcess::getDepId,TeacherFaceProcess::getFacePhoto)
+                .innerJoin(XjrUser.class,XjrUser::getId, TeacherFaceProcess::getUserId)
+                .leftJoin(File.class,File::getFolderId,TeacherFaceProcess::getFacePhoto)
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,TeacherFaceProcess::getGender, ext->ext.selectAs(DictionaryDetail::getName, TeacherFaceProcessPageVo::getGender))
+                .selectAs(XjrUser::getName,TeacherFaceProcessPageVo::getName)
+                .select("t2.file_url AS face_photo_url,t1.user_name AS user_name,t1.mobile")
+                ;
+
+        if(ObjectUtil.isNotNull(dto.getDepId())&&dto.getDepId()!=0) { // 要用用户关联部门查询
+            queryWrapper.leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, TeacherFaceProcess::getUserId)
+                    .eq(UserDeptRelation::getDeptId, dto.getDepId());
+        }
+
+        IPage<TeacherFaceProcessPageVo> page=teacherFaceProcessService.selectJoinListPage(ConventPage.getPage(dto),TeacherFaceProcessPageVo.class,queryWrapper);
 
         PageOutput<TeacherFaceProcessPageVo> pageOutput = ConventPage.getPageOutput(page, TeacherFaceProcessPageVo.class);
         return RT.ok(pageOutput);

+ 5 - 0
src/main/java/com/xjrsoft/module/personnel/mapper/ReservationSchoolMapper.java

@@ -2,8 +2,12 @@ package com.xjrsoft.module.personnel.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.attendance.vo.VisitorInfoVo;
 import com.xjrsoft.module.personnel.entity.ReservationSchool;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
 * @title: 预约进校
@@ -14,4 +18,5 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface ReservationSchoolMapper extends MPJBaseMapper<ReservationSchool> {
 
+    List<VisitorInfoVo> getVisionList(@Param("date") String date);
 }

+ 5 - 0
src/main/java/com/xjrsoft/module/personnel/service/IReservationSchoolService.java

@@ -2,8 +2,11 @@ package com.xjrsoft.module.personnel.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.attendance.vo.VisitorInfoVo;
 import com.xjrsoft.module.personnel.entity.ReservationSchool;
 import lombok.Data;
+import org.apache.ibatis.annotations.Param;
+
 import java.util.List;
 
 /**
@@ -44,4 +47,6 @@ public interface IReservationSchoolService extends MPJBaseService<ReservationSch
      * @return
      */
     Boolean registration(ReservationSchool dataObj);
+
+    List<VisitorInfoVo> getVisionList(String date);
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/personnel/service/impl/ReservationSchoolServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.google.gson.JsonObject;
 import com.xjrsoft.common.enums.GenderIntEnum;
+import com.xjrsoft.module.attendance.vo.VisitorInfoVo;
 import com.xjrsoft.module.hikvision.entity.HikvisionData;
 import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
@@ -142,4 +143,9 @@ public class ReservationSchoolServiceImpl extends MPJBaseServiceImpl<Reservation
 
         return true;
     }
+
+    @Override
+    public List<VisitorInfoVo> getVisionList(String date) {
+        return reservationSchoolMapper.getVisionList(date);
+    }
 }

+ 7 - 2
src/main/java/com/xjrsoft/module/student/mapper/StudentLeaveMapper.java

@@ -4,13 +4,18 @@ import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.student.entity.StudentDropOut;
 import com.xjrsoft.module.student.entity.StudentLeave;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDateTime;
 
 /**
-* @title: 退学申请
+* @title: 学生请假
 * @Author dzx
-* @Date: 2024年4月17日
+* @Date: 2024年5月27日
 * @Version 1.0
 */
 @Mapper
 public interface StudentLeaveMapper extends MPJBaseMapper<StudentLeave> {
+
+    Long getLeaveCount(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/student/service/IStudentLeaveService.java

@@ -3,6 +3,8 @@ package com.xjrsoft.module.student.service;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.student.entity.StudentLeave;
 
+import java.time.LocalDateTime;
+
 /**
 * @title: 学生荣誉
 * @Author dzx
@@ -13,4 +15,6 @@ import com.xjrsoft.module.student.entity.StudentLeave;
 public interface IStudentLeaveService extends MPJBaseService<StudentLeave> {
 
     Boolean hikvisionLeave(Long id);
+
+    Long getLeaveCount(LocalDateTime startTime, LocalDateTime endTime);
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/student/service/impl/StudentLeaveServiceImpl.java

@@ -15,6 +15,7 @@ import com.xjrsoft.module.student.service.IStudentLeaveService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.HashMap;
 import java.util.Map;
@@ -75,6 +76,11 @@ public class StudentLeaveServiceImpl extends MPJBaseServiceImpl<StudentLeaveMapp
         return true;
     }
 
+    @Override
+    public Long getLeaveCount(LocalDateTime startTime, LocalDateTime endTime) {
+        return null;
+    }
+
     JsonArray selectResource(ApiUtil apiUtil){
         String apiPath = "/api/irds/v2/resource/resourcesByParams";
         JsonObject jsonObject = new JsonObject();

+ 4 - 3
src/main/java/com/xjrsoft/module/teacher/controller/TeacherbaseManagerController.java

@@ -7,12 +7,14 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.attendance.entity.StudentAttendanceRecord;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.organization.service.IUserDeptRelationService;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
@@ -63,8 +65,7 @@ public class TeacherbaseManagerController {
     @SaCheckPermission("teacherbasemanager:detail")
     public R page(@Valid XjrUserPageDto dto){
 
-        MPJLambdaWrapper<XjrUser> queryWrapper = new MPJLambdaWrapper<>();
-        queryWrapper
+        MPJLambdaWrapper<XjrUser> queryWrapper = MPJWrappers.<XjrUser>lambdaJoin()
                 .disableSubLogicDel()
                 .like(StrUtil.isNotBlank(dto.getUserName()),XjrUser::getUserName,dto.getUserName())
                 .like(StrUtil.isNotBlank(dto.getMobile()),XjrUser::getMobile,dto.getMobile())
@@ -81,7 +82,7 @@ public class TeacherbaseManagerController {
                 .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, XjrUser::getId)
                 .selectAsClass(BaseTeacher.class, XjrUserPageVo.class);
 
-        IPage<XjrUser> page = teacherbaseManagerService.page(ConventPage.getPage(dto), queryWrapper);
+        IPage<XjrUserPageVo> page = teacherbaseManagerService.selectJoinListPage(ConventPage.getPage(dto),XjrUserPageVo.class, queryWrapper);
 
         PageOutput<XjrUserPageVo> pageOutput = ConventPage.getPageOutput(page, XjrUserPageVo.class);
 

+ 10 - 1
src/main/java/com/xjrsoft/module/teacher/mapper/FaceImportMapper.java

@@ -3,6 +3,8 @@ package com.xjrsoft.module.teacher.mapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 
 @Mapper
 public interface FaceImportMapper {
@@ -12,6 +14,13 @@ public interface FaceImportMapper {
     String GetStudentUserIdById(@Param("id") Long id);
     String GetStudentHikvisionImgById(@Param("id") Long id);
 
-    Long GetHikvisonPersonId(@Param("id") Long id);
+    String GetHikvisonPersonId(@Param("id") String id);
+
+    String IsStudentTypeByPersonId(@Param("id") Long id);
+    Long GetTeacherIdByPersonId(@Param("id") Long id);
+    Long GetClassIdByPersonId(@Param("id") Long id);
+
+    List<String> GetStudentUrlList();
+    List<String> GetTeacherUrlList();
 }
 

+ 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();

+ 5 - 0
src/main/java/com/xjrsoft/module/teacher/vo/XjrUserPageVo.java

@@ -78,5 +78,10 @@ public class XjrUserPageVo {
      */
     @ApiModelProperty("聘用方式")
     private String employWay;
+    /**
+     * 手机号
+     */
+    @ApiModelProperty("手机号")
+    private String mobile;
 
 }

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

@@ -0,0 +1,30 @@
+<?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.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.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}
+    </select>
+</mapper>

+ 13 - 0
src/main/resources/mapper/hikvision/HikvisionDataMapper.xml

@@ -0,0 +1,13 @@
+<?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.hikvision.mapper.HikvisionDataMapper">
+    <select id="getTeacherHikvisionId" parameterType="long" resultType="java.lang.String">
+        SELECT hikvision_id FROM hikvision_data WHERE source_id = #{id} AND table_name = 'base_teacher'
+    </select>
+    <select id="getStudentHikvisionId" parameterType="long" resultType="java.lang.String">
+        SELECT hikvision_id FROM hikvision_data WHERE source_id = #{id} AND table_name = 'base_student'
+    </select>
+
+</mapper>

+ 15 - 0
src/main/resources/mapper/personnel/ReservationSchoolMapper.xml

@@ -0,0 +1,15 @@
+<?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.personnel.mapper.ReservationSchoolMapper">
+    <select id="getVisionList" resultType="com.xjrsoft.module.attendance.vo.VisitorInfoVo">
+        SELECT t1.name,t1.identity_card,t1.phone,t3.name AS respondent_user_name,t2.reason,t4.name AS dept_name,t2.start_time,t2.end_time,t2.create_date FROM reservation_school_people t1
+        INNER JOIN reservation_school t2 ON t1.reservation_schoo_id = t2.id
+        LEFT JOIN xjr_user t3 ON t2.respondent_user_id = t3.id
+        LEFT JOIN xjr_department t4 ON t2.dept_id = t4.id
+        WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t2.status = 1
+        AND #{date} between start_time and end_time
+    </select>
+
+</mapper>

+ 17 - 0
src/main/resources/mapper/student/StudentLeaveMapper.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.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
+        WHERE t1.status = 1 AND t2.delete_mark = 0
+          AND (
+                (start_date BETWEEN #{startTime} and #{endTime})
+                OR (end_date BETWEEN #{startTime} and #{endTime})
+                OR (start_date > #{startTime} and #{endTime} > end_date)
+                OR (#{startTime} > start_date and end_date > #{endTime})
+            )
+    </select>
+</mapper>

+ 39 - 9
src/main/resources/mapper/teacher/TeacherFaceImportMapper.xml

@@ -4,12 +4,7 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.xjrsoft.module.teacher.mapper.FaceImportMapper">
     <select id="GetTeacherUserIdById" parameterType="long" resultType="java.lang.String">
-        select t.user_id
-        from teacher_face_process t
-        <if test="id != null">
-            where t.id = #{id}
-        </if>
-        and t.status = 1
+        select t.user_id from teacher_face_process t where t.id = #{id}
     </select>
 
     <select id="GetTeacherHikvisionImgById" parameterType="long" resultType="java.lang.String">
@@ -19,7 +14,6 @@
         <if test="id != null">
             where t.id = #{id}
         </if>
-        and t.status = 1
     </select>
 
     <select id="GetStudentUserIdById" parameterType="long" resultType="java.lang.String">
@@ -41,13 +35,49 @@
         and t.status = 1
     </select>
 
-    <select id="GetHikvisonPersonId" parameterType="long" resultType="java.lang.Long">
+    <select id="GetHikvisonPersonId" parameterType="string" resultType="java.lang.String">
         select t.hikvision_id
         from hikvision_data t
-        left join car_message_apply t1 on t1.user_id = t.source_id
+        left join car_message_apply t1 on t1.id = t.source_id
         <if test="id != null">
             where t1.id = #{id}
         </if>
         and t1.status = 1
     </select>
+
+    <select id="IsStudentTypeByPersonId" parameterType="long" resultType="java.lang.String">
+        select t.nick_name
+        from xjr_user t
+        <if test="id != null">
+            where t.id = #{id}
+        </if>
+    </select>
+
+    <select id="GetTeacherIdByPersonId" parameterType="long" resultType="java.lang.Long">
+        select t1.teacher_id
+        from base_student_school_roll t
+        left join base_class t1 on t.class_id = t1.id
+        <if test="id != null">
+            where t.user_id = #{id}
+        </if>
+    </select>
+
+    <select id="GetClassIdByPersonId" parameterType="long" resultType="java.lang.Long">
+        select t1.id
+        from base_student_school_roll t
+        left join base_class t1 on t.class_id = t1.id
+        <if test="id != null">
+            where t.user_id = #{id}
+        </if>
+    </select>
+
+    <select id="GetStudentUrlList"  resultType="java.lang.String">
+        select t.eventId
+        from student_out_in_record t
+    </select>
+
+    <select id="GetTeacherUrlList"  resultType="java.lang.String">
+        select t.eventId
+        from teacher_out_in_record t
+    </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_start_time > #{startTime} and #{endTime} > leave_end_time)
+        OR (#{startTime} > leave_start_time and leave_end_time > #{endTime})
+        )
+    </select>
+</mapper>

+ 26 - 0
src/test/java/com/xjrsoft/module/job/AttendanceMessageTaskTest.java

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.job;
+
+import org.junit.jupiter.api.Test;
+
+import java.time.DayOfWeek;
+import java.time.LocalDateTime;
+import java.time.format.TextStyle;
+import java.util.Locale;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * @author dzx
+ * @date 2024/5/23
+ */
+class AttendanceMessageTaskTest {
+
+    @Test
+    void test(){
+        LocalDateTime now = LocalDateTime.now();
+        DayOfWeek dayOfWeek = now.getDayOfWeek();
+
+        String dayName = dayOfWeek.getDisplayName(TextStyle.FULL, Locale.getDefault());
+        System.out.println("今天是:" + dayOfWeek.name());
+    }
+}

+ 11 - 3
src/test/java/com/xjrsoft/module/job/HikvisionBaseDataTaskTest.java

@@ -8,6 +8,7 @@ import com.google.gson.JsonParser;
 import com.xjrsoft.XjrSoftApplication;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.utils.DatasourceUtil;
+import com.xjrsoft.module.evaluate.controller.EvaluateItemController;
 import com.xjrsoft.module.hikvision.entity.HikvisionData;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
 import com.xjrsoft.module.hikvision.util.DataUtil;
@@ -15,8 +16,10 @@ import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.schedule.entity.JianyueData;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
+import com.xjrsoft.module.hikvision.util.Teacher_Student_OutIn_RecordUtil;
 import lombok.var;
 import org.junit.jupiter.api.Test;
+import org.junit.platform.commons.logging.LoggerFactory;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
@@ -30,6 +33,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.logging.Logger;
 
 /**
  * @author dzx
@@ -41,6 +45,9 @@ class HikvisionBaseDataTaskTest {
     @Autowired
     private FaceImportMapper faceImportMapper;
 
+    @Autowired
+    EvaluateItemController evaluateItemController;
+
     @Test
     void test() throws Exception {
         DataSource datasource = DatasourceUtil.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
@@ -77,9 +84,10 @@ class HikvisionBaseDataTaskTest {
 //
         //推送车辆
 
-        String carTableName = "car_message_apply";
-        Map<String, String> baseClass = dataMap.get(carTableName);
-        dataUtil.insertCar(use, carTableName,baseClass, faceImportMapper);
+//        String carTableName = "car_message_apply";
+//        Map<String, String> baseClass = dataMap.get(carTableName);
+//        dataUtil.insertCar(use, carTableName,baseClass, faceImportMapper);
+
 
 //        tableName = "base_class";
 //        Map<String, String> baseClass = dataMap.get(tableName);

+ 46 - 0
src/test/java/com/xjrsoft/module/liteflow/node/ImportTeacherFaceNodeTest.java

@@ -0,0 +1,46 @@
+package com.xjrsoft.module.liteflow.node;
+
+import com.xjrsoft.XjrSoftApplication;
+import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
+import com.xjrsoft.module.hikvision.util.FaceImportUtil;
+import com.xjrsoft.module.personnel.entity.TeacherFaceProcess;
+import com.xjrsoft.module.personnel.service.ITeacherFaceProcessService;
+import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * @author dzx
+ * @date 2024/5/27
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = XjrSoftApplication.class)
+class ImportTeacherFaceNodeTest {
+
+
+    @Autowired
+    private ITeacherFaceProcessService teacherFaceProcessService;
+    @Autowired
+    private FaceImportMapper faceImportMapper;
+
+    @Autowired
+    private HikvisionDataMapper hikvisionDataMapper;
+    @Test
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Long formId = 1793948095216664576L;
+        if (formId != null) {
+            String fileUrl = faceImportMapper.GetTeacherHikvisionImgById(formId);
+            // 数据处理
+            TeacherFaceProcess dataObj = teacherFaceProcessService.getById(formId);
+            dataObj.setStatus(1);
+            dataObj.setExamStatus(1);
+            String reslut = FaceImportUtil.ImportTeacherFace(hikvisionDataMapper.getTeacherHikvisionId(dataObj.getUserId()), fileUrl);
+            dataObj.setHikvisionResult(reslut);
+            teacherFaceProcessService.updateById(dataObj);
+        }
+    }
+}