Ver Fonte

阅卷工作生成

xiatian há 5 anos atrás
pai
commit
700990e0c1

+ 10 - 0
examcloud-task-service/pom.xml

@@ -49,5 +49,15 @@
 			<artifactId>examcloud-core-reports-api-client</artifactId>
 			<version>${examcloud.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.rpc</groupId>
+			<artifactId>examcloud-core-marking-api-client</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
+		<dependency>
+            <groupId>cn.com.qmth.examcloud.rpc</groupId>
+            <artifactId>examcloud-core-questions-api-client</artifactId>
+            <version>${examcloud.version}</version>
+        </dependency>
 	</dependencies>
 </project>

+ 63 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/consumer/MarkWorkCreateConsumer.java

@@ -0,0 +1,63 @@
+package cn.com.qmth.examcloud.task.service.consumer;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordForMarkingBean;
+import cn.com.qmth.examcloud.core.oe.student.api.OeExamRecordForMarkingCloudService;
+import cn.com.qmth.examcloud.core.oe.student.api.request.UpdateExamRecordForMarkingBatchNumReq;
+import cn.com.qmth.examcloud.examwork.api.ExamStudentCloudService;
+import cn.com.qmth.examcloud.examwork.api.bean.ExamCourseRelationBean;
+import cn.com.qmth.examcloud.examwork.api.bean.ExamStudentBean;
+import cn.com.qmth.examcloud.examwork.api.request.GetExamStudentReq;
+import cn.com.qmth.examcloud.examwork.api.response.GetExamStudentResp;
+import cn.com.qmth.examcloud.marking.api.StudentPaperCloudService;
+import cn.com.qmth.examcloud.marking.api.bean.StudentPaperBean;
+import cn.com.qmth.examcloud.marking.api.request.SaveStudentPaperReq;
+import cn.com.qmth.examcloud.task.base.multithread.Consumer;
+import cn.com.qmth.examcloud.task.service.dto.MarkWorkCreateDto;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+
+public class MarkWorkCreateConsumer extends Consumer<MarkWorkCreateDto> {
+
+    private StudentPaperCloudService studentPaperCloudService = SpringContextHolder
+            .getBean(StudentPaperCloudService.class);
+
+    private ExamStudentCloudService examStudentCloudService = SpringContextHolder
+            .getBean(ExamStudentCloudService.class);
+
+    private OeExamRecordForMarkingCloudService oeExamRecordForMarkingCloudService = SpringContextHolder
+            .getBean(OeExamRecordForMarkingCloudService.class);
+
+    @Override
+    public void consume(MarkWorkCreateDto dto) {
+        List<ExamRecordForMarkingBean> examRecordForMarkingBeanList = dto.getList();
+        ExamCourseRelationBean examCourseRelationBean = dto.getExamCourseRelationBean();
+        Long workId = dto.getWorkId();
+        List<StudentPaperBean> studentPapers = new ArrayList<StudentPaperBean>();
+        for (ExamRecordForMarkingBean markingBean : examRecordForMarkingBeanList) {
+            GetExamStudentReq getExamStudentReq = new GetExamStudentReq();
+            getExamStudentReq.setExamStudentId(markingBean.getExamStudentId());
+            GetExamStudentResp getExamStudentResp = examStudentCloudService.getExamStudent(getExamStudentReq);
+            ExamStudentBean examStudentBean = getExamStudentResp.getExamStudentBean();
+            StudentPaperBean studentPaper = new StudentPaperBean(workId, markingBean.getId(),
+                    markingBean.getBasePaperId(), markingBean.getExamStudentId(), markingBean.getCourseId(),
+                    examStudentBean.getOrgCode() == null ? "" : examStudentBean.getOrgCode(),
+                    markingBean.getExamRecordDataId(), markingBean.getObjectiveScore(), markingBean.getPaperType(),
+                    examCourseRelationBean.getCourseCode(), examStudentBean.getIdentityNumber(),
+                    examStudentBean.getStudentName(), examStudentBean.getStudentCode(),
+                    examCourseRelationBean.getCourseName(), examStudentBean.getSpecialtyName());
+            studentPapers.add(studentPaper);
+        }
+        SaveStudentPaperReq sreq = new SaveStudentPaperReq();
+        sreq.setWorkId(workId);
+        sreq.setStudentPaperBeanList(studentPapers);
+        studentPaperCloudService.saveStudentPaper(sreq);
+        UpdateExamRecordForMarkingBatchNumReq req = new UpdateExamRecordForMarkingBatchNumReq();
+        List<Long> ids = studentPapers.stream().map(m -> m.getExamRecordMarkingPk()).collect(Collectors.toList());
+        req.setIdList(ids);
+        req.setBatchNum(workId + "");
+        oeExamRecordForMarkingCloudService.updateExamRecordForMarkingBatchNum(req);
+    }
+}

+ 38 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/dto/MarkWorkCreateDto.java

@@ -0,0 +1,38 @@
+package cn.com.qmth.examcloud.task.service.dto;
+
+import java.util.List;
+
+import cn.com.qmth.examcloud.core.oe.admin.api.bean.ExamRecordForMarkingBean;
+import cn.com.qmth.examcloud.examwork.api.bean.ExamCourseRelationBean;
+
+public class MarkWorkCreateDto{
+	private List<ExamRecordForMarkingBean> list;
+	private Long workId;
+	private ExamCourseRelationBean examCourseRelationBean;
+	public List<ExamRecordForMarkingBean> getList() {
+		return list;
+	}
+	public void setList(List<ExamRecordForMarkingBean> list) {
+		this.list = list;
+	}
+	public Long getWorkId() {
+		return workId;
+	}
+	public void setWorkId(Long workId) {
+		this.workId = workId;
+	}
+	public ExamCourseRelationBean getExamCourseRelationBean() {
+		return examCourseRelationBean;
+	}
+	public void setExamCourseRelationBean(ExamCourseRelationBean examCourseRelationBean) {
+		this.examCourseRelationBean = examCourseRelationBean;
+	}
+	public MarkWorkCreateDto(List<ExamRecordForMarkingBean> list, Long workId,
+			ExamCourseRelationBean examCourseRelationBean) {
+		super();
+		this.list = list;
+		this.workId = workId;
+		this.examCourseRelationBean = examCourseRelationBean;
+	}
+	
+}

+ 141 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/job/MarkWorkPaperCreateTask.java

@@ -0,0 +1,141 @@
+package cn.com.qmth.examcloud.task.service.job;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+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.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.request.GetBasePaperReq;
+import cn.com.qmth.examcloud.core.questions.api.response.GetBasePaperResp;
+import cn.com.qmth.examcloud.marking.api.MarkItemCloudService;
+import cn.com.qmth.examcloud.marking.api.MarkWorkCloudService;
+import cn.com.qmth.examcloud.marking.api.bean.MarkItemBean;
+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.SaveMarkItemReq;
+import cn.com.qmth.examcloud.marking.api.request.UpdateMarkWorkReq;
+import cn.com.qmth.examcloud.marking.api.response.GetTodoMarkWorkMainResp;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultPaper;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionGroup;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionStructureWrapper;
+import cn.com.qmth.examcloud.question.commons.core.paper.DefaultQuestionUnitWrapper;
+import cn.com.qmth.examcloud.task.service.consumer.MarkWorkCreateConsumer;
+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 {
+
+    private static final double SCORE_INTERVAL = 0.5;
+
+    @Autowired
+    private MarkWorkCloudService markWorkCloudService;
+
+    @Autowired
+    private MarkItemCloudService markItemCloudService;
+
+    @Autowired
+    private ExtractConfigCloudService extractConfigCloudService;
+
+    @Autowired
+    private ExamRecordForMarkingCloudService examRecordForMarkingCloudService;
+
+    @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());
+            req.setMarkWorkBean(wbean);
+            try {
+                createMarkItems(Long.parseLong(bean.getExamId()), bean.getId());
+                createStudentPapers(Long.parseLong(bean.getExamId()), bean.getId());
+                wbean.setStatus(1);
+            } catch (Exception e) {
+                wbean.setStatus(2);
+                throw new StatusException("100001", "评卷工作试卷生成出错", e);
+            } finally {
+                markWorkCloudService.updateMarkWork(req);
+            }
+        }
+    }
+
+    private void createMarkItems(Long examId, Long workId) {
+        // 根据考试批次ID获取需要阅卷的试卷集合
+        FindExamRecordForMarkingInfoReq markingReq = new FindExamRecordForMarkingInfoReq();
+        markingReq.setExamId(examId);
+        markingReq.setBatchNum(workId + "");
+        FindExamRecordForMarkingInfoResp markingResp = examRecordForMarkingCloudService
+                .findExamRecordForMarkingInfo(markingReq);
+        List<ExamRecordForMarkingBean> examRecordForMarkingBeanList = markingResp.getExamRecordForMarkingBeanList();
+        List<MarkItemBean> markItems = new ArrayList<MarkItemBean>();
+        GetBasePaperReq getBasePaperReq = new GetBasePaperReq();
+        for (ExamRecordForMarkingBean markingBean : examRecordForMarkingBeanList) {
+            getBasePaperReq.setPaperId(markingBean.getBasePaperId());
+            GetBasePaperResp getBasePaperResp = extractConfigCloudService.getBasePaper(getBasePaperReq);
+            DefaultPaper defaultPaper = getBasePaperResp.getDefaultPaper();
+            List<DefaultQuestionGroup> defaultQuestionGroupList = defaultPaper.getQuestionGroupList();
+            // 大题号
+            int mainNumber = 1;
+            // 每个小题在试卷中的位置
+            int order = 0;
+            for (DefaultQuestionGroup defaultQuestionGroup : defaultQuestionGroupList) {
+                List<DefaultQuestionStructureWrapper> defaultQuestionStructureWrapperList = defaultQuestionGroup
+                        .getQuestionWrapperList();
+                // 小题号
+                int subNumber = 1;
+                for (DefaultQuestionStructureWrapper defaultQuestionStructureWrapper : defaultQuestionStructureWrapperList) {
+                    List<DefaultQuestionUnitWrapper> defaultQuestionUnitWrapperList = defaultQuestionStructureWrapper
+                            .getQuestionUnitWrapperList();
+                    for (DefaultQuestionUnitWrapper defaultQuestionUnitWrapper : defaultQuestionUnitWrapperList) {
+                        order++;
+                        if ("FILL_UP".equals(defaultQuestionUnitWrapper.getQuestionType().toString())
+                                || "ESSAY".equals(defaultQuestionUnitWrapper.getQuestionType().toString())) {
+                            MarkItemBean markItem = new MarkItemBean(markingBean.getBasePaperId(), mainNumber,
+                                    subNumber, defaultQuestionUnitWrapper.getQuestionScore(), SCORE_INTERVAL, order,
+                                    defaultQuestionStructureWrapper.getQuestionId());
+                            markItems.add(markItem);
+                        }
+                        subNumber++;
+                    }
+                }
+                mainNumber++;
+            }
+        }
+        SaveMarkItemReq req = new SaveMarkItemReq();
+        req.setWorkId(workId);
+        req.setMarkItemBeanList(markItems);
+        markItemCloudService.saveMarkWork(req);
+    }
+
+    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;
+    }
+}

+ 102 - 0
examcloud-task-service/src/main/java/cn/com/qmth/examcloud/task/service/producer/MarkWorkCreateProducer.java

@@ -0,0 +1,102 @@
+package cn.com.qmth.examcloud.task.service.producer;
+
+import java.util.List;
+import java.util.Map;
+
+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.QueryValidExamRecordInfoPageReq;
+import cn.com.qmth.examcloud.core.oe.admin.api.response.QueryValidExamRecordInfoPageResp;
+import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
+import cn.com.qmth.examcloud.examwork.api.bean.ExamCourseRelationBean;
+import cn.com.qmth.examcloud.examwork.api.request.GetExamCourseListReq;
+import cn.com.qmth.examcloud.examwork.api.response.GetExamCourseListResp;
+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.MarkWorkCreateDto;
+import cn.com.qmth.examcloud.web.support.SpringContextHolder;
+
+public class MarkWorkCreateProducer extends Producer {
+
+    private ExamRecordForMarkingCloudService examRecordForMarkingCloudService = SpringContextHolder
+            .getBean(ExamRecordForMarkingCloudService.class);
+
+    private ExamCloudService examCloudService = SpringContextHolder.getBean(ExamCloudService.class);
+
+    private static final Logger logger = LoggerFactory.getLogger(MarkWorkCreateProducer.class);
+
+    @Override
+    protected void produce(Map<String, Object> param) throws Exception {
+        Long examId = (Long) param.get("examId");
+        Long workId = (Long) param.get("workId");
+        // 根据考试批次Id去考务中获取课程信息集合
+        GetExamCourseListReq getExamCourseListReq = new GetExamCourseListReq();
+        getExamCourseListReq.setExamId(examId);
+        Long batchSize = 100L;
+        SysPropertyCacheBean spc = CacheHelper.getSysProperty("marking.rpc.savePaperList.batchSize");
+        if (spc != null && spc.getValue() != null) {
+            batchSize = (Long) spc.getValue();
+        }
+        Long start = 1l;
+        while (true) {// 每次去考务调用100条记录(目前暂无处理没有考生的课程)
+            getExamCourseListReq.setStart(start);
+            GetExamCourseListResp getExamCourseListResp = examCloudService.getExamCourseList(getExamCourseListReq);
+
+            for (ExamCourseRelationBean course : getExamCourseListResp.getRelationList()) {
+                createStudentPapers(examId, workId, course, batchSize);
+            }
+            if (start == getExamCourseListResp.getNext()) {
+                break;
+            }
+            start = getExamCourseListResp.getNext();
+        }
+    }
+
+    private void createStudentPapers(Long examId, Long workId, ExamCourseRelationBean examCourseRelationBean,
+            Long batchSize) throws InterruptedException {
+        int count = 0;
+        logger.info("创建评卷工作课程答卷:" + examCourseRelationBean.getCourseCode() + examCourseRelationBean.getCourseName());
+        // 通过“考试批次”和“课程Code”获取需要阅卷的考卷信息集合
+        QueryValidExamRecordInfoPageReq req = new QueryValidExamRecordInfoPageReq();
+        req.setBatchNum(workId + "");
+        req.setExamId(examId);
+        req.setCourseId(examCourseRelationBean.getCourseId());
+        req.setSize(batchSize);
+        Long start = 1l;
+        while (true) {
+            req.setStart(start);
+            QueryValidExamRecordInfoPageResp resp = examRecordForMarkingCloudService.queryValidExamRecordInfoPage(req);
+            count = resp.getExamRecordForMarkingBeanList().size();
+            if (count > 0) {
+                subListDispose(resp.getExamRecordForMarkingBeanList(), workId, examCourseRelationBean, batchSize);
+            }
+            if (start.equals(resp.getNext())) {
+                break;
+            }
+            start = resp.getNext();
+        }
+    }
+
+    private void subListDispose(List<ExamRecordForMarkingBean> list, Long workId,
+            ExamCourseRelationBean examCourseRelationBean, Long batchSize) throws InterruptedException {
+        if (list.size() <= batchSize) {
+            // 生产需处理的数据
+            offer(new MarkWorkCreateDto(list, workId, examCourseRelationBean));
+        } else {
+            int size = list.size();
+            int len = batchSize.intValue();
+            int count = (size + len - 1) / len;
+
+            for (int i = 0; i < count; i++) {
+                List<ExamRecordForMarkingBean> subList = list.subList(i * len,
+                        ((i + 1) * len > size ? size : len * (i + 1)));
+                // 生产需处理的数据
+                offer(new MarkWorkCreateDto(subList, workId, examCourseRelationBean));
+            }
+        }
+    }
+}