|
@@ -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;
|
|
|
+ }
|
|
|
+}
|