|
@@ -1,5 +1,6 @@
|
|
|
package cn.com.qmth.stmms.biz.exam.service.impl;
|
|
|
|
|
|
+import java.text.DecimalFormat;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
@@ -30,11 +31,13 @@ import cn.com.qmth.stmms.biz.common.BaseQueryService;
|
|
|
import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
|
|
|
import cn.com.qmth.stmms.biz.exam.model.Exam;
|
|
|
import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
|
|
|
import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
|
|
|
import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
|
|
|
import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
|
|
|
import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamService;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
|
|
@@ -51,9 +54,6 @@ import cn.com.qmth.stmms.biz.utils.PictureConfigTransform;
|
|
|
import cn.com.qmth.stmms.biz.utils.PictureTag;
|
|
|
import cn.com.qmth.stmms.biz.utils.ScoreItem;
|
|
|
import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
|
|
|
-import cn.com.qmth.stmms.common.enums.ScorePolicy;
|
|
|
-
|
|
|
-import com.google.common.collect.Lists;
|
|
|
|
|
|
@Service
|
|
|
public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
|
|
@@ -70,19 +70,24 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
|
|
|
@Autowired
|
|
|
private ExamSubjectService subjectService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private ExamQuestionService questionService;
|
|
|
+
|
|
|
@Autowired
|
|
|
private ExamService examService;
|
|
|
+
|
|
|
@Autowired
|
|
|
private MarkLibraryService libraryService;
|
|
|
+
|
|
|
@Autowired
|
|
|
private MarkGroupService groupService;
|
|
|
+
|
|
|
@Autowired
|
|
|
- private
|
|
|
- MarkTrackService trackService;
|
|
|
+ private MarkTrackService trackService;
|
|
|
+
|
|
|
@Autowired
|
|
|
- private
|
|
|
- MarkSpecialTagService specialTagService;
|
|
|
-
|
|
|
+ private MarkSpecialTagService specialTagService;
|
|
|
+
|
|
|
public static final String LOGINNAME_SPLITE = "-";
|
|
|
|
|
|
public static final String USER_PASSWORD = "123456";
|
|
@@ -707,76 +712,77 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
|
|
|
boolean breach) {
|
|
|
return studentDao.statisticsByAbsentAndBreach(examId, code, upload, absent, breach);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 根据考生还原图片上轨迹和特殊标记并拼接
|
|
|
*/
|
|
|
@Override
|
|
|
- public Map<Integer, List<PictureTag>> buildPictureConfig(ExamStudent student) {
|
|
|
- Exam exam = examService.findById(student.getExamId());
|
|
|
- List<PictureConfigItem> sliceConfigs = PictureConfigItem.parse(exam.getSliceConfig());
|
|
|
- Map<MarkGroup, List<OriginTag>> groups = new HashMap<MarkGroup, List<OriginTag>>();
|
|
|
- List<MarkGroup> markGroups = groupService.findByExamAndSubject(student.getExamId(), student.getSubjectCode());
|
|
|
- for (MarkGroup markGroup : markGroups) {
|
|
|
- double score = 0;
|
|
|
- int count = 0;
|
|
|
- double scoreCount = 0;
|
|
|
- List<OriginTag> originTags = Lists.newArrayList();
|
|
|
- List<MarkLibrary> libraries = libraryService.findByStudentAndGroup(student.getId(), markGroup.getNumber());
|
|
|
- MarkLibrary library = null;
|
|
|
- ScorePolicy policy = markGroup.getScorePolicy() != null ? markGroup.getScorePolicy() : ScorePolicy.AVG;
|
|
|
- for (MarkLibrary markLibrary : libraries) {
|
|
|
- count++;
|
|
|
- Double current = (markLibrary.getHeaderScore() != null ? markLibrary.getHeaderScore() : markLibrary.getMarkerScore());
|
|
|
- List<ScoreItem> scores = library.getScoreList();
|
|
|
- if(count == 1){
|
|
|
- // 首份评卷任务,直接取总分与明细
|
|
|
- score = current;
|
|
|
- library = markLibrary;
|
|
|
- }else{
|
|
|
- switch (policy) {
|
|
|
- case AVG:
|
|
|
- // 平均分 累加
|
|
|
- scoreCount+=current;
|
|
|
- break;
|
|
|
- case MAX:
|
|
|
- // 高分优先
|
|
|
- if(current > score){
|
|
|
- library = markLibrary;
|
|
|
- }
|
|
|
- break;
|
|
|
- case MIN:
|
|
|
- // 低分优先
|
|
|
- if(current < score){
|
|
|
- library = markLibrary;
|
|
|
- }
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // 取平均分策略下,累计分数需要重新计算一次
|
|
|
- if (policy == ScorePolicy.AVG && count > 1) {
|
|
|
- score = scoreCount / count;
|
|
|
+ public Map<Integer, List<PictureTag>> buildSheetTags(ExamStudent student) {
|
|
|
+ Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
|
|
|
+ Exam exam = examService.findById(student.getExamId());
|
|
|
+ List<PictureConfigItem> sliceConfig = PictureConfigItem.parse(exam.getSliceConfig());
|
|
|
+ if (!sliceConfig.isEmpty()) {
|
|
|
+ // 裁切图配置存在时才继续下面内容
|
|
|
+ DecimalFormat format = new DecimalFormat("###.#");
|
|
|
+ List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
|
|
|
+ student.getSubjectCode(), false);
|
|
|
+ List<ScoreItem> scoreList = student.getScoreList(false);
|
|
|
+ List<MarkGroup> markGroups = groupService.findByExamAndSubject(student.getExamId(),
|
|
|
+ student.getSubjectCode());
|
|
|
+ for (MarkGroup group : markGroups) {
|
|
|
+ // 从考生主观题得分中拆解出本大题得分
|
|
|
+ double score = 0;
|
|
|
+ List<Double> details = new ArrayList<>();
|
|
|
+ int i = -1;
|
|
|
+ for (ExamQuestion question : questions) {
|
|
|
+ i++;
|
|
|
+ if (question.getMainNumber().equals(group.getNumber())) {
|
|
|
+ double value = scoreList.size() > i ? scoreList.get(i).getScore() : 0;
|
|
|
+ score += value;
|
|
|
+ details.add(value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 原图中需要显示的内容列表
|
|
|
+ List<OriginTag> originTags = new LinkedList<>();
|
|
|
+ // 首先添加本大题总得分
|
|
|
+ originTags.add(new OriginTag(format.format(score), 0, 0));
|
|
|
+ // 检测应该使用哪个评卷任务的轨迹记录
|
|
|
+ MarkLibrary selected = null;
|
|
|
+ List<MarkLibrary> libraries = libraryService.findByStudentAndGroup(student.getId(), group.getNumber());
|
|
|
+ for (MarkLibrary library : libraries) {
|
|
|
+ if (checkScore(library, score, details)) {
|
|
|
+ selected = library;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (selected != null) {
|
|
|
+ // 添加轨迹分
|
|
|
+ List<MarkTrack> tracks = trackService.findByLibraryId(selected.getId());
|
|
|
+ for (MarkTrack markTrack : tracks) {
|
|
|
+ originTags.add(new OriginTag(format.format(markTrack.getScore()), markTrack.getPositionX(),
|
|
|
+ markTrack.getPositionY()));
|
|
|
+ }
|
|
|
+ // 添加特殊标记
|
|
|
+ List<MarkSpecialTag> specialTags = specialTagService.findByLibraryId(selected.getId());
|
|
|
+ for (MarkSpecialTag markSpecialTag : specialTags) {
|
|
|
+ originTags.add(new OriginTag(markSpecialTag.getTagName(), markSpecialTag.getPositionX(),
|
|
|
+ markSpecialTag.getPositionY()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ tagMap.put(group, originTags);
|
|
|
}
|
|
|
- if(library!=null){
|
|
|
- List<MarkTrack> tracks = trackService.findByLibraryId(library.getId());
|
|
|
- for (MarkTrack markTrack : tracks) {
|
|
|
- OriginTag originTag = new OriginTag(markTrack.getScore().toString(),markTrack.getPositionX(),markTrack.getPositionY());
|
|
|
- originTags.add(originTag);
|
|
|
- }
|
|
|
- List<MarkSpecialTag> specialTags = specialTagService.findByLibraryId(library.getId());
|
|
|
- for (MarkSpecialTag markSpecialTag : specialTags) {
|
|
|
- OriginTag originTag = new OriginTag(markSpecialTag.getTagName().toString(),markSpecialTag.getPositionX(),markSpecialTag.getPositionY());
|
|
|
- originTags.add(originTag);
|
|
|
- }
|
|
|
- }else{
|
|
|
- OriginTag originTag = new OriginTag(String.valueOf(score),0,0);
|
|
|
- originTags.add(originTag);
|
|
|
- }
|
|
|
- groups.put(markGroup, originTags);
|
|
|
- }
|
|
|
- return PictureConfigTransform.process(sliceConfigs, groups);
|
|
|
+ }
|
|
|
+ return PictureConfigTransform.process(sliceConfig, tagMap);
|
|
|
}
|
|
|
+
|
|
|
+ private boolean checkScore(MarkLibrary library, double score, List<Double> details) {
|
|
|
+ if (library.getMarkerScore() == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (library.getMarkerScore().doubleValue() != score) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
}
|