Forráskód Böngészése

修改同步工具结构,新增复核人id,多媒体传输密号改为准考证号,修复一些bug

ting.yin 4 éve
szülő
commit
57ecc1b25b

+ 8 - 9
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -68,9 +68,9 @@ public interface ExamStudentDao
     public void updateSubjectiveStatusAndScore(Integer id, SubjectiveStatus status, double score, String scoreList);
 
     @Modifying
-    @Query("update ExamStudent s set s.subjectiveStatus=?3, s.subjectiveScore=?4, s.subjectiveScoreList=?5,s.inspectTime=?6 where s.examId=?1 and s.subjectCode=?2")
-    public void updateSubjectiveStatusAndScore(Integer examId, String subjetCode, SubjectiveStatus status, double score,
-            String scoreList, Date inspectTime);
+    @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")
+    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 "
@@ -142,8 +142,7 @@ public interface ExamStudentDao
 
     @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false and s.uploadTime!=null "
             + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
-    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber,
-            Pageable page);
+    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber, Pageable page);
 
     @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false and s.uploadTime!=null and s.uploadTime>=?4 "
             + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
@@ -170,8 +169,7 @@ public interface ExamStudentDao
     public List<String> findDistinctClassName(Integer examId, String subjectCode);
 
     @Query(value = "select s.objective_score+s.subjective_score from eb_exam_student s where s.exam_id=?1 and s.subject_code=?2 and s.is_upload =true and s.is_absent=false and s.is_breach=false order by s.objective_score+s.subjective_score desc limit ?3 ", nativeQuery = true)
-    public List<Double> findHighCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode,
-            int highCount);
+    public List<Double> findHighCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode, int highCount);
 
     @Query(value = "select s.objective_score+s.subjective_score from eb_exam_student s where s.exam_id=?1 and s.subject_code=?2 and s.is_upload =true and s.is_absent=false and s.is_breach=false order by s.objective_score+s.subjective_score asc limit ?3 ", nativeQuery = true)
     public List<Double> findLowCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode, int lowCount);
@@ -188,7 +186,8 @@ public interface ExamStudentDao
     public List<String> findDistinctClassName(Integer examId);
 
     @Modifying
-    @Query("update ExamStudent s set s.subjectiveStatus=?2, s.inspectTime=?3 where s.id=?1 ")
-    public void updateSubjectiveStatusAndTime(Integer studentId, SubjectiveStatus status, Date inspectTime);
+    @Query("update ExamStudent s set s.subjectiveStatus=?2, s.inspectTime=?3 ,s.inspectorId=?4 where s.id=?1 ")
+    public void updateSubjectiveStatusAndTimeAndInspectorId(Integer studentId, SubjectiveStatus status,
+            Date inspectTime, Integer inspectorId);
 
 }

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

@@ -260,6 +260,12 @@ public class ExamStudent implements Serializable {
     @Column(name = "inspect_time", nullable = true)
     private Date inspectTime;
 
+    /**
+     * 复核人id
+     */
+    @Column(name = "inspector_id")
+    private Integer inspectorId;
+
     /**
      * 科目备注信息
      */
@@ -818,4 +824,12 @@ public class ExamStudent implements Serializable {
         this.examName = examName;
     }
 
+    public Integer getInspectorId() {
+        return inspectorId;
+    }
+
+    public void setInspectorId(Integer inspectorId) {
+        this.inspectorId = inspectorId;
+    }
+
 }

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

@@ -63,8 +63,8 @@ public interface ExamStudentService {
 
     void updateSubjectInfo(ExamSubject subject);
 
-    void updateSubjectiveStatusAndScore(Integer examId, String subjectCode, SubjectiveStatus status, double score,
-            String scoreList, Date inspectTime);
+    void updateSubjectiveStatusAndScoreAndInspectorId(Integer examId, String subjectCode, SubjectiveStatus status,
+            double score, String scoreList, Date inspectTime, Integer inspectorId);
 
     void updateSubjectiveStatusAndScore(Integer id, SubjectiveStatus status, double score, String scoreList);
 
@@ -141,5 +141,6 @@ public interface ExamStudentService {
 
     public List<String> findDistinctClassName(Integer examId);
 
-    public void updateSubjectiveStatusAndTime(Integer studentId, SubjectiveStatus inspected, Date inspectTime);
+    public void updateSubjectiveStatusAndTimeAndInspectorId(Integer studentId, SubjectiveStatus inspected,
+            Date inspectTime, Integer inspectorId);
 }

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

@@ -416,9 +416,10 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
 
     @Override
     @Transactional
-    public void updateSubjectiveStatusAndScore(Integer examId, String subjectCode, SubjectiveStatus status,
-            double score, String scoreList, Date inspectTime) {
-        studentDao.updateSubjectiveStatusAndScore(examId, subjectCode, status, score, scoreList, inspectTime);
+    public void updateSubjectiveStatusAndScoreAndInspectorId(Integer examId, String subjectCode,
+            SubjectiveStatus status, double score, String scoreList, Date inspectTime, Integer inspectorId) {
+        studentDao.updateSubjectiveStatusAndScore(examId, subjectCode, status, score, scoreList, inspectTime,
+                inspectorId);
     }
 
     @Override
@@ -734,8 +735,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);
@@ -997,7 +997,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
 
     @Transactional
     @Override
-    public void updateSubjectiveStatusAndTime(Integer studentId, SubjectiveStatus status, Date inspectTime) {
-        studentDao.updateSubjectiveStatusAndTime(studentId, status, inspectTime);
+    public void updateSubjectiveStatusAndTimeAndInspectorId(Integer studentId, SubjectiveStatus status,
+            Date inspectTime, Integer inspectorId) {
+        studentDao.updateSubjectiveStatusAndTimeAndInspectorId(studentId, status, inspectTime, inspectorId);
     }
 }

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

@@ -89,7 +89,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷分组已申请的评卷任务数量
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      * @return int
      */
     @Override
@@ -106,7 +107,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷员已申请的评卷任务数量
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      * @return int
      */
     @Override
@@ -128,7 +130,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷员已完成的评卷任务数量
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      * @return long
      */
     @Override
@@ -151,7 +154,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷分组的锁定任务
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     @Override
     public void releaseByGroup(MarkGroup group) {
@@ -165,7 +169,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置某个评卷分组的所有评卷任务
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     @Override
     @Transactional
@@ -176,7 +181,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 删除某个评卷分组
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     @Override
     @Transactional
@@ -218,9 +224,8 @@ public class MarkServiceImpl implements MarkService {
                 sumTotalScore(group.getExamId(), group.getSubjectCode()));
         // 考生整体状态与总分更新
         long groupCount = groupDao.countByExamIdAndSubjectCode(group.getExamId(), group.getSubjectCode());
-        List<Integer> studentList = studentService
-                .findIdByExamIdAndSubjectCodeAndSubjectiveStatus(group.getExamId(), group.getSubjectCode(),
-                        SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED, SubjectiveStatus.INSPECTED);
+        List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(group.getExamId(),
+                group.getSubjectCode(), SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED, SubjectiveStatus.INSPECTED);
         for (Integer studentId : studentList) {
             checkStudentSubjective(studentId, groupCount);
         }
@@ -229,7 +234,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 修改某个评卷分组给分步骤,并重置评卷任务
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     @Override
     @Transactional
@@ -253,8 +259,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员申请领取某个正式评卷任务
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 正评任务
+     * @param marker
+     *            - 评卷员
      */
     @Override
     public boolean applyLibrary(MarkLibrary library, Marker marker) {
@@ -270,8 +278,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员申请领取某个试评评卷任务
      *
-     * @param library - 试评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 试评任务
+     * @param marker
+     *            - 评卷员
      * @return boolean
      */
     @Override
@@ -282,8 +292,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员是否已领取了某个正式评卷任务
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 正评任务
+     * @param marker
+     *            - 评卷员
      * @return boolean
      */
     @Override
@@ -294,8 +306,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员是否已领取了某个试评评卷任务
      *
-     * @param library - 试评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 试评任务
+     * @param marker
+     *            - 评卷员
      * @return boolean
      */
     @Override
@@ -306,8 +320,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员已领取的正评任务
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 正评任务
+     * @param marker
+     *            - 评卷员
      */
     @Override
     public void releaseLibrary(MarkLibrary library, Marker marker) {
@@ -317,8 +333,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员已领取的试评任务
      *
-     * @param library - 试评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 试评任务
+     * @param marker
+     *            - 评卷员
      */
     @Override
     public void releaseLibrary(TrialLibrary library, Marker marker) {
@@ -328,7 +346,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员的所有锁定任务
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      */
     @Override
     public void releaseByMarker(Marker marker) {
@@ -339,7 +358,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置某个评卷员
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      */
     @Override
     @Transactional
@@ -350,24 +370,33 @@ public class MarkServiceImpl implements MarkService {
         }
         if (group.getStatus() == MarkStatus.FORMAL) {
             // 仲裁和等待仲裁的任务不被重置
-            //trackDao.deleteByMarkerId(marker.getId(), LibraryStatus.ARBITRATED, LibraryStatus.WAIT_ARBITRATE,
-            //        LibraryStatus.PROBLEM);
-            //specialTagDao.deleteByMarkerId(marker.getId(), LibraryStatus.ARBITRATED, LibraryStatus.WAIT_ARBITRATE,
-            //        LibraryStatus.PROBLEM);
-            //libraryDao.resetByMarkerId(marker.getId(), LibraryStatus.WAITING, LibraryStatus.ARBITRATED,
-            //        LibraryStatus.WAIT_ARBITRATE, LibraryStatus.PROBLEM);
+            // trackDao.deleteByMarkerId(marker.getId(),
+            // LibraryStatus.ARBITRATED, LibraryStatus.WAIT_ARBITRATE,
+            // LibraryStatus.PROBLEM);
+            // specialTagDao.deleteByMarkerId(marker.getId(),
+            // LibraryStatus.ARBITRATED, LibraryStatus.WAIT_ARBITRATE,
+            // LibraryStatus.PROBLEM);
+            // libraryDao.resetByMarkerId(marker.getId(), LibraryStatus.WAITING,
+            // LibraryStatus.ARBITRATED,
+            // LibraryStatus.WAIT_ARBITRATE, LibraryStatus.PROBLEM);
             // 原遍历模式改为SQL批量更新模式,提高执行速度
-            //groupStudentDao.updateStatusByMarkLibraryStatus(marker.getExamId(), marker.getSubjectCode(),
-            //        marker.getGroupNumber(), SubjectiveStatus.UNMARK, LibraryStatus.WAITING);
-            //scoreDao.deleteByStudentGroupStatus(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
-            //        SubjectiveStatus.UNMARK);
-            //studentService.resetSubjectiveStatusByGroupStatus(marker.getExamId(), marker.getSubjectCode());
+            // groupStudentDao.updateStatusByMarkLibraryStatus(marker.getExamId(),
+            // marker.getSubjectCode(),
+            // marker.getGroupNumber(), SubjectiveStatus.UNMARK,
+            // LibraryStatus.WAITING);
+            // scoreDao.deleteByStudentGroupStatus(marker.getExamId(),
+            // marker.getSubjectCode(), marker.getGroupNumber(),
+            // SubjectiveStatus.UNMARK);
+            // studentService.resetSubjectiveStatusByGroupStatus(marker.getExamId(),
+            // marker.getSubjectCode());
             // 只选取评卷完成状态的记录重新检查
-            //List<Integer> studentIdList = groupStudentDao.findStudentIdByGroupNumberAndStatus(marker.getExamId(),
-            //        marker.getSubjectCode(), marker.getGroupNumber(), SubjectiveStatus.MARKED);
-            //for (Integer studentId : studentIdList) {
-            //    checkStudentGroup(studentId, group);
-            //}
+            // List<Integer> studentIdList =
+            // groupStudentDao.findStudentIdByGroupNumberAndStatus(marker.getExamId(),
+            // marker.getSubjectCode(), marker.getGroupNumber(),
+            // SubjectiveStatus.MARKED);
+            // for (Integer studentId : studentIdList) {
+            // checkStudentGroup(studentId, group);
+            // }
             // 遍历相关评卷任务的模式
             List<MarkLibrary> list = libraryDao.findByMarkerIdAndStatusNotIn(marker.getId(), LibraryStatus.ARBITRATED,
                     LibraryStatus.WAIT_ARBITRATE, LibraryStatus.PROBLEM);
@@ -392,7 +421,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生删除评卷任务
      *
-     * @param student - 考生
+     * @param student
+     *            - 考生
      */
     @Override
     @Transactional
@@ -417,8 +447,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员提交评卷任务
      *
-     * @param result - 评卷结果
-     * @param marker - 评卷员
+     * @param result
+     *            - 评卷结果
+     * @param marker
+     *            - 评卷员
      * @return boolean
      */
     @Override
@@ -426,8 +458,8 @@ public class MarkServiceImpl implements MarkService {
     public boolean submitTask(MarkResult result, Marker marker) {
         // 判断评卷分组是否存在/评卷是否结束
         MarkGroup group = groupDao.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
-        if (group == null || group.getStatus() == MarkStatus.FINISH || group.getStatus().getValue() != result
-                .getStatusValue()) {
+        if (group == null || group.getStatus() == MarkStatus.FINISH
+                || group.getStatus().getValue() != result.getStatusValue()) {
             return false;
         }
 
@@ -445,10 +477,10 @@ public class MarkServiceImpl implements MarkService {
                     return true;
                 }
             }
-            if (library != null && library.getExamId().equals(group.getExamId()) && library.getSubjectCode()
-                    .equals(group.getSubjectCode()) && library.getGroupNumber().equals(group.getNumber())
-                    && result.getTotalScore() <= group.getTotalScore() && StringUtils
-                    .isNotBlank(result.getScoreList())) {
+            if (library != null && library.getExamId().equals(group.getExamId())
+                    && library.getSubjectCode().equals(group.getSubjectCode())
+                    && library.getGroupNumber().equals(group.getNumber())
+                    && result.getTotalScore() <= group.getTotalScore() && StringUtils.isNotBlank(result.getScoreList())) {
                 if (submitLibrary(library, marker, group, result)) {
                     updateMarkedCount(group);
                     releaseLibrary(library, marker);
@@ -457,10 +489,10 @@ public class MarkServiceImpl implements MarkService {
             }
         } else if (group.getStatus() == MarkStatus.TRIAL) {
             TrialLibrary library = trialLibraryDao.findOne(result.getLibraryId());
-            if (library != null && library.getExamId().equals(group.getExamId()) && library.getSubjectCode()
-                    .equals(group.getSubjectCode()) && library.getGroupNumber().equals(group.getNumber())
-                    && result.getTotalScore() <= group.getTotalScore() && StringUtils
-                    .isNotBlank(result.getScoreList())) {
+            if (library != null && library.getExamId().equals(group.getExamId())
+                    && library.getSubjectCode().equals(group.getSubjectCode())
+                    && library.getGroupNumber().equals(group.getNumber())
+                    && result.getTotalScore() <= group.getTotalScore() && StringUtils.isNotBlank(result.getScoreList())) {
                 TrialHistory history = new TrialHistory();
                 history.setExamId(library.getExamId());
                 history.setSubjectCode(library.getSubjectCode());
@@ -512,10 +544,14 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员提交某个正评任务
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
-     * @param group   - 评卷分组
-     * @param result  - 评卷结果
+     * @param library
+     *            - 正评任务
+     * @param marker
+     *            - 评卷员
+     * @param group
+     *            - 评卷分组
+     * @param result
+     *            - 评卷结果
      */
     private boolean submitLibrary(MarkLibrary library, Marker marker, MarkGroup group, MarkResult result) {
         // 非本人领取的待评任务
@@ -533,8 +569,9 @@ public class MarkServiceImpl implements MarkService {
         }
         // 尝试提交评卷结果
         Date now = new Date();
-        if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(), result.getTotalScore(),
-                result.getScoreList(), now, result.getSpent(), LibraryStatus.WAITING, LibraryStatus.MARKED) == 0) {
+        if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(),
+                result.getTotalScore(), result.getScoreList(), now, result.getSpent(), LibraryStatus.WAITING,
+                LibraryStatus.MARKED) == 0) {
             // 条件不符更新失败,直接返回
             return false;
         }
@@ -555,9 +592,8 @@ public class MarkServiceImpl implements MarkService {
         ArbitrateHistory history = null;
         if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
             // 多评模式
-            List<MarkLibrary> list = libraryDao
-                    .findByStudentIdAndGroupNumberAndStatus(library.getStudentId(), library.getGroupNumber(),
-                            LibraryStatus.MARKED);
+            List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumberAndStatus(library.getStudentId(),
+                    library.getGroupNumber(), LibraryStatus.MARKED);
             for (MarkLibrary other : list) {
                 if (other.getId().equals(library.getId()) || other.getHeaderScore() != null) {
                     // 本评卷任务或组长已打分,则跳过该任务
@@ -567,13 +603,12 @@ public class MarkServiceImpl implements MarkService {
                 if (Math.abs(other.getMarkerScore() - result.getTotalScore()) > group.getArbitrateThreshold()) {
                     // 开启三评
                     if (group.getThirdPolicy().equals(ThirdPolicy.LOW_DIFF_HIGH_AVG)) {
-                        if (libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber())
-                                == 2) {
+                        if (libraryDao.countByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber()) == 2) {
                             buildThirdLibrary(library, group);
                         } else {
                             // 两两比较,触发仲裁
-                            List<MarkLibrary> libraries = libraryDao
-                                    .findByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
+                            List<MarkLibrary> libraries = libraryDao.findByStudentIdAndGroupNumber(
+                                    library.getStudentId(), library.getGroupNumber());
                             history = buildArbitrateHistory(libraries, group.getArbitrateThreshold(), now);
                         }
                     } else {
@@ -650,7 +685,8 @@ public class MarkServiceImpl implements MarkService {
      * 管理员/组长打回某个评卷任务<br>
      * 暂时不用到BACKED状态,直接等同于重置该评卷任务
      *
-     * @param library - 正评任务
+     * @param library
+     *            - 正评任务
      */
     @Override
     @Transactional
@@ -659,15 +695,14 @@ public class MarkServiceImpl implements MarkService {
         if (group.getStatus() == MarkStatus.FINISH) {
             return false;
         }
-        if (libraryDao.resetById(library.getId(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.PROBLEM)
-                > 0) {
+        if (libraryDao.resetById(library.getId(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.PROBLEM) > 0) {
             trackDao.deleteByLibraryId(library.getId());
             specialTagDao.deleteByLibraryId(library.getId());
             resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
                     library.getGroupNumber());
             updateMarkedCount(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
-            problemHistoryDao
-                    .resetByLibraryId(library.getId(), HistoryStatus.WAITING, userId, HistoryStatus.BACK, new Date());
+            problemHistoryDao.resetByLibraryId(library.getId(), HistoryStatus.WAITING, userId, HistoryStatus.BACK,
+                    new Date());
             return true;
         } else {
             return false;
@@ -677,7 +712,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 管理员/组长重置某个试评任务
      *
-     * @param library - 试评任务
+     * @param library
+     *            - 试评任务
      */
     @Override
     @Transactional
@@ -695,7 +731,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 管理员/组长处理仲裁卷
      *
-     * @param history - 仲裁卷
+     * @param history
+     *            - 仲裁卷
      */
     @Override
     @Transactional
@@ -786,12 +823,12 @@ public class MarkServiceImpl implements MarkService {
                 }
                 return -1;
             });
-            Double score1 =
-                    list.get(0).getHeaderScore() != null ? list.get(0).getHeaderScore() : list.get(0).getMarkerScore();
-            Double score2 =
-                    list.get(1).getHeaderScore() != null ? list.get(1).getHeaderScore() : list.get(1).getMarkerScore();
-            Double score3 =
-                    list.get(2).getHeaderScore() != null ? list.get(2).getHeaderScore() : list.get(2).getMarkerScore();
+            Double score1 = list.get(0).getHeaderScore() != null ? list.get(0).getHeaderScore() : list.get(0)
+                    .getMarkerScore();
+            Double score2 = list.get(1).getHeaderScore() != null ? list.get(1).getHeaderScore() : list.get(1)
+                    .getMarkerScore();
+            Double score3 = list.get(2).getHeaderScore() != null ? list.get(2).getHeaderScore() : list.get(2)
+                    .getMarkerScore();
             if ((score3 - score2) <= (score2 - score1)) {
                 list.remove(0);
             } else {
@@ -863,15 +900,19 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 更新某个评卷分组已评任务数量
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     @Override
     @Transactional
     public void updateMarkedCount(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL || group.getStatus() == MarkStatus.FINISH) {
-            groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(), (int) libraryDao
-                    .countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(), group.getSubjectCode(),
-                            group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED));
+            groupDao.updateMarkedCount(
+                    group.getExamId(),
+                    group.getSubjectCode(),
+                    group.getNumber(),
+                    (int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(),
+                            group.getSubjectCode(), group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED));
         } else if (group.getStatus() == MarkStatus.TRIAL) {
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
                     (int) trialLibraryDao.countMarked(group.getExamId(), group.getSubjectCode(), group.getNumber()));
@@ -881,21 +922,20 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 更新某个评卷分组评卷任务总量
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     @Override
     @Transactional
     public void updateLibraryCount(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL || group.getStatus() == MarkStatus.FINISH) {
-            group.setLibraryCount((int) libraryDao
-                    .countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
-                            group.getNumber()));
+            group.setLibraryCount((int) libraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber()));
             groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
                     group.getLibraryCount());
         } else if (group.getStatus() == MarkStatus.TRIAL) {
-            group.setLibraryCount((int) trialLibraryDao
-                    .countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
-                            group.getNumber()));
+            group.setLibraryCount((int) trialLibraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber()));
             groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
                     group.getLibraryCount());
         }
@@ -904,8 +944,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 更新某个科目所有评卷分组评卷任务数量
      *
-     * @param examId      - 考试ID
-     * @param subjectCode - 科目代码
+     * @param examId
+     *            - 考试ID
+     * @param subjectCode
+     *            - 科目代码
      */
     @Transactional
     @Override
@@ -920,9 +962,12 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生、学习中心、评卷分组构造正式评卷任务
      *
-     * @param student - 考生
-     * @param group   - 评卷分组
-     * @param subject - 科目
+     * @param student
+     *            - 考生
+     * @param group
+     *            - 评卷分组
+     * @param subject
+     *            - 科目
      */
     @Override
     @Transactional
@@ -948,15 +993,14 @@ public class MarkServiceImpl implements MarkService {
                 } else {
                     double studentCount = subject.getUploadCount();
                     double libraryCount = group.getLibraryCount();
-                    double doubleCount = libraryDao
-                            .countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(group.getExamId(),
-                                    group.getSubjectCode(), group.getNumber(), 2);
+                    double doubleCount = libraryDao.countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(
+                            group.getExamId(), group.getSubjectCode(), group.getNumber(), 2);
                     int expectCount = (int) (studentCount * group.getDoubleRate());
                     // 随机数判断加入当前已经生成双评任务的比例加权
                     // 实际双评任务数小于理论生成数 &&(剩余未生成双评的考生数量小于剩余应生成的数量||随机比例)
-                    needDouble = doubleCount < expectCount && (
-                            (studentCount - libraryCount + doubleCount) <= (expectCount - doubleCount)
-                                    || Math.random() < group.getDoubleRate() + 0.1);
+                    needDouble = doubleCount < expectCount
+                            && ((studentCount - libraryCount + doubleCount) <= (expectCount - doubleCount) || Math
+                                    .random() < group.getDoubleRate() + 0.1);
                 }
                 if (needDouble) {
                     library = new MarkLibrary();
@@ -981,8 +1025,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生、学习中心、评卷分组构造试评评卷任务
      *
-     * @param student - 考生
-     * @param group   - 评卷分组
+     * @param student
+     *            - 考生
+     * @param group
+     *            - 评卷分组
      */
     @Override
     @Transactional
@@ -1004,7 +1050,8 @@ public class MarkServiceImpl implements MarkService {
      * 领取正式评卷任务时,用来区分的唯一标识<br/>
      * 多评时同一个考生的多份任务不能被同一位评卷员领取
      *
-     * @param library - 正评任务
+     * @param library
+     *            - 正评任务
      */
     private String getApplyTaskId(MarkLibrary library) {
         return library.getStudentId() + "_" + library.getGroupNumber();
@@ -1013,7 +1060,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 领取试评评卷任务时,用来区分的唯一标识
      *
-     * @param library - 试评任务
+     * @param library
+     *            - 试评任务
      */
     private String getApplyTaskId(TrialLibrary library, Marker marker) {
         return library.getId() + "_" + marker.getId();
@@ -1022,7 +1070,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置评卷分组的连带操作
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     private void resetGroup(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL) {
@@ -1035,9 +1084,8 @@ public class MarkServiceImpl implements MarkService {
                     group.getNumber());
             libraryDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                     group.getNumber(), LibraryStatus.WAITING);
-            libraryDao
-                    .deleteByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(group.getExamId(), group.getSubjectCode(),
-                            group.getNumber(), 3);
+            libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber(), 3);
             markerDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                     group.getNumber());
             resetStudentGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
@@ -1056,7 +1104,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 计算并更新指定评卷员的评卷质量指标
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      */
     @Override
     @Transactional
@@ -1179,7 +1228,8 @@ public class MarkServiceImpl implements MarkService {
         groupStudentDao.updateStatusByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber,
                 SubjectiveStatus.UNMARK);
         scoreDao.deleteByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, groupNumber);
-        studentService.updateSubjectiveStatusAndScore(examId, subjectCode, SubjectiveStatus.UNMARK, 0, null, null);
+        studentService.updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode, SubjectiveStatus.UNMARK, 0,
+                null, null, null);
     }
 
     private void updateStudentGroupStatus(Integer studentId, Integer examId, String subjectCode, Integer groupNumber,
@@ -1196,8 +1246,8 @@ public class MarkServiceImpl implements MarkService {
     private void updateStudentGroupScore(Integer studentId, Integer examId, String subjectCode, Integer groupNumber,
             double score, List<ScoreItem> scoreList) {
         // scoreDao.deleteByStudentIdAndGroupNumber(studentId, groupNumber);
-        List<ExamQuestion> questions = questionDao
-                .findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(examId, subjectCode, false, groupNumber);
+        List<ExamQuestion> questions = questionDao.findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(examId,
+                subjectCode, false, groupNumber);
         List<SubjectiveScore> list = new ArrayList<>();
         for (int i = 0; i < scoreList.size(); i++) {
             ScoreItem item = scoreList.get(i);
@@ -1226,9 +1276,8 @@ public class MarkServiceImpl implements MarkService {
         List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(student.getId(), groupNumber);
         int count = 0;
         for (MarkLibrary library : list) {
-            if (libraryDao
-                    .resetById(library.getId(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.PROBLEM)
-                    > 0) {
+            if (libraryDao.resetById(library.getId(), LibraryStatus.WAITING, LibraryStatus.MARKED,
+                    LibraryStatus.PROBLEM) > 0) {
                 count++;
                 trackDao.deleteByLibraryId(library.getId());
                 specialTagDao.deleteByLibraryId(library.getId());

+ 5 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -246,9 +246,11 @@ public class InspectedController extends BaseExamController {
     @RequestMapping("/save")
     @ResponseBody
     public Object save(HttpServletRequest request, @RequestParam Integer studentId) {
+        WebUser wu = RequestUtils.getWebUser(request);
         ExamStudent student = studentService.findById(studentId);
         if (student != null && student.getSubjectiveStatus().equals(SubjectiveStatus.MARKED)) {
-            studentService.updateSubjectiveStatusAndTime(studentId, SubjectiveStatus.INSPECTED, new Date());
+            studentService.updateSubjectiveStatusAndTimeAndInspectorId(studentId, SubjectiveStatus.INSPECTED,
+                    new Date(), wu.getUser().getId());
             return true;
         } else {
             return false;
@@ -280,7 +282,8 @@ public class InspectedController extends BaseExamController {
             if (subjectCheck(student.getSubjectCode(), wu)) {
                 try {
                     if (lockService.trylock(LockType.STUDENT, student.getId())) {
-                        studentService.updateSubjectiveStatusAndTime(student.getId(), SubjectiveStatus.MARKED, null);
+                        studentService.updateSubjectiveStatusAndTimeAndInspectorId(student.getId(),
+                                SubjectiveStatus.MARKED, null, null);
                         obj.accumulate("success", true);
                     } else {
                         obj.accumulate("success", false);

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

@@ -27,9 +27,7 @@ import java.io.ByteArrayInputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Date;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 
 public class DataSyncThread implements Runnable {
 
@@ -168,7 +166,6 @@ public class DataSyncThread implements Runnable {
                     }
                     JSONArray studentArray = studentJson.getJSONArray(DATA_LIST);
                     List<ExamStudent> list = new ArrayList<ExamStudent>();
-                    Set<String> secretNumberSet = new HashSet<>();
                     Date now = new Date();
                     for (int j = 0; j < studentArray.size(); j++) {
                         JSONObject student = studentArray.getJSONObject(j);
@@ -200,11 +197,7 @@ public class DataSyncThread implements Runnable {
                         examStudent.setAnswers(null);
                         examStudent.setBatchCode(null);
                         examStudent.setUploadTime(now);
-                        examStudent.randomSecretNumber();
-                        while (secretNumberSet.contains(examStudent.getSecretNumber())) {
-                            examStudent.randomSecretNumber();
-                        }
-                        secretNumberSet.add(examStudent.getSecretNumber());
+                        examStudent.setSecretNumber(student.getString("examNumber"));
                         list.add(examStudent);
 
                         String answerJson = student.getString(SUBJECTIVES);

+ 26 - 9
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamStudentController.java

@@ -148,15 +148,17 @@ public class ExamStudentController extends BaseApiController {
                 obj.accumulate("college", StringUtils.trimToEmpty(student.getCollege()));
                 obj.accumulate("className", StringUtils.trimToEmpty(student.getClassName()));
                 obj.accumulate("teacher", StringUtils.trimToEmpty(student.getTeacher()));
+                if (student.getInspectorId() != null) {
+                    obj.accumulate("inspector", getInspector(student.getInspectorId()));
+                }
 
                 try {
                     if (withScoreDetail != null && withScoreDetail.booleanValue()) {
                         // 构造客观题得分明细
                         JSONArray objective = new JSONArray();
                         List<ScoreItem> scoreList = student.getScoreList(true);
-                        List<ExamQuestion> questionList = questionService
-                                .findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(),
-                                        student.getSubjectCode(), true, student.getPaperType());
+                        List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndPaperType(
+                                student.getExamId(), student.getSubjectCode(), true, student.getPaperType());
                         int i = 0;
                         for (ScoreItem item : scoreList) {
                             i++;
@@ -197,21 +199,28 @@ public class ExamStudentController extends BaseApiController {
                             detail.accumulate("score", item.getScore());
                             detail.accumulate("marker", getMarkerNames(student, question.getGroupNumber()));
                             detail.accumulate("header", getHeaderNames(student, question.getGroupNumber()));
+                            detail.accumulate("groupNumber", question.getGroupNumber());
+                            detail.accumulate("mainTitle", question.getMainTitle());
                             subjective.add(detail);
                         }
                         obj.accumulate("subjectiveScoreDetail", subjective);
                     }
                     // 返回评卷标记
                     if (withMarkTrack != null && withMarkTrack.booleanValue()) {
-                        obj.accumulate("tags", studentService.buildSheetTags(student,
-                                withGroupScoreTrack != null && withGroupScoreTrack.booleanValue()));
+                        obj.accumulate(
+                                "tags",
+                                studentService.buildSheetTags(student, withGroupScoreTrack != null
+                                        && withGroupScoreTrack.booleanValue()));
                     }
                     // 返回原图下载地址
                     if (withSheetUrl != null && withSheetUrl.booleanValue()) {
-                        obj.accumulate("sheetUrls", fileService
-                                .getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount())
-                                .stream().map(uri -> fileService.getFileServer().concat(uri))
-                                .collect(Collectors.toList()));
+                        obj.accumulate(
+                                "sheetUrls",
+                                fileService
+                                        .getSheetUris(student.getExamId(), student.getExamNumber(), 1,
+                                                student.getSheetCount()).stream()
+                                        .map(uri -> fileService.getFileServer().concat(uri))
+                                        .collect(Collectors.toList()));
                     }
                     array.add(obj);
                 } catch (Exception e) {
@@ -222,6 +231,14 @@ public class ExamStudentController extends BaseApiController {
         return array;
     }
 
+    private String getInspector(Integer inspectorId) {
+        JSONObject obj = new JSONObject();
+        User inspector = userService.findById(inspectorId);
+        obj.accumulate("loginName", inspector.getLoginName());
+        obj.accumulate("name", inspector.getName());
+        return obj.toString();
+    }
+
     private String getMarkerNames(ExamStudent student, Integer groupNumber) {
         List<String> markerNames = new LinkedList<>();
         List<MarkLibrary> list = libraryService.findByStudentAndGroup(student.getId(), groupNumber);

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

@@ -155,7 +155,7 @@
             <td>
                 <c:if test="${!examLock && !subject.locked}">
                     <a href="${ctx}/admin/exam/subject/edit?code=${subject.code}">编辑</a>
-                    <a href="${ctx}/admin/exam/paper/report?subjectCode=${result.subject.code}">分析计算</a>
+                    <a href="${ctx}/admin/exam/paper/report?subjectCode=${subject.code}">分析计算</a>
                 </c:if>
             </td>
         </tr>