Jelajahi Sumber

Merge branch 'pre'

DESKTOP-USV654P\pc 1 tahun lalu
induk
melakukan
1773a3e220
26 mengubah file dengan 423 tambahan dan 60 penghapusan
  1. 1 0
      pom.xml
  2. 5 2
      src/main/java/com/xjrsoft/common/utils/FileZipUtil.java
  3. 11 1
      src/main/java/com/xjrsoft/common/utils/UploadUtil.java
  4. 5 0
      src/main/java/com/xjrsoft/module/base/mapper/BaseClassMapper.java
  5. 3 0
      src/main/java/com/xjrsoft/module/base/service/IBaseClassService.java
  6. 6 0
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassServiceImpl.java
  7. 31 0
      src/main/java/com/xjrsoft/module/base/vo/StudentClassVo.java
  8. 1 1
      src/main/java/com/xjrsoft/module/organization/dto/AddUserDto.java
  9. 18 5
      src/main/java/com/xjrsoft/module/personnel/controller/FaceManagementController.java
  10. 199 24
      src/main/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessController.java
  11. 3 0
      src/main/java/com/xjrsoft/module/personnel/entity/StundentFaceProcess.java
  12. 3 0
      src/main/java/com/xjrsoft/module/personnel/entity/TeacherFaceProcess.java
  13. 1 1
      src/main/java/com/xjrsoft/module/student/dto/AddBaseStudentUserDto.java
  14. 1 1
      src/main/java/com/xjrsoft/module/student/service/impl/PbCseFeeobjupdateServiceImpl.java
  15. 23 7
      src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java
  16. 0 1
      src/main/java/com/xjrsoft/module/system/controller/FileController.java
  17. 1 1
      src/main/java/com/xjrsoft/module/teacher/dto/AddXjrUserDto.java
  18. 1 1
      src/main/java/com/xjrsoft/module/teacher/dto/UpdateXjrUserDto.java
  19. 25 8
      src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java
  20. 1 0
      src/main/java/com/xjrsoft/module/workflow/service/IWorkflowExecuteService.java
  21. 20 4
      src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java
  22. 1 1
      src/main/resources/application-dev.yml
  23. 6 0
      src/main/resources/mapper/base/BaseClass.xml
  24. 1 1
      src/main/resources/mapper/teacher/TeacherFaceImportMapper.xml
  25. 1 1
      src/test/java/com/xjrsoft/module/liteflow/node/WfTeacherleaveNodeTest.java
  26. 55 0
      src/test/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessControllerTest.java

+ 1 - 0
pom.xml

@@ -562,6 +562,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.10.1</version>
                 <configuration>
                     <source>8</source>
                     <target>8</target>

+ 5 - 2
src/main/java/com/xjrsoft/common/utils/FileZipUtil.java

@@ -3,6 +3,7 @@ package com.xjrsoft.common.utils;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
+import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
@@ -177,10 +178,12 @@ public class FileZipUtil {
      */
     public static ZipFile convertToZipFile(MultipartFile multipartFile) throws IOException {
         // 创建临时文件
-        Path tempPath = Files.createTempFile("temp", ".zip");
+        String originalFilename = multipartFile.getOriginalFilename();
+        Path tempPath = Files.createTempFile("temp", originalFilename.substring(originalFilename.lastIndexOf('.')));
         multipartFile.transferTo(tempPath); // 将MultipartFile内容写入临时文件
 
         // 使用ZipFile读取临时文件
-        return new ZipFile(tempPath.toFile());
+        ZipFile zipfile = new ZipFile(tempPath.toFile(), Charset.forName("GBK"));
+        return zipfile;
     }
 }

+ 11 - 1
src/main/java/com/xjrsoft/common/utils/UploadUtil.java

@@ -42,7 +42,7 @@ public class UploadUtil {
         try {
             OkHttpClient client = new OkHttpClient();
             Request req = new Request.Builder().url(path).build();
-            InputStream inputStream=null;
+            InputStream inputStream = null;
                 okhttp3.Response resp = client.newCall(req).execute();
                 if (resp.isSuccessful()) {
                     ResponseBody body = resp.body();
@@ -57,4 +57,14 @@ public class UploadUtil {
     public static boolean delete(String path) {
      return Objects.requireNonNull(OssFactory.build()).delete(path);
     }
+
+
+    public static String  uploadFileByte(String fileName, byte[] file) throws Exception {
+        if (file.length == 0) {
+            throw new RuntimeException("上传文件不能为空");
+        }
+        //上传文件
+        String suffix = Objects.requireNonNull(fileName).substring(fileName.lastIndexOf(StringPool.DOT));
+        return Objects.requireNonNull(OssFactory.build()).uploadSuffix(file, suffix);
+    }
 }

+ 5 - 0
src/main/java/com/xjrsoft/module/base/mapper/BaseClassMapper.java

@@ -5,8 +5,11 @@ import com.github.yulichang.base.MPJBaseMapper;
 import com.xjrsoft.module.base.dto.BaseClassPageDto;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.vo.BaseClassPageVo;
+import com.xjrsoft.module.base.vo.StudentClassVo;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
+
 /**
  * <p>
  * 班级表 Mapper 接口
@@ -19,4 +22,6 @@ import org.apache.ibatis.annotations.Mapper;
 public interface BaseClassMapper extends MPJBaseMapper<BaseClass> {
 
     Page<BaseClassPageVo> getPage(Page<BaseClassPageVo> page, BaseClassPageDto dto);
+
+    List<StudentClassVo> getStudentClass();
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/base/service/IBaseClassService.java

@@ -5,6 +5,7 @@ import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.base.dto.BaseClassPageDto;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.vo.BaseClassPageVo;
+import com.xjrsoft.module.base.vo.StudentClassVo;
 import com.xjrsoft.module.organization.vo.UserStudentVo;
 
 import java.util.List;
@@ -14,4 +15,6 @@ public interface IBaseClassService extends MPJBaseService<BaseClass> {
     UserStudentVo getClassInfo(long id);
 
     Page<BaseClassPageVo> getPage(Page<BaseClassPageVo> page, BaseClassPageDto dto);
+
+    List<StudentClassVo> getStudentClass();
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassServiceImpl.java

@@ -9,6 +9,7 @@ import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.vo.BaseClassPageVo;
+import com.xjrsoft.module.base.vo.StudentClassVo;
 import com.xjrsoft.module.organization.entity.UserStudent;
 import com.xjrsoft.module.organization.service.IUserStudentService;
 import com.xjrsoft.module.organization.vo.UserStudentVo;
@@ -81,4 +82,9 @@ public class BaseClassServiceImpl extends MPJBaseServiceImpl<BaseClassMapper, Ba
     public Page<BaseClassPageVo> getPage(Page<BaseClassPageVo> page, BaseClassPageDto dto) {
         return baseClassMapper.getPage(page, dto);
     }
+
+    @Override
+    public List<StudentClassVo> getStudentClass() {
+        return baseClassMapper.getStudentClass();
+    }
 }

+ 31 - 0
src/main/java/com/xjrsoft/module/base/vo/StudentClassVo.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.module.base.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+* @title: 学生班级信息
+* @Author dzx
+* @Date: 2024年5月22日
+* @Version 1.0
+*/
+@Data
+public class StudentClassVo {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("学生user_id")
+    private Long userId;
+
+    @ApiModelProperty("班级id")
+    private Long id;
+
+    @ApiModelProperty("班级表中的teacher_id")
+    private Long teacherId;
+
+
+    @ApiModelProperty("班级名称")
+    private String name;
+
+}

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

@@ -51,7 +51,7 @@ public class AddUserDto implements Serializable {
     private String password;
 
     @ApiModelProperty("性别")
-    @NotNull(message = "性别必须选择")
+//    @NotNull(message = "性别必须选择")
     private String gender;
 
     @ApiModelProperty("手机号")

+ 18 - 5
src/main/java/com/xjrsoft/module/personnel/controller/FaceManagementController.java

@@ -8,6 +8,7 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
@@ -46,10 +47,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
 import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @RestController
 @RequestMapping("/personnel" + "/facemanager")
@@ -93,16 +91,24 @@ public class FaceManagementController {
     @ApiOperation(value = "根据当前用户查询人脸信息")
     @SaCheckPermission("facemanager:detail")
     public RT<FaceManagementVo> detail() {
-        FaceManagement faceManagement = faceManagementService.getOneDeep(Wrappers.lambdaQuery(FaceManagement.class).eq(FaceManagement::getDeleteMark, DeleteMark.NODELETE.getCode()).eq(FaceManagement::getUserId, StpUtil.getLoginIdAsLong()));
+        FaceManagement faceManagement = faceManagementService.getOneDeep(
+                MPJWrappers.<FaceManagement>lambdaJoin()
+                .eq(FaceManagement::getDeleteMark, DeleteMark.NODELETE.getCode())
+                .eq(FaceManagement::getUserId, StpUtil.getLoginIdAsLong())
+        );
         if (faceManagement == null) {
             return RT.error("找不到此数据!");
         }
+
+        List<Long> ids=new ArrayList<>();
+        ids.add(faceManagement.getId());
         faceManagement.setVerifyStatus(1);
         if (faceManagement.getUserType() == 1) {
             // 查询 teacher_face_process 审核通过
             MPJLambdaWrapper<TeacherFaceProcess> queryWrapper = new MPJLambdaWrapper<>();
             queryWrapper.eq(TeacherFaceProcess::getUserId, faceManagement.getUserId())
                     .eq(TeacherFaceProcess::getFacePhoto, faceManagement.getFileId())
+                    .eq(TeacherFaceProcess::getDeleteMark, 0)
 //                    .eq(TeacherFaceProcess::getStatus, 1)
             ;
             TeacherFaceProcess teacherFaceProcess = teacherFaceProcessService.getOne(queryWrapper);
@@ -111,6 +117,9 @@ public class FaceManagementController {
                     faceManagement.setVerifyStatus(2);
                 if (teacherFaceProcess.getStatus() == 2)
                     faceManagement.setVerifyStatus(3);
+            }else{
+                faceManagementService.delete(ids);
+                return RT.error("找不到此数据!");
             }
         }
 
@@ -119,6 +128,7 @@ public class FaceManagementController {
             MPJLambdaWrapper<StundentFaceProcess> queryWrapper = new MPJLambdaWrapper<>();
             queryWrapper.eq(StundentFaceProcess::getUserId, faceManagement.getUserId())
                     .eq(StundentFaceProcess::getFacePhoto, faceManagement.getFileId())
+                    .eq(StundentFaceProcess::getDeleteMark, 0)
 //                    .eq(StundentFaceProcess::getStatus, 1)
             ;
             StundentFaceProcess stundentFaceProcess = stundentFaceProcessService.getOne(queryWrapper);
@@ -127,6 +137,9 @@ public class FaceManagementController {
                     faceManagement.setVerifyStatus(2);
                 if (stundentFaceProcess.getStatus() == 2)
                     faceManagement.setVerifyStatus(3);
+            }else{
+                faceManagementService.delete(ids);
+                return RT.error("找不到此数据!");
             }
         }
         return RT.ok(BeanUtil.toBean(faceManagement, FaceManagementVo.class));

+ 199 - 24
src/main/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessController.java

@@ -1,32 +1,51 @@
 package com.xjrsoft.module.personnel.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.github.yulichang.toolkit.MPJWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.FileZipUtil;
 import com.xjrsoft.common.utils.UploadUtil;
+import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.base.vo.StudentClassVo;
+import com.xjrsoft.module.hikvision.util.ApiUtil;
 import com.xjrsoft.module.personnel.dto.AddStundentFaceProcessDto;
 import com.xjrsoft.module.personnel.dto.StundentFaceProcessPageDto;
 import com.xjrsoft.module.personnel.dto.UpdateStundentFaceProcessDto;
+import com.xjrsoft.module.personnel.entity.FaceManagement;
 import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
+import com.xjrsoft.module.personnel.service.IFaceManagementService;
 import com.xjrsoft.module.personnel.service.IStundentFaceProcessService;
 import com.xjrsoft.module.personnel.vo.StundentFaceProcessPageVo;
 import com.xjrsoft.module.personnel.vo.StundentFaceProcessVo;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.entity.BaseStudentUser;
+import com.xjrsoft.module.student.service.IStudentManagerService;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.system.entity.File;
+import com.xjrsoft.module.system.service.IFileService;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -38,12 +57,15 @@ import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
-import java.io.FileOutputStream;
-import java.io.IOException;
+import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
-import java.io.OutputStream;
+import java.time.LocalDateTime;
+import java.util.Base64;
+import java.util.Date;
 import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 
@@ -61,6 +83,10 @@ public class StundentFaceProcessController {
 
 
     private final IStundentFaceProcessService stundentFaceProcessService;
+    private final IStudentManagerService studentManagerService;
+    private final IFileService fileService;
+    private final IFaceManagementService faceManagementService;
+    private final IBaseClassService classService;
 
     @GetMapping(value = "/page")
     @ApiOperation(value="学生人脸信息审核列表(分页)")
@@ -115,7 +141,7 @@ public class StundentFaceProcessController {
     public RT<Boolean> add(@Valid @RequestBody AddStundentFaceProcessDto dto){
         StundentFaceProcess stundentFaceProcess = BeanUtil.toBean(dto, StundentFaceProcess.class);
         boolean isSuccess = stundentFaceProcessService.save(stundentFaceProcess);
-    return RT.ok(isSuccess);
+        return RT.ok(isSuccess);
     }
 
     @PutMapping
@@ -135,34 +161,183 @@ public class StundentFaceProcessController {
         return RT.ok(stundentFaceProcessService.removeBatchByIds(ids));
     }
 
-    @PostMapping(value = "/batch-upload")
+    @PostMapping(value = "/batch-import")
     @ApiOperation(value = "批量新增学生人脸")
-    @SaCheckPermission("facemanager:add")
-    public RT<Boolean> add(@RequestParam("file") MultipartFile file) throws IOException {
+    @SaCheckPermission("stundentfaceprocess:batch-upload")
+    public RT<Boolean> batchUpload(@RequestParam("file") MultipartFile file) throws Exception {
+        List<BaseStudentUser> list = studentManagerService.list(
+            new MPJLambdaWrapper<BaseStudentUser>().distinct()
+            .select(BaseStudentUser::getId)
+            .select(BaseStudentUser.class, x -> VoToColumnUtil.fieldsToColumns(BaseStudentUser.class).contains(x.getProperty()))
+            .leftJoin(BaseStudent.class, BaseStudent::getUserId, BaseStudentUser::getId)
+            .eq(BaseStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
+            .eq(BaseStudentUser::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        Map<String, BaseStudentUser> studentMap = new HashMap<>();
+        for (BaseStudentUser baseStudentUser : list) {
+            studentMap.put(baseStudentUser.getCredentialNumber(), baseStudentUser);
+        }
+
+        List<StudentClassVo> studentClass = classService.getStudentClass();
+        Map<Long, StudentClassVo> studentClassMap = new HashMap<>();
+        for (StudentClassVo classVo : studentClass) {
+            studentClassMap.put(classVo.getUserId(), classVo);
+        }
+
+        List<StundentFaceProcess> faceList = stundentFaceProcessService.list(
+            new QueryWrapper<StundentFaceProcess>().lambda()
+            .eq(StundentFaceProcess::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        Map<Long, StundentFaceProcess> faceMap = new HashMap<>();
+        for (StundentFaceProcess faceProcess : faceList) {
+            faceMap.put(faceProcess.getUserId(), faceProcess);
+        }
+
+        List<FaceManagement> faceManagementList = faceManagementService.list(
+            new QueryWrapper<FaceManagement>().lambda()
+            .eq(FaceManagement::getDeleteMark, DeleteMark.NODELETE.getCode())
+            .eq(FaceManagement::getUserType, 2)
+        );
+        Map<Long, FaceManagement> faceManagementMap = new HashMap<>();
+        for (FaceManagement management : faceManagementList) {
+            faceManagementMap.put(management.getUserId(), management);
+        }
+        JsonParser parser = new JsonParser();
+
+        ApiUtil apiUtil = new ApiUtil();
+        Long folderId = IdWorker.getId();
         ZipFile zipFile = FileZipUtil.convertToZipFile(file);
         Enumeration<? extends ZipEntry> entries = zipFile.entries();
         while (entries.hasMoreElements()){
             ZipEntry entry = entries.nextElement();
-            String name = entry.getName();
-            InputStream stream = zipFile.getInputStream(entry); //读取文件内容
-
-//            try (OutputStream outputStream = new FileOutputStream(file)) {
-//                byte[] buffer = new byte[4096];
-//                int bytesRead;
-//                while ((bytesRead = stream.read(buffer)) != -1) {
-//                    outputStream.write(buffer, 0, bytesRead);
-//                }
-//            } finally {
-//                if (stream != null) {
-//                    stream.close();
-//                }
-//            }
-//            //保存到云服务器
-//            String filePath = UploadUtil.uploadFile(file);
+            String filename = entry.getName();
+            InputStream inputStream = zipFile.getInputStream(entry); //读取文件内容
+
+            String idNumber = filename.substring(0, 18);
+            BaseStudentUser studentUser = studentMap.get(idNumber);
+            if(studentUser == null){
+                continue;
+            }
+            //将照片转换成base64
+            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();
+            String base64String = Base64.getEncoder().encodeToString(imageBytes);
+            inputStream.close();
+            outputStream.close();
 
+            //保存到云服务器
+            String filePath = UploadUtil.uploadFileByte(filename, imageBytes);
+
+            //存入数据库
+            long fileId = IdUtil.getSnowflakeNextId();
+            String suffix = StringUtils.substringAfterLast(filename, StringPool.DOT);
+
+            File fileEntity = new File();
+            fileEntity.setId(fileId);
+            fileEntity.setFolderId(folderId);
+            fileEntity.setFileName(filename);
+            fileEntity.setCreateDate(LocalDateTime.now());
+            fileEntity.setCreateUserId(StpUtil.getLoginIdAsLong());
+            fileEntity.setDeleteMark(0);
+            fileEntity.setFileUrl(filePath);
+            fileEntity.setFileSize(file.getSize());
+            fileEntity.setFileSuffiex(StringPool.DOT + suffix);
+            fileEntity.setFileType(suffix);
+            fileService.save(fileEntity);
+
+            StundentFaceProcess process = faceMap.get(studentUser.getId());
+            if(process == null){
+                long baseFaceId = IdUtil.getSnowflakeNextId();
+                FaceManagement baseFace = new FaceManagement();
+                baseFace.setId(baseFaceId);
+                baseFace.setRegisterBase64(base64String);
+                baseFace.setUserId(studentUser.getId());
+                baseFace.setSex(studentUser.getGender());
+                baseFace.setName(studentUser.getName());
+                baseFace.setIdno(studentUser.getCredentialNumber());
+                baseFace.setVerifyStatus(1);
+                baseFace.setCreateDate(LocalDateTime.now());
+                baseFace.setCreateUserId(StpUtil.getLoginIdAsLong());
+                baseFace.setDeleteMark(0);
+                baseFace.setStatus(1);
+                baseFace.setFileId(folderId);
+                baseFace.setUserType(2L);
+                faceManagementService.save(baseFace);
+
+                StudentClassVo classVo = studentClassMap.get(studentUser.getId());
+                StundentFaceProcess studentFace = new StundentFaceProcess();
+                studentFace.setStatus(1);
+                studentFace.setCreateDate(new Date());
+                studentFace.setCreateUserId(StpUtil.getLoginIdAsLong());
+                studentFace.setDeleteMark(0);
+                studentFace.setGender(studentUser.getGender());
+                studentFace.setFacePhoto(folderId);
+                studentFace.setName(studentUser.getName());
+                studentFace.setClassId(classVo.getId());
+                studentFace.setClassCn(classVo.getName());
+                studentFace.setTeacherId(classVo.getTeacherId());
+                studentFace.setIdentityCard(studentUser.getCredentialNumber());
+                studentFace.setStatus(1);
+                studentFace.setUserId(studentUser.getId());
+                studentFace.setExamStatus(1);
+
+                //将人脸上传海康
+                JsonObject paramJson = new JsonObject();
+                paramJson.addProperty("personId", studentUser.getId());
+                paramJson.addProperty("faceData", base64String);
+
+                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);
+                studentFace.setHikvisionResult(response);
+                stundentFaceProcessService.save(studentFace);
+            }else{
+                process.setStatus(1);
+                process.setExamStatus(1);
+                process.setModifyDate(new Date());
+                process.setModifyUserId(StpUtil.getLoginIdAsLong());
+                process.setDeleteMark(0);
+                process.setFacePhoto(folderId);
+
+                String faceId = null;
+                if(process.getHikvisionResult() != null){
+                    JsonObject object = parser.parse(process.getHikvisionResult()).getAsJsonObject();
+                    if("0".equals(object.get("code").getAsString()) && "success".equals(object.get("msg").getAsString())){
+                        faceId = object.get("data").getAsJsonObject().get("faceId").getAsString();
+                    }
+                }
+
+                //更新海康数据
+                JsonObject paramJson = new JsonObject();
+                String apiPath;
+                if(faceId != null){
+                    apiPath = "api/resource/v1/face/single/update";
+                    paramJson.addProperty("faceId", faceId);
+                    paramJson.addProperty("faceData", base64String);
+
+                }else{
+                    apiPath = "api/resource/v1/face/single/add";
+                    paramJson.addProperty("personId", studentUser.getId());
+                    paramJson.addProperty("faceData", base64String);
+                }
+                String result = apiUtil.doPost(apiPath, paramJson.toString(), null);
+                process.setHikvisionResult(result);
+                stundentFaceProcessService.updateById(process);
+
+                FaceManagement faceManagement = faceManagementMap.get(studentUser.getId());
+                faceManagement.setVerifyStatus(2);
+                faceManagement.setRegisterBase64(base64String);
+                faceManagementService.update(faceManagement);
+            }
         }
         return RT.ok(true);
-
     }
 
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/personnel/entity/StundentFaceProcess.java

@@ -121,4 +121,7 @@ public class StundentFaceProcess implements Serializable {
 
     @ApiModelProperty("审批状态(0:未通过 1:通过)")
     private Integer examStatus;
+
+    @ApiModelProperty("海康接口返回内容")
+    private String hikvisionResult;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/personnel/entity/TeacherFaceProcess.java

@@ -121,4 +121,7 @@ public class TeacherFaceProcess implements Serializable {
 
     @ApiModelProperty("审批状态(0:未通过 1:通过)")
     private Integer examStatus;
+
+    @ApiModelProperty("海康接口返回内容")
+    private String hikvisionResult;
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/student/dto/AddBaseStudentUserDto.java

@@ -30,7 +30,7 @@ public class AddBaseStudentUserDto {
      * 性别
      */
     @ApiModelProperty("性别")
-    private Integer gender;
+    private String gender;
     /**
      * 手机号
      */

+ 1 - 1
src/main/java/com/xjrsoft/module/student/service/impl/PbCseFeeobjupdateServiceImpl.java

@@ -111,7 +111,7 @@ public class PbCseFeeobjupdateServiceImpl extends MPJBaseServiceImpl<PbCseFeeobj
             }
 
             //学生类型
-            Map<String, Long> studentSource = pbCseFeeobjupdateList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getResourcename, Collectors.counting()));
+            Map<String, Long> studentSource = pbCseFeeobjupdateList.stream().filter(x -> x.getResourcename() != null).collect(Collectors.groupingBy(PbCseFeeobjupdate::getResourcename, Collectors.counting()));
             List<EnrollmentStatisticsInfoKeyValue> studentSourceRes = new ArrayList<>();
             for (Map.Entry<String, Long> entry : studentSource.entrySet()) {
                 studentSourceRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));

+ 23 - 7
src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java

@@ -13,21 +13,27 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.GenderDictionaryEnum;
 import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.enums.YesOrNoEnum;
 import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.utils.RedisUtil;
+import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.entity.BaseMajorSet;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
 import com.xjrsoft.module.base.mapper.BaseGradeMapper;
 import com.xjrsoft.module.base.mapper.BaseMajorSetMapper;
+import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.organization.mapper.UserDeptRelationMapper;
 import com.xjrsoft.module.organization.mapper.UserRoleRelationMapper;
 import com.xjrsoft.module.organization.service.IUserDeptRelationService;
+import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentUserDto;
@@ -70,6 +76,7 @@ import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 @Service
@@ -95,19 +102,19 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
     private final BaseStudentMapper baseStudentMapper;
 
     private final IUserDeptRelationService userDeptRelationService;
+    private final RedisUtil redisUtil;
+    private final UserDeptRelationMapper userDeptRelationMapper;
+    private final IUserService userService;
+    private final CommonPropertiesConfig propertiesConfig;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(AddBaseStudentUserDto dto) {
 
         BaseStudentUser baseStudentUser = BeanUtil.toBean(dto, BaseStudentUser.class);
-
+        baseStudentUser.setCode(dto.getUserName());
         // 用户身份证后6位作为默认密码
-        if (baseStudentUser.getCredentialNumber() != null && baseStudentUser.getCredentialNumber().length() > 6) {
-            String str = baseStudentUser.getCredentialNumber();
-            String lastSix = str.substring(str.length() - 6);
-            baseStudentUser.setPassword(BCrypt.hashpw(lastSix, BCrypt.gensalt()));
-        }
+        baseStudentUser.setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
         studentbaseManagerBaseStudentUserMapper.insert(baseStudentUser);
         for (BaseStudent baseStudent : baseStudentUser.getBaseStudentList()) {
             baseStudent.setUserId(baseStudentUser.getId());
@@ -155,7 +162,16 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
         userRoleRelation.setUserId(baseStudentUser.getId());
         userRoleRelation.setRoleId(RoleEnum.STUDENT.getCode());
         userRoleRelationMapper.insert(userRoleRelation);
+        CompletableFuture.runAsync(() -> {
+            List<User> list = userService.list();
+            redisUtil.set(GlobalConstant.USER_CACHE_KEY, list);
 
+            List<UserDeptRelation> deptRelationList = userDeptRelationMapper.selectList(Wrappers.lambdaQuery(UserDeptRelation.class));
+            redisUtil.set(GlobalConstant.USER_DEPT_RELATION_CACHE_KEY, deptRelationList);
+
+            List<UserRoleRelation> userRoleRelationList = userRoleRelationMapper.selectList(Wrappers.lambdaQuery(UserRoleRelation.class));
+            redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
+        });
         return true;
     }
 
@@ -164,7 +180,7 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
     public Boolean update(UpdateBaseStudentUserDto dto) {
 
         BaseStudentUser baseStudentUser = BeanUtil.toBean(dto, BaseStudentUser.class);
-
+        baseStudentUser.setCode(dto.getUserName());
         studentbaseManagerBaseStudentUserMapper.updateById(baseStudentUser);
 
         //先删除再新增

+ 0 - 1
src/main/java/com/xjrsoft/module/system/controller/FileController.java

@@ -214,7 +214,6 @@ public class FileController {
         fileEntity.setFileType(suffix);
 
         if (GlobalConstant.imageType.contains(StringUtils.lowerCase(suffix.replace(StringPool.DOT, StringPool.EMPTY)))) {
-
             String thSuffix = StringPool.DOT + ImgUtil.IMAGE_TYPE_JPEG;
 
             ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

+ 1 - 1
src/main/java/com/xjrsoft/module/teacher/dto/AddXjrUserDto.java

@@ -47,7 +47,7 @@ public class AddXjrUserDto implements Serializable {
     * 性别
     */
     @ApiModelProperty("性别")
-    private Integer gender;
+    private String gender;
     /**
     * 手机号
     */

+ 1 - 1
src/main/java/com/xjrsoft/module/teacher/dto/UpdateXjrUserDto.java

@@ -52,7 +52,7 @@ public class UpdateXjrUserDto implements Serializable {
     * 性别
     */
     @ApiModelProperty("性别")
-    private Integer gender;
+    private String gender;
     /**
     * 手机号
     */

+ 25 - 8
src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java

@@ -8,11 +8,17 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.RoleEnum;
+import com.xjrsoft.common.utils.RedisUtil;
+import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.organization.mapper.UserDeptRelationMapper;
 import com.xjrsoft.module.organization.mapper.UserRoleRelationMapper;
 import com.xjrsoft.module.organization.service.IUserDeptRelationService;
+import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.teacher.dto.AddXjrUserDto;
 import com.xjrsoft.module.teacher.dto.UpdateXjrUserDto;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
@@ -40,6 +46,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 /**
@@ -63,20 +70,19 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
 
     private final UserRoleRelationMapper userRoleRelationMapper;
     private final IUserDeptRelationService userDeptRelationService;
-
-
+    private final RedisUtil redisUtil;
+    private final UserDeptRelationMapper userDeptRelationMapper;
+    private final IUserService userService;
+    private final CommonPropertiesConfig propertiesConfig;
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(AddXjrUserDto dto) {
 
         XjrUser xjrUser = BeanUtil.toBean(dto, XjrUser.class);
+        xjrUser.setCode(dto.getUserName());
 
-        // 用户身份证后6位作为默认密码
-        if (xjrUser.getCredentialNumber() != null && xjrUser.getCredentialNumber().length() > 6) {
-            String str = xjrUser.getCredentialNumber();
-            String lastSix = str.substring(str.length() - 6);
-            xjrUser.setPassword(BCrypt.hashpw(lastSix, BCrypt.gensalt()));
-        }
+        // 使用系统配置的默认密码
+        xjrUser.setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
         teacherbaseManagerXjrUserMapper.insert(xjrUser);
         for (BaseTeacher baseTeacher : xjrUser.getBaseTeacherList()) {
             baseTeacher.setUserId(xjrUser.getId());
@@ -129,6 +135,17 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         userRoleRelation.setRoleId(RoleEnum.TEACHER.getCode());
         userRoleRelationMapper.insert(userRoleRelation);
 
+        List<User> list = userService.list();
+        list.add(BeanUtil.toBean(xjrUser, User.class));
+        redisUtil.set(GlobalConstant.USER_CACHE_KEY, list);
+
+
+        List<UserDeptRelation> deptRelationList = userDeptRelationMapper.selectList(Wrappers.lambdaQuery(UserDeptRelation.class));
+        redisUtil.set(GlobalConstant.USER_DEPT_RELATION_CACHE_KEY, deptRelationList);
+
+        List<UserRoleRelation> userRoleRelationList = userRoleRelationMapper.selectList(Wrappers.lambdaQuery(UserRoleRelation.class));
+        redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
+
         return true;
     }
 

+ 1 - 0
src/main/java/com/xjrsoft/module/workflow/service/IWorkflowExecuteService.java

@@ -5,6 +5,7 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.module.workflow.dto.*;
 import com.xjrsoft.module.workflow.vo.*;
 
+import java.sql.SQLException;
 import java.util.List;
 
 /**

+ 20 - 4
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -10,6 +10,7 @@ import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.Db;
 import cn.hutool.db.Session;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.json.JSONUtil;
@@ -42,6 +43,7 @@ import com.xjrsoft.common.enums.YesOrNoEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.utils.DatasourceUtil;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
@@ -208,6 +210,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.ssssssss.magicapi.core.service.MagicAPIService;
 
+import javax.sql.DataSource;
+import java.sql.SQLException;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -4111,18 +4115,23 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
     }
 
     @Override
-    public boolean deleteDraft(List<Long> ids) {
+    public boolean deleteDraft(List<Long> ids){
         //根据草稿箱查询对应的流程
         List<WorkflowDraft> list = workflowDraftService.list(
             new QueryWrapper<WorkflowDraft>()
-            .lambda().eq(WorkflowDraft::getId, ids)
+            .lambda()
+            .select(WorkflowDraft::getId)
+            .select(WorkflowDraft.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowDraft.class).contains(x.getProperty()))
+            .in(WorkflowDraft::getId, ids)
         );
         JsonParser parser = new JsonParser();
+        DataSource datasource = DatasourceUtil.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
+        Db use = Db.use(datasource);
         for (WorkflowDraft workflowDraft : list) {
             WorkflowSchema schema = workflowSchemaMapper.selectById(workflowDraft.getSchemaId());
             JsonObject JsonContent = parser.parse(schema.getJsonContent()).getAsJsonObject();
             JsonObject processConfig = JsonContent.get("processConfig").getAsJsonObject();
-            String formId = processConfig.get("formInitConfig").getAsJsonObject().get("formId").getAsString();
+            String formId = processConfig.get("defaultFormList").getAsJsonArray().get(0).getAsJsonObject().get("formId").getAsString();
             FormTemplate formTemplate = formTemplateMapper.selectById(formId);
 
             JsonObject formJson = parser.parse(formTemplate.getFormJson()).getAsJsonObject();
@@ -4131,7 +4140,14 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             for (JsonElement tableConfig : tableConfigs) {
                 JsonObject table = tableConfig.getAsJsonObject();
                 if(workflowDraft.getDataId() != null &&  !"".equals(workflowDraft.getDataId())){
-                    workflowDraftService.deleteFormData(table.get("tableName").getAsString(), workflowDraft.getDataId());
+                    String sql = "delete from " + table.get("tableName").getAsString() + " where id = " + workflowDraft.getDataId();
+                    List<String> sqls = new ArrayList<>();
+                    sqls.add(sql);
+                    try {
+                        use.executeBatch(sqls);
+                    } catch (SQLException e) {
+                        throw new RuntimeException(e);
+                    }
                 }
             }
         }

+ 1 - 1
src/main/resources/application-dev.yml

@@ -73,7 +73,7 @@ xjrsoft:
   common:
     druid-account: admin # druid 监控账户
     druid-password: admin # druid 监控密码
-    default-password: "cqtlzjzx2023" #默认密码(用户重置密码后为该密码)
+    default-password: "Aa123456." #默认密码(用户重置密码后为该密码)
     domain-api: http://10.150.10.139:8888/api #api域名地址
 #    domain-app: https://yxh-web.ngrok.yingcaibx.com/# #app域名地址
     #domain-app: http://172.19.17.106:5173/app/# #app域名地址

+ 6 - 0
src/main/resources/mapper/base/BaseClass.xml

@@ -71,4 +71,10 @@
         </if>
     </select>
 
+    <select id="getStudentClass" resultType="com.xjrsoft.module.base.vo.StudentClassVo">
+        SELECT t2.user_id, t1.id, t1.name, t1.teacher_id FROM base_class t1
+        INNER JOIN base_student_school_roll t2 ON t1.id = t2.class_id
+        WHERE t1.delete_mark = 0 AND t2.delete_mark = 0
+    </select>
+
 </mapper>

+ 1 - 1
src/main/resources/mapper/teacher/TeacherFaceImportMapper.xml

@@ -23,7 +23,7 @@
     </select>
 
     <select id="GetStudentUserIdById" parameterType="long" resultType="java.lang.String">
-        select t1.user_id
+        select t.user_id
         from stundent_face_process t
         <if test="id != null">
             where t.id = #{id}

+ 1 - 1
src/test/java/com/xjrsoft/module/liteflow/node/WfTeacherleaveNodeTest.java

@@ -23,7 +23,7 @@ class WfTeacherleaveNodeTest {
     @Test
     public void process() throws Exception {
         // 获取表单中数据编号
-        Long formId = 1783633206562041856L;
+        Long formId = 1792820336026759168L;
         if (formId != null) {
             // 数据处理
             wfTeacherleaveService.hikvisionLeave(formId);

+ 55 - 0
src/test/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessControllerTest.java

@@ -0,0 +1,55 @@
+package com.xjrsoft.module.personnel.controller;
+
+import com.xjrsoft.XjrSoftApplication;
+import com.xjrsoft.common.utils.UploadUtil;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * @author dzx
+ * @date 2024/5/22
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = XjrSoftApplication.class)
+class StundentFaceProcessControllerTest {
+
+    @Test
+    void test() throws Exception {
+        String filePath = "C:\\Users\\14263\\Downloads\\face.rar";
+        File file = new File(filePath);
+        FileInputStream input = new FileInputStream(file);
+        MultipartFile multipartFile = new MockMultipartFile("file",
+                file.getName(), "text/plain", input);
+        String uploadedFile = UploadUtil.uploadFile(multipartFile);
+
+        InputStream download = UploadUtil.download(uploadedFile);
+
+        readZipEntries(download);
+    }
+
+    public static void readZipEntries(InputStream inputStream) throws IOException {
+        try (ZipInputStream zipInputStream = new ZipInputStream(inputStream)) {
+            ZipEntry zipEntry;
+            while ((zipEntry = zipInputStream.getNextEntry()) != null) {
+                // 处理每个zip条目
+                System.out.println("Zip Entry: " + zipEntry.getName());
+                zipInputStream.closeEntry();
+            }
+        }
+    }
+}