瀏覽代碼

随考随阅

xiatian 2 月之前
父節點
當前提交
f563d15acc

+ 118 - 86
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/MarkWorkPaperCreateTask.java

@@ -1,86 +1,118 @@
-package cn.com.qmth.examcloud.task.service.job;
+package cn.com.qmth.examcloud.task.service.job;
-
+
-import java.util.HashMap;
+import java.util.HashMap;
-import java.util.Map;
+import java.util.Map;
-
+
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Component;
-
+
-import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
-import cn.com.qmth.examcloud.marking.api.MarkWorkCloudService;
+import cn.com.qmth.examcloud.marking.api.MarkWorkCloudService;
-import cn.com.qmth.examcloud.marking.api.bean.MarkWorkBean;
+import cn.com.qmth.examcloud.marking.api.bean.MarkWorkBean;
-import cn.com.qmth.examcloud.marking.api.bean.MarkWorkMainBean;
+import cn.com.qmth.examcloud.marking.api.bean.MarkWorkExamBean;
-import cn.com.qmth.examcloud.marking.api.request.UpdateMarkWorkReq;
+import cn.com.qmth.examcloud.marking.api.bean.MarkWorkMainBean;
-import cn.com.qmth.examcloud.marking.api.response.GetTodoMarkWorkMainResp;
+import cn.com.qmth.examcloud.marking.api.request.GetMarkWorkExamReq;
-import cn.com.qmth.examcloud.task.service.consumer.MarkWorkCreateConsumer;
+import cn.com.qmth.examcloud.marking.api.request.UpdateMarkWorkExamDataEndReq;
-import cn.com.qmth.examcloud.task.service.consumer.MarkWorkCreateItemsConsumer;
+import cn.com.qmth.examcloud.marking.api.request.UpdateMarkWorkReq;
-import cn.com.qmth.examcloud.task.service.producer.MarkWorkCreateItemsProducer;
+import cn.com.qmth.examcloud.marking.api.response.GetMarkWorkExamResp;
-import cn.com.qmth.examcloud.task.service.producer.MarkWorkCreateProducer;
+import cn.com.qmth.examcloud.marking.api.response.GetTodoMarkWorkMainResp;
-import cn.com.qmth.examcloud.web.task.AbstractTask;
+import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
-import cn.com.qmth.examcloud.web.task.ScheduleJob;
+import cn.com.qmth.examcloud.support.helper.ExamCacheTransferHelper;
-import cn.com.qmth.examcloud.web.task.TaskTracker;
+import cn.com.qmth.examcloud.task.service.consumer.MarkWorkCreateConsumer;
-
+import cn.com.qmth.examcloud.task.service.consumer.MarkWorkCreateItemsConsumer;
-@Component("markWorkPaperCreateTask")
+import cn.com.qmth.examcloud.task.service.producer.MarkWorkCreateItemsProducer;
-public class MarkWorkPaperCreateTask extends AbstractTask {
+import cn.com.qmth.examcloud.task.service.producer.MarkWorkCreateProducer;
-
+import cn.com.qmth.examcloud.web.task.AbstractTask;
-
+import cn.com.qmth.examcloud.web.task.ScheduleJob;
-    @Autowired
+import cn.com.qmth.examcloud.web.task.TaskTracker;
-    private MarkWorkCloudService markWorkCloudService;
+
-
+@Component("markWorkPaperCreateTask")
-
+public class MarkWorkPaperCreateTask extends AbstractTask {
-    @Autowired
+
-    TaskTracker TaskTracker;
+    @Autowired
-
+    private MarkWorkCloudService markWorkCloudService;
-    @Override
+
-    public void run(ScheduleJob scheduleJob) throws Exception {
+    @Autowired
-        GetTodoMarkWorkMainResp res = markWorkCloudService.getTodoMarkWorkMain();
+    TaskTracker TaskTracker;
-        MarkWorkMainBean bean = res.getBean();
+
-        if (res.getBean() != null) {
+    @Override
-            UpdateMarkWorkReq req = new UpdateMarkWorkReq();
+    public void run(ScheduleJob scheduleJob) throws Exception {
-            MarkWorkBean wbean = new MarkWorkBean();
+        // 该任务只获取非千卷的basepaperid来创建item,千卷的不用创建
-            wbean.setId(bean.getId());
+        // 运行一次处理完所有待处理的评卷任务
-            wbean.setName(bean.getName());
+        for (;;) {
-            wbean.setRemark(bean.getRemark());
+            GetTodoMarkWorkMainResp res = markWorkCloudService.getTodoMarkWorkMain();
-            wbean.setAppendTime(bean.getAppendTime());
+            MarkWorkMainBean bean = res.getBean();
-            req.setMarkWorkBean(wbean);
+            if (res.getBean() == null) {
-            try {
+                break;
-                for (Long examId : bean.getExamIds()) {
+            }
-//                    if(CallType.WHOLE_SET.equals(bean.getCallType())) {
+
-                	createMarkItems(examId, bean.getId());
+            UpdateMarkWorkReq req = new UpdateMarkWorkReq();
-//                    }
+            MarkWorkBean wbean = new MarkWorkBean();
-                    createStudentPapers(examId, bean.getId());
+            wbean.setId(bean.getId());
-                }
+            wbean.setName(bean.getName());
-                wbean.setStatus(1);
+            wbean.setRemark(bean.getRemark());
-            } catch (StatusException e) {
+            wbean.setAppendTime(bean.getAppendTime());
-                wbean.setStatus(2);
+            req.setMarkWorkBean(wbean);
-                throw e;
+
-            } catch (Exception e) {
+            GetMarkWorkExamReq we = new GetMarkWorkExamReq();
-                wbean.setStatus(2);
+            we.setWorkId(bean.getId());
-                throw new StatusException("100001", "评卷工作试卷生成出错 ", e);
+            GetMarkWorkExamResp weres = markWorkCloudService.getMarkWorkExam(we);
-            } finally {
+            Map<Long, Boolean> map = new HashMap<>();
-                markWorkCloudService.updateMarkWork(req);
+            for (MarkWorkExamBean web : weres.getData()) {
-            }
+                map.put(web.getExamId(), web.getDataEnd());
-        }
+            }
-    }
+
-
+            try {
-    private void createMarkItems(Long examId, Long workId) throws InstantiationException, IllegalAccessException{
+                for (Long examId : bean.getExamIds()) {
-    	MarkWorkCreateItemsProducer producer = new MarkWorkCreateItemsProducer();
+                    boolean dataEnd = false;
-        Map<String, Object> param = new HashMap<String, Object>();
+                    if (!map.get(examId)) {
-        param.put("examId", examId);
+                        ExamSettingsCacheBean eb = ExamCacheTransferHelper.getDefaultCachedExam(examId);
-        param.put("workId", workId);
+                        if (eb.getEndTime().getTime() <= System.currentTimeMillis()) {
-        producer.startDispose(MarkWorkCreateItemsConsumer.class, 10, param);
+                            dataEnd = true;
-    }
+                        }
-
+                        createMarkItems(examId, bean.getId());
-    private void createStudentPapers(Long examId, Long workId) throws InstantiationException, IllegalAccessException {
+                        createStudentPapers(examId, bean.getId());
-        MarkWorkCreateProducer producer = new MarkWorkCreateProducer();
+                        if (dataEnd) {
-        Map<String, Object> param = new HashMap<String, Object>();
+                            markWorkExamDataEnd(bean.getId(), examId);
-        param.put("examId", examId);
+                        }
-        param.put("workId", workId);
+                    }
-        producer.startDispose(MarkWorkCreateConsumer.class, 10, param);
+                }
-    }
+                wbean.setStatus(1);
-
+            } catch (StatusException e) {
-    @Override
+                wbean.setStatus(2);
-    public TaskTracker getTaskTracker() {
+                throw e;
-        return TaskTracker;
+            } catch (Exception e) {
-    }
+                wbean.setStatus(2);
-}
+                throw new StatusException("100001", "评卷工作试卷生成出错 ", e);
+            } finally {
+                markWorkCloudService.updateMarkWork(req);
+            }
+        }
+    }
+
+    private void markWorkExamDataEnd(Long workId, Long examId) {
+        UpdateMarkWorkExamDataEndReq req = new UpdateMarkWorkExamDataEndReq(workId, examId);
+        markWorkCloudService.updateMarkWorkExamDataEnd(req);
+    }
+
+    private void createMarkItems(Long examId, Long workId) throws InstantiationException, IllegalAccessException {
+        MarkWorkCreateItemsProducer producer = new MarkWorkCreateItemsProducer();
+        Map<String, Object> param = new HashMap<String, Object>();
+        param.put("examId", examId);
+        param.put("workId", workId);
+        producer.startDispose(MarkWorkCreateItemsConsumer.class, 10, param);
+    }
+
+    private void createStudentPapers(Long examId, Long workId) throws InstantiationException, IllegalAccessException {
+        MarkWorkCreateProducer producer = new MarkWorkCreateProducer();
+        Map<String, Object> param = new HashMap<String, Object>();
+        param.put("examId", examId);
+        param.put("workId", workId);
+        producer.startDispose(MarkWorkCreateConsumer.class, 10, param);
+    }
+
+    @Override
+    public TaskTracker getTaskTracker() {
+        return TaskTracker;
+    }
+}

+ 174 - 82
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/producer/MarkWorkCreateItemsProducer.java

@@ -1,82 +1,174 @@
-package cn.com.qmth.examcloud.task.service.producer;
+package cn.com.qmth.examcloud.task.service.producer;
-
+
-import java.util.ArrayList;
+import java.util.ArrayList;
-import java.util.HashSet;
+import java.util.HashSet;
-import java.util.List;
+import java.util.List;
-import java.util.Map;
+import java.util.Map;
-import java.util.Set;
+import java.util.Set;
-
+
-import org.slf4j.Logger;
+import org.apache.commons.collections4.CollectionUtils;
-import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
-
+import org.slf4j.LoggerFactory;
-import cn.com.qmth.examcloud.core.oe.admin.api.ExamRecordForMarkingCloudService;
+
-import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordForMarkingBean;
+import cn.com.qmth.examcloud.api.commons.enums.CallType;
-import cn.com.qmth.examcloud.core.oe.admin.api.request.FindExamRecordForMarkingInfoReq;
+import cn.com.qmth.examcloud.api.commons.enums.ExamType;
-import cn.com.qmth.examcloud.core.oe.admin.api.response.FindExamRecordForMarkingInfoResp;
+import cn.com.qmth.examcloud.core.oe.admin.api.ExamRecordForMarkingCloudService;
-import cn.com.qmth.examcloud.support.cache.CacheHelper;
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordForMarkingBean;
-import cn.com.qmth.examcloud.support.cache.bean.SysPropertyCacheBean;
+import cn.com.qmth.examcloud.core.oe.admin.api.request.FindExamRecordForMarkingInfoReq;
-import cn.com.qmth.examcloud.task.base.multithread.Producer;
+import cn.com.qmth.examcloud.core.oe.admin.api.response.FindExamRecordForMarkingInfoResp;
-import cn.com.qmth.examcloud.task.service.dto.MarkWorkCreateItemsDto;
+import cn.com.qmth.examcloud.core.questions.api.ExtractConfigCloudService;
-import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+import cn.com.qmth.examcloud.core.questions.api.bean.ExtractConfigBean;
-
+import cn.com.qmth.examcloud.core.questions.api.bean.ExtractConfigDetailBean;
-public class MarkWorkCreateItemsProducer extends Producer {
+import cn.com.qmth.examcloud.core.questions.api.request.GetExtractConfigBeanReq;
-
+import cn.com.qmth.examcloud.core.questions.api.response.GetExtractConfigBeanResp;
-    private ExamRecordForMarkingCloudService examRecordForMarkingCloudService = SpringContextHolder
+import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
-            .getBean(ExamRecordForMarkingCloudService.class);
+import cn.com.qmth.examcloud.examwork.api.bean.ExamBean;
-
+import cn.com.qmth.examcloud.examwork.api.request.GetExamReq;
-
+import cn.com.qmth.examcloud.examwork.api.response.GetExamResp;
-    private static final Logger LOG = LoggerFactory.getLogger(MarkWorkCreateItemsProducer.class);
+import cn.com.qmth.examcloud.support.cache.CacheHelper;
-
+import cn.com.qmth.examcloud.support.cache.bean.ExamPropertyCacheBean;
-    @Override
+import cn.com.qmth.examcloud.support.cache.bean.SysPropertyCacheBean;
-    protected void produce(Map<String, Object> param) throws Exception {
+import cn.com.qmth.examcloud.support.enums.ExamProperties;
-        Long examId = (Long) param.get("examId");
+import cn.com.qmth.examcloud.support.enums.MarkingType;
-        Long workId = (Long) param.get("workId");
+import cn.com.qmth.examcloud.support.enums.MarkingWorkType;
-        Long batchSize = 50L;
+import cn.com.qmth.examcloud.task.base.multithread.Producer;
-        SysPropertyCacheBean spc = CacheHelper.getSysProperty("marking.rpc.saveMarkItems.batchSize");
+import cn.com.qmth.examcloud.task.service.dto.MarkWorkCreateItemsDto;
-        if (spc != null && spc.getValue() != null) {
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
-            batchSize = (Long) spc.getValue();
+
-        }
+public class MarkWorkCreateItemsProducer extends Producer {
-        
+
-        FindExamRecordForMarkingInfoReq markingReq = new FindExamRecordForMarkingInfoReq();
+    private ExamRecordForMarkingCloudService examRecordForMarkingCloudService = SpringContextHolder
-        markingReq.setExamId(examId);
+            .getBean(ExamRecordForMarkingCloudService.class);
-        markingReq.setBatchNum(workId + "");
+
-        FindExamRecordForMarkingInfoResp markingResp = examRecordForMarkingCloudService
+    private ExamCloudService examCloudService = SpringContextHolder.getBean(ExamCloudService.class);
-                .findExamRecordForMarkingInfo(markingReq);
+
-        List<ExamRecordForMarkingBean> examRecordForMarkingBeanList = markingResp.getExamRecordForMarkingBeanList();
+    private ExtractConfigCloudService extractConfigCloudService = SpringContextHolder
-        if(examRecordForMarkingBeanList!=null&&examRecordForMarkingBeanList.size()>0) {
+            .getBean(ExtractConfigCloudService.class);
-        	List<String> result=duplicateRemoval(examRecordForMarkingBeanList);
+
-        	LOG.info("创建评卷工作评分项,试卷套数:" + result.size());
+    private static final Logger LOG = LoggerFactory.getLogger(MarkWorkCreateItemsProducer.class);
-        	subListDispose(result, workId, batchSize);
+
-        }else {
+    @Override
-        	LOG.info("创建评卷工作评分项,试卷套数:0");
+    protected void produce(Map<String, Object> param) throws Exception {
-        }
+        Long examId = (Long) param.get("examId");
-    }
+        Long workId = (Long) param.get("workId");
-
+        Long batchSize = 50L;
-
+        SysPropertyCacheBean spc = CacheHelper.getSysProperty("marking.rpc.saveMarkItems.batchSize");
-    private List<String> duplicateRemoval(List<ExamRecordForMarkingBean> list){
+        if (spc != null && spc.getValue() != null) {
-    	Set<String> set=new HashSet<String>();
+            batchSize = (Long) spc.getValue();
-    	for(ExamRecordForMarkingBean bean:list) {
+        }
-    		set.add(bean.getBasePaperId());
+
-    	}
+        GetExamReq getExamReq = new GetExamReq();
-    	List<String> result = new ArrayList<>(set);
+        getExamReq.setId(examId);
-    	return result;
+        GetExamResp getExamResp = examCloudService.getExam(getExamReq);
-    }
+        ExamBean examBean = getExamResp.getExamBean();
-    
+
-    private void subListDispose(List<String> list, Long workId, Long batchSize) throws InterruptedException {
+        if (ExamType.ONLINE.name().equals(examBean.getExamType()) && checkIsAnyTimeMark(examId)) {
-        if (list.size() <= batchSize) {
+            // 在线考试且是随考随阅的,从调卷规则和考试记录合并拉取所有试卷。因为调卷规则随时会修改
-            // 生产需处理的数据
+            List<String> result = getAllBasePaperIdsForAnyTimeMark(workId, examId);
-            offer(new MarkWorkCreateItemsDto(list, workId));
+            if (CollectionUtils.isNotEmpty(result)) {
-        } else {
+                LOG.info("创建评卷工作评分项,试卷套数:" + result.size());
-            int size = list.size();
+                subListDispose(result, workId, batchSize);
-            int len = batchSize.intValue();
+            } else {
-            int count = (size + len - 1) / len;
+                LOG.info("创建评卷工作评分项,试卷套数:0");
-
+            }
-            for (int i = 0; i < count; i++) {
+        } else {
-                List<String> subList = list.subList(i * len,
+            FindExamRecordForMarkingInfoReq markingReq = new FindExamRecordForMarkingInfoReq();
-                        ((i + 1) * len > size ? size : len * (i + 1)));
+            markingReq.setExamId(examId);
-                // 生产需处理的数据
+            markingReq.setBatchNum(workId + "");
-                offer(new MarkWorkCreateItemsDto(subList, workId));
+            FindExamRecordForMarkingInfoResp markingResp = examRecordForMarkingCloudService
-            }
+                    .findExamRecordForMarkingInfo(markingReq);
-        }
+            List<ExamRecordForMarkingBean> examRecordForMarkingBeanList = markingResp.getExamRecordForMarkingBeanList();
-    }
+            if (examRecordForMarkingBeanList != null && examRecordForMarkingBeanList.size() > 0) {
-}
+                List<String> result = duplicateRemoval(examRecordForMarkingBeanList);
+                LOG.info("创建评卷工作评分项,试卷套数:" + result.size());
+                subListDispose(result, workId, batchSize);
+            } else {
+                LOG.info("创建评卷工作评分项,试卷套数:0");
+            }
+        }
+
+    }
+
+    private List<String> getAllBasePaperIdsForAnyTimeMark(Long workId, Long examId) {
+        Set<String> basePaperIds = new HashSet<>();
+        GetExtractConfigBeanReq req = new GetExtractConfigBeanReq();
+        req.setExamId(examId);
+        GetExtractConfigBeanResp res = extractConfigCloudService.getExtractConfigBean(req);
+        if (CollectionUtils.isNotEmpty(res.getData())) {
+            for (ExtractConfigBean ec : res.getData()) {
+                boolean randomPaper = CallType.RANDOM_PAPER.equals(ec.getCallType());
+                if (!randomPaper) {
+                    for (ExtractConfigDetailBean ecb : ec.getDetails()) {
+                        basePaperIds.add(ecb.getPaperId());
+                    }
+                }
+            }
+        }
+        FindExamRecordForMarkingInfoReq markingReq = new FindExamRecordForMarkingInfoReq();
+        markingReq.setExamId(examId);
+        markingReq.setBatchNum(workId + "");
+        FindExamRecordForMarkingInfoResp markingResp = examRecordForMarkingCloudService
+                .findExamRecordForMarkingInfo(markingReq);
+        List<ExamRecordForMarkingBean> examRecordForMarkingBeanList = markingResp.getExamRecordForMarkingBeanList();
+        if (examRecordForMarkingBeanList != null && examRecordForMarkingBeanList.size() > 0) {
+            for (ExamRecordForMarkingBean bean : examRecordForMarkingBeanList) {
+                basePaperIds.add(bean.getBasePaperId());
+            }
+        }
+        return new ArrayList<>(basePaperIds);
+    }
+
+    private List<String> duplicateRemoval(List<ExamRecordForMarkingBean> list) {
+        Set<String> set = new HashSet<String>();
+        for (ExamRecordForMarkingBean bean : list) {
+            set.add(bean.getBasePaperId());
+        }
+        List<String> result = new ArrayList<>(set);
+        return result;
+    }
+
+    private boolean checkIsAnyTimeMark(Long examId) {
+        ExamPropertyCacheBean mt = CacheHelper.getExamProperty(examId, ExamProperties.MARKING_TYPE.name());
+        if (mt == null) {
+            return false;
+        }
+        if (!MarkingType.ALL.name().equals(mt.getValue())) {
+            return false;
+        }
+        ExamPropertyCacheBean es = CacheHelper.getExamProperty(examId, ExamProperties.MARKING_WORK_TYPE.name());
+        if (es == null) {
+            return false;
+        }
+        if (MarkingWorkType.ANYTIME.name().equals(es.getValue())) {
+            return true;
+        }
+        return false;
+    }
+
+    // private List<String> duplicateRemoval(List<ExamRecordForMarkingBean>
+    // list) {
+    // Set<String> set = new HashSet<String>();
+    // for (ExamRecordForMarkingBean bean : list) {
+    // set.add(bean.getBasePaperId());
+    // }
+    // List<String> result = new ArrayList<>(set);
+    // return result;
+    // }
+
+    private void subListDispose(List<String> list, Long workId, Long batchSize) throws InterruptedException {
+        if (list.size() <= batchSize) {
+            // 生产需处理的数据
+            offer(new MarkWorkCreateItemsDto(list, workId));
+        } else {
+            int size = list.size();
+            int len = batchSize.intValue();
+            int count = (size + len - 1) / len;
+
+            for (int i = 0; i < count; i++) {
+                List<String> subList = list.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
+                // 生产需处理的数据
+                offer(new MarkWorkCreateItemsDto(subList, workId));
+            }
+        }
+    }
+}