StundentFaceProcessController.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. package com.xjrsoft.module.personnel.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.dev33.satoken.stp.StpUtil;
  4. import cn.hutool.core.bean.BeanUtil;
  5. import cn.hutool.core.util.IdUtil;
  6. import cn.hutool.core.util.ObjectUtil;
  7. import cn.hutool.core.util.StrUtil;
  8. import com.baomidou.mybatisplus.core.metadata.IPage;
  9. import com.baomidou.mybatisplus.core.toolkit.IdWorker;
  10. import com.baomidou.mybatisplus.core.toolkit.StringPool;
  11. import com.github.yulichang.toolkit.MPJWrappers;
  12. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  13. import com.xjrsoft.common.enums.DeleteMark;
  14. import com.xjrsoft.common.model.result.RT;
  15. import com.xjrsoft.common.page.ConventPage;
  16. import com.xjrsoft.common.page.PageOutput;
  17. import com.xjrsoft.common.utils.FileZipUtil;
  18. import com.xjrsoft.common.utils.UploadUtil;
  19. import com.xjrsoft.common.utils.VoToColumnUtil;
  20. import com.xjrsoft.module.base.entity.BaseClass;
  21. import com.xjrsoft.module.base.service.IBaseClassService;
  22. import com.xjrsoft.module.base.vo.StudentClassVo;
  23. import com.xjrsoft.module.hikvision.util.FaceImportUtil;
  24. import com.xjrsoft.module.personnel.dto.AddStundentFaceProcessDto;
  25. import com.xjrsoft.module.personnel.dto.StundentFaceProcessPageDto;
  26. import com.xjrsoft.module.personnel.dto.UpdateStundentFaceProcessDto;
  27. import com.xjrsoft.module.personnel.entity.FaceManagement;
  28. import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
  29. import com.xjrsoft.module.personnel.service.IFaceManagementService;
  30. import com.xjrsoft.module.personnel.service.IStundentFaceProcessService;
  31. import com.xjrsoft.module.personnel.vo.StundentFaceProcessPageVo;
  32. import com.xjrsoft.module.personnel.vo.StundentFaceProcessVo;
  33. import com.xjrsoft.module.student.entity.BaseStudent;
  34. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  35. import com.xjrsoft.module.student.entity.BaseStudentUser;
  36. import com.xjrsoft.module.student.service.IStudentManagerService;
  37. import com.xjrsoft.module.system.entity.DictionaryDetail;
  38. import com.xjrsoft.module.system.entity.File;
  39. import com.xjrsoft.module.system.service.IFileService;
  40. import com.xjrsoft.module.teacher.entity.XjrUser;
  41. import io.swagger.annotations.Api;
  42. import io.swagger.annotations.ApiOperation;
  43. import lombok.AllArgsConstructor;
  44. import org.apache.commons.lang3.StringUtils;
  45. import org.springframework.web.bind.annotation.DeleteMapping;
  46. import org.springframework.web.bind.annotation.GetMapping;
  47. import org.springframework.web.bind.annotation.PostMapping;
  48. import org.springframework.web.bind.annotation.PutMapping;
  49. import org.springframework.web.bind.annotation.RequestBody;
  50. import org.springframework.web.bind.annotation.RequestMapping;
  51. import org.springframework.web.bind.annotation.RequestParam;
  52. import org.springframework.web.bind.annotation.RestController;
  53. import org.springframework.web.multipart.MultipartFile;
  54. import javax.validation.Valid;
  55. import java.io.ByteArrayOutputStream;
  56. import java.io.InputStream;
  57. import java.time.LocalDateTime;
  58. import java.util.Base64;
  59. import java.util.Date;
  60. import java.util.Enumeration;
  61. import java.util.HashMap;
  62. import java.util.List;
  63. import java.util.Map;
  64. import java.util.zip.ZipEntry;
  65. import java.util.zip.ZipFile;
  66. /**
  67. * @title: 学生人脸信息审核
  68. * @Author dzx
  69. * @Date: 2024-05-10
  70. * @Version 1.0
  71. */
  72. @RestController
  73. @RequestMapping("/personnel" + "/stundentFaceProcess")
  74. @Api(value = "/personnel" + "/stundentFaceProcess",tags = "学生人脸信息审核代码")
  75. @AllArgsConstructor
  76. public class StundentFaceProcessController {
  77. private final IStundentFaceProcessService stundentFaceProcessService;
  78. private final IStudentManagerService studentManagerService;
  79. private final IFileService fileService;
  80. private final IFaceManagementService faceManagementService;
  81. private final IBaseClassService classService;
  82. @GetMapping(value = "/page")
  83. @ApiOperation(value="学生人脸信息审核列表(分页)")
  84. @SaCheckPermission("stundentfaceprocess:detail")
  85. public RT<PageOutput<StundentFaceProcessPageVo>> page(@Valid StundentFaceProcessPageDto dto){
  86. if(ObjectUtil.isNull(dto.getStatus())){
  87. dto.setStatus(1);
  88. }
  89. IPage<StundentFaceProcessPageVo> page=stundentFaceProcessService.selectJoinListPage(ConventPage.getPage(dto),StundentFaceProcessPageVo.class,
  90. MPJWrappers.<StundentFaceProcess>lambdaJoin()
  91. .orderByDesc(StundentFaceProcess::getId)
  92. .disableSubLogicDel()
  93. .like(StrUtil.isNotBlank(dto.getName()), XjrUser::getName,dto.getName())
  94. .eq(StrUtil.isNotBlank(dto.getStduyStatus()),BaseStudentSchoolRoll::getStduyStatus,dto.getStduyStatus())
  95. .like(StrUtil.isNotBlank(dto.getMobile()),XjrUser::getMobile,dto.getMobile())
  96. .like(StrUtil.isNotBlank(dto.getStudentId()),BaseStudent::getStudentId,dto.getStudentId())
  97. .eq(ObjectUtil.isNotNull(dto.getClassId())&&dto.getClassId()!=0,StundentFaceProcess::getClassId,dto.getClassId())
  98. .eq(StundentFaceProcess::getExamStatus,dto.getStatus())
  99. .select(StundentFaceProcess::getId,StundentFaceProcess::getUserId,StundentFaceProcess::getClassId,StundentFaceProcess::getFacePhoto)
  100. .innerJoin(XjrUser.class,XjrUser::getId, StundentFaceProcess::getUserId)
  101. .leftJoin(File.class,File::getFolderId,StundentFaceProcess::getFacePhoto)
  102. .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,StundentFaceProcess::getGender, ext->ext.selectAs(DictionaryDetail::getName, StundentFaceProcessPageVo::getGender))
  103. .leftJoin(BaseStudentSchoolRoll.class,BaseStudentSchoolRoll::getUserId,StundentFaceProcess::getUserId)
  104. .leftJoin(DictionaryDetail.class,DictionaryDetail::getCode,BaseStudentSchoolRoll::getStduyStatus, ext->ext.selectAs(DictionaryDetail::getName, StundentFaceProcessPageVo::getStduyStatus))
  105. .leftJoin(BaseClass.class,BaseClass::getId,StundentFaceProcess::getClassId,ext->ext.selectAs(BaseClass::getName,StundentFaceProcessPageVo::getClassCn))
  106. .leftJoin(XjrUser.class,XjrUser::getId,StundentFaceProcess::getTeacherId, ext->ext.selectAs(XjrUser::getName, StundentFaceProcessPageVo::getTeacherCn))
  107. .selectAs(XjrUser::getName,StundentFaceProcess::getName)
  108. .select("t2.file_url AS face_photo_url,t1.user_name AS user_name,t1.mobile")
  109. .leftJoin(BaseStudent.class,BaseStudent::getUserId,StundentFaceProcess::getUserId, ext->ext.selectAs(BaseStudent::getStudentId, StundentFaceProcessPageVo::getStudentId))
  110. );
  111. PageOutput<StundentFaceProcessPageVo> pageOutput = ConventPage.getPageOutput(page, StundentFaceProcessPageVo.class);
  112. return RT.ok(pageOutput);
  113. }
  114. @GetMapping(value = "/info")
  115. @ApiOperation(value="根据id查询学生人脸信息审核信息")
  116. @SaCheckPermission("stundentfaceprocess:detail")
  117. public RT<StundentFaceProcessVo> info(@RequestParam Long id){
  118. StundentFaceProcess stundentFaceProcess = stundentFaceProcessService.getById(id);
  119. if (stundentFaceProcess == null) {
  120. return RT.error("找不到此数据!");
  121. }
  122. return RT.ok(BeanUtil.toBean(stundentFaceProcess, StundentFaceProcessVo.class));
  123. }
  124. @PostMapping
  125. @ApiOperation(value = "新增学生人脸信息审核")
  126. @SaCheckPermission("stundentfaceprocess:add")
  127. public RT<Boolean> add(@Valid @RequestBody AddStundentFaceProcessDto dto){
  128. StundentFaceProcess stundentFaceProcess = BeanUtil.toBean(dto, StundentFaceProcess.class);
  129. boolean isSuccess = stundentFaceProcessService.save(stundentFaceProcess);
  130. return RT.ok(isSuccess);
  131. }
  132. @PutMapping
  133. @ApiOperation(value = "修改学生人脸信息审核")
  134. @SaCheckPermission("stundentfaceprocess:edit")
  135. public RT<Boolean> update(@Valid @RequestBody UpdateStundentFaceProcessDto dto){
  136. StundentFaceProcess stundentFaceProcess = BeanUtil.toBean(dto, StundentFaceProcess.class);
  137. return RT.ok(stundentFaceProcessService.updateById(stundentFaceProcess));
  138. }
  139. @DeleteMapping
  140. @ApiOperation(value = "删除学生人脸信息审核")
  141. @SaCheckPermission("stundentfaceprocess:delete")
  142. public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
  143. return RT.ok(stundentFaceProcessService.removeBatchByIds(ids));
  144. }
  145. @PostMapping(value = "/batch-import")
  146. @ApiOperation(value = "批量新增学生人脸")
  147. @SaCheckPermission("stundentfaceprocess:batch-upload")
  148. public RT<Boolean> batchUpload(@RequestParam("file") MultipartFile file) throws Exception {
  149. List<BaseStudentUser> list = studentManagerService.list(
  150. new MPJLambdaWrapper<BaseStudentUser>().distinct()
  151. .select(BaseStudentUser::getId)
  152. .select(BaseStudentUser.class, x -> VoToColumnUtil.fieldsToColumns(BaseStudentUser.class).contains(x.getProperty()))
  153. .leftJoin(BaseStudent.class, BaseStudent::getUserId, BaseStudentUser::getId)
  154. .eq(BaseStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
  155. .eq(BaseStudentUser::getDeleteMark, DeleteMark.NODELETE.getCode())
  156. );
  157. Map<String, BaseStudentUser> studentMap = new HashMap<>();
  158. for (BaseStudentUser baseStudentUser : list) {
  159. studentMap.put(baseStudentUser.getCredentialNumber(), baseStudentUser);
  160. }
  161. List<StudentClassVo> studentClass = classService.getStudentClass();
  162. Map<Long, StudentClassVo> studentClassMap = new HashMap<>();
  163. for (StudentClassVo classVo : studentClass) {
  164. studentClassMap.put(classVo.getUserId(), classVo);
  165. }
  166. Long folderId = IdWorker.getId();
  167. ZipFile zipFile = FileZipUtil.convertToZipFile(file);
  168. Enumeration<? extends ZipEntry> entries = zipFile.entries();
  169. while (entries.hasMoreElements()){
  170. ZipEntry entry = entries.nextElement();
  171. String filename = entry.getName();
  172. InputStream inputStream = zipFile.getInputStream(entry); //读取文件内容
  173. String idNumber = filename.substring(0, 17);
  174. BaseStudentUser studentUser = studentMap.get(idNumber);
  175. if(studentUser == null){
  176. continue;
  177. }
  178. //将照片转换成base64
  179. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  180. byte[] buffer = new byte[4096];
  181. int bytesRead;
  182. while ((bytesRead = inputStream.read(buffer)) != -1) {
  183. outputStream.write(buffer, 0, bytesRead);
  184. }
  185. byte[] imageBytes = outputStream.toByteArray();
  186. String base64String = Base64.getEncoder().encodeToString(imageBytes);
  187. inputStream.close();
  188. outputStream.close();
  189. //保存到云服务器
  190. String filePath = UploadUtil.uploadFileByte(filename, imageBytes);
  191. //存入数据库
  192. long fileId = IdUtil.getSnowflakeNextId();
  193. String suffix = StringUtils.substringAfterLast(filename, StringPool.DOT);
  194. File fileEntity = new File();
  195. fileEntity.setId(fileId);
  196. fileEntity.setFolderId(folderId);
  197. fileEntity.setFileName(filename);
  198. fileEntity.setCreateDate(LocalDateTime.now());
  199. fileEntity.setCreateUserId(StpUtil.getLoginIdAsLong());
  200. fileEntity.setDeleteMark(0);
  201. fileEntity.setFileUrl(filePath);
  202. fileEntity.setFileSize(file.getSize());
  203. fileEntity.setFileSuffiex(StringPool.DOT + suffix);
  204. fileEntity.setFileType(suffix);
  205. fileService.save(fileEntity);
  206. long baseFaceId = IdUtil.getSnowflakeNextId();
  207. FaceManagement baseFace = new FaceManagement();
  208. baseFace.setId(baseFaceId);
  209. baseFace.setRegisterBase64(base64String);
  210. baseFace.setUserId(studentUser.getId());
  211. baseFace.setSex(studentUser.getGender());
  212. baseFace.setName(studentUser.getName());
  213. baseFace.setIdno(studentUser.getCredentialNumber());
  214. baseFace.setVerifyStatus(1);
  215. baseFace.setCreateDate(LocalDateTime.now());
  216. baseFace.setCreateUserId(StpUtil.getLoginIdAsLong());
  217. baseFace.setDeleteMark(0);
  218. baseFace.setStatus(1);
  219. baseFace.setFileId(fileId);
  220. baseFace.setUserType(2L);
  221. faceManagementService.save(baseFace);
  222. StudentClassVo classVo = studentClassMap.get(studentUser.getId());
  223. StundentFaceProcess studentFace = new StundentFaceProcess();
  224. studentFace.setStatus(1);
  225. studentFace.setCreateDate(new Date());
  226. studentFace.setCreateUserId(StpUtil.getLoginIdAsLong());
  227. studentFace.setDeleteMark(0);
  228. studentFace.setGender(studentUser.getGender());
  229. studentFace.setFacePhoto(fileId);
  230. studentFace.setName(studentUser.getName());
  231. studentFace.setClassId(classVo.getId());
  232. studentFace.setClassCn(classVo.getName());
  233. studentFace.setTeacherId(classVo.getTeacherId());
  234. studentFace.setIdentityCard(studentUser.getCredentialNumber());
  235. studentFace.setStatus(1);
  236. studentFace.setExamStatus(1);
  237. stundentFaceProcessService.save(studentFace);
  238. //将人脸上传海康
  239. FaceImportUtil.ImportStudentFace(studentFace.getId());
  240. }
  241. return RT.ok(true);
  242. }
  243. }