Ver código fonte

修改复核打回的上锁问题;优化打回的循环逻辑

luoshi 4 anos atrás
pai
commit
828c616996

+ 12 - 7
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/ProblemHistoryDao.java

@@ -1,19 +1,19 @@
 package cn.com.qmth.stmms.biz.mark.dao;
 
-import java.util.List;
-import java.util.Set;
-
+import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
+import cn.com.qmth.stmms.common.enums.HistoryStatus;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
-import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
-import cn.com.qmth.stmms.common.enums.HistoryStatus;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
 
-public interface ProblemHistoryDao extends JpaRepository<ProblemHistory, Integer>,
-        JpaSpecificationExecutor<ProblemHistory> {
+public interface ProblemHistoryDao
+        extends JpaRepository<ProblemHistory, Integer>, JpaSpecificationExecutor<ProblemHistory> {
 
     List<ProblemHistory> findByExamIdAndSubjectCode(Integer examId, String subjectCode, Pageable page);
 
@@ -43,4 +43,9 @@ public interface ProblemHistoryDao extends JpaRepository<ProblemHistory, Integer
 
     ProblemHistory findByLibraryIdAndStatus(Integer libraryId, HistoryStatus status);
 
+    @Modifying
+    @Query("update ProblemHistory s set s.userId=?3, s.status=?4, s.updateTime=?5 where s.libraryId=?1 and s.status=?2")
+    int resetByLibraryId(Integer libraryId, HistoryStatus previousStatus, Integer userId, HistoryStatus newStatus,
+            Date time);
+
 }

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

@@ -8,12 +8,10 @@ import cn.com.qmth.stmms.biz.mark.dao.*;
 import cn.com.qmth.stmms.biz.mark.model.*;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
-import cn.com.qmth.stmms.biz.mark.service.ProblemHistoryService;
 import cn.com.qmth.stmms.biz.utils.FormalTaskUtil;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.biz.utils.TrialTaskUtil;
 import cn.com.qmth.stmms.common.enums.*;
-
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -83,9 +81,6 @@ public class MarkServiceImpl implements MarkService {
     @Autowired
     private TrialTagDao trialTagDao;
 
-    @Autowired
-    private ProblemHistoryService problemHistoryService;
-
     @Autowired
     private ProblemHistoryDao problemHistoryDao;
 
@@ -94,8 +89,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷分组已申请的评卷任务数量
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      * @return int
      */
     @Override
@@ -112,8 +106,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷员已申请的评卷任务数量
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      * @return int
      */
     @Override
@@ -135,8 +128,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 某个评卷员已完成的评卷任务数量
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      * @return long
      */
     @Override
@@ -159,8 +151,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷分组的锁定任务
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     public void releaseByGroup(MarkGroup group) {
@@ -174,8 +165,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置某个评卷分组的所有评卷任务
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
@@ -186,8 +176,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 删除某个评卷分组
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
@@ -229,8 +218,9 @@ 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.MARKED, SubjectiveStatus.INSPECTED);
+        List<Integer> studentList = studentService
+                .findIdByExamIdAndSubjectCodeAndSubjectiveStatus(group.getExamId(), group.getSubjectCode(),
+                        SubjectiveStatus.MARKED, SubjectiveStatus.INSPECTED);
         for (Integer studentId : studentList) {
             checkStudentSubjective(studentId, groupCount);
         }
@@ -239,8 +229,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 修改某个评卷分组给分步骤,并重置评卷任务
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     @Override
     @Transactional
@@ -264,10 +253,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员申请领取某个正式评卷任务
      *
-     * @param library
-     *            - 正评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 正评任务
+     * @param marker  - 评卷员
      */
     @Override
     public boolean applyLibrary(MarkLibrary library, Marker marker) {
@@ -283,10 +270,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员申请领取某个试评评卷任务
      *
-     * @param library
-     *            - 试评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 试评任务
+     * @param marker  - 评卷员
      * @return boolean
      */
     @Override
@@ -297,10 +282,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员是否已领取了某个正式评卷任务
      *
-     * @param library
-     *            - 正评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 正评任务
+     * @param marker  - 评卷员
      * @return boolean
      */
     @Override
@@ -311,10 +294,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员是否已领取了某个试评评卷任务
      *
-     * @param library
-     *            - 试评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 试评任务
+     * @param marker  - 评卷员
      * @return boolean
      */
     @Override
@@ -325,10 +306,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员已领取的正评任务
      *
-     * @param library
-     *            - 正评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 正评任务
+     * @param marker  - 评卷员
      */
     @Override
     public void releaseLibrary(MarkLibrary library, Marker marker) {
@@ -338,10 +317,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员已领取的试评任务
      *
-     * @param library
-     *            - 试评任务
-     * @param marker
-     *            - 评卷员
+     * @param library - 试评任务
+     * @param marker  - 评卷员
      */
     @Override
     public void releaseLibrary(TrialLibrary library, Marker marker) {
@@ -351,8 +328,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 释放某个评卷员的所有锁定任务
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      */
     @Override
     public void releaseByMarker(Marker marker) {
@@ -363,8 +339,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置某个评卷员
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      */
     @Override
     @Transactional
@@ -382,8 +357,9 @@ public class MarkServiceImpl implements MarkService {
             libraryDao.resetByMarkerId(marker.getId(), LibraryStatus.WAITING, LibraryStatus.ARBITRATED,
                     LibraryStatus.WAIT_ARBITRATE, LibraryStatus.PROBLEM);
             // 只选取评卷完成状态的记录重新检查
-            List<Integer> studentIdList = groupStudentDao.findStudentIdByGroupNumberAndStatus(marker.getExamId(),
-                    marker.getSubjectCode(), marker.getGroupNumber(), SubjectiveStatus.MARKED);
+            List<Integer> studentIdList = groupStudentDao
+                    .findStudentIdByGroupNumberAndStatus(marker.getExamId(), marker.getSubjectCode(),
+                            marker.getGroupNumber(), SubjectiveStatus.MARKED);
             for (Integer studentId : studentIdList) {
                 checkStudentGroup(studentId, group);
             }
@@ -400,8 +376,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生删除评卷任务
      *
-     * @param student
-     *            - 考生
+     * @param student - 考生
      */
     @Override
     @Transactional
@@ -426,10 +401,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 评卷员提交评卷任务
      *
-     * @param result
-     *            - 评卷结果
-     * @param marker
-     *            - 评卷员
+     * @param result - 评卷结果
+     * @param marker - 评卷员
      * @return boolean
      */
     @Override
@@ -437,8 +410,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;
         }
 
@@ -456,10 +429,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);
@@ -468,10 +441,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());
@@ -516,20 +489,16 @@ public class MarkServiceImpl implements MarkService {
         history.setGroupNumber(library.getGroupNumber());
         history.setProblemId(result.getReason());
         history.setStatus(HistoryStatus.WAITING);
-        problemHistoryService.save(history);
+        problemHistoryDao.save(history);
     }
 
     /**
      * 评卷员提交某个正评任务
      *
-     * @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) {
         // 非本人领取的待评任务
@@ -547,9 +516,8 @@ 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;
         }
@@ -567,8 +535,9 @@ 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) {
                     // 本评卷任务或组长已打分,则跳过该任务
@@ -578,12 +547,13 @@ 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 {
@@ -660,8 +630,7 @@ public class MarkServiceImpl implements MarkService {
      * 管理员/组长打回某个评卷任务<br>
      * 暂时不用到BACKED状态,直接等同于重置该评卷任务
      *
-     * @param library
-     *            - 正评任务
+     * @param library - 正评任务
      */
     @Override
     @Transactional
@@ -670,13 +639,15 @@ 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());
-            problemHistoryService.resetByLibraryId(library.getId(), userId);
+            problemHistoryDao
+                    .resetByLibraryId(library.getId(), HistoryStatus.WAITING, userId, HistoryStatus.BACK, new Date());
             return true;
         } else {
             return false;
@@ -686,8 +657,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 管理员/组长重置某个试评任务
      *
-     * @param library
-     *            - 试评任务
+     * @param library - 试评任务
      */
     @Override
     @Transactional
@@ -705,8 +675,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 管理员/组长处理仲裁卷
      *
-     * @param history
-     *            - 仲裁卷
+     * @param history - 仲裁卷
      */
     @Override
     @Transactional
@@ -797,12 +766,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 {
@@ -874,19 +843,15 @@ 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()));
@@ -896,20 +861,21 @@ 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());
         }
@@ -918,10 +884,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 更新某个科目所有评卷分组评卷任务数量
      *
-     * @param examId
-     *            - 考试ID
-     * @param subjectCode
-     *            - 科目代码
+     * @param examId      - 考试ID
+     * @param subjectCode - 科目代码
      */
     @Transactional
     @Override
@@ -936,12 +900,9 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生、学习中心、评卷分组构造正式评卷任务
      *
-     * @param student
-     *            - 考生
-     * @param group
-     *            - 评卷分组
-     * @param subject
-     *            - 科目
+     * @param student - 考生
+     * @param group   - 评卷分组
+     * @param subject - 科目
      */
     @Override
     @Transactional
@@ -967,14 +928,15 @@ 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();
@@ -999,10 +961,8 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 根据考生、学习中心、评卷分组构造试评评卷任务
      *
-     * @param student
-     *            - 考生
-     * @param group
-     *            - 评卷分组
+     * @param student - 考生
+     * @param group   - 评卷分组
      */
     @Override
     @Transactional
@@ -1024,8 +984,7 @@ public class MarkServiceImpl implements MarkService {
      * 领取正式评卷任务时,用来区分的唯一标识<br/>
      * 多评时同一个考生的多份任务不能被同一位评卷员领取
      *
-     * @param library
-     *            - 正评任务
+     * @param library - 正评任务
      */
     private String getApplyTaskId(MarkLibrary library) {
         return library.getStudentId() + "_" + library.getGroupNumber();
@@ -1034,8 +993,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 领取试评评卷任务时,用来区分的唯一标识
      *
-     * @param library
-     *            - 试评任务
+     * @param library - 试评任务
      */
     private String getApplyTaskId(TrialLibrary library, Marker marker) {
         return library.getId() + "_" + marker.getId();
@@ -1044,8 +1002,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 重置评卷分组的连带操作
      *
-     * @param group
-     *            - 评卷分组
+     * @param group - 评卷分组
      */
     private void resetGroup(MarkGroup group) {
         if (group.getStatus() == MarkStatus.FORMAL) {
@@ -1058,8 +1015,9 @@ 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());
@@ -1078,8 +1036,7 @@ public class MarkServiceImpl implements MarkService {
     /**
      * 计算并更新指定评卷员的评卷质量指标
      *
-     * @param marker
-     *            - 评卷员
+     * @param marker - 评卷员
      */
     @Override
     @Transactional
@@ -1238,9 +1195,26 @@ public class MarkServiceImpl implements MarkService {
     @Override
     @Transactional
     public boolean backStudentByGroup(ExamStudent student, Integer groupNumber, Integer userId) {
+        MarkGroup group = groupDao.findOne(student.getExamId(), student.getSubjectCode(), groupNumber);
+        if (group.getStatus() == MarkStatus.FINISH) {
+            return false;
+        }
         List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(student.getId(), groupNumber);
+        int count = 0;
         for (MarkLibrary library : list) {
-            this.backLibrary(library, userId);
+            if (libraryDao
+                    .resetById(library.getId(), LibraryStatus.WAITING, LibraryStatus.MARKED, LibraryStatus.PROBLEM)
+                    > 0) {
+                count++;
+                trackDao.deleteByLibraryId(library.getId());
+                specialTagDao.deleteByLibraryId(library.getId());
+                problemHistoryDao.resetByLibraryId(library.getId(), HistoryStatus.WAITING, userId, HistoryStatus.BACK,
+                        new Date());
+            }
+        }
+        if (count > 0) {
+            updateMarkedCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
+            resetStudentGroup(student.getId(), group.getExamId(), group.getSubjectCode(), group.getNumber());
         }
         return true;
     }

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

@@ -1,12 +1,9 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.mark.dao.ProblemHistoryDao;
 import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
 import cn.com.qmth.stmms.biz.mark.query.ProblemHistorySearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.ProblemHistoryService;
 import cn.com.qmth.stmms.common.enums.HistoryStatus;
 import org.apache.commons.lang.StringUtils;
@@ -14,13 +11,11 @@ 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 org.springframework.transaction.annotation.Transactional;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
-import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -30,15 +25,6 @@ public class ProblemHistoryServiceImpl extends BaseQueryService<ProblemHistory>
     @Autowired
     private ProblemHistoryDao historyDao;
 
-    @Autowired
-    private MarkLibraryService libraryService;
-
-    @Autowired
-    private ExamSubjectService subjectService;
-
-    @Autowired
-    private ExamStudentService studentService;
-
     @Override
     public ProblemHistory save(ProblemHistory p) {
         return historyDao.save(p);
@@ -54,20 +40,6 @@ public class ProblemHistoryServiceImpl extends BaseQueryService<ProblemHistory>
         return historyDao.findProblemSubjectCode(examId);
     }
 
-    @Transactional
-    @Override
-    public boolean resetByLibraryId(Integer libraryId, Integer userId) {
-        ProblemHistory history = historyDao.findByLibraryIdAndStatus(libraryId, HistoryStatus.WAITING);
-        if (history != null) {
-            history.setUserId(userId);
-            history.setUpdateTime(new Date());
-            history.setStatus(HistoryStatus.BACK);
-            historyDao.save(history);
-            return true;
-        }
-        return false;
-    }
-
     @Override
     public ProblemHistorySearchQuery findByQuery(final ProblemHistorySearchQuery query) {
         checkQuery(query);

+ 2 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/ProblemHistoryService.java

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.biz.mark.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
 import cn.com.qmth.stmms.biz.mark.query.ProblemHistorySearchQuery;
 
+import java.util.List;
+
 public interface ProblemHistoryService {
 
     ProblemHistory save(ProblemHistory history);
@@ -15,6 +15,4 @@ public interface ProblemHistoryService {
 
     ProblemHistorySearchQuery findByQuery(ProblemHistorySearchQuery query);
 
-    boolean resetByLibraryId(Integer libraryId, Integer userId);
-
 }

+ 33 - 40
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -1,31 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONArray;
-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.stereotype.Controller;
-import org.springframework.ui.Model;
-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.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
@@ -49,6 +23,23 @@ import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+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.stereotype.Controller;
+import org.springframework.ui.Model;
+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.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
 
 @Controller("inspectedController")
 @RequestMapping("/admin/exam/inspected")
@@ -88,9 +79,9 @@ public class InspectedController extends BaseExamController {
 
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query,
-            @RequestParam(required = false) Integer groupNumber,
-            @RequestParam(required = false) Double groupStartScore,
-            @RequestParam(required = false) Double groupEndScore, @RequestParam(required = false) Double questionScore) {
+            @RequestParam(required = false) Integer groupNumber, @RequestParam(required = false) Double groupStartScore,
+            @RequestParam(required = false) Double groupEndScore,
+            @RequestParam(required = false) Double questionScore) {
         int examId = getSessionExamId(request);
         WebUser wu = RequestUtils.getWebUser(request);
         query.setExamId(examId);
@@ -116,8 +107,9 @@ public class InspectedController extends BaseExamController {
         query = studentService.findByQuery(query);
         List<MarkGroup> groupList = groupService.findByExamAndSubject(examId, query.getSubjectCode());
         for (MarkGroup group : groupList) {
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                    group.getSubjectCode(), false, group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, group.getSubjectCode(), false,
+                            group.getNumber()));
         }
         SubjectiveStatus status = query.getSubjectiveStatus();
         query.setSubjectiveStatus(SubjectiveStatus.MARKED);
@@ -141,7 +133,8 @@ public class InspectedController extends BaseExamController {
     public ModelAndView start(HttpServletRequest request, RedirectAttributes redirectAttributes,
             ExamStudentSearchQuery query, @RequestParam(required = false) Integer groupNumber,
             @RequestParam(required = false) Double groupStartScore,
-            @RequestParam(required = false) Double groupEndScore, @RequestParam(required = false) Double questionScore) {
+            @RequestParam(required = false) Double groupEndScore,
+            @RequestParam(required = false) Double questionScore) {
         int examId = getSessionExamId(request);
         WebUser wu = RequestUtils.getWebUser(request);
         releaseByUser(wu.getUser().getId());
@@ -216,8 +209,8 @@ public class InspectedController extends BaseExamController {
             for (MarkGroup markGroup : groups) {
                 JSONObject group = new JSONObject();
                 group.accumulate("groupNumber", markGroup.getNumber());
-                List<SubjectiveScore> scores = scoreService.findByStudentIdAndGroupNumber(student.getId(),
-                        markGroup.getNumber());
+                List<SubjectiveScore> scores = scoreService
+                        .findByStudentIdAndGroupNumber(student.getId(), markGroup.getNumber());
                 JSONArray array = new JSONArray();
                 for (SubjectiveScore scoreItem : scores) {
                     JSONObject obj = new JSONObject();
@@ -232,8 +225,8 @@ public class InspectedController extends BaseExamController {
             // MarkGroup group = groupService.findOne(student.getExamId(),
             // student.getSubjectCode(),
             // library.getGroupNumber());
-            List<String> picUrls = fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
-                    student.getSliceCount());
+            List<String> picUrls = fileService
+                    .getSliceUris(student.getExamId(), student.getSecretNumber(), 1, student.getSliceCount());
             // List<MarkTrack> markTracks =
             // markTrackService.findByLibraryId(library.getId());
             // List<MarkSpecialTag> markSpecialTagList =
@@ -325,8 +318,8 @@ public class InspectedController extends BaseExamController {
                 try {
                     lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
                     lockService.watch(LockType.GROUP, student.getExamId(), student.getSubjectCode(), groupNumber);
-                    if (lockService.trylock(LockType.STUDENT, student.getId())
-                            && markService.backStudentByGroup(student, groupNumber, wu.getId())) {
+                    lockService.waitlock(LockType.STUDENT, student.getId());
+                    if (markService.backStudentByGroup(student, groupNumber, wu.getId())) {
                         obj.accumulate("success", true);
                     } else {
                         obj.accumulate("success", false);
@@ -337,9 +330,9 @@ public class InspectedController extends BaseExamController {
                     obj.accumulate("message", "打回失败");
                     log.error("back inspected error", e);
                 } finally {
-                    lockService.unwatch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
-                    lockService.unwatch(LockType.GROUP, student.getExamId(), student.getSubjectCode(), groupNumber);
                     lockService.unlock(LockType.STUDENT, student.getId());
+                    lockService.unwatch(LockType.GROUP, student.getExamId(), student.getSubjectCode(), groupNumber);
+                    lockService.unwatch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
                 }
             } else {
                 obj.accumulate("success", false);