Procházet zdrojové kódy

将同步比较的人脸结果也保存到照片队列表中

lideyin před 5 roky
rodič
revize
7f12b42147

+ 11 - 1
examcloud-core-oe-face-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/face/controller/ExamCaptureController.java

@@ -53,6 +53,7 @@ public class ExamCaptureController extends ControllerSupport {
     @ApiOperation(value = "同步比较人脸:用于进入考试")
     @PostMapping("/compareFaceSync")
     public CompareFaceSyncInfo compareFaceSync(@RequestParam String fileUrl, @RequestParam(required = false) String signIdentifier) {
+        Long startTime = System.currentTimeMillis();
         User user = getAccessUser();
         Check.isBlank(fileUrl, "文件Url不能为空");
         validateUpyunSign(signIdentifier, fileUrl, user.getUserId());
@@ -62,7 +63,16 @@ public class ExamCaptureController extends ControllerSupport {
         Check.isBlank(baseFaceToken, "学生底照的faceToken为空");
 //		fileUrl = aes.decrypt(fileUrl);
         fileUrl = UrlUtil.decode(fileUrl);
-        return examCaptureService.compareFaceSyncByFileUrl(user.getUserId(), baseFaceToken, fileUrl);
+        CompareFaceSyncInfo compareFaceSyncInfo = examCaptureService.compareFaceSyncByFileUrl(user.getUserId(), baseFaceToken, fileUrl);
+
+        //将人脸同步比较的结果临时存储到redis中.开考后会清除
+        String fileName = fileUrl.substring(fileUrl.lastIndexOf("/"));
+        compareFaceSyncInfo.setFileName(fileName);
+        compareFaceSyncInfo.setFileUrl(fileUrl);
+        compareFaceSyncInfo.setProcessTime(System.currentTimeMillis() - startTime);
+
+        redisClient.set(Constants.FACE_SYNC_COMPARE_RESULT_PREFIX + user.getUserId(), compareFaceSyncInfo, 5 * 60);
+        return compareFaceSyncInfo;
     }
 
     /**

+ 36 - 0
examcloud-core-oe-face-api-provider/src/main/java/cn/com/qmth/examcloud/core/oe/student/face/provider/ExamCaptureCloudServiceProvider.java

@@ -0,0 +1,36 @@
+package cn.com.qmth.examcloud.core.oe.student.face.provider;
+
+
+import cn.com.qmth.examcloud.core.oe.student.face.api.ExamCaptureCloudService;
+import cn.com.qmth.examcloud.core.oe.student.face.api.request.SaveExamCaptureSyncCompareResultReq;
+import cn.com.qmth.examcloud.core.oe.student.face.service.ExamCaptureService;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @Description
+ * @Author lideyin
+ * @Date 2019/10/12 11:01
+ * @Version 1.0
+ */
+@RestController
+@RequestMapping("${$rmp.cloud.oe.student.face}/examCapture")
+public class ExamCaptureCloudServiceProvider extends ControllerSupport
+        implements ExamCaptureCloudService {
+    private static final long serialVersionUID = 7206948579387673158L;
+    @Autowired
+    private ExamCaptureService examCaptureService;
+
+    @Override
+    @ApiOperation(value = "保存抓拍照片的同步比较结果")
+    @PostMapping("/saveExamCaptureSyncCompareResult")
+    public void saveExamCaptureSyncCompareResult(@RequestBody SaveExamCaptureSyncCompareResultReq request) {
+        examCaptureService.saveExamCaptureSyncCompareResult(request.getStudentId(),
+                request.getExamRecordDataId());
+    }
+}

+ 5 - 1
examcloud-core-oe-face-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/face/service/ExamCaptureService.java

@@ -20,7 +20,11 @@ public interface ExamCaptureService {
     @Transactional
     void saveExamCaptureAndDeleteQueue(ExamCaptureQueueInfo examCaptureQueue);
 
-    /**
+
+	@Transactional
+	void saveExamCaptureSyncCompareResult(Long studentId, Long examRecordDataId);
+
+	/**
 	 * 同步比较人脸:用于进入考试
 	 * @param studentId			学生ID
 	 * @param baseFaceToken		学生底照faceToken

+ 52 - 0
examcloud-core-oe-face-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/face/service/bean/CompareFaceSyncInfo.java

@@ -35,6 +35,26 @@ public class CompareFaceSyncInfo implements JsonSerializable{
 	 */
 	private String errorMsg;
 
+	/**
+	 * 文件名称(无需返回给前台)
+	 */
+	private transient String fileName;
+
+	/**
+	 * 文件路径(无需返回给前台)
+	 */
+	private transient String fileUrl;
+
+	/**
+	 * 人脸比对结果(无需返回给前台)
+	 */
+	private transient String faceCompareResult;
+
+	/**
+	 * 人脸比对的处理时间(无需返回给前台)
+	 */
+	private transient Long processTime;
+
 	public Boolean getIsPass() {
 		return isPass;
 	}
@@ -74,4 +94,36 @@ public class CompareFaceSyncInfo implements JsonSerializable{
 	public void setExistsSystemError(boolean existsSystemError) {
 		this.existsSystemError = existsSystemError;
 	}
+
+	public String getFileName() {
+		return fileName;
+	}
+
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+
+	public String getFileUrl() {
+		return fileUrl;
+	}
+
+	public void setFileUrl(String fileUrl) {
+		this.fileUrl = fileUrl;
+	}
+
+	public String getFaceCompareResult() {
+		return faceCompareResult;
+	}
+
+	public void setFaceCompareResult(String faceCompareResult) {
+		this.faceCompareResult = faceCompareResult;
+	}
+
+	public Long getProcessTime() {
+		return processTime;
+	}
+
+	public void setProcessTime(Long processTime) {
+		this.processTime = processTime;
+	}
 }

+ 43 - 3
examcloud-core-oe-face-service/src/main/java/cn/com/qmth/examcloud/core/oe/student/face/service/impl/ExamCaptureServiceImpl.java

@@ -21,6 +21,7 @@ import cn.com.qmth.examcloud.support.cache.bean.SysPropertyCacheBean;
 import cn.com.qmth.examcloud.web.baidu.BaiduClient;
 import cn.com.qmth.examcloud.web.bootstrap.PropertyHolder;
 import cn.com.qmth.examcloud.web.facepp.FaceppClient;
+import cn.com.qmth.examcloud.web.redis.RedisClient;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.io.IOUtils;
@@ -69,11 +70,11 @@ public class ExamCaptureServiceImpl implements ExamCaptureService {
     @Autowired
     private GainBaseDataService gainBaseDataService;
 
-    @Autowired
-    private RedisTemplate<String, Object> redisTemplate;
-
     public static final String TEMP_FILE_EXP = "face_compare/";
 
+    @Autowired
+    private RedisClient redisClient;
+
     /**
      * 对图片进行人脸对比
      *
@@ -359,6 +360,43 @@ public class ExamCaptureServiceImpl implements ExamCaptureService {
         examCaptureQueueRepo.deleteById(examCaptureQueue.getId());
     }
 
+    /**
+     * 保存同步比较的抓拍照片结果
+     *
+     * @param studentId 学生id
+     */
+    @Override
+    @Transactional
+    public void saveExamCaptureSyncCompareResult(Long studentId,Long examRecordDataId) {
+        String syncCopareResultkey = Constants.FACE_SYNC_COMPARE_RESULT_PREFIX + studentId;
+        CompareFaceSyncInfo compareFaceSyncInfo =
+                redisClient.get(syncCopareResultkey, CompareFaceSyncInfo.class);
+        if (compareFaceSyncInfo == null) {
+            return;
+        }
+
+        ExamCaptureEntity examCaptureEntity = new ExamCaptureEntity();
+        examCaptureEntity.setExamRecordDataId(examRecordDataId);
+        examCaptureEntity.setFaceCompareResult(compareFaceSyncInfo.getFaceCompareResult());
+        examCaptureEntity.setFileName(compareFaceSyncInfo.getFileName());
+        examCaptureEntity.setFileUrl(compareFaceSyncInfo.getFileUrl());
+        examCaptureEntity.setIsStranger(compareFaceSyncInfo.getIsStranger());
+        examCaptureEntity.setIsPass(compareFaceSyncInfo.getIsPass());
+        examCaptureEntity.setProcessTime(compareFaceSyncInfo.getProcessTime());
+
+        //同一考试记录下如果有重复的照片,则直接跳过
+        ExamCaptureEntity query = new ExamCaptureEntity();
+        query.setExamRecordDataId(examRecordDataId);
+        query.setFileName(compareFaceSyncInfo.getFileName());
+        Example<ExamCaptureEntity> example = Example.of(query);
+        //照片处理结果中如果已存在,则以已有的数据为准
+        if (!examCaptureRepo.exists(example)) {
+            examCaptureRepo.save(examCaptureEntity);
+        }
+        //删除redis中的同步数据
+        redisClient.delete(syncCopareResultkey);
+    }
+
     private ExamCaptureEntity getExamCaptureFromQueue(ExamCaptureQueueInfo queue) {
         long currentTimeMillis = System.currentTimeMillis();
         long createTimeMillis = queue.getCreationTime().getTime();
@@ -432,6 +470,7 @@ public class ExamCaptureServiceImpl implements ExamCaptureService {
             return compareFaceSyncInfo;
         }
         if (facePPResult.containsKey(Constants.ERROR_MSG)) {
+            compareFaceSyncInfo.setFaceCompareResult(facePPResult.toString());
             compareFaceSyncInfo.setIsPass(false);
             String errMsg = facePPResult.getString(Constants.ERROR_MSG);
             if (errMsg.contains(Constants.FACE_COMPARE_CONCURRENCY_LIMIT_EXCEEDED) ||
@@ -441,6 +480,7 @@ public class ExamCaptureServiceImpl implements ExamCaptureService {
             compareFaceSyncInfo.setErrorMsg(facePPResult.toString());
             return compareFaceSyncInfo;
         } else {
+            compareFaceSyncInfo.setFaceCompareResult(facePPResult.toString());
             if (facePPResult.containsKey("confidence")) {
                 double confidence = facePPResult.getDouble("confidence");
                 JSONObject thresholdsJsonObject = facePPResult.getJSONObject("thresholds");