|
@@ -14,6 +14,7 @@ import cn.com.qmth.stmms.biz.utils.PictureConfigTransform;
|
|
import cn.com.qmth.stmms.biz.utils.PictureTag;
|
|
import cn.com.qmth.stmms.biz.utils.PictureTag;
|
|
import cn.com.qmth.stmms.biz.utils.ScoreItem;
|
|
import cn.com.qmth.stmms.biz.utils.ScoreItem;
|
|
import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
|
|
import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
|
|
|
|
+
|
|
import org.apache.commons.lang.StringUtils;
|
|
import org.apache.commons.lang.StringUtils;
|
|
import org.apache.commons.lang.math.RandomUtils;
|
|
import org.apache.commons.lang.math.RandomUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -25,9 +26,11 @@ import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import javax.persistence.criteria.*;
|
|
import javax.persistence.criteria.*;
|
|
|
|
+
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.text.DecimalFormat;
|
|
import java.text.DecimalFormat;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
|
+import java.util.Map.Entry;
|
|
|
|
|
|
@Service
|
|
@Service
|
|
public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
|
|
public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
|
|
@@ -995,16 +998,17 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
|
|
List<MarkConfigItem> configList = group.getPictureConfigList();
|
|
List<MarkConfigItem> configList = group.getPictureConfigList();
|
|
if (configList.isEmpty()) {
|
|
if (configList.isEmpty()) {
|
|
// 未设置评卷区域,则自动取第一张裁切图的固定位置
|
|
// 未设置评卷区域,则自动取第一张裁切图的固定位置
|
|
- originTags.add(new OriginTag(format.format(score), 1, 10, 10));
|
|
|
|
|
|
+ originTags.add(new OriginTag(0, group.getNumber(), format.format(score), 1, 10, 10));
|
|
} else {
|
|
} else {
|
|
// 取第一个显示区域相对裁切图的位置
|
|
// 取第一个显示区域相对裁切图的位置
|
|
MarkConfigItem config = configList.get(0);
|
|
MarkConfigItem config = configList.get(0);
|
|
- OriginTag tag = new OriginTag(format.format(score), config.getI(), config.getX(), config.getY());
|
|
|
|
|
|
+ OriginTag tag = new OriginTag(0, group.getNumber(), format.format(score), config.getI(), config.getX(),
|
|
|
|
+ config.getY());
|
|
// 兼容比例模式,且元素在裁切坐标内
|
|
// 兼容比例模式,且元素在裁切坐标内
|
|
if (config.getX() <= 1 && config.getY() <= 1 && config.getI() <= sliceConfig.size()
|
|
if (config.getX() <= 1 && config.getY() <= 1 && config.getI() <= sliceConfig.size()
|
|
&& sliceConfig.get(config.getI() - 1).getW() > 0
|
|
&& sliceConfig.get(config.getI() - 1).getW() > 0
|
|
&& sliceConfig.get(config.getI() - 1).getH() > 0) {
|
|
&& sliceConfig.get(config.getI() - 1).getH() > 0) {
|
|
- tag = new OriginTag(format.format(score), config.getI(), config.getX()
|
|
|
|
|
|
+ tag = new OriginTag(0, group.getNumber(), format.format(score), config.getI(), config.getX()
|
|
* sliceConfig.get(config.getI() - 1).getW(), config.getY()
|
|
* sliceConfig.get(config.getI() - 1).getW(), config.getY()
|
|
* sliceConfig.get(config.getI() - 1).getH());
|
|
* sliceConfig.get(config.getI() - 1).getH());
|
|
}
|
|
}
|
|
@@ -1012,28 +1016,55 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// 检测应该使用哪个评卷任务的轨迹记录
|
|
// 检测应该使用哪个评卷任务的轨迹记录
|
|
- MarkLibrary selected = null;
|
|
|
|
|
|
+ // MarkLibrary selected = null;
|
|
|
|
+ // List<MarkLibrary> libraries =
|
|
|
|
+ // libraryService.findByStudentAndGroup(student.getId(),
|
|
|
|
+ // group.getNumber());
|
|
|
|
+ // for (MarkLibrary library : libraries) {
|
|
|
|
+ // if (checkScore(library, score.doubleValue(), details)) {
|
|
|
|
+ // selected = library;
|
|
|
|
+ // break;
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
|
|
+ // if (selected != null) {
|
|
|
|
+ // // 添加轨迹分
|
|
|
|
+ // List<MarkTrack> tracks =
|
|
|
|
+ // trackService.findByLibraryId(selected.getId());
|
|
|
|
+ // for (MarkTrack markTrack : tracks) {
|
|
|
|
+ // // 轨迹分为未作答时,只显示一个汉字"空"
|
|
|
|
+ // originTags.add(new OriginTag(markTrack.isUnanswered() ? "空" :
|
|
|
|
+ // format.format(markTrack.getScore()),
|
|
|
|
+ // markTrack.getOffsetIndex(), markTrack.getOffsetX(),
|
|
|
|
+ // markTrack.getOffsetY()));
|
|
|
|
+ // }
|
|
|
|
+ // // 添加特殊标记
|
|
|
|
+ // List<MarkSpecialTag> specialTags =
|
|
|
|
+ // specialTagService.findByLibraryId(selected.getId());
|
|
|
|
+ // for (MarkSpecialTag markSpecialTag : specialTags) {
|
|
|
|
+ // originTags.add(new OriginTag(markSpecialTag.getTagName(),
|
|
|
|
+ // markSpecialTag.getOffsetIndex(),
|
|
|
|
+ // markSpecialTag.getOffsetX(), markSpecialTag.getOffsetY()));
|
|
|
|
+ // }
|
|
List<MarkLibrary> libraries = libraryService.findByStudentAndGroup(student.getId(), group.getNumber());
|
|
List<MarkLibrary> libraries = libraryService.findByStudentAndGroup(student.getId(), group.getNumber());
|
|
for (MarkLibrary library : libraries) {
|
|
for (MarkLibrary library : libraries) {
|
|
if (checkScore(library, score.doubleValue(), details)) {
|
|
if (checkScore(library, score.doubleValue(), details)) {
|
|
- selected = library;
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if (selected != null) {
|
|
|
|
- // 添加轨迹分
|
|
|
|
- List<MarkTrack> tracks = trackService.findByLibraryId(selected.getId());
|
|
|
|
- for (MarkTrack markTrack : tracks) {
|
|
|
|
- // 轨迹分为未作答时,只显示一个汉字"空"
|
|
|
|
- originTags.add(new OriginTag(markTrack.isUnanswered() ? "空" : format.format(markTrack.getScore()),
|
|
|
|
- markTrack.getOffsetIndex(), markTrack.getOffsetX(), markTrack.getOffsetY()));
|
|
|
|
- }
|
|
|
|
- // 添加特殊标记
|
|
|
|
- List<MarkSpecialTag> specialTags = specialTagService.findByLibraryId(selected.getId());
|
|
|
|
- for (MarkSpecialTag markSpecialTag : specialTags) {
|
|
|
|
- originTags.add(new OriginTag(markSpecialTag.getTagName(), markSpecialTag.getOffsetIndex(),
|
|
|
|
- markSpecialTag.getOffsetX(), markSpecialTag.getOffsetY()));
|
|
|
|
|
|
+ // 添加轨迹分
|
|
|
|
+ List<MarkTrack> tracks = trackService.findByLibraryId(library.getId());
|
|
|
|
+ for (MarkTrack markTrack : tracks) {
|
|
|
|
+ // 未作答时只显示汉字"空"
|
|
|
|
+ originTags.add(new OriginTag(library.getMarkerId(), library.getGroupNumber(), markTrack
|
|
|
|
+ .isUnanswered() ? "空" : format.format(markTrack.getScore()), markTrack.getOffsetIndex(),
|
|
|
|
+ markTrack.getOffsetX(), markTrack.getOffsetY()));
|
|
|
|
+ }
|
|
|
|
+ // 添加特殊标记
|
|
|
|
+ List<MarkSpecialTag> specialTags = specialTagService.findByLibraryId(library.getId());
|
|
|
|
+ for (MarkSpecialTag markSpecialTag : specialTags) {
|
|
|
|
+ originTags.add(new OriginTag(library.getMarkerId(), library.getGroupNumber(), markSpecialTag
|
|
|
|
+ .getTagName(), markSpecialTag.getOffsetIndex(), markSpecialTag.getOffsetX(), markSpecialTag
|
|
|
|
+ .getOffsetY()));
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
return originTags;
|
|
return originTags;
|
|
}
|
|
}
|
|
@@ -1152,4 +1183,51 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
|
|
public void updateInspectCount(Integer studentId, Integer inspectCount) {
|
|
public void updateInspectCount(Integer studentId, Integer inspectCount) {
|
|
studentDao.updateInspectCount(studentId, inspectCount);
|
|
studentDao.updateInspectCount(studentId, inspectCount);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据考生获得所有原图上的评卷标记和分数明细
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public Map<Integer, List<PictureTag>> buildSliceTags(ExamStudent student, boolean withGroupScore) {
|
|
|
|
+ Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
|
|
|
|
+ Exam exam = examService.findById(student.getExamId());
|
|
|
|
+ ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
|
|
|
|
+ List<PictureConfigItem> sliceConfig = new ArrayList<PictureConfigItem>();
|
|
|
|
+ if (student.getCardNumber() != null) {
|
|
|
|
+ AnswerCard card = cardService.findByExamIdAndNumber(student.getExamId(), student.getCardNumber());
|
|
|
|
+ if (card != null) {
|
|
|
|
+ sliceConfig = card.getSliceConfigList();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (sliceConfig.isEmpty()) {
|
|
|
|
+ sliceConfig = subject.getSliceConfigList();
|
|
|
|
+ }
|
|
|
|
+ if (sliceConfig.isEmpty()) {
|
|
|
|
+ sliceConfig = exam.getSliceConfigList();
|
|
|
|
+ }
|
|
|
|
+ if (!sliceConfig.isEmpty()) {
|
|
|
|
+ // 有裁切图配置时才需要获取原始评卷标记信息
|
|
|
|
+ tagMap = getSliceTags(student, withGroupScore, sliceConfig);
|
|
|
|
+ }
|
|
|
|
+ Map<Integer, List<PictureTag>> map = new HashMap<Integer, List<PictureTag>>();
|
|
|
|
+ for (Entry<MarkGroup, List<OriginTag>> entry : tagMap.entrySet()) {
|
|
|
|
+ // 遍历所有显示元素
|
|
|
|
+ for (OriginTag tag : entry.getValue()) {
|
|
|
|
+ PictureTag pt = new PictureTag();
|
|
|
|
+ pt.setContent(tag.getContent());
|
|
|
|
+ pt.setLeft(tag.getOffsetX());
|
|
|
|
+ pt.setTop(tag.getOffsetY());
|
|
|
|
+ pt.setUserId(tag.getUserId());
|
|
|
|
+ pt.setGroupNumber(tag.getGroupNumber());
|
|
|
|
+ List<PictureTag> list = map.get(tag.getOffsetIndex());
|
|
|
|
+ if (list == null) {
|
|
|
|
+ list = new LinkedList<>();
|
|
|
|
+ map.put(tag.getOffsetIndex(), list);
|
|
|
|
+ }
|
|
|
|
+ list.add(pt);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return map;
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|