From fb37f83e5b9f34311246eebcd957bb59741a8e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E4=BA=AE?= Date: Fri, 26 Sep 2025 14:43:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E7=89=87=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bmw/controller/PmWorkerController.java | 73 +++++++++++++++-- .../com/bonus/bmw/domain/vo/PmWorker.java | 8 +- .../bmw/service/impl/PmWorkerServiceImpl.java | 82 +++++++++++++------ .../service/impl/FileUtilsServiceImpl.java | 37 +++++---- 4 files changed, 146 insertions(+), 54 deletions(-) diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/PmWorkerController.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/PmWorkerController.java index 5d84695..e6db1a3 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/PmWorkerController.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/controller/PmWorkerController.java @@ -65,19 +65,21 @@ public class PmWorkerController extends BaseController { @RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth, requiresPermissions = @RequiresPermissions("worker:ein:insert")) @PostMapping("/insert") @SysLog(title = "新增人员入场", businessType = OperaType.UPDATE, logType = 0, module = "施工人员->出入场管理->人员入场管理", details = "新增人员入场") - public AjaxResult insert(@RequestParam(value = "files") MultipartFile[] files,@RequestParam(value = "fileMsg") String fileMsg, @RequestParam(value = "params")String params) { + public AjaxResult insert(@RequestParam(value = "files",required = false) MultipartFile[] files,@RequestParam(value = "fileMsg",required = false) String fileMsg, @RequestParam(value = "params")String params) { try { params= Sm4Utils.decrypt(params); fileMsg= Sm4Utils.decrypt(fileMsg); List listFile = FastJsonHelper.jsonArrStrToBeanList(fileMsg, WebFileDto.class); - // 验证对应关系 - if (listFile.size() != files.length) { - logger.error("文件信息:{}文件数量:{}", listFile.size(), files.length); - throw new IllegalArgumentException("文件信息与文件数量不匹配"); - } - //先将数据对应关系处理还 - for (int i = 0; i < listFile.size(); i++) { - listFile.get(i).setFile(files[i]); + if(files != null && files.length > 0){ + // 验证对应关系 + if (listFile.size() != files.length) { + logger.error("文件信息:{}文件数量:{}", listFile.size(), files.length); + throw new IllegalArgumentException("文件信息与文件数量不匹配"); + } + //先将数据对应关系处理还 + for (int i = 0; i < listFile.size(); i++) { + listFile.get(i).setFile(files[i]); + } } PmWorker o = FastJsonHelper.jsonStrToBean(params, PmWorker.class); return service.insert(o,listFile); @@ -210,6 +212,59 @@ public class PmWorkerController extends BaseController { } } + /** + * 人脸照片合格检测 + * @param base64file + * @return + */ + @RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth, requiresPermissions = @RequiresPermissions("worker:ein:face")) + @PostMapping("/faceDetectionBase64") + @SysLog(title = "人脸照片合格检测", businessType = OperaType.UPDATE, logType = 0, module = "施工人员->出入场管理->人员入场管理", details = "人脸照片合格检测") + public AjaxResult faceDetection(@RequestParam(value = "file") String base64file) { + if (base64file == null || base64file.isEmpty()) { + return AjaxResult.error("文件为空"); + } + File tempFile = null; + try { + // 解码base64数据 + String base64Data = base64file; + if (base64file.startsWith("data:image")) { + // 如果是data URL格式,提取base64部分 + base64Data = base64file.substring(base64file.indexOf(",") + 1); + } + // 确定文件扩展名(简单处理,可根据实际需求调整) + String suffix = ".jpg"; // 默认jpg格式 + if (base64file.contains("png")) { + suffix = ".png"; + } else if (base64file.contains("jpeg")) { + suffix = ".jpeg"; + } + // 创建临时文件 + tempFile = Files.createTempFile("temp-image-", suffix).toFile(); + tempFile.deleteOnExit(); // JVM退出时自动删除 + // 将base64数据写入临时文件 + byte[] imageBytes = java.util.Base64.getDecoder().decode(base64Data); + java.nio.file.Files.write(tempFile.toPath(), imageBytes); + + ArcFaceHelper arcFaceHelper = new ArcFaceHelper(); + // 调用原方法,传入临时文件的路径 + String faceFeatures = arcFaceHelper.getIsFaceImage(tempFile.getAbsolutePath()); + String[] split = faceFeatures.split(","); + if ("200".equals(split[0])){ + return AjaxResult.success(split[1]); + }else{ + return AjaxResult.error(split[1]); + } + } catch (IOException e) { + // 处理异常(如磁盘满、权限不足等) + e.printStackTrace(); + return AjaxResult.error("人脸检测失败:"+e.getMessage()); + } catch (Exception e) { + e.printStackTrace(); + return AjaxResult.error("人脸检测失败:"+e.getMessage()); + } + } + /** * 人员信息导出 */ diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/PmWorker.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/PmWorker.java index 2f871e8..3b798e6 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/PmWorker.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/domain/vo/PmWorker.java @@ -1,13 +1,13 @@ package com.bonus.bmw.domain.vo; -import java.util.Date; -import java.util.List; - import com.bonus.common.core.annotation.Excel; import com.bonus.system.api.model.UploadFileVo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import java.util.Date; +import java.util.List; + /** * 人员基础信息表 */ @@ -196,4 +196,6 @@ public class PmWorker { private String isShanghai; + private String facePhotoBase64; + } diff --git a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmWorkerServiceImpl.java b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmWorkerServiceImpl.java index 0b5fe82..91e423d 100644 --- a/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmWorkerServiceImpl.java +++ b/bonus-modules/bonus-bmw/src/main/java/com/bonus/bmw/service/impl/PmWorkerServiceImpl.java @@ -30,6 +30,7 @@ import javax.validation.Validator; import java.time.LocalDate; import java.time.Period; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -107,16 +108,28 @@ public class PmWorkerServiceImpl implements PmWorkerService{ record.setCreateUser(SecurityUtils.getLoginUser().getSysUser().getUserName()); int insert = mapper.insert(record); if(insert > 0){ - List collect = fileMsg.stream().filter(data -> "faceImg".equals(data.getName())).collect(Collectors.toList()); - //组装数据 - MultipartFile[] workerFiles = new MultipartFile[collect.size()]; - String[] type = new String[collect.size()]; - for (int i = 0; i < collect.size(); i++) { - workerFiles[i] = collect.get(i).getFile(); - type[i] = collect.get(i).getType(); + List uploadFileVos = new ArrayList<>(); + boolean isBase64 = false; + MultipartFile facePhoto = null; + //判断是否上传base64人脸,优先base64 + if(StringUtils.isNotEmpty(record.getFacePhotoBase64())){ + //人脸的数据添加 + UploadFileVo uploadFileVo = fileUploadUtils.uploadBast64(record.getFacePhotoBase64(), Constants.FILE_UPLOAD_WORKER, record.getId().toString(), "人脸照片","", ""); + uploadFileVos.add(uploadFileVo); + isBase64 = true; + }else{ + List collect = fileMsg.stream().filter(data -> "faceImg".equals(data.getName())).collect(Collectors.toList()); + //组装数据 + MultipartFile[] workerFiles = new MultipartFile[collect.size()]; + String[] type = new String[collect.size()]; + for (int i = 0; i < collect.size(); i++) { + workerFiles[i] = collect.get(i).getFile(); + type[i] = collect.get(i).getType(); + } + //人脸的数据添加 + uploadFileVos = fileUploadUtils.uploadFile(workerFiles, Constants.FILE_UPLOAD_WORKER, record.getId().toString(), type,"", ""); + facePhoto = collect.get(0).getFile(); } - //人脸的数据添加 - List uploadFileVos = fileUploadUtils.uploadFile(workerFiles, Constants.FILE_UPLOAD_WORKER, record.getId().toString(), type,"", ""); //入场相关数据添加 addWorkerEinData(record,fileMsg); //下发人脸到考勤机 @@ -127,11 +140,15 @@ public class PmWorkerServiceImpl implements PmWorkerService{ sb.append("人员下发考勤机失败--"); } //下发人脸到人脸库 - if(!collect.isEmpty()){ + if(!uploadFileVos.isEmpty()){ FaceRecognitionBean faceRecognitionBean = new FaceRecognitionBean(); faceRecognitionBean.setUniqueKey(record.getIdNumber()); faceRecognitionBean.setOptMode("add"); - sb.append(appRecognitionService.uploadFaceRecognition(collect.get(0).getFile(), faceRecognitionBean)); + if(isBase64){ + sb.append(appRecognitionService.uploadFaceRecognition(record.getFacePhotoBase64(), faceRecognitionBean)); + }else{ + sb.append(appRecognitionService.uploadFaceRecognition(facePhoto, faceRecognitionBean)); + } } } } @@ -279,17 +296,28 @@ public class PmWorkerServiceImpl implements PmWorkerService{ int update = mapper.updateByPrimaryKey(record); //人脸照片是否修改 List collect = fileMsg.stream().filter(data -> "faceImg".equals(data.getName())).collect(Collectors.toList()); - if(!collect.isEmpty()){ + if(!collect.isEmpty() || record.getFacePhotoBase64() != null){ String s = fileUploadUtils.delFileListById("", record.getId().toString(), Constants.FILE_UPLOAD_WORKER, ""); - //组装数据 - MultipartFile[] workerFiles = new MultipartFile[collect.size()]; - String[] type = new String[collect.size()]; - for (int i = 0; i < collect.size(); i++) { - workerFiles[i] = collect.get(i).getFile(); - type[i] = collect.get(i).getType(); + List uploadFileVos = new ArrayList<>(); + boolean isBase64 = false; + MultipartFile facePhoto = null; + if(record.getFacePhotoBase64() != null){ + //判断是否上传base64人脸,优先base64 + UploadFileVo uploadFileVo = fileUploadUtils.uploadBast64(record.getFacePhotoBase64(), Constants.FILE_UPLOAD_WORKER, record.getId().toString(), "人脸照片","", ""); + uploadFileVos.add(uploadFileVo); + isBase64 = true; + }else{ + //组装数据 + MultipartFile[] workerFiles = new MultipartFile[collect.size()]; + String[] type = new String[collect.size()]; + for (int i = 0; i < collect.size(); i++) { + workerFiles[i] = collect.get(i).getFile(); + type[i] = collect.get(i).getType(); + } + //人脸的数据添加 + uploadFileVos = fileUploadUtils.uploadFile(workerFiles, Constants.FILE_UPLOAD_WORKER, record.getId().toString(), type,"", ""); + facePhoto = collect.get(0).getFile(); } - //人脸的数据添加 - List uploadFileVos = fileUploadUtils.uploadFile(workerFiles, Constants.FILE_UPLOAD_WORKER, record.getId().toString(), type,"", ""); //下发人脸到考勤机 try { if(record.getEinStatus() == 1){ @@ -304,10 +332,16 @@ public class PmWorkerServiceImpl implements PmWorkerService{ sb.append("人员下发考勤机失败--"); } //下发人脸到人脸库 - FaceRecognitionBean faceRecognitionBean = new FaceRecognitionBean(); - faceRecognitionBean.setUniqueKey(record.getIdNumber()); - faceRecognitionBean.setOptMode("add"); - sb.append(appRecognitionService.uploadFaceRecognition(collect.get(0).getFile(), faceRecognitionBean)); + if(!uploadFileVos.isEmpty()){ + FaceRecognitionBean faceRecognitionBean = new FaceRecognitionBean(); + faceRecognitionBean.setUniqueKey(record.getIdNumber()); + faceRecognitionBean.setOptMode("add"); + if(isBase64){ + sb.append(appRecognitionService.uploadFaceRecognition(record.getFacePhotoBase64(), faceRecognitionBean)); + }else{ + sb.append(appRecognitionService.uploadFaceRecognition(facePhoto, faceRecognitionBean)); + } + } } if(record.getEinStatus() == 1){ //已经入过场了 diff --git a/bonus-modules/bonus-file/src/main/java/com/bonus/file/service/impl/FileUtilsServiceImpl.java b/bonus-modules/bonus-file/src/main/java/com/bonus/file/service/impl/FileUtilsServiceImpl.java index f6b0890..0c72f68 100644 --- a/bonus-modules/bonus-file/src/main/java/com/bonus/file/service/impl/FileUtilsServiceImpl.java +++ b/bonus-modules/bonus-file/src/main/java/com/bonus/file/service/impl/FileUtilsServiceImpl.java @@ -11,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; -import javax.annotation.Resource; import java.util.ArrayList; import java.util.Base64; import java.util.List; @@ -35,10 +34,17 @@ public class FileUtilsServiceImpl { private FileUtilMapper mapper; public UploadFileVo upload(String sourceTable, String sourceId, String sourceType,String prefix,String bast64,String bucketName) { - if(bast64.contains(",")){ - bast64 = bast64.split(",")[1]; - } UploadFileVo vo=new UploadFileVo(); + String suffix; + if(bast64.contains(",")){ + String de = bast64.split(",")[1]; + byte[] decodedBytes = Base64.getDecoder().decode(de); + // 计算文件大小 + int fileSizeInBytes = decodedBytes.length; + long size = (long) Math.ceil(fileSizeInBytes / 1024.0); // 向上取整并保持long类型 + vo.setFileSize(size); + } + vo.setSourceId(sourceId); vo.setSourceTable(sourceTable); vo.setSourceType(sourceType); @@ -46,24 +52,19 @@ public class FileUtilsServiceImpl { prefix=floor; } String originFileName = "bast64"; - String day= DateUtils.getCurrentYear(); + String day= DateUtils.getCurrentDay(); String month=DateUtils.getCurrentMonth(); String year=DateUtils.getCurrentYear(); String uuid = StringUtils.randomUUID(); - String suffix=getBase64Type(bast64); - // String suffix=StringUtils.substringAfterLast(originFileName, "."); - // 解码Base64字符串 - byte[] decodedBytes = Base64.getDecoder().decode(bast64); - // 计算文件大小 - int fileSizeInBytes = decodedBytes.length; - double kilobytes = fileSizeInBytes / 1024.0; - long size=Long.parseLong(String.valueOf(kilobytes)); - String fileName=uuid+"."+suffix; + suffix=getBase64Type(bast64); + + + String fileName=uuid+".jpeg"; String filePath=prefix+"/"+year+"/"+month+"/"+day+"/"+fileName; vo.setFilePath(filePath); vo.setOriginFileName(fileName); vo.setFileName(fileName); - vo.setFileSize(size); + vo.setOriginFileName(originFileName); if(StringHelper.isNullOrEmptyString(bucketName)){ bucketName=minioConfig.getBucketName(); @@ -104,7 +105,7 @@ public class FileUtilsServiceImpl { prefix=floor; } String originFileName = file.getOriginalFilename(); - String day= DateUtils.getCurrentYear(); + String day= DateUtils.getCurrentDay(); String month=DateUtils.getCurrentMonth(); String year=DateUtils.getCurrentYear(); String uuid = StringUtils.randomUUID(); @@ -148,7 +149,7 @@ public class FileUtilsServiceImpl { if(StringHelper.isNullOrEmptyString(prefix)){ prefix=floor; } - String day= DateUtils.getCurrentYear(); + String day= DateUtils.getCurrentDay(); String month=DateUtils.getCurrentMonth(); String year=DateUtils.getCurrentYear(); if(StringHelper.isNullOrEmptyString(bucketName)){ @@ -194,7 +195,7 @@ public class FileUtilsServiceImpl { if(StringHelper.isNullOrEmptyString(prefix)){ prefix=floor; } - String day= DateUtils.getCurrentYear(); + String day= DateUtils.getCurrentDay(); String month=DateUtils.getCurrentMonth(); String year=DateUtils.getCurrentYear(); if(StringHelper.isNullOrEmptyString(bucketName)){