Преглед изворни кода

Squashed commit of the following:

commit 09d3a1192d41763816d0dcc2dec5d18517872e79
Author: luoshi <luoshi@qmth.com.cn>
Date:   Thu Jan 12 18:53:11 2023 +0800

    修复全卷复核可能出现的任务重复领取bug,将任务释放操作挪到事务外面

commit c8224984f3c5f8c5c281f17f333a4a5b779c6fa7
Author: luoshi <luoshi@qmth.com.cn>
Date:   Thu Jan 12 18:47:34 2023 +0800

    修复全卷复核可能出现的任务重复领取bug,将任务释放操作挪到事务外面

commit 9f79f537890f8049708fc97b00fcb5319985d843
Author: luoshi <luoshi@qmth.com.cn>
Date:   Sun Jan 8 15:07:55 2023 +0800

    修复评卷任务查询时,构造小题分查询SQL时的bug,补充遗漏的情况

commit 9830d38570ad5481c8e17e78dbc74c41ed9e87ce
Author: luoshi <luoshi@qmth.com.cn>
Date:   Sun Jan 8 14:14:19 2023 +0800

    构造轨迹还原内容时,针对未作答的轨迹分,只显示一个汉字"空"

commit 89d5a9e35ebf0320ebe09fc13ce0c6b470473e2f
Author: ting.yin <yinting@qmth.com.cn>
Date:   Fri Dec 23 09:52:35 2022 +0800

    update

commit faaf9088f8b384ae4c236573e3776e65fc80ccf1
Author: ting.yin <yinting@qmth.com.cn>
Date:   Fri Dec 23 09:48:59 2022 +0800

    修改评卷员导出,fileserver获取

commit 6d6ded184737a1b881dbd80cf5170f1cde1edea2
Author: luoshi <luoshi@qmth.com.cn>
Date:   Wed Dec 14 16:48:02 2022 +0800

    离线激活不保存授权文件中的机构logo内容

commit c1507db64d6c6a9cda3c43a08bfe5feecf24a1a4
Author: luoshi <luoshi@qmth.com.cn>
Date:   Wed Dec 14 14:25:00 2022 +0800

    去掉重置考生状态时过滤trial的逻辑,恢复到原始状态

commit d7ea5d066c79cccbce2054d264d4bbcc20a699c7
Author: luoshi <luoshi@qmth.com.cn>
Date:   Tue Dec 13 14:21:10 2022 +0800

    bugfix

commit 186e2d0a4c4d3ec438d1b4ff46892838c1ccb83b
Author: luoshi <luoshi@qmth.com.cn>
Date:   Tue Dec 13 14:18:31 2022 +0800

    补充修改新增小题逻辑同样的问题

commit 9f77e29f563368ac742eb251f693ebe67bb80097
Author: luoshi <luoshi@qmth.com.cn>
Date:   Tue Dec 13 13:54:27 2022 +0800

    bugfix

commit a206b5fd7bec51deccb3dd1894a4a6099cea63a0
Author: luoshi <luoshi@qmth.com.cn>
Date:   Tue Dec 13 12:12:47 2022 +0800

    删除试题同步更新处理此bug

commit f4a5ececa111044f2c6bc4dd6d3ac9ca446cd76f
Author: luoshi <luoshi@qmth.com.cn>
Date:   Tue Dec 13 11:58:50 2022 +0800

    删除分组时也修复类似的试评考生状态问题

commit 4b37f629c207a36583a66e8ee0f7d490b7aabbf8
Author: luoshi <luoshi@qmth.com.cn>
Date:   Tue Dec 13 10:46:54 2022 +0800

    bugfix

commit f6f3bc242ecd8c0ea8b3ee4d08e4e1fb27061ff7
Author: luoshi <luoshi@qmth.com.cn>
Date:   Tue Dec 13 10:44:36 2022 +0800

    bugfix

commit 6e27510ff9f2589221f2b001f67a839621022121
Author: luoshi <luoshi@qmth.com.cn>
Date:   Tue Dec 13 10:39:04 2022 +0800

    修复试评状态下新增分组后重置原有试评考生标识,重新随机出新试评考生,导致试评任务混乱的问题

commit 82b6fbe89d3468404848ba6b4584b6b553b74b08
Author: luoshi <luoshi@qmth.com.cn>
Date:   Mon Dec 12 18:06:34 2022 +0800

    增加试评任务构造过程的调试日志

commit bfe3fc9db57c2418f49ea904a49eb226c477edd9
Author: ting.yin <yinting@qmth.com.cn>
Date:   Thu Dec 8 17:43:24 2022 +0800

    update

commit 868761830b685cf745401256a44aacc93378a7ee
Author: ting.yin <yinting@qmth.com.cn>
Date:   Thu Dec 8 16:31:00 2022 +0800

    更新版本号;同步学校时AK相同的跳过;

commit d74c587cf4f30f0304ea62de6f3740bb6d2df00f
Author: luoshi <luoshi@qmth.com.cn>
Date:   Thu Dec 8 11:45:20 2022 +0800

    增加版本信息类;扩展授权文件激活逻辑,增加限制版本情况的解密;修改solar接口调用测试代码
luoshi пре 2 година
родитељ
комит
cc79a4d9e4
30 измењених фајлова са 347 додато и 273 уклоњено
  1. 6 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  2. 14 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkGroup.java
  3. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java
  4. 4 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/InspectedService.java
  5. 47 34
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  6. 33 35
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/InspectedServiceImpl.java
  7. 4 9
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/file/service/impl/FileServiceImpl.java
  8. 28 26
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java
  9. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  10. 8 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/school/service/impl/SchoolServiceImpl.java
  11. 31 15
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/AppLicenseUtil.java
  12. 48 41
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/SolarHttpUtil.java
  13. 11 0
      stmms-common/src/main/java/cn/com/qmth/stmms/common/utils/VersionInfo.java
  14. 22 27
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/config/SystemAuthController.java
  15. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkerDTO.java
  16. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkerInfoDTO.java
  17. 44 54
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  18. 1 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  19. 1 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java
  20. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java
  21. 23 14
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/LoginController.java
  22. 7 0
      stmms-web/src/main/java/cn/com/qmth/stmms/common/utils/RequestUtils.java
  23. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examIndex.jsp
  24. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examSelect.jsp
  25. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/selectiveAdd.jsp
  26. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/reset.jsp
  27. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/subjectSelect.jsp
  28. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/login.jsp
  29. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/reset.jsp
  30. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/sysIndex.jsp

+ 6 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -75,6 +75,12 @@ public interface ExamStudentDao
     public void updateSubjectiveStatusAndScore(Integer examId, String subjetCode, SubjectiveStatus status, double score,
             String scoreList, Date inspectTime, Integer inspectorId);
 
+    @Modifying
+    @Query("update ExamStudent s set s.subjectiveStatus=?3, s.subjectiveScore=?4, s.subjectiveScoreList=?5, s.inspectTime=?6, s.inspectorId=?7 "
+           + " where s.examId=?1 and s.subjectCode=?2 and s.subjectiveStatus not in (?8)")
+    public void updateSubjectiveStatusAndScoreWithoutStatus(Integer examId, String subjetCode, SubjectiveStatus status, double score,
+            String scoreList, Date inspectTime, Integer inspectorId, SubjectiveStatus... notInStatus);
+
     @Modifying
     @Query("update ExamStudent s set s.subjectiveStatus=?3, s.subjectiveScore=?4, s.subjectiveScoreList=?5 "
             + "where s.examId=?1 and s.subjectCode=?2 and exists "

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

@@ -151,6 +151,9 @@ public class MarkGroup implements Serializable {
     @Transient
     private boolean deleting;
 
+    @Transient
+    private String questionTitle;
+
     public MarkGroup() {
         this.pk = new MarkGroupPK();
     }
@@ -284,6 +287,7 @@ public class MarkGroup implements Serializable {
         DecimalFormat format = new DecimalFormat("####.###");
         Set<Integer> mainNumbers = new LinkedHashSet<>();
         Set<String> mainTitles = new LinkedHashSet<>();
+        Set<String> questionTitles = new LinkedHashSet<>();
         StringBuilder score = new StringBuilder();
         for (ExamQuestion question : questionList) {
             if (score.length() > 0) {
@@ -292,9 +296,11 @@ public class MarkGroup implements Serializable {
             score.append(format.format(question.getTotalScore()));
             mainNumbers.add(question.getMainNumber());
             mainTitles.add(question.getMainTitle());
+            questionTitles.add(question.getMainTitle() + '-' + question.getSubNumber());
         }
         this.mainNumber = StringUtils.join(mainNumbers, ",");
         this.title = StringUtils.join(mainTitles, ",");
+        this.questionTitle = StringUtils.join(questionTitles, ",");
         this.scoreList = score.toString();
     }
 
@@ -450,4 +456,12 @@ public class MarkGroup implements Serializable {
         this.selective = selective;
     }
 
+    public String getQuestionTitle() {
+        return questionTitle;
+    }
+
+    public void setQuestionTitle(String questionTitle) {
+        this.questionTitle = questionTitle;
+    }
+
 }

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

@@ -65,6 +65,8 @@ public interface ExamStudentService {
 
     void updateSubjectInfo(ExamSubject subject);
 
+    void resetSubjectiveStatusAndScoreWithoutTrial(Integer examId, String subjectCode);
+
     void updateSubjectiveStatusAndScoreAndInspectorId(Integer examId, String subjectCode, SubjectiveStatus status,
             double score, String scoreList, Date inspectTime, Integer inspectorId);
 

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

@@ -1,12 +1,12 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.common.enums.SelectiveStatus;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 
+import java.util.List;
+
 public interface InspectedService {
 
     List<ExamStudent> findByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
@@ -32,11 +32,11 @@ public interface InspectedService {
     /**
      * 复核
      */
-    boolean inspect(Integer studentId, Integer userId);
+    boolean inspect(ExamStudent student, Integer userId);
 
     /**
      * 取消复核
-     * 
+     *
      * @param studentId
      * @return
      */

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

@@ -155,7 +155,8 @@ 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();
                 }
             }
@@ -381,10 +382,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
@@ -440,6 +441,13 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         studentDao.updateSubjectiveStatusAndScore(id, status, score, scoreList, null, null);
     }
 
+    @Override
+    @Transactional
+    public void resetSubjectiveStatusAndScoreWithoutTrial(Integer examId, String subjectCode) {
+        studentDao.updateSubjectiveStatusAndScoreWithoutStatus(examId, subjectCode, SubjectiveStatus.UNMARK, 0, null,
+                null, null, SubjectiveStatus.TRIAL);
+    }
+
     @Override
     @Transactional
     public void resetSubjectiveStatusByGroupStatus(Integer examId, String subjectCode) {
@@ -465,14 +473,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 {
@@ -680,8 +688,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()]));
             }
         };
     }
@@ -700,8 +709,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
@@ -740,9 +749,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);
     }
 
@@ -752,8 +761,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);
     }
 
@@ -779,7 +788,8 @@ 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);
@@ -832,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);
             }
@@ -883,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) {
@@ -906,13 +916,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;
@@ -994,9 +1005,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);
             }
@@ -1014,8 +1025,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             // 添加轨迹分
             List<MarkTrack> tracks = trackService.findByLibraryId(selected.getId());
             for (MarkTrack markTrack : tracks) {
-                originTags.add(new OriginTag(format.format(markTrack.getScore()), markTrack.getOffsetIndex(), markTrack
-                        .getOffsetX(), markTrack.getOffsetY()));
+                //轨迹分为未作答时,只显示一个汉字"空"
+                originTags.add(new OriginTag(markTrack.isUnanswered() ? "空" : format.format(markTrack.getScore()),
+                        markTrack.getOffsetIndex(), markTrack.getOffsetX(), markTrack.getOffsetY()));
             }
             // 添加特殊标记
             List<MarkSpecialTag> specialTags = specialTagService.findByLibraryId(selected.getId());
@@ -1068,7 +1080,8 @@ 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);
     }
 

+ 33 - 35
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/InspectedServiceImpl.java

@@ -1,34 +1,28 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-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.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.InspectHistory;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.InspectHistoryService;
-import cn.com.qmth.stmms.biz.exam.service.InspectedService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.utils.TaskLock;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
 import cn.com.qmth.stmms.common.enums.SelectiveStatus;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 @Service
 public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implements InspectedService {
@@ -95,10 +89,12 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
             whereSql.append(" and s.subjective_status IN ('MARKED','INSPECTED')");
         }
         if (query.getStartScore() != null) {
-            whereSql.append(" and (cast(s.objective_score as decimal(10,3))+cast(s.subjective_score as decimal(10,3))) >= :startScore");
+            whereSql.append(
+                    " and (cast(s.objective_score as decimal(10,3))+cast(s.subjective_score as decimal(10,3))) >= :startScore");
         }
         if (query.getEndScore() != null) {
-            whereSql.append(" and (cast(s.objective_score as decimal(10,3))+cast(s.subjective_score as decimal(10,3))) <= :endScore");
+            whereSql.append(
+                    " and (cast(s.objective_score as decimal(10,3))+cast(s.subjective_score as decimal(10,3))) <= :endScore");
         }
         if (StringUtils.isNotBlank(query.getSecretNumber())) {
             whereSql.append(" and s.secret_number = :secretNumber");
@@ -120,23 +116,26 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
             whereSql.append(" ) ");
         }
         // 全部选做题为未选做
-        List<MarkGroup> groups = groupService.findByExamAndSubjectAndSelective(query.getExamId(),
-                query.getSubjectCode(), true);
-        List<SelectiveGroup> selectiveGroups = selectiveGroupService.findByExamIdAndSubjectCode(query.getExamId(),
-                query.getSubjectCode());
+        List<MarkGroup> groups = groupService
+                .findByExamAndSubjectAndSelective(query.getExamId(), query.getSubjectCode(), true);
+        List<SelectiveGroup> selectiveGroups = selectiveGroupService
+                .findByExamIdAndSubjectCode(query.getExamId(), query.getSubjectCode());
         if (selectiveStatus != null && SelectiveStatus.UN_SELECTIVE.equals(selectiveStatus) && !groups.isEmpty()
                 && !selectiveGroups.isEmpty()) {
-            whereSql.append(" and not exists (select e.student_id from eb_subjective_score e where e.student_id = s.id and e.group_number in (:groupNumbers) and e.group_score != -1 )");
+            whereSql.append(
+                    " and not exists (select e.student_id from eb_subjective_score e where e.student_id = s.id and e.group_number in (:groupNumbers) and e.group_score != -1 )");
         }
         // 选做题多选做
         if (selectiveStatus != null && SelectiveStatus.MUTI_SELECTIVE.equals(selectiveStatus) && !groups.isEmpty()
                 && !selectiveGroups.isEmpty()) {
-            whereSql.append(" and exists (select ss.student_id from eb_selective_student ss where ss.student_id = s.id and ss.muti_selective=1)");
+            whereSql.append(
+                    " and exists (select ss.student_id from eb_selective_student ss where ss.student_id = s.id and ss.muti_selective=1)");
         }
         // 选做题少选做
         if (selectiveStatus != null && SelectiveStatus.LESS_SELECTIVE.equals(selectiveStatus) && !groups.isEmpty()
                 && !selectiveGroups.isEmpty()) {
-            whereSql.append(" and exists (select ss.student_id from eb_selective_student ss where ss.student_id = s.id and ss.less_selective=1) ");
+            whereSql.append(
+                    " and exists (select ss.student_id from eb_selective_student ss where ss.student_id = s.id and ss.less_selective=1) ");
         }
         dataSql.append(whereSql);
         StringBuilder orderSql = new StringBuilder(" order by s.inspect_time desc ");
@@ -249,21 +248,20 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
 
     @Transactional
     @Override
-    public boolean inspect(Integer studentId, Integer userId) {
-        ExamStudent student = studentService.findById(studentId);
+    public boolean inspect(ExamStudent student, Integer userId) {
         if (this.hasApplied(student, userId) && SubjectiveStatus.MARKED.equals(student.getSubjectiveStatus())) {
             Date now = new Date();
-            studentService.updateSubjectiveStatusAndTimeAndInspectorId(studentId, SubjectiveStatus.INSPECTED, now,
+            studentService.updateSubjectiveStatusAndTimeAndInspectorId(student.getId(), SubjectiveStatus.INSPECTED, now,
                     userId);
             InspectHistory i = new InspectHistory();
             i.setExamId(student.getExamId());
-            i.setStudentId(studentId);
+            i.setStudentId(student.getId());
             i.setSubjectCode(student.getSubjectCode());
             i.setInspectorId(userId);
             i.setInspectTime(now);
             inspectHistoryService.save(i);
-            studentService.updateInspectCount(studentId, inspectHistoryService.countByStudentId(studentId));
-            this.releaseByStudent(student);
+            studentService.updateInspectCount(student.getId(), inspectHistoryService.countByStudentId(student.getId()));
+            //this.releaseByStudent(student);
             return true;
         }
         return false;
@@ -273,8 +271,8 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
     public boolean cancel(Integer studentId) {
         ExamStudent student = studentService.findById(studentId);
         if (student.getSubjectiveStatus().equals(SubjectiveStatus.INSPECTED)) {
-            studentService.updateSubjectiveStatusAndTimeAndInspectorId(student.getId(), SubjectiveStatus.MARKED, null,
-                    null);
+            studentService
+                    .updateSubjectiveStatusAndTimeAndInspectorId(student.getId(), SubjectiveStatus.MARKED, null, null);
             return true;
         }
         return false;

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

@@ -33,8 +33,6 @@ public class FileServiceImpl implements FileService, InitializingBean, Disposabl
     @Autowired
     private SystemCache systemCache;
 
-    private List<String> fileServers;
-
     @Value("${file.store}")
     private String fileStore;
 
@@ -61,11 +59,12 @@ public class FileServiceImpl implements FileService, InitializingBean, Disposabl
 
     @Override
     public String getRandomFileServer() {
-        return getFileServers().get(RandomUtils.nextInt(fileServers.size()));
+        List<String> fileServers = getFileServers();
+        return fileServers.get(RandomUtils.nextInt(fileServers.size()));
     }
 
     public List<String> getFileServers() {
-        fileServers = new ArrayList<>();
+        List<String> fileServers = new ArrayList<>();
         String[] servers = StringUtils.split(systemCache.getFileServer(), SERVER_SPLIT);
         for (String server : servers) {
             server = StringUtils.trimToNull(server);
@@ -79,10 +78,6 @@ public class FileServiceImpl implements FileService, InitializingBean, Disposabl
         return fileServers;
     }
 
-    public void setFileServers(List<String> fileServers) {
-        this.fileServers = fileServers;
-    }
-
     public String getFileStore() {
         return fileStore;
     }
@@ -255,7 +250,7 @@ public class FileServiceImpl implements FileService, InitializingBean, Disposabl
             throw new RuntimeException("invald property: ${file.store} should not be empty");
         }
         // 按逗号拆分多个文件服务器地址
-        fileServers = new ArrayList<>();
+        List<String> fileServers = new ArrayList<>();
         String[] servers = StringUtils.split(fileServerString, SERVER_SPLIT);
         for (String server : servers) {
             server = StringUtils.trimToNull(server);

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

@@ -1,20 +1,5 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
@@ -23,6 +8,19 @@ import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.utils.TaskLock;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
 
 @Service
 public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implements MarkLibraryService {
@@ -54,9 +52,10 @@ 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
@@ -152,12 +151,14 @@ 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.equal(root.get("markerScoreList"), query.getQuestionScore());
-                    predicates.add(cb.or(predicate1, predicate2, predicate3));
+                    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));
                 }
                 if (query.getHeaderId() != null) {
                     predicates.add(cb.equal(root.get("headerId"), query.getHeaderId()));
@@ -165,8 +166,9 @@ 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()]));
             }
         };
     }

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

@@ -289,6 +289,7 @@ public class MarkServiceImpl implements MarkService {
         if (groupCount == 0 || unGroupQuestionCount > 0) {
             studentService.updateSubjectiveStatusAndScoreAndInspectorId(group.getExamId(), group.getSubjectCode(),
                     SubjectiveStatus.UNMARK, 0, null, null, null);
+            //studentService.resetSubjectiveStatusAndScoreWithoutTrial(group.getExamId(), group.getSubjectCode());
             inspectHistoryService.deleteByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
         } else {
             List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(
@@ -1745,6 +1746,7 @@ public class MarkServiceImpl implements MarkService {
                 if (groupCount == 0 || unGroupQuestionCount > 0) {
                     studentService.updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode,
                             SubjectiveStatus.UNMARK, 0, null, null, null);
+                    //studentService.resetSubjectiveStatusAndScoreWithoutTrial(examId, subjectCode);
                     inspectHistoryService.deleteByExamIdAndSubjectCode(examId, subjectCode);
                 } else {
                     List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(examId,

+ 8 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/school/service/impl/SchoolServiceImpl.java

@@ -127,17 +127,22 @@ public class SchoolServiceImpl extends BaseQueryService<School> implements Schoo
         for (School s : list) {
             School school = schoolDao.findByCode(s.getCode());
             if (school == null) {
-                school = s;
+                school = schoolDao.findFirstByAccessKey(s.getAccessKey());
+                if (school != null) {
+                    continue;
+                }
+                school = new School();
                 school.setCreateTime(new Date());
                 school.setProvince("");
                 school.setCity("");
+                school.setEnable(true);
             }
             school.setName(s.getName());
             school.setAccessKey(s.getAccessKey());
             school.setAccessSecret(s.getAccessSecret());
-            school.setLogoUrl(s.getLogoUrl());
+            //school.setLogoUrl(s.getLogoUrl());
             school.setUpdateTime(new Date());
-            schoolDao.saveAndFlush(school);
+            schoolDao.save(school);
         }
     }
 

+ 31 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/AppLicenseUtil.java

@@ -1,19 +1,18 @@
 package cn.com.qmth.stmms.biz.utils;
 
-import java.util.Arrays;
-
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
+import cn.com.qmth.stmms.common.utils.VersionInfo;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.qmth.boot.tools.codec.CodecUtils;
 import com.qmth.boot.tools.crypto.AES;
 import com.qmth.boot.tools.crypto.RSA;
 import com.qmth.boot.tools.device.DeviceInfo;
 import com.qmth.boot.tools.models.ByteArray;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang3.ArrayUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
 
 /**
  * 应用许可证解析工具
@@ -44,25 +43,42 @@ public class AppLicenseUtil {
     public static JSONObject parseLicense(byte[] data) {
         try {
             byte[] original = ArrayUtils.subarray(data, 1, data.length);
-            // 是否绑定硬件
+            // 不限制设备
             if (data[0] == 0) {
                 // 不绑定硬件
-            } else if (data[0] == 1) {
+            }
+            //限制设备,不限制版本
+            else if (data[0] == 1) {
                 // 获取当前设备标识
                 String deviceId = DeviceInfo.current().uuid();
                 // 使用设备标识进行AES解密
                 original = AES.decrypt(original, deviceId.substring(0, 16), deviceId.substring(16)).value();
+            }
+            //不限制设备,限制版本
+            else if (data[0] == 2) {
+                // 获取当前版本号MD5
+                String version = ByteArray.md5(VersionInfo.NAME).toHexString();
+                // 使用版本号MD5进行AES解密
+                original = AES.decrypt(original, version.substring(0, 16), version.substring(16)).value();
+            }
+            //限制设备,限制版本
+            else if (data[0] == 3) {
+                // 获取当前设备标识
+                String deviceId = DeviceInfo.current().uuid();
+                // 获取当前版本号MD5
+                String version = ByteArray.md5(VersionInfo.NAME).toHexString();
+                // 使用版本号MD5与设备标识进行两次AES解密
+                original = AES.decrypt(AES.decrypt(original, version.substring(0, 16), version.substring(16)).value(),
+                        deviceId.substring(0, 16), deviceId.substring(16)).value();
             } else {
                 return null;
             }
             // 截取前16位摘要信息
             byte[] digest = ArrayUtils.subarray(original, 0, 16);
             // 进行RSA解密
-            byte[] content = RSA
-                    .getPublicKey(
-                            ByteArray.fromInputStream(
-                                    AppLicenseUtil.class.getClassLoader().getResourceAsStream(PUBLIC_KEY_PATH)).value())
-                    .decrypt(ArrayUtils.subarray(original, 16, original.length)).value();
+            byte[] content = RSA.getPublicKey(ByteArray
+                    .fromInputStream(AppLicenseUtil.class.getClassLoader().getResourceAsStream(PUBLIC_KEY_PATH))
+                    .value()).decrypt(ArrayUtils.subarray(original, 16, original.length)).value();
             // 比对摘要是否一致
             if (Arrays.equals(digest, CodecUtils.md5(content))) {
                 return new ObjectMapper().readValue(content, JSONObject.class);

+ 48 - 41
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/SolarHttpUtil.java

@@ -1,10 +1,17 @@
 package cn.com.qmth.stmms.biz.utils;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
+import cn.com.qmth.stmms.biz.school.model.School;
+import cn.com.qmth.stmms.common.signature.SignatureInfo;
+import cn.com.qmth.stmms.common.signature.SignatureType;
+import com.qmth.boot.tools.models.ByteArray;
+import com.qmth.boot.tools.ssl.AllAcceptSSLContext;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.net.ssl.*;
+import java.io.*;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.security.cert.CertificateException;
@@ -14,27 +21,13 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSocketFactory;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import cn.com.qmth.stmms.biz.school.model.School;
-import cn.com.qmth.stmms.common.signature.SignatureInfo;
-import cn.com.qmth.stmms.common.signature.SignatureType;
-
 public class SolarHttpUtil {
 
     private static Logger log = LoggerFactory.getLogger(SolarHttpUtil.class);
 
-    /** 默认的编码格式 */
+    /**
+     * 默认的编码格式
+     */
     public static final String DEFAULT_CHARSET = "UTF-8";
 
     public static final String CONTENT_TYPE = "Content-Type";
@@ -61,11 +54,8 @@ public class SolarHttpUtil {
     }
 
     /**
-     * 
-     * @param params
-     *            headers参数
-     * @param datas
-     *            requestParams参数
+     * @param params headers参数
+     * @param datas  requestParams参数
      * @return
      */
     public String httpAction(Map<String, String> params, Map<String, Object> datas) {
@@ -84,8 +74,8 @@ public class SolarHttpUtil {
             conn.setRequestProperty(CONTENT_TYPE, APPLICATION_JSON);
             // 设置鉴权
             long time = System.currentTimeMillis();
-            String signature = SignatureInfo.build(SignatureType.SECRET, METHOD_POST, uri, time, accessKey,
-                    accessSecret);
+            String signature = SignatureInfo
+                    .build(SignatureType.SECRET, METHOD_POST, uri, time, accessKey, accessSecret);
             conn.setRequestProperty(AUTH, signature);
             conn.setRequestProperty("time", String.valueOf(time));
             // ssl
@@ -137,7 +127,7 @@ public class SolarHttpUtil {
             result = getResult(conn);
         } catch (Exception e) {
             // 操作失败
-            log.error("OrgUtil connection error!", e);
+            log.error("Solar api connection error!", e);
             e.printStackTrace();
             return null;
         } finally {
@@ -151,7 +141,7 @@ public class SolarHttpUtil {
                     is = null;
                 }
             } catch (IOException e) {
-                log.error("OrgUtil connection error!", e);
+                log.error("Solar api connection error!", e);
             }
 
             if (conn != null) {
@@ -165,9 +155,8 @@ public class SolarHttpUtil {
 
     /**
      * 获得连接请求的返回数据
-     * 
+     *
      * @param conn
-     * 
      * @return 字符串
      */
     private String getResult(HttpURLConnection conn) throws IOException {
@@ -220,7 +209,7 @@ public class SolarHttpUtil {
             Integer id = json.getInt("id");
             return true;
         } catch (Exception e) {
-            log.error("OrgUtil connection error!", e);
+            log.error("Solar api connection error!", e);
             return false;
         }
     }
@@ -256,12 +245,12 @@ public class SolarHttpUtil {
         return schools;
     }
 
-    public static void main(String[] args) {
-        SolarHttpUtil orgUtil = new SolarHttpUtil("7bbdc11570bc474dbf50e0d4a5dff328",
-                "IOodRvbp2LspJTHOScgB7Yx8MRloMpyl", "https://solar.qmth.com.cn", "/api/open/org/query");
-
-        String str = orgUtil.httpAction(null, null);
-        System.out.println(str);
+    public static void main(String[] args) throws Exception {
+        //        SolarHttpUtil orgUtil = new SolarHttpUtil("7bbdc11570bc474dbf50e0d4a5dff328",
+        //                "IOodRvbp2LspJTHOScgB7Yx8MRloMpyl", "https://solar.qmth.com.cn", "/api/open/org/query");
+        //
+        //        String str = orgUtil.httpAction(null, null);
+        //        System.out.println(str);
         // int pageNumber = 1;
         // int pageSize = 1;
         //
@@ -278,6 +267,24 @@ public class SolarHttpUtil {
         // }
         // System.out.println(str);
         // }
-
+        String server = "https://solar.qmth.com.cn";
+        String uri = "/api/open/app/info";
+        String accessKey = "7bbdc11570bc474dbf50e0d4a5dff328";
+        String accessSecret = "IOodRvbp2LspJTHOScgB7Yx8MRloMpyl";
+        HttpsURLConnection conn = (HttpsURLConnection) new URL(server + uri).openConnection();
+        conn.setSSLSocketFactory(AllAcceptSSLContext.get().getSocketFactory());
+        conn.setHostnameVerifier((s, sslSession) -> true);
+        conn.setInstanceFollowRedirects(false);
+        conn.setRequestMethod(METHOD_POST);
+        conn.setConnectTimeout(5000);
+        conn.setReadTimeout(5000);
+        // 设置鉴权
+        long time = System.currentTimeMillis();
+        String signature = SignatureInfo.build(SignatureType.SECRET, METHOD_POST, uri, time, accessKey, accessSecret);
+        conn.setRequestProperty(AUTH, signature);
+        conn.setRequestProperty("time", String.valueOf(time));
+        InputStream ins = conn.getInputStream();
+        System.out.println(ByteArray.fromInputStream(ins).toString());
+        ins.close();
     }
 }

+ 11 - 0
stmms-common/src/main/java/cn/com/qmth/stmms/common/utils/VersionInfo.java

@@ -0,0 +1,11 @@
+package cn.com.qmth.stmms.common.utils;
+
+/**
+ * 当前代码版本信息,每次迭代时需要同步修改
+ */
+public class VersionInfo {
+
+    public static final String NAME = "1.3.10";
+
+    public static final String DATE = "20221223";
+}

+ 22 - 27
stmms-web/src/main/java/cn/com/qmth/stmms/admin/config/SystemAuthController.java

@@ -1,28 +1,5 @@
 package cn.com.qmth.stmms.admin.config;
 
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.util.Date;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import net.sf.json.JSONObject;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.biz.config.model.SystemAuth;
 import cn.com.qmth.stmms.biz.config.service.SystemAuthService;
 import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
@@ -38,8 +15,27 @@ import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.SystemAuthType;
 import cn.com.qmth.stmms.common.utils.AesUtils;
 import cn.com.qmth.stmms.common.utils.Encodes;
-
 import com.qmth.boot.tools.models.ByteArray;
+import net.sf.json.JSONObject;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
 
 @Controller
 @RequestMapping("/admin/sys/auth")
@@ -111,8 +107,8 @@ public class SystemAuthController extends BaseController {
                 JSONObject json = AppLicenseUtil.parseLicense(ByteArray.fromInputStream(file.getInputStream()).value());
                 if (json != null) {
                     authCache.setAuth(true);
-                    if (json.has("control") && json.getJSONObject("control").has("expireTime")
-                            && StringUtils.isNotBlank(json.getJSONObject("control").getString("expireTime"))) {
+                    if (json.has("control") && json.getJSONObject("control").has("expireTime") && StringUtils
+                            .isNotBlank(json.getJSONObject("control").getString("expireTime"))) {
                         Long expireTime = json.getJSONObject("control").getLong("expireTime");
                         authCache.setExpireTime(expireTime);
                         List<School> list = schoolService.parseJson(json.getString("orgs"));
@@ -124,7 +120,6 @@ public class SystemAuthController extends BaseController {
                 }
                 authService.save(systemAuth);
             } catch (IOException e) {
-                e.printStackTrace();
                 log.error("parseLicense error", e);
             }
         }

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkerDTO.java

@@ -13,7 +13,7 @@ public class MarkerDTO {
     @ExcelField(title = "评卷分组", align = 2, sort = 30)
     private int groupNumber;
 
-    @ExcelField(title = "分组题目", align = 2, sort = 40)
+    @ExcelField(title = "分组题目", align = 2, sort = 40)
     private String groupName;
 
     @ExcelField(title = "角色", align = 2, sort = 50)

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkerInfoDTO.java

@@ -34,7 +34,7 @@ public class MarkerInfoDTO {
     public MarkerInfoDTO(Marker marker, ExamSubject subject, MarkGroup group) {
         setSubjectCode(subject.getCode());
         setSubjectName(subject.getName());
-        setGroupName(group.getTitle());
+        setGroupName(group.getQuestionTitle());
         setGroupNumber(String.valueOf(group.getNumber()));
         setLoginName(marker.getUser().getLoginName());
         setName(marker.getUser().getName());

+ 44 - 54
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -1,41 +1,12 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.dto.RejectResult;
 import cn.com.qmth.stmms.admin.vo.InspectedSubjectVO;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 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.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.InspectHistoryService;
-import cn.com.qmth.stmms.biz.exam.service.InspectedService;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
@@ -45,13 +16,25 @@ import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.ExamType;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.enums.SelectiveStatus;
-import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
 
 @Controller("inspectedController")
 @RequestMapping("/admin/exam/inspected")
@@ -113,16 +96,17 @@ public class InspectedController extends BaseExamController {
             subjectList.forEach(e -> subjectCodeIn.add(e.getCode()));
             query.setSubjectCodeIn(StringUtils.join(subjectCodeIn, ","));
         }
-        List<ExamStudent> list = inspectedService.findByQuery(query, status, mainNumber, mainStartScore, mainEndScore,
-                questionScore, selectiveStatus);
+        List<ExamStudent> list = inspectedService
+                .findByQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore, selectiveStatus);
         for (ExamStudent e : list) {
             e.setSubjectiveScoreList(e.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
             e.setInspectHistoryList(inspectHistoryService.findByStudentIdLimit3(e.getId()));
         }
-        Integer totalCount = inspectedService.countByQuery(query, status, mainNumber, mainStartScore, mainEndScore,
-                questionScore, selectiveStatus);
-        Integer inspectCount = inspectedService.countByQuery(query, SubjectiveStatus.MARKED, mainNumber,
-                mainStartScore, mainEndScore, questionScore, selectiveStatus);
+        Integer totalCount = inspectedService
+                .countByQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore, selectiveStatus);
+        Integer inspectCount = inspectedService
+                .countByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore, mainEndScore, questionScore,
+                        selectiveStatus);
         query.setResult(list);
         query.setTotalCount(totalCount);
         model.addAttribute("query", query);
@@ -145,8 +129,7 @@ public class InspectedController extends BaseExamController {
     @Logging(menu = "开始考生复核", type = LogType.QUERY)
     @RequestMapping(value = "/getTask", method = RequestMethod.POST)
     @ResponseBody
-    public Task getTask(HttpServletRequest request, RedirectAttributes redirectAttributes,
-            ExamStudentSearchQuery query,
+    public Task getTask(HttpServletRequest request, RedirectAttributes redirectAttributes, ExamStudentSearchQuery query,
             @RequestParam(required = false, defaultValue = "false") SelectiveStatus selectiveStatus,
             @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
             @RequestParam(required = false) Double mainEndScore, @RequestParam(required = false) Double questionScore,
@@ -182,8 +165,9 @@ public class InspectedController extends BaseExamController {
             if (StringUtils.isBlank(query.getSubjectCode()) && !subjectList.isEmpty()) {
                 query.setSubjectCode(subjectList.get(0).getCode());
             }
-            list = inspectedService.findByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore,
-                    mainEndScore, questionScore, selectiveStatus);
+            list = inspectedService
+                    .findByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore, mainEndScore,
+                            questionScore, selectiveStatus);
             if (list.isEmpty()) {
                 break;
             }
@@ -205,9 +189,12 @@ public class InspectedController extends BaseExamController {
     @ResponseBody
     public Object save(HttpServletRequest request, @RequestParam Integer studentId) {
         WebUser wu = RequestUtils.getWebUser(request);
+        ExamStudent student = studentService.findById(studentId);
         JSONObject obj = new JSONObject();
         try {
-            if (lockService.trylock(LockType.STUDENT, studentId) && inspectedService.inspect(studentId, wu.getId())) {
+            if (student != null && lockService.trylock(LockType.STUDENT, studentId) && inspectedService
+                    .inspect(student, wu.getId())) {
+                inspectedService.releaseByStudent(student);
                 obj.accumulate("success", true);
             } else {
                 obj.accumulate("success", false);
@@ -286,7 +273,8 @@ public class InspectedController extends BaseExamController {
             return obj;
         }
         if ((inspectedService.hasApplied(student, wu.getId()) && (student.getSubjectiveStatus()
-                .equals(SubjectiveStatus.MARKED))) || student.getSubjectiveStatus().equals(SubjectiveStatus.INSPECTED)) {
+                .equals(SubjectiveStatus.MARKED))) || student.getSubjectiveStatus()
+                .equals(SubjectiveStatus.INSPECTED)) {
             if (subjectCheck(student.getSubjectCode(), wu) && lockService.trylock(LockType.STUDENT, student.getId())) {
                 try {
                     lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
@@ -317,8 +305,8 @@ public class InspectedController extends BaseExamController {
     @Logging(menu = "回看全卷复核任务", type = LogType.QUERY)
     @RequestMapping(value = "/getHistory", method = RequestMethod.POST)
     @ResponseBody
-    public Object getHistory(HttpServletRequest request, @RequestParam String subjectCode,
-            @RequestParam int pageNumber, @RequestParam int pageSize) throws Exception {
+    public Object getHistory(HttpServletRequest request, @RequestParam String subjectCode, @RequestParam int pageNumber,
+            @RequestParam int pageSize) throws Exception {
         int examId = getSessionExamId(request);
         WebUser wu = RequestUtils.getWebUser(request);
         List<Task> list = new ArrayList<>();
@@ -348,8 +336,9 @@ public class InspectedController extends BaseExamController {
         JSONObject status = new JSONObject();
         int examId = getSessionExamId(request);
         query.setExamId(examId);
-        Integer totalCount = inspectedService.countByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore,
-                mainEndScore, questionScore, selectiveStatus);
+        Integer totalCount = inspectedService
+                .countByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore, mainEndScore, questionScore,
+                        selectiveStatus);
         status.accumulate("totalCount", totalCount);
         status.accumulate("valid", true);
         return status;
@@ -475,8 +464,9 @@ public class InspectedController extends BaseExamController {
             long totalCount = studentService.countByQuery(sQuery);
             vo.setTotalCount(totalCount);
             vo.setLeftCount(totalCount - inspectedCount);
-            String percent = totalCount > 0 ? (new DecimalFormat("####.###")
-                    .format(inspectedCount * 100.0 / totalCount) + "%") : "100%";
+            String percent = totalCount > 0 ?
+                    (new DecimalFormat("####.###").format(inspectedCount * 100.0 / totalCount) + "%") :
+                    "100%";
             vo.setPercent(percent);
             vo.setFinishCount(studentService.findMinInspectCountByExamIdAndSubjectCode(examId, subject.getCode()));
             list.add(vo);

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

@@ -638,6 +638,7 @@ public class MarkGroupController extends BaseExamController {
 
                     studentService.updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode,
                             SubjectiveStatus.UNMARK, 0, null, null, null);
+                    //studentService.resetSubjectiveStatusAndScoreWithoutTrial(examId, subjectCode);
                     inspectHistoryService.deleteByExamIdAndSubjectCode(examId, subjectCode);
                     redirectAttributes.addAttribute("subjectCode", subjectCode);
                     return "redirect:/admin/exam/group";

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

@@ -796,6 +796,7 @@ public class PaperController extends BaseExamController {
             if (!question.isObjective()) {
                 studentService.updateSubjectiveStatusAndScoreAndInspectorId(examId, question.getSubjectCode(),
                         SubjectiveStatus.UNMARK, 0, null, null, null);
+                //studentService.resetSubjectiveStatusAndScoreWithoutTrial(examId, question.getSubjectCode());
                 inspectHistoryService.deleteByExamIdAndSubjectCode(examId, question.getSubjectCode());
             }
         }

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java

@@ -328,7 +328,7 @@ public class UserController extends BaseExamController {
                                 subject.getCode(), false, group.getNumber()));
                         groupMap.put(groupKey, group);
                     }
-                    s.setGroupName(group.getTitle());
+                    s.setGroupName(group.getQuestionTitle());
                     s.setGroupNumber(m.getGroupNumber());
                     s.setRole(Role.MARKER.getName());
                     s.setLoginName(userService.findById(m.getUserId()).getLoginName());

+ 23 - 14
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/LoginController.java

@@ -1,5 +1,19 @@
 package cn.com.qmth.stmms.common.controller;
 
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
+
 import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
@@ -12,20 +26,7 @@ import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.utils.EncryptUtils;
 import cn.com.qmth.stmms.common.utils.RequestIPUtil;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.servlet.ModelAndView;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import java.util.Date;
+import cn.com.qmth.stmms.common.utils.VersionInfo;
 
 @Controller
 public class LoginController {
@@ -59,6 +60,8 @@ public class LoginController {
     public ModelAndView login(HttpServletRequest request) {
         ModelAndView view = new ModelAndView("modules/sys/login");
         view.addObject("indexLogo", indexLogo);
+        view.addObject("versionName", VersionInfo.NAME);
+        view.addObject("versionDate", VersionInfo.DATE);
         return view;
     }
 
@@ -70,6 +73,8 @@ public class LoginController {
         User u = userService.findByLoginName(user.getLoginName());
         ModelAndView modelAndView = new ModelAndView("modules/sys/login");
         modelAndView.addObject("indexLogo", indexLogo);
+        modelAndView.addObject("versionName", VersionInfo.NAME);
+        modelAndView.addObject("versionDate", VersionInfo.DATE);
         modelAndView.addObject(LOGIN_TYPE_KEY, loginType);
         if (u == null) {
             modelAndView.addObject("message", "user.login.error.account");
@@ -151,6 +156,8 @@ public class LoginController {
         ModelAndView view = new ModelAndView("modules/sys/login");
         view.addObject(LOGIN_TYPE_KEY, MARK_LOGIN_ONLY);
         view.addObject("indexLogo", indexLogo);
+        view.addObject("versionName", VersionInfo.NAME);
+        view.addObject("versionDate", VersionInfo.DATE);
         return view;
     }
 
@@ -161,6 +168,8 @@ public class LoginController {
         User u = userService.findByLoginName(user.getLoginName());
         ModelAndView modelAndView = new ModelAndView("modules/sys/login");
         modelAndView.addObject("indexLogo", indexLogo);
+        modelAndView.addObject("versionName", VersionInfo.NAME);
+        modelAndView.addObject("versionDate", VersionInfo.DATE);
         modelAndView.addObject(LOGIN_TYPE_KEY, MARK_LOGIN_ONLY);
         if (!authCache.isAuth()
                 || (authCache.getExpireTime() != null && new Date(authCache.getExpireTime()).before(new Date()))) {

+ 7 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/utils/RequestUtils.java

@@ -11,6 +11,7 @@ import javax.servlet.http.HttpServletResponse;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
+import cn.com.qmth.stmms.common.utils.VersionInfo;
 
 /**
  * request临时参数存取
@@ -24,6 +25,10 @@ public class RequestUtils {
     private static final String REQUEST_API_USER_KEY = "api_user";
 
     private static final String REQUEST_OPERATION_LOG_KEY = "operation_log";
+    
+    private static final String REQUEST_VERSION_NAME="versionName";
+    
+    private static final String REQUEST_VERSION_DATE="versionDate";
 
     public static StmmsSession getSession(HttpServletRequest request) {
         Object obj = request.getAttribute(REQUEST_SESSION_KEY);
@@ -51,6 +56,8 @@ public class RequestUtils {
 
     public static void setWebUser(HttpServletRequest request, WebUser user) {
         request.setAttribute(REQUEST_WEB_USER_KEY, user);
+        request.setAttribute(REQUEST_VERSION_DATE, VersionInfo.DATE);
+        request.setAttribute(REQUEST_VERSION_NAME, VersionInfo.NAME);
     }
 
     public static ApiUser getApiUser(HttpServletRequest request) {

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examIndex.jsp

@@ -178,7 +178,7 @@
             <%-- 			    <%@include file="/WEB-INF/views/include/picConfig.jsp" %> --%>
         </div>
         <div id="footer" class="row-fluid">
-            Copyright &copy; 2021 云阅卷 - Powered By <a href="http://www.qmth.com.cn" target="_blank">启明泰和 v1.3.9 bate221118</a>
+            Copyright &copy; 2021 云阅卷 - Powered By <a href="http://www.qmth.com.cn" target="_blank">启明泰和 v${versionName} beta${versionDate}</a>
         </div>
     </div>
 </div>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examSelect.jsp

@@ -65,7 +65,7 @@
         <div class="left">
             <%-- <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div> --%>
              <p>
-				<a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)">Copyright &#169 2021 启明泰和 v1.3.9 bate221118</a><br/>
+				<a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)">Copyright &#169 2021 启明泰和 v${versionName} beta${versionDate}</a><br/>
 				<a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
 			</p>
         </div>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/selectiveAdd.jsp

@@ -55,7 +55,7 @@
 	</table>
 	</form>
 	<div class="pull-right">
-		<a href="javascript:" onclick="history.go(-1);" class="btn">返回</a>
+		<a href="javascript:" onclick="history.back();" class="btn">返回</a>
 		&nbsp;&nbsp;		
 		<c:if test="${selectivePart>selectivePartNo }">
 			<a href="#" class="btn btn-primary" id="btnNext">下一步</a>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/reset.jsp

@@ -68,7 +68,7 @@
     <div class="middle cl">
         <div class="left">
             <%-- <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div> --%>
-            <a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)"><p>Copyright &#169 2021 启明泰和 v1.3.9 bate221118</p></a>
+            <a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)"><p>Copyright &#169 2021 启明泰和 v${versionName} beta${versionDate}</p></a>
         </div>
         <div class="right">
             <div class="title">

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/subjectSelect.jsp

@@ -102,7 +102,7 @@
         <div class="left">
             <%-- <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div> --%>
              <p>
-				<a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)">Copyright &#169 2021 启明泰和 v1.3.9 bate221118</a><br/>
+				<a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)">Copyright &#169 2021 启明泰和 v${versionName} beta${versionDate}</a><br/>
 				<a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
 			</p>
         </div>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/sys/login.jsp

@@ -34,7 +34,7 @@
                     src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/>
             </div> --%>
             <p>
-				<a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)">Copyright &#169 2021 启明泰和 v1.3.9 bate221118</a><br/>
+				<a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)">Copyright &#169 2021 启明泰和 v${versionName} beta${versionDate}</a><br/>
 				<a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
 			</p>
         </div>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/sys/reset.jsp

@@ -69,7 +69,7 @@
         <div class="left">
             <%-- <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div> --%>
              <p>
-				<a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)">Copyright &#169 2021 启明泰和 v1.3.9 bate221118</a><br/>
+				<a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)">Copyright &#169 2021 启明泰和 v${versionName} beta${versionDate}</a><br/>
 				<a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
 			</p>
         </div>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/sys/sysIndex.jsp

@@ -104,7 +104,7 @@
 				</div>
 			</div>
 		    <div id="footer" class="row-fluid">
-	            Copyright &copy; 2021 云阅卷 - Powered By <a href="http://www.qmth.com.cn" target="_blank">启明泰和 v1.3.9 bate221118</a>
+	            Copyright &copy; 2021 云阅卷 - Powered By <a href="http://www.qmth.com.cn" target="_blank">启明泰和 v${versionName} beta${versionDate}</a>
 			</div>
 		</div>
 	</div>