Browse Source

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java
dzx 10 months ago
parent
commit
982c0a74f4

+ 105 - 4
src/main/java/com/xjrsoft/module/attendance/controller/StudentAttendanceRecordController.java

@@ -6,6 +6,8 @@ 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;
@@ -13,15 +15,23 @@ 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;
@@ -51,15 +61,106 @@ public class StudentAttendanceRecordController {
     @SaCheckPermission("studentattendancerecord:detail")
     public RT<PageOutput<StudentAttendanceRecordPageVo>> page(@Valid StudentAttendanceRecordPageDto dto){
 
-        LambdaQueryWrapper<StudentAttendanceRecord> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper
+        MPJLambdaWrapper<StudentAttendanceRecord> queryWrapper =  MPJWrappers.<StudentAttendanceRecord>lambdaJoin()
                     .orderByDesc(StudentAttendanceRecord::getId)
-                .select(StudentAttendanceRecord.class,x -> VoToColumnUtil.fieldsToColumns(StudentAttendanceRecordPageVo.class).contains(x.getProperty()));
-        IPage<StudentAttendanceRecord> page = studentAttendanceRecordService.page(ConventPage.getPage(dto), queryWrapper);
+                .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")

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

@@ -67,6 +67,7 @@ public class TeacherAttendanceRecordController {
                 .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)

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

+ 43 - 2
src/main/java/com/xjrsoft/module/attendance/dto/StudentAttendanceRecordPageDto.java

@@ -1,5 +1,6 @@
 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;
@@ -21,6 +22,46 @@ import java.util.Date;
 @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;
 }

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

+ 35 - 1
src/main/java/com/xjrsoft/module/attendance/vo/StudentAttendanceRecordPageVo.java

@@ -85,5 +85,39 @@ public class StudentAttendanceRecordPageVo {
     */
     @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;
 }

+ 1 - 2
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;
 
@@ -65,4 +64,4 @@ public class ApiUtil {
     public String doPost(String apiPath, String body, Map<String, String> querys){
         return doPost(apiPath, body, querys, null);
     }
-}
+}

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

@@ -15,7 +15,6 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * @author dzx
@@ -41,6 +40,7 @@ public class DataUtil {
         Map<Long, String> idMap = new HashMap<>();
         JsonParser jsonParser = new JsonParser();
         ApiUtil apiUtil = new ApiUtil();
+        JsonArray dataArray = new JsonArray();
 
         Map<String, Long> idCodeMap = new HashMap<>();
         for (Integer level : levelSet) {

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

@@ -0,0 +1,98 @@
+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.GetTeacherHikvisionIdById(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.GetStudentHikvisionIdById(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;
+    }
+
+    //    public String AddFace(Long id){
+//        JsonObject paramJson = new JsonObject();
+//        paramJson.addProperty("name", teacherFaceImportMapper.GetHikvisionIdById(id));
+//        paramJson.addProperty("description", "none");
+//
+//        Map<String, String> querys = new HashMap<>();
+//
+//        String apiPath = "/api/frs/v1/face/group/single/addition";
+//        String response = ApiUtil.doPost(apiPath, String.valueOf(paramJson), querys);
+////        ObjectMapper mapper = new ObjectMapper();
+////        try {
+////            JsonNode rootNode = mapper.readTree(response);
+////            JsonNode dataNode = rootNode.path("data");
+////            JsonNode indexCodeNode = dataNode.path("indexCode");
+////
+////            if (indexCodeNode != null && !indexCodeNode.isNull()) {
+////                String indexCode = indexCodeNode.asText();
+////                return indexCode;
+////            } else {
+////                System.out.println("IndexCode is null or not present");
+////                return null;
+////            }
+////        } catch (JsonProcessingException e) {
+////            e.printStackTrace();
+////            return null;
+////        } catch (Exception e) {
+////            e.printStackTrace();
+////            return null;
+////        }
+//    }
+}

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

@@ -0,0 +1,27 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.yomahub.liteflow.core.NodeComponent;
+import com.xjrsoft.module.hikvision.util.FaceImportUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 导出学生照片到海康平台
+ */
+@Component("import_student_face_node")
+public class ImportStudentFaceNode extends NodeComponent {
+    @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) {
+            // 数据处理
+            FaceImportUtil.ImportStudentFace(formId);
+        }
+    }
+}
+

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

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.yomahub.liteflow.core.NodeComponent;
+import com.xjrsoft.module.hikvision.util.FaceImportUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 导出老师照片到海康平台
+ */
+@Component("import_teacher_face_node")
+public class ImportTeacherFaceNode extends NodeComponent {
+    @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) {
+            // 数据处理
+            FaceImportUtil.ImportTeacherFace(formId);
+        }
+    }
+}

+ 31 - 4
src/main/java/com/xjrsoft/module/outint/controller/StudentOutInRecordController.java

@@ -2,19 +2,30 @@ 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;
@@ -50,11 +61,27 @@ public class StudentOutInRecordController {
     @SaCheckPermission("studentoutinrecord:detail")
     public RT<PageOutput<StudentOutInRecordPageVo>> page(@Valid StudentOutInRecordPageDto dto){
 
-        LambdaQueryWrapper<StudentOutInRecord> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper
+        MPJLambdaWrapper<StudentOutInRecord> queryWrapper = MPJWrappers.<StudentOutInRecord>lambdaJoin()
                     .orderByDesc(StudentOutInRecord::getId)
-                .select(StudentOutInRecord.class,x -> VoToColumnUtil.fieldsToColumns(StudentOutInRecordPageVo.class).contains(x.getProperty()));
-        IPage<StudentOutInRecord> page = studentOutInRecordService.page(ConventPage.getPage(dto), queryWrapper);
+                .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);
     }

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

@@ -1,9 +1,13 @@
 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: 学生出入记录分页查询入参
@@ -15,5 +19,44 @@ import lombok.EqualsAndHashCode;
 @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;
 }

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

@@ -80,4 +80,44 @@ public class StudentOutInRecordPageVo {
     @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;
 }

+ 15 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/FaceImportMapper.java

@@ -0,0 +1,15 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+
+@Mapper
+public interface FaceImportMapper {
+    String GetTeacherHikvisionIdById(@Param("id") Long id);
+    String GetTeacherHikvisionImgById(@Param("id") Long id);
+
+    String GetStudentHikvisionIdById(@Param("id") Long id);
+    String GetStudentHikvisionImgById(@Param("id") Long id);
+}
+

+ 41 - 0
src/main/resources/mapper/teacher/TeacherFaceImportMapper.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xjrsoft.module.teacher.mapper.FaceImportMapper">
+    <select id="GetTeacherHikvisionIdById" parameterType="long" resultType="java.lang.String">
+        select t1.hikvision_id
+        from teacher_face_process t
+        left join hikvision_data t1 on t1.source_id = t.user_id
+        <if test="id != null">
+            where t.id = #{id}
+        </if>
+    </select>
+
+    <select id="GetTeacherHikvisionImgById" parameterType="long" resultType="java.lang.String">
+        select t1.file_url
+        from teacher_face_process t
+        left join xjr_file t1 on t1.folder_id = t.face_photo
+        <if test="id != null">
+            where t.id = #{id}
+        </if>
+    </select>
+
+    <select id="GetStudentHikvisionIdById" parameterType="long" resultType="java.lang.String">
+        select t1.hikvision_id
+        from stundent_face_process t
+        left join hikvision_data t1 on t1.source_id = t.user_id
+        <if test="id != null">
+            where t.id = #{id}
+        </if>
+    </select>
+
+    <select id="GetStudentHikvisionImgById" parameterType="long" resultType="java.lang.String">
+        select t1.file_url
+        from stundent_face_process t
+        left join xjr_file t1 on t1.folder_id = t.face_photo
+        <if test="id != null">
+            where t.id = #{id}
+        </if>
+    </select>
+</mapper>