Ver Fonte

MarkServiceImpl.rejectLibrary sList构造不一定使用的markerScoreList,有可能有风险;
sList使用LinkedList构造的,按index删除/添加代价高,可以找到对应ScoreItem后setScore为null;
SubjectiveCalculateThread.run,studentList循环上锁/解锁最好配套执行;
InspectedController.getTask 指定studentId或secretNumber等情况应该是互斥的不同分支;删除三评任务时没有一并删除轨迹和特殊标记;
scoreList排序有误,未准确按照大题号/小题号正序排列;
1087行selectiveList仅做分数累加,与partScore作用重复,可以优化;

ting.yin há 1 ano atrás
pai
commit
bd6e474ab8
18 ficheiros alterados com 206 adições e 174 exclusões
  1. 6 5
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  2. 6 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/InspectHistoryDao.java
  3. 2 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java
  4. 23 17
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SubjectiveScore.java
  5. 2 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java
  6. 6 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/InspectHistoryService.java
  7. 23 18
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamQuestionServiceImpl.java
  8. 7 7
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  9. 2 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/InspectHistoryServiceImpl.java
  10. 11 14
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/InspectedServiceImpl.java
  11. 23 18
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/SubjectiveScoreServiceImpl.java
  12. 28 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkLibrary.java
  13. 16 21
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  14. 1 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java
  15. 3 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/QuestionNumberBean.java
  16. 7 7
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/QuestionNumberComparator.java
  17. 34 35
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  18. 6 11
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/SubjectiveCalculateThread.java

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

@@ -217,7 +217,7 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     public Long sumSheetCountByExamIdAndSubjectCode(int examId, String subjectCode);
 
     @Query("select distinct m.subjectCode from ExamStudent m where m.examId=?1 and m.subjectiveStatus in (?3) and m.inspected=?2 and m.upload=true and m.absent=false and m.breach=false ")
-    Set<String> findSubjectUnInspectedByExamId(int examId,boolean inspected, SubjectiveStatus... status);
+    Set<String> findSubjectUnInspectedByExamId(int examId, boolean inspected, SubjectiveStatus... status);
 
     @Query("select s.college from ExamStudent s where s.examId=?1 group by s.college")
     public List<String> findDistinctCollege(int examId);
@@ -230,7 +230,8 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
 
     @Modifying
     @Query("update ExamStudent s set s.inspectCount=?2,s.inspected=?5, s.inspectTime=?3 ,s.inspectorId=?4 where s.id=?1 ")
-    public void updateInspectCount(Integer studentId, Integer inspectCount,Date inspectTime, Integer inspectorId,boolean inspected);
+    public void updateInspectCount(Integer studentId, Integer inspectCount, Date inspectTime, Integer inspectorId,
+            boolean inspected);
 
     @Modifying
     @Query("update ExamStudent s set s.college=?2 ,s.className=?3, s.teacher=?4,s.examRoom=?5, s.examSite=?6, s.remark=?7 where s.id=?1 ")
@@ -243,15 +244,15 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
 
     @Modifying
     @Query("update ExamStudent s set s.inspected=?3,s.inspectTime=null ,s.inspectorId=null where s.examId=?1 and s.subjectCode=?2 and s.inspected=?4")
-    public void cancelInspect(int examId, String subjectCode,boolean inspected,boolean inspectedCon);
+    public void cancelInspect(int examId, String subjectCode, boolean inspected, boolean inspectedCon);
 
     @Modifying
     @Query("update ExamStudent s set s.inspected=?4, s.inspectTime=?2 ,s.inspectorId=?3 where s.id=?1 ")
-    public void inspect(Integer studentId, Date inspectTime, Integer inspectorId,boolean inspected);
+    public void inspect(Integer studentId, Date inspectTime, Integer inspectorId, boolean inspected);
 
     @Modifying
     @Query("update ExamStudent s set s.inspected=?2, s.inspectTime=null ,s.inspectorId=null where s.id=?1 ")
-    public void cancelInspect(Integer studentId,boolean inspected);
+    public int cancelInspect(Integer studentId, boolean inspected);
 
     @Modifying
     @Query("update ExamStudent s set s.trial=?2 where s.id=?1")

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

@@ -26,13 +26,13 @@ public interface InspectHistoryDao extends PagingAndSortingRepository<InspectHis
     @Query("delete from InspectHistory m where m.examId=?1 and m.subjectCode=?2")
     void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
 
-	InspectHistory findByStudentIdAndInspectRound(Integer studentId, Integer inspectRound);
+    InspectHistory findByStudentIdAndInspectRound(Integer studentId, Integer inspectRound);
 
-	@Modifying
-	@Query("delete from InspectHistory m where m.studentId=?1 and m.inspectRound=?2")
-	void deleteByStudentIdAndInspectRound(Integer studentId, Integer inspectRound);
-	
-	@Modifying
+    @Modifying
+    @Query("delete from InspectHistory m where m.studentId=?1 and m.inspectRound=(select es.inspectRound from ExamSubject es,ExamStudent s where s.id=?1 and es.examId=s.examId and es.code=s.subjectCode)")
+    void deleteByStudentIdAndInspectRound(Integer studentId);
+
+    @Modifying
     @Query("delete from InspectHistory m where m.examId=?1 and m.subjectCode=?2 and m.inspectRound=?3")
     void deleteByExamIdAndSubjectCodeAndInspectRound(int examId, String subjectCode, Integer inspectRound);
 

+ 2 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java

@@ -13,12 +13,13 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 
+import cn.com.qmth.stmms.biz.utils.QuestionNumberBean;
 import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
 import cn.com.qmth.stmms.common.enums.QuestionType;
 
 @Entity
 @Table(name = "eb_exam_question")
-public class ExamQuestion implements Serializable {
+public class ExamQuestion implements Serializable, QuestionNumberBean {
 
     private static final long serialVersionUID = -6614640229855098561L;
 

+ 23 - 17
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SubjectiveScore.java

@@ -5,6 +5,9 @@ import javax.persistence.EmbeddedId;
 import javax.persistence.Entity;
 import javax.persistence.Table;
 
+import cn.com.qmth.stmms.biz.utils.QuestionNumberBean;
+import cn.com.qmth.stmms.biz.utils.QuestionNumberComparator;
+
 import java.io.Serializable;
 
 /**
@@ -12,7 +15,7 @@ import java.io.Serializable;
  */
 @Entity
 @Table(name = "eb_subjective_score")
-public class SubjectiveScore implements Serializable, Comparable<SubjectiveScore> {
+public class SubjectiveScore implements Serializable, Comparable<SubjectiveScore>, QuestionNumberBean {
 
     private static final long serialVersionUID = 6637010422161820147L;
 
@@ -159,22 +162,25 @@ public class SubjectiveScore implements Serializable, Comparable<SubjectiveScore
 
     @Override
     public int compareTo(SubjectiveScore other) {
-        int i = this.getMainNumber() - other.getMainNumber();
-        if (i == 0) {
-            if (this.getSubNumber().contains("-")) {
-                String[] o1s = this.getSubNumber().split("-");
-                String[] o2s = other.getSubNumber().split("-");
-                int j = Integer.parseUnsignedInt(o1s[0]) - Integer.parseUnsignedInt(o2s[0]);
-                if (j == 0) {
-                    return Integer.parseUnsignedInt(o1s[1]) - Integer.parseUnsignedInt(o2s[1]);
-                } else {
-                    return j;
-                }
-            } else {
-                return Integer.parseUnsignedInt(this.getSubNumber()) - Integer.parseUnsignedInt(other.getSubNumber());
-            }
-        }
-        return i;
+        // int i = this.getMainNumber() - other.getMainNumber();
+        // if (i == 0) {
+        // if (this.getSubNumber().contains("-")) {
+        // String[] o1s = this.getSubNumber().split("-");
+        // String[] o2s = other.getSubNumber().split("-");
+        // int j = Integer.parseUnsignedInt(o1s[0]) -
+        // Integer.parseUnsignedInt(o2s[0]);
+        // if (j == 0) {
+        // return Integer.parseUnsignedInt(o1s[1]) -
+        // Integer.parseUnsignedInt(o2s[1]);
+        // } else {
+        // return j;
+        // }
+        // } else {
+        // return Integer.parseUnsignedInt(this.getSubNumber()) -
+        // Integer.parseUnsignedInt(other.getSubNumber());
+        // }
+        // }
+        return QuestionNumberComparator.instance.compare(this, other);
     }
 
     public Boolean getUncalculate() {

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

@@ -166,7 +166,7 @@ public interface ExamStudentService {
 
     public int findMinInspectCountByExamIdAndSubjectCode(int examId, String subjectCode);
 
-    public void updateInspectCount(Integer studentId, Integer inspectCount,Date inspectTime, Integer inspectorId);
+    public void updateInspectCount(Integer studentId, Integer inspectCount, Date inspectTime, Integer inspectorId);
 
     Map<Integer, List<PictureTag>> buildSliceTags(ExamStudent student, boolean withGroupScore);
 
@@ -180,7 +180,7 @@ public interface ExamStudentService {
 
     void scoreVerifyTag(Integer userId, Integer studentId, Boolean tag);
 
-    void cancelInspect(Integer studentId);
+    int cancelInspect(Integer studentId);
 
     public ExamStudentSearchQuery findByQueryPlus(ExamStudentSearchQuery query);
 

+ 6 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/InspectHistoryService.java

@@ -15,16 +15,16 @@ public interface InspectHistoryService {
 
     void deleteByStudentId(Integer studentId);
 
-	InspectHistory findByStudentIdAndInspectRound(Integer id, Integer inspectRound);
+    InspectHistory findByStudentIdAndInspectRound(Integer id, Integer inspectRound);
 
-	List<InspectHistory> findByStudentIdIn(List<Integer> sids);
+    List<InspectHistory> findByStudentIdIn(List<Integer> sids);
 
-	void deleteByStudentIdAndInspectRound(Integer studentId, Integer inspectRound);
+    void deleteByStudentIdAndInspectRound(Integer studentId);
 
-	List<InspectWorkVo> findInspectWork(Integer examId);
+    List<InspectWorkVo> findInspectWork(Integer examId);
 
-	Boolean existByStudentIdAndUserId(Integer studentId, Integer userId);
+    Boolean existByStudentIdAndUserId(Integer studentId, Integer userId);
 
-	void deleteByExamIdAndSubjectCodeAndInspectRound(Integer examId, String subjectCode, Integer inspectRound);
+    void deleteByExamIdAndSubjectCodeAndInspectRound(Integer examId, String subjectCode, Integer inspectRound);
 
 }

+ 23 - 18
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamQuestionServiceImpl.java

@@ -8,6 +8,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
+import cn.com.qmth.stmms.biz.utils.QuestionNumberComparator;
 import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
 import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
 import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
@@ -84,24 +85,28 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     }
 
     private List<ExamQuestion> questionSort(List<ExamQuestion> list) {
-        list.sort((o1, o2) -> {
-            int i = o1.getMainNumber() - o2.getMainNumber();
-            if (i == 0) {
-                if (o1.getSubNumber().contains("-")) {
-                    String[] o1s = o1.getSubNumber().split("-");
-                    String[] o2s = o2.getSubNumber().split("-");
-                    int j = Integer.parseUnsignedInt(o1s[0]) - Integer.parseUnsignedInt(o2s[0]);
-                    if (j == 0) {
-                        return Integer.parseUnsignedInt(o1s[1]) - Integer.parseUnsignedInt(o2s[1]);
-                    } else {
-                        return j;
-                    }
-                } else {
-                    return Integer.parseUnsignedInt(o1.getSubNumber()) - Integer.parseUnsignedInt(o2.getSubNumber());
-                }
-            }
-            return i;
-        });
+        // list.sort((o1, o2) -> {
+        // int i = o1.getMainNumber() - o2.getMainNumber();
+        // if (i == 0) {
+        // if (o1.getSubNumber().contains("-")) {
+        // String[] o1s = o1.getSubNumber().split("-");
+        // String[] o2s = o2.getSubNumber().split("-");
+        // int j = Integer.parseUnsignedInt(o1s[0]) -
+        // Integer.parseUnsignedInt(o2s[0]);
+        // if (j == 0) {
+        // return Integer.parseUnsignedInt(o1s[1]) -
+        // Integer.parseUnsignedInt(o2s[1]);
+        // } else {
+        // return j;
+        // }
+        // } else {
+        // return Integer.parseUnsignedInt(o1.getSubNumber()) -
+        // Integer.parseUnsignedInt(o2.getSubNumber());
+        // }
+        // }
+        // return i;
+        // });
+        list.sort((o1, o2) -> QuestionNumberComparator.instance.compare(o1, o2));
         return list;
     }
 

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

@@ -1207,7 +1207,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
 
     @Override
     public Set<String> findSubjectUnInspectedByExamId(int examId) {
-        return studentDao.findSubjectUnInspectedByExamId(examId,false, SubjectiveStatus.MARKED);
+        return studentDao.findSubjectUnInspectedByExamId(examId, false, SubjectiveStatus.MARKED);
     }
 
     @Override
@@ -1228,8 +1228,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
 
     @Transactional
     @Override
-    public void updateInspectCount(Integer studentId, Integer inspectCount,Date inspectTime, Integer inspectorId) {
-        studentDao.updateInspectCount(studentId, inspectCount,inspectTime,inspectorId,true);
+    public void updateInspectCount(Integer studentId, Integer inspectCount, Date inspectTime, Integer inspectorId) {
+        studentDao.updateInspectCount(studentId, inspectCount, inspectTime, inspectorId, true);
     }
 
     /**
@@ -1327,13 +1327,13 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Transactional
     @Override
     public void inspect(Integer studentId, Date inspectTime, Integer inspectorId) {
-        studentDao.inspect(studentId, inspectTime, inspectorId,true);
+        studentDao.inspect(studentId, inspectTime, inspectorId, true);
     }
 
     @Transactional
     @Override
-    public void cancelInspect(Integer studentId) {
-        studentDao.cancelInspect(studentId,false);
+    public int cancelInspect(Integer studentId) {
+        return studentDao.cancelInspect(studentId, false);
     }
 
     @Override
@@ -1551,7 +1551,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Transactional
     @Override
     public void cancelInspect(int examId, String subjectCode) {
-        studentDao.cancelInspect(examId, subjectCode,false,true);
+        studentDao.cancelInspect(examId, subjectCode, false, true);
     }
 
     @Override

+ 2 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/InspectHistoryServiceImpl.java

@@ -91,8 +91,8 @@ public class InspectHistoryServiceImpl extends BaseQueryService<InspectHistory>
 
     @Transactional
     @Override
-    public void deleteByStudentIdAndInspectRound(Integer studentId, Integer inspectRound) {
-        inspectHistoryDao.deleteByStudentIdAndInspectRound(studentId, inspectRound);
+    public void deleteByStudentIdAndInspectRound(Integer studentId) {
+        inspectHistoryDao.deleteByStudentIdAndInspectRound(studentId);
     }
 
     @SuppressWarnings("unchecked")

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

@@ -285,7 +285,7 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
                 return false;
             }
             Date now = new Date();
-//            studentService.inspect(student.getId(), now, userId);
+            // studentService.inspect(student.getId(), now, userId);
             InspectHistory i = new InspectHistory();
             i.setExamId(student.getExamId());
             i.setStudentId(student.getId());
@@ -294,7 +294,8 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
             i.setInspectTime(now);
             i.setInspectRound(subject.getInspectRound());
             inspectHistoryService.save(i);
-            studentService.updateInspectCount(student.getId(), inspectHistoryService.countByStudentId(student.getId()),now, userId);
+            studentService.updateInspectCount(student.getId(), inspectHistoryService.countByStudentId(student.getId()),
+                    now, userId);
             // this.releaseByStudent(student);
             return true;
         }
@@ -307,14 +308,10 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
     @Transactional
     @Override
     public boolean cancelByStudent(Integer studentId) {
-        ExamStudent student = studentService.findById(studentId);
-        ExamSubject sub = examSubjectService.find(student.getExamId(), student.getSubjectCode());
-        if (student.getInspected()) {
-            studentService.cancelInspect(studentId);
-            inspectHistoryService.deleteByStudentIdAndInspectRound(studentId, sub.getInspectRound());
-            return true;
+        if (studentService.cancelInspect(studentId) > 0) {
+            inspectHistoryService.deleteByStudentIdAndInspectRound(studentId);
         }
-        return false;
+        return true;
     }
 
     @Transactional
@@ -367,10 +364,10 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
     }
 
     @Transactional
-	@Override
-	public void cancelBySubject(Integer examId, String subjectCode) {
+    @Override
+    public void cancelBySubject(Integer examId, String subjectCode) {
         ExamSubject sub = examSubjectService.find(examId, subjectCode);
-        studentService.cancelInspect(examId,subjectCode);
-        inspectHistoryService.deleteByExamIdAndSubjectCodeAndInspectRound(examId,subjectCode, sub.getInspectRound());
-	}
+        studentService.cancelInspect(examId, subjectCode);
+        inspectHistoryService.deleteByExamIdAndSubjectCodeAndInspectRound(examId, subjectCode, sub.getInspectRound());
+    }
 }

+ 23 - 18
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/SubjectiveScoreServiceImpl.java

@@ -23,6 +23,7 @@ import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
 import cn.com.qmth.stmms.biz.exam.query.SubjectiveScoreSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
+import cn.com.qmth.stmms.biz.utils.QuestionNumberComparator;
 
 @Service
 public class SubjectiveScoreServiceImpl extends BaseQueryService<SubjectiveScore> implements SubjectiveScoreService {
@@ -111,24 +112,28 @@ public class SubjectiveScoreServiceImpl extends BaseQueryService<SubjectiveScore
     }
 
     private void sort(List<SubjectiveScore> list) {
-        list.sort((o1, o2) -> {
-            int i = o1.getMainNumber() - o2.getMainNumber();
-            if (i == 0) {
-                if (o1.getSubNumber().contains("-")) {
-                    String[] o1s = o1.getSubNumber().split("-");
-                    String[] o2s = o2.getSubNumber().split("-");
-                    int j = Integer.parseUnsignedInt(o1s[0]) - Integer.parseUnsignedInt(o2s[0]);
-                    if (j == 0) {
-                        return Integer.parseUnsignedInt(o1s[1]) - Integer.parseUnsignedInt(o2s[1]);
-                    } else {
-                        return j;
-                    }
-                } else {
-                    return Integer.parseUnsignedInt(o1.getSubNumber()) - Integer.parseUnsignedInt(o2.getSubNumber());
-                }
-            }
-            return i;
-        });
+        list.sort((o1, o2) -> QuestionNumberComparator.instance.compare(o1, o2));
+        // list.sort((o1, o2) -> {
+        // int i = o1.getMainNumber() - o2.getMainNumber();
+        // if (i == 0) {
+        // if (o1.getSubNumber().contains("-")) {
+        // String[] o1s = o1.getSubNumber().split("-");
+        // String[] o2s = o2.getSubNumber().split("-");
+        // int j = Integer.parseUnsignedInt(o1s[0]) -
+        // Integer.parseUnsignedInt(o2s[0]);
+        // if (j == 0) {
+        // return Integer.parseUnsignedInt(o1s[1]) -
+        // Integer.parseUnsignedInt(o2s[1]);
+        // } else {
+        // return j;
+        // }
+        // } else {
+        // return Integer.parseUnsignedInt(o1.getSubNumber()) -
+        // Integer.parseUnsignedInt(o2.getSubNumber());
+        // }
+        // }
+        // return i;
+        // });
     }
 
     @Override

+ 28 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkLibrary.java

@@ -272,6 +272,34 @@ public class MarkLibrary implements Serializable {
         return list;
     }
 
+    public List<ScoreItem> getMarkerScoreItem() {
+        List<ScoreItem> list = new LinkedList<ScoreItem>();
+        String scoreList = null;
+        if (StringUtils.isNotBlank(markerScoreList)) {
+            scoreList = markerScoreList;
+        }
+        if (StringUtils.isNotBlank(scoreList)) {
+            try {
+                String[] values = scoreList.split(",");
+                for (String value : values) {
+                    if (value.equals("#")) {
+                        list.add(new ScoreItem(false));
+                    } else {
+                        ScoreItem item = ScoreItem.parse(value, false);
+                        if (item != null) {
+                            list.add(item);
+                        }
+                    }
+                }
+                if (scoreList.endsWith(",")) {
+                    list.add(new ScoreItem(false));
+                }
+            } catch (Exception e) {
+            }
+        }
+        return list;
+    }
+
     public Integer getGroupNumber() {
         return groupNumber;
     }

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

@@ -1005,8 +1005,7 @@ public class MarkServiceImpl implements MarkService {
         Integer examId = null;
         String subjectCode = null;
         // 循环所有主观得分明细
-        List<SubjectiveScore> list = scoreDao.findByStudentId(studentId);
-        list.sort(null);
+        List<SubjectiveScore> list = scoreService.findByStudentId(studentId);
         for (SubjectiveScore ss : list) {
             List<SubjectiveScore> mainScoreList = mainScoreMap.get(ss.getMainNumber());
             if (mainScoreList == null) {
@@ -1067,8 +1066,8 @@ public class MarkServiceImpl implements MarkService {
             Map<Integer, Double> partScoreMap = new HashMap<Integer, Double>();
             // 循环选做分区
             for (Integer part : partMap.keySet()) {
-                List<Double> selectiveList = new ArrayList<Double>();
                 List<SelectiveGroup> partList = partMap.get(part);
+                BigDecimal partScore = BigDecimal.ZERO;
                 boolean unselectivePart = false;
                 for (SelectiveGroup selectiveGroup : partList) {
                     double mainScore = scoreMap.get(selectiveGroup.getMainNumber());
@@ -1076,7 +1075,7 @@ public class MarkServiceImpl implements MarkService {
                     if (mainScore == UN_SELECTIVE_SCORE || unselectivePart) {
                         unselectivePart = true;
                     } else {
-                        selectiveList.add(mainScore);
+                        partScore = partScore.add(BigDecimal.valueOf(mainScore));
                     }
                 }
                 // 当前part未选做
@@ -1088,10 +1087,6 @@ public class MarkServiceImpl implements MarkService {
                         }
                     }
                 } else {
-                    BigDecimal partScore = BigDecimal.ZERO;
-                    for (int i = 0; i < selectiveList.size(); i++) {
-                        partScore = partScore.add(BigDecimal.valueOf(selectiveList.get(i)));
-                    }
                     partScoreList.add(partScore.doubleValue());
                     partScoreMap.put(part, partScore.doubleValue());
                 }
@@ -1639,24 +1634,25 @@ public class MarkServiceImpl implements MarkService {
             list.add(markStepDTO);
             map.put(markStepDTO.getGroupNumber(), list);
         }
+        Date now = new Date();
         for (Integer groupNumber : map.keySet()) {
             MarkGroup group = groupDao.findOne(student.getExamId(), student.getSubjectCode(), groupNumber);
             if (group.getStatus() == MarkStatus.FINISH || group.getStatus() == MarkStatus.TRIAL) {
                 return false;
             }
-        }
-        Date now = new Date();
-        for (Integer groupNumber : map.keySet()) {
             List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(student.getId(), groupNumber);
             List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
                     student.getExamId(), student.getSubjectCode(), false, groupNumber);
             List<MarkStepDTO> qList = map.get(groupNumber);
-            MarkGroup group = groupDao.findOne(student.getExamId(), student.getSubjectCode(), groupNumber);
             int count = 0;
             for (MarkLibrary library : list) {
                 if (library.getTaskNumber() == 3) {
                     // 出现三评时删除第三条任务
                     problemHistoryDao.deleteByLibraryId(library.getId());
+                    trackDao.deleteByLibraryId(library.getId());
+                    specialTagDao.deleteByLibraryId(library.getId());
+                    headerTagDao.deleteByStudentIdAndGroupNumber(library.getStudentId(), groupNumber);
+                    headerTrackDao.deleteByPkStudentIdAndGroupNumber(library.getStudentId(), groupNumber);
                     libraryDao.delete(library);
                     updateLibraryCount(group);
                     count++;
@@ -1683,7 +1679,7 @@ public class MarkServiceImpl implements MarkService {
                 }
                 if (library.getStatus().equals(LibraryStatus.MARKED)
                         || library.getStatus().equals(LibraryStatus.INSPECTED)) {
-                    List<ScoreItem> sList = library.getScoreList();
+                    List<ScoreItem> sList = library.getMarkerScoreItem();
                     for (MarkStepDTO markStepDTO : qList) {
                         trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(), markStepDTO.getMainNumber() + "."
                                 + markStepDTO.getSubNumber());
@@ -1693,8 +1689,9 @@ public class MarkServiceImpl implements MarkService {
                             ExamQuestion question = questions.get(i);
                             if (markStepDTO.getMainNumber() == question.getMainNumber()
                                     && markStepDTO.getSubNumber().equals(question.getSubNumber())) {
-                                sList.remove(i);
-                                sList.add(i, new ScoreItem(false));
+                                ScoreItem si = sList.get(i);
+                                si.setScore(null);
+                                sList.add(i, si);
                             }
                         }
                     }
@@ -1706,9 +1703,6 @@ public class MarkServiceImpl implements MarkService {
                         } else {
                             markerScoreList.add("#");
                         }
-                        // if (i < sList.size() - 1) {
-                        // markerScoreList.append(",");
-                        // }
                     }
                     if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.REJECTED, library.getMarkerId(),
                             null, StringUtils.join(markerScoreList, ","), null, null, reason, userId, now,
@@ -1803,7 +1797,7 @@ public class MarkServiceImpl implements MarkService {
         history.setReason(reason);
 
         Date now = new Date();
-        List<ScoreItem> sList = library.getScoreList();
+        List<ScoreItem> sList = library.getMarkerScoreItem();
         for (MarkStepDTO markStepDTO : questionList) {
             trackDao.deleteByLibraryIdAndQuestionNumber(library.getId(), markStepDTO.getMainNumber() + "."
                     + markStepDTO.getSubNumber());
@@ -1813,8 +1807,9 @@ public class MarkServiceImpl implements MarkService {
                 ExamQuestion question = questions.get(i);
                 if (markStepDTO.getMainNumber() == question.getMainNumber()
                         && markStepDTO.getSubNumber().equals(question.getSubNumber())) {
-                    sList.remove(i);
-                    sList.add(i, new ScoreItem(false));
+                    ScoreItem si = sList.get(i);
+                    si.setScore(null);
+                    sList.add(i, si);
                 }
             }
         }

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

@@ -285,7 +285,7 @@ public class TaskServiceImpl implements TaskService {
         List<ScoreItem> rItems = null;
         if (library != null) {
             tracks = trackService.findByLibraryId(library.getId());
-            sItems = library.getScoreList();
+            sItems = library.getMarkerScoreItem();
         }
         if (rejectHistory != null) {
             rItems = rejectHistory.getRejectScoreItems();

+ 3 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/QuestionNumberBean.java

@@ -10,7 +10,7 @@ import java.util.List;
  */
 public interface QuestionNumberBean {
 
-    int getMainNumber();
+    Integer getMainNumber();
 
     String getSubNumber();
 
@@ -25,11 +25,11 @@ public interface QuestionNumberBean {
         int length = subNumber.length();
         for (int i = 0; i < length; i++) {
             char c = subNumber.charAt(i);
-            //数字字符
+            // 数字字符
             if (c >= '0' && c <= '9') {
                 buffer.append(c);
             }
-            //非数字字符,转换已累计数字
+            // 非数字字符,转换已累计数字
             else if (buffer.length() > 0) {
                 try {
                     list.add(Integer.parseInt(buffer.toString()));

+ 7 - 7
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/QuestionNumberComparator.java

@@ -11,21 +11,21 @@ public class QuestionNumberComparator implements Comparator<QuestionNumberBean>
 
     @Override
     public int compare(QuestionNumberBean b1, QuestionNumberBean b2) {
-        //比较大题号
+        // 比较大题号
         int i = b1.getMainNumber() - b2.getMainNumber();
         if (i != 0) {
             return i;
         }
-        //获取小题号数组
+        // 获取小题号数组
         Integer[] numbers1 = b1.getSubNumbers();
         Integer[] numbers2 = b2.getSubNumbers();
-        for (int j = 0; ; j++) {
+        for (int j = 0;; j++) {
             Integer n1 = j < numbers1.length ? numbers1[j] : null;
             Integer n2 = j < numbers2.length ? numbers2[j] : null;
             if (n1 == null && n2 == null) {
                 break;
             }
-            //位数短的优先
+            // 位数短的优先
             if (n1 == null) {
                 return -1;
             }
@@ -33,7 +33,7 @@ public class QuestionNumberComparator implements Comparator<QuestionNumberBean>
                 return 1;
             }
             i = n1 - n2;
-            //某一位比较出大小则返回
+            // 某一位比较出大小则返回
             if (i != 0) {
                 break;
             }
@@ -45,7 +45,7 @@ public class QuestionNumberComparator implements Comparator<QuestionNumberBean>
         QuestionNumberBean b1 = new QuestionNumberBean() {
 
             @Override
-            public int getMainNumber() {
+            public Integer getMainNumber() {
                 return 1;
             }
 
@@ -57,7 +57,7 @@ public class QuestionNumberComparator implements Comparator<QuestionNumberBean>
         QuestionNumberBean b2 = new QuestionNumberBean() {
 
             @Override
-            public int getMainNumber() {
+            public Integer getMainNumber() {
                 return 1;
             }
 

+ 34 - 35
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -205,8 +205,7 @@ public class InspectedController extends BaseExamController {
             if (inspectedService.applyStudent(ExamStudentVo.of(student), wu.getId())) {
                 task = taskService.build(student);
             }
-        }
-        if (StringUtils.isNotBlank(query.getSecretNumber())) {
+        } else if (StringUtils.isNotBlank(query.getSecretNumber())) {
             ExamStudent student = studentService.findByExamIdAndSecretNumber(examId, query.getSecretNumber());
             if (student == null) {
                 return null;
@@ -260,8 +259,8 @@ public class InspectedController extends BaseExamController {
         JSONObject obj = new JSONObject();
         ExamStudent student = studentService.findById(studentId);
         try {
-        	lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
-        	lockService.waitlock(LockType.STUDENT, studentId);
+            lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
+            lockService.waitlock(LockType.STUDENT, studentId);
             if (student != null && inspectedService.inspect(student, wu.getId())) {
                 inspectedService.releaseByStudent(student);
                 obj.accumulate("success", true);
@@ -309,8 +308,8 @@ public class InspectedController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         if (student != null && subjectCheck(student.getSubjectCode(), wu)) {
             try {
-            	lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
-            	lockService.waitlock(LockType.STUDENT, studentId);
+                lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
+                lockService.waitlock(LockType.STUDENT, studentId);
                 if (inspectedService.cancelByStudent(studentId)) {
                     obj.accumulate("success", true);
                 } else {
@@ -340,15 +339,15 @@ public class InspectedController extends BaseExamController {
         ExamSubject es = subjectService.find(examId, subjectCode);
         lockService.waitlock(LockType.EXAM_SUBJECT, examId, subjectCode);
         try {
-			if (!inspectedService.inspectFinish(examId, subjectCode, es.getInspectRound())) {
-				ra.addFlashAttribute("errmsg", "该科目第" + es.getInspectRound() + "次复核还未完成");
-				return "redirect:/admin/exam/inspected/list";
-			}
-			subjectService.nextInspectRound(examId, subjectCode);
-			return "redirect:/admin/exam/inspected/list";
-		} finally {
-			lockService.unlock(LockType.EXAM_SUBJECT, examId, subjectCode);
-		}
+            if (!inspectedService.inspectFinish(examId, subjectCode, es.getInspectRound())) {
+                ra.addFlashAttribute("errmsg", "该科目第" + es.getInspectRound() + "次复核还未完成");
+                return "redirect:/admin/exam/inspected/list";
+            }
+            subjectService.nextInspectRound(examId, subjectCode);
+            return "redirect:/admin/exam/inspected/list";
+        } finally {
+            lockService.unlock(LockType.EXAM_SUBJECT, examId, subjectCode);
+        }
     }
 
     @Logging(menu = "打回", type = LogType.UPDATE)
@@ -381,7 +380,7 @@ public class InspectedController extends BaseExamController {
                 obj.accumulate("message", "打回失败");
                 log.error("back inspected error", e);
             } finally {
-            	lockService.unlock(LockType.STUDENT, student.getId());
+                lockService.unlock(LockType.STUDENT, student.getId());
                 lockService.unwatch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
             }
         } else {
@@ -503,8 +502,8 @@ public class InspectedController extends BaseExamController {
             // subjectCode = student.getSubjectCode();
             if (student != null && subjectCheck(student.getSubjectCode(), wu)) {
                 try {
-                	lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
-                	lockService.waitlock(LockType.STUDENT, student.getId());
+                    lockService.watch(LockType.EXAM_SUBJECT, student.getExamId(), student.getSubjectCode());
+                    lockService.waitlock(LockType.STUDENT, student.getId());
                     inspectedService.cancelByStudent(id);
                 } catch (Exception e) {
                     log.error("back inspected error", e);
@@ -516,18 +515,18 @@ public class InspectedController extends BaseExamController {
         }
         return "redirect:/admin/exam/inspected/list";
     }
-    
-    private void subjectCodeQuery(ExamSubjectSearchQuery query,List<String> subjectCodeIn) {
-    	if(StringUtils.isEmpty(query.getCodeIn())) {
-    		query.setCodeIn(StringUtils.join(subjectCodeIn, ","));
-    	}else {
-    		Set<String> set=new HashSet<>();
-    		for(String c:query.getCodeIn().split(",")) {
-    			set.add(c);
-    		}
-    		set.addAll(subjectCodeIn);
-    		query.setCodeIn(StringUtils.join(set, ","));
-    	}
+
+    private void subjectCodeQuery(ExamSubjectSearchQuery query, List<String> subjectCodeIn) {
+        if (StringUtils.isEmpty(query.getCodeIn())) {
+            query.setCodeIn(StringUtils.join(subjectCodeIn, ","));
+        } else {
+            Set<String> set = new HashSet<>();
+            for (String c : query.getCodeIn().split(",")) {
+                set.add(c);
+            }
+            set.addAll(subjectCodeIn);
+            query.setCodeIn(StringUtils.join(set, ","));
+        }
     }
 
     @Logging(menu = "成绩复核进度查询", type = LogType.QUERY)
@@ -546,10 +545,10 @@ public class InspectedController extends BaseExamController {
                 query.setCodeIn(subjectCodeIn);
             }
         }
-//        if (wu.isSubjectHeader()) {
-//            String subjectCodeIn = StringUtils.join(wu.getSubjectCodeSet(), ",");
-//            query.setCodeIn(subjectCodeIn);
-//        }
+        // if (wu.isSubjectHeader()) {
+        // String subjectCodeIn = StringUtils.join(wu.getSubjectCodeSet(), ",");
+        // query.setCodeIn(subjectCodeIn);
+        // }
         List<ExamSubject> subjectList = getExamSubject(examId, wu);
         if (StringUtils.isBlank(query.getCode()) && wu.getRole() != Role.SCHOOL_ADMIN) {
             List<String> subjectCodeIn = new ArrayList<String>();
@@ -560,7 +559,7 @@ public class InspectedController extends BaseExamController {
         if (unFinishSet.isEmpty() && query.getFinished() != null && !query.getFinished()) {
             query.setResult(new ArrayList<ExamSubject>());
         }
-        
+
         List<InspectedSubjectVO> list = new LinkedList<InspectedSubjectVO>();
         for (ExamSubject subject : query.getResult()) {
             InspectedSubjectVO vo = new InspectedSubjectVO();

+ 6 - 11
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/SubjectiveCalculateThread.java

@@ -1,6 +1,5 @@
 package cn.com.qmth.stmms.admin.thread;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.slf4j.Logger;
@@ -38,9 +37,9 @@ public class SubjectiveCalculateThread implements Runnable {
 
     private ExamStudentService studentService;
 
-    public SubjectiveCalculateThread(Integer examId, String subjectCode,
-            MarkService markService, LockService lockService, ExamQuestionService questionService,
-            MarkGroupService groupService, MarkerService markerService, InspectedService inspectedService,ExamStudentService studentService) {
+    public SubjectiveCalculateThread(Integer examId, String subjectCode, MarkService markService,
+            LockService lockService, ExamQuestionService questionService, MarkGroupService groupService,
+            MarkerService markerService, InspectedService inspectedService, ExamStudentService studentService) {
         this.markService = markService;
         this.lockService = lockService;
         this.questionService = questionService;
@@ -54,7 +53,6 @@ public class SubjectiveCalculateThread implements Runnable {
 
     @Override
     public void run() {
-    	List<Integer> lockedStudentList=new ArrayList<>();
         try {
             lockService.waitlock(LockType.SCORE_CALCULATE, examId, subjectCode);
             lockService.waitlock(LockType.EXAM_SUBJECT, examId, subjectCode);
@@ -65,20 +63,17 @@ public class SubjectiveCalculateThread implements Runnable {
                     subjectCode, false);
             // 考生整体状态与总分更新
             long groupCount = groupService.countByExamAndSubject(examId, subjectCode);
-            List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(examId, subjectCode,
-                    SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED);
+            List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(examId,
+                    subjectCode, SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED);
             for (Integer studentId : studentList) {
                 lockService.waitlock(LockType.STUDENT, studentId);
-                lockedStudentList.add(studentId);
                 markService.checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
+                lockService.unlock(LockType.STUDENT, studentId);
             }
             inspectedService.cancelBySubject(examId, subjectCode);
         } catch (Exception e) {
             log.error("SubjectiveCalculateThread error", e);
         } finally {
-        	for (Integer studentId : lockedStudentList) {
-                lockService.unlock(LockType.STUDENT, studentId);
-            }
             lockService.unlock(LockType.EXAM_SUBJECT, examId, subjectCode);
             lockService.unlock(LockType.SCORE_CALCULATE, examId, subjectCode);
         }