From 6ae851adf69aec7ddeee88a415efc5d28f2e0c8d Mon Sep 17 00:00:00 2001 From: lishiwei <3230787218@qq.com> Date: Mon, 3 Aug 2026 17:03:22 +0800 Subject: [PATCH] =?UTF-8?q?refactor():=20=E4=BA=BA=E8=84=B8=E8=AF=86?= =?UTF-8?q?=E5=88=AB=E5=8A=9F=E8=83=BD=E8=A1=A5=E5=85=85=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E6=8E=92=E6=9F=A5=E4=B8=8E=E6=9D=83=E9=99=90=E5=88=A4=E6=96=AD?= =?UTF-8?q?=EF=BC=88=E5=A2=9E=E5=8A=A0=E4=BA=86nacos=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=86=85=E7=BD=91=E5=9B=BE=E7=89=87=E9=85=8D=E7=BD=AE=EF=BC=89?= =?UTF-8?q?=E8=A7=A3=E5=86=B3SSL=E8=AF=81=E4=B9=A6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../edu/command/study/StudentSignAddExe.java | 21 +- .../edu/domain/model/study/StudentSignE.java | 278 +++++++++++------- 2 files changed, 183 insertions(+), 116 deletions(-) diff --git a/web-app/src/main/java/com/zcloud/edu/command/study/StudentSignAddExe.java b/web-app/src/main/java/com/zcloud/edu/command/study/StudentSignAddExe.java index f1f90fa..39150d6 100644 --- a/web-app/src/main/java/com/zcloud/edu/command/study/StudentSignAddExe.java +++ b/web-app/src/main/java/com/zcloud/edu/command/study/StudentSignAddExe.java @@ -57,16 +57,16 @@ public class StudentSignAddExe { String faceUrl = null; try { faceUrl = Base64Util.getBase64String(studentSignE.getFiles()[0]); - log.info("StudentSignAddExe-execute,调用阿里进行人脸识别开始"); - long startAliTime = System.currentTimeMillis(); Boolean environment = false; - log.info("StudentSignAddExe-execute,fileUrlConfig.getPrefixUrl():{}",fileUrlConfig.getPrefixUrl()); - if(!"https://jpfz.qhdsafety.com/gbsFileTest/".equals(fileUrlConfig.getPrefixUrl())){ + if (!"https://jpfz.qhdsafety.com/gbsFileTest/".equals(fileUrlConfig.getPrefixUrl())) { environment = true; } - - studentSignE.compareFace(student.getUserAvatarUrl(), faceUrl, fileUrlConfig.getPrefixUrl(),environment); - log.info("StudentSignAddExe-execute,调用阿里进行人脸识别结束,耗时:{}",System.currentTimeMillis() - startAliTime); + log.info("StudentSignAddExe-execute,开始进行人脸识别,prefixUrl:{},environment:{}", fileUrlConfig.getPrefixUrl(), environment); + long startAliTime = System.currentTimeMillis(); + studentSignE.compareFace(student.getUserAvatarUrl(), faceUrl, fileUrlConfig.getPrefixUrl(), environment); + log.info("StudentSignAddExe-execute,人脸识别结束,耗时:{}", System.currentTimeMillis() - startAliTime); + } catch (BizException e) { + throw e; } catch (Exception e) { throw new RuntimeException(e); } @@ -75,7 +75,12 @@ public class StudentSignAddExe { String fileName = Tools.get32UUID() + studentSignE.getFiles()[0].getOriginalFilename().substring(studentSignE.getFiles()[0].getOriginalFilename().lastIndexOf(".")); log.info("StudentSignAddExe-execute,保存人脸图片开始"); long l = System.currentTimeMillis(); - studentSignE.setFaceUrl(zcloudImgFilesFacade.saveFile( faceUrl,fileName, path)); + try { + studentSignE.setFaceUrl(zcloudImgFilesFacade.saveFile( + studentSignE.getFiles()[0].getBytes(), fileName, path, stu.getClassCorpinfoId())); + } catch (IOException e) { + throw new BizException("保存人脸图片失败"); + } log.info("StudentSignAddExe-execute,保存人脸图片结束,耗时:{}",System.currentTimeMillis() - l); studentSignE.init(stu.getStudentId(), stu.getClassId(), stu.getClassCorpinfoId()); boolean res = false; diff --git a/web-domain/src/main/java/com/zcloud/edu/domain/model/study/StudentSignE.java b/web-domain/src/main/java/com/zcloud/edu/domain/model/study/StudentSignE.java index b5ce91b..004e80b 100644 --- a/web-domain/src/main/java/com/zcloud/edu/domain/model/study/StudentSignE.java +++ b/web-domain/src/main/java/com/zcloud/edu/domain/model/study/StudentSignE.java @@ -1,108 +1,170 @@ -package com.zcloud.edu.domain.model.study; - -import com.alibaba.cola.exception.BizException; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.jjb.saas.framework.domain.model.BaseE; -import com.zcloud.gbscommon.utils.Base64Util; -import com.zcloud.gbscommon.utils.FaceUtil; -import com.zcloud.gbscommon.utils.HttpRequestUtil; -import com.zcloud.gbscommon.utils.Tools; -import lombok.Data; -import org.springframework.web.multipart.MultipartFile; - -import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Map; - -/** - * web-domain - * - * @Author zhangyue - * @Date 2026-01-13 14:18:20 - */ -@Data -public class StudentSignE extends BaseE { - private Long id; - //学员id - private String studentId; - //业务id - private String studentSignId; - //班级id - private String classId; - //用户id - private Long userId; - //企业id - private Long corpinfoId; - //签到人脸路径 - private String faceUrl; - //打卡签字路径 - private String signUrl; - //签到类型 1-打卡签到 2-考试签到 - private Integer type; - - private String phone; - private MultipartFile[] files; - //环境 - private String env; - //删除标识true false - private String deleteEnum; - //备注 - private String remarks; - //创建人姓名 - private String createName; - //更新人姓名 - private String updateName; - //租户id - private Long tenantId; - //单位id - private Long orgId; - //版本 - private Integer version; - //创建时间 - private LocalDateTime createTime; - //修改时间 - private LocalDateTime updateTime; - //创建人id - private Long createId; - //修改人id - private Long updateId; - - public void compareFace(String templateFaceUrl, String faceUrl, String prefixUrl, Boolean environment) throws Exception { - try { - String templateFace = Base64Util.urlToBase64(prefixUrl + templateFaceUrl); - Map map = new HashMap(); - map.put("pic1", templateFace); - map.put("pic2", faceUrl); - String jsonParam = JSON.toJSONString(map); - String compareResultStr; - if (environment) { - // 正式环境 - String compareResult = HttpRequestUtil.doPost("http://192.168.192.201:8971/gbs-face/face/compareFace", jsonParam); - JSONObject jsonObject = JSONObject.parseObject(compareResult); - jsonObject.getJSONObject("info").getString("confidence"); - compareResultStr = jsonObject.getJSONObject("info").getString("confidence"); - } else { - // 测试环境 - compareResultStr = FaceUtil.compareFace(templateFace, faceUrl); - } - - if (Double.valueOf(compareResultStr) < 75) { - throw new BizException("人脸不匹配"); - } - this.setStudentSignId(Tools.get32UUID()); - } catch (Exception e) { - e.printStackTrace(); - throw new BizException("人脸不匹配"); - } - - } - - public void init(String studentId, String classId, long corpinfoId) { - this.setStudentId(studentId); - this.setClassId(classId); - this.setCorpinfoId(corpinfoId); - this.setStudentSignId(Tools.get32UUID()); - } -} - +package com.zcloud.edu.domain.model.study; + +import com.alibaba.cola.exception.BizException; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.jjb.saas.framework.domain.model.BaseE; +import com.zcloud.gbscommon.utils.Base64Util; +import com.zcloud.gbscommon.utils.FaceUtil; +import com.zcloud.gbscommon.utils.Tools; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +/** + * web-domain + * + * @Author zhangyue + * @Date 2026-01-13 14:18:20 + */ +@Data +public class StudentSignE extends BaseE { + private Long id; + //学员id + private String studentId; + //业务id + private String studentSignId; + //班级id + private String classId; + //用户id + private Long userId; + //企业id + private Long corpinfoId; + //签到人脸路径 + private String faceUrl; + //打卡签字路径 + private String signUrl; + //签到类型 1-打卡签到 2-考试签到 + private Integer type; + + private String phone; + private MultipartFile[] files; + //环境 + private String env; + //删除标识true false + private String deleteEnum; + //备注 + private String remarks; + //创建人姓名 + private String createName; + //更新人姓名 + private String updateName; + //租户id + private Long tenantId; + //单位id + private Long orgId; + //版本 + private Integer version; + //创建时间 + private LocalDateTime createTime; + //修改时间 + private LocalDateTime updateTime; + //创建人id + private Long createId; + //修改人id + private Long updateId; + + public void compareFace(String templateFaceUrl, String faceUrl, String prefixUrl, Boolean environment) throws Exception { + try { + String templateFace = Base64Util.urlToBase64(prefixUrl + templateFaceUrl); + String compareResultStr; + if (environment) { + // 正式环境:gbs-face + Map map = new HashMap<>(); + map.put("pic1", templateFace); + map.put("pic2", faceUrl); + String compareResult = callGbsFaceCompare(JSON.toJSONString(map)); + compareResultStr = parseGbsFaceConfidence(compareResult); + } else { + // 测试环境:阿里云 + compareResultStr = FaceUtil.compareFace(templateFace, faceUrl); + } + + if (Double.valueOf(compareResultStr) < 75) { + throw new BizException("人脸不匹配"); + } + this.setStudentSignId(Tools.get32UUID()); + } catch (BizException e) { + throw e; + } catch (Exception e) { + throw new BizException("人脸比对失败: " + e.getMessage()); + } + } + + private String callGbsFaceCompare(String jsonParam) throws Exception { + URL url = new URL("http://192.168.192.201:8971/gbs-face/face/compareFace"); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setConnectTimeout(15000); + connection.setReadTimeout(60000); + connection.setDoOutput(true); + connection.setDoInput(true); + connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Accept", "application/json"); + byte[] body = jsonParam.getBytes(StandardCharsets.UTF_8); + connection.setFixedLengthStreamingMode(body.length); + try (OutputStream os = connection.getOutputStream()) { + os.write(body); + } + int responseCode = connection.getResponseCode(); + InputStream is = responseCode >= 200 && responseCode < 300 + ? connection.getInputStream() : connection.getErrorStream(); + if (is == null) { + return ""; + } + StringBuilder result = new StringBuilder(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String line; + while ((line = br.readLine()) != null) { + result.append(line); + } + } finally { + connection.disconnect(); + } + return result.toString(); + } + + private String parseGbsFaceConfidence(String compareResult) { + if (compareResult == null || compareResult.trim().isEmpty()) { + throw new BizException("人脸比对服务无响应"); + } + JSONObject jsonObject = JSONObject.parseObject(compareResult); + if (jsonObject == null) { + throw new BizException("人脸比对服务返回异常: " + compareResult); + } + if ("exception".equals(jsonObject.getString("result"))) { + String exceptionMsg = jsonObject.getString("exception"); + throw new BizException(exceptionMsg != null ? exceptionMsg : "人脸比对服务异常"); + } + JSONObject info = jsonObject.getJSONObject("info"); + if (info != null && info.getString("confidence") != null) { + return info.getString("confidence"); + } + JSONObject data = jsonObject.getJSONObject("data"); + if (data != null && data.getString("confidence") != null) { + return data.getString("confidence"); + } + if (jsonObject.getString("confidence") != null) { + return jsonObject.getString("confidence"); + } + throw new BizException("人脸比对服务返回异常: " + compareResult); + } + + public void init(String studentId, String classId, long corpinfoId) { + this.setStudentId(studentId); + this.setClassId(classId); + this.setCorpinfoId(corpinfoId); + this.setStudentSignId(Tools.get32UUID()); + } +} + \ No newline at end of file