Browse Source

ignore update..

deason 2 năm trước cách đây
mục cha
commit
250ad4290c

+ 10 - 7
examcloud-core-oe-student-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/api/controller/ExamCaptureController.java

@@ -65,22 +65,24 @@ public class ExamCaptureController extends ControllerSupport {
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
+    // @Naked
     @ApiOperation(value = "同步比较人脸:用于进入考试")
     @PostMapping("/compareFaceSync")
-    public CompareFaceSyncInfo compareFaceSync(@RequestParam String fileUrl, @RequestParam(required = false) String signIdentifier) {
-        Long startTime = System.currentTimeMillis();
-        User user = getAccessUser();
+    public CompareFaceSyncInfo compareFaceSync(@RequestParam(required = false) String fileUrl
+            , @RequestParam(required = false) String signIdentifier) {
         if (StringUtils.isBlank(fileUrl)) {
-            throw new StatusException("301001", "文件Url不能为空");
+            throw new StatusException("301001", "图片地址不能为空");
         }
+
+        long startTime = System.currentTimeMillis();
+        User user = getAccessUser();
         validateUpyunSign(signIdentifier, fileUrl, user.getUserId());
 
         StudentCacheBean studentCache = CacheHelper.getStudent(user.getUserId());
         String baseFaceToken = studentCache.getFaceToken();
-        if (StringUtils.isBlank(baseFaceToken)) {
-            throw new StatusException("301002", "学生底照的faceToken为空");
+        if (StringUtils.isBlank(baseFaceToken) || StringUtils.isBlank(studentCache.getPhotoPath())) {
+            throw new StatusException("301002", "学生底照不存在");
         }
-        //fileUrl = aes.decrypt(fileUrl);
         fileUrl = UrlUtil.decode(fileUrl);
 
         if (this.isFaceApiLimitSeconds(user.getKey())) {
@@ -93,6 +95,7 @@ public class ExamCaptureController extends ControllerSupport {
         }
 
         CompareFaceSyncInfo compareFaceSyncInfo = examCaptureService.compareFaceSyncByFileUrl(user.getUserId(), baseFaceToken, fileUrl);
+        // CompareFaceSyncInfo compareFaceSyncInfo = examCaptureService.compareFaceSync(studentCache, fileUrl);
         log.warn("compareFaceSyncResult isPass = {}, fileUrl = {}, errorMsg = {}", compareFaceSyncInfo.getIsPass(), fileUrl, compareFaceSyncInfo.getErrorMsg());
 
         //将人脸同步比较的结果临时存储到redis中.开考后会清除

+ 4 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/ExamCaptureService.java

@@ -4,6 +4,7 @@ import cn.com.qmth.examcloud.core.oe.student.base.bean.CompareFaceSyncInfo;
 import cn.com.qmth.examcloud.core.oe.student.bean.task.CalculateFaceCheckResultInfo;
 import cn.com.qmth.examcloud.core.oe.student.bean.task.ExamCaptureQueueInfo;
 import cn.com.qmth.examcloud.core.oe.student.dao.entity.ExamCaptureEntity;
+import cn.com.qmth.examcloud.support.cache.bean.StudentCacheBean;
 
 /**
  * @Description 照片处理结果
@@ -23,8 +24,11 @@ public interface ExamCaptureService {
      * @param fileUrl       抓拍照片Url
      * @return
      */
+    @Deprecated
     CompareFaceSyncInfo compareFaceSyncByFileUrl(Long studentId, String baseFaceToken, String fileUrl);
 
+    CompareFaceSyncInfo compareFaceSync(StudentCacheBean student, String fileUrl);
+
     /**
      * 获取考试抓拍结果
      *

+ 52 - 0
examcloud-core-oe-student-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/service/impl/ExamCaptureServiceImpl.java

@@ -11,8 +11,14 @@ import cn.com.qmth.examcloud.core.oe.student.dao.entity.ExamCaptureEntity;
 import cn.com.qmth.examcloud.core.oe.student.service.ExamCaptureQueueService;
 import cn.com.qmth.examcloud.core.oe.student.service.ExamCaptureService;
 import cn.com.qmth.examcloud.core.oe.student.service.ExamRecordDataService;
+import cn.com.qmth.examcloud.starters.face.verify.model.FaceResult;
+import cn.com.qmth.examcloud.starters.face.verify.model.param.ImageParm;
+import cn.com.qmth.examcloud.starters.face.verify.model.param.ImageTokenParm;
+import cn.com.qmth.examcloud.starters.face.verify.model.param.ImageUrlParm;
+import cn.com.qmth.examcloud.starters.face.verify.service.FaceVerifyService;
 import cn.com.qmth.examcloud.support.Constants;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
+import cn.com.qmth.examcloud.support.cache.bean.StudentCacheBean;
 import cn.com.qmth.examcloud.support.cache.bean.SysPropertyCacheBean;
 import cn.com.qmth.examcloud.support.enums.ExamProperties;
 import cn.com.qmth.examcloud.support.examing.ExamRecordData;
@@ -59,6 +65,9 @@ public class ExamCaptureServiceImpl implements ExamCaptureService {
     @Autowired
     private ExamRecordDataService examRecordDataService;
 
+    @Autowired
+    private FaceVerifyService faceVerifyService;
+
     public static final String TEMP_FILE_EXP = "face_compare/";
 
     @Autowired
@@ -88,6 +97,7 @@ public class ExamCaptureServiceImpl implements ExamCaptureService {
         examCaptureQueueRepo.deleteById(examCaptureQueue.getId());
     }
 
+    @Deprecated
     @Override
     public CompareFaceSyncInfo compareFaceSyncByFileUrl(Long studentId, String baseFaceToken, String fileUrl) {
         CompareFaceSyncInfo compareFaceSyncInfo = new CompareFaceSyncInfo();
@@ -160,6 +170,48 @@ public class ExamCaptureServiceImpl implements ExamCaptureService {
         }
     }
 
+    @Override
+    public CompareFaceSyncInfo compareFaceSync(StudentCacheBean student, String fileUrl) {
+        // 获取学校人脸API方案配置 todo
+        boolean useBaiduApi = true;
+        double baiduExpectFaceCompareScore = 70d;
+
+        CompareFaceSyncInfo info = new CompareFaceSyncInfo();
+        info.setStudentId(student.getId());
+        info.setIsPass(false);
+        info.setIsStranger(false);
+        info.setExistsSystemError(false);
+
+        try {
+            FaceResult faceResult;
+            ImageParm imageParm = new ImageUrlParm(FileStorageUtil.realPath(fileUrl));
+            if (useBaiduApi) {
+                faceResult = faceVerifyService.faceCompareByBaidu(new ImageUrlParm(student.getPhotoPath()), imageParm, baiduExpectFaceCompareScore);
+            } else {
+                faceResult = faceVerifyService.faceCompareByFacePlus(new ImageTokenParm(student.getFaceToken()), imageParm);
+            }
+            info.setIsPass(faceResult.isPass());
+            info.setFaceCompareResult(faceResult.getThresholds());
+
+            if (!faceResult.isPass()) {
+                log.warn("[compareFaceSync] fail --> {}", faceResult.getError());
+                info.setErrorMsg("检测过程中照片非本人");
+            }
+
+            if (faceResult.getFaceNum() > 1) {
+                info.setIsStranger(true);
+                info.setErrorMsg("检测过程中存在多人脸");
+            }
+        } catch (Exception e) {
+            info.setExistsSystemError(true);
+            info.setErrorMsg(e.getMessage());
+
+            log.error("[compareFaceSync] error --> {}", e.getMessage());
+        }
+
+        return info;
+    }
+
     @Override
     public ExamCaptureEntity getExamCaptureResult(Long examRecordDataId, String fileName) {
         return examCaptureRepo.findByExamRecordDataIdAndFileName(examRecordDataId, fileName);