|
@@ -9,6 +9,7 @@ import cn.com.qmth.examcloud.core.oe.student.api.response.CalcFaceBiopsyResultRe
|
|
import cn.com.qmth.examcloud.core.oe.student.dao.ExamCaptureQueueRepo;
|
|
import cn.com.qmth.examcloud.core.oe.student.dao.ExamCaptureQueueRepo;
|
|
import cn.com.qmth.examcloud.core.oe.student.dao.ExamRecordDataRepo;
|
|
import cn.com.qmth.examcloud.core.oe.student.dao.ExamRecordDataRepo;
|
|
import cn.com.qmth.examcloud.core.oe.student.dao.entity.ExamRecordDataEntity;
|
|
import cn.com.qmth.examcloud.core.oe.student.dao.entity.ExamRecordDataEntity;
|
|
|
|
+import cn.com.qmth.examcloud.core.oe.task.service.ExamCaptureQueueService;
|
|
import cn.com.qmth.examcloud.core.oe.task.service.ExamCaptureService;
|
|
import cn.com.qmth.examcloud.core.oe.task.service.ExamCaptureService;
|
|
import cn.com.qmth.examcloud.core.oe.task.service.ExamRecordDataService;
|
|
import cn.com.qmth.examcloud.core.oe.task.service.ExamRecordDataService;
|
|
import cn.com.qmth.examcloud.core.oe.task.service.bean.CalculateFaceCheckResultInfo;
|
|
import cn.com.qmth.examcloud.core.oe.task.service.bean.CalculateFaceCheckResultInfo;
|
|
@@ -19,6 +20,8 @@ import cn.com.qmth.examcloud.support.enums.IsSuccess;
|
|
import cn.com.qmth.examcloud.support.examing.ExamRecordData;
|
|
import cn.com.qmth.examcloud.support.examing.ExamRecordData;
|
|
import cn.com.qmth.examcloud.support.helper.FaceBiopsyHelper;
|
|
import cn.com.qmth.examcloud.support.helper.FaceBiopsyHelper;
|
|
import cn.com.qmth.examcloud.support.redis.RedisKeyHelper;
|
|
import cn.com.qmth.examcloud.support.redis.RedisKeyHelper;
|
|
|
|
+import cn.com.qmth.examcloud.web.exception.SequenceLockException;
|
|
|
|
+import cn.com.qmth.examcloud.web.helpers.SequenceLockHelper;
|
|
import cn.com.qmth.examcloud.web.redis.RedisClient;
|
|
import cn.com.qmth.examcloud.web.redis.RedisClient;
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
import org.apache.commons.lang3.ArrayUtils;
|
|
import org.apache.commons.lang3.ArrayUtils;
|
|
@@ -52,6 +55,9 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
|
|
@Autowired
|
|
@Autowired
|
|
private ExamCaptureQueueRepo examCaptureQueueRepo;
|
|
private ExamCaptureQueueRepo examCaptureQueueRepo;
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private ExamCaptureQueueService examCaptureQueueService;
|
|
|
|
+
|
|
@Autowired
|
|
@Autowired
|
|
private ExamRecordDataRepo examRecordDataRepo;
|
|
private ExamRecordDataRepo examRecordDataRepo;
|
|
|
|
|
|
@@ -118,9 +124,29 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
|
|
public ExamRecordData processAfterHandInExam(ExamRecordData examRecordData) {
|
|
public ExamRecordData processAfterHandInExam(ExamRecordData examRecordData) {
|
|
//只有开启的人脸的才会进行如下处理
|
|
//只有开启的人脸的才会进行如下处理
|
|
if (FaceBiopsyHelper.isFaceEnable(examRecordData.getRootOrgId(), examRecordData.getExamId(), examRecordData.getStudentId())) {
|
|
if (FaceBiopsyHelper.isFaceEnable(examRecordData.getRootOrgId(), examRecordData.getExamId(), examRecordData.getStudentId())) {
|
|
- // 判断是否存在未处理的图片
|
|
|
|
- if (examCaptureQueueRepo.existsUnhandledByExamRecordDataId(examRecordData.getId()) != null) {
|
|
|
|
- throw new StatusException(Constants.CAPTURE_PROCESSING_STATUS_CODE, "抓拍照片比对尚未处理完!");
|
|
|
|
|
|
+
|
|
|
|
+ // 判断是否存在未处理的抓拍照片比对
|
|
|
|
+ int queueSize = examCaptureQueueRepo.countByExamRecordDataId(examRecordData.getId());
|
|
|
|
+ if (queueSize > 0) {
|
|
|
|
+ final String lockKey = Constants.FACE_COMPARE_LOCK_PREFIX + examRecordData.getId();
|
|
|
|
+ try {
|
|
|
|
+ SequenceLockHelper.getLockSimple(lockKey);
|
|
|
|
+
|
|
|
|
+ // 处理剩余未比对的抓拍照片
|
|
|
|
+ examCaptureQueueService.handlerExamCaptureQueuesByExamRecordDataId(examRecordData.getId());
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ if (e instanceof SequenceLockException) {
|
|
|
|
+ // 若锁问题,下次会继续执行
|
|
|
|
+ log.warn("当前抓拍照比对任务获取锁失败!examRecordDataId:{}, redisKey:{}", examRecordData.getId(), lockKey);
|
|
|
|
+ } else {
|
|
|
|
+ // 若异常,下次会继续执行(需要排查原因)
|
|
|
|
+ log.error("当前抓拍照比对任务处理失败!examRecordDataId:{}, error:{}", examRecordData.getId(), e.getMessage(), e);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ throw new StatusException(Constants.CAPTURE_PROCESSING_STATUS_CODE, "抓拍照片比对尚未处理完!");
|
|
|
|
+ } finally {
|
|
|
|
+ SequenceLockHelper.releaseLockSimple(lockKey);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// 计算人脸检测结果
|
|
// 计算人脸检测结果
|
|
@@ -157,7 +183,7 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
|
|
IsSuccess.FAILED == calcFaceBiopsyResultResp.getFaceVerifyResult()) {
|
|
IsSuccess.FAILED == calcFaceBiopsyResultResp.getFaceVerifyResult()) {
|
|
examRecordData.setIsIllegality(true);//活检失败,直接判定为违纪
|
|
examRecordData.setIsIllegality(true);//活检失败,直接判定为违纪
|
|
} else {
|
|
} else {
|
|
- //人脸检测或活栓中有一个判断为违纪,则为违纪
|
|
|
|
|
|
+ //人脸检测或活检中有一个判断为违纪,则为违纪
|
|
boolean bi = (null != faceCheckResult.getIsIllegality() && faceCheckResult.getIsIllegality()) ||
|
|
boolean bi = (null != faceCheckResult.getIsIllegality() && faceCheckResult.getIsIllegality()) ||
|
|
(null != calcFaceBiopsyResultResp.getIsIllegality() && calcFaceBiopsyResultResp.getIsIllegality());
|
|
(null != calcFaceBiopsyResultResp.getIsIllegality() && calcFaceBiopsyResultResp.getIsIllegality());
|
|
examRecordData.setIsIllegality(bi);
|
|
examRecordData.setIsIllegality(bi);
|