Переглянути джерело

增加多媒体阅卷功能
1.替换rich-text模块的css和独立的渲染js方法,挪到static下独立的rich-text文件夹
2.修改mark-json下的json-builder改为json-loader,只承担json文件的抓取功能;新增json-view作为single-image-view的替代,实际执行json内容的渲染工作

luoshi 5 роки тому
батько
коміт
a6d0863574

+ 169 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/SubjectScoreCalculateThread.java

@@ -0,0 +1,169 @@
+package cn.com.qmth.stmms.admin.thread;
+
+import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.biz.report.service.ReportService;
+import cn.com.qmth.stmms.biz.report.utils.ReportContext;
+import cn.com.qmth.stmms.biz.utils.ScoreCalculateUtil;
+import cn.com.qmth.stmms.biz.utils.ScoreInfo;
+import cn.com.qmth.stmms.common.enums.LockType;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class SubjectScoreCalculateThread implements Runnable {
+
+    protected static Logger log = LoggerFactory.getLogger(SubjectScoreCalculateThread.class);
+
+    private ExamStudentService studentService;
+
+    private ExamQuestionService questionService;
+
+    private MarkService markService;
+
+    private int examId;
+
+    private String subjectCode;
+
+    private Map<String, List<ExamQuestion>> objectiveMap;
+
+    private Map<String, List<ExamQuestion>> subjectiveMap;
+
+    private Map<String, ExamSubject> subjectMap;
+
+    private Map<String, List<MarkGroup>> groupMap;
+
+    private MarkGroupService groupService;
+
+    private ExamSubjectService subjectService;
+
+    private ExamService examService;
+
+    public SubjectScoreCalculateThread(int examId, String subjectCode, ExamStudentService studentService,
+            ExamQuestionService questionService, MarkService markService, ExamService examService, ExamSubjectService subjectService,
+            MarkGroupService groupService) {
+        this.examId = examId;
+        this.subjectCode = subjectCode;
+        this.studentService = studentService;
+        this.questionService = questionService;
+        this.markService = markService;
+        this.examService = examService;
+        this.subjectService = subjectService;
+        this.groupService = groupService;
+        this.objectiveMap = new HashMap<String, List<ExamQuestion>>();
+        this.subjectiveMap = new HashMap<String, List<ExamQuestion>>();
+        this.subjectMap = new HashMap<String, ExamSubject>();
+        this.groupMap = new HashMap<String, List<MarkGroup>>();
+    }
+
+    @Override
+    public void run() {
+        //log.info("start calculate for examId=" + examId);
+        try {
+            // 获取考试信息
+            // Exam exam = examService.findById(examId);
+            // 删除原有统计数据
+            // reportService.deleteData(examId);
+            // context = new ReportContext(exam);
+            // long totalCount = studentService.countByExamId(examId);
+
+            ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+            query.setPageNumber(1);
+            query.setPageSize(1000);
+            query.setExamId(examId);
+            query.setSubjectCode(subjectCode);
+            query.setUpload(true);
+            List<ExamStudent> list = studentService.findByQuery(query).getResult();
+            while (list != null && list.size() > 0) {
+                for (ExamStudent student : list) {
+                    // 先统分
+                    calculate(student);
+                    // 后统计
+                    // statistic(student);
+                }
+                //double process = pageSize * pageNumber * 100.0 / totalCount;
+                //if (process >= 100) {
+                //    process = 99;
+                //}
+                //examService.updateProcess(examId, process);
+                query.setPageNumber(query.getPageNumber() + 1);
+                list = studentService.findByQuery(query).getResult();
+            }
+            // context.save();
+            // 统分结束修改标记
+            // examService.updateNeedCalculate(examId, false);
+            // examService.updateProcess(examId, null);
+        } catch (Exception e) {
+            //log.error("calculate exception for examId=" + examId, e);
+        } finally {
+            //lockService.unlock(LockType.SCORE_CALCULATE, examId);
+            //log.info("finish calculate for examId=" + examId);
+        }
+    }
+
+    private void calculate(ExamStudent student) {
+        // 未上传、缺考、违纪的考生不统分
+        if (!student.isUpload() || student.isAbsent() || student.isBreach()) {
+            return;
+        }
+        try {
+            ScoreCalculateUtil util = ScoreCalculateUtil.instance(student);
+            ScoreInfo info = util.calculate(findQuestionList(student.getSubjectCode(), student.getPaperType(), true), null);
+
+            student.setObjectiveScore(info.getObjectiveScore());
+            student.setScoreList(info.getScoreList(), true);
+
+            studentService.save(student);
+
+            // 增加主观题总分统计
+            markService.scoreCalculate(student, findMarkGroup(student.getSubjectCode()));
+
+        } catch (Exception e) {
+            log.error("calculate error for studentId=" + student.getId(), e);
+        }
+    }
+
+    private List<ExamQuestion> findQuestionList(String subjectCode, String paperType, boolean objective) {
+        if (objective) {
+            String key = subjectCode + "_" + StringUtils.trimToEmpty(paperType);
+            List<ExamQuestion> list = objectiveMap.get(key);
+            if (list == null) {
+                list = questionService.findByExamAndSubjectAndObjectiveAndPaperType(examId, subjectCode, true, paperType);
+                objectiveMap.put(key, list);
+            }
+            return list;
+        } else {
+            List<ExamQuestion> list = subjectiveMap.get(subjectCode);
+            if (list == null) {
+                list = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false);
+                subjectiveMap.put(subjectCode, list);
+            }
+            return list;
+        }
+    }
+
+    private ExamSubject findExamSubject(String subjectCode) {
+        ExamSubject subject = subjectMap.get(subjectCode);
+        if (subject == null) {
+            subject = subjectService.find(examId, subjectCode);
+            subjectMap.put(subjectCode, subject);
+        }
+        return subject;
+    }
+
+    private List<MarkGroup> findMarkGroup(String subjectCode) {
+        List<MarkGroup> list = groupMap.get(subjectCode);
+        if (list == null) {
+            list = groupService.findByExamAndSubject(examId, subjectCode);
+            groupMap.put(subjectCode, list);
+        }
+        return list;
+    }
+}

+ 57 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/monitor/ScoreMonitorController.java

@@ -0,0 +1,57 @@
+package cn.com.qmth.stmms.monitor;
+
+import cn.com.qmth.stmms.admin.thread.ScoreCalculateThread;
+import cn.com.qmth.stmms.admin.thread.SubjectScoreCalculateThread;
+import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.biz.utils.FormalTaskUtil;
+import cn.com.qmth.stmms.biz.utils.TaskEntry;
+import cn.com.qmth.stmms.common.utils.DateUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.Set;
+
+@Controller("scoreMonitor")
+@RequestMapping("/monitor/score")
+public class ScoreMonitorController {
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private ExamQuestionService questionService;
+
+    @Autowired
+    private MarkService markService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private MarkGroupService groupService;
+
+    @Autowired
+    private AsyncTaskExecutor taskExecutor;
+
+    @RequestMapping("/calculate")
+    @ResponseBody
+    public Object list(HttpServletRequest request, @RequestParam Integer examId, @RequestParam String subjectCode) {
+        SubjectScoreCalculateThread thread = new SubjectScoreCalculateThread(examId, subjectCode, studentService, questionService,
+                markService, examService, subjectService, groupService);
+        taskExecutor.submit(thread);
+        return true;
+    }
+
+}