Sfoglia il codice sorgente

增加exam裁切图配置slice_config;增加还原逻辑

ting.yin 6 anni fa
parent
commit
a70caee883

+ 13 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -57,6 +57,11 @@ public class Exam implements Serializable {
      */
     @Column(name = "force_special_tag",nullable = false)
     private boolean forceSpecialTag;
+    /**
+     * 裁切图配置
+     */
+    @Column(name = "slice_config")
+    private String sliceConfig;
 
     public Integer getId() {
         return id;
@@ -138,4 +143,12 @@ public class Exam implements Serializable {
 		this.forceSpecialTag = forceSpecialTag;
 	}
 
+	public String getSliceConfig() {
+		return sliceConfig;
+	}
+
+	public void setSliceConfig(String sliceConfig) {
+		this.sliceConfig = sliceConfig;
+	}
+
 }

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -2,10 +2,12 @@ package cn.com.qmth.stmms.biz.exam.service;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 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.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.utils.PictureTag;
 
 public interface ExamStudentService {
 
@@ -108,4 +110,6 @@ public interface ExamStudentService {
     List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload, boolean absent,
             boolean breach);
 
+	Map<Integer, List<PictureTag>> buildPictureConfig(ExamStudent student);
+
 }

+ 99 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -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.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.ExamService;
 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.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.ScorePolicy;
+
+import com.google.common.collect.Lists;
 
 @Service
 public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
@@ -56,7 +72,17 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
 
     @Autowired
     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 USER_PASSWORD = "123456";
@@ -681,4 +707,76 @@ 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;
+            }
+    		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);
+    }
 }

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/OriginTag.java

@@ -7,6 +7,16 @@ public class OriginTag {
     private double poxitionX;
 
     private double poxitionY;
+    
+    public OriginTag() {
+
+    }
+    
+    public OriginTag(String content,double poxitionX,double poxitionY) {
+    	this.content = content;
+    	this.poxitionX = poxitionX;
+    	this.poxitionY = poxitionY;
+    }
 
     public String getContent() {
         return content;