Browse Source

多媒体新增问题卷

ting.yin 5 năm trước cách đây
mục cha
commit
afb5984e7c

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

@@ -116,7 +116,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷分组已申请的评卷任务数量
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      * @return int
      */
     @Override
@@ -133,7 +134,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷员已申请的评卷任务数量
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      * @return int
      */
     @Override
@@ -155,7 +157,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷员已完成的评卷任务数量
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      * @return long
      */
     @Override
@@ -168,8 +171,8 @@ public class MarkServiceImpl implements MarkService {
             if (group.getStatus() == MarkStatus.TRIAL) {
                 return trialHistoryDao.countByMarkerId(marker.getId());
             } else {
-                return libraryDao
-                        .countByMarkerAndStatus(marker.getId(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED, LibraryStatus.INSPECTED);
+                return libraryDao.countByMarkerAndStatus(marker.getId(), LibraryStatus.MARKED,
+                        LibraryStatus.ARBITRATED, LibraryStatus.INSPECTED);
             }
         }
         return 0;
@@ -178,7 +181,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷分组的锁定任务
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     @Override
     public void releaseByGroup(MarkGroup group) {
@@ -192,7 +196,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置某个评卷分组的所有评卷任务
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     @Override
     @Transactional
@@ -203,33 +208,42 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 删除某个评卷分组
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     @Override
     @Transactional
     public void deleteGroup(MarkGroup group) {
         // 试评相关数据
-        trialTrackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
+        trialTrackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
         trialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
-        trialHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
-        trialLibraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
+        trialHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        trialLibraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
         // 正评相关数据
-        trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
+        trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
         specialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
-        arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
-        problemHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
-        libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
+        arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        problemHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
         // 评卷员数据
-        markerDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
-        // 小题数据
-        questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(), false,
+        markerDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
                 group.getNumber());
+        // 小题数据
+        questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                false, group.getNumber());
 
         releaseByGroup(group);
         groupDao.delete(group);
         // 科目总分
-        subjectService
-                .updateScore(group.getExamId(), group.getSubjectCode(), false, sumTotalScore(group.getExamId(), group.getSubjectCode()));
+        subjectService.updateScore(group.getExamId(), group.getSubjectCode(), false,
+                sumTotalScore(group.getExamId(), group.getSubjectCode()));
         // 需要重新统分
         examService.updateNeedCalculate(group.getExamId(), true);
     }
@@ -237,13 +251,14 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 修改某个评卷分组给分步骤,并重置评卷任务
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     @Override
     @Transactional
     public void updateGroup(MarkGroup group, List<ExamQuestion> questionList, ScorePolicy policy, ThirdPolicy third) {
-        questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(), false,
-                group.getNumber());
+        questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                false, group.getNumber());
         double totalScore = 0d;
         for (ExamQuestion question : questionList) {
             totalScore += question.getTotalScore();
@@ -253,16 +268,18 @@ public class MarkServiceImpl implements MarkService {
         groupDao.updateTotalScore(group.getExamId(), group.getSubjectCode(), group.getNumber(), totalScore);
         groupDao.updateScorePolicy(group.getExamId(), group.getSubjectCode(), group.getNumber(), policy);
         groupDao.updateThirdPolicy(group.getExamId(), group.getSubjectCode(), group.getNumber(), third);
-        subjectService
-                .updateScore(group.getExamId(), group.getSubjectCode(), false, sumTotalScore(group.getExamId(), group.getSubjectCode()));
+        subjectService.updateScore(group.getExamId(), group.getSubjectCode(), false,
+                sumTotalScore(group.getExamId(), group.getSubjectCode()));
         resetGroup(group);
     }
 
     /**
      * 评卷员申请领取某个正式评卷任务
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 正评任务
+     * @param marker
+     *            - 评卷员
      */
     @Override
     public boolean applyLibrary(MarkLibrary library, Marker marker) {
@@ -278,8 +295,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员申请领取某个试评评卷任务
      *
-     * @param library - 试评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 试评任务
+     * @param marker
+     *            - 评卷员
      * @return boolean
      */
     @Override
@@ -290,8 +309,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员是否已领取了某个正式评卷任务
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 正评任务
+     * @param marker
+     *            - 评卷员
      * @return boolean
      */
     @Override
@@ -302,8 +323,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员是否已领取了某个试评评卷任务
      *
-     * @param library - 试评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 试评任务
+     * @param marker
+     *            - 评卷员
      * @return boolean
      */
     @Override
@@ -314,8 +337,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员已领取的正评任务
      *
-     * @param library - 正评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 正评任务
+     * @param marker
+     *            - 评卷员
      */
     @Override
     public void releaseLibrary(MarkLibrary library, Marker marker) {
@@ -325,8 +350,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员已领取的试评任务
      *
-     * @param library - 试评任务
-     * @param marker  - 评卷员
+     * @param library
+     *            - 试评任务
+     * @param marker
+     *            - 评卷员
      */
     @Override
     public void releaseLibrary(TrialLibrary library, Marker marker) {
@@ -336,7 +363,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员的所有锁定任务
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      */
     @Override
     public void releaseByMarker(Marker marker) {
@@ -347,7 +375,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置某个评卷员
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      */
     @Override
     @Transactional
@@ -358,10 +387,12 @@ 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,
+            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);
             markerDao.resetById(marker.getId());
         } else if (group.getStatus() == MarkStatus.TRIAL) {
             trialTagDao.deleteByMarkerId(marker.getId());
@@ -375,7 +406,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生删除评卷任务
      *
-     * @param student - 考生
+     * @param student
+     *            - 考生
      */
     @Override
     @Transactional
@@ -398,8 +430,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员提交评卷任务
      *
-     * @param result - 评卷结果
-     * @param marker - 评卷员
+     * @param result
+     *            - 评卷结果
+     * @param marker
+     *            - 评卷员
      * @return boolean
      */
     @Override
@@ -407,7 +441,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;
         }
 
@@ -428,16 +463,17 @@ public class MarkServiceImpl implements MarkService {
                 problemHistoryService.save(history);
                 // 状态更新
                 Date now = new Date();
-                if (libraryDao.updateProblemResult(library.getId(), LibraryStatus.PROBLEM, marker.getId(), now, result.getSpent(),
-                        LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.INSPECTED) == 0) {
+                if (libraryDao.updateProblemResult(library.getId(), LibraryStatus.PROBLEM, marker.getId(), now,
+                        result.getSpent(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.INSPECTED) != 0) {
                     updateMarkedCount(group);
                     releaseLibrary(library, marker);
                     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);
@@ -446,9 +482,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());
@@ -481,10 +518,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) {
         // 非本人领取的待评任务
@@ -492,19 +533,20 @@ public class MarkServiceImpl implements MarkService {
             return false;
         }
         // 非本人的回评任务
-        if ((library.getStatus() == LibraryStatus.MARKED || library.getStatus() == LibraryStatus.INSPECTED) && !library.getMarkerId()
-                .equals(marker.getId())) {
+        if ((library.getStatus() == LibraryStatus.MARKED || library.getStatus() == LibraryStatus.INSPECTED)
+                && !library.getMarkerId().equals(marker.getId())) {
             return false;
         }
         // 是否多评情况下已处理过该考生评卷任务
-        if (libraryDao.countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), library.getMarkerId(), library.getId()) > 0) {
+        if (libraryDao.countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), library.getMarkerId(),
+                library.getId()) > 0) {
             return false;
         }
         // 尝试提交评卷结果
         Date now = new Date();
-        if (libraryDao
-                .updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(), result.getTotalScore(), result.getScoreList(),
-                        now, result.getSpent(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.INSPECTED) == 0) {
+        if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(),
+                result.getTotalScore(), result.getScoreList(), now, result.getSpent(), LibraryStatus.WAITING,
+                LibraryStatus.MARKED, LibraryStatus.INSPECTED) == 0) {
             // 条件不符更新失败,直接返回
             return false;
         }
@@ -524,9 +566,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,
-                            LibraryStatus.INSPECTED);
+            List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumberAndStatus(library.getStudentId(),
+                    library.getGroupNumber(), LibraryStatus.MARKED, LibraryStatus.INSPECTED);
             for (MarkLibrary other : list) {
                 if (other.getId().equals(library.getId()) || other.getHeaderScore() != null) {
                     // 本评卷任务或组长已打分,则跳过该任务
@@ -540,8 +581,8 @@ public class MarkServiceImpl implements MarkService {
                             buildThirdLibrary(library, group);
                         } else {
                             // 两两比较,触发仲裁
-                            List<MarkLibrary> libraries = libraryDao
-                                    .findByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber());
+                            List<MarkLibrary> libraries = libraryDao.findByStudentIdAndGroupNumber(
+                                    library.getStudentId(), library.getGroupNumber());
                             history = getArbitrate(libraries, group.getArbitrateThreshold(), now);
                         }
                     } else {
@@ -556,7 +597,8 @@ public class MarkServiceImpl implements MarkService {
             // 保存仲裁记录
             arbitrateDao.save(history);
             // 触发仲裁后续状态更新
-            libraryDao.updateByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber(), LibraryStatus.WAIT_ARBITRATE);
+            libraryDao.updateByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber(),
+                    LibraryStatus.WAIT_ARBITRATE);
         }
         return true;
     }
@@ -614,7 +656,8 @@ public class MarkServiceImpl implements MarkService {
      * 管理员/组长打回某个评卷任务<br>
      * 暂时不用到BACKED状态,直接等同于重置该评卷任务
      *
-     * @param library - 正评任务
+     * @param library
+     *            - 正评任务
      */
     @Override
     @Transactional
@@ -623,9 +666,8 @@ public class MarkServiceImpl implements MarkService {
         if (group.getStatus() == MarkStatus.FINISH) {
             return false;
         }
-        if (libraryDao
-                .resetById(library.getId(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.INSPECTED, LibraryStatus.PROBLEM)
-                > 0) {
+        if (libraryDao.resetById(library.getId(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.INSPECTED,
+                LibraryStatus.PROBLEM) > 0) {
             trackDao.deleteByLibraryId(library.getId());
             specialTagDao.deleteByLibraryId(library.getId());
             updateMarkedCount(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
@@ -639,7 +681,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 管理员/组长重置某个试评任务
      *
-     * @param library - 试评任务
+     * @param library
+     *            - 试评任务
      */
     @Override
     @Transactional
@@ -657,15 +700,16 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 管理员/组长处理仲裁卷
      *
-     * @param history - 仲裁卷
+     * @param history
+     *            - 仲裁卷
      */
     @Override
     @Transactional
     public void processArbitrate(ArbitrateHistory history) {
         if (arbitrateDao.exists(history.getId())) {
             arbitrateDao.saveAndFlush(history);
-            libraryDao.updateHeaderResult(history.getStudentId(), history.getGroupNumber(), history.getUserId(), history.getTotalScore(),
-                    history.getScoreList(), history.getUpdateTime(), LibraryStatus.ARBITRATED);
+            libraryDao.updateHeaderResult(history.getStudentId(), history.getGroupNumber(), history.getUserId(),
+                    history.getTotalScore(), history.getScoreList(), history.getUpdateTime(), LibraryStatus.ARBITRATED);
             updateMarkedCount(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
             scoreCalculate(studentService.findById(history.getStudentId()),
                     groupDao.findByExamIdAndSubjectCode(history.getExamId(), history.getSubjectCode()));
@@ -675,8 +719,10 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 对某个考生某个科目进行主观题统分
      *
-     * @param student - 考生
-     * @param groups  - 所有评卷分组
+     * @param student
+     *            - 考生
+     * @param groups
+     *            - 所有评卷分组
      */
     @Override
     @Transactional
@@ -702,7 +748,8 @@ public class MarkServiceImpl implements MarkService {
         // 全部评完,更新考生主观题得分
         student.setSubjectiveScore(totalScore);
         student.setScoreList(scoreList, false);
-        studentService.updateSubjectiveScore(student.getId(), student.getSubjectiveScore(), student.getSubjectiveScoreList());
+        studentService.updateSubjectiveScore(student.getId(), student.getSubjectiveScore(),
+                student.getSubjectiveScoreList());
     }
 
     private boolean calculateGroup(MarkGroup group, Integer studentId) {
@@ -737,9 +784,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 {
@@ -811,15 +861,16 @@ 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, LibraryStatus.INSPECTED));
+                    .countByExamIdAndSubjectCodeAndGroupNumberAndStatus(group.getExamId(), group.getSubjectCode(),
+                            group.getNumber(), LibraryStatus.MARKED, LibraryStatus.ARBITRATED, LibraryStatus.INSPECTED));
         } else if (group.getStatus() == MarkStatus.TRIAL) {
             groupDao.updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
                     (int) trialLibraryDao.countMarked(group.getExamId(), group.getSubjectCode(), group.getNumber()));
@@ -829,27 +880,32 @@ 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()));
-            groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(), group.getLibraryCount());
+            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()));
-            groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(), group.getLibraryCount());
+            group.setLibraryCount((int) trialLibraryDao.countByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber()));
+            groupDao.updateLibraryCount(group.getExamId(), group.getSubjectCode(), group.getNumber(),
+                    group.getLibraryCount());
         }
     }
 
     /**
      * 更新某个科目所有评卷分组评卷任务数量
      *
-     * @param examId      - 考试ID
-     * @param subjectCode - 科目代码
+     * @param examId
+     *            - 考试ID
+     * @param subjectCode
+     *            - 科目代码
      */
     @Transactional
     @Override
@@ -864,10 +920,14 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生、学习中心、评卷分组构造正式评卷任务
      *
-     * @param student - 考生
-     * @param campus  - 学习中心
-     * @param group   - 评卷分组
-     * @param subject - 科目
+     * @param student
+     *            - 考生
+     * @param campus
+     *            - 学习中心
+     * @param group
+     *            - 评卷分组
+     * @param subject
+     *            - 科目
      */
     @Override
     @Transactional
@@ -892,13 +952,13 @@ 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());
+                    needDouble = doubleCount < expectCount
+                            && ((studentCount - libraryCount + doubleCount) <= (expectCount - doubleCount) || Math
+                                    .random() < group.getDoubleRate());
                 }
                 if (needDouble) {
                     library = new MarkLibrary();
@@ -921,9 +981,12 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生、学习中心、评卷分组构造试评评卷任务
      *
-     * @param student - 考生
-     * @param campus  - 学习中心
-     * @param group   - 评卷分组
+     * @param student
+     *            - 考生
+     * @param campus
+     *            - 学习中心
+     * @param group
+     *            - 评卷分组
      */
     @Override
     @Transactional
@@ -945,7 +1008,8 @@ public class MarkServiceImpl implements MarkService {
      * 领取正式评卷任务时,用来区分的唯一标识<br/>
      * 多评时同一个考生的多份任务不能被同一位评卷员领取
      *
-     * @param library - 正评任务
+     * @param library
+     *            - 正评任务
      */
     private String getApplyTaskId(MarkLibrary library) {
         return library.getStudentId() + "_" + library.getGroupNumber();
@@ -954,7 +1018,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 领取试评评卷任务时,用来区分的唯一标识
      *
-     * @param library - 试评任务
+     * @param library
+     *            - 试评任务
      */
     private String getApplyTaskId(TrialLibrary library, Marker marker) {
         return library.getId() + "_" + marker.getId();
@@ -963,23 +1028,30 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置评卷分组的连带操作
      *
-     * @param group - 评卷分组
+     * @param group
+     *            - 评卷分组
      */
     private void resetGroup(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL) {
-            trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber());
             specialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
-            arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
-            problemHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
-            libraryDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                    LibraryStatus.WAITING);
-            libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(group.getExamId(), group.getSubjectCode(), group.getNumber(),
-                    3);
-            markerDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber());
+            problemHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber());
+            libraryDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber(), LibraryStatus.WAITING);
+            libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(group.getExamId(),
+                    group.getSubjectCode(), group.getNumber(), 3);
+            markerDao.resetByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber());
         } else if (group.getStatus() == MarkStatus.TRIAL) {
-            trialTrackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            trialTrackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber());
             trialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
-            trialHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            trialHistoryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber());
         }
         updateLibraryCount(group);
         groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
@@ -989,7 +1061,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 计算并更新指定评卷员的评卷质量指标
      *
-     * @param marker - 评卷员
+     * @param marker
+     *            - 评卷员
      */
     @Override
     @Transactional

+ 2 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -146,7 +146,8 @@ public class LibraryController extends BaseExamController {
                 try {
                     lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
                             library.getGroupNumber());
-                    if (library.getStatus().equals(LibraryStatus.MARKED)
+                    if ((library.getStatus().equals(LibraryStatus.MARKED) || library.getStatus().equals(
+                            LibraryStatus.PROBLEM))
                             && markService.backLibrary(library, wu.getId())) {
                         obj.accumulate("success", true);
                     } else {

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

@@ -138,15 +138,16 @@ public class MarkController extends BaseController {
     private ModelAndView getMarkModeView(Marker marker, MarkMode mode) {
         // 多媒体阅卷
         Exam exam = examService.findById(marker.getExamId());
+        boolean forceMode = false;
+        MarkMode sysMode = MarkMode.findByName(forceMarkMode);
+        MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
         if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
             ModelAndView view = new ModelAndView("modules/mark/markJson");
             view.addObject("forceMode", false);
             view.addObject("sheetView", false);
+            view.addObject("isFormal", group.getStatus() == MarkStatus.FORMAL);
             return view;
         }
-        boolean forceMode = false;
-        MarkMode sysMode = MarkMode.findByName(forceMarkMode);
-        MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
         if (sysMode != null) {
             // 全局配置的强制评卷模式
             mode = sysMode;

+ 5 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markJson.jsp

@@ -80,6 +80,11 @@
                     needConfirm: false,
                 },
                 'warning-info': {},
+                <c:if test="${isFormal==true}">
+				'problem-process':{
+					problemTypes : '${problemTypes}'
+                },
+				</c:if>	
                 'change-name': {
                     url: '${ctx}/mark/change-name'
                 },

+ 3 - 1
stmms-web/src/main/webapp/static/mark-json/js/mark-control.js

@@ -581,7 +581,9 @@ MarkControl.prototype.submitTask = function (submitUrl) {
             scoreList: task.scoreList,
             trackList: [],
             tagList: task.tagList,
-            spent: new Date().getTime() - task.spent
+            spent: new Date().getTime() - task.spent,
+            problem : task.problem,
+            reason : task.reason
         }
 
         this.trigger('task.submit.before');