浏览代码

merge from release_v4.0.2

deason 4 年之前
父节点
当前提交
f59e513b2f

+ 8 - 0
examcloud-core-oe-task-service/src/main/java/cn/com/qmth/examcloud/core/oe/task/service/ExamRecordDataService.java

@@ -53,4 +53,12 @@ public interface ExamRecordDataService {
      */
     ExamRecordData processAfterHandInExam(Long examRecordDataId);
 
+    /**
+     * Description 是否开启虚拟摄像头进入待审核
+     *
+     * @param examId 考试id
+     * @return boolean
+     */
+    boolean isVirtualToWaiting(Long examId);
+
 }

+ 6 - 1
examcloud-core-oe-task-service/src/main/java/cn/com/qmth/examcloud/core/oe/task/service/impl/ExamCaptureQueueServiceImpl.java

@@ -72,7 +72,12 @@ public class ExamCaptureQueueServiceImpl implements ExamCaptureQueueService {
         examCaptureQueue.setBaseFaceToken(baseFaceToken);
         examCaptureQueue.setExamRecordDataId(saveExamCaptureQueueInfo.getExamRecordDataId());
         examCaptureQueue.setHasVirtualCamera(saveExamCaptureQueueInfo.getHasVirtualCamera());
-        examCaptureQueue.setCameraInfos(saveExamCaptureQueueInfo.getCameraInfos());
+
+        String cameraInfos = saveExamCaptureQueueInfo.getCameraInfos();
+        if (StringUtils.isNotBlank(cameraInfos) && cameraInfos.length() >= 800) {
+            throw new StatusException("500", "虚拟摄像头信息超长!");
+        }
+        examCaptureQueue.setCameraInfos(cameraInfos);
         examCaptureQueue.setExtMsg(saveExamCaptureQueueInfo.getExtMsg());
         examCaptureQueue.setStatus(ExamCaptureQueueStatus.PENDING);
         examCaptureQueue.setErrorNum(0);

+ 7 - 1
examcloud-core-oe-task-service/src/main/java/cn/com/qmth/examcloud/core/oe/task/service/impl/ExamCaptureServiceImpl.java

@@ -602,7 +602,13 @@ public class ExamCaptureServiceImpl implements ExamCaptureService {
         long faceCompareStartTimeMillis = queue.getFaceCompareStartTime();
 
         ExamCaptureEntity resultEntity = new ExamCaptureEntity();
-        resultEntity.setCameraInfos(queue.getCameraInfos());
+
+        String cameraInfos = queue.getCameraInfos();
+        if (StringUtils.isNotBlank(cameraInfos) && cameraInfos.length() >= 800) {
+            throw new StatusException("500", "虚拟摄像头信息超长!");
+        }
+
+        resultEntity.setCameraInfos(cameraInfos);
         resultEntity.setExamRecordDataId(queue.getExamRecordDataId());
         resultEntity.setExtMsg(queue.getExtMsg());
         resultEntity.setFaceCompareResult(queue.getFaceCompareResult());

+ 14 - 0
examcloud-core-oe-task-service/src/main/java/cn/com/qmth/examcloud/core/oe/task/service/impl/ExamRecordDataServiceImpl.java

@@ -18,9 +18,13 @@ import cn.com.qmth.examcloud.support.examing.ExamRecordData;
 import cn.com.qmth.examcloud.support.helper.FaceBiopsyHelper;
 import cn.com.qmth.examcloud.support.redis.RedisKeyHelper;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @Description 考试记录服务
  * @Author lideyin
@@ -42,6 +46,9 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
     @Autowired
     private ExamRecordDataCloudService examRecordDataCloudService;
 
+    @Autowired
+    private JdbcTemplate jdbcTemplate;
+
     @Override
     public void saveExamRecordDataCache(Long examRecordDataId, ExamRecordData data) {
         String key = RedisKeyHelper.getBuilder().examRecordDataKey(examRecordDataId);
@@ -177,4 +184,11 @@ public class ExamRecordDataServiceImpl implements ExamRecordDataService {
         return examRecordData;
     }
 
+    @Override
+    public boolean isVirtualToWaiting(Long examId) {
+        String valueSql = "SELECT value FROM ec_e_exam_prop WHERE exam_id =" + examId + " AND key_id=45";
+        List<Boolean> list = jdbcTemplate.query(valueSql, (rs, rowNum) -> rs.getBoolean("value"));
+        return !CollectionUtils.isEmpty(list) && list.get(0);
+    }
+
 }

+ 29 - 5
examcloud-core-oe-task-service/src/main/java/cn/com/qmth/examcloud/core/oe/task/service/pipeline/SyncExamDataExecutor.java

@@ -9,12 +9,27 @@ import cn.com.qmth.examcloud.commons.logging.ExamCloudLogFactory;
 import cn.com.qmth.examcloud.commons.util.JsonUtil;
 import cn.com.qmth.examcloud.core.oe.admin.api.ExamScoreNoticeQueueCloudService;
 import cn.com.qmth.examcloud.core.oe.admin.api.SyncExamDataCloudService;
-import cn.com.qmth.examcloud.core.oe.admin.api.bean.*;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamCaptureBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamContinuedRecordBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamFaceLivenessVerifyBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamProcessRecordBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamQuestionBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordDataBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordPaperStructBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordQuestionsBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamSyncCaptureBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.FaceBiopsyBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.FaceBiopsyItemBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.FaceBiopsyItemStepBean;
 import cn.com.qmth.examcloud.core.oe.admin.api.request.AddExamScoreNoticeQueueReq;
 import cn.com.qmth.examcloud.core.oe.admin.api.request.SyncExamDataReq;
 import cn.com.qmth.examcloud.core.oe.student.api.ExamRecordDataCloudService;
 import cn.com.qmth.examcloud.core.oe.student.api.bean.StuExamQuestionBean;
-import cn.com.qmth.examcloud.core.oe.student.api.request.*;
+import cn.com.qmth.examcloud.core.oe.student.api.request.GetExamFaceLivenessVerifiesReq;
+import cn.com.qmth.examcloud.core.oe.student.api.request.GetExamRecordPaperStructReq;
+import cn.com.qmth.examcloud.core.oe.student.api.request.GetExamRecordQuestionsReq;
+import cn.com.qmth.examcloud.core.oe.student.api.request.GetFaceBiopsyReq;
+import cn.com.qmth.examcloud.core.oe.student.api.request.UpdatePartialExamRecordReq;
 import cn.com.qmth.examcloud.core.oe.student.api.response.GetExamFaceLivenessVerifiesResp;
 import cn.com.qmth.examcloud.core.oe.student.api.response.GetExamRecordPaperStructResp;
 import cn.com.qmth.examcloud.core.oe.student.api.response.GetExamRecordQuestionsResp;
@@ -143,8 +158,6 @@ public class SyncExamDataExecutor implements NodeExecuter<Long, ExamRecordData,
                 //同步数据
                 SyncExamDataReq syncReq = new SyncExamDataReq();
 
-                syncReq.setExamRecordData(copyExamRecordDataFrom(examRecordData));
-
                 syncReq.setExamRecordPaperStruct(getExamRecordPaperStruct(examRecordDataId));
 
                 syncReq.setExamRecordQuestions(getExamRecordQuestions(examRecordDataId));
@@ -157,7 +170,15 @@ public class SyncExamDataExecutor implements NodeExecuter<Long, ExamRecordData,
                 Long rootOrgId = examRecordData.getRootOrgId();
                 Long examId = examRecordData.getExamId();
                 if (FaceBiopsyHelper.isFaceEnable(rootOrgId, examId, studentId)) {
-                    syncReq.setExamCaptures(getExamCaptures(examRecordDataId));
+                    List<ExamCaptureBean> captures = getExamCaptures(examRecordDataId);
+                    //虚拟摄像头进入待审核,且有虚拟摄像头的,更新缓存
+                    boolean hasVirtualCamera = captures.stream().anyMatch(e->e.getHasVirtualCamera()!=null&&e.getHasVirtualCamera());
+                    if (examRecordDataService.isVirtualToWaiting(examId) && hasVirtualCamera) {
+                        examRecordData.setIsWarn(true);
+                        examRecordDataService.saveExamRecordDataCache(examRecordDataId, examRecordData);
+                    }
+
+                    syncReq.setExamCaptures(captures);
 
                     syncReq.setExamSyncCapture(getExamSyncCapture(examRecordDataId));
 
@@ -167,6 +188,9 @@ public class SyncExamDataExecutor implements NodeExecuter<Long, ExamRecordData,
                         syncReq.setFaceBiopsy(getFaceBiopsy(examRecordDataId));
                     }
                 }
+
+                syncReq.setExamRecordData(copyExamRecordDataFrom(examRecordData));
+
                 long startTime = System.currentTimeMillis();
 
                 //同步数据

+ 1 - 1
examcloud-core-oe-task-starter/src/main/java/cn/com/qmth/examcloud/core/oe/task/starter/OETaskApp.java

@@ -35,7 +35,7 @@ public class OETaskApp {
     static {
         String runtimeLevel = System.getProperty("log.commonLevel");
         if (null == runtimeLevel) {
-            System.setProperty("log.commonLevel", "DEBUG");
+            System.setProperty("log.commonLevel", "INFO");
         }
         System.setProperty("hibernate.dialect.storage_engine", "innodb");
         DataIntegrityViolationTransverter.setUniqueRules(UniqueRuleHolder.getUniqueRuleList());

+ 21 - 4
examcloud-core-oe-task-starter/src/main/java/cn/com/qmth/examcloud/core/oe/task/starter/config/ExamCloudResourceManager.java

@@ -1,13 +1,14 @@
 package cn.com.qmth.examcloud.core.oe.task.starter.config;
 
-import cn.com.qmth.examcloud.api.commons.security.bean.AccessApp;
-import cn.com.qmth.examcloud.api.commons.security.bean.Role;
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.api.commons.security.bean.UserType;
+import cn.com.qmth.examcloud.api.commons.enums.DataRuleType;
+import cn.com.qmth.examcloud.api.commons.security.bean.*;
 import cn.com.qmth.examcloud.api.commons.security.enums.RoleMeta;
 import cn.com.qmth.examcloud.commons.util.PathUtil;
 import cn.com.qmth.examcloud.commons.util.PropertiesUtil;
 import cn.com.qmth.examcloud.commons.util.RegExpUtil;
+import cn.com.qmth.examcloud.core.basic.api.UserDataRuleCloudService;
+import cn.com.qmth.examcloud.core.basic.api.request.QueryUserDataRuleReq;
+import cn.com.qmth.examcloud.core.basic.api.response.QueryUserDataRuleResp;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
 import cn.com.qmth.examcloud.support.cache.bean.AppCacheBean;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
@@ -35,6 +36,9 @@ public class ExamCloudResourceManager implements ResourceManager {
     @Autowired
     RedisClient redisClient;
 
+    @Autowired
+    UserDataRuleCloudService userDataRuleCloudService;
+
     static {
         PropertiesUtil.loadFromPath(PathUtil.getResoucePath("security.properties"));
     }
@@ -124,4 +128,17 @@ public class ExamCloudResourceManager implements ResourceManager {
         return false;
     }
 
+    @Override
+    public UserDataRule loadUserDataRule(Long userId, DataRuleType dataRuleType) {
+        QueryUserDataRuleReq req = new QueryUserDataRuleReq();
+        req.setUserId(userId);
+        req.setType(dataRuleType);
+        QueryUserDataRuleResp resp = userDataRuleCloudService.queryUserDataRule(req);
+
+        UserDataRule userDataRule = new UserDataRule();
+        userDataRule.setGlobalStatus(resp.getGlobalStatus());
+        userDataRule.setRefIds(resp.getRefIds());
+        return userDataRule;
+    }
+
 }

+ 6 - 3
examcloud-core-oe-task-starter/src/main/java/cn/com/qmth/examcloud/core/oe/task/starter/config/ExamCloudWebMvcConfigurer.java

@@ -5,6 +5,7 @@ import cn.com.qmth.examcloud.web.interceptor.ApiStatisticInterceptor;
 import cn.com.qmth.examcloud.web.interceptor.FirstInterceptor;
 import cn.com.qmth.examcloud.web.interceptor.SeqlockInterceptor;
 import cn.com.qmth.examcloud.web.redis.RedisClient;
+import cn.com.qmth.examcloud.web.security.DataRuleInterceptor;
 import cn.com.qmth.examcloud.web.security.RequestPermissionInterceptor;
 import cn.com.qmth.examcloud.web.security.ResourceManager;
 import cn.com.qmth.examcloud.web.security.RpcInterceptor;
@@ -35,12 +36,14 @@ public class ExamCloudWebMvcConfigurer implements WebMvcConfigurer {
         registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
         registry.addInterceptor(new ApiFlowLimitedInterceptor()).addPathPatterns("/**");
         registry.addInterceptor(new RpcInterceptor(resourceManager)).addPathPatterns("/**");
-        RequestPermissionInterceptor permissionInterceptor = new RequestPermissionInterceptor(
-                resourceManager, redisClient);
+
+        RequestPermissionInterceptor permissionInterceptor = new RequestPermissionInterceptor(resourceManager, redisClient);
         registry.addInterceptor(permissionInterceptor).addPathPatterns("/**");
+
         registry.addInterceptor(new SeqlockInterceptor(redisClient)).addPathPatterns("/**");
         registry.addInterceptor(new ApiStatisticInterceptor()).addPathPatterns("/**");
 
+        registry.addInterceptor(new DataRuleInterceptor(resourceManager)).addPathPatterns("/api/**");
     }
 
     @Override
@@ -49,4 +52,4 @@ public class ExamCloudWebMvcConfigurer implements WebMvcConfigurer {
                 .maxAge(3600);
     }
 
-}
+}