ソースを参照

Merge branch 'pre'

dzx 1 年間 前
コミット
4f6230b720
100 ファイル変更6665 行追加32 行削除
  1. 140 0
      src/main/java/com/xjrsoft/module/attendance/controller/AttendanceRuleCategoryController.java
  2. 203 0
      src/main/java/com/xjrsoft/module/attendance/controller/StudentAttendanceRecordController.java
  3. 126 0
      src/main/java/com/xjrsoft/module/attendance/controller/TeacherAttendanceRecordController.java
  4. 79 0
      src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceRuleCategoryDto.java
  5. 168 0
      src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceRuleDetailsDto.java
  6. 40 0
      src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceUserRelationDto.java
  7. 58 0
      src/main/java/com/xjrsoft/module/attendance/dto/AddStudentAttendanceRecordDto.java
  8. 48 0
      src/main/java/com/xjrsoft/module/attendance/dto/AddTeacherAttendanceRecordDto.java
  9. 19 0
      src/main/java/com/xjrsoft/module/attendance/dto/AttendanceRuleCategoryPageDto.java
  10. 37 0
      src/main/java/com/xjrsoft/module/attendance/dto/StudentAttendanceRecordClassPageDto.java
  11. 67 0
      src/main/java/com/xjrsoft/module/attendance/dto/StudentAttendanceRecordPageDto.java
  12. 69 0
      src/main/java/com/xjrsoft/module/attendance/dto/TeacherAttendanceRecordPageDto.java
  13. 24 0
      src/main/java/com/xjrsoft/module/attendance/dto/UpdateAttendanceRuleCategoryDto.java
  14. 32 0
      src/main/java/com/xjrsoft/module/attendance/dto/UpdateStudentAttendanceRecordDto.java
  15. 32 0
      src/main/java/com/xjrsoft/module/attendance/dto/UpdateTeacherAttendanceRecordDto.java
  16. 132 0
      src/main/java/com/xjrsoft/module/attendance/entity/AttendanceRuleCategory.java
  17. 234 0
      src/main/java/com/xjrsoft/module/attendance/entity/AttendanceRuleDetails.java
  18. 94 0
      src/main/java/com/xjrsoft/module/attendance/entity/AttendanceUserRelation.java
  19. 108 0
      src/main/java/com/xjrsoft/module/attendance/entity/StudentAttendanceRecord.java
  20. 102 0
      src/main/java/com/xjrsoft/module/attendance/entity/TeacherAttendanceRecord.java
  21. 24 0
      src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceRuleCategoryMapper.java
  22. 16 0
      src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceRuleDetailsMapper.java
  23. 16 0
      src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceUserRelationMapper.java
  24. 17 0
      src/main/java/com/xjrsoft/module/attendance/mapper/StudentAttendanceRecordMapper.java
  25. 17 0
      src/main/java/com/xjrsoft/module/attendance/mapper/TeacherAttendanceRecordMapper.java
  26. 41 0
      src/main/java/com/xjrsoft/module/attendance/service/IAttendanceRuleCategoryService.java
  27. 17 0
      src/main/java/com/xjrsoft/module/attendance/service/IStudentAttendanceRecordService.java
  28. 17 0
      src/main/java/com/xjrsoft/module/attendance/service/ITeacherAttendanceRecordService.java
  29. 409 0
      src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceRuleCategoryServiceImpl.java
  30. 25 0
      src/main/java/com/xjrsoft/module/attendance/service/impl/StudentAttendanceRecordServiceImpl.java
  31. 25 0
      src/main/java/com/xjrsoft/module/attendance/service/impl/TeacherAttendanceRecordServiceImpl.java
  32. 93 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceRuleCategoryPageVo.java
  33. 79 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceRuleCategoryVo.java
  34. 171 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceRuleDetailsVo.java
  35. 43 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceUserRelationVo.java
  36. 83 0
      src/main/java/com/xjrsoft/module/attendance/vo/StudentAttendanceRecordClassPageVo.java
  37. 123 0
      src/main/java/com/xjrsoft/module/attendance/vo/StudentAttendanceRecordPageVo.java
  38. 59 0
      src/main/java/com/xjrsoft/module/attendance/vo/StudentAttendanceRecordVo.java
  39. 108 0
      src/main/java/com/xjrsoft/module/attendance/vo/TeacherAttendanceRecordPageVo.java
  40. 49 0
      src/main/java/com/xjrsoft/module/attendance/vo/TeacherAttendanceRecordVo.java
  41. 55 0
      src/main/java/com/xjrsoft/module/hikvision/entity/HikvisionData.java
  42. 15 9
      src/main/java/com/xjrsoft/module/hikvision/util/ApiUtil.java
  43. 544 0
      src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java
  44. 67 0
      src/main/java/com/xjrsoft/module/hikvision/util/FaceImportUtil.java
  45. 92 0
      src/main/java/com/xjrsoft/module/job/HikvisionBaseDataTask.java
  46. 36 0
      src/main/java/com/xjrsoft/module/liteflow/node/CarMessageApplyNode.java
  47. 37 0
      src/main/java/com/xjrsoft/module/liteflow/node/ImportStudentFaceNode.java
  48. 38 0
      src/main/java/com/xjrsoft/module/liteflow/node/ImportTeacherFaceNode.java
  49. 37 0
      src/main/java/com/xjrsoft/module/liteflow/node/ReservationSchoolNode.java
  50. 37 0
      src/main/java/com/xjrsoft/module/liteflow/node/StudentAdmissionApplicationNode.java
  51. 31 0
      src/main/java/com/xjrsoft/module/liteflow/node/WfStatusChangeNode.java
  52. 6 0
      src/main/java/com/xjrsoft/module/oa/vo/NewsPageVo.java
  53. 10 5
      src/main/java/com/xjrsoft/module/organization/controller/DepartmentController.java
  54. 27 12
      src/main/java/com/xjrsoft/module/organization/controller/UserController.java
  55. 2 1
      src/main/java/com/xjrsoft/module/organization/dto/AddUserDto.java
  56. 5 0
      src/main/java/com/xjrsoft/module/organization/dto/UpdateUserDto.java
  57. 21 5
      src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java
  58. 53 0
      src/main/java/com/xjrsoft/module/organization/vo/UserDetailVo.java
  59. 4 0
      src/main/java/com/xjrsoft/module/organization/vo/UserInfoVo.java
  60. 4 0
      src/main/java/com/xjrsoft/module/organization/vo/UserVo.java
  61. 128 0
      src/main/java/com/xjrsoft/module/outint/controller/CarOutInRecordController.java
  62. 128 0
      src/main/java/com/xjrsoft/module/outint/controller/StudentOutInRecordController.java
  63. 128 0
      src/main/java/com/xjrsoft/module/outint/controller/TeacherOutInRecordController.java
  64. 131 0
      src/main/java/com/xjrsoft/module/outint/controller/VisitorOutInRecordController.java
  65. 52 0
      src/main/java/com/xjrsoft/module/outint/dto/AddCarOutInRecordDto.java
  66. 52 0
      src/main/java/com/xjrsoft/module/outint/dto/AddStudentOutInRecordDto.java
  67. 42 0
      src/main/java/com/xjrsoft/module/outint/dto/AddTeacherOutInRecordDto.java
  68. 42 0
      src/main/java/com/xjrsoft/module/outint/dto/AddVisitorOutInRecordDto.java
  69. 61 0
      src/main/java/com/xjrsoft/module/outint/dto/CarOutInRecordPageDto.java
  70. 62 0
      src/main/java/com/xjrsoft/module/outint/dto/StudentOutInRecordPageDto.java
  71. 51 0
      src/main/java/com/xjrsoft/module/outint/dto/TeacherOutInRecordPageDto.java
  72. 24 0
      src/main/java/com/xjrsoft/module/outint/dto/UpdateCarOutInRecordDto.java
  73. 24 0
      src/main/java/com/xjrsoft/module/outint/dto/UpdateStudentOutInRecordDto.java
  74. 24 0
      src/main/java/com/xjrsoft/module/outint/dto/UpdateTeacherOutInRecordDto.java
  75. 24 0
      src/main/java/com/xjrsoft/module/outint/dto/UpdateVisitorOutInRecordDto.java
  76. 71 0
      src/main/java/com/xjrsoft/module/outint/dto/VisitorOutInRecordPageDto.java
  77. 104 0
      src/main/java/com/xjrsoft/module/outint/entity/CarOutInRecord.java
  78. 104 0
      src/main/java/com/xjrsoft/module/outint/entity/StudentOutInRecord.java
  79. 94 0
      src/main/java/com/xjrsoft/module/outint/entity/TeacherOutInRecord.java
  80. 94 0
      src/main/java/com/xjrsoft/module/outint/entity/VisitorOutInRecord.java
  81. 16 0
      src/main/java/com/xjrsoft/module/outint/mapper/CarOutInRecordMapper.java
  82. 16 0
      src/main/java/com/xjrsoft/module/outint/mapper/StudentOutInRecordMapper.java
  83. 16 0
      src/main/java/com/xjrsoft/module/outint/mapper/TeacherOutInRecordMapper.java
  84. 16 0
      src/main/java/com/xjrsoft/module/outint/mapper/VisitorOutInRecordMapper.java
  85. 14 0
      src/main/java/com/xjrsoft/module/outint/service/ICarOutInRecordService.java
  86. 14 0
      src/main/java/com/xjrsoft/module/outint/service/IStudentOutInRecordService.java
  87. 14 0
      src/main/java/com/xjrsoft/module/outint/service/ITeacherOutInRecordService.java
  88. 14 0
      src/main/java/com/xjrsoft/module/outint/service/IVisitorOutInRecordService.java
  89. 19 0
      src/main/java/com/xjrsoft/module/outint/service/impl/CarOutInRecordServiceImpl.java
  90. 19 0
      src/main/java/com/xjrsoft/module/outint/service/impl/StudentOutInRecordServiceImpl.java
  91. 19 0
      src/main/java/com/xjrsoft/module/outint/service/impl/TeacherOutInRecordServiceImpl.java
  92. 19 0
      src/main/java/com/xjrsoft/module/outint/service/impl/VisitorOutInRecordServiceImpl.java
  93. 122 0
      src/main/java/com/xjrsoft/module/outint/vo/CarOutInRecordPageVo.java
  94. 53 0
      src/main/java/com/xjrsoft/module/outint/vo/CarOutInRecordVo.java
  95. 123 0
      src/main/java/com/xjrsoft/module/outint/vo/StudentOutInRecordPageVo.java
  96. 53 0
      src/main/java/com/xjrsoft/module/outint/vo/StudentOutInRecordVo.java
  97. 99 0
      src/main/java/com/xjrsoft/module/outint/vo/TeacherOutInRecordPageVo.java
  98. 43 0
      src/main/java/com/xjrsoft/module/outint/vo/TeacherOutInRecordVo.java
  99. 128 0
      src/main/java/com/xjrsoft/module/outint/vo/VisitorOutInRecordPageVo.java
  100. 43 0
      src/main/java/com/xjrsoft/module/outint/vo/VisitorOutInRecordVo.java

+ 140 - 0
src/main/java/com/xjrsoft/module/attendance/controller/AttendanceRuleCategoryController.java

@@ -0,0 +1,140 @@
+package com.xjrsoft.module.attendance.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.attendance.dto.AddAttendanceRuleCategoryDto;
+import com.xjrsoft.module.attendance.dto.AddAttendanceUserRelationDto;
+import com.xjrsoft.module.attendance.dto.AttendanceRuleCategoryPageDto;
+import com.xjrsoft.module.attendance.dto.UpdateAttendanceRuleCategoryDto;
+import com.xjrsoft.module.attendance.entity.AttendanceRuleCategory;
+import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleCategoryPageVo;
+import com.xjrsoft.module.attendance.vo.AttendanceRuleCategoryVo;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.concat.service.IXjrUserService;
+import com.xjrsoft.module.organization.entity.Department;
+import com.xjrsoft.module.organization.service.IDepartmentService;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+* @title: 考勤规则
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/attendance" + "/attendanceRuleCategory")
+@Api(value = "/attendance"  + "/attendanceRuleCategory",tags = "考勤规则代码")
+@AllArgsConstructor
+public class AttendanceRuleCategoryController {
+
+
+    private final IAttendanceRuleCategoryService attendanceRuleCategoryService;
+    private final IBaseClassService classService;
+    private final IDepartmentService departmentService;
+    private final IXjrUserService xjrUserService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="考勤规则列表(分页)")
+    @SaCheckPermission("attendancerulecategory:detail")
+    public RT<PageOutput<AttendanceRuleCategoryPageVo>> page(@Valid AttendanceRuleCategoryPageDto dto){
+
+        LambdaQueryWrapper<AttendanceRuleCategory> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                    .orderByDesc(AttendanceRuleCategory::getId)
+                .select(AttendanceRuleCategory.class,x -> VoToColumnUtil.fieldsToColumns(AttendanceRuleCategoryPageVo.class).contains(x.getProperty()));
+        IPage<AttendanceRuleCategory> page = attendanceRuleCategoryService.page(ConventPage.getPage(dto), queryWrapper);
+        PageOutput<AttendanceRuleCategoryPageVo> pageOutput = ConventPage.getPageOutput(page, AttendanceRuleCategoryPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询考勤规则信息")
+    @SaCheckPermission("attendancerulecategory:detail")
+    public RT<AttendanceRuleCategoryVo> info(@RequestParam Long id){
+        AttendanceRuleCategory attendanceRuleCategory = attendanceRuleCategoryService.getByIdDeep(id);
+        if (attendanceRuleCategory == null) {
+           return RT.error("找不到此数据!");
+        }
+        AttendanceRuleCategoryVo categoryVo = BeanUtil.toBean(attendanceRuleCategory, AttendanceRuleCategoryVo.class);
+        if(attendanceRuleCategory.getUserRelation() != null && !"".equals(attendanceRuleCategory.getUserRelation())){
+            JsonParser parser = new JsonParser();
+            JsonArray asJsonArray = parser.parse(attendanceRuleCategory.getUserRelation()).getAsJsonArray();
+            List<AddAttendanceUserRelationDto> attendanceUserRelationList = new ArrayList<>();
+            for (JsonElement jsonElement : asJsonArray) {
+                AddAttendanceUserRelationDto relationDto = JSONUtil.toBean(jsonElement.getAsJsonObject().toString(), AddAttendanceUserRelationDto.class);
+                if(relationDto.getUserId() != null){
+                    XjrUser xjrUser = xjrUserService.getById(relationDto.getUserId());
+                    if(xjrUser != null){
+                        relationDto.setName(xjrUser.getName());
+                    }
+                }else if(relationDto.getDeptId() != null){
+                    Department department = departmentService.getById(relationDto.getDeptId());
+                    if(department != null){
+                        relationDto.setName(department.getName());
+                    }
+
+                }else if(relationDto.getClassId() != null){
+                    BaseClass aClass = classService.getById(relationDto.getClassId());
+                    if(aClass != null){
+                        relationDto.setName(aClass.getName());
+                    }
+                }
+                attendanceUserRelationList.add(relationDto);
+            }
+            categoryVo.setAttendanceUserRelationList(attendanceUserRelationList);
+        }
+
+        return RT.ok(categoryVo);
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增考勤规则")
+    @SaCheckPermission("attendancerulecategory:add")
+    public RT<Boolean> add(@Valid @RequestBody AddAttendanceRuleCategoryDto dto){
+        boolean isSuccess = attendanceRuleCategoryService.add(dto);
+        return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改考勤规则")
+    @SaCheckPermission("attendancerulecategory:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateAttendanceRuleCategoryDto dto){
+        return RT.ok(attendanceRuleCategoryService.update(dto));
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除考勤规则")
+    @SaCheckPermission("attendancerulecategory:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(attendanceRuleCategoryService.delete(ids));
+    }
+
+}

+ 203 - 0
src/main/java/com/xjrsoft/module/attendance/controller/StudentAttendanceRecordController.java

@@ -0,0 +1,203 @@
+package com.xjrsoft.module.attendance.controller;
+
+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.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.toolkit.MPJWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+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.attendance.dto.AddStudentAttendanceRecordDto;
+import com.xjrsoft.module.attendance.dto.StudentAttendanceRecordClassPageDto;
+import com.xjrsoft.module.attendance.dto.UpdateStudentAttendanceRecordDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+
+import com.xjrsoft.module.attendance.dto.StudentAttendanceRecordPageDto;
+import com.xjrsoft.module.attendance.entity.StudentAttendanceRecord;
+import com.xjrsoft.module.attendance.entity.TeacherAttendanceRecord;
+import com.xjrsoft.module.attendance.service.IStudentAttendanceRecordService;
+import com.xjrsoft.module.attendance.vo.StudentAttendanceRecordClassPageVo;
+import com.xjrsoft.module.attendance.vo.StudentAttendanceRecordPageVo;
+
+import com.xjrsoft.module.attendance.vo.StudentAttendanceRecordVo;
+import com.xjrsoft.module.attendance.vo.TeacherAttendanceRecordPageVo;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+* @title: 学生考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/attendance" + "/studentAttendanceRecord")
+@Api(value = "/attendance"  + "/studentAttendanceRecord",tags = "学生考勤记录代码")
+@AllArgsConstructor
+public class StudentAttendanceRecordController {
+
+
+    private final IStudentAttendanceRecordService studentAttendanceRecordService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="学生考勤记录列表(分页)")
+    @SaCheckPermission("studentattendancerecord:detail")
+    public RT<PageOutput<StudentAttendanceRecordPageVo>> page(@Valid StudentAttendanceRecordPageDto dto){
+
+        MPJLambdaWrapper<StudentAttendanceRecord> queryWrapper =  MPJWrappers.<StudentAttendanceRecord>lambdaJoin()
+                    .orderByDesc(StudentAttendanceRecord::getId)
+                .like(StrUtil.isNotBlank(dto.getName()), XjrUser::getName,dto.getName())
+                .like(StrUtil.isNotBlank(dto.getIdentityCard()), XjrUser::getCredentialNumber,dto.getIdentityCard())
+                .ge(ObjectUtil.isNotNull(dto.getStartTime()), StudentAttendanceRecord::getCreateDate,dto.getStartTime()+" 00:00:00")
+                .le(ObjectUtil.isNotNull(dto.getStartTime()),StudentAttendanceRecord::getCreateDate,dto.getStartTime()+" 23:59:59")
+                .eq(ObjectUtil.isNotNull(dto.getTimeInterval())&&dto.getTimeInterval()!=0, StudentAttendanceRecord::getTimeInterval, dto.getTimeInterval())
+                .eq(ObjectUtil.isNotNull(dto.getClassId())&&dto.getClassId()!=0, StudentAttendanceRecord::getClassId, dto.getClassId())
+                .eq(StrUtil.isNotBlank(dto.getAttendanceStatus()), StudentAttendanceRecord::getAttendanceStatus,dto.getAttendanceStatus())
+                .eq(StrUtil.isNotBlank(dto.getStduyStatus()), StudentAttendanceRecord::getStduyStatus,dto.getStduyStatus())
+                .select(StudentAttendanceRecord::getId)
+                .select(XjrUser::getName,XjrUser::getMobile,XjrUser::getCredentialNumber)
+                .select(StudentAttendanceRecord.class,x -> VoToColumnUtil.fieldsToColumns(StudentAttendanceRecordPageVo.class).contains(x.getProperty()))
+                .leftJoin(XjrUser.class,XjrUser::getId, TeacherOutInRecord::getUserId)
+                .leftJoin(BaseClass.class,BaseClass::getId, StudentAttendanceRecord::getClassId,ext->ext.selectAs(BaseClass::getName,StudentAttendanceRecordPageVo::getClassCn))
+                .leftJoin(XjrUser.class,XjrUser::getId, BaseClass::getTeacherId,ext->ext.selectAs(XjrUser::getName,StudentAttendanceRecordPageVo::getTeacherCn))
+
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, StudentAttendanceRecord::getStduyStatus, ext->ext.selectAs(DictionaryDetail::getName, StudentAttendanceRecordPageVo::getStduyStatusCn))
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, XjrUser::getGender, ext->ext.selectAs(DictionaryDetail::getName, StudentAttendanceRecordPageVo::getGender))
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, StudentAttendanceRecord::getAttendanceStatus, ext->ext.selectAs(DictionaryDetail::getName, StudentAttendanceRecordPageVo::getAttendanceStatusCn))
+                ;
+
+        IPage<StudentAttendanceRecordPageVo> page = studentAttendanceRecordService.selectJoinListPage(ConventPage.getPage(dto),StudentAttendanceRecordPageVo.class, queryWrapper);
+        PageOutput<StudentAttendanceRecordPageVo> pageOutput = ConventPage.getPageOutput(page, StudentAttendanceRecordPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/class-page")
+    @ApiOperation(value="班级考勤记录列表(分页)")
+    @SaCheckPermission("studentattendancerecord:detail")
+    public RT<PageOutput<StudentAttendanceRecordClassPageVo>> classPage(@Valid StudentAttendanceRecordClassPageDto dto){
+
+        MPJLambdaWrapper<StudentAttendanceRecord> queryWrapper = MPJWrappers.<StudentAttendanceRecord>lambdaJoin()
+                .orderByDesc(StudentAttendanceRecord::getId)
+
+                .eq(ObjectUtil.isNotNull(dto.getClassId())&&dto.getClassId()!=0, StudentAttendanceRecord::getClassId, dto.getClassId())
+                .ge(ObjectUtil.isNotNull(dto.getStartTime()), StudentAttendanceRecord::getCreateDate,dto.getStartTime()+" 00:00:00")
+                .le(ObjectUtil.isNotNull(dto.getStartTime()),StudentAttendanceRecord::getCreateDate,dto.getStartTime()+" 23:59:59")
+                .eq(ObjectUtil.isNotNull(dto.getTimeInterval())&&dto.getTimeInterval()!=0, StudentAttendanceRecord::getTimeInterval, dto.getTimeInterval())
+
+                .select(StudentAttendanceRecord::getId)
+                .select(StudentAttendanceRecord.class,x -> VoToColumnUtil.fieldsToColumns(StudentAttendanceRecordClassPageVo.class).contains(x.getProperty()))
+
+                .leftJoin(BaseClass.class,BaseClass::getId, StudentAttendanceRecord::getClassId,ext->ext.selectAs(BaseClass::getName,StudentAttendanceRecordClassPageVo::getClassCn))
+                .leftJoin(XjrUser.class,XjrUser::getId, BaseClass::getTeacherId,ext->ext.selectAs(XjrUser::getName,StudentAttendanceRecordClassPageVo::getTeacherCn))
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, StudentAttendanceRecord::getStduyStatus, ext->ext.selectAs(DictionaryDetail::getName, StudentAttendanceRecordClassPageVo::getAttendanceStatusCn))
+                ;
+        IPage<StudentAttendanceRecordClassPageVo> page = studentAttendanceRecordService.selectJoinListPage(ConventPage.getPage(dto),StudentAttendanceRecordClassPageVo.class, queryWrapper);
+        PageOutput<StudentAttendanceRecordClassPageVo> pageOutput = ConventPage.getPageOutput(page, StudentAttendanceRecordClassPageVo.class);
+        return RT.ok(pageOutput);
+    }
+    @GetMapping(value = "/history-page")
+    @ApiOperation(value="历史考勤记录列表(分页)")
+    @SaCheckPermission("studentattendancerecord:detail")
+    public RT<PageOutput<StudentAttendanceRecordClassPageVo>> historyPage(@Valid StudentAttendanceRecordClassPageDto dto){
+
+        MPJLambdaWrapper<StudentAttendanceRecord> queryWrapper = MPJWrappers.<StudentAttendanceRecord>lambdaJoin()
+                .orderByDesc(StudentAttendanceRecord::getId)
+
+                .eq(ObjectUtil.isNotNull(dto.getClassId())&&dto.getClassId()!=0, StudentAttendanceRecord::getClassId, dto.getClassId())
+                .ge(ObjectUtil.isNotNull(dto.getStartTime()), StudentAttendanceRecord::getCreateDate,dto.getStartTime()+" 00:00:00")
+                .le(ObjectUtil.isNotNull(dto.getStartTime()),StudentAttendanceRecord::getCreateDate,dto.getEndTime()+" 23:59:59")
+
+                .select(StudentAttendanceRecord::getId)
+                .select(StudentAttendanceRecord.class,x -> VoToColumnUtil.fieldsToColumns(StudentAttendanceRecordClassPageVo.class).contains(x.getProperty()))
+
+                .leftJoin(BaseClass.class,BaseClass::getId, StudentAttendanceRecord::getClassId,ext->ext.selectAs(BaseClass::getName,StudentAttendanceRecordClassPageVo::getClassCn))
+                .leftJoin(XjrUser.class,XjrUser::getId, BaseClass::getTeacherId,ext->ext.selectAs(XjrUser::getName,StudentAttendanceRecordClassPageVo::getTeacherCn))
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, StudentAttendanceRecord::getStduyStatus, ext->ext.selectAs(DictionaryDetail::getName, StudentAttendanceRecordClassPageVo::getAttendanceStatusCn))
+                ;
+        IPage<StudentAttendanceRecordClassPageVo> page = studentAttendanceRecordService.selectJoinListPage(ConventPage.getPage(dto),StudentAttendanceRecordClassPageVo.class, queryWrapper);
+        PageOutput<StudentAttendanceRecordClassPageVo> pageOutput = ConventPage.getPageOutput(page, StudentAttendanceRecordClassPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/leaving-school-page")
+    @ApiOperation(value="离校统计列表(分页)")
+    @SaCheckPermission("studentattendancerecord:detail")
+    public RT<PageOutput<StudentAttendanceRecordClassPageVo>> leavingSchoolPage(@Valid StudentAttendanceRecordClassPageDto dto){
+
+        MPJLambdaWrapper<StudentAttendanceRecord> queryWrapper = MPJWrappers.<StudentAttendanceRecord>lambdaJoin()
+                .orderByDesc(StudentAttendanceRecord::getId)
+
+                .eq(ObjectUtil.isNotNull(dto.getClassId())&&dto.getClassId()!=0, StudentAttendanceRecord::getClassId, dto.getClassId())
+                .ge(ObjectUtil.isNotNull(dto.getStartTime()), StudentAttendanceRecord::getCreateDate,dto.getStartTime()+" 00:00:00")
+                .le(ObjectUtil.isNotNull(dto.getStartTime()),StudentAttendanceRecord::getCreateDate,dto.getEndTime()+" 23:59:59")
+                .eq(ObjectUtil.isNotNull(dto.getTimeInterval())&&dto.getTimeInterval()!=0, StudentAttendanceRecord::getTimeInterval, dto.getTimeInterval())
+
+                .select(StudentAttendanceRecord::getId)
+                .select(StudentAttendanceRecord.class,x -> VoToColumnUtil.fieldsToColumns(StudentAttendanceRecordClassPageVo.class).contains(x.getProperty()))
+
+                .leftJoin(BaseClass.class,BaseClass::getId, StudentAttendanceRecord::getClassId,ext->ext.selectAs(BaseClass::getName,StudentAttendanceRecordClassPageVo::getClassCn))
+                .leftJoin(XjrUser.class,XjrUser::getId, BaseClass::getTeacherId,ext->ext.selectAs(XjrUser::getName,StudentAttendanceRecordClassPageVo::getTeacherCn))
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, StudentAttendanceRecord::getStduyStatus, ext->ext.selectAs(DictionaryDetail::getName, StudentAttendanceRecordClassPageVo::getAttendanceStatusCn))
+                ;
+        IPage<StudentAttendanceRecordClassPageVo> page = studentAttendanceRecordService.selectJoinListPage(ConventPage.getPage(dto),StudentAttendanceRecordClassPageVo.class, queryWrapper);
+        PageOutput<StudentAttendanceRecordClassPageVo> pageOutput = ConventPage.getPageOutput(page, StudentAttendanceRecordClassPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询学生考勤记录信息")
+    @SaCheckPermission("studentattendancerecord:detail")
+    public RT<StudentAttendanceRecordVo> info(@RequestParam Long id){
+        StudentAttendanceRecord studentAttendanceRecord = studentAttendanceRecordService.getById(id);
+        if (studentAttendanceRecord == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(studentAttendanceRecord, StudentAttendanceRecordVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增学生考勤记录")
+    @SaCheckPermission("studentattendancerecord:add")
+    public RT<Boolean> add(@Valid @RequestBody AddStudentAttendanceRecordDto dto){
+        StudentAttendanceRecord studentAttendanceRecord = BeanUtil.toBean(dto, StudentAttendanceRecord.class);
+        boolean isSuccess = studentAttendanceRecordService.save(studentAttendanceRecord);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改学生考勤记录")
+    @SaCheckPermission("studentattendancerecord:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateStudentAttendanceRecordDto dto){
+
+        StudentAttendanceRecord studentAttendanceRecord = BeanUtil.toBean(dto, StudentAttendanceRecord.class);
+        return RT.ok(studentAttendanceRecordService.updateById(studentAttendanceRecord));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除学生考勤记录")
+    @SaCheckPermission("studentattendancerecord:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(studentAttendanceRecordService.removeBatchByIds(ids));
+
+    }
+
+}

+ 126 - 0
src/main/java/com/xjrsoft/module/attendance/controller/TeacherAttendanceRecordController.java

@@ -0,0 +1,126 @@
+package com.xjrsoft.module.attendance.controller;
+
+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.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.toolkit.MPJWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+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.attendance.dto.AddTeacherAttendanceRecordDto;
+import com.xjrsoft.module.attendance.dto.UpdateTeacherAttendanceRecordDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+
+import com.xjrsoft.module.attendance.dto.TeacherAttendanceRecordPageDto;
+import com.xjrsoft.module.attendance.entity.TeacherAttendanceRecord;
+import com.xjrsoft.module.attendance.service.ITeacherAttendanceRecordService;
+import com.xjrsoft.module.attendance.vo.TeacherAttendanceRecordPageVo;
+
+import com.xjrsoft.module.attendance.vo.TeacherAttendanceRecordVo;
+import com.xjrsoft.module.organization.entity.UserDeptRelation;
+import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
+import com.xjrsoft.module.outint.vo.TeacherOutInRecordPageVo;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+* @title: 教师考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/attendance" + "/teacherAttendanceRecord")
+@Api(value = "/attendance"  + "/teacherAttendanceRecord",tags = "教师考勤记录代码")
+@AllArgsConstructor
+public class TeacherAttendanceRecordController {
+
+
+    private final ITeacherAttendanceRecordService teacherAttendanceRecordService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="教师考勤记录列表(分页)")
+    @SaCheckPermission("teacherattendancerecord:detail")
+    public RT<PageOutput<TeacherAttendanceRecordPageVo>> page(@Valid TeacherAttendanceRecordPageDto dto){
+
+        MPJLambdaWrapper<TeacherAttendanceRecord> queryWrapper =  MPJWrappers.<TeacherAttendanceRecord>lambdaJoin()
+                .orderByDesc(TeacherAttendanceRecord::getId)
+                .like(StrUtil.isNotBlank(dto.getName()), XjrUser::getName,dto.getName())
+                .ge(ObjectUtil.isNotNull(dto.getStartTime()), TeacherAttendanceRecord::getCreateDate,dto.getStartTime()+" 00:00:00")
+                .le(ObjectUtil.isNotNull(dto.getStartTime()),TeacherAttendanceRecord::getCreateDate,dto.getStartTime()+" 23:59:59")
+                .eq(ObjectUtil.isNotNull(dto.getTimeInterval())&&dto.getTimeInterval()!=0, TeacherAttendanceRecord::getTimeInterval, dto.getTimeInterval())
+                .eq(StrUtil.isNotBlank(dto.getAttendanceStatus()), TeacherAttendanceRecord::getAttendanceStatus,dto.getAttendanceStatus())
+                .eq(ObjectUtil.isNotNull(dto.getAttendanceMode())&&dto.getAttendanceMode()!=0, TeacherAttendanceRecord::getAttendanceMode, dto.getAttendanceMode())
+                .like(StrUtil.isNotBlank(dto.getCarNumber()), TeacherAttendanceRecord::getCarNumber,dto.getCarNumber())
+                .select(TeacherAttendanceRecord::getId)
+                .select(TeacherAttendanceRecord.class,x -> VoToColumnUtil.fieldsToColumns(TeacherAttendanceRecordPageVo.class).contains(x.getProperty()))
+                .select(XjrUser::getName,XjrUser::getMobile,XjrUser::getCredentialNumber)
+                .leftJoin(XjrUser.class,XjrUser::getId,TeacherOutInRecord::getUserId)
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, TeacherAttendanceRecord::getAttendanceStatus, ext->ext.selectAs(DictionaryDetail::getName, TeacherAttendanceRecordPageVo::getAttendanceStatusCn))
+                .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode, XjrUser::getGender, ext->ext.selectAs(DictionaryDetail::getName, TeacherAttendanceRecordPageVo::getGender))
+                ;
+
+        if(ObjectUtil.isNotNull(dto.getDeptId())&&dto.getDeptId()!=0){
+            queryWrapper.leftJoin(UserDeptRelation.class,UserDeptRelation::getUserId,XjrUser::getId)
+                    .eq(UserDeptRelation::getDeptId,dto.getDeptId());
+        }
+        IPage<TeacherAttendanceRecordPageVo> page = teacherAttendanceRecordService.selectJoinListPage(ConventPage.getPage(dto), TeacherAttendanceRecordPageVo.class,queryWrapper);
+        PageOutput<TeacherAttendanceRecordPageVo> pageOutput = ConventPage.getPageOutput(page, TeacherAttendanceRecordPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询教师考勤记录信息")
+    @SaCheckPermission("teacherattendancerecord:detail")
+    public RT<TeacherAttendanceRecordVo> info(@RequestParam Long id){
+        TeacherAttendanceRecord teacherAttendanceRecord = teacherAttendanceRecordService.getById(id);
+        if (teacherAttendanceRecord == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(teacherAttendanceRecord, TeacherAttendanceRecordVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增教师考勤记录")
+    @SaCheckPermission("teacherattendancerecord:add")
+    public RT<Boolean> add(@Valid @RequestBody AddTeacherAttendanceRecordDto dto){
+        TeacherAttendanceRecord teacherAttendanceRecord = BeanUtil.toBean(dto, TeacherAttendanceRecord.class);
+        boolean isSuccess = teacherAttendanceRecordService.save(teacherAttendanceRecord);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改教师考勤记录")
+    @SaCheckPermission("teacherattendancerecord:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateTeacherAttendanceRecordDto dto){
+
+        TeacherAttendanceRecord teacherAttendanceRecord = BeanUtil.toBean(dto, TeacherAttendanceRecord.class);
+        return RT.ok(teacherAttendanceRecordService.updateById(teacherAttendanceRecord));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除教师考勤记录")
+    @SaCheckPermission("teacherattendancerecord:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(teacherAttendanceRecordService.removeBatchByIds(ids));
+
+    }
+
+}

+ 79 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceRuleCategoryDto.java

@@ -0,0 +1,79 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
+
+
+/**
+* @title: 考勤规则
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+public class AddAttendanceRuleCategoryDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 考勤规则名称
+    */
+    @ApiModelProperty("考勤规则名称")
+    private String name;
+    /**
+    * 考勤开始时间
+    */
+    @ApiModelProperty("考勤开始时间")
+    private LocalDate startDate;
+    /**
+    * 考勤结束时间
+    */
+    @ApiModelProperty("考勤结束时间")
+    private LocalDate endDate;
+    /**
+    * 被考勤角色(xjr_role)
+    */
+    @ApiModelProperty("被考勤角色(xjr_role)")
+    private Long roleId;
+    /**
+    * 考勤人员范围(1:全体 2:指定)
+    */
+    @ApiModelProperty("考勤人员范围(1:全体 2:指定)")
+    private Integer attendanceRange;
+    /**
+    * 就读方式(xjr_dictionary_item[stduy_status])
+    */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+    /**
+    * 状态(1:启用 0:禁用)
+    */
+    @ApiModelProperty("状态(1:启用 0:禁用)")
+    private Integer status;
+
+    /**
+    * attendanceRuleDetails
+    */
+    @ApiModelProperty("attendanceRuleDetails子表")
+    private List<AddAttendanceRuleDetailsDto> attendanceRuleDetailsList;
+    /**
+    * attendanceUserRelation
+    */
+    @ApiModelProperty("attendanceUserRelation子表")
+    private List<AddAttendanceUserRelationDto> attendanceUserRelationList;
+
+
+    @ApiModelProperty("非考勤周期是否允许进出(1:是 0:否)")
+    private Integer notCycleIsInOut;
+}

+ 168 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceRuleDetailsDto.java

@@ -0,0 +1,168 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+
+
+
+/**
+* @title: 考勤规则细则
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+public class AddAttendanceRuleDetailsDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 周几(星期一~日或节假日)
+    */
+    @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;
+
+}

+ 40 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceUserRelationDto.java

@@ -0,0 +1,40 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 考勤规则人员绑定表
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+public class AddAttendanceUserRelationDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 所属班级id
+    */
+    @ApiModelProperty("所属班级id")
+    private Long classId;
+    /**
+    * 所属部门id
+    */
+    @ApiModelProperty("所属部门id")
+    private Long deptId;
+    /**
+    * 用id
+    */
+    @ApiModelProperty("用id")
+    private Long userId;
+
+    @ApiModelProperty("名称")
+    private String name;
+
+}

+ 58 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AddStudentAttendanceRecordDto.java

@@ -0,0 +1,58 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 学生考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+public class AddStudentAttendanceRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 学生userId(xjr_user)
+    */
+    @ApiModelProperty("学生userId(xjr_user)")
+    private Long userId;
+    /**
+    * 班主人id(xjr_user)
+    */
+    @ApiModelProperty("班主人id(xjr_user)")
+    private Long teacherId;
+    /**
+    * 班级id(class)
+    */
+    @ApiModelProperty("班级id(class)")
+    private Long classId;
+    /**
+    * 就读方式(xjr_dictionary_item[stduy_status])
+    */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+    /**
+    * 考勤状态(xjr_dictionary_detail[attendance_status])
+    */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatus;
+    /**
+    * 时段(1:上午,2:下午,3:晚上)
+    */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+
+}

+ 48 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AddTeacherAttendanceRecordDto.java

@@ -0,0 +1,48 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 教师考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+public class AddTeacherAttendanceRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 教师userId(xjr_user)
+    */
+    @ApiModelProperty("教师userId(xjr_user)")
+    private Long userId;
+    /**
+    * 考勤方式(1:人脸,2:车辆)
+    */
+    @ApiModelProperty("考勤方式(1:人脸,2:车辆)")
+    private Integer attendanceMode;
+    /**
+    * 考勤状态(xjr_dictionary_detail[attendance_status])
+    */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatus;
+    /**
+    * 时段(1:上午,2:下午,3:晚上)
+    */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AttendanceRuleCategoryPageDto.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.attendance.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 考勤规则分页查询入参
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AttendanceRuleCategoryPageDto extends PageInput {
+
+
+}

+ 37 - 0
src/main/java/com/xjrsoft/module/attendance/dto/StudentAttendanceRecordClassPageDto.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.attendance.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class StudentAttendanceRecordClassPageDto extends PageInput {
+
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime startTime;
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime endTime;
+    /**
+     * 班级id(class)
+     */
+    @ApiModelProperty("班级id(class)")
+    private Long classId;
+    /**
+     * 时段(1:上午,2:下午,3:晚上)
+     */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+}

+ 67 - 0
src/main/java/com/xjrsoft/module/attendance/dto/StudentAttendanceRecordPageDto.java

@@ -0,0 +1,67 @@
+package com.xjrsoft.module.attendance.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 学生考勤记录分页查询入参
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class StudentAttendanceRecordPageDto extends PageInput {
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime startTime;
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime endTime;
+    /**
+     * 班级id(class)
+     */
+    @ApiModelProperty("班级id(class)")
+    private Long classId;
+    /**
+     * 就读方式(xjr_dictionary_item[stduy_status])
+     */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+    /**
+     * 考勤状态(xjr_dictionary_detail[attendance_status])
+     */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatus;
+    /**
+     * 时段(1:上午,2:下午,3:晚上)
+     */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty("身份证号")
+    private String identityCard;
+}

+ 69 - 0
src/main/java/com/xjrsoft/module/attendance/dto/TeacherAttendanceRecordPageDto.java

@@ -0,0 +1,69 @@
+package com.xjrsoft.module.attendance.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 教师考勤记录分页查询入参
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class TeacherAttendanceRecordPageDto extends PageInput {
+
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime startTime;
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime endTime;
+    /**
+     * 考勤方式(1:人脸,2:车辆)
+     */
+    @ApiModelProperty("考勤方式(1:人脸,2:车辆)")
+    private Integer attendanceMode;
+    /**
+     * 考勤状态(xjr_dictionary_detail[attendance_status])
+     */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatus;
+    /**
+     * 时段(1:上午,2:下午,3:晚上)
+     */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+    /**
+     * 车牌号
+     */
+    @ApiModelProperty("车牌号")
+    private String carNumber;
+    /**
+     * 教师姓名
+     */
+    @ApiModelProperty("教师姓名")
+    private String name;
+
+    /**
+     * 部门ID
+     */
+    @ApiModelProperty("部门ID")
+    private Long deptId;
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/attendance/dto/UpdateAttendanceRuleCategoryDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 考勤规则
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+public class UpdateAttendanceRuleCategoryDto extends AddAttendanceRuleCategoryDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/attendance/dto/UpdateStudentAttendanceRecordDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 学生考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+public class UpdateStudentAttendanceRecordDto extends AddStudentAttendanceRecordDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/attendance/dto/UpdateTeacherAttendanceRecordDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 教师考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+public class UpdateTeacherAttendanceRecordDto extends AddTeacherAttendanceRecordDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+}

+ 132 - 0
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceRuleCategory.java

@@ -0,0 +1,132 @@
+package com.xjrsoft.module.attendance.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+* @title: 考勤规则
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+@TableName("attendance_rule_category")
+@ApiModel(value = "attendance_rule_category", description = "考勤规则")
+public class AttendanceRuleCategory implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 考勤规则名称
+    */
+    @ApiModelProperty("考勤规则名称")
+    private String name;
+    /**
+    * 考勤开始时间
+    */
+    @ApiModelProperty("考勤开始时间")
+    private LocalDate startDate;
+    /**
+    * 考勤结束时间
+    */
+    @ApiModelProperty("考勤结束时间")
+    private LocalDate endDate;
+    /**
+    * 被考勤角色(xjr_role)
+    */
+    @ApiModelProperty("被考勤角色(xjr_role)")
+    private Long roleId;
+    /**
+    * 考勤人员范围(1:全体 2:指定)
+    */
+    @ApiModelProperty("考勤人员范围(1:全体 2:指定)")
+    private Integer attendanceRange;
+    /**
+    * 就读方式(xjr_dictionary_item[stduy_status])
+    */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+    /**
+    * 状态(1:启用 0:禁用)
+    */
+    @ApiModelProperty("状态(1:启用 0:禁用)")
+    private Integer status;
+
+    /**
+    * attendanceRuleDetails
+    */
+    @ApiModelProperty("attendanceRuleDetails子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "attendanceRuleCategoryId")
+    private List<AttendanceRuleDetails> attendanceRuleDetailsList;
+    /**
+    * attendanceUserRelation
+    */
+    @ApiModelProperty("attendanceUserRelation子表")
+    private String userRelation;
+
+    @ApiModelProperty("非考勤周期是否允许进出(1:是 0:否)")
+    private Integer notCycleIsInOut;
+
+}

+ 234 - 0
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceRuleDetails.java

@@ -0,0 +1,234 @@
+package com.xjrsoft.module.attendance.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.util.Date;
+
+
+/**
+* @title: 考勤规则细则
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+@TableName("attendance_rule_details")
+@ApiModel(value = "attendance_rule_details", description = "考勤规则细则")
+public class AttendanceRuleDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 周几(星期一~日或节假日)
+    */
+    @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 Integer holidaysLastDayInOut;
+
+    @ApiModelProperty("返校上学时间")
+    private LocalTime returnStartTime;
+
+    @ApiModelProperty("返校放学时间")
+    private LocalTime returnEndTime;
+
+    @ApiModelProperty("节假日迟到旷课时间")
+    private Integer holidaysLateMinutes;
+
+    @ApiModelProperty("为节假日前一天时放学时间")
+    private LocalTime holidaysEndTime;
+}

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

@@ -0,0 +1,94 @@
+package com.xjrsoft.module.attendance.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 考勤规则人员绑定表
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+@TableName("attendance_user_relation")
+@ApiModel(value = "attendance_user_relation", description = "考勤规则人员绑定表")
+public class AttendanceUserRelation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 所属班级id
+    */
+    @ApiModelProperty("所属班级id")
+    private Long classId;
+    /**
+    * 所属部门id
+    */
+    @ApiModelProperty("所属部门id")
+    private Long deptId;
+    /**
+    * 用id
+    */
+    @ApiModelProperty("用id")
+    private Long userId;
+    /**
+    * 考勤规则(attendance_rule_category)
+    */
+    @ApiModelProperty("考勤规则(attendance_rule_category)")
+    private Long attendanceRuleCategoryId;
+
+
+}

+ 108 - 0
src/main/java/com/xjrsoft/module/attendance/entity/StudentAttendanceRecord.java

@@ -0,0 +1,108 @@
+package com.xjrsoft.module.attendance.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 学生考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+@TableName("student_attendance_record")
+@ApiModel(value = "student_attendance_record", description = "学生考勤记录")
+public class StudentAttendanceRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 学生userId(xjr_user)
+    */
+    @ApiModelProperty("学生userId(xjr_user)")
+    private Long userId;
+    /**
+    * 班主人id(xjr_user)
+    */
+    @ApiModelProperty("班主人id(xjr_user)")
+    private Long teacherId;
+    /**
+    * 班级id(class)
+    */
+    @ApiModelProperty("班级id(class)")
+    private Long classId;
+    /**
+    * 就读方式(xjr_dictionary_item[stduy_status])
+    */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+    /**
+    * 考勤状态(xjr_dictionary_detail[attendance_status])
+    */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatus;
+    /**
+    * 时段(1:上午,2:下午,3:晚上)
+    */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+
+
+}

+ 102 - 0
src/main/java/com/xjrsoft/module/attendance/entity/TeacherAttendanceRecord.java

@@ -0,0 +1,102 @@
+package com.xjrsoft.module.attendance.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 教师考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+@TableName("teacher_attendance_record")
+@ApiModel(value = "teacher_attendance_record", description = "教师考勤记录")
+public class TeacherAttendanceRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 教师userId(xjr_user)
+    */
+    @ApiModelProperty("教师userId(xjr_user)")
+    private Long userId;
+    /**
+    * 考勤方式(1:人脸,2:车辆)
+    */
+    @ApiModelProperty("考勤方式(1:人脸,2:车辆)")
+    private Integer attendanceMode;
+    /**
+    * 考勤状态(xjr_dictionary_detail[attendance_status])
+    */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatus;
+    /**
+    * 时段(1:上午,2:下午,3:晚上)
+    */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+    /**
+     * 车牌号
+     */
+    @ApiModelProperty("车牌号")
+    private String carNumber;
+
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceRuleCategoryMapper.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.attendance.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.attendance.dto.AddAttendanceRuleCategoryDto;
+import com.xjrsoft.module.attendance.dto.UpdateAttendanceRuleCategoryDto;
+import com.xjrsoft.module.attendance.entity.AttendanceRuleCategory;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+* @title: 考勤规则
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Mapper
+public interface AttendanceRuleCategoryMapper extends MPJBaseMapper<AttendanceRuleCategory> {
+
+    Integer getExistCount(@Param("dto") AddAttendanceRuleCategoryDto dto);
+
+    Integer getExistCountNEId(@Param("dto") UpdateAttendanceRuleCategoryDto dto);
+}

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

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.attendance.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 考勤规则细则
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Mapper
+public interface AttendanceRuleDetailsMapper extends MPJBaseMapper<AttendanceRuleDetails> {
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceUserRelationMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.attendance.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.attendance.entity.AttendanceUserRelation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 考勤规则人员绑定表
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Mapper
+public interface AttendanceUserRelationMapper extends MPJBaseMapper<AttendanceUserRelation> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/attendance/mapper/StudentAttendanceRecordMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.attendance.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.attendance.entity.StudentAttendanceRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 学生考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Mapper
+public interface StudentAttendanceRecordMapper extends MPJBaseMapper<StudentAttendanceRecord> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/attendance/mapper/TeacherAttendanceRecordMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.attendance.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.attendance.entity.TeacherAttendanceRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 教师考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Mapper
+public interface TeacherAttendanceRecordMapper extends MPJBaseMapper<TeacherAttendanceRecord> {
+
+}

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

@@ -0,0 +1,41 @@
+package com.xjrsoft.module.attendance.service;
+
+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 java.util.List;
+
+/**
+* @title: 考勤规则
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+
+public interface IAttendanceRuleCategoryService extends MPJBaseService<AttendanceRuleCategory> {
+    /**
+    * 新增
+    *
+    * @param dto
+    * @return
+    */
+    Boolean add(AddAttendanceRuleCategoryDto dto);
+
+    /**
+    * 更新
+    *
+    * @param dto
+    * @return
+    */
+    Boolean update(UpdateAttendanceRuleCategoryDto dto);
+
+    /**
+    * 删除
+    *
+    * @param ids
+    * @return
+    */
+    Boolean delete(List<Long> ids);
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/attendance/service/IStudentAttendanceRecordService.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.attendance.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.attendance.entity.StudentAttendanceRecord;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 学生考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+
+public interface IStudentAttendanceRecordService extends MPJBaseService<StudentAttendanceRecord> {
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/attendance/service/ITeacherAttendanceRecordService.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.attendance.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.attendance.entity.TeacherAttendanceRecord;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 教师考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+
+public interface ITeacherAttendanceRecordService extends MPJBaseService<TeacherAttendanceRecord> {
+}

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

@@ -0,0 +1,409 @@
+package com.xjrsoft.module.attendance.service.impl;
+
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.attendance.dto.AddAttendanceRuleCategoryDto;
+import com.xjrsoft.module.attendance.dto.AddAttendanceUserRelationDto;
+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.entity.AttendanceUserRelation;
+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.concat.service.IXjrUserService;
+import com.xjrsoft.module.organization.entity.UserDeptRelation;
+import com.xjrsoft.module.student.entity.BaseStudent;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.teacher.entity.BaseTeacher;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.yomahub.liteflow.util.JsonUtil;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+* @title: 考勤规则
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class AttendanceRuleCategoryServiceImpl extends MPJBaseServiceImpl<AttendanceRuleCategoryMapper, AttendanceRuleCategory> implements IAttendanceRuleCategoryService {
+    private final AttendanceRuleCategoryMapper categoryMapper;
+
+    private final AttendanceRuleDetailsMapper detailsMapper;
+    private final AttendanceUserRelationMapper relationMapper;
+    private final IXjrUserService xjrUserService;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean add(AddAttendanceRuleCategoryDto dto) {
+        AttendanceRuleCategory attendanceRuleCategory = BeanUtil.toBean(dto, AttendanceRuleCategory.class);
+        attendanceRuleCategory.setUserRelation(JsonUtil.toJsonString(dto.getAttendanceUserRelationList()));
+
+        List<XjrUser> insertList = new ArrayList<>();
+        if(attendanceRuleCategory.getRoleId() != null && attendanceRuleCategory.getRoleId() == 2){
+            if(attendanceRuleCategory.getAttendanceRange() == 1){
+                //首先判断是否已经存在一个全体教职工的考勤规则
+                Integer existCount = categoryMapper.getExistCount(dto);
+                if(existCount > 0){
+                    throw new MyException("已存在一个全体教职工的考勤规则,无法添加");
+                }
+                List<XjrUser> userList = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(BaseTeacher.class, BaseTeacher::getUserId, XjrUser::getId)
+                    .eq(BaseTeacher::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+                insertList.addAll(userList);
+            }else if(attendanceRuleCategory.getAttendanceRange() == 2){
+                List<Long> deptIds = new ArrayList<>();
+                for (AddAttendanceUserRelationDto relation : dto.getAttendanceUserRelationList()) {
+                    if(relation.getDeptId() != null){
+                        deptIds.add(relation.getDeptId());
+                    }
+                }
+                List<Long> userIds = new ArrayList<>();
+                for (AddAttendanceUserRelationDto relation : dto.getAttendanceUserRelationList()) {
+                    if(relation.getUserId() != null){
+                        userIds.add(relation.getUserId());
+                    }
+                }
+
+                List<XjrUser> userList = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(BaseTeacher.class, BaseTeacher::getUserId, XjrUser::getId)
+                    .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, XjrUser::getId)
+                    .eq(BaseTeacher::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .in(!deptIds.isEmpty(), UserDeptRelation::getDeptId, deptIds)
+                    .in(!userIds.isEmpty(), XjrUser::getId, userIds).or()
+                );
+                //查询这部分人中是否已经有人有规则了
+                List<Long> relationUserIds = userList.stream().map(XjrUser::getId).collect(Collectors.toList());
+                List<XjrUser> relations = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>().distinct()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
+                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .in(!relationUserIds.isEmpty(), AttendanceUserRelation::getUserId, relationUserIds)
+                );
+//                String peopleName = "";
+//                for (int i = 0; i < relations.size(); i ++){
+//                    if(i > 0){
+//                        peopleName += ",";
+//                    }
+//                    peopleName += relations.get(i).getName();
+//                }
+                if(!relations.isEmpty()){
+                    throw new MyException("指定教职工中已有绑定考勤规则,无法添加");
+                }
+                insertList.addAll(userList);
+            }
+        }else if(attendanceRuleCategory.getRoleId() != null && attendanceRuleCategory.getRoleId() == 3){//学生
+            if(attendanceRuleCategory.getAttendanceRange() == 1){
+                //首先判断是否已经存在一个全体学生的考勤规则
+                Integer existCount = categoryMapper.getExistCount(dto);
+                if(existCount > 0){
+                    throw new MyException("已存在一个全体学生的考勤规则,无法添加");
+                }
+                List<XjrUser> userList = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(BaseStudent.class, BaseStudent::getUserId, XjrUser::getId)
+                    .eq(BaseStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+                insertList.addAll(userList);
+            }else if(attendanceRuleCategory.getAttendanceRange() == 2){
+                List<Long> classIds = new ArrayList<>();
+                for (AddAttendanceUserRelationDto relation : dto.getAttendanceUserRelationList()) {
+                    if(relation.getClassId() != null){
+                        classIds.add(relation.getClassId());
+                    }
+                }
+                List<Long> userIds = new ArrayList<>();
+                for (AddAttendanceUserRelationDto relation : dto.getAttendanceUserRelationList()) {
+                    if(relation.getUserId() != null){
+                        userIds.add(relation.getUserId());
+                    }
+                }
+
+                List<XjrUser> userList = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
+                    .eq(BaseStudentSchoolRoll::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .in(!classIds.isEmpty(), BaseStudentSchoolRoll::getClassId, classIds)
+                    .in(!userIds.isEmpty(), XjrUser::getId, userIds)
+                );
+                //查询这部分人中是否已经有人有规则了
+                List<Long> relationUserIds = userList.stream().map(XjrUser::getId).collect(Collectors.toList());
+                List<XjrUser> relations = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>().distinct()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
+                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .in(!relationUserIds.isEmpty(), AttendanceUserRelation::getUserId, relationUserIds)
+                );
+//                String peopleName = "";
+//                for (int i = 0; i < relations.size(); i ++){
+//                    if(i > 0){
+//                        peopleName += ",";
+//                    }
+//                    peopleName += relations.get(i).getName();
+//                }
+                if(!relations.isEmpty()){
+                    throw new MyException("已有学生绑定考勤规则,无法添加");
+                }
+                insertList.addAll(userList);
+            }
+        }
+        attendanceRuleCategory.setCreateDate(new Date());
+        categoryMapper.insert(attendanceRuleCategory);
+        for (AttendanceRuleDetails attendanceRuleDetails : attendanceRuleCategory.getAttendanceRuleDetailsList()) {
+            attendanceRuleDetails.setAttendanceRuleCategoryId(attendanceRuleCategory.getId());
+            detailsMapper.insert(attendanceRuleDetails);
+        }
+        for (XjrUser user : insertList) {
+            AttendanceUserRelation relation = new AttendanceUserRelation();
+            relation.setCreateDate(new Date());
+            relation.setCreateUserId(StpUtil.getLoginIdAsLong());
+            relation.setUserId(user.getId());
+            relation.setAttendanceRuleCategoryId(attendanceRuleCategory.getId());
+            relationMapper.insert(relation);
+        }
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean update(UpdateAttendanceRuleCategoryDto dto) {
+        AttendanceRuleCategory attendanceRuleCategory = BeanUtil.toBean(dto, AttendanceRuleCategory.class);
+        attendanceRuleCategory.setUserRelation(JsonUtil.toJsonString(dto.getAttendanceUserRelationList()));
+        if(attendanceRuleCategory.getAttendanceRange() == 1){
+            Integer count = categoryMapper.getExistCountNEId(dto);
+            if(count > 0){
+                if(attendanceRuleCategory.getRoleId() == 2){
+                    throw new MyException("已存在一个全体教职工的考勤规则,无法修改");
+                }else if(attendanceRuleCategory.getRoleId() == 3){
+                    throw new MyException("已存在一个全体学生的考勤规则,无法修改");
+                }
+            }
+        }
+
+        categoryMapper.updateById(attendanceRuleCategory);
+        //********************************* AttendanceRuleDetails  增删改  开始 *******************************************/
+        {
+            // 查出所有子级的id
+            List<AttendanceRuleDetails> attendanceRuleDetailsList = detailsMapper.selectList(Wrappers.lambdaQuery(AttendanceRuleDetails.class).eq(AttendanceRuleDetails::getAttendanceRuleCategoryId, attendanceRuleCategory.getId()).select(AttendanceRuleDetails::getId));
+            List<Long> attendanceRuleDetailsIds = attendanceRuleDetailsList.stream().map(AttendanceRuleDetails::getId).collect(Collectors.toList());
+            //原有子表单 没有被删除的主键
+            List<Long> attendanceRuleDetailsOldIds = attendanceRuleCategory.getAttendanceRuleDetailsList().stream().map(AttendanceRuleDetails::getId).filter(Objects::nonNull).collect(Collectors.toList());
+            //找到需要删除的id
+            List<Long> attendanceRuleDetailsRemoveIds = attendanceRuleDetailsIds.stream().filter(item -> !attendanceRuleDetailsOldIds.contains(item)).collect(Collectors.toList());
+
+            for (AttendanceRuleDetails attendanceRuleDetails : attendanceRuleCategory.getAttendanceRuleDetailsList()) {
+                //如果不等于空则修改
+                if (attendanceRuleDetails.getId() != null) {
+                    detailsMapper.updateById(attendanceRuleDetails);
+                }
+                //如果等于空 则新增
+                else {
+                    //已经不存在的id 删除
+                    attendanceRuleDetails.setAttendanceRuleCategoryId(attendanceRuleCategory.getId());
+                    detailsMapper.insert(attendanceRuleDetails);
+                }
+            }
+            //已经不存在的id 删除
+            if(attendanceRuleDetailsRemoveIds.size() > 0){
+                detailsMapper.deleteBatchIds(attendanceRuleDetailsRemoveIds);
+            }
+        }
+        //********************************* AttendanceRuleDetails  增删改  结束 *******************************************/
+
+        //********************************* AttendanceUserRelation  增删改  开始 *******************************************/
+        List<XjrUser> insertList = new ArrayList<>();
+        if(attendanceRuleCategory.getRoleId() != null && attendanceRuleCategory.getRoleId() == 2){
+            if(attendanceRuleCategory.getAttendanceRange() == 1){
+                List<XjrUser> userList = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(BaseTeacher.class, BaseTeacher::getUserId, XjrUser::getId)
+                    .eq(BaseTeacher::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+                insertList.addAll(userList);
+            }else if(attendanceRuleCategory.getAttendanceRange() == 2){
+                List<Long> deptIds = new ArrayList<>();
+                for (AddAttendanceUserRelationDto relation : dto.getAttendanceUserRelationList()) {
+                    if(relation.getDeptId() != null){
+                        deptIds.add(relation.getDeptId());
+                    }
+                }
+                List<Long> userIds = new ArrayList<>();
+                for (AddAttendanceUserRelationDto relation : dto.getAttendanceUserRelationList()) {
+                    if(relation.getUserId() != null){
+                        userIds.add(relation.getUserId());
+                    }
+                }
+
+                List<XjrUser> userList = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(BaseTeacher.class, BaseTeacher::getUserId, XjrUser::getId)
+                    .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, XjrUser::getId)
+                    .eq(BaseTeacher::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .in(!deptIds.isEmpty(), UserDeptRelation::getDeptId, deptIds)
+                    .in(!userIds.isEmpty(), XjrUser::getId, userIds)
+                );
+                //查询这部分人中是否已经有人有规则了
+                List<Long> relationUserIds = userList.stream().map(XjrUser::getId).collect(Collectors.toList());
+                List<XjrUser> relations = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
+                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .in(AttendanceUserRelation::getUserId, relationUserIds)
+                    .ne(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
+                );
+                String peopleName = "";
+                for (int i = 0; i < relations.size(); i ++){
+                    if(i > 0){
+                        peopleName += ",";
+                    }
+                    peopleName += relations.get(i).getName();
+                }
+                if(!relations.isEmpty()){
+                    throw new MyException("以下教职工:【" + peopleName + "】已绑定其他考勤规则,无法添加");
+                }
+                insertList.addAll(userList);
+            }
+        }else if(attendanceRuleCategory.getRoleId() != null && attendanceRuleCategory.getRoleId() == 3){//学生
+            if(attendanceRuleCategory.getAttendanceRange() == 1){
+                //首先判断是否已经存在一个全体学生的考勤规则
+                Long count = categoryMapper.selectCount(
+                    new QueryWrapper<AttendanceRuleCategory>()
+                    .lambda()
+                    .eq(AttendanceRuleCategory::getRoleId, attendanceRuleCategory.getRoleId())
+                    .eq(AttendanceRuleCategory::getAttendanceRange, attendanceRuleCategory.getAttendanceRange())
+                    .eq(AttendanceRuleCategory::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+                if(count > 0){
+                    throw new MyException("已存在一个全体学生的考勤规则,无法修改");
+                }
+                List<XjrUser> userList = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>()
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(BaseStudent.class, BaseStudent::getUserId, XjrUser::getId)
+                    .eq(BaseStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+                insertList.addAll(userList);
+            }else if(attendanceRuleCategory.getAttendanceRange() == 2){
+                List<Long> classIds = new ArrayList<>();
+                for (AddAttendanceUserRelationDto relation : dto.getAttendanceUserRelationList()) {
+                    if(relation.getClassId() != null){
+                        classIds.add(relation.getClassId());
+                    }
+                }
+                List<Long> userIds = new ArrayList<>();
+                for (AddAttendanceUserRelationDto relation : dto.getAttendanceUserRelationList()) {
+                    if(relation.getUserId() != null){
+                        userIds.add(relation.getUserId());
+                    }
+                }
+
+                List<XjrUser> userList = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
+                    .eq(BaseStudentSchoolRoll::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .in(!classIds.isEmpty(), BaseStudentSchoolRoll::getClassId, classIds)
+                    .in(!userIds.isEmpty(), XjrUser::getId, userIds)
+                );
+                //查询这部分人中是否已经有人有规则了
+                List<Long> relationUserIds = userList.stream().map(XjrUser::getId).collect(Collectors.toList());
+                List<XjrUser> relations = xjrUserService.list(
+                    new MPJLambdaWrapper<XjrUser>()
+                    .select(XjrUser::getId)
+                    .select(XjrUser.class, x -> VoToColumnUtil.fieldsToColumns(XjrUser.class).contains(x.getProperty()))
+                    .leftJoin(AttendanceUserRelation.class, AttendanceUserRelation::getUserId, XjrUser::getId)
+                    .eq(AttendanceUserRelation::getDeleteMark, DeleteMark.NODELETE.getCode())
+                    .in(AttendanceUserRelation::getUserId, relationUserIds)
+                    .ne(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
+                );
+                String peopleName = "";
+                for (int i = 0; i < relations.size(); i ++){
+                    if(i > 0){
+                        peopleName += ",";
+                    }
+                    peopleName += relations.get(i).getName();
+                }
+                if(!relations.isEmpty()){
+                    throw new MyException("以下学生:【" + peopleName + "】已绑定其他考勤规则,无法修改");
+                }
+                insertList.addAll(userList);
+            }
+        }
+        //先清空原来的全体教职工数据,再重新添加
+        relationMapper.delete(
+            Wrappers.lambdaQuery(AttendanceUserRelation.class)
+            .eq(AttendanceUserRelation::getAttendanceRuleCategoryId, attendanceRuleCategory.getId())
+        );
+        for (XjrUser user : insertList) {
+            AttendanceUserRelation relation = new AttendanceUserRelation();
+            relation.setCreateDate(new Date());
+            relation.setCreateUserId(StpUtil.getLoginIdAsLong());
+            relation.setUserId(user.getId());
+            relation.setAttendanceRuleCategoryId(attendanceRuleCategory.getId());
+            relationMapper.insert(relation);
+        }
+        //********************************* AttendanceUserRelation  增删改  结束 *******************************************/
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delete(List<Long> ids) {
+        categoryMapper.deleteBatchIds(ids);
+        detailsMapper.delete(Wrappers.lambdaQuery(AttendanceRuleDetails.class).in(AttendanceRuleDetails::getAttendanceRuleCategoryId, ids));
+        relationMapper.delete(Wrappers.lambdaQuery(AttendanceUserRelation.class).in(AttendanceUserRelation::getAttendanceRuleCategoryId, ids));
+
+        return true;
+    }
+}

+ 25 - 0
src/main/java/com/xjrsoft/module/attendance/service/impl/StudentAttendanceRecordServiceImpl.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.attendance.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.attendance.entity.StudentAttendanceRecord;
+import com.xjrsoft.module.attendance.mapper.StudentAttendanceRecordMapper;
+import com.xjrsoft.module.attendance.service.IStudentAttendanceRecordService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 学生考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class StudentAttendanceRecordServiceImpl extends MPJBaseServiceImpl<StudentAttendanceRecordMapper, StudentAttendanceRecord> implements IStudentAttendanceRecordService {
+}

+ 25 - 0
src/main/java/com/xjrsoft/module/attendance/service/impl/TeacherAttendanceRecordServiceImpl.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.attendance.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.attendance.entity.TeacherAttendanceRecord;
+import com.xjrsoft.module.attendance.mapper.TeacherAttendanceRecordMapper;
+import com.xjrsoft.module.attendance.service.ITeacherAttendanceRecordService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 教师考勤记录
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class TeacherAttendanceRecordServiceImpl extends MPJBaseServiceImpl<TeacherAttendanceRecordMapper, TeacherAttendanceRecord> implements ITeacherAttendanceRecordService {
+}

+ 93 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceRuleCategoryPageVo.java

@@ -0,0 +1,93 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 考勤规则分页列表出参
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+public class AttendanceRuleCategoryPageVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private String id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long createUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Date createDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long modifyUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Date modifyDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer deleteMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer enabledMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 考勤规则名称
+    */
+    @ApiModelProperty("考勤规则名称")
+    private String name;
+    /**
+    * 考勤开始时间
+    */
+    @ApiModelProperty("考勤开始时间")
+    private Date startDate;
+    /**
+    * 考勤结束时间
+    */
+    @ApiModelProperty("考勤结束时间")
+    private Date endDate;
+    /**
+    * 被考勤角色(xjr_role)
+    */
+    @ApiModelProperty("被考勤角色(xjr_role)")
+    private Long roleId;
+    /**
+    * 考勤人员范围(1:全体 2:指定)
+    */
+    @ApiModelProperty("考勤人员范围(1:全体 2:指定)")
+    private Integer attendanceRange;
+    /**
+    * 就读方式(xjr_dictionary_item[stduy_status])
+    */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+    /**
+    * 状态(1:启用 0:禁用)
+    */
+    @ApiModelProperty("状态(1:启用 0:禁用)")
+    private Integer status;
+
+}

+ 79 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceRuleCategoryVo.java

@@ -0,0 +1,79 @@
+package com.xjrsoft.module.attendance.vo;
+
+import com.xjrsoft.module.attendance.dto.AddAttendanceUserRelationDto;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+* @title: 考勤规则表单出参
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+public class AttendanceRuleCategoryVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 考勤规则名称
+    */
+    @ApiModelProperty("考勤规则名称")
+    private String name;
+    /**
+    * 考勤开始时间
+    */
+    @ApiModelProperty("考勤开始时间")
+    private Date startDate;
+    /**
+    * 考勤结束时间
+    */
+    @ApiModelProperty("考勤结束时间")
+    private Date endDate;
+    /**
+    * 被考勤角色(xjr_role)
+    */
+    @ApiModelProperty("被考勤角色(xjr_role)")
+    private Long roleId;
+    /**
+    * 考勤人员范围(1:全体 2:指定)
+    */
+    @ApiModelProperty("考勤人员范围(1:全体 2:指定)")
+    private Integer attendanceRange;
+    /**
+    * 就读方式(xjr_dictionary_item[stduy_status])
+    */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+    /**
+    * 状态(1:启用 0:禁用)
+    */
+    @ApiModelProperty("状态(1:启用 0:禁用)")
+    private Integer status;
+
+
+    /**
+    * attendanceRuleDetails
+    */
+    @ApiModelProperty("attendanceRuleDetails子表")
+    private List<AttendanceRuleDetailsVo> attendanceRuleDetailsList;
+
+    @ApiModelProperty("非考勤周期是否允许进出(1:是 0:否)")
+    private Integer notCycleIsInOut;
+
+
+    @ApiModelProperty("attendanceUserRelation子表")
+    private List<AddAttendanceUserRelationDto> attendanceUserRelationList;
+
+}

+ 171 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceRuleDetailsVo.java

@@ -0,0 +1,171 @@
+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 AttendanceRuleDetailsVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 周几(星期一~日或节假日)
+    */
+    @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;
+
+}

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

@@ -0,0 +1,43 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 考勤规则人员绑定表表单出参
+* @Author dzx
+* @Date: 2024-05-08
+* @Version 1.0
+*/
+@Data
+public class AttendanceUserRelationVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 所属班级id
+    */
+    @ApiModelProperty("所属班级id")
+    private Long classId;
+    /**
+    * 所属部门id
+    */
+    @ApiModelProperty("所属部门id")
+    private Long deptId;
+    /**
+    * 用id
+    */
+    @ApiModelProperty("用id")
+    private Long userId;
+    /**
+    * 考勤规则(attendance_rule_category)
+    */
+    @ApiModelProperty("考勤规则(attendance_rule_category)")
+    private Long attendanceRuleCategoryId;
+
+
+
+}

+ 83 - 0
src/main/java/com/xjrsoft/module/attendance/vo/StudentAttendanceRecordClassPageVo.java

@@ -0,0 +1,83 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class StudentAttendanceRecordClassPageVo {
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    private String id;
+    /**
+     * 时段(1:上午,2:下午,3:晚上)
+     */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+    /**
+     * 班级ID
+     */
+    @ApiModelProperty("班级ID")
+    private Long classId;
+    /**
+     * 班级
+     */
+    @ApiModelProperty("班级")
+    private String classCn;
+    /**
+     * 班主人
+     */
+    @ApiModelProperty("班主人")
+    private Long teacherCn;
+    /**
+     * 总人数
+     */
+    @ApiModelProperty("总人数")
+    private  Integer totalCount;
+    /**
+     * 住读人数
+     */
+    @ApiModelProperty("住读人数")
+    private  Integer stayCount;
+    /**
+     * 走读人数
+     */
+    @ApiModelProperty("走读人数")
+    private  Integer notStayCount;
+    /**
+     * 实到人数
+     */
+    @ApiModelProperty("实到人数")
+    private  Integer actualCount;
+    /**
+     * 请假人数
+     */
+    @ApiModelProperty("请假人数")
+    private  Integer leaveCount;
+    /**
+     * 迟到人数
+     */
+    @ApiModelProperty("迟到人数")
+    private  Integer lateCount;
+    /**
+     * 旷课人数
+     */
+    @ApiModelProperty("旷课人数")
+    private  Integer absenteeismCount;
+    /**
+     * 缺勤人数
+     */
+    @ApiModelProperty("缺勤人数")
+    private  Integer truantCount;
+    /**
+     * 缺勤率
+     */
+    @ApiModelProperty("缺勤率")
+    private  Float attendanceRate;
+    /**
+     * 考勤状态
+     */
+    @ApiModelProperty("考勤状态")
+    private String attendanceStatusCn;
+}

+ 123 - 0
src/main/java/com/xjrsoft/module/attendance/vo/StudentAttendanceRecordPageVo.java

@@ -0,0 +1,123 @@
+package com.xjrsoft.module.attendance.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 学生考勤记录分页列表出参
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+public class StudentAttendanceRecordPageVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    private Integer enabledMark;
+    /**
+    * 学生userId(xjr_user)
+    */
+    @ApiModelProperty("学生userId(xjr_user)")
+    private Long userId;
+    /**
+    * 班主人id(xjr_user)
+    */
+    @ApiModelProperty("班主人id(xjr_user)")
+    private Long teacherId;
+    /**
+    * 班级id(class)
+    */
+    @ApiModelProperty("班级id(class)")
+    private Long classId;
+    /**
+    * 就读方式(xjr_dictionary_item[stduy_status])
+    */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+    /**
+    * 考勤状态(xjr_dictionary_detail[attendance_status])
+    */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatus;
+    /**
+    * 时段(1:上午,2:下午,3:晚上)
+    */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+    /**
+     * 班级
+     */
+    @ApiModelProperty("班级")
+    private String classCn;
+    /**
+     * 班主人
+     */
+    @ApiModelProperty("班主人")
+    private Long teacherCn;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty("身份证号")
+    private String identityCard;
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+    /**
+     * 就读方式
+     */
+    @ApiModelProperty("就读方式")
+    private String stduyStatusCn;
+    /**
+     * 考勤状态
+     */
+    @ApiModelProperty("考勤状态")
+    private String attendanceStatusCn;
+    /**
+     * 性别
+     */
+    @ApiModelProperty("性别")
+    private String gender;
+}

+ 59 - 0
src/main/java/com/xjrsoft/module/attendance/vo/StudentAttendanceRecordVo.java

@@ -0,0 +1,59 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 学生考勤记录表单出参
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+public class StudentAttendanceRecordVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 学生userId(xjr_user)
+    */
+    @ApiModelProperty("学生userId(xjr_user)")
+    private Long userId;
+    /**
+    * 班主人id(xjr_user)
+    */
+    @ApiModelProperty("班主人id(xjr_user)")
+    private Long teacherId;
+    /**
+    * 班级id(class)
+    */
+    @ApiModelProperty("班级id(class)")
+    private Long classId;
+    /**
+    * 就读方式(xjr_dictionary_item[stduy_status])
+    */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+    /**
+    * 考勤状态(xjr_dictionary_detail[attendance_status])
+    */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatus;
+    /**
+    * 时段(1:上午,2:下午,3:晚上)
+    */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+
+
+
+}

+ 108 - 0
src/main/java/com/xjrsoft/module/attendance/vo/TeacherAttendanceRecordPageVo.java

@@ -0,0 +1,108 @@
+package com.xjrsoft.module.attendance.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 教师考勤记录分页列表出参
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+public class TeacherAttendanceRecordPageVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    private Integer enabledMark;
+    /**
+    * 教师userId(xjr_user)
+    */
+    @ApiModelProperty("教师userId(xjr_user)")
+    private Long userId;
+    /**
+    * 考勤方式(1:人脸,2:车辆)
+    */
+    @ApiModelProperty("考勤方式(1:人脸,2:车辆)")
+    private Integer attendanceMode;
+    /**
+    * 考勤状态(xjr_dictionary_detail[attendance_status])
+    */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatus;
+    /**
+    * 时段(1:上午,2:下午,3:晚上)
+    */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+    /**
+     * 车牌号
+     */
+    @ApiModelProperty("车牌号")
+    private String carNumber;
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty("身份证号")
+    private String identityCard;
+    /**
+     * 手机号码
+     */
+    @ApiModelProperty("手机号码")
+    private Long phone;
+    /**
+     * 性别
+     */
+    @ApiModelProperty("性别")
+    private String gender;
+    /**
+     * 考勤状态(xjr_dictionary_detail[attendance_status])
+     */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatusCn;
+}

+ 49 - 0
src/main/java/com/xjrsoft/module/attendance/vo/TeacherAttendanceRecordVo.java

@@ -0,0 +1,49 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 教师考勤记录表单出参
+* @Author dzx
+* @Date: 2024-05-15
+* @Version 1.0
+*/
+@Data
+public class TeacherAttendanceRecordVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 教师userId(xjr_user)
+    */
+    @ApiModelProperty("教师userId(xjr_user)")
+    private Long userId;
+    /**
+    * 考勤方式(1:人脸,2:车辆)
+    */
+    @ApiModelProperty("考勤方式(1:人脸,2:车辆)")
+    private Integer attendanceMode;
+    /**
+    * 考勤状态(xjr_dictionary_detail[attendance_status])
+    */
+    @ApiModelProperty("考勤状态(xjr_dictionary_detail[attendance_status])")
+    private String attendanceStatus;
+    /**
+    * 时段(1:上午,2:下午,3:晚上)
+    */
+    @ApiModelProperty("时段(1:上午,2:下午,3:晚上)")
+    private Integer timeInterval;
+
+
+
+}

+ 55 - 0
src/main/java/com/xjrsoft/module/hikvision/entity/HikvisionData.java

@@ -0,0 +1,55 @@
+package com.xjrsoft.module.hikvision.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 简约系统对照表
+* @Author dzx
+* @Date: 2024-01-23
+* @Version 1.0
+*/
+@Data
+@TableName("hikvision_data")
+@ApiModel(value = "海康威视系统对照表", description = "海康威视系统对照表")
+public class HikvisionData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("首次推送时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 表名
+    */
+    @ApiModelProperty("表名")
+    private String tableName;
+    /**
+    * 英文姓名
+    */
+    @ApiModelProperty("数据id")
+    private String sourceId;
+    /**
+    * 姓名拼音
+    */
+    @ApiModelProperty("对应的海康威视系统的id")
+    private String hikvisionId;
+
+}

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

@@ -1,6 +1,5 @@
 package com.xjrsoft.module.hikvision.util;
 
-import com.google.gson.JsonObject;
 import com.hikvision.artemis.sdk.ArtemisHttpUtil;
 import com.hikvision.artemis.sdk.config.ArtemisConfig;
 
@@ -19,11 +18,12 @@ public class ApiUtil {
     /**
      * 调用海康接口(该方法内部实现了登入认证逻辑)
      * @param apiPath 接口地址
-     * @param paramJson body参数
+     * @param body body参数
      * @param querys 查询参数
+     * @param header header参数
      * @return 接口调用结果
      */
-    public String doPost(String apiPath, JsonObject paramJson, Map<String, String> querys){
+    public String doPost(String apiPath, String body, Map<String, String> querys, Map<String, String> header){
         /**
          * STEP1:设置平台参数,根据实际情况,设置host appkey appsecret 三个参数.
          */
@@ -51,11 +51,17 @@ public class ApiUtil {
          */
         String contentType = "application/json";
 
-        /**
-         * STEP5:组装请求参数
-         */
-        String body = paramJson.toString();
+        return ArtemisHttpUtil.doPostStringArtemis(path, body, querys, null, contentType , header);// post请求application/json类型参数
+    }
 
-        return ArtemisHttpUtil.doPostStringArtemis(path, body, querys, null, contentType , null);// post请求application/json类型参数
+    /**
+     * 调用海康接口(该方法内部实现了登入认证逻辑)
+     * @param apiPath 接口地址
+     * @param body body参数
+     * @param querys 查询参数
+     * @return 接口调用结果
+     */
+    public String doPost(String apiPath, String body, Map<String, String> querys){
+        return doPost(apiPath, body, querys, null);
     }
-}
+}

+ 544 - 0
src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java

@@ -0,0 +1,544 @@
+package com.xjrsoft.module.hikvision.util;
+
+import cn.hutool.db.Db;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.organization.entity.Department;
+import com.xjrsoft.module.personnel.entity.CarMessageApply;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
+import lombok.extern.slf4j.Slf4j;
+import lombok.var;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ThreadLocalRandom;
+
+/**
+ * @author dzx
+ * @date 2024/5/10
+ */
+@Slf4j
+public class DataUtil {
+    /**
+     * 同步组织数据
+     * 只有批量添加接口,需要一个层级一个层级的添加
+     */
+    public Map<String, String> insertDepartment(Db db, String tableName, Map<String, String> tableData) throws Exception {
+        String sql = "SELECT DISTINCT LENGTH(hierarchy) FROM " + tableName + " WHERE delete_mark = 0";
+        List<Integer[]> list = db.query(sql, Integer[].class);
+        Set<Integer> levelSet = new HashSet<>();
+        for (Integer[] strings : list) {
+            levelSet.add(strings[0]);
+        }
+
+        sql = "SELECT * FROM " + tableName + " WHERE delete_mark = 0 ORDER BY LENGTH(hierarchy)";
+        List<Department> dataList = db.query(sql, Department.class);
+        String apiPath = "/api/resource/v1/org/batch/add";
+        Map<String, String> idMap = new HashMap<>();
+        JsonParser jsonParser = new JsonParser();
+        ApiUtil apiUtil = new ApiUtil();
+
+        Map<String, String> idCodeMap = new HashMap<>();
+        for (Integer level : levelSet) {
+            JsonArray dataArray = new JsonArray();
+            for (Department department : dataList) {
+                if(tableData != null && tableData.containsKey(department.getId().toString())){
+                    continue;
+                }
+                if(department.getHierarchy().length() == level){
+                    JsonObject paramJson = new JsonObject();
+                    paramJson.addProperty("clientId", department.getCode());
+                    paramJson.addProperty("orgIndexCode", department.getId().toString());
+                    paramJson.addProperty("orgName", department.getName());
+                    paramJson.addProperty("parentIndexCode", department.getParentId().toString());
+                    if(department.getParentId() == 0){
+                        paramJson.addProperty("parentIndexCode", "root000000");
+                    }
+                    paramJson.addProperty("orgCode", department.getCode());
+                    dataArray.add(paramJson);
+                    idCodeMap.put(department.getCode(), department.getId().toString());
+                }
+            }
+            String result = apiUtil.doPost(apiPath, dataArray.toString(), null, null);
+            JsonElement parse = jsonParser.parse(result);
+
+            JsonObject resultJson = parse.getAsJsonObject();
+            if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
+                JsonArray array = resultJson.get("data").getAsJsonObject().get("successes").getAsJsonArray();
+                for (JsonElement jsonElement : array) {
+                    JsonObject jsonObject = jsonElement.getAsJsonObject();
+                    idMap.put(idCodeMap.get(jsonObject.get("clientId").getAsString()), jsonObject.get("orgIndexCode").getAsString());
+                }
+            }
+        }
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+        return idMap;
+    }
+
+    /**
+     * 推送学生班级信息
+     */
+    public Map<String, String> insertClass(Db db, String tableName, Map<String, String> tableData) throws SQLException {
+        Map<String, String> idMap = new HashMap<>();
+        //1、查询字典,将走读住读、班级类型先推送过去
+        String sql = "SELECT * FROM xjr_dictionary_detail WHERE delete_mark = 0 AND item_id = 2023000000000000030";
+        List<DictionaryDetail> detailList = db.query(sql, DictionaryDetail.class);
+
+        String apiPath = "/api/resource/v1/org/batch/add";
+        JsonParser jsonParser = new JsonParser();
+        ApiUtil apiUtil = new ApiUtil();
+        int clientId = 1;
+        Map<Integer, String> idCodeMap = new HashMap<>();
+        JsonArray dataArray = new JsonArray();
+
+        Set<String> stduyStatus = new HashSet<>();
+
+        for (DictionaryDetail dict : detailList) {
+            if(tableData != null && tableData.containsKey(dict.getId().toString())){
+                stduyStatus.add(dict.getId().toString());
+                continue;
+            }
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("clientId", clientId);
+            paramJson.addProperty("orgIndexCode", dict.getCode());
+            paramJson.addProperty("orgName", dict.getName() + "学生");
+            paramJson.addProperty("parentIndexCode", "root000000");
+            paramJson.addProperty("orgCode", dict.getCode());
+            dataArray.add(paramJson);
+            idCodeMap.put(clientId, dict.getCode());
+            clientId ++;
+        }
+        String result = apiUtil.doPost(apiPath, dataArray.toString(), null, null);
+        JsonElement parse = jsonParser.parse(result);
+
+        JsonObject resultJson = parse.getAsJsonObject();
+        if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
+            JsonArray array = resultJson.get("data").getAsJsonObject().get("successes").getAsJsonArray();
+            for (JsonElement jsonElement : array) {
+                JsonObject jsonObject = jsonElement.getAsJsonObject();
+                idMap.put(idCodeMap.get(jsonObject.get("clientId").getAsInt()), jsonObject.get("orgIndexCode").getAsString());
+                stduyStatus.add(jsonObject.get("orgIndexCode").getAsString());
+            }
+        }
+        //推送班级类型
+        sql = "SELECT * FROM xjr_dictionary_detail WHERE delete_mark = 0 AND item_id = 2023000000000000039";
+        detailList = db.query(sql, DictionaryDetail.class);
+        dataArray = new JsonArray();
+        Set<String> classTypeSet = new HashSet<>();
+        for (String status : stduyStatus) {
+            for (DictionaryDetail dict : detailList) {
+                if(tableData != null && tableData.containsKey(dict.getCode())){
+                    classTypeSet.add(dict.getCode());
+                    continue;
+                }
+                JsonObject paramJson = new JsonObject();
+                paramJson.addProperty("clientId", clientId);
+                paramJson.addProperty("orgIndexCode", dict.getCode() + "-" + status);
+                paramJson.addProperty("orgName", dict.getName());
+                paramJson.addProperty("parentIndexCode", status);
+                paramJson.addProperty("orgCode", dict.getCode());
+                dataArray.add(paramJson);
+                idCodeMap.put(clientId, dict.getCode());
+                clientId ++;
+            }
+        }
+
+        result = apiUtil.doPost(apiPath, dataArray.toString(), null, null);
+        parse = jsonParser.parse(result);
+        resultJson = parse.getAsJsonObject();
+        if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
+            JsonArray array = resultJson.get("data").getAsJsonObject().get("successes").getAsJsonArray();
+            for (JsonElement jsonElement : array) {
+                JsonObject jsonObject = jsonElement.getAsJsonObject();
+                idMap.put(idCodeMap.get(jsonObject.get("clientId").getAsInt()), jsonObject.get("orgIndexCode").getAsString());
+                classTypeSet.add(jsonObject.get("orgIndexCode").getAsString());
+            }
+        }
+
+        //推送年级
+        sql = "SELECT * FROM base_grade WHERE delete_mark = 0 AND STATUS = 1";
+        List<BaseGrade> gradeList = db.query(sql, BaseGrade.class);
+        Map<Long, String> gradeNameMap = new HashMap<>();
+        dataArray = new JsonArray();
+        for (String classType : classTypeSet) {
+            for (BaseGrade baseGrade : gradeList) {
+                gradeNameMap.put(baseGrade.getId(), baseGrade.getName());
+                if(tableData != null && tableData.containsKey(baseGrade.getId().toString())){
+                    continue;
+                }
+                JsonObject paramJson = new JsonObject();
+                paramJson.addProperty("clientId", clientId);
+                paramJson.addProperty("orgIndexCode", baseGrade.getName() + "-" + classType);
+                paramJson.addProperty("orgName", baseGrade.getName());
+                paramJson.addProperty("parentIndexCode", classType);
+                paramJson.addProperty("orgCode", clientId);
+                dataArray.add(paramJson);
+                idCodeMap.put(clientId, baseGrade.getName());
+                clientId ++;
+            }
+        }
+
+        result = apiUtil.doPost(apiPath, dataArray.toString(), null, null);
+        parse = jsonParser.parse(result);
+        Set<String> gradeSet = new HashSet<>();
+        resultJson = parse.getAsJsonObject();
+        if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
+            JsonArray array = resultJson.get("data").getAsJsonObject().get("successes").getAsJsonArray();
+            for (JsonElement jsonElement : array) {
+                JsonObject jsonObject = jsonElement.getAsJsonObject();
+                idMap.put(idCodeMap.get(jsonObject.get("clientId").getAsInt()), jsonObject.get("orgIndexCode").getAsString());
+                gradeSet.add(jsonObject.get("orgIndexCode").getAsString());
+            }
+        }
+
+        //推送班级
+        sql = "SELECT * FROM base_class WHERE delete_mark = 0 AND is_graduate = 1 AND class_type IS NOT NULL";
+        List<BaseClass> classList = db.query(sql, BaseClass.class);
+
+        dataArray = new JsonArray();
+        for (String grade : gradeSet) {
+            String[] gradeGroup = grade.split("-");
+            for (BaseClass baseClass : classList) {
+                if(tableData != null && tableData.containsKey(baseClass.getId().toString())){
+                    continue;
+                }
+                String gradeName = gradeNameMap.get(baseClass.getGradeId());
+                if(!gradeGroup[0].equals(gradeName)){
+                    continue;
+                }
+
+                if(!gradeGroup[1].equals(baseClass.getClassType())){
+                    continue;
+                }
+                JsonObject paramJson = new JsonObject();
+                paramJson.addProperty("clientId", clientId);
+                paramJson.addProperty("orgIndexCode", baseClass.getId() + "-" + grade);
+                paramJson.addProperty("orgName", baseClass.getName());
+                paramJson.addProperty("parentIndexCode", grade);
+                paramJson.addProperty("orgCode", clientId);
+                dataArray.add(paramJson);
+                idCodeMap.put(clientId, baseClass.getId().toString());
+                clientId ++;
+            }
+        }
+
+        result = apiUtil.doPost(apiPath, dataArray.toString(), null, null);
+        parse = jsonParser.parse(result);
+        resultJson = parse.getAsJsonObject();
+        if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
+            JsonArray array = resultJson.get("data").getAsJsonObject().get("successes").getAsJsonArray();
+            for (JsonElement jsonElement : array) {
+                JsonObject jsonObject = jsonElement.getAsJsonObject();
+                idMap.put(idCodeMap.get(jsonObject.get("clientId").getAsInt()), jsonObject.get("orgIndexCode").getAsString());
+            }
+        }
+
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+
+        return idMap;
+    }
+
+    public Map<String, String> insertStudentOne(Db db, String tableName, Map<String, String> tableData) throws Exception {
+        String sql = "SELECT t1.id,t1.name,CONCAT(t3.id,'-',t4.name,'-',t3.class_type,'-',t2.stduy_status)," +
+                " t1.user_name,t1.gender,DATE_FORMAT(t1.birth_date, '%Y-%m-%d'),t1.mobile,t1.email,t1.credential_type,t1.credential_number FROM xjr_user t1" +
+                " INNER JOIN base_student_school_roll t2 ON t1.id = t2.user_id" +
+                " INNER JOIN base_class t3 ON t2.class_id = t3.id" +
+                " INNER JOIN base_grade t4 ON t3.grade_id = t4.id" +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t3.class_type IS NOT NULL";
+        List<String[]> list = db.query(sql, String[].class);
+        Map<Integer, String> clientMap = new HashMap<>();
+
+        String apiPath = "/api/resource/v2/person/single/add";
+        Map<String, String> idMap = new HashMap<>();
+        JsonParser jsonParser = new JsonParser();
+        ApiUtil apiUtil = new ApiUtil();
+        Map<String, String> header = new HashMap<>();
+        header.put("tagId", "insert_student");
+
+        for(int i = 1; i < list.size(); i ++){
+            String[] el = list.get(i);
+            if(tableData != null && tableData.containsKey(el[0])){
+                continue;
+            }
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("clientId", i);
+            paramJson.addProperty("personId", el[0]);
+            paramJson.addProperty("personName", el[1]);
+            paramJson.addProperty("orgIndexCode", el[2]);
+            paramJson.addProperty("phoneNo", el[6]);
+            paramJson.addProperty("jobNo", el[3]);
+            paramJson.addProperty("birthday", el[5]);
+            paramJson.addProperty("personType", 2);
+
+            int gender;
+            switch (el[4]) {
+                case "SB10001":
+                    gender = 1;
+                    break;
+                case "SB10002":
+                    gender = 2;
+                    break;
+                default:
+                    gender = 0;
+                    break;
+            }
+            paramJson.addProperty("gender", gender);
+
+            clientMap.put(i, el[0]);
+            String result = apiUtil.doPost(apiPath, paramJson.toString(), null, header);
+            JsonElement parse = jsonParser.parse(result);
+            JsonObject resultJson = parse.getAsJsonObject();
+            if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
+                JsonObject array = resultJson.get("data").getAsJsonObject();
+                idMap.put(el[0], array.get("personId").getAsString());
+            }
+        }
+
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+        return idMap;
+    }
+
+    public Map<String, String> insertStudent(Db db, String tableName, Map<String, String> tableData) throws Exception {
+        String sql = "SELECT t1.id,t1.name,CONCAT(t3.id,'-',t4.name,'-',t3.class_type,'-',t2.stduy_status)," +
+                " t1.user_name,t1.gender,t1.birth_date,t1.mobile,t1.email,t1.credential_type,t1.credential_number FROM xjr_user t1" +
+                " INNER JOIN base_student_school_roll t2 ON t1.id = t2.user_id" +
+                " INNER JOIN base_class t3 ON t2.class_id = t3.id" +
+                " INNER JOIN base_grade t4 ON t3.grade_id = t4.id" +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t3.class_type IS NOT NULL ";
+        List<String[]> list = db.query(sql, String[].class);
+        Map<Integer, String> clientMap = new HashMap<>();
+
+        String apiPath = "/api/resource/v1/person/batch/add";
+        Map<String, String> idMap = new HashMap<>();
+        JsonParser jsonParser = new JsonParser();
+        ApiUtil apiUtil = new ApiUtil();
+        Map<String, String> header = new HashMap<>();
+        header.put("tagId", "insert_student");
+
+        int maxCount = 100;
+
+        int frequency = list.size() / maxCount;
+        for(int index = 0; index < frequency; index ++){
+            JsonArray paramArray = new JsonArray();
+
+            for(int i = (index * maxCount); i < ((index + 1) * maxCount); i ++){
+                if(i >= list.size()){
+                    continue;
+                }
+                String[] el = list.get(i);
+                if(tableData != null && tableData.containsKey(el[0])){
+                    continue;
+                }
+                JsonObject paramJson = new JsonObject();
+                paramJson.addProperty("clientId", i);
+                paramJson.addProperty("personId", el[0]);
+                paramJson.addProperty("personName", el[1]);
+                paramJson.addProperty("orgIndexCode", el[2]);
+                paramJson.addProperty("phoneNo", el[6]);
+                paramJson.addProperty("jobNo", el[3]);
+                paramJson.addProperty("birthday", el[5]);
+                paramJson.addProperty("personType", 2);
+
+                int gender;
+                switch (el[4]) {
+                    case "SB10001":
+                        gender = 1;
+                        break;
+                    case "SB10002":
+                        gender = 2;
+                        break;
+                    default:
+                        gender = 0;
+                        break;
+                }
+                paramJson.addProperty("gender", gender);
+                paramArray.add(paramJson);
+
+                clientMap.put(i, el[0]);
+            }
+
+            String result = apiUtil.doPost(apiPath, paramArray.toString(), null, header);
+            JsonElement parse = jsonParser.parse(result);
+            JsonObject resultJson = parse.getAsJsonObject();
+            if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
+                JsonArray array = resultJson.get("data").getAsJsonObject().get("successes").getAsJsonArray();
+                for (JsonElement jsonElement : array) {
+                    JsonObject jsonObject = jsonElement.getAsJsonObject();
+                    idMap.put(clientMap.get(jsonObject.get("clientId").getAsInt()), jsonObject.get("personId").getAsString());
+                }
+            }
+        }
+
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+        return idMap;
+    }
+
+    public Map<String, String> insertTeacher(Db db, String tableName, Map<String, String> tableData, Map<String, String> deptMap) throws Exception {
+        String sql = "SELECT t1.id,t1.name,t1.gender,t3.dept_id,t1.birth_date,t1.mobile,t1.email,t1.credential_type,t1.credential_number,t1.user_name FROM xjr_user t1" +
+                " INNER JOIN " + tableName + " t2 ON t1.id = t2.user_id" +
+                " INNER JOIN xjr_user_dept_relation t3 ON t1.id = t3.user_id" +
+                " INNER JOIN xjr_department t4 ON t3.dept_id = t4.id " +
+                " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0 AND t4.delete_mark = 0";
+        List<String[]> list = db.query(sql, String[].class);
+        JsonArray paramArray = new JsonArray();
+        Map<Integer, String> clientMap = new HashMap<>();
+        for(int i = 0; i < list.size(); i ++){
+            String[] el = list.get(i);
+            if(tableData != null && tableData.containsKey(el[0])){
+                continue;
+            }
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("clientId", i);
+            paramJson.addProperty("personId", el[0]);
+            paramJson.addProperty("personName", el[1]);
+            paramJson.addProperty("orgIndexCode", deptMap.get(el[3]));
+            paramJson.addProperty("phoneNo", el[5]);
+            paramJson.addProperty("jobNo", el[9]);
+            paramJson.addProperty("birthday", el[4]);
+            paramJson.addProperty("personType", 1);
+
+            int gender;
+            switch (el[2]) {
+                case "SB10001":
+                    gender = 1;
+                    break;
+                case "SB10002":
+                    gender = 2;
+                    break;
+                default:
+                    gender = 0;
+                    break;
+            }
+            paramJson.addProperty("gender", gender);
+            paramArray.add(paramJson);
+
+            clientMap.put(i, el[0]);
+        }
+
+        String apiPath = "/api/resource/v1/person/batch/add";
+        Map<String, String> idMap = new HashMap<>();
+        JsonParser jsonParser = new JsonParser();
+        ApiUtil apiUtil = new ApiUtil();
+        Map<String, String> header = new HashMap<>();
+        header.put("tagId", "insert_teacher");
+
+        String result = apiUtil.doPost(apiPath, paramArray.toString(), null, header);
+        JsonElement parse = jsonParser.parse(result);
+        JsonObject resultJson = parse.getAsJsonObject();
+        if("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())){
+            JsonArray array = resultJson.get("data").getAsJsonObject().get("successes").getAsJsonArray();
+            for (JsonElement jsonElement : array) {
+                JsonObject jsonObject = jsonElement.getAsJsonObject();
+                idMap.put(clientMap.get(jsonObject.get("clientId").getAsInt()), jsonObject.get("personId").getAsString());
+            }
+        }else{
+
+        }
+        //插入记录表
+        insertRecord(db, tableName, idMap);
+        return idMap;
+    }
+
+    /*同步车辆数据*/
+    public Map<String, String> insertCar(Db db, String tableName, Map<Long, String> tableData) throws Exception {
+        String sql = "SELECT * FROM " + tableName + " WHERE delete_mark = 0 and status = 1";
+        List<CarMessageApply> dataList = db.query(sql, CarMessageApply.class);
+        String apiPath = "/api/resource/v1/vehicle/batch/add";
+        Map<String, String> idMap = new HashMap<>();
+        JsonParser jsonParser = new JsonParser();
+        ApiUtil apiUtil = new ApiUtil();
+
+        Map<String, String> idCodeMap = new HashMap<>();
+        idCodeMap.put("tagId", "frs");
+
+        JsonArray dataArray = new JsonArray();
+        String result = null;
+        for (CarMessageApply carMessageApply : dataList) {
+            long currentTimestamp = System.currentTimeMillis();
+            int randomSuffix = ThreadLocalRandom.current().nextInt(10000);
+            String uniqueClientIdStr = String.format("%03d%04d", currentTimestamp % 1000, randomSuffix);
+            long uniqueClientId = Long.parseLong(uniqueClientIdStr);
+
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("clientId", uniqueClientId);
+            paramJson.addProperty("plateNo", carMessageApply.getCarNumber());
+            paramJson.addProperty("PersonId",carMessageApply.getUserId());
+
+            int vehicleTypeNum;
+            switch (carMessageApply.getVehicleType()) {
+                case "小型车":
+                    vehicleTypeNum = 1;
+                    break;
+                case "大型车":
+                    vehicleTypeNum = 2;
+                    break;
+                case "摩托车":
+                    vehicleTypeNum = 3;
+                    break;
+                default:
+                    vehicleTypeNum = 0;
+                    break;
+            }
+            paramJson.addProperty("vehicleType", vehicleTypeNum);
+
+            dataArray.add(paramJson);
+        }
+        result = apiUtil.doPost(apiPath, dataArray.toString(), idCodeMap, null);
+
+        JsonElement parse = jsonParser.parse(result);
+
+        JsonObject resultJson = parse.getAsJsonObject();
+        if ("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())) {
+            JsonArray array = resultJson.get("data").getAsJsonObject().get("successes").getAsJsonArray();
+            for (JsonElement jsonElement : array) {
+                JsonObject jsonObject = jsonElement.getAsJsonObject();
+                idMap.put(jsonObject.get("clientId").getAsString(), jsonObject.get("vehicleId").getAsString());
+            }
+        } else {
+            System.err.println("API call failed: " + resultJson.get("msg").getAsString());
+        }
+
+        insertRecord(db, tableName, idMap);
+        return idMap;
+    }
+
+    void insertRecord(Db db, String tableName, Map<?, String> idsMap) throws SQLException {
+        if (idsMap.isEmpty()) {
+            return;
+        }
+        var sqls = new ArrayList<String>();
+        for (var entry : idsMap.entrySet()) {
+            var sourceId = entry.getKey();
+            var sql = "INSERT INTO hikvision_data(create_date, table_name, source_id, hikvision_id) " +
+                    "VALUES(now(), '" + tableName + "', '" + sourceId + "', '" + entry.getValue() + "')";
+            sqls.add(sql);
+        }
+        db.executeBatch(sqls);
+    }
+
+//    void insertRecord(Db db, String tableName, Map<Long, String> idsMap) throws SQLException {
+//        if(idsMap.isEmpty()){
+//            return;
+//        }
+//        List<String> sqls = new ArrayList<>();
+//        for (Long sourceId : idsMap.keySet()) {
+//            String sql = "INSERT INTO hikvision_data(create_date,table_name,source_id,hikvision_id) value(now(),'"
+//                    + tableName + "'," + sourceId + ",'" + idsMap.get(sourceId) + "')";
+//            sqls.add(sql);
+//        }
+//        db.executeBatch(sqls);
+//    };
+}

+ 67 - 0
src/main/java/com/xjrsoft/module/hikvision/util/FaceImportUtil.java

@@ -0,0 +1,67 @@
+package com.xjrsoft.module.hikvision.util;
+
+import com.google.gson.JsonObject;
+import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+
+
+public class FaceImportUtil {
+    private static FaceImportMapper faceImportMapper;
+    private static ApiUtil apiUtil;
+
+    public static String ImportTeacherFace(Long id) {
+        JsonObject paramJson = new JsonObject();
+        paramJson.addProperty("personId", faceImportMapper.GetTeacherUserIdById(id));
+        paramJson.addProperty("faceData", ImageToBase64(faceImportMapper.GetTeacherHikvisionImgById(id)));
+
+        Map<String, String> querys = new HashMap<>();
+        querys.put("tagId", "frs");
+
+        String apiPath = "/api/resource/v1/face/single/add";
+        String response = apiUtil.doPost(apiPath, String.valueOf(paramJson), querys);
+
+        return response;
+    }
+
+    public static String ImportStudentFace(Long id) {
+        JsonObject paramJson = new JsonObject();
+        paramJson.addProperty("personId", faceImportMapper.GetStudentUserIdById(id));
+        paramJson.addProperty("faceData", ImageToBase64(faceImportMapper.GetStudentHikvisionImgById(id)));
+
+        Map<String, String> querys = new HashMap<>();
+        querys.put("tagId", "frs");
+
+        String apiPath = "/api/resource/v1/face/single/add";
+        String response = apiUtil.doPost(apiPath, String.valueOf(paramJson), querys);
+
+        return response;
+    }
+
+    public static String ImageToBase64(String imageUrl) {
+        String base64String = "";
+        try {
+            URL url = new URL(imageUrl);
+            InputStream inputStream = url.openStream();
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            byte[] buffer = new byte[4096];
+            int bytesRead;
+            while ((bytesRead = inputStream.read(buffer)) != -1) {
+                outputStream.write(buffer, 0, bytesRead);
+            }
+            byte[] imageBytes = outputStream.toByteArray();
+            base64String = Base64.getEncoder().encodeToString(imageBytes);
+            inputStream.close();
+            outputStream.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return base64String;
+    }
+}

+ 92 - 0
src/main/java/com/xjrsoft/module/job/HikvisionBaseDataTask.java

@@ -0,0 +1,92 @@
+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.schedule.entity.JianyueData;
+import lombok.extern.slf4j.Slf4j;
+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 HikvisionBaseDataTask {
+
+
+    @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);
+            String sql = "SELECT distinct table_name FROM hikvision_data WHERE 1 = 1";
+            List<JianyueData> query = use.query(sql, JianyueData.class);
+            Set<String> tables = new HashSet<>();
+            for (JianyueData jianyueData : query) {
+                tables.add(jianyueData.getTableName());
+            }
+            sql = "SELECT * FROM hikvision_data WHERE 0 = 0";
+            List<HikvisionData> list = use.query(sql, HikvisionData.class);
+            Map<String, Map<String, String>> dataMap = new HashMap<>();
+            for (String table : tables) {
+                Map<String, String> tableData = new HashMap<>();
+                for (HikvisionData hikvisiondata : list) {
+                    if(!table.equals(hikvisiondata.getTableName())){
+                        continue;
+                    }
+                    tableData.put(hikvisiondata.getSourceId(), hikvisiondata.getHikvisionId());
+                }
+                dataMap.put(table, tableData);
+            }
+            DataUtil dataUtil = new DataUtil();
+            //查询根机构
+            //JsonArray schoolDistrictData = dataUtil.getSchoolDistrictData();
+            //推送组织机构
+            String tableName = "xjr_department";
+            Map<String, String> department = dataUtil.insertDepartment(use, tableName, dataMap.get(tableName));
+            if(department.isEmpty() && dataMap.get(tableName) != null){
+                department = dataMap.get(tableName);
+            }
+
+            //推送教职工
+            tableName = "base_teacher";
+            dataUtil.insertTeacher(use, tableName, dataMap.get(tableName), department);
+
+            //推送车辆
+            String carTableName = "car_message_apply";
+            dataUtil.insertCar(use, carTableName, null);
+
+            tableName = "base_class";
+            Map<String, String> baseClass = dataMap.get(tableName);
+            Map<String, String> classes = dataUtil.insertClass(use, tableName, baseClass);
+
+
+            tableName = "base_student";
+            Map<String, String> baseStudent = dataMap.get(tableName);
+            Map<String, String> student = dataUtil.insertStudentOne(use, tableName, baseStudent);
+
+            log.info("数据推送完成");
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+}

+ 36 - 0
src/main/java/com/xjrsoft/module/liteflow/node/CarMessageApplyNode.java

@@ -0,0 +1,36 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.personnel.entity.CarMessageApply;
+import com.xjrsoft.module.personnel.service.ICarMessageApplyService;
+import com.xjrsoft.module.student.service.IBaseStudentAssessmentClassRelationService;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 车辆申请,通过后修改状态
+ */
+@Component("car_message_apply_node")
+public class CarMessageApplyNode extends NodeComponent {
+
+    @Autowired
+    private ICarMessageApplyService carMessageApplyService;
+
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params,"id");
+        Long formId = Convert.toLong(value);
+        if (formId != null) {
+            // 数据处理
+            CarMessageApply carMessageApply = carMessageApplyService.getById(formId);
+            carMessageApply.setStatus(1);
+
+            carMessageApplyService.updateById(carMessageApply);
+        }
+    }
+}

+ 37 - 0
src/main/java/com/xjrsoft/module/liteflow/node/ImportStudentFaceNode.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.hikvision.util.FaceImportUtil;
+import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
+import com.xjrsoft.module.personnel.service.IStundentFaceProcessService;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 导出学生照片到海康平台
+ */
+@Component("import_student_face_node")
+public class ImportStudentFaceNode extends NodeComponent {
+    @Autowired
+    private IStundentFaceProcessService stundentFaceProcessService;
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params,"id");
+        Long formId = Convert.toLong(value);
+        if (formId != null) {
+            // 数据处理
+            StundentFaceProcess dataObj = stundentFaceProcessService.getById(formId);
+            dataObj.setStatus(1);
+
+            stundentFaceProcessService.updateById(dataObj);
+
+            FaceImportUtil.ImportStudentFace(formId);
+        }
+    }
+}
+

+ 38 - 0
src/main/java/com/xjrsoft/module/liteflow/node/ImportTeacherFaceNode.java

@@ -0,0 +1,38 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.personnel.entity.TeacherFaceProcess;
+import com.xjrsoft.module.personnel.service.ITeacherFaceProcessService;
+import com.yomahub.liteflow.core.NodeComponent;
+import com.xjrsoft.module.hikvision.util.FaceImportUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 导出老师照片到海康平台
+ */
+@Component("import_teacher_face_node")
+public class ImportTeacherFaceNode extends NodeComponent {
+
+    @Autowired
+    private ITeacherFaceProcessService teacherFaceProcessService;
+
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params,"id");
+        Long formId = Convert.toLong(value);
+        if (formId != null) {
+            // 数据处理
+            TeacherFaceProcess dataObj = teacherFaceProcessService.getById(formId);
+            dataObj.setStatus(1);
+
+            teacherFaceProcessService.updateById(dataObj);
+
+            FaceImportUtil.ImportTeacherFace(formId);
+        }
+    }
+}

+ 37 - 0
src/main/java/com/xjrsoft/module/liteflow/node/ReservationSchoolNode.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.personnel.entity.CarMessageApply;
+import com.xjrsoft.module.personnel.entity.ReservationSchool;
+import com.xjrsoft.module.personnel.service.ICarMessageApplyService;
+import com.xjrsoft.module.personnel.service.IReservationSchoolService;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 预约进校-进校人员,通过后修改状态
+ */
+@Component("reservation_school_node")
+public class ReservationSchoolNode extends NodeComponent {
+
+    @Autowired
+    private IReservationSchoolService reservationSchoolService;
+
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params,"id");
+        Long formId = Convert.toLong(value);
+        if (formId != null) {
+            // 数据处理
+            ReservationSchool dataObj = reservationSchoolService.getById(formId);
+            dataObj.setStatus(1);
+
+            reservationSchoolService.updateById(dataObj);
+        }
+    }
+}

+ 37 - 0
src/main/java/com/xjrsoft/module/liteflow/node/StudentAdmissionApplicationNode.java

@@ -0,0 +1,37 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.personnel.entity.ReservationSchool;
+import com.xjrsoft.module.personnel.service.IReservationSchoolService;
+import com.xjrsoft.module.student.entity.StudentAdmissionApplication;
+import com.xjrsoft.module.student.service.IStudentAdmissionApplicationService;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 预约进校-进校人员,通过后修改状态
+ */
+@Component("student_admission_application_node")
+public class StudentAdmissionApplicationNode extends NodeComponent {
+
+    @Autowired
+    private IStudentAdmissionApplicationService studentAdmissionApplicationService;
+
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params,"id");
+        Long formId = Convert.toLong(value);
+        if (formId != null) {
+            // 数据处理
+            StudentAdmissionApplication dataObj = studentAdmissionApplicationService.getById(formId);
+            dataObj.setStatus(1);
+
+            studentAdmissionApplicationService.updateById(dataObj);
+        }
+    }
+}

+ 31 - 0
src/main/java/com/xjrsoft/module/liteflow/node/WfStatusChangeNode.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.student.service.IBaseStudentAssessmentClassRelationService;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 学生班级巡查考核流程结束处理
+ */
+@Component("wf_status_change_node")
+public class WfStatusChangeNode extends NodeComponent {
+
+    @Autowired
+    private IBaseStudentAssessmentClassRelationService assessmentClassRelationService;
+
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params,"id");
+        Long formId = Convert.toLong(value);
+        if (formId != null) {
+            // 数据处理
+            assessmentClassRelationService.dataCache(formId);
+        }
+    }
+}

+ 6 - 0
src/main/java/com/xjrsoft/module/oa/vo/NewsPageVo.java

@@ -178,4 +178,10 @@ public class NewsPageVo {
      */
     @ApiModelProperty("状态 1=未发布 2=已发布 3=下架")
     private Integer status;
+
+    @ApiModelProperty("创建人名字")
+    private String createUserName;
+
+    @ApiModelProperty("封面")
+    private Long cover;
 }

+ 10 - 5
src/main/java/com/xjrsoft/module/organization/controller/DepartmentController.java

@@ -10,8 +10,10 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.core.type.TypeReference;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.constant.GlobalConstant;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.YesOrNoEnum;
 import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.page.ConventPage;
@@ -228,11 +230,14 @@ public class DepartmentController {
     @XjrLog(value = "删除机构")
     public R delete(@RequestBody List<Long> ids) {
         //删除岗位时,需要判断,此机构下是不是存在人员,存在人员就不能删除
-        List<UserDeptRelation> userDeptRelationList = redisUtil.get(GlobalConstant.USER_DEPT_RELATION_CACHE_KEY, new TypeReference<List<UserDeptRelation>>() {
-        });
-        //拿ids进行过滤,如果存在,就不能删除
-        List<UserDeptRelation> users = userDeptRelationList.stream().filter(u -> ids.contains(u.getDeptId())).collect(Collectors.toList());
-        if (users.size()>0){
+        Integer count = userService.selectJoinCount(
+                new MPJLambdaWrapper<User>()
+                        .leftJoin(" xjr_user_dept_relation t1 on t.id = t1.user_id")
+                        .in("t1.dept_id", ids)
+                        .eq(User::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        if (count > 0){
             return R.error("此机构下存在用户!");
         }
         departmentService.removeBatchByIds(ids);

+ 27 - 12
src/main/java/com/xjrsoft/module/organization/controller/UserController.java

@@ -62,17 +62,7 @@ import com.xjrsoft.module.organization.service.IUserRoleRelationService;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.service.IUserStudentService;
 import com.xjrsoft.module.organization.utils.OrganizationUtil;
-import com.xjrsoft.module.organization.vo.PendingCountDto;
-import com.xjrsoft.module.organization.vo.ResetUserPageVo;
-import com.xjrsoft.module.organization.vo.ResetUserRoleVo;
-import com.xjrsoft.module.organization.vo.UserDeptVo;
-import com.xjrsoft.module.organization.vo.UserInfoVo;
-import com.xjrsoft.module.organization.vo.UserListVo;
-import com.xjrsoft.module.organization.vo.UserPageVo;
-import com.xjrsoft.module.organization.vo.UserPostVo;
-import com.xjrsoft.module.organization.vo.UserRoleVo;
-import com.xjrsoft.module.organization.vo.UserStudentVo;
-import com.xjrsoft.module.organization.vo.UserVo;
+import com.xjrsoft.module.organization.vo.*;
 import com.xjrsoft.module.oss.factory.OssFactory;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.system.entity.File;
@@ -272,9 +262,32 @@ public class UserController {
                 .stream().map(UserDeptRelation::getDeptId).collect(Collectors.toList());
         String allDeptIdStr = StrUtil.join(StringPool.COMMA, deptIds);
         userVo.setDepartmentIds(allDeptIdStr);
+
+        List<Long> roleIds = userRoleRelationService.list(
+                Wrappers.lambdaQuery(UserRoleRelation.class)
+                .eq(UserRoleRelation::getUserId, user.getId())
+                ).stream().map(UserRoleRelation::getRoleId).collect(Collectors.toList());
+        userVo.setRoleIds(roleIds);
         return R.ok(userVo);
     }
 
+    @GetMapping(value = "/detail")
+    @ApiOperation(value = "根据id查询用户信息")
+    public RT<UserDetailVo> detail(@RequestParam Long id) {
+        User user = userService.getById(id);
+        if (user == null) {
+            R.error("找不到此用户!");
+        }
+        UserDetailVo userVo = BeanUtil.toBean(user, UserDetailVo.class);
+        List<Long> deptIds = userDeptRelationService.list(Wrappers.lambdaQuery(UserDeptRelation.class)
+                        .eq(UserDeptRelation::getUserId, user.getId()))
+                .stream().map(UserDeptRelation::getDeptId).collect(Collectors.toList());
+        String allDeptIdStr = StrUtil.join(StringPool.COMMA, deptIds);
+        userVo.setDepartmentIds(allDeptIdStr);
+
+        return RT.ok(userVo);
+    }
+
     @PostMapping
     @ApiOperation(value = "新增用户")
     public R add(@Valid @RequestBody AddUserDto dto) {
@@ -637,7 +650,9 @@ public class UserController {
             return R.error("验证码不正确!");
         }
         // 赋值家长角色
-        dto.setRoleId(RoleEnum.PARENT.getCode());
+        List<Long> roleIds = new ArrayList<>();
+        roleIds.add(RoleEnum.PARENT.getCode());
+        dto.setRoleIds(roleIds);
         return R.ok(userService.add(dto));
     }
 

+ 2 - 1
src/main/java/com/xjrsoft/module/organization/dto/AddUserDto.java

@@ -12,6 +12,7 @@ import javax.validation.constraints.Pattern;
 import java.io.Serializable;
 import java.sql.Timestamp;
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @title: AddUserDto
@@ -60,7 +61,7 @@ public class AddUserDto implements Serializable {
 
     //@NotNull(message = "角色不能为空!")
     @ApiModelProperty(value = "角色Id",required = true)
-    private Long roleId;
+    private List<Long> roleIds;
 
     @ApiModelProperty("头像")
     private String avatar;

+ 5 - 0
src/main/java/com/xjrsoft/module/organization/dto/UpdateUserDto.java

@@ -11,6 +11,7 @@ import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 import java.io.Serializable;
 import java.sql.Timestamp;
+import java.util.List;
 
 /**
  * @title: UpdateUserDto
@@ -93,4 +94,8 @@ public class UpdateUserDto implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd")
     @ApiModelProperty("生日")
     private Timestamp birthDate;
+
+
+    @ApiModelProperty("角色")
+    private List<Long> roleIds;
 }

+ 21 - 5
src/main/java/com/xjrsoft/module/organization/service/impl/UserServiceImpl.java

@@ -5,6 +5,7 @@ import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.convert.Convert;
+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;
@@ -94,11 +95,13 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
         save(user);
 
         // 添加角色
-        if (dto.getRoleId() != null) {
-            UserRoleRelation userRoleRelation = new UserRoleRelation();
-            userRoleRelation.setUserId(user.getId());
-            userRoleRelation.setRoleId(dto.getRoleId());
-            userRoleRelationMapper.insert(userRoleRelation);
+        if (dto.getRoleIds() != null) {
+            for (Long roleId : dto.getRoleIds()) {
+                UserRoleRelation userRoleRelation = new UserRoleRelation();
+                userRoleRelation.setUserId(user.getId());
+                userRoleRelation.setRoleId(roleId);
+                userRoleRelationMapper.insert(userRoleRelation);
+            }
         }
 
         List<UserDeptRelation> userDeptRelationList = new ArrayList<>();
@@ -161,6 +164,19 @@ public class UserServiceImpl extends MPJBaseServiceImpl<UserMapper, User> implem
             userDeptRelationService.saveBatch(userDeptRelationList);
         }
 
+        //先删除再新增
+        userRoleRelationMapper.delete(Wrappers.<UserRoleRelation>query().lambda().eq(UserRoleRelation::getUserId, user.getId()));
+        if (ObjectUtil.isNotNull(dto.getRoleIds())) {
+            for (Long roleId : dto.getRoleIds()) {
+                //将用户所选部门保存到关联表中
+                UserRoleRelation userRoleRelation = new UserRoleRelation();
+                userRoleRelation.setUserId(user.getId());
+                userRoleRelation.setRoleId(roleId);
+
+                userRoleRelationMapper.insert(userRoleRelation);
+            }
+        }
+
 
         CompletableFuture.runAsync(() -> {
             List<User> list = list();

+ 53 - 0
src/main/java/com/xjrsoft/module/organization/vo/UserDetailVo.java

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.organization.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class UserDetailVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    private String id;
+    /**
+     * 账户
+     */
+    @ApiModelProperty("账户")
+    private String userName;
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+    /**
+     * 性别
+     */
+    @ApiModelProperty("性别")
+    private String gender;
+    /**
+     * 手机号
+     */
+    @ApiModelProperty("手机号")
+    private String mobile;
+    /**
+     * 邮箱
+     */
+    @ApiModelProperty("邮箱")
+    private String email;
+    /**
+     * 部门
+     */
+    @ApiModelProperty("部门")
+    private String departmentIds;
+    /**
+     * 身份证
+     */
+    @ApiModelProperty("身份证")
+    private String credentialNumber;
+}

+ 4 - 0
src/main/java/com/xjrsoft/module/organization/vo/UserInfoVo.java

@@ -125,4 +125,8 @@ public class UserInfoVo {
 
     @ApiModelProperty("签名文件id")
     private Long signFolderId;
+
+
+    @ApiModelProperty("身份证")
+    private String credentialNumber;
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/organization/vo/UserVo.java

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * @title: UserVo
@@ -111,5 +112,8 @@ public class UserVo implements Serializable {
 
     @ApiModelProperty("生日")
     private LocalDateTime birthDate;
+
+    @ApiModelProperty("角色id")
+    private List<Long> roleIds;
 }
 

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

@@ -0,0 +1,128 @@
+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;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.outint.dto.AddCarOutInRecordDto;
+import com.xjrsoft.module.outint.dto.CarOutInRecordPageDto;
+import com.xjrsoft.module.outint.dto.UpdateCarOutInRecordDto;
+import com.xjrsoft.module.outint.entity.CarOutInRecord;
+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;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 车辆出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/outint" + "/carOutInRecord")
+@Api(value = "/outint"  + "/carOutInRecord",tags = "车辆出入记录代码")
+@AllArgsConstructor
+public class CarOutInRecordController {
+
+
+    private final ICarOutInRecordService carOutInRecordService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="车辆出入记录列表(分页)")
+    @SaCheckPermission("caroutinrecord:detail")
+    public RT<PageOutput<CarOutInRecordPageVo>> page(@Valid CarOutInRecordPageDto dto){
+
+        IPage<CarOutInRecordPageVo> page = carOutInRecordService.selectJoinListPage(ConventPage.getPage(dto),CarOutInRecordPageVo.class,
+                MPJWrappers.<CarOutInRecord>lambdaJoin()
+                        .orderByDesc(CarOutInRecord::getId)
+                        .ge(ObjectUtil.isNotNull(dto.getStartTime()),CarOutInRecord::getRecordTime,dto.getStartTime())
+                        .le(ObjectUtil.isNotNull(dto.getEndTime()),CarOutInRecord::getRecordTime,dto.getEndTime())
+                        .eq(ObjectUtil.isNotNull(dto.getCategory()), CarOutInRecord::getCategory, dto.getCategory())
+                        .eq(ObjectUtil.isNotNull(dto.getStatus()), CarOutInRecord::getStatus, dto.getStatus())
+                        .eq(ObjectUtil.isNotNull(dto.getVehicleType()), CarMessageApply::getVehicleType, dto.getVehicleType())
+                        .like(StrUtil.isNotBlank(dto.getName()), ReservationSchoolPeople::getName,dto.getName())
+                        .like(StrUtil.isNotBlank(dto.getPhone()),ReservationSchoolPeople::getPhone,dto.getPhone())
+                        .select(CarOutInRecord::getId)
+                        .select(ReservationSchoolPeople::getPhone,ReservationSchoolPeople::getGender,ReservationSchoolPeople::getName,ReservationSchoolPeople::getIdentityCard,ReservationSchoolPeople::getPlateNumber)
+                        .select(CarOutInRecord.class,x -> VoToColumnUtil.fieldsToColumns(CarOutInRecordPageVo.class).contains(x.getProperty()))
+                        .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))
+                );
+
+        PageOutput<CarOutInRecordPageVo> pageOutput = ConventPage.getPageOutput(page, CarOutInRecordPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询车辆出入记录信息")
+    @SaCheckPermission("caroutinrecord:detail")
+    public RT<CarOutInRecordVo> info(@RequestParam Long id){
+        CarOutInRecord carOutInRecord = carOutInRecordService.getById(id);
+        if (carOutInRecord == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(carOutInRecord, CarOutInRecordVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增车辆出入记录")
+    @SaCheckPermission("caroutinrecord:add")
+    public RT<Boolean> add(@Valid @RequestBody AddCarOutInRecordDto dto){
+        CarOutInRecord carOutInRecord = BeanUtil.toBean(dto, CarOutInRecord.class);
+        boolean isSuccess = carOutInRecordService.save(carOutInRecord);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改车辆出入记录")
+    @SaCheckPermission("caroutinrecord:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateCarOutInRecordDto dto){
+
+        CarOutInRecord carOutInRecord = BeanUtil.toBean(dto, CarOutInRecord.class);
+        return RT.ok(carOutInRecordService.updateById(carOutInRecord));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除车辆出入记录")
+    @SaCheckPermission("caroutinrecord:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(carOutInRecordService.removeBatchByIds(ids));
+
+    }
+
+}

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

@@ -0,0 +1,128 @@
+package com.xjrsoft.module.outint.controller;
+
+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;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseClass;
+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;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 学生出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/outint" + "/studentOutInRecord")
+@Api(value = "/outint"  + "/studentOutInRecord",tags = "学生出入记录代码")
+@AllArgsConstructor
+public class StudentOutInRecordController {
+
+
+    private final IStudentOutInRecordService studentOutInRecordService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="学生出入记录列表(分页)")
+    @SaCheckPermission("studentoutinrecord:detail")
+    public RT<PageOutput<StudentOutInRecordPageVo>> page(@Valid StudentOutInRecordPageDto dto){
+
+        MPJLambdaWrapper<StudentOutInRecord> queryWrapper = MPJWrappers.<StudentOutInRecord>lambdaJoin()
+                    .orderByDesc(StudentOutInRecord::getId)
+                .like(StrUtil.isNotBlank(dto.getName()), XjrUser::getName,dto.getName())
+                .like(StrUtil.isNotBlank(dto.getIdentityCard()), XjrUser::getCredentialNumber,dto.getIdentityCard())
+               .eq(StrUtil.isNotBlank(dto.getStduyStatus()), BaseStudentSchoolRoll::getStduyStatus,dto.getStduyStatus())
+                .ge(ObjectUtil.isNotNull(dto.getStartTime()), StudentOutInRecord::getRecordTime,dto.getStartTime()+" 00:00:00")
+                .le(ObjectUtil.isNotNull(dto.getStartTime()),StudentOutInRecord::getRecordTime,dto.getStartTime()+" 23:59:59")
+                .eq(ObjectUtil.isNotNull(dto.getStatus()), StudentOutInRecord::getStatus, dto.getStatus())
+                .eq(ObjectUtil.isNotNull(dto.getClassId())&&dto.getClassId()!=0, StudentOutInRecord::getClassId, dto.getClassId())
+                .select(StudentOutInRecord::getId)
+                .select(StudentOutInRecord.class,x -> VoToColumnUtil.fieldsToColumns(StudentOutInRecordPageVo.class).contains(x.getProperty()))
+                .select(XjrUser::getName,XjrUser::getMobile,XjrUser::getCredentialNumber)
+                .leftJoin(XjrUser.class,XjrUser::getId,StudentOutInRecord::getUserId)
+                .leftJoin(BaseClass.class,BaseClass::getId,StudentOutInRecord::getClassId,ext->ext.selectAs(BaseClass::getName,StudentOutInRecordPageVo::getClassCn))
+                .leftJoin(XjrUser.class,XjrUser::getId,StudentOutInRecord::getTeacherId,ext->ext.selectAs(XjrUser::getName,StudentOutInRecordPageVo::getTeacherCn))
+                .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);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询学生出入记录信息")
+    @SaCheckPermission("studentoutinrecord:detail")
+    public RT<StudentOutInRecordVo> info(@RequestParam Long id){
+        StudentOutInRecord studentOutInRecord = studentOutInRecordService.getById(id);
+        if (studentOutInRecord == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(studentOutInRecord, StudentOutInRecordVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增学生出入记录")
+    @SaCheckPermission("studentoutinrecord:add")
+    public RT<Boolean> add(@Valid @RequestBody AddStudentOutInRecordDto dto){
+        StudentOutInRecord studentOutInRecord = BeanUtil.toBean(dto, StudentOutInRecord.class);
+        boolean isSuccess = studentOutInRecordService.save(studentOutInRecord);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改学生出入记录")
+    @SaCheckPermission("studentoutinrecord:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateStudentOutInRecordDto dto){
+
+        StudentOutInRecord studentOutInRecord = BeanUtil.toBean(dto, StudentOutInRecord.class);
+        return RT.ok(studentOutInRecordService.updateById(studentOutInRecord));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除学生出入记录")
+    @SaCheckPermission("studentoutinrecord:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(studentOutInRecordService.removeBatchByIds(ids));
+
+    }
+
+}

+ 128 - 0
src/main/java/com/xjrsoft/module/outint/controller/TeacherOutInRecordController.java

@@ -0,0 +1,128 @@
+package com.xjrsoft.module.outint.controller;
+
+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;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.organization.entity.UserDeptRelation;
+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;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 教师出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/outint" + "/teacherOutInRecord")
+@Api(value = "/outint"  + "/teacherOutInRecord",tags = "教师出入记录代码")
+@AllArgsConstructor
+public class TeacherOutInRecordController {
+
+
+    private final ITeacherOutInRecordService teacherOutInRecordService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="教师出入记录列表(分页)")
+    @SaCheckPermission("teacheroutinrecord:detail")
+    public RT<PageOutput<TeacherOutInRecordPageVo>> page(@Valid TeacherOutInRecordPageDto dto){
+
+        MPJLambdaWrapper<TeacherOutInRecord> queryWrapper= MPJWrappers.<TeacherOutInRecord>lambdaJoin()
+                .orderByDesc(TeacherOutInRecord::getId)
+                .like(StrUtil.isNotBlank(dto.getName()), XjrUser::getName,dto.getName())
+                .ge(ObjectUtil.isNotNull(dto.getStartTime()),TeacherOutInRecord::getRecordTime,dto.getStartTime()+" 00:00:00")
+                .le(ObjectUtil.isNotNull(dto.getStartTime()),TeacherOutInRecord::getRecordTime,dto.getStartTime()+" 23:59:59")
+                .eq(ObjectUtil.isNotNull(dto.getStatus()), TeacherOutInRecord::getStatus, dto.getStatus())
+                .select(TeacherOutInRecord::getId)
+                .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){
+            queryWrapper.leftJoin(UserDeptRelation.class,UserDeptRelation::getUserId,XjrUser::getId)
+                    .eq(UserDeptRelation::getDeptId,dto.getDeptId());
+        }
+        IPage<TeacherOutInRecordPageVo> page = teacherOutInRecordService.selectJoinListPage(ConventPage.getPage(dto),TeacherOutInRecordPageVo.class, queryWrapper);
+        PageOutput<TeacherOutInRecordPageVo> pageOutput = ConventPage.getPageOutput(page, TeacherOutInRecordPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询教师出入记录信息")
+    @SaCheckPermission("teacheroutinrecord:detail")
+    public RT<TeacherOutInRecordVo> info(@RequestParam Long id){
+        TeacherOutInRecord teacherOutInRecord = teacherOutInRecordService.getById(id);
+        if (teacherOutInRecord == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(teacherOutInRecord, TeacherOutInRecordVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增教师出入记录")
+    @SaCheckPermission("teacheroutinrecord:add")
+    public RT<Boolean> add(@Valid @RequestBody AddTeacherOutInRecordDto dto){
+        TeacherOutInRecord teacherOutInRecord = BeanUtil.toBean(dto, TeacherOutInRecord.class);
+        boolean isSuccess = teacherOutInRecordService.save(teacherOutInRecord);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改教师出入记录")
+    @SaCheckPermission("teacheroutinrecord:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateTeacherOutInRecordDto dto){
+
+        TeacherOutInRecord teacherOutInRecord = BeanUtil.toBean(dto, TeacherOutInRecord.class);
+        return RT.ok(teacherOutInRecordService.updateById(teacherOutInRecord));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除教师出入记录")
+    @SaCheckPermission("teacheroutinrecord:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(teacherOutInRecordService.removeBatchByIds(ids));
+
+    }
+
+}

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

@@ -0,0 +1,131 @@
+package com.xjrsoft.module.outint.controller;
+
+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;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+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;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 访客出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/outint" + "/visitorOutInRecord")
+@Api(value = "/outint"  + "/visitorOutInRecord",tags = "访客出入记录代码")
+@AllArgsConstructor
+public class VisitorOutInRecordController {
+
+
+    private final IVisitorOutInRecordService visitorOutInRecordService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="访客出入记录列表(分页)")
+    @SaCheckPermission("visitoroutinrecord:detail")
+    public RT<PageOutput<VisitorOutInRecordPageVo>> page(@Valid VisitorOutInRecordPageDto dto){
+        IPage<VisitorOutInRecordPageVo> page = visitorOutInRecordService.selectJoinListPage(ConventPage.getPage(dto),VisitorOutInRecordPageVo.class,
+                MPJWrappers.<VisitorOutInRecord>lambdaJoin()
+                        .orderByDesc(VisitorOutInRecord::getId)
+                        .like(StrUtil.isNotBlank(dto.getName()), ReservationSchoolPeople::getName,dto.getName())
+                        .like(StrUtil.isNotBlank(dto.getIdentityCard()), ReservationSchoolPeople::getIdentityCard,dto.getIdentityCard())
+                        .eq(ObjectUtil.isNotNull(dto.getDeptId())&&dto.getDeptId()!=0, ReservationSchool::getDeptId, dto.getDeptId())
+                        .eq(ObjectUtil.isNotNull(dto.getRespondentUserId())&&dto.getRespondentUserId()!=0, ReservationSchool::getRespondentUserId, dto.getRespondentUserId())
+                        .ge(ObjectUtil.isNotNull(dto.getStartTime()),VisitorOutInRecord::getRecordTime,dto.getStartTime())
+                        .le(ObjectUtil.isNotNull(dto.getEndTime()),VisitorOutInRecord::getRecordTime,dto.getEndTime())
+                        .eq(ObjectUtil.isNotNull(dto.getStatus()), VisitorOutInRecord::getStatus, dto.getStatus())
+                        .like(StrUtil.isNotBlank(dto.getPlateNumber()),ReservationSchoolPeople::getPlateNumber,dto.getPlateNumber())
+                        .select(VisitorOutInRecord.class,x -> VoToColumnUtil.fieldsToColumns(VisitorOutInRecordPageVo.class).contains(x.getProperty()))
+                        .select(ReservationSchoolPeople::getName,ReservationSchoolPeople::getIdentityCard,ReservationSchoolPeople::getPhone,ReservationSchoolPeople::getPlateNumber)
+                        .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))
+                );
+        PageOutput<VisitorOutInRecordPageVo> pageOutput = ConventPage.getPageOutput(page, VisitorOutInRecordPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询访客出入记录信息")
+    @SaCheckPermission("visitoroutinrecord:detail")
+    public RT<VisitorOutInRecordVo> info(@RequestParam Long id){
+        VisitorOutInRecord visitorOutInRecord = visitorOutInRecordService.getById(id);
+        if (visitorOutInRecord == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(visitorOutInRecord, VisitorOutInRecordVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增访客出入记录")
+    @SaCheckPermission("visitoroutinrecord:add")
+    public RT<Boolean> add(@Valid @RequestBody AddVisitorOutInRecordDto dto){
+        VisitorOutInRecord visitorOutInRecord = BeanUtil.toBean(dto, VisitorOutInRecord.class);
+        boolean isSuccess = visitorOutInRecordService.save(visitorOutInRecord);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改访客出入记录")
+    @SaCheckPermission("visitoroutinrecord:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateVisitorOutInRecordDto dto){
+
+        VisitorOutInRecord visitorOutInRecord = BeanUtil.toBean(dto, VisitorOutInRecord.class);
+        return RT.ok(visitorOutInRecordService.updateById(visitorOutInRecord));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除访客出入记录")
+    @SaCheckPermission("visitoroutinrecord:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(visitorOutInRecordService.removeBatchByIds(ids));
+
+    }
+
+}

+ 52 - 0
src/main/java/com/xjrsoft/module/outint/dto/AddCarOutInRecordDto.java

@@ -0,0 +1,52 @@
+package com.xjrsoft.module.outint.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 车辆出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class AddCarOutInRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 车辆id(car_message_apply),固定车辆使用
+    */
+    @ApiModelProperty("车辆id(car_message_apply),固定车辆使用")
+    private Long carMessageApplyId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+    /**
+    * 访客车辆(reservation_school_people),临时车辆使用
+    */
+    @ApiModelProperty("访客车辆(reservation_school_people),临时车辆使用")
+    private Long reservationSchoolPeopleId;
+    /**
+    * 车辆分类(0:固定车辆 1:临时车辆)
+    */
+    @ApiModelProperty("车辆分类(0:固定车辆 1:临时车辆)")
+    private Integer category;
+
+}

+ 52 - 0
src/main/java/com/xjrsoft/module/outint/dto/AddStudentOutInRecordDto.java

@@ -0,0 +1,52 @@
+package com.xjrsoft.module.outint.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 学生出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class AddStudentOutInRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 班主任id
+    */
+    @ApiModelProperty("班主任id")
+    private Long teacherId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private Long classId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+}

+ 42 - 0
src/main/java/com/xjrsoft/module/outint/dto/AddTeacherOutInRecordDto.java

@@ -0,0 +1,42 @@
+package com.xjrsoft.module.outint.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 教师出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class AddTeacherOutInRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+}

+ 42 - 0
src/main/java/com/xjrsoft/module/outint/dto/AddVisitorOutInRecordDto.java

@@ -0,0 +1,42 @@
+package com.xjrsoft.module.outint.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+
+
+/**
+* @title: 访客出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class AddVisitorOutInRecordDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 访客id(reservation_school_people)
+    */
+    @ApiModelProperty("访客id(reservation_school_people)")
+    private Long reservationSchoolPeopleId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+}

+ 61 - 0
src/main/java/com/xjrsoft/module/outint/dto/CarOutInRecordPageDto.java

@@ -0,0 +1,61 @@
+package com.xjrsoft.module.outint.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+
+/**
+* @title: 车辆出入记录分页查询入参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class CarOutInRecordPageDto extends PageInput {
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime startTime;
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime endTime;
+    /**
+     * 车辆分类
+     */
+    @ApiModelProperty("车辆分类")
+    private  String category;
+    /**
+     * 过车方向
+     */
+    @ApiModelProperty("过车方向")
+    private  String status;
+    /**
+     * 车辆类型
+     */
+    @ApiModelProperty("车辆类型")
+    private String vehicleType;
+
+    /**
+     * 车主姓名
+     */
+    @ApiModelProperty("车主姓名")
+    private String name;
+
+    /**
+     * 手机号码
+     */
+    @ApiModelProperty("手机号码")
+    private String phone;
+
+}

+ 62 - 0
src/main/java/com/xjrsoft/module/outint/dto/StudentOutInRecordPageDto.java

@@ -0,0 +1,62 @@
+package com.xjrsoft.module.outint.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+
+/**
+* @title: 学生出入记录分页查询入参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class StudentOutInRecordPageDto extends PageInput {
+
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime startTime;
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime endTime;
+
+    /**
+     * 名称
+     */
+    @ApiModelProperty("名称")
+    private String name;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty("身份证号")
+    private String identityCard;
+
+    /**
+     * 进出属性
+     */
+    @ApiModelProperty("进出属性")
+    private  String status;
+    /**
+     * 班级
+     */
+    @ApiModelProperty("班级")
+    private Long classId;
+
+    /**
+     * 就读方式(xjr_dictionary_item[stduy_status])
+     */
+    @ApiModelProperty("就读方式(xjr_dictionary_item[stduy_status])")
+    private String stduyStatus;
+}

+ 51 - 0
src/main/java/com/xjrsoft/module/outint/dto/TeacherOutInRecordPageDto.java

@@ -0,0 +1,51 @@
+package com.xjrsoft.module.outint.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+
+/**
+* @title: 教师出入记录分页查询入参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class TeacherOutInRecordPageDto extends PageInput {
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime startTime;
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime endTime;
+
+    /**
+     * 教师名称
+     */
+    @ApiModelProperty("教师名称")
+    private String name;
+
+    /**
+     * 过车方向
+     */
+    @ApiModelProperty("过车方向")
+    private  String status;
+    /**
+     * 部门ID
+     */
+    @ApiModelProperty("部门ID")
+    private Long deptId;
+
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/outint/dto/UpdateCarOutInRecordDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.outint.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 车辆出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class UpdateCarOutInRecordDto extends AddCarOutInRecordDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/outint/dto/UpdateStudentOutInRecordDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.outint.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 学生出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class UpdateStudentOutInRecordDto extends AddStudentOutInRecordDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/outint/dto/UpdateTeacherOutInRecordDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.outint.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 教师出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class UpdateTeacherOutInRecordDto extends AddTeacherOutInRecordDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/outint/dto/UpdateVisitorOutInRecordDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.outint.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 访客出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class UpdateVisitorOutInRecordDto extends AddVisitorOutInRecordDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+}

+ 71 - 0
src/main/java/com/xjrsoft/module/outint/dto/VisitorOutInRecordPageDto.java

@@ -0,0 +1,71 @@
+package com.xjrsoft.module.outint.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
+
+
+/**
+* @title: 访客出入记录分页查询入参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class VisitorOutInRecordPageDto extends PageInput {
+    /**
+     * 车主姓名
+     */
+    @ApiModelProperty("车主姓名")
+    private String name;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty("身份证号")
+    private String identityCard;
+    /**
+     * 到访部门id
+     */
+    @ApiModelProperty("到访部门id")
+    private Long deptId;
+    /**
+     * 被访人用户id
+     */
+    @ApiModelProperty("被访人用户id")
+    private Long respondentUserId;
+
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime startTime;
+    /**
+     * 记录开始时间
+     */
+    @ApiModelProperty("记录结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private LocalDateTime endTime;
+    /**
+     * 过车方向
+     */
+    @ApiModelProperty("过车方向")
+    private  String status;
+
+    /**
+     * 手机号码
+     */
+    @ApiModelProperty("手机号码")
+    private String phone;
+
+    /**
+     * 车牌号
+     */
+    @ApiModelProperty("车牌号")
+    private String plateNumber;
+}

+ 104 - 0
src/main/java/com/xjrsoft/module/outint/entity/CarOutInRecord.java

@@ -0,0 +1,104 @@
+package com.xjrsoft.module.outint.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 车辆出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+@TableName("car_out_in_record")
+@ApiModel(value = "car_out_in_record", description = "车辆出入记录")
+public class CarOutInRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 车辆id(car_message_apply),固定车辆使用
+    */
+    @ApiModelProperty("车辆id(car_message_apply),固定车辆使用")
+    private Long carMessageApplyId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+    /**
+    * 访客车辆(reservation_school_people),临时车辆使用
+    */
+    @ApiModelProperty("访客车辆(reservation_school_people),临时车辆使用")
+    private Long reservationSchoolPeopleId;
+    /**
+    * 车辆分类(0:固定车辆 1:临时车辆)
+    */
+    @ApiModelProperty("车辆分类(0:固定车辆 1:临时车辆)")
+    private Integer category;
+
+
+}

+ 104 - 0
src/main/java/com/xjrsoft/module/outint/entity/StudentOutInRecord.java

@@ -0,0 +1,104 @@
+package com.xjrsoft.module.outint.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 学生出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+@TableName("student_out_in_record")
+@ApiModel(value = "student_out_in_record", description = "学生出入记录")
+public class StudentOutInRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 班主任id
+    */
+    @ApiModelProperty("班主任id")
+    private Long teacherId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private Long classId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+
+}

+ 94 - 0
src/main/java/com/xjrsoft/module/outint/entity/TeacherOutInRecord.java

@@ -0,0 +1,94 @@
+package com.xjrsoft.module.outint.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 教师出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+@TableName("teacher_out_in_record")
+@ApiModel(value = "teacher_out_in_record", description = "教师出入记录")
+public class TeacherOutInRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+
+}

+ 94 - 0
src/main/java/com/xjrsoft/module/outint/entity/VisitorOutInRecord.java

@@ -0,0 +1,94 @@
+package com.xjrsoft.module.outint.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+* @title: 访客出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+@TableName("visitor_out_in_record")
+@ApiModel(value = "visitor_out_in_record", description = "访客出入记录")
+public class VisitorOutInRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 访客id(reservation_school_people)
+    */
+    @ApiModelProperty("访客id(reservation_school_people)")
+    private Long reservationSchoolPeopleId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/outint/mapper/CarOutInRecordMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.outint.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.outint.entity.CarOutInRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 车辆出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Mapper
+public interface CarOutInRecordMapper extends MPJBaseMapper<CarOutInRecord> {
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/outint/mapper/StudentOutInRecordMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.outint.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.outint.entity.StudentOutInRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 学生出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Mapper
+public interface StudentOutInRecordMapper extends MPJBaseMapper<StudentOutInRecord> {
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/outint/mapper/TeacherOutInRecordMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.outint.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 教师出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Mapper
+public interface TeacherOutInRecordMapper extends MPJBaseMapper<TeacherOutInRecord> {
+
+}

+ 16 - 0
src/main/java/com/xjrsoft/module/outint/mapper/VisitorOutInRecordMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.outint.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.outint.entity.VisitorOutInRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 访客出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Mapper
+public interface VisitorOutInRecordMapper extends MPJBaseMapper<VisitorOutInRecord> {
+
+}

+ 14 - 0
src/main/java/com/xjrsoft/module/outint/service/ICarOutInRecordService.java

@@ -0,0 +1,14 @@
+package com.xjrsoft.module.outint.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.outint.entity.CarOutInRecord;
+
+/**
+* @title: 车辆出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+
+public interface ICarOutInRecordService extends MPJBaseService<CarOutInRecord> {
+}

+ 14 - 0
src/main/java/com/xjrsoft/module/outint/service/IStudentOutInRecordService.java

@@ -0,0 +1,14 @@
+package com.xjrsoft.module.outint.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.outint.entity.StudentOutInRecord;
+
+/**
+* @title: 学生出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+
+public interface IStudentOutInRecordService extends MPJBaseService<StudentOutInRecord> {
+}

+ 14 - 0
src/main/java/com/xjrsoft/module/outint/service/ITeacherOutInRecordService.java

@@ -0,0 +1,14 @@
+package com.xjrsoft.module.outint.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
+
+/**
+* @title: 教师出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+
+public interface ITeacherOutInRecordService extends MPJBaseService<TeacherOutInRecord> {
+}

+ 14 - 0
src/main/java/com/xjrsoft/module/outint/service/IVisitorOutInRecordService.java

@@ -0,0 +1,14 @@
+package com.xjrsoft.module.outint.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.outint.entity.VisitorOutInRecord;
+
+/**
+* @title: 访客出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+
+public interface IVisitorOutInRecordService extends MPJBaseService<VisitorOutInRecord> {
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/outint/service/impl/CarOutInRecordServiceImpl.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.outint.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.outint.entity.CarOutInRecord;
+import com.xjrsoft.module.outint.mapper.CarOutInRecordMapper;
+import com.xjrsoft.module.outint.service.ICarOutInRecordService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+* @title: 车辆出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class CarOutInRecordServiceImpl extends MPJBaseServiceImpl<CarOutInRecordMapper, CarOutInRecord> implements ICarOutInRecordService {
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/outint/service/impl/StudentOutInRecordServiceImpl.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.outint.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.outint.entity.StudentOutInRecord;
+import com.xjrsoft.module.outint.mapper.StudentOutInRecordMapper;
+import com.xjrsoft.module.outint.service.IStudentOutInRecordService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+* @title: 学生出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class StudentOutInRecordServiceImpl extends MPJBaseServiceImpl<StudentOutInRecordMapper, StudentOutInRecord> implements IStudentOutInRecordService {
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/outint/service/impl/TeacherOutInRecordServiceImpl.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.outint.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.outint.entity.TeacherOutInRecord;
+import com.xjrsoft.module.outint.mapper.TeacherOutInRecordMapper;
+import com.xjrsoft.module.outint.service.ITeacherOutInRecordService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+* @title: 教师出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class TeacherOutInRecordServiceImpl extends MPJBaseServiceImpl<TeacherOutInRecordMapper, TeacherOutInRecord> implements ITeacherOutInRecordService {
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/outint/service/impl/VisitorOutInRecordServiceImpl.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.outint.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.outint.entity.VisitorOutInRecord;
+import com.xjrsoft.module.outint.mapper.VisitorOutInRecordMapper;
+import com.xjrsoft.module.outint.service.IVisitorOutInRecordService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+* @title: 访客出入记录
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class VisitorOutInRecordServiceImpl extends MPJBaseServiceImpl<VisitorOutInRecordMapper, VisitorOutInRecord> implements IVisitorOutInRecordService {
+}

+ 122 - 0
src/main/java/com/xjrsoft/module/outint/vo/CarOutInRecordPageVo.java

@@ -0,0 +1,122 @@
+package com.xjrsoft.module.outint.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 车辆出入记录分页列表出参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class CarOutInRecordPageVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    private Integer enabledMark;
+    /**
+    * 车辆id(car_message_apply),固定车辆使用
+    */
+    @ApiModelProperty("车辆id(car_message_apply),固定车辆使用")
+    private Long carMessageApplyId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+    /**
+    * 访客车辆(reservation_school_people),临时车辆使用
+    */
+    @ApiModelProperty("访客车辆(reservation_school_people),临时车辆使用")
+    private Long reservationSchoolPeopleId;
+    /**
+    * 车辆分类(0:固定车辆 1:临时车辆)
+    */
+    @ApiModelProperty("车辆分类(0:固定车辆 1:临时车辆)")
+    private Integer category;
+
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty("身份证号")
+    private String identityCard;
+    /**
+     * 手机号码
+     */
+    @ApiModelProperty("手机号码")
+    private Long phone;
+    /**
+     * 性别
+     */
+    @ApiModelProperty("性别")
+    private String gender;
+
+    /**
+     * 车牌号
+     */
+    @ApiModelProperty("车牌号")
+    private String plateNumber;
+
+    /**
+     * 车辆类型
+     */
+    @ApiModelProperty("车辆类型")
+    private String vehicleType;
+
+    /**
+     * 人脸照片地址
+     */
+    @ApiModelProperty("人脸照片地址")
+    private String facePhotoUrl;
+
+}

+ 53 - 0
src/main/java/com/xjrsoft/module/outint/vo/CarOutInRecordVo.java

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.outint.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 车辆出入记录表单出参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class CarOutInRecordVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 车辆id(car_message_apply),固定车辆使用
+    */
+    @ApiModelProperty("车辆id(car_message_apply),固定车辆使用")
+    private Long carMessageApplyId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+    /**
+    * 访客车辆(reservation_school_people),临时车辆使用
+    */
+    @ApiModelProperty("访客车辆(reservation_school_people),临时车辆使用")
+    private Long reservationSchoolPeopleId;
+    /**
+    * 车辆分类(0:固定车辆 1:临时车辆)
+    */
+    @ApiModelProperty("车辆分类(0:固定车辆 1:临时车辆)")
+    private Integer category;
+
+
+
+}

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

@@ -0,0 +1,123 @@
+package com.xjrsoft.module.outint.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 学生出入记录分页列表出参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class StudentOutInRecordPageVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    private Integer enabledMark;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 班主任id
+    */
+    @ApiModelProperty("班主任id")
+    private Long teacherId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private Long classId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty("身份证号")
+    private String identityCard;
+    /**
+     * 手机号码
+     */
+    @ApiModelProperty("手机号码")
+    private Long phone;
+    /**
+     * 性别
+     */
+    @ApiModelProperty("性别")
+    private String gender;
+    /**
+     * 人脸照片地址
+     */
+    @ApiModelProperty("人脸照片地址")
+    private String facePhotoUrl;
+    /**
+     * 就读方式
+     */
+    @ApiModelProperty("就读方式")
+    private String stduyStatusCn;
+    /**
+     * 班级
+     */
+    @ApiModelProperty("班级")
+    private String classCn;
+    /**
+     * 班主人
+     */
+    @ApiModelProperty("班主人")
+    private Long teacherCn;
+}

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

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.outint.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 学生出入记录表单出参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class StudentOutInRecordVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 班主任id
+    */
+    @ApiModelProperty("班主任id")
+    private Long teacherId;
+    /**
+    * 班级id
+    */
+    @ApiModelProperty("班级id")
+    private Long classId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+
+
+}

+ 99 - 0
src/main/java/com/xjrsoft/module/outint/vo/TeacherOutInRecordPageVo.java

@@ -0,0 +1,99 @@
+package com.xjrsoft.module.outint.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 教师出入记录分页列表出参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class TeacherOutInRecordPageVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    private Integer enabledMark;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty("身份证号")
+    private String identityCard;
+    /**
+     * 手机号码
+     */
+    @ApiModelProperty("手机号码")
+    private Long phone;
+    /**
+     * 性别
+     */
+    @ApiModelProperty("性别")
+    private String gender;
+    /**
+     * 人脸照片地址
+     */
+    @ApiModelProperty("人脸照片地址")
+    private String facePhotoUrl;
+
+}

+ 43 - 0
src/main/java/com/xjrsoft/module/outint/vo/TeacherOutInRecordVo.java

@@ -0,0 +1,43 @@
+package com.xjrsoft.module.outint.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 教师出入记录表单出参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class TeacherOutInRecordVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private Long userId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+
+
+}

+ 128 - 0
src/main/java/com/xjrsoft/module/outint/vo/VisitorOutInRecordPageVo.java

@@ -0,0 +1,128 @@
+package com.xjrsoft.module.outint.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+* @title: 访客出入记录分页列表出参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class VisitorOutInRecordPageVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 修改人id
+    */
+    @ApiModelProperty("修改人id")
+    private Long modifyUserId;
+    /**
+    * 修改日期
+    */
+    @ApiModelProperty("修改日期")
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标记
+    */
+    @ApiModelProperty("有效标记")
+    private Integer enabledMark;
+    /**
+    * 访客id(reservation_school_people)
+    */
+    @ApiModelProperty("访客id(reservation_school_people)")
+    private Long reservationSchoolPeopleId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+    /**
+     * 身份证号
+     */
+    @ApiModelProperty("身份证号")
+    private String identityCard;
+    /**
+     * 手机号码
+     */
+    @ApiModelProperty("手机号码")
+    private Long phone;
+    /**
+     * 性别
+     */
+    @ApiModelProperty("性别")
+    private String gender;
+
+    /**
+     * 车牌号
+     */
+    @ApiModelProperty("车牌号")
+    private String plateNumber;
+
+    /**
+     * 车辆类型
+     */
+    @ApiModelProperty("车辆类型")
+    private String vehicleType;
+
+    /**
+     * 人脸照片地址
+     */
+    @ApiModelProperty("人脸照片地址")
+    private String facePhotoUrl;
+    /**
+     * 被访人用户
+     */
+    @ApiModelProperty("被访人用户")
+    private String respondentUserCn;
+    /**
+     * 被访部门
+     */
+    @ApiModelProperty("被访部门")
+    private String deptCn;
+
+    /**
+     * 进校事由
+     */
+    @ApiModelProperty("进校事由")
+    private String reason;
+
+}

+ 43 - 0
src/main/java/com/xjrsoft/module/outint/vo/VisitorOutInRecordVo.java

@@ -0,0 +1,43 @@
+package com.xjrsoft.module.outint.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+* @title: 访客出入记录表单出参
+* @Author dzx
+* @Date: 2024-05-14
+* @Version 1.0
+*/
+@Data
+public class VisitorOutInRecordVo {
+
+    /**
+    * 主键
+    */
+    @ApiModelProperty("主键")
+    private Long id;
+    /**
+    * 访客id(reservation_school_people)
+    */
+    @ApiModelProperty("访客id(reservation_school_people)")
+    private Long reservationSchoolPeopleId;
+    /**
+    * 记录时间
+    */
+    @ApiModelProperty("记录时间")
+    private String recordTime;
+    /**
+    * 人脸照片
+    */
+    @ApiModelProperty("人脸照片")
+    private Long facePhoto;
+    /**
+    * 进出状态(0:进 1:出)
+    */
+    @ApiModelProperty("进出状态(0:进 1:出)")
+    private Integer status;
+
+
+
+}

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません