瀏覽代碼

随考随阅

xiatian 1 月之前
父節點
當前提交
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;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import cn.com.qmth.examcloud.commons.exception.StatusException;
-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.MarkWorkMainBean;
-import cn.com.qmth.examcloud.marking.api.request.UpdateMarkWorkReq;
-import cn.com.qmth.examcloud.marking.api.response.GetTodoMarkWorkMainResp;
-import cn.com.qmth.examcloud.task.service.consumer.MarkWorkCreateConsumer;
-import cn.com.qmth.examcloud.task.service.consumer.MarkWorkCreateItemsConsumer;
-import cn.com.qmth.examcloud.task.service.producer.MarkWorkCreateItemsProducer;
-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;
-import cn.com.qmth.examcloud.web.task.TaskTracker;
-
-@Component("markWorkPaperCreateTask")
-public class MarkWorkPaperCreateTask extends AbstractTask {
-
-
-    @Autowired
-    private MarkWorkCloudService markWorkCloudService;
-
-
-    @Autowired
-    TaskTracker TaskTracker;
-
-    @Override
-    public void run(ScheduleJob scheduleJob) throws Exception {
-        GetTodoMarkWorkMainResp res = markWorkCloudService.getTodoMarkWorkMain();
-        MarkWorkMainBean bean = res.getBean();
-        if (res.getBean() != null) {
-            UpdateMarkWorkReq req = new UpdateMarkWorkReq();
-            MarkWorkBean wbean = new MarkWorkBean();
-            wbean.setId(bean.getId());
-            wbean.setName(bean.getName());
-            wbean.setRemark(bean.getRemark());
-            wbean.setAppendTime(bean.getAppendTime());
-            req.setMarkWorkBean(wbean);
-            try {
-                for (Long examId : bean.getExamIds()) {
-//                    if(CallType.WHOLE_SET.equals(bean.getCallType())) {
-                	createMarkItems(examId, bean.getId());
-//                    }
-                    createStudentPapers(examId, bean.getId());
-                }
-                wbean.setStatus(1);
-            } catch (StatusException e) {
-                wbean.setStatus(2);
-                throw e;
-            } catch (Exception e) {
-                wbean.setStatus(2);
-                throw new StatusException("100001", "评卷工作试卷生成出错 ", e);
-            } finally {
-                markWorkCloudService.updateMarkWork(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;
-    }
-}
+package cn.com.qmth.examcloud.task.service.job;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+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.MarkWorkExamBean;
+import cn.com.qmth.examcloud.marking.api.bean.MarkWorkMainBean;
+import cn.com.qmth.examcloud.marking.api.request.GetMarkWorkExamReq;
+import cn.com.qmth.examcloud.marking.api.request.UpdateMarkWorkExamDataEndReq;
+import cn.com.qmth.examcloud.marking.api.request.UpdateMarkWorkReq;
+import cn.com.qmth.examcloud.marking.api.response.GetMarkWorkExamResp;
+import cn.com.qmth.examcloud.marking.api.response.GetTodoMarkWorkMainResp;
+import cn.com.qmth.examcloud.support.cache.bean.ExamSettingsCacheBean;
+import cn.com.qmth.examcloud.support.helper.ExamCacheTransferHelper;
+import cn.com.qmth.examcloud.task.service.consumer.MarkWorkCreateConsumer;
+import cn.com.qmth.examcloud.task.service.consumer.MarkWorkCreateItemsConsumer;
+import cn.com.qmth.examcloud.task.service.producer.MarkWorkCreateItemsProducer;
+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;
+import cn.com.qmth.examcloud.web.task.TaskTracker;
+
+@Component("markWorkPaperCreateTask")
+public class MarkWorkPaperCreateTask extends AbstractTask {
+
+    @Autowired
+    private MarkWorkCloudService markWorkCloudService;
+
+    @Autowired
+    TaskTracker TaskTracker;
+
+    @Override
+    public void run(ScheduleJob scheduleJob) throws Exception {
+        // 该任务只获取非千卷的basepaperid来创建item,千卷的不用创建
+        // 运行一次处理完所有待处理的评卷任务
+        for (;;) {
+            GetTodoMarkWorkMainResp res = markWorkCloudService.getTodoMarkWorkMain();
+            MarkWorkMainBean bean = res.getBean();
+            if (res.getBean() == null) {
+                break;
+            }
+
+            UpdateMarkWorkReq req = new UpdateMarkWorkReq();
+            MarkWorkBean wbean = new MarkWorkBean();
+            wbean.setId(bean.getId());
+            wbean.setName(bean.getName());
+            wbean.setRemark(bean.getRemark());
+            wbean.setAppendTime(bean.getAppendTime());
+            req.setMarkWorkBean(wbean);
+
+            GetMarkWorkExamReq we = new GetMarkWorkExamReq();
+            we.setWorkId(bean.getId());
+            GetMarkWorkExamResp weres = markWorkCloudService.getMarkWorkExam(we);
+            Map<Long, Boolean> map = new HashMap<>();
+            for (MarkWorkExamBean web : weres.getData()) {
+                map.put(web.getExamId(), web.getDataEnd());
+            }
+
+            try {
+                for (Long examId : bean.getExamIds()) {
+                    boolean dataEnd = false;
+                    if (!map.get(examId)) {
+                        ExamSettingsCacheBean eb = ExamCacheTransferHelper.getDefaultCachedExam(examId);
+                        if (eb.getEndTime().getTime() <= System.currentTimeMillis()) {
+                            dataEnd = true;
+                        }
+                        createMarkItems(examId, bean.getId());
+                        createStudentPapers(examId, bean.getId());
+                        if (dataEnd) {
+                            markWorkExamDataEnd(bean.getId(), examId);
+                        }
+                    }
+                }
+                wbean.setStatus(1);
+            } catch (StatusException e) {
+                wbean.setStatus(2);
+                throw e;
+            } 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;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-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.core.oe.admin.api.request.FindExamRecordForMarkingInfoReq;
-import cn.com.qmth.examcloud.core.oe.admin.api.response.FindExamRecordForMarkingInfoResp;
-import cn.com.qmth.examcloud.support.cache.CacheHelper;
-import cn.com.qmth.examcloud.support.cache.bean.SysPropertyCacheBean;
-import cn.com.qmth.examcloud.task.base.multithread.Producer;
-import cn.com.qmth.examcloud.task.service.dto.MarkWorkCreateItemsDto;
-import cn.com.qmth.examcloud.web.support.SpringContextHolder;
-
-public class MarkWorkCreateItemsProducer extends Producer {
-
-    private ExamRecordForMarkingCloudService examRecordForMarkingCloudService = SpringContextHolder
-            .getBean(ExamRecordForMarkingCloudService.class);
-
-
-    private static final Logger LOG = LoggerFactory.getLogger(MarkWorkCreateItemsProducer.class);
-
-    @Override
-    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");
-        if (spc != null && spc.getValue() != null) {
-            batchSize = (Long) spc.getValue();
-        }
-        
-        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) {
-        	List<String> result=duplicateRemoval(examRecordForMarkingBeanList);
-        	LOG.info("创建评卷工作评分项,试卷套数:" + result.size());
-        	subListDispose(result, workId, batchSize);
-        }else {
-        	LOG.info("创建评卷工作评分项,试卷套数:0");
-        }
-    }
-
-
-    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));
-            }
-        }
-    }
-}
+package cn.com.qmth.examcloud.task.service.producer;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import cn.com.qmth.examcloud.api.commons.enums.CallType;
+import cn.com.qmth.examcloud.api.commons.enums.ExamType;
+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.core.oe.admin.api.request.FindExamRecordForMarkingInfoReq;
+import cn.com.qmth.examcloud.core.oe.admin.api.response.FindExamRecordForMarkingInfoResp;
+import cn.com.qmth.examcloud.core.questions.api.ExtractConfigCloudService;
+import cn.com.qmth.examcloud.core.questions.api.bean.ExtractConfigBean;
+import cn.com.qmth.examcloud.core.questions.api.bean.ExtractConfigDetailBean;
+import cn.com.qmth.examcloud.core.questions.api.request.GetExtractConfigBeanReq;
+import cn.com.qmth.examcloud.core.questions.api.response.GetExtractConfigBeanResp;
+import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
+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;
+import cn.com.qmth.examcloud.support.cache.CacheHelper;
+import cn.com.qmth.examcloud.support.cache.bean.ExamPropertyCacheBean;
+import cn.com.qmth.examcloud.support.cache.bean.SysPropertyCacheBean;
+import cn.com.qmth.examcloud.support.enums.ExamProperties;
+import cn.com.qmth.examcloud.support.enums.MarkingType;
+import cn.com.qmth.examcloud.support.enums.MarkingWorkType;
+import cn.com.qmth.examcloud.task.base.multithread.Producer;
+import cn.com.qmth.examcloud.task.service.dto.MarkWorkCreateItemsDto;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+
+public class MarkWorkCreateItemsProducer extends Producer {
+
+    private ExamRecordForMarkingCloudService examRecordForMarkingCloudService = SpringContextHolder
+            .getBean(ExamRecordForMarkingCloudService.class);
+
+    private ExamCloudService examCloudService = SpringContextHolder.getBean(ExamCloudService.class);
+
+    private ExtractConfigCloudService extractConfigCloudService = SpringContextHolder
+            .getBean(ExtractConfigCloudService.class);
+
+    private static final Logger LOG = LoggerFactory.getLogger(MarkWorkCreateItemsProducer.class);
+
+    @Override
+    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");
+        if (spc != null && spc.getValue() != null) {
+            batchSize = (Long) spc.getValue();
+        }
+
+        GetExamReq getExamReq = new GetExamReq();
+        getExamReq.setId(examId);
+        GetExamResp getExamResp = examCloudService.getExam(getExamReq);
+        ExamBean examBean = getExamResp.getExamBean();
+
+        if (ExamType.ONLINE.name().equals(examBean.getExamType()) && checkIsAnyTimeMark(examId)) {
+            // 在线考试且是随考随阅的,从调卷规则和考试记录合并拉取所有试卷。因为调卷规则随时会修改
+            List<String> result = getAllBasePaperIdsForAnyTimeMark(workId, examId);
+            if (CollectionUtils.isNotEmpty(result)) {
+                LOG.info("创建评卷工作评分项,试卷套数:" + result.size());
+                subListDispose(result, workId, batchSize);
+            } else {
+                LOG.info("创建评卷工作评分项,试卷套数:0");
+            }
+        } else {
+            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) {
+                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));
+            }
+        }
+    }
+}