|
@@ -32,12 +32,28 @@ 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.ExamPackage;
|
|
import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
|
|
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.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.query.ExamStudentSearchQuery;
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamService;
|
|
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.ExamStudentService;
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
|
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
|
|
|
|
+import cn.com.qmth.stmms.biz.utils.OriginTag;
|
|
|
|
+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.ExamSubjectStatus;
|
|
|
|
+import cn.com.qmth.stmms.common.enums.ScorePolicy;
|
|
|
|
+
|
|
|
|
+import com.google.common.collect.Lists;
|
|
|
|
|
|
@Service
|
|
@Service
|
|
public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
|
|
public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
|
|
@@ -56,7 +72,17 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private ExamService examService;
|
|
private ExamService examService;
|
|
-
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private MarkLibraryService libraryService;
|
|
|
|
+ @Autowired
|
|
|
|
+ private MarkGroupService groupService;
|
|
|
|
+ @Autowired
|
|
|
|
+ private
|
|
|
|
+ MarkTrackService trackService;
|
|
|
|
+ @Autowired
|
|
|
|
+ private
|
|
|
|
+ MarkSpecialTagService specialTagService;
|
|
|
|
+
|
|
public static final String LOGINNAME_SPLITE = "-";
|
|
public static final String LOGINNAME_SPLITE = "-";
|
|
|
|
|
|
public static final String USER_PASSWORD = "123456";
|
|
public static final String USER_PASSWORD = "123456";
|
|
@@ -681,4 +707,76 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
|
|
boolean breach) {
|
|
boolean breach) {
|
|
return studentDao.statisticsByAbsentAndBreach(examId, code, upload, absent, 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;
|
|
|
|
+ }
|
|
|
|
+ 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);
|
|
|
|
+ }
|
|
}
|
|
}
|