Sfoglia il codice sorgente

新增缺页异常上传;新增大题昵称;新增回评时分数查询和模糊查询密号

ting.yin 2 anni fa
parent
commit
9bf69a1225
26 ha cambiato i file con 288 aggiunte e 83 eliminazioni
  1. 7 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java
  2. 14 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java
  3. 36 38
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  4. 1 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/enums/FileType.java
  5. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/FileService.java
  6. 10 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/impl/FileServiceImpl.java
  7. 10 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkStepDTO.java
  8. 74 13
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java
  9. 13 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java
  10. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkLibraryService.java
  11. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/TaskService.java
  12. 18 5
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/ObjectiveQuestionDTO.java
  13. 25 12
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java
  14. 3 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java
  15. 1 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SubjectController.java
  16. 1 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/DataSyncThread.java
  17. 1 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/OnlineExamThread.java
  18. 17 9
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CoreController.java
  19. 16 1
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/FileController.java
  20. 5 3
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  21. 2 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/paperDetail.jsp
  22. 6 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/questionAdd.jsp
  23. 6 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/questionEdit.jsp
  24. 6 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/subjectEdit.jsp
  25. 2 0
      stmms-web/src/main/webapp/sql/stmms_ft.sql
  26. 6 0
      stmms-web/src/main/webapp/sql/upgrade/1.3.12.sql

+ 7 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java

@@ -70,6 +70,9 @@ public class ExamQuestion implements Serializable {
     @Enumerated(EnumType.ORDINAL)
     private QuestionType type;
 
+    @Column(name = "name", nullable = true, length = 128)
+    private String name;
+
     @Transient
     private ExamSubject subject;
 
@@ -341,4 +344,8 @@ public class ExamQuestion implements Serializable {
         this.selectivePart = selectivePart;
     }
 
+    public void setName(String name) {
+        this.name = name;
+    }
+
 }

+ 14 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamSubject.java

@@ -112,6 +112,12 @@ public class ExamSubject implements Serializable {
     @Column(name = "enable_split", nullable = true)
     private Boolean enableSplit;
 
+    /**
+     * 显示题目昵称
+     */
+    @Column(name = "display_question_name", nullable = false)
+    private Boolean displayQuestionName;
+
     /**
      * 大题数量
      */
@@ -394,4 +400,12 @@ public class ExamSubject implements Serializable {
         this.enableSplit = enableSplit;
     }
 
+    public Boolean getDisplayQuestionName() {
+        return displayQuestionName;
+    }
+
+    public void setDisplayQuestionName(Boolean displayQuestionName) {
+        this.displayQuestionName = displayQuestionName;
+    }
+
 }

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

@@ -101,6 +101,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 subject.setLevel(StringUtils.trimToNull(student.getSubjectLevel()));
                 subject.setCategory(StringUtils.trimToNull(student.getSubjectCategory()));
                 subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
+                subject.setDisplayQuestionName(false);
             } else {
                 subject = subjectMap.get(student.getSubjectCode());
                 subject.setLevel(StringUtils.trimToNull(student.getSubjectLevel()));
@@ -128,6 +129,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 subject.setTotalScore(0d);
                 subject.setUploadCount(0);
                 subject.setRemark(es.getRemark());
+                subject.setDisplayQuestionName(false);
             } else {
                 subject.setLevel(es.getLevel());
                 subject.setCategory(es.getCategory());
@@ -155,8 +157,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             if (student.getSecretNumber() == null) {
                 student.randomSecretNumber();
                 while (secretNumberSet.contains(student.getSecretNumber())
-                        || studentDao.countByExamIdAndSecretNumber(student.getExamId(), student.getSecretNumber())
-                        > 0) {
+                        || studentDao.countByExamIdAndSecretNumber(student.getExamId(), student.getSecretNumber()) > 0) {
                     student.randomSecretNumber();
                 }
             }
@@ -183,6 +184,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             subject.setTotalScore(0d);
             subject.setUploadCount(0);
             subject.setRemark(StringUtils.trimToNull(student.getSubjectRemark()));
+            subject.setDisplayQuestionName(false);
             subjectService.save(subject);
         } else {
             student.setSubjectName(subject.getName());
@@ -382,10 +384,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
@@ -473,14 +475,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 {
@@ -688,9 +690,8 @@ 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()]));
             }
         };
     }
@@ -709,8 +710,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
@@ -749,9 +750,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         query.setPageNumber(1);
         query.setPageSize(1);
         query.setSort(new Sort(Direction.ASC, "uploadTime", "id"));
-        List<ExamStudent> list = minUploadTime != null ?
-                studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, minUploadTime, query) :
-                studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, query);
+        List<ExamStudent> list = minUploadTime != null ? studentDao.findUnLibraryStudent(examId, subjectCode,
+                groupNumber, minUploadTime, query) : studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber,
+                query);
         return list.isEmpty() ? null : list.get(0);
     }
 
@@ -761,8 +762,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         query.setPageNumber(1);
         query.setPageSize(1);
         query.setSort(new Sort(Direction.ASC, "uploadTime", "id"));
-        List<ExamStudent> list = studentDao
-                .findUnTrialStudent(examId, subjectCode, groupNumber, SubjectiveStatus.TRIAL, query);
+        List<ExamStudent> list = studentDao.findUnTrialStudent(examId, subjectCode, groupNumber,
+                SubjectiveStatus.TRIAL, query);
         return list.isEmpty() ? null : list.get(0);
     }
 
@@ -788,8 +789,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         return countByQuery(query);
     }
 
-    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,
-            boolean breach) {
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent, boolean breach) {
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
         query.setExamId(examId);
         query.setSubjectCode(subjectCode);
@@ -842,8 +842,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             sliceConfig = exam.getSliceConfigList();
         }
         if (!sliceConfig.isEmpty()) {
-            List<PictureTag> tags = PictureConfigTransform
-                    .process(sliceConfig, getSliceTags(student, withGroupScore, sliceConfig)).get(index);
+            List<PictureTag> tags = PictureConfigTransform.process(sliceConfig,
+                    getSliceTags(student, withGroupScore, sliceConfig)).get(index);
             if (tags != null) {
                 list.addAll(tags);
             }
@@ -893,8 +893,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) {
@@ -916,14 +916,13 @@ 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;
@@ -1005,9 +1004,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 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(format.format(score), config.getI(),
-                            config.getX() * sliceConfig.get(config.getI() - 1).getW(),
-                            config.getY() * sliceConfig.get(config.getI() - 1).getH());
+                    tag = new OriginTag(format.format(score), config.getI(), config.getX()
+                            * sliceConfig.get(config.getI() - 1).getW(), config.getY()
+                            * sliceConfig.get(config.getI() - 1).getH());
                 }
                 originTags.add(tag);
             }
@@ -1025,7 +1024,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             // 添加轨迹分
             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()));
             }
@@ -1080,8 +1079,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     }
 
     @Override
-    public List<ExamStudent> findByExamIdAndStudentCodeAndSubjectCode(int examId, String studentCode,
-            String subjectCode) {
+    public List<ExamStudent> findByExamIdAndStudentCodeAndSubjectCode(int examId, String studentCode, String subjectCode) {
         return studentDao.findByExamIdAndStudentCodeAndSubjectCode(examId, studentCode, subjectCode);
     }
 

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/enums/FileType.java

@@ -8,7 +8,7 @@ public enum FileType {
     SHEET("原图", "sheet/%d/%s/%s-%d.%s"), SLICE("裁切图", "slice/%d/%s/%s-%d.%s"), JSON("作答内容", "json/%d/%s/%s.%s"), PACKAGE(
             "签到表", "package/%d/%s/%d.%s"), PAPER("试卷", "paper/%d/%s.%s"), ANSWER("标答", "answer/%d/%s.%s"), CARD("题卡",
             "card/%d/%s.%s"), EXCHANGE("文件", "exchange/%s"), ANSWER_CARD("题卡", "card/answer/%d/%s.%s"), REPORT("报表",
-            "report/%d/%s/%s.%s");
+            "report/%d/%s/%s.%s"), INCOMPLETE("缺页异常表", "incomplete/%s");
 
     private String name;
 

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/FileService.java

@@ -80,4 +80,8 @@ public interface FileService {
 
     boolean reportExist(int examId, String subjectName, String reportTitle, FormatType type);
 
+    void uploadIncomplete(InputStream inputStream, String md5, String name) throws Exception;
+
+    String getIncompleteUri(String name);
+
 }

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/impl/FileServiceImpl.java

@@ -323,6 +323,16 @@ public class FileServiceImpl implements FileService, InitializingBean, Disposabl
         return store.exist(getReportUri(examId, subjectName, reportTitle, type));
     }
 
+    @Override
+    public void uploadIncomplete(InputStream ins, String md5, String name) throws Exception {
+        store.write(getIncompleteUri(name), ins, md5);
+    }
+
+    @Override
+    public String getIncompleteUri(String name) {
+        return FileType.INCOMPLETE.getPath(name);
+    }
+
     public static void main(String[] args) throws Exception {
         FileServiceImpl service = new FileServiceImpl();
         // service.fileServerString = "123";

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkStepDTO.java

@@ -14,6 +14,8 @@ public class MarkStepDTO implements Serializable {
 
     private String subNumber;
 
+    private String questionName;
+
     private double intervalScore;
 
     private double defaultScore;
@@ -132,4 +134,12 @@ public class MarkStepDTO implements Serializable {
         this.selectiveIndex = selectiveIndex;
     }
 
+    public String getQuestionName() {
+        return questionName;
+    }
+
+    public void setQuestionName(String questionName) {
+        this.questionName = questionName;
+    }
+
 }

+ 74 - 13
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java

@@ -52,10 +52,9 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         query.setPageNumber(pageNumber);
         query.setPageSize(pageSize);
 
-        return filterClass ?
-                libraryDao
-                        .findUnMarkedFilterClass(examId, subjectCode, groupNumber, markerId, userId, statusSet, query) :
-                libraryDao.findUnMarked(examId, subjectCode, groupNumber, markerId, statusSet, query);
+        return filterClass ? libraryDao.findUnMarkedFilterClass(examId, subjectCode, groupNumber, markerId, userId,
+                statusSet, query) : libraryDao.findUnMarked(examId, subjectCode, groupNumber, markerId, statusSet,
+                query);
     }
 
     @Override
@@ -151,12 +150,12 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
                     predicates.add(cb.or(predicate1, predicate2));
                 }
                 if (StringUtils.isNotBlank(query.getQuestionScore())) {
-                    Predicate predicate1 = cb
-                            .like(root.get("markerScoreList").as(String.class), query.getQuestionScore() + ",%");
-                    Predicate predicate2 = cb
-                            .like(root.get("markerScoreList").as(String.class), "%," + query.getQuestionScore());
-                    Predicate predicate3 = cb
-                            .like(root.get("markerScoreList").as(String.class), "%," + query.getQuestionScore() + ",%");
+                    Predicate predicate1 = cb.like(root.get("markerScoreList").as(String.class),
+                            query.getQuestionScore() + ",%");
+                    Predicate predicate2 = cb.like(root.get("markerScoreList").as(String.class),
+                            "%," + query.getQuestionScore());
+                    Predicate predicate3 = cb.like(root.get("markerScoreList").as(String.class),
+                            "%," + query.getQuestionScore() + ",%");
                     Predicate predicate4 = cb.equal(root.get("markerScoreList"), query.getQuestionScore());
                     predicates.add(cb.or(predicate1, predicate2, predicate3, predicate4));
                 }
@@ -166,9 +165,8 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
                 if (StringUtils.isNotBlank(query.getRejectReason())) {
                     predicates.add(cb.like(root.get("rejectReason").as(String.class), query.getRejectReason() + ":%"));
                 }
-                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()]));
             }
         };
     }
@@ -251,4 +249,67 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         return libraryDao.countMarkedFilterClass(examId, subjectCode, groupNumber, userId, status);
     }
 
+    @Override
+    public MarkLibrarySearchQuery findHistory(MarkLibrarySearchQuery query) {
+        checkQuery(query);
+        Page<MarkLibrary> result = libraryDao.findAll(buildHistotySpecification(query), query);
+        fillResult(result, query);
+        return query;
+    }
+
+    private Specification<MarkLibrary> buildHistotySpecification(final MarkLibrarySearchQuery query) {
+        return new Specification<MarkLibrary>() {
+
+            @Override
+            public Predicate toPredicate(Root<MarkLibrary> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                if (query.getExamId() > 0) {
+                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
+                }
+                if (StringUtils.isNotBlank(query.getSubjectCode())) {
+                    predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
+                }
+                if (query.getGroupNumber() != null) {
+                    predicates.add(cb.equal(root.get("groupNumber"), query.getGroupNumber()));
+                }
+                if (StringUtils.isNotBlank(query.getExamNumber())) {
+                    predicates.add(cb.equal(root.get("examNumber"), query.getExamNumber()));
+                }
+                if (StringUtils.isNotBlank(query.getSecretNumber())) {
+                    predicates.add(cb.like(root.get("secretNumber"), "%" + query.getSecretNumber() + "%"));
+                }
+                if (query.getStudentId() != null) {
+                    predicates.add(cb.equal(root.get("studentId"), query.getStudentId()));
+                }
+                if (query.getMarkerId() > 0) {
+                    predicates.add(cb.equal(root.get("markerId"), query.getMarkerId()));
+                }
+                if (query.getStatusSet() != null && query.getStatusSet().size() > 0) {
+                    List<Predicate> sub = new LinkedList<>();
+                    for (LibraryStatus status : query.getStatusSet()) {
+                        sub.add(cb.equal(root.get("status").as(LibraryStatus.class), status));
+                    }
+                    predicates.add(cb.or(sub.toArray(new Predicate[sub.size()])));
+                }
+                if (query.getMarkerScore() != null) {
+                    predicates.add(cb.equal(root.get("markerScore"), query.getMarkerScore()));
+                }
+                if (query.getStartScore() != null) {
+                    Predicate predicate1 = cb.ge(root.get("markerScore"), query.getStartScore());
+                    predicates.add(predicate1);
+                }
+                if (query.getEndScore() != null) {
+                    Predicate predicate2 = cb.le(root.get("markerScore"), query.getEndScore());
+                    predicates.add(predicate2);
+                }
+                if (query.getMarkerScore() != null && query.getStartScore() != null) {
+                    Predicate predicate1 = cb.ge(root.get("markerScore"), query.getStartScore());
+                    Predicate predicate2 = cb.le(root.get("markerScore"), query.getEndScore());
+                    predicates.add(cb.and(predicate1, predicate2));
+                }
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
+            }
+        };
+    }
 }

+ 13 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java

@@ -320,6 +320,7 @@ public class TaskServiceImpl implements TaskService {
         MarkStepDTO step = new MarkStepDTO();
         step.setMainNumber(question.getMainNumber());
         step.setSubNumber(question.getSubNumber());
+        step.setQuestionName(question.getName());
         step.setGroupNumber(question.getGroupNumber());
         step.setTitle(question.getMainTitle());
         step.setDefaultScore(0d);
@@ -470,4 +471,16 @@ public class TaskServiceImpl implements TaskService {
         }
         return list;
     }
+
+    @Override
+    public List<Task> findHistory(MarkLibrarySearchQuery query) {
+        List<Task> list = new LinkedList<Task>();
+        query = libraryService.findHistory(query);
+        if (query.getCurrentCount() > 0) {
+            for (MarkLibrary library : query.getResult()) {
+                list.add(build(library));
+            }
+        }
+        return list;
+    }
 }

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkLibraryService.java

@@ -52,4 +52,6 @@ public interface MarkLibraryService {
     long countMarkedByExamAndSubjectAndGroupAndFilterClass(Integer examId, String subjectCode, Integer groupNumber,
             Integer userId, LibraryStatus... status);
 
+    MarkLibrarySearchQuery findHistory(MarkLibrarySearchQuery query);
+
 }

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/TaskService.java

@@ -22,4 +22,6 @@ public interface TaskService {
 
     Task build(ExamStudent student);
 
+    List<Task> findHistory(MarkLibrarySearchQuery query);
+
 }

+ 18 - 5
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/ObjectiveQuestionDTO.java

@@ -23,19 +23,22 @@ public class ObjectiveQuestionDTO implements QuestionDTO {
     @ExcelField(title = "大题名称", align = 2, sort = 40)
     private String title;
 
-    @ExcelField(title = "大题号(只能用小写数字)", align = 2, sort = 50)
+    @ExcelField(title = "题目昵称", align = 2, sort = 50)
+    private String name;
+
+    @ExcelField(title = "大题号(只能用小写数字)", align = 2, sort = 60)
     private Integer mainNumber;
 
-    @ExcelField(title = "小题号(只能用小写数字)", align = 2, sort = 60)
+    @ExcelField(title = "小题号(只能用小写数字)", align = 2, sort = 70)
     private String subNumber;
 
-    @ExcelField(title = "标准答案", align = 2, sort = 70)
+    @ExcelField(title = "标准答案", align = 2, sort = 80)
     private String answer;
 
-    @ExcelField(title = "小题满分", align = 2, sort = 80)
+    @ExcelField(title = "小题满分", align = 2, sort = 90)
     private Double totalScore;
 
-    @ExcelField(title = "题型(1-单选,2-多选,3-判断)", align = 2, sort = 90, type = 2)
+    @ExcelField(title = "题型(1-单选,2-多选,3-判断)", align = 2, sort = 100, type = 2)
     private Integer type;
 
     public ObjectiveQuestionDTO() {
@@ -49,6 +52,7 @@ public class ObjectiveQuestionDTO implements QuestionDTO {
         setMainNumber(question.getMainNumber());
         setSubNumber(question.getSubNumber());
         setTitle(question.getMainTitle());
+        setName(question.getName());
         setAnswer(question.getAnswer());
         setTotalScore(question.getTotalScore());
     }
@@ -65,6 +69,7 @@ public class ObjectiveQuestionDTO implements QuestionDTO {
         question.setGroupNumber(0);
         question.setObjective(true);
         question.setMainTitle(StringUtils.trimToNull(title));
+        question.setName(StringUtils.trimToNull(name));
         question.setAnswer(StringUtils.trimToNull(answer) == null ? null : StringUtils.trimToNull(answer).toUpperCase());
         question.setTotalScore(totalScore);
         question.setIntervalScore(1d);
@@ -144,4 +149,12 @@ public class ObjectiveQuestionDTO implements QuestionDTO {
         this.type = type;
     }
 
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
 }

+ 25 - 12
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java

@@ -21,40 +21,43 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
     @ExcelField(title = "大题名称*", align = 2, sort = 30)
     private String title;
 
-    @ExcelField(title = "大题号(只能用小写数字)*", align = 2, sort = 40)
+    @ExcelField(title = "题目昵称", align = 2, sort = 40)
+    private String name;
+
+    @ExcelField(title = "大题号(只能用小写数字)*", align = 2, sort = 50)
     private Integer mainNumber;
 
-    @ExcelField(title = "小题号(只能用小写数字)*", align = 2, sort = 50)
+    @ExcelField(title = "小题号(只能用小写数字)*", align = 2, sort = 60)
     private String subNumber;
 
-    @ExcelField(title = "小题满分*", align = 2, sort = 60)
+    @ExcelField(title = "小题满分*", align = 2, sort = 70)
     private Double totalScore;
 
-    @ExcelField(title = "间隔分*", align = 2, sort = 70)
+    @ExcelField(title = "间隔分*", align = 2, sort = 80)
     private Double intervalScore;
 
-    @ExcelField(title = "评卷分组(只能用小写数字)*", align = 2, sort = 80)
+    @ExcelField(title = "评卷分组(只能用小写数字)*", align = 2, sort = 90)
     private Integer groupNumber;
 
-    @ExcelField(title = "图片序号(用英文逗号分割)", align = 2, sort = 90)
+    @ExcelField(title = "图片序号(用英文逗号分割)", align = 2, sort = 100)
     private String picList;
 
-    @ExcelField(title = "双评比例(0~1)", align = 2, sort = 100)
+    @ExcelField(title = "双评比例(0~1)", align = 2, sort = 110)
     private Double doubleRate;
 
-    @ExcelField(title = "仲裁阀值", align = 2, sort = 110)
+    @ExcelField(title = "仲裁阀值", align = 2, sort = 120)
     private Double arbitrateThreshold;
 
-    @ExcelField(title = "合分策略(1-平均,2-最高,3-最低)", align = 2, sort = 120)
+    @ExcelField(title = "合分策略(1-平均,2-最高,3-最低)", align = 2, sort = 130)
     private Integer scorePolicy;
 
-    @ExcelField(title = "评卷模式(common-普通,track-轨迹)", align = 2, sort = 130)
+    @ExcelField(title = "评卷模式(common-普通,track-轨迹)", align = 2, sort = 140)
     private String markMode;
 
-    @ExcelField(title = "试评数量(0-跳过试评)", align = 2, sort = 140)
+    @ExcelField(title = "试评数量(0-跳过试评)", align = 2, sort = 150)
     private Integer trialCount;
 
-    @ExcelField(title = "选做题数量", align = 2, sort = 150)
+    @ExcelField(title = "选做题数量", align = 2, sort = 160)
     private Integer selectiveCount;
 
     public SubjectiveQuestionDTO() {
@@ -66,6 +69,7 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         setSubjectName(subject != null ? subject.getName() : "");
         setMainNumber(question.getMainNumber());
         setTitle(question.getMainTitle());
+        setName(question.getName());
         setSubNumber(question.getSubNumber());
         setGroupNumber(question.getGroupNumber());
         setTotalScore(question.getTotalScore());
@@ -85,6 +89,7 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         question.setSubjectCode(StringUtils.trimToNull(subjectCode));
         question.setPaperType(NULL_PAPER_TYPE_PLACEHOLDER);
         question.setMainTitle(StringUtils.trimToNull(title));
+        question.setName(StringUtils.trimToNull(name));
         question.setMainNumber(mainNumber);
         question.setSubNumber(subNumber);
         question.setGroupNumber(groupNumber);
@@ -233,4 +238,12 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         this.selectiveCount = selectiveCount;
     }
 
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
 }

+ 3 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -584,6 +584,7 @@ public class PaperController extends BaseExamController {
             old.setMainNumber(question.getMainNumber());
             old.setSubNumber(question.getSubNumber());
             old.setMainTitle(question.getMainTitle());
+            old.setName(question.getName());
             old.setTotalScore(question.getTotalScore());
             old.setIntervalScore(question.getIntervalScore());
             old.setObjectivePolicy(question.getObjectivePolicy());
@@ -796,7 +797,8 @@ public class PaperController extends BaseExamController {
             if (!question.isObjective()) {
                 studentService.updateSubjectiveStatusAndScoreAndInspectorId(examId, question.getSubjectCode(),
                         SubjectiveStatus.UNMARK, 0, null, null, null);
-                //studentService.resetSubjectiveStatusAndScoreWithoutTrial(examId, question.getSubjectCode());
+                // studentService.resetSubjectiveStatusAndScoreWithoutTrial(examId,
+                // question.getSubjectCode());
                 inspectHistoryService.deleteByExamIdAndSubjectCode(examId, question.getSubjectCode());
             }
         }

+ 1 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SubjectController.java

@@ -99,6 +99,7 @@ public class SubjectController extends BaseExamController {
         previous.setSasConfig(sasConfig.toString());
         previous.setEnableSplit(subject.getEnableSplit());
         previous.setAutoScroll(subject.getAutoScroll());
+        previous.setDisplayQuestionName(subject.getDisplayQuestionName());
         subjectService.save(previous);
         model.addAttribute("message", "修改成功");
         String u = upload == null ? "" : upload.toString();

+ 1 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/DataSyncThread.java

@@ -238,6 +238,7 @@ public class DataSyncThread implements Runnable {
         subject.setSubjectiveScore(0d);
         subject.setTotalScore(0d);
         subject.setUploadCount(0);
+        subject.setDisplayQuestionName(false);
         subjectService.save(subject);
     }
 

+ 1 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/OnlineExamThread.java

@@ -236,6 +236,7 @@ public class OnlineExamThread implements Runnable {
         subject.setSubjectiveScore(0d);
         subject.setTotalScore(0d);
         subject.setUploadCount(0);
+        subject.setDisplayQuestionName(false);
         subjectService.save(subject);
         subjectMap.put(subjectCode, subject);
         // 保存question

+ 17 - 9
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CoreController.java

@@ -191,7 +191,8 @@ public class CoreController extends BaseApiController {
             @RequestParam(required = false) String examSite, @RequestParam(required = false) String examRoom) {
         ApiUser user = RequestUtils.getApiUser(request);
         Exam exam = examService.findById(examId);
-        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId())
+                || exam.getStatus() != ExamStatus.START) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
         examNumber = validate("examNumber", examNumber, true, 64);
@@ -527,6 +528,7 @@ public class CoreController extends BaseApiController {
             subject.setUploadCount(0);
             subject.setAutoScroll(exam.isAutoScroll());
             subject.setEnableSplit(exam.isEnableSplit());
+            subject.setDisplayQuestionName(false);
         }
         subject.setName(name);
         subject.setRemark(remark);
@@ -645,7 +647,8 @@ public class CoreController extends BaseApiController {
         JSONArray result = new JSONArray();
         // 输入字段预处理并初步校验
         Exam exam = examService.findById(examId);
-        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId())
+                || exam.getStatus() != ExamStatus.START) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
         subjectCode = validate("subjectCode", subjectCode, true, 64);
@@ -699,7 +702,8 @@ public class CoreController extends BaseApiController {
         JSONObject result = new JSONObject();
         // 输入字段预处理并初步校验
         Exam exam = examService.findById(examId);
-        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId())
+                || exam.getStatus() != ExamStatus.START) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
         subjectCode = validate("subjectCode", subjectCode, true, 64);
@@ -732,7 +736,8 @@ public class CoreController extends BaseApiController {
         JSONObject result = new JSONObject();
         // 输入字段预处理并初步校验
         Exam exam = examService.findById(examId);
-        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId())
+                || exam.getStatus() != ExamStatus.START) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
         subjectCode = validate("subjectCode", subjectCode, true, 64);
@@ -752,7 +757,8 @@ public class CoreController extends BaseApiController {
         JSONObject result = new JSONObject();
         // 输入字段预处理并初步校验
         Exam exam = examService.findById(dto.getExamId());
-        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId())
+                || exam.getStatus() != ExamStatus.START) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
         String subjectCode = validate("subjectCode", dto.getSubjectCode(), true, 64);
@@ -804,7 +810,8 @@ public class CoreController extends BaseApiController {
         // 输入字段预处理并初步校验
         account = validate("account", account, true, 32);
         Exam exam = examService.findById(examId);
-        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId())
+                || exam.getStatus() != ExamStatus.START) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
         subjectCode = validate("subjectCode", subjectCode, true, 64);
@@ -870,7 +877,8 @@ public class CoreController extends BaseApiController {
         JSONArray result = new JSONArray();
         // 输入字段预处理并初步校验
         Exam exam = examService.findById(examId);
-        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId())
+                || exam.getStatus() != ExamStatus.START) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
         subjectCode = validate("subjectCode", subjectCode, true, 64);
@@ -906,8 +914,8 @@ public class CoreController extends BaseApiController {
             @RequestParam String examNumber, @RequestParam Double objectiveScore) {
         ApiUser user = RequestUtils.getApiUser(request);
         Exam exam = examService.findById(examId);
-        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId()) || exam.getStatus() != ExamStatus.START
-                || exam.getType() != ExamType.MULTI_MEDIA) {
+        if (exam == null || !validateSchool(user.getSchoolId(), exam.getSchoolId())
+                || exam.getStatus() != ExamStatus.START || exam.getType() != ExamType.MULTI_MEDIA) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
         examNumber = validate("examNumber", examNumber, true, 64);

+ 16 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/FileController.java

@@ -71,7 +71,8 @@ public class FileController extends BaseApiController {
 
     private Exam validateExam(ApiUser au, Integer examId, ExamType... types) {
         Exam exam = examService.findById(examId);
-        if (exam == null || !validateSchool(au.getSchoolId(), exam.getSchoolId()) || exam.getStatus() != ExamStatus.START) {
+        if (exam == null || !validateSchool(au.getSchoolId(), exam.getSchoolId())
+                || exam.getStatus() != ExamStatus.START) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
         if (types != null && types.length > 0 && !Arrays.asList(types).contains(exam.getType())) {
@@ -449,4 +450,18 @@ public class FileController extends BaseApiController {
     public JSONObject exchangeUrl(HttpServletRequest request, @RequestParam String name) {
         return result("url", fileService.getFileServer().concat(fileService.getExchangeUri(name)));
     }
+
+    @RequestMapping(value = "/incomplete/upload", method = RequestMethod.POST)
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCHOOL_DEV, Role.SCANNER })
+    @ResponseBody
+    public JSONObject uploadIncomplete(HttpServletRequest request, @RequestParam String name, @RequestParam String md5,
+            @RequestParam MultipartFile file) {
+        try {
+            fileService.uploadIncomplete(file.getInputStream(), md5, name);
+        } catch (Exception e) {
+            log.error("incomplete upload error", e);
+            throw ApiException.FILE_UPLOAD_ERROR.replaceMessage("incomplete upload error: " + e.getMessage());
+        }
+        return result(true, fileService.getFileServer().concat(fileService.getIncompleteUri(name)));
+    }
 }

+ 5 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -552,8 +552,8 @@ public class MarkController extends BaseController {
     @RequestMapping(value = "/getHistory", method = RequestMethod.POST)
     @ResponseBody
     public Object getHistory(HttpServletRequest request, @RequestParam int pageNumber, @RequestParam int pageSize,
-            @RequestParam String order, @RequestParam String sort, @RequestParam(required = false) String secretNumber)
-            throws Exception {
+            @RequestParam String order, @RequestParam String sort, @RequestParam(required = false) String secretNumber,
+            @RequestParam(required = false) Double markerScore) throws Exception {
         Marker marker = RequestUtils.getWebUser(request).getMarker();
         List<Task> list = new ArrayList<>();
         Direction d = Direction.DESC;
@@ -578,6 +578,7 @@ public class MarkController extends BaseController {
             query.setGroupNumber(marker.getGroupNumber());
             query.setSecretNumber(secretNumber);
             query.setPageNumber(pageNumber);
+            query.setMarkerScore(markerScore);
             query.setPageSize(pageSize);
             query.setStartScore(0.0);
             if (querySort != null) {
@@ -585,7 +586,7 @@ public class MarkController extends BaseController {
             } else {
                 query.orderByMarkerTimeDesc();
             }
-            list = taskService.findByQuery(query);
+            list = taskService.findHistory(query);
         } else if (group != null && group.getStatus() == MarkStatus.TRIAL) {
             // 试评查找给分历史记录
             List<TrialLibrary> historyList = new ArrayList<TrialLibrary>();
@@ -737,6 +738,7 @@ public class MarkController extends BaseController {
                 examSubject.getEnableSplit() == null ? exam.isEnableSplit() : examSubject.getEnableSplit());
         setting.accumulate("autoScroll",
                 examSubject.getAutoScroll() == null ? exam.isAutoScroll() : examSubject.getAutoScroll());
+        setting.accumulate("display_question_name", examSubject.getDisplayQuestionName());
         JSONObject subject = new JSONObject();
         subject.accumulate("name", examSubject.getName());
         subject.accumulate("code", examSubject.getCode());

+ 2 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/paperDetail.jsp

@@ -52,6 +52,7 @@
 			<tr>
 			    <th><input type="checkbox" id="ids">试卷类型</th>
 				<th>大题名称</th>
+				<th>大题昵称</th>
 				<th>大题号</th>
 				<th>小题号</th>
 				<th>满分</th>
@@ -70,6 +71,7 @@
 			    	</c:if>${question.paperType}
 			    </td>
 				<td>${question.mainTitle}</td>
+				<td>${question.name}</td>
 				<td>${question.mainNumber}</td>
 				<td>${question.subNumber}</td>
 				<td><fmt:formatNumber pattern="###.###" value="${question.totalScore}"/></td>

+ 6 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/questionAdd.jsp

@@ -69,6 +69,12 @@
 			 <input name="mainTitle" value="${examQuestion.mainTitle }" type="text"  maxlength="32" class="required"/>
 			</div>
 		</div>
+		<div class="control-group">
+			<label class="control-label">大题昵称</label>
+			<div class="controls">
+			 <input name="mainTitle" value="${examQuestion.name }" type="text"  maxlength="32" class="required"/>
+			</div>
+		</div>
 		<div class="control-group">
 			<label class="control-label">大题号</label>
 			<div class="controls">

+ 6 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/questionEdit.jsp

@@ -64,6 +64,12 @@
 			 <input name="mainTitle" value="${examQuestion.mainTitle }" type="text" maxlength="32" class="required"/>
 			</div>
 		</div>
+		<div class="control-group">
+			<label class="control-label">大题昵称</label>
+			<div class="controls">
+			 <input name="name" value="${examQuestion.name }" type="text" maxlength="32" class="required"/>
+			</div>
+		</div>
 		<div class="control-group">
 			<label class="control-label">大题号</label>
 			<div class="controls">

+ 6 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/subjectEdit.jsp

@@ -32,6 +32,12 @@
 			</div>
 		</div>
 		<div class="control-group">
+            <label class="control-label">评卷显示题目昵称</label>
+            <div class="controls">
+                 <input name="displayQuestionName" type="checkbox" <c:if test="${subject.displayQuestionName}">checked</c:if>/>
+            </div>
+        </div>
+		<div class="control-group">
         <label class="control-label">及格分</label>
 	        <div class="controls">
 	            <input name="passScore" type="number" value="${passScore }" class="required"

+ 2 - 0
stmms-web/src/main/webapp/sql/stmms_ft.sql

@@ -245,6 +245,7 @@ CREATE TABLE `eb_exam_question`
     `main_number`      int(11)     NOT NULL COMMENT '大题号',
     `sub_number`       varchar(32) NOT NULL COMMENT '小题号',
     `main_title`       varchar(128) NOT NULL COMMENT '大题名称',
+    `name`       	   varchar(128) DEFAULT NULL COMMENT '名称',
     `answer`           varchar(16)          DEFAULT NULL COMMENT '正确答案',
     `total_score`      double      NOT NULL COMMENT '满分',
     `interval_score`   double      NOT NULL COMMENT '评卷间隔分',
@@ -354,6 +355,7 @@ CREATE TABLE `eb_exam_subject`
     `answer_file_type` varchar(16)  DEFAULT NULL COMMENT '标答文件类型',
 	`auto_scroll`   	tinyint(1)	DEFAULT NULL COMMENT '评卷提交自动定位',
 	`enable_split`   	tinyint(1)	DEFAULT NULL COMMENT '自动对切题卡',
+	`display_question_name`   	tinyint(1)	NOT NULL COMMENT '显示题目昵称',
     PRIMARY KEY (`exam_id`, `code`)
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4 COMMENT ='考试科目表';

+ 6 - 0
stmms-web/src/main/webapp/sql/upgrade/1.3.12.sql

@@ -0,0 +1,6 @@
+-- 1.3.12
+USE `stmms_ft`;
+-- 新增question字段
+ALTER TABLE eb_exam_question ADD COLUMN `name`	varchar(128) DEFAULT NULL COMMENT '名称';
+-- 新增eb_exam_subject字段
+ALTER TABLE eb_exam_subject ADD COLUMN `display_question_name`   tinyint(1)	NOT NULL COMMENT '显示题目昵称';