Procházet zdrojové kódy

修复图片导出接口中,轨迹没有按小题区分仲裁与角色的显示问题。在导出tag数据结构中增加questionNumber字段,与track结构中的questionNumber保持一致,用来区分哪些小题有仲裁;特殊标记该字段为空,始终显示

luoshi před 9 měsíci
rodič
revize
efb0193cc8

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

@@ -1,67 +1,13 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.math.BigDecimal;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Expression;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.math.RandomUtils;
-import org.hibernate.SQLQuery;
-import org.hibernate.transform.Transformers;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 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.AnswerCard;
-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.model.*;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.AnswerCardService;
-import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
-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;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.mark.dao.HeaderTagDao;
 import cn.com.qmth.stmms.biz.mark.dao.HeaderTrackDao;
-import cn.com.qmth.stmms.biz.mark.model.HeaderTag;
-import cn.com.qmth.stmms.biz.mark.model.HeaderTrack;
-import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
-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.model.*;
 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;
@@ -71,6 +17,27 @@ import cn.com.qmth.stmms.biz.utils.PictureTag;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.RandomUtils;
+import org.hibernate.SQLQuery;
+import org.hibernate.transform.Transformers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.criteria.*;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
 
 @Service
 public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
@@ -216,8 +183,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             student.setSubjectCategory(subject.getCategory());
             if (student.getSecretNumber() == null) {
                 student.randomSecretNumber();
-                while (secretNumberSet.contains(student.getSecretNumber()) || studentDao
-                        .countByExamIdAndSecretNumber(student.getExamId(), student.getSecretNumber()) > 0) {
+                while (secretNumberSet.contains(student.getSecretNumber())
+                        || studentDao.countByExamIdAndSecretNumber(student.getExamId(), student.getSecretNumber())
+                        > 0) {
                     student.randomSecretNumber();
                 }
             }
@@ -461,10 +429,10 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Transactional
     public boolean updateScanInfo(ExamStudent student) {
         student.setUploadTime(new Date());
-        return studentDao.updateScanInfo(student.getId(), student.getSheetCount(), student.getSliceCount(),
-                student.getAnswers(), student.getBatchCode(), student.getPaperType(), student.isAbsent(),
-                student.getUploadTime(), student.getObjectiveScore(), student.getObjectiveScoreList(),
-                student.getCardNumber()) > 0;
+        return studentDao
+                .updateScanInfo(student.getId(), student.getSheetCount(), student.getSliceCount(), student.getAnswers(),
+                        student.getBatchCode(), student.getPaperType(), student.isAbsent(), student.getUploadTime(),
+                        student.getObjectiveScore(), student.getObjectiveScoreList(), student.getCardNumber()) > 0;
     }
 
     @Override
@@ -566,14 +534,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             @Override
             public Predicate toPredicate(Root<ExamStudent> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
                 List<Predicate> predicates = new LinkedList<Predicate>();
-                Expression<Double> evaluationItemSum = cb.sum(root.get("objectiveScore").as(Double.class),
-                        root.get("subjectiveScore").as(Double.class));
+                Expression<Double> evaluationItemSum = cb
+                        .sum(root.get("objectiveScore").as(Double.class), root.get("subjectiveScore").as(Double.class));
                 if (query.getStartScore() != null) {
                     Predicate predicate1 = cb.ge(evaluationItemSum, query.getStartScore());
                     Predicate predicate2 = cb.le(evaluationItemSum, query.getEndScore());
                     if (query.getStartScore() == 0) {
-                        Predicate predicate = cb.or(cb.equal(root.get("absent"), true),
-                                cb.equal(root.get("breach"), true));
+                        Predicate predicate = cb
+                                .or(cb.equal(root.get("absent"), true), cb.equal(root.get("breach"), true));
                         Predicate predicate3 = cb.and(predicate1, predicate2);
                         predicates.add(cb.or(predicate, predicate3));
                     } else {
@@ -646,8 +614,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 if (query.getObjectiveScore() != null) {
                     predicates.add(cb.equal(root.get("objectiveScore"), query.getObjectiveScore()));
                 } else if (query.getObjectiveScoreGt() != null) {
-                    predicates.add(
-                            cb.greaterThan(root.get("objectiveScore").as(Double.class), query.getObjectiveScoreGt()));
+                    predicates.add(cb.greaterThan(root.get("objectiveScore").as(Double.class),
+                            query.getObjectiveScoreGt()));
                 } else if (query.getObjectiveScoreLt() != null) {
                     predicates
                             .add(cb.lessThan(root.get("objectiveScore").as(Double.class), query.getObjectiveScoreLt()));
@@ -662,11 +630,11 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 if (query.getSubjectiveScore() != null) {
                     predicates.add(cb.equal(root.get("subjectiveScore"), query.getSubjectiveScore()));
                 } else if (query.getSubjectiveScoreGt() != null) {
-                    predicates.add(
-                            cb.greaterThan(root.get("subjectiveScore").as(Double.class), query.getSubjectiveScoreGt()));
+                    predicates.add(cb.greaterThan(root.get("subjectiveScore").as(Double.class),
+                            query.getSubjectiveScoreGt()));
                 } else if (query.getSubjectiveScoreLt() != null) {
-                    predicates.add(
-                            cb.lessThan(root.get("subjectiveScore").as(Double.class), query.getSubjectiveScoreLt()));
+                    predicates.add(cb.lessThan(root.get("subjectiveScore").as(Double.class),
+                            query.getSubjectiveScoreLt()));
                 }
                 if (query.getUpload() != null) {
                     predicates.add(cb.equal(root.get("upload"), query.getUpload()));
@@ -811,8 +779,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 if (query.getSheetCount() != null) {
                     predicates.add(cb.equal(root.get("sheetCount"), query.getSheetCount()));
                 }
-                return predicates.isEmpty() ? cb.conjunction()
-                        : cb.and(predicates.toArray(new Predicate[predicates.size()]));
+                return predicates.isEmpty() ?
+                        cb.conjunction() :
+                        cb.and(predicates.toArray(new Predicate[predicates.size()]));
             }
         };
     }
@@ -831,8 +800,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Override
     public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
             String studentCode, String examSeqCode) {
-        return studentDao.findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode, studentCode,
-                examSeqCode);
+        return studentDao
+                .findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode, studentCode, examSeqCode);
     }
 
     @Override
@@ -1021,8 +990,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     public Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student, boolean withGroupScore,
             List<PictureConfigItem> sliceConfig) {
         Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
-                student.getSubjectCode(), false);
+        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) {
@@ -1044,13 +1013,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         List<String> lines = new LinkedList<>();
         lines.add("成绩明细");
         // 总分得分明细
-        lines.add("总分 (客观+主观) | " + format.format(student.getTotalScore()) + "="
-                + format.format(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0) + "+"
-                + format.format(student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0));
+        lines.add("总分 (客观+主观) | " + format.format(student.getTotalScore()) + "=" + format
+                .format(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0) + "+" + format
+                .format(student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0));
         // 客观题得分明细
         List<String> objectives = new LinkedList<>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(),
-                student.getSubjectCode(), true, student.getPaperType());
+        List<ExamQuestion> questions = questionService
+                .findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(), student.getSubjectCode(), true,
+                        student.getPaperType());
         List<ScoreItem> scoreList = student.getScoreList(true);
         List<String> details = new ArrayList<>();
         int i = 0;
@@ -1124,17 +1094,17 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             List<MarkConfigItem> configList = group.getPictureConfigList();
             if (configList.isEmpty()) {
                 // 未设置评卷区域,则自动取第一张裁切图的固定位置
-                originTags.add(new OriginTag(0, "", group.getNumber(), format.format(score), 1, 10, 10));
+                originTags.add(new OriginTag(0, "", group.getNumber(), "", format.format(score), 1, 10, 10));
             } else {
                 // 取第一个显示区域相对裁切图的位置
                 MarkConfigItem config = configList.get(0);
-                OriginTag tag = new OriginTag(0, "", group.getNumber(), format.format(score), config.getI(),
+                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()
                         && sliceConfig.get(config.getI() - 1).getW() > 0
                         && sliceConfig.get(config.getI() - 1).getH() > 0) {
-                    tag = new OriginTag(0, "", group.getNumber(), format.format(score), config.getI(),
+                    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).getH());
                 }
@@ -1178,33 +1148,36 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             List<MarkTrack> tracks = trackService.findByLibraryId(library.getId());
             for (MarkTrack markTrack : tracks) {
                 // 未作答时只显示汉字"空"
-                originTags.add(new OriginTag(library.getMarkerId(), Role.MARKER.toString(), library.getGroupNumber(),
-                        markTrack.isUnanswered() ? "空" : format.format(markTrack.getScore()),
-                        markTrack.getOffsetIndex(), markTrack.getOffsetX(), markTrack.getOffsetY()));
+                originTags
+                        .add(new OriginTag(markTrack.getMarkerId(), Role.MARKER.toString(), markTrack.getGroupNumber(),
+                                markTrack.getQuestionNumber(),
+                                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(), Role.MARKER.toString(), library.getGroupNumber(),
-                        markSpecialTag.getTagName(), markSpecialTag.getOffsetIndex(), markSpecialTag.getOffsetX(),
-                        markSpecialTag.getOffsetY()));
+                originTags
+                        .add(new OriginTag(library.getMarkerId(), Role.MARKER.toString(), library.getGroupNumber(), "",
+                                markSpecialTag.getTagName(), markSpecialTag.getOffsetIndex(),
+                                markSpecialTag.getOffsetX(), markSpecialTag.getOffsetY()));
             }
             // }
         }
-        List<HeaderTag> headerTags = headerTagDao.findByStudentIdAndGroupNumberOrderByIdAsc(student.getId(),
-                group.getNumber());
+        List<HeaderTag> headerTags = headerTagDao
+                .findByStudentIdAndGroupNumberOrderByIdAsc(student.getId(), group.getNumber());
         for (HeaderTag headerTag : headerTags) {
             originTags.add(new OriginTag(headerTag.getUserId(), Role.SUBJECT_HEADER.toString(),
-                    headerTag.getGroupNumber(), headerTag.getTagName(), headerTag.getOffsetIndex(),
+                    headerTag.getGroupNumber(), "", headerTag.getTagName(), headerTag.getOffsetIndex(),
                     headerTag.getOffsetX(), headerTag.getOffsetY()));
         }
-        List<HeaderTrack> headerTracks = headerTrackDao.findByPkStudentIdAndGroupNumber(student.getId(),
-                group.getNumber());
+        List<HeaderTrack> headerTracks = headerTrackDao
+                .findByPkStudentIdAndGroupNumber(student.getId(), group.getNumber());
         for (HeaderTrack headerTrack : headerTracks) {
-            originTags.add(
-                    new OriginTag(headerTrack.getUserId(), Role.SUBJECT_HEADER.toString(), headerTrack.getGroupNumber(),
-                            headerTrack.isUnanswered() ? "空" : format.format(headerTrack.getScore()),
-                            headerTrack.getOffsetIndex(), headerTrack.getOffsetX(), headerTrack.getOffsetY()));
+            originTags.add(new OriginTag(headerTrack.getUserId(), Role.SUBJECT_HEADER.toString(),
+                    headerTrack.getGroupNumber(), headerTrack.getQuestionNumber(),
+                    headerTrack.isUnanswered() ? "空" : format.format(headerTrack.getScore()),
+                    headerTrack.getOffsetIndex(), headerTrack.getOffsetX(), headerTrack.getOffsetY()));
         }
         return originTags;
     }
@@ -1293,13 +1266,16 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     }
 
     @Override
-    public List<Integer> findIdByExamIdAndSubjectCodeAndSubjectiveStatusAndUploadAndAbsentAndBreach(Integer examId, String subjectCode, SubjectiveStatus status, boolean uplaod, boolean absent, boolean breach) {
-        return studentDao.findIdByExamIdAndSubjectCodeAndSubjectiveStatusAndUploadAndAbsentAndBreach(examId, subjectCode, status,uplaod,absent,breach);
+    public List<Integer> findIdByExamIdAndSubjectCodeAndSubjectiveStatusAndUploadAndAbsentAndBreach(Integer examId,
+            String subjectCode, SubjectiveStatus status, boolean uplaod, boolean absent, boolean breach) {
+        return studentDao
+                .findIdByExamIdAndSubjectCodeAndSubjectiveStatusAndUploadAndAbsentAndBreach(examId, subjectCode, status,
+                        uplaod, absent, breach);
     }
 
     @Override
     public List<ExamStudent> findByExamIdAndExamNumberIn(Integer examId, List<String> examNumberIn) {
-        return studentDao.findByExamIdAndExamNumberIn(examId,examNumberIn);
+        return studentDao.findByExamIdAndExamNumberIn(examId, examNumberIn);
     }
 
     @Override
@@ -1400,6 +1376,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 pt.setUserId(tag.getUserId());
                 pt.setUserRole(tag.getUserRole());
                 pt.setGroupNumber(tag.getGroupNumber());
+                pt.setQuestionNumber(tag.getQuestionNumber());
                 List<PictureTag> list = map.get(tag.getOffsetIndex());
                 if (list == null) {
                     list = new LinkedList<>();
@@ -1443,8 +1420,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     public int batchUpdate(List<ExamStudent> updateList) {
         int i = 0;
         for (ExamStudent student : updateList) {
-            i = i + this.studentDao.updateInfo(student.getId(), student.getCollege(), student.getClassName(),
-                    student.getTeacher(), student.getExamRoom(), student.getExamSite(), student.getRemark());
+            i = i + this.studentDao
+                    .updateInfo(student.getId(), student.getCollege(), student.getClassName(), student.getTeacher(),
+                            student.getExamRoom(), student.getExamSite(), student.getRemark());
         }
         return i;
     }
@@ -1536,12 +1514,11 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         StringBuilder sql = new StringBuilder(" WHERE 1=1 ");
         if (query.getStartScore() != null) {
             if (query.getStartScore() == 0) {
-                sql.append(" and (s.is_absent=1 or s.is_breach=1 or (s.subjective_score+s.objective_score>="
-                        + query.getStartScore() + " and s.subjective_score+s.objective_score<=" + query.getEndScore()
-                        + ") )");
+                sql.append(" and (s.is_absent=1 or s.is_breach=1 or (s.subjective_score+s.objective_score>=" + query
+                        .getStartScore() + " and s.subjective_score+s.objective_score<=" + query.getEndScore() + ") )");
             } else {
-                sql.append(" and s.is_absent=0 and s.is_breach=0 and s.subjective_score+s.objective_score>="
-                        + query.getStartScore() + " and s.subjective_score+s.objective_score<=" + query.getEndScore());
+                sql.append(" and s.is_absent=0 and s.is_breach=0 and s.subjective_score+s.objective_score>=" + query
+                        .getStartScore() + " and s.subjective_score+s.objective_score<=" + query.getEndScore());
             }
         }
         if (query.getExamId() != null && query.getExamId() > 0) {
@@ -1764,8 +1741,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Override
     public ExamStudent findBySchoolIdAndExamIdAndSubjectCodeAndStudentCode(Integer schoolId, Integer examId,
             String subjectCode, String studentCode) {
-        return studentDao.findBySchoolIdAndExamIdAndSubjectCodeAndStudentCode(schoolId, examId, subjectCode,
-                studentCode);
+        return studentDao
+                .findBySchoolIdAndExamIdAndSubjectCodeAndStudentCode(schoolId, examId, subjectCode, studentCode);
     }
 
     @Override

+ 12 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/OriginTag.java

@@ -6,6 +6,8 @@ public class OriginTag {
 
     private Integer groupNumber;
 
+    private String questionNumber;
+
     private String userRole;
 
     private String content;
@@ -20,11 +22,12 @@ public class OriginTag {
 
     }
 
-    public OriginTag(Integer userId, String userRole, Integer groupNumber, String content, int offsetIndex,
-            double offsetX, double offsetY) {
+    public OriginTag(Integer userId, String userRole, Integer groupNumber, String questionNumber, String content,
+            int offsetIndex, double offsetX, double offsetY) {
         this.userId = userId;
         this.userRole = userRole == null ? "" : userRole;
         this.groupNumber = groupNumber;
+        this.questionNumber = questionNumber;
         this.content = content;
         this.offsetIndex = offsetIndex;
         this.offsetX = offsetX;
@@ -87,4 +90,11 @@ public class OriginTag {
         this.userRole = userRole;
     }
 
+    public String getQuestionNumber() {
+        return questionNumber;
+    }
+
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
+    }
 }

+ 16 - 24
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/PictureConfigTransform.java

@@ -19,10 +19,8 @@ public class PictureConfigTransform {
     /**
      * 转换方法
      *
-     * @param sliceConfigs
-     *            - 裁切图配置
-     * @param groups
-     *            - 评卷分组与原始元素列表
+     * @param sliceConfigs - 裁切图配置
+     * @param groups       - 评卷分组与原始元素列表
      * @return 原图序号与新的显示元素列表,序号从1开始
      */
     public static Map<Integer, List<PictureTag>> process(List<PictureConfigItem> sliceConfigs,
@@ -36,12 +34,13 @@ public class PictureConfigTransform {
                 if (tag.getOffsetIndex() > sliceCount) {
                     // 元素所属裁切图不在裁切坐标范围内,表示裁切图直接使用的原图
                     buildTag(map, tag.getContent(), tag.getOffsetIndex(), tag.getOffsetX(), tag.getOffsetY(),
-                            tag.getUserId(), tag.getUserRole(), tag.getGroupNumber());
+                            tag.getUserId(), tag.getUserRole(), tag.getGroupNumber(), tag.getQuestionNumber());
                 } else {
                     // 有裁切坐标时,原图坐标=元素相对坐标+裁切坐标
                     PictureConfigItem config = sliceConfigs.get(tag.getOffsetIndex() - 1);
-                    buildTag(map, tag.getContent(), config.getI(), config.getX() + tag.getOffsetX(), config.getY()
-                            + tag.getOffsetY(), tag.getUserId(), tag.getUserRole(), tag.getGroupNumber());
+                    buildTag(map, tag.getContent(), config.getI(), config.getX() + tag.getOffsetX(),
+                            config.getY() + tag.getOffsetY(), tag.getUserId(), tag.getUserRole(), tag.getGroupNumber(),
+                            tag.getQuestionNumber());
                 }
             }
         }
@@ -51,19 +50,16 @@ public class PictureConfigTransform {
     /**
      * 根据计算出的拼接块,构造新的原图显示元素
      *
-     * @param tags
-     *            - 原图显示元素集合
-     * @param content
-     *            - 显示元素内容
-     * @param index
-     *            - 所属原图序号
-     * @param left
-     *            - 在原图内的左偏移
-     * @param top
-     *            - 在原图内的上偏移
+     * @param tags           - 原图显示元素集合
+     * @param content        - 显示元素内容
+     * @param index          - 所属原图序号
+     * @param left           - 在原图内的左偏移
+     * @param top            - 在原图内的上偏移
+     * @param groupNumber    - 分组编号
+     * @param questionNumber - 所属题号
      */
     private static void buildTag(Map<Integer, List<PictureTag>> tags, String content, int index, double left,
-            double top, int userId, String userRole, int groupNumber) {
+            double top, int userId, String userRole, int groupNumber, String questionNumber) {
         PictureTag tag = new PictureTag();
         tag.setContent(content);
         tag.setLeft(left);
@@ -71,12 +67,8 @@ public class PictureConfigTransform {
         tag.setUserId(userId);
         tag.setUserRole(userRole);
         tag.setGroupNumber(groupNumber);
-        List<PictureTag> list = tags.get(index);
-        if (list == null) {
-            list = new LinkedList<>();
-            tags.put(index, list);
-        }
-        list.add(tag);
+        tag.setQuestionNumber(questionNumber);
+        tags.computeIfAbsent(index, k -> new LinkedList<>()).add(tag);
     }
 
 }

+ 9 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/PictureTag.java

@@ -10,6 +10,8 @@ public class PictureTag {
 
     private int groupNumber;
 
+    private String questionNumber;
+
     private String[] content;
 
     private double left;
@@ -80,4 +82,11 @@ public class PictureTag {
         this.userRole = userRole;
     }
 
+    public String getQuestionNumber() {
+        return questionNumber;
+    }
+
+    public void setQuestionNumber(String questionNumber) {
+        this.questionNumber = questionNumber;
+    }
 }