Ver Fonte

批量新增学生人脸

dzx há 9 meses atrás
pai
commit
b22e7d76fe

+ 10 - 0
src/main/java/com/xjrsoft/common/utils/UploadUtil.java

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

+ 120 - 22
src/main/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessController.java

@@ -1,32 +1,48 @@
 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.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.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.FaceImportUtil;
 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 +54,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 +80,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="学生人脸信息审核列表(分页)")
@@ -137,32 +160,107 @@ public class StundentFaceProcessController {
 
     @PostMapping(value = "/batch-upload")
     @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);
+        }
+
+        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, 17);
+            BaseStudentUser studentUser = studentMap.get(idNumber);
+            //将照片转换成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);
+
+            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(fileId);
+            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(fileId);
+            studentFace.setName(studentUser.getName());
+            studentFace.setClassId(classVo.getId());
+            studentFace.setClassCn(classVo.getName());
+            studentFace.setTeacherId(classVo.getTeacherId());
+            studentFace.setIdentityCard(studentUser.getCredentialNumber());
+            studentFace.setStatus(1);
+            studentFace.setExamStatus(1);
+            stundentFaceProcessService.save(studentFace);
+
+            //将人脸上传海康
+            FaceImportUtil.ImportStudentFace(studentFace.getId());
         }
         return RT.ok(true);
-
     }
 
 }

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

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

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

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