瀏覽代碼

评卷分组与阅卷轨迹部分重构

1.阅卷轨迹表结构修改,适应多评的情况
2.修改评卷分组更新并重置的方法
luoshi 6 年之前
父節點
當前提交
8d9eb12266

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

@@ -11,6 +11,7 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.ScorePolicy;
 
 
 public interface MarkGroupDao
 public interface MarkGroupDao
         extends PagingAndSortingRepository<MarkGroup, MarkGroupPK>, JpaSpecificationExecutor<MarkGroup> {
         extends PagingAndSortingRepository<MarkGroup, MarkGroupPK>, JpaSpecificationExecutor<MarkGroup> {
@@ -89,10 +90,14 @@ public interface MarkGroupDao
     @Query("update MarkGroup g set g.title=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
     @Query("update MarkGroup g set g.title=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
     void updateTitle(int examId, String subjectCode, int number, String title);
     void updateTitle(int examId, String subjectCode, int number, String title);
 
 
-    @Modifying
+    @Modifying(clearAutomatically = true)
     @Query("update MarkGroup g set g.totalScore=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
     @Query("update MarkGroup g set g.totalScore=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
     void updateTotalScore(int examId, String subjectCode, int number, Double score);
     void updateTotalScore(int examId, String subjectCode, int number, Double score);
 
 
+    @Modifying(clearAutomatically = true)
+    @Query("update MarkGroup g set g.scorePolicy=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
+    void updateScorePolicy(int examId, String subjectCode, int number, ScorePolicy policy);
+
     @Modifying(clearAutomatically = true)
     @Modifying(clearAutomatically = true)
     @Query("update MarkGroup g set g.buildTime=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
     @Query("update MarkGroup g set g.buildTime=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
     void updateBuildTime(int examId, String subjectCode, int number, Date time);
     void updateBuildTime(int examId, String subjectCode, int number, Date time);

+ 9 - 17
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkTrackDao.java

@@ -12,32 +12,24 @@ import cn.com.qmth.stmms.biz.mark.model.MarkTrackPK;
 
 
 public interface MarkTrackDao extends JpaRepository<MarkTrack, MarkTrackPK>, JpaSpecificationExecutor<MarkTrack> {
 public interface MarkTrackDao extends JpaRepository<MarkTrack, MarkTrackPK>, JpaSpecificationExecutor<MarkTrack> {
 
 
-    List<MarkTrack> findByPkStudentId(Integer studentId);
+    List<MarkTrack> findByPkLibraryId(Integer libraryId);
 
 
-    @Modifying
-    @Query("delete from MarkTrack t where t.pk.studentId=?1 and t.markerId=?2")
-    void deleteByStudentIdAndMarkerId(Integer studentId, Integer markerId);
-
-    @Modifying
-    @Query("delete from MarkTrack t where t.pk.studentId=?1")
-    void deleteByStudentId(Integer studentId);
-
-    @Modifying
-    @Query("delete from MarkTrack t where t.pk.studentId=?1 and t.pk.questionNumber=?2")
-    void deleteByStudentIdAndQuestionNumber(Integer studentId, String questionNumber);
+    List<MarkTrack> findByStudentId(Integer studentId);
 
 
     @Modifying
     @Modifying
-    @Query("delete from MarkTrack t where t.examId=?1")
-    void deleteByExamId(Integer examId);
+    @Query("delete from MarkTrack t where t.pk.libraryId=?1")
+    void deleteByLibraryId(Integer libraryId);
 
 
     @Modifying
     @Modifying
-    @Query("delete from MarkTrack t where t.examId=?1 and t.subjectCode=?2 and t.groupNumber=?3")
-    void deleteByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer number);
+    @Query("delete from MarkTrack t where t.studentId=?1")
+    void deleteByStudentId(Integer studentId);
 
 
     @Modifying
     @Modifying
     @Query("delete from MarkTrack t where t.markerId=?1")
     @Query("delete from MarkTrack t where t.markerId=?1")
     void deleteByMarkerId(Integer markerId);
     void deleteByMarkerId(Integer markerId);
 
 
-    List<MarkTrack> findByPkStudentIdAndGroupNumber(Integer studentId, Integer number);
+    @Modifying
+    @Query("delete from MarkTrack t where t.examId=?1 and t.subjectCode=?2 and t.groupNumber=?3")
+    void deleteByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
 
 
 }
 }

+ 29 - 18
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkTrack.java

@@ -18,6 +18,9 @@ public class MarkTrack {
     @EmbeddedId
     @EmbeddedId
     private MarkTrackPK pk;
     private MarkTrackPK pk;
 
 
+    @Column(name = "student_id", nullable = false)
+    private Integer studentId;
+
     @Column(name = "exam_id", nullable = false)
     @Column(name = "exam_id", nullable = false)
     private Integer examId;
     private Integer examId;
 
 
@@ -52,12 +55,12 @@ public class MarkTrack {
         this.pk = new MarkTrackPK();
         this.pk = new MarkTrackPK();
     }
     }
 
 
-    public Integer getStudentId() {
-        return pk.getStudentId();
+    public Integer getLibraryId() {
+        return pk.getLibraryId();
     }
     }
 
 
-    public void setStudentId(Integer studentId) {
-        pk.setStudentId(studentId);
+    public void setLibraryId(Integer libraryId) {
+        pk.setLibraryId(libraryId);
     }
     }
 
 
     public String getQuestionNumber() {
     public String getQuestionNumber() {
@@ -100,36 +103,44 @@ public class MarkTrack {
         this.positionY = positionY;
         this.positionY = positionY;
     }
     }
 
 
-    public Integer getExamId() {
-        return examId;
+    public void setMarkerId(Integer markerId) {
+        this.markerId = markerId;
     }
     }
 
 
-    public void setExamId(Integer examId) {
-        this.examId = examId;
+    public Integer getGroupNumber() {
+        return groupNumber;
     }
     }
 
 
-    public String getSubjectCode() {
-        return subjectCode;
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
     }
     }
 
 
-    public void setSubjectCode(String subjectCode) {
-        this.subjectCode = subjectCode;
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
     }
     }
 
 
     public Integer getMarkerId() {
     public Integer getMarkerId() {
         return markerId;
         return markerId;
     }
     }
 
 
-    public void setMarkerId(Integer markerId) {
-        this.markerId = markerId;
+    public Integer getExamId() {
+        return examId;
     }
     }
 
 
-    public Integer getGroupNumber() {
-        return groupNumber;
+    public void setExamId(Integer examId) {
+        this.examId = examId;
     }
     }
 
 
-    public void setGroupNumber(Integer groupNumber) {
-        this.groupNumber = groupNumber;
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
     }
     }
 
 
 }
 }

+ 10 - 10
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkTrackPK.java

@@ -10,8 +10,8 @@ public class MarkTrackPK implements Serializable {
 
 
     private static final long serialVersionUID = 9096523417236451724L;
     private static final long serialVersionUID = 9096523417236451724L;
 
 
-    @Column(name = "student_id", nullable = false)
-    private Integer studentId;
+    @Column(name = "library_id", nullable = false)
+    private Integer libraryId;
 
 
     @Column(name = "question_number", nullable = false)
     @Column(name = "question_number", nullable = false)
     private String questionNumber;
     private String questionNumber;
@@ -19,12 +19,12 @@ public class MarkTrackPK implements Serializable {
     @Column(name = "number", nullable = false)
     @Column(name = "number", nullable = false)
     private Integer number;
     private Integer number;
 
 
-    public Integer getStudentId() {
-        return studentId;
+    public Integer getLibraryId() {
+        return libraryId;
     }
     }
 
 
-    public void setStudentId(Integer studentId) {
-        this.studentId = studentId;
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
     }
     }
 
 
     public String getQuestionNumber() {
     public String getQuestionNumber() {
@@ -47,7 +47,7 @@ public class MarkTrackPK implements Serializable {
     public int hashCode() {
     public int hashCode() {
         final int PRIME = 31;
         final int PRIME = 31;
         int result = 1;
         int result = 1;
-        result = PRIME * result + ((studentId == null) ? 0 : studentId.hashCode());
+        result = PRIME * result + ((libraryId == null) ? 0 : libraryId.hashCode());
         result = PRIME * result + ((questionNumber == null) ? 0 : questionNumber.hashCode());
         result = PRIME * result + ((questionNumber == null) ? 0 : questionNumber.hashCode());
         result = PRIME * result + ((number == null) ? 0 : number.hashCode());
         result = PRIME * result + ((number == null) ? 0 : number.hashCode());
         return result;
         return result;
@@ -62,10 +62,10 @@ public class MarkTrackPK implements Serializable {
         if (getClass() != obj.getClass())
         if (getClass() != obj.getClass())
             return false;
             return false;
         final MarkTrackPK other = (MarkTrackPK) obj;
         final MarkTrackPK other = (MarkTrackPK) obj;
-        if (studentId == null) {
-            if (other.studentId != null)
+        if (libraryId == null) {
+            if (other.libraryId != null)
                 return false;
                 return false;
-        } else if (!studentId.equals(other.studentId))
+        } else if (!libraryId.equals(other.libraryId))
             return false;
             return false;
         if (questionNumber == null) {
         if (questionNumber == null) {
             if (other.questionNumber != null)
             if (other.questionNumber != null)

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/Task.java

@@ -348,6 +348,16 @@ public class Task implements Serializable {
         return map;
         return map;
     }
     }
 
 
+    public List<MarkTrack> getTrackList(MarkLibrary library) {
+        List<MarkTrack> list = new LinkedList<>();
+        if (trackList != null) {
+            for (TrackDTO dto : trackList) {
+                list.add(dto.transform(library));
+            }
+        }
+        return list;
+    }
+
     public SpecialTagDTO[] getTagList() {
     public SpecialTagDTO[] getTagList() {
         return tagList;
         return tagList;
     }
     }

+ 3 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TrackDTO.java

@@ -36,16 +36,17 @@ public class TrackDTO implements Serializable {
 
 
     public MarkTrack transform(MarkLibrary library) {
     public MarkTrack transform(MarkLibrary library) {
         MarkTrack track = new MarkTrack();
         MarkTrack track = new MarkTrack();
-        track.setStudentId(library.getStudentId());
+        track.setLibraryId(library.getId());
         track.setQuestionNumber(getQuestionNumber());
         track.setQuestionNumber(getQuestionNumber());
         track.setNumber(getNumber());
         track.setNumber(getNumber());
+        track.setStudentId(library.getStudentId());
         track.setExamId(library.getExamId());
         track.setExamId(library.getExamId());
         track.setSubjectCode(library.getSubjectCode());
         track.setSubjectCode(library.getSubjectCode());
+        track.setGroupNumber(library.getGroupNumber());
         track.setMarkerId(library.getMarkerId());
         track.setMarkerId(library.getMarkerId());
         track.setScore(getScore());
         track.setScore(getScore());
         track.setPositionX(getPositionX());
         track.setPositionX(getPositionX());
         track.setPositionY(getPositionY());
         track.setPositionY(getPositionY());
-        track.setGroupNumber(library.getGroupNumber());
         return track;
         return track;
     }
     }
 
 

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

@@ -3,7 +3,6 @@ package cn.com.qmth.stmms.biz.mark.service.Impl;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
-import java.util.Map;
 
 
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
@@ -124,15 +123,7 @@ public class MarkServiceImpl implements MarkService {
     public void resetByGroup(MarkGroup group) {
     public void resetByGroup(MarkGroup group) {
         try {
         try {
             lockService.lockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
             lockService.lockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
-            groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
-            libraryDao.resetByExamIdAndSubjectCodeAndNumber(group.getExamId(), group.getSubjectCode(),
-                    group.getNumber(), LibraryStatus.WAITING);
-            arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
-                    group.getNumber());
-            trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
-                    group.getNumber());
-            specialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
-            releaseByGroup(group);
+            resetGroup(group);
         } catch (Exception e) {
         } catch (Exception e) {
             throw e;
             throw e;
         } finally {
         } finally {
@@ -176,28 +167,37 @@ public class MarkServiceImpl implements MarkService {
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
-    public void updateGroupScore(MarkGroup group, List<Double> scores) {
-        resetByGroup(group);
-        questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndMainNumber(group.getExamId(), group.getSubjectCode(),
-                false, group.getNumber());
-        int i = 0;
-        double totalScore = 0d;
-        for (Double score : scores) {
-            i++;
-            totalScore += score;
-            ExamQuestion question = new ExamQuestion();
-            question.setExamId(group.getExamId());
-            question.setSubjectCode(group.getSubjectCode());
-            question.setMainTitle(group.getTitle());
-            question.setMainNumber(group.getNumber());
-            question.setSubNumber(i);
-            question.setObjective(false);
-            question.setTotalScore(score);
-            question.setIntervalScore(1d);
-            questionDao.save(question);
+    public void updateGroup(MarkGroup group, List<Double> scores, ScorePolicy policy) {
+        try {
+            lockService.lockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
+
+            questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndMainNumber(group.getExamId(), group.getSubjectCode(),
+                    false, group.getNumber());
+            int i = 0;
+            double totalScore = 0d;
+            for (Double score : scores) {
+                i++;
+                totalScore += score;
+                ExamQuestion question = new ExamQuestion();
+                question.setExamId(group.getExamId());
+                question.setSubjectCode(group.getSubjectCode());
+                question.setMainTitle(group.getTitle());
+                question.setMainNumber(group.getNumber());
+                question.setSubNumber(i);
+                question.setObjective(false);
+                question.setTotalScore(score);
+                question.setIntervalScore(1d);
+                questionDao.save(question);
+            }
+            groupDao.updateTotalScore(group.getExamId(), group.getSubjectCode(), group.getNumber(), totalScore);
+            groupDao.updateScorePolicy(group.getExamId(), group.getSubjectCode(), group.getNumber(), policy);
+            subjectService.updateScore(group.getExamId(), group.getSubjectCode());
+            resetGroup(group);
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            lockService.unlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
         }
         }
-        groupDao.updateTotalScore(group.getExamId(), group.getSubjectCode(), group.getNumber(), totalScore);
-        subjectService.updateScore(group.getExamId(), group.getSubjectCode());
     }
     }
 
 
     /**
     /**
@@ -289,8 +289,7 @@ public class MarkServiceImpl implements MarkService {
      */
      */
     @Override
     @Override
     @Transactional
     @Transactional
-    public void submitLibrary(MarkLibrary library, Map<String, List<MarkTrack>> trackMap,
-            List<MarkSpecialTag> tagList) {
+    public void submitLibrary(MarkLibrary library, List<MarkTrack> trackList, List<MarkSpecialTag> tagList) {
         // 判断大题是否存在
         // 判断大题是否存在
         MarkGroup group = groupDao.findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
         MarkGroup group = groupDao.findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
         if (group == null) {
         if (group == null) {
@@ -305,14 +304,12 @@ public class MarkServiceImpl implements MarkService {
             return;
             return;
         }
         }
         // 保存阅卷轨迹
         // 保存阅卷轨迹
-        if (trackMap != null) {
-            for (String questionNumber : trackMap.keySet()) {
-                trackDao.deleteByStudentIdAndQuestionNumber(library.getStudentId(), questionNumber);
-                trackDao.save(trackMap.get(questionNumber));
-            }
+        if (trackList != null) {
+            trackDao.deleteByLibraryId(library.getId());
+            trackDao.save(trackList);
         }
         }
         // 保存特殊标记
         // 保存特殊标记
-        if (tagList != null && tagList.size() > 0) {
+        if (tagList != null) {
             specialTagDao.deleteByLibraryId(library.getId());
             specialTagDao.deleteByLibraryId(library.getId());
             specialTagDao.save(tagList);
             specialTagDao.save(tagList);
         }
         }
@@ -366,7 +363,7 @@ public class MarkServiceImpl implements MarkService {
     public void backLibrary(MarkLibrary library) {
     public void backLibrary(MarkLibrary library) {
         if (library.getStatus() == LibraryStatus.MARKED) {
         if (library.getStatus() == LibraryStatus.MARKED) {
             lockService.waitUnlockGroup(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
             lockService.waitUnlockGroup(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
-            trackDao.deleteByStudentIdAndMarkerId(library.getStudentId(), library.getMarkerId());
+            trackDao.deleteByLibraryId(library.getId());
             specialTagDao.deleteByLibraryId(library.getId());
             specialTagDao.deleteByLibraryId(library.getId());
             libraryDao.resetById(library.getId(), LibraryStatus.BACKED);
             libraryDao.resetById(library.getId(), LibraryStatus.BACKED);
             updateLibraryCount(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
             updateLibraryCount(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
@@ -578,12 +575,21 @@ public class MarkServiceImpl implements MarkService {
         return library.getStudentId() + "_" + library.getGroupNumber();
         return library.getStudentId() + "_" + library.getGroupNumber();
     }
     }
 
 
-    @Transactional
-	@Override
-	public void updateGroupScorePolicy(MarkGroup group, Integer scorePolicy) {
-		group.setScorePolicy(ScorePolicy.findByValue(scorePolicy));
-		groupDao.save(group);
-		resetByGroup(group);
-	}
+    /**
+     * 重置评卷分组的连带操作
+     * 
+     * @param group
+     */
+    private void resetGroup(MarkGroup group) {
+        groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
+        libraryDao.resetByExamIdAndSubjectCodeAndNumber(group.getExamId(), group.getSubjectCode(), group.getNumber(),
+                LibraryStatus.WAITING);
+        arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
+                group.getNumber());
+        specialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
+        releaseByGroup(group);
+    }
 
 
 }
 }

+ 5 - 34
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkTrackServiceImpl.java

@@ -19,47 +19,18 @@ public class MarkTrackServiceImpl extends BaseQueryService<MarkTrack> implements
 
 
     @Override
     @Override
     public List<MarkTrack> findByStudentId(Integer studentId) {
     public List<MarkTrack> findByStudentId(Integer studentId) {
-        return markTrackDao.findByPkStudentId(studentId);
+        return markTrackDao.findByStudentId(studentId);
     }
     }
 
 
-    @Transactional
-    @Override
-    public MarkTrack save(MarkTrack track) {
-        return markTrackDao.save(track);
-    }
-
-    @Transactional
-    @Override
-    public void deleteByStudentId(Integer studentId) {
-        markTrackDao.deleteByStudentId(studentId);
-    }
-
-    @Transactional
     @Override
     @Override
-    public void deleteByStudentIdAndQuestionNumber(Integer studentId, String questionNumber) {
-        markTrackDao.deleteByStudentIdAndQuestionNumber(studentId, questionNumber);
+    public List<MarkTrack> findByLibraryId(Integer libraryId) {
+        return markTrackDao.findByPkLibraryId(libraryId);
     }
     }
 
 
     @Transactional
     @Transactional
     @Override
     @Override
-    public void deleteByExamId(Integer examId) {
-        markTrackDao.deleteByExamId(examId);
-    }
-
-    @Transactional
-    @Override
-    public void deleteByExamAndSubjectAndGroup(Integer examId, String subjectCode, Integer number) {
-        markTrackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(examId, subjectCode, number);
-    }
-
-    @Transactional
-    @Override
-    public void deleteByMarkerId(Integer markerId) {
-        markTrackDao.deleteByMarkerId(markerId);
+    public MarkTrack save(MarkTrack track) {
+        return markTrackDao.save(track);
     }
     }
 
 
-    @Override
-    public List<MarkTrack> findByStudentIdAndGroupNumber(Integer studentId, Integer number) {
-        return markTrackDao.findByPkStudentIdAndGroupNumber(studentId, number);
-    }
 }
 }

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

@@ -1,12 +1,9 @@
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 package cn.com.qmth.stmms.biz.mark.service.Impl;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.LinkedList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.List;
-import java.util.Map;
 
 
-import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,12 +30,10 @@ import cn.com.qmth.stmms.biz.mark.model.SpecialTagDTO;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.TrackDTO;
 import cn.com.qmth.stmms.biz.mark.model.TrackDTO;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.ArbitrateHistoryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
-import cn.com.qmth.stmms.common.enums.HistoryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 
 
@@ -77,9 +72,6 @@ public class TaskServiceImpl implements TaskService {
     @Autowired
     @Autowired
     private MarkerService markerService;
     private MarkerService markerService;
 
 
-    @Autowired
-    private ArbitrateHistoryService arbitrateService;
-
     @Override
     @Override
     public List<Task> findByQuery(MarkLibrarySearchQuery query) {
     public List<Task> findByQuery(MarkLibrarySearchQuery query) {
         List<Task> list = new LinkedList<Task>();
         List<Task> list = new LinkedList<Task>();
@@ -202,99 +194,6 @@ public class TaskServiceImpl implements TaskService {
         }
         }
     }
     }
 
 
-    /**
-     * 保存评卷任务
-     * 
-     * @param task
-     * @return
-     */
-    private MarkLibrary updateLibrary(Task task) {
-        MarkLibrary library = libraryService.findById(task.getLibraryId());
-        if (library != null) {
-            // 判断大题是否存在
-            MarkGroup group = groupService.findOne(library.getExamId(), library.getSubjectCode(),
-                    library.getGroupNumber());
-            if (group == null) {
-                return null;
-            }
-            // 保存阅卷轨迹
-            Map<String, List<TrackDTO>> trackMap = task.getTrackMap();
-            for (String questionNumber : trackMap.keySet()) {
-                trackService.deleteByStudentIdAndQuestionNumber(library.getStudentId(), questionNumber);
-                List<TrackDTO> list = trackMap.get(questionNumber);
-                for (TrackDTO dto : list) {
-                    trackService.save(dto.transform(library));
-                }
-            }
-            // 保存特殊标记
-            SpecialTagDTO[] tagList = task.getTagList();
-            if (tagList != null && tagList.length > 0) {
-                markSpecialTagService.deleteByLibraryId(library.getId());
-                for (SpecialTagDTO s : tagList) {
-                    markSpecialTagService.save(s.transform(library));
-                }
-            }
-
-            if (task.getHeaderId() != null) {
-                // 组长或管理员打分模式
-                library.setHeaderId(task.getHeaderId());
-                library.setHeaderTime(new Date());
-                library.setHeaderScore(task.getHeaderScore());
-                library.setHeaderScoreList(task.getHeaderScoreList());
-                library.setStatus(LibraryStatus.MARKED);
-                library.setTags(StringUtils.trimToNull(task.getTags()));
-            } else {
-                // 评卷员打分模式
-                library.setMarkerId(task.getMarkId());
-                library.setMarkerTime(new Date());
-                library.setMarkerScore(task.getTotalScore());
-                library.setMarkerScoreList(task.getScoreList());
-                library.setStatus(LibraryStatus.MARKED);
-                library.setTags(StringUtils.trimToNull(task.getTags()));
-
-                List<MarkLibrary> list = libraryService.findByStudentAndGroup(library.getStudentId(),
-                        library.getGroupNumber());
-                ArbitrateHistory history = null;
-                if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
-                    // 多评模式
-                    for (MarkLibrary other : list) {
-                        if (other.getId().equals(library.getId()) || other.getStatus() != LibraryStatus.MARKED
-                                || other.getMarkerScore() == null || other.getHeaderScore() != null) {
-                            // 未评卷或组长已打分,则跳过该任务
-                            continue;
-                        }
-                        if (Math.abs(other.getMarkerScore() - library.getMarkerScore()) > group
-                                .getArbitrateThreshold()) {
-                            // 分差超过阀值,触发仲裁
-                            history = new ArbitrateHistory();
-                            history.setExamId(library.getExamId());
-                            history.setSubjectCode(library.getSubjectCode());
-                            history.setGroupNumber(library.getGroupNumber());
-                            history.setStudentId(library.getStudentId());
-                            history.setExamNumber(library.getExamNumber());
-                            history.setStatus(HistoryStatus.WAITING);
-                            history.setCreateTime(new Date());
-                            arbitrateService.save(history);
-
-                            library.setStatus(LibraryStatus.WAIT_ARBITRATE);
-                            break;
-                        }
-                    }
-                }
-                // library = libraryService.save(library);
-                // 触发仲裁后续处理
-                if (history != null) {
-                    // libraryService.setArbitrate(history.getStudentId(),
-                    // history.getGroupNumber());
-                }
-            }
-            // 更新评卷任务数量
-            // groupService.updateLibraryCount(library.getExamId(),
-            // library.getSubjectCode(), library.getGroupNumber());
-        }
-        return library;
-    }
-
     public SpecialTagDTO[] getMarkSpecialTagList(Integer libraryId) {
     public SpecialTagDTO[] getMarkSpecialTagList(Integer libraryId) {
         SpecialTagDTO[] specialTags = null;
         SpecialTagDTO[] specialTags = null;
         List<MarkSpecialTag> list = markSpecialTagService.findByLibraryId(libraryId);
         List<MarkSpecialTag> list = markSpecialTagService.findByLibraryId(libraryId);

+ 4 - 11
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java

@@ -1,7 +1,6 @@
 package cn.com.qmth.stmms.biz.mark.service;
 package cn.com.qmth.stmms.biz.mark.service;
 
 
 import java.util.List;
 import java.util.List;
-import java.util.Map;
 
 
 import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
@@ -12,6 +11,7 @@ import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.common.enums.ScorePolicy;
 
 
 public interface MarkService {
 public interface MarkService {
 
 
@@ -41,7 +41,7 @@ public interface MarkService {
      * 
      * 
      * @param group
      * @param group
      */
      */
-    void updateGroupScore(MarkGroup group, List<Double> scores);
+    void updateGroup(MarkGroup group, List<Double> scores, ScorePolicy policy);
 
 
     /**
     /**
      * 评卷员申请领取某个评卷任务
      * 评卷员申请领取某个评卷任务
@@ -99,10 +99,10 @@ public interface MarkService {
      * 评卷员提交某个评卷任务
      * 评卷员提交某个评卷任务
      * 
      * 
      * @param library
      * @param library
-     * @param trackMap
+     * @param trackList
      * @param tagList
      * @param tagList
      */
      */
-    void submitLibrary(MarkLibrary library, Map<String, List<MarkTrack>> trackMap, List<MarkSpecialTag> tagList);
+    void submitLibrary(MarkLibrary library, List<MarkTrack> trackList, List<MarkSpecialTag> tagList);
 
 
     /**
     /**
      * 管理员/组长直接对考生打分
      * 管理员/组长直接对考生打分
@@ -162,11 +162,4 @@ public interface MarkService {
      */
      */
     void buildLibrary(ExamStudent student, Campus campus, MarkGroup group);
     void buildLibrary(ExamStudent student, Campus campus, MarkGroup group);
 
 
-    /**
-     * 更新某个大题判分策略并重置
-     * @param group
-     * @param scorePolicy
-     */
-	void updateGroupScorePolicy(MarkGroup group, Integer scorePolicy);
-
 }
 }

+ 15 - 25
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkTrackService.java

@@ -1,25 +1,15 @@
-package cn.com.qmth.stmms.biz.mark.service;
-
-import java.util.List;
-
-import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
-
-public interface MarkTrackService {
-
-    MarkTrack save(MarkTrack track);
-
-    List<MarkTrack> findByStudentId(Integer studentId);
-
-    void deleteByStudentId(Integer studentId);
-
-    void deleteByStudentIdAndQuestionNumber(Integer studentId, String questionNumber);
-
-    void deleteByExamId(Integer examId);
-
-    void deleteByMarkerId(Integer markerId);
-
-    List<MarkTrack> findByStudentIdAndGroupNumber(Integer studentId, Integer number);
-
-    void deleteByExamAndSubjectAndGroup(Integer examId, String subjectCode, Integer number);
-
-}
+package cn.com.qmth.stmms.biz.mark.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
+
+public interface MarkTrackService {
+
+    MarkTrack save(MarkTrack track);
+
+    List<MarkTrack> findByStudentId(Integer studentId);
+
+    List<MarkTrack> findByLibraryId(Integer libraryId);
+
+}

+ 198 - 198
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java

@@ -1,198 +1,198 @@
-package cn.com.qmth.stmms.admin.exam;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
-import cn.com.qmth.stmms.admin.vo.ExamInfoVO;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
-import cn.com.qmth.stmms.biz.user.model.User;
-import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.ExamStatus;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.Paginator;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-@Controller
-@RequestMapping("/admin")
-public class ExamController extends BaseExamController {
-
-    protected static Logger log = LoggerFactory.getLogger(ExamController.class);
-
-    @Autowired
-    private ExamService examService;
-
-    @Autowired
-    private ExamStudentService examStudentService;
-
-    @Autowired
-    private MarkerService markerService;
-
-    @Autowired
-    private ExamSubjectService examSubjectService;
-
-    @RequestMapping(value = { "/exam-list" })
-    public String examList(Model model, HttpServletRequest request, ExamSearchQuery query) {
-        SessionExamUtils.clearExamId(request);
-        User user = RequestUtils.getWebUser(request).getUser();
-        query.setSchoolId(user.getSchoolId());
-        query.setOrderByCreateTimeDesc(true);
-        query = examService.findByQuery(query);
-        if (query.getCurrentCount() > 0) {
-            model.addAttribute("examList", query.getResult());
-            model.addAttribute("paginator",
-                    new Paginator(query.getPageNumber(), query.getPageSize(), (int) query.getTotalCount()));
-        }
-        model.addAttribute("query", query);
-        return "modules/exam/examList";
-    }
-
-    @RequestMapping("/exam-create")
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String add(Exam exam, Model model) {
-        model.addAttribute("exam", exam);
-        model.addAttribute("statusList", ExamStatus.values());
-        return "modules/exam/examForm";
-    }
-    
-    @RequestMapping("/exam-edit/{examId}")
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String edit(@PathVariable Integer examId, Model model) {
-    	Exam exam = examService.findById(examId);
-        model.addAttribute("exam", exam);
-        model.addAttribute("statusList", ExamStatus.values());
-        return "modules/exam/examEdit";
-    }
-    
-    @RequestMapping(value = "/exam-save", method = RequestMethod.POST)
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String save(HttpServletRequest request, Exam exam, RedirectAttributes redirectAttributes) {
-        User user = RequestUtils.getWebUser(request).getUser();
-        exam.setSchoolId(user.getSchoolId());
-        exam.setCreatorId(user.getId());
-        exam.setStatus(ExamStatus.START);
-        exam = examService.save(exam);
-        addMessage(redirectAttributes, "创建考试'" + exam.getName() + "'成功");
-        return "redirect:/admin/exam-list";
-    }
-
-    @RequestMapping(value = "/exam-edit", method = RequestMethod.POST)
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public String examEdit(HttpServletRequest request,Exam exam,int StatusValue, RedirectAttributes redirectAttributes) {
-        User user = RequestUtils.getWebUser(request).getUser();
-        Exam oldExam = examService.findById(exam.getId());
-        if (oldExam != null && oldExam.getCreatorId().intValue() == user.getId().intValue()) {
-            oldExam.setName(exam.getName());
-            oldExam.setExamTime(exam.getExamTime());
-            oldExam.setDescription(exam.getDescription());
-            oldExam.setStatus(ExamStatus.findByValue(StatusValue));
-            oldExam.setForceSpecialTag(exam.isForceSpecialTag());
-            examService.save(oldExam);
-        }
-        return "redirect:/admin/exam-list";
-    }
-
-    @RequestMapping("/exam-select/{examId}")
-    public String select(Model model, HttpServletRequest request, @PathVariable Integer examId) {
-        SessionExamUtils.setExamId(request, examId);
-        WebUser wu = RequestUtils.getWebUser(request);
-        if(wu.isSchoolViewer()){
-        	return "redirect:/admin/exam/score";
-        }
-        return "redirect:/admin/exam/student";
-    }
-
-    @RequestMapping("/exam-view/{examId}")
-    public String view(Model model, HttpServletRequest request, @PathVariable Integer examId) {
-        SessionExamUtils.setExamId(request, examId);
-
-        Exam exam = examService.findById(examId);
-        long studentCount = examStudentService.countByExamId(exam.getId());
-        long subjectCount = examSubjectService.count(examId);
-        long campusCount = examStudentService.countCampusByExam(examId);
-        long markerCount = markerService.countByExam(exam.getId());
-        long scanCount = examStudentService.countByExamIdAndUpload(examId, true);
-        long markedCount = examStudentService.countByExamIdAndSubjectiveScoreListIsNotNull(examId);
-
-        List<ExamInfoVO> voList = new ArrayList<ExamInfoVO>();
-
-        ExamInfoVO student = new ExamInfoVO();
-        student.setName("考生");
-        student.setAttr("共导入 " + studentCount + " 个考生");
-        student.setUrl("/admin/exam/student");
-
-        ExamInfoVO subject = new ExamInfoVO();
-        subject.setName("科目");
-        subject.setAttr("共导入 " + subjectCount + " 个科目");
-        subject.setUrl("/admin/exam/paper");
-
-        ExamInfoVO campus = new ExamInfoVO();
-        campus.setName("学习中心");
-        campus.setAttr("共导入 " + campusCount + " 个学习中心");
-        campus.setUrl("/admin/exam/student");
-
-        ExamInfoVO marker = new ExamInfoVO();
-        marker.setName("评卷员");
-        marker.setAttr("已创建 " + markerCount + " 个评卷员");
-        marker.setUrl("/admin/exam/marker");
-
-        ExamInfoVO scan = new ExamInfoVO();
-        scan.setName("扫描进度");
-        scan.setAttr("已扫描 " + scanCount + " 个考生");
-        scan.setUrl("/admin/exam/scan");
-
-        ExamInfoVO mark = new ExamInfoVO();
-        mark.setName("评卷进度");
-        mark.setAttr("已评完 " + markedCount + " 个考生");
-        mark.setUrl("/admin/exam/mark");
-
-        voList.add(student);
-        voList.add(subject);
-        voList.add(campus);
-        voList.add(marker);
-        voList.add(scan);
-        voList.add(mark);
-        model.addAttribute("exam", exam);
-        model.addAttribute("list", voList);
-        return "modules/exam/examInfo";
-    }
-
-    @RequestMapping("/exam/info")
-    @ResponseBody
-    public Exam getExamInfo(HttpServletRequest request) {
-        Exam exam = examService.findById(getSessionExamId(request));
-        return exam;
-    }
-
-    @RequestMapping("/exam/finish")
-    @Transactional
-    @ResponseBody
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public void finished(HttpServletRequest request) {
-        Exam exam = examService.findById(getSessionExamId(request));
-        exam.setStatus(ExamStatus.FINISH);
-        examService.save(exam);
-    }
-
-}
+package cn.com.qmth.stmms.admin.exam;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
+import cn.com.qmth.stmms.admin.vo.ExamInfoVO;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.utils.Paginator;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+
+@Controller
+@RequestMapping("/admin")
+public class ExamController extends BaseExamController {
+
+    protected static Logger log = LoggerFactory.getLogger(ExamController.class);
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private ExamStudentService examStudentService;
+
+    @Autowired
+    private MarkerService markerService;
+
+    @Autowired
+    private ExamSubjectService examSubjectService;
+
+    @RequestMapping(value = { "/exam-list" })
+    public String examList(Model model, HttpServletRequest request, ExamSearchQuery query) {
+        SessionExamUtils.clearExamId(request);
+        User user = RequestUtils.getWebUser(request).getUser();
+        query.setSchoolId(user.getSchoolId());
+        query.setOrderByCreateTimeDesc(true);
+        query = examService.findByQuery(query);
+        if (query.getCurrentCount() > 0) {
+            model.addAttribute("examList", query.getResult());
+            model.addAttribute("paginator",
+                    new Paginator(query.getPageNumber(), query.getPageSize(), (int) query.getTotalCount()));
+        }
+        model.addAttribute("query", query);
+        return "modules/exam/examList";
+    }
+
+    @RequestMapping("/exam-create")
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String add(Exam exam, Model model) {
+        model.addAttribute("exam", exam);
+        model.addAttribute("statusList", ExamStatus.values());
+        return "modules/exam/examForm";
+    }
+
+    @RequestMapping("/exam-edit/{examId}")
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String edit(@PathVariable Integer examId, Model model) {
+        Exam exam = examService.findById(examId);
+        model.addAttribute("exam", exam);
+        model.addAttribute("statusList", ExamStatus.values());
+        return "modules/exam/examEdit";
+    }
+
+    @RequestMapping(value = "/exam-save", method = RequestMethod.POST)
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String save(HttpServletRequest request, Exam exam, RedirectAttributes redirectAttributes) {
+        User user = RequestUtils.getWebUser(request).getUser();
+        exam.setSchoolId(user.getSchoolId());
+        exam.setCreatorId(user.getId());
+        exam.setStatus(ExamStatus.START);
+        exam = examService.save(exam);
+        addMessage(redirectAttributes, "创建考试'" + exam.getName() + "'成功");
+        return "redirect:/admin/exam-list";
+    }
+
+    @RequestMapping(value = "/exam-edit", method = RequestMethod.POST)
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String examEdit(HttpServletRequest request, Exam exam, int StatusValue,
+            RedirectAttributes redirectAttributes) {
+        User user = RequestUtils.getWebUser(request).getUser();
+        Exam oldExam = examService.findById(exam.getId());
+        if (oldExam != null && oldExam.getCreatorId().intValue() == user.getId().intValue()) {
+            oldExam.setName(exam.getName());
+            oldExam.setExamTime(exam.getExamTime());
+            oldExam.setDescription(exam.getDescription());
+            oldExam.setStatus(ExamStatus.findByValue(StatusValue));
+            oldExam.setForceSpecialTag(exam.isForceSpecialTag());
+            examService.save(oldExam);
+        }
+        return "redirect:/admin/exam-list";
+    }
+
+    @RequestMapping("/exam-select/{examId}")
+    public String select(Model model, HttpServletRequest request, @PathVariable Integer examId) {
+        SessionExamUtils.setExamId(request, examId);
+        WebUser wu = RequestUtils.getWebUser(request);
+        if (wu.isSchoolViewer()) {
+            return "redirect:/admin/exam/score";
+        }
+        return "redirect:/admin/exam/student";
+    }
+
+    @RequestMapping("/exam-view/{examId}")
+    public String view(Model model, HttpServletRequest request, @PathVariable Integer examId) {
+        SessionExamUtils.setExamId(request, examId);
+
+        Exam exam = examService.findById(examId);
+        long studentCount = examStudentService.countByExamId(exam.getId());
+        long subjectCount = examSubjectService.count(examId);
+        long campusCount = examStudentService.countCampusByExam(examId);
+        long markerCount = markerService.countByExam(exam.getId());
+        long scanCount = examStudentService.countByExamIdAndUpload(examId, true);
+        long markedCount = examStudentService.countByExamIdAndSubjectiveScoreListIsNotNull(examId);
+
+        List<ExamInfoVO> voList = new ArrayList<ExamInfoVO>();
+
+        ExamInfoVO student = new ExamInfoVO();
+        student.setName("考生");
+        student.setAttr("共导入 " + studentCount + " 个考生");
+        student.setUrl("/admin/exam/student");
+
+        ExamInfoVO subject = new ExamInfoVO();
+        subject.setName("科目");
+        subject.setAttr("共导入 " + subjectCount + " 个科目");
+        subject.setUrl("/admin/exam/paper");
+
+        ExamInfoVO campus = new ExamInfoVO();
+        campus.setName("学习中心");
+        campus.setAttr("共导入 " + campusCount + " 个学习中心");
+        campus.setUrl("/admin/exam/student");
+
+        ExamInfoVO marker = new ExamInfoVO();
+        marker.setName("评卷员");
+        marker.setAttr("已创建 " + markerCount + " 个评卷员");
+        marker.setUrl("/admin/exam/marker");
+
+        ExamInfoVO scan = new ExamInfoVO();
+        scan.setName("扫描进度");
+        scan.setAttr("已扫描 " + scanCount + " 个考生");
+        scan.setUrl("/admin/exam/scan");
+
+        ExamInfoVO mark = new ExamInfoVO();
+        mark.setName("评卷进度");
+        mark.setAttr("已评完 " + markedCount + " 个考生");
+        mark.setUrl("/admin/exam/mark");
+
+        voList.add(student);
+        voList.add(subject);
+        voList.add(campus);
+        voList.add(marker);
+        voList.add(scan);
+        voList.add(mark);
+        model.addAttribute("exam", exam);
+        model.addAttribute("list", voList);
+        return "modules/exam/examInfo";
+    }
+
+    @RequestMapping("/exam/info")
+    @ResponseBody
+    public Exam getExamInfo(HttpServletRequest request) {
+        Exam exam = examService.findById(getSessionExamId(request));
+        return exam;
+    }
+
+    @RequestMapping("/exam/finish")
+    @Transactional
+    @ResponseBody
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public void finished(HttpServletRequest request) {
+        Exam exam = examService.findById(getSessionExamId(request));
+        exam.setStatus(ExamStatus.FINISH);
+        examService.save(exam);
+    }
+
+}

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

@@ -44,6 +44,7 @@ import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
 
 
 @Controller("markGroupController")
 @Controller("markGroupController")
 @RequestMapping("/admin/exam/group")
 @RequestMapping("/admin/exam/group")
@@ -190,8 +191,8 @@ public class MarkGroupController extends BaseExamController {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         if (group != null) {
         if (group != null) {
-        	String pictureConfig = buildPictureConfig(group);
-        	group.setPicList(pictureConfig);
+            String pictureConfig = buildPictureConfig(group);
+            group.setPicList(pictureConfig);
             model.addAttribute("group", group);
             model.addAttribute("group", group);
             model.addAttribute("questions", questionService.findByExamAndSubjectAndObjectiveAndMainNumber(
             model.addAttribute("questions", questionService.findByExamAndSubjectAndObjectiveAndMainNumber(
                     group.getExamId(), group.getSubjectCode(), false, group.getNumber()));
                     group.getExamId(), group.getSubjectCode(), false, group.getNumber()));
@@ -211,8 +212,8 @@ public class MarkGroupController extends BaseExamController {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         if (group != null) {
         if (group != null) {
-        	String pictureConfig = buildPictureConfig(group);
-        	group.setPicList(pictureConfig);
+            String pictureConfig = buildPictureConfig(group);
+            group.setPicList(pictureConfig);
             group.setScoreList(
             group.setScoreList(
                     questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false, number));
                     questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false, number));
             model.addAttribute("group", group);
             model.addAttribute("group", group);
@@ -240,16 +241,16 @@ public class MarkGroupController extends BaseExamController {
         return "redirect:/admin/exam/group";
         return "redirect:/admin/exam/group";
     }
     }
 
 
+    @SuppressWarnings("unchecked")
     @RequestMapping("/save")
     @RequestMapping("/save")
     @RoleRequire(Role.SCHOOL_ADMIN)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String save(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
     public String save(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
             @RequestParam String subjectCode, @RequestParam Integer number,
             @RequestParam String subjectCode, @RequestParam Integer number,
             @RequestParam(required = false) String title, @RequestParam(required = false) String picList,
             @RequestParam(required = false) String title, @RequestParam(required = false) String picList,
-            @RequestParam(required = false) String intervalScoreList,
-            @RequestParam(required = false) String scoreList,
+            @RequestParam(required = false) String intervalScoreList, @RequestParam(required = false) String scoreList,
             @RequestParam(required = false) Double doubleRate,
             @RequestParam(required = false) Double doubleRate,
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Double arbitrateThreshold,
-            @RequestParam(required = false) Integer scorePolicy ) {
+            @RequestParam(required = false) Integer scorePolicy) {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId,
         List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId,
@@ -258,7 +259,7 @@ public class MarkGroupController extends BaseExamController {
             // quick update
             // quick update
             picList = StringEscapeUtils.unescapeHtml(picList);
             picList = StringEscapeUtils.unescapeHtml(picList);
             JSONArray array = JSONArray.fromObject(picList);
             JSONArray array = JSONArray.fromObject(picList);
-            List<PictureConfigItem> list = JSONArray.toList(array, PictureConfigItem.class);
+            List<PictureConfigItem> list = JSONArray.toList(array, new PictureConfigItem(), new JsonConfig());
             // List<PictureConfigItem> list = PictureConfigItem.parse(picList);
             // List<PictureConfigItem> list = PictureConfigItem.parse(picList);
             if (list != null && !list.isEmpty()) {
             if (list != null && !list.isEmpty()) {
                 groupService.updatePicList(examId, subjectCode, number, list);
                 groupService.updatePicList(examId, subjectCode, number, list);
@@ -276,19 +277,17 @@ public class MarkGroupController extends BaseExamController {
                 groupService.updateTitle(examId, subjectCode, number, title);
                 groupService.updateTitle(examId, subjectCode, number, title);
             }
             }
             if (doubleRate != null) {
             if (doubleRate != null) {
-            	group.setDoubleRate(doubleRate);
+                group.setDoubleRate(doubleRate);
             }
             }
             if (arbitrateThreshold != null) {
             if (arbitrateThreshold != null) {
-            	group.setArbitrateThreshold(arbitrateThreshold);
+                group.setArbitrateThreshold(arbitrateThreshold);
             }
             }
             groupService.save(group);
             groupService.save(group);
             // advance update
             // advance update
+            ScorePolicy policy = scorePolicy != null ? ScorePolicy.findByValue(scorePolicy) : null;
             List<Double> scores = buildDoubleList(scoreList);
             List<Double> scores = buildDoubleList(scoreList);
             if (scores.size() > 0) {
             if (scores.size() > 0) {
-                markService.updateGroupScore(group, scores);
-            }
-            if(scorePolicy!=null && !ScorePolicy.findByValue(scorePolicy).equals(group.getScorePolicy())){
-            	markService.updateGroupScorePolicy(group, scorePolicy);
+                markService.updateGroup(group, scores, policy);
             }
             }
             redirectAttributes.addAttribute("subjectCode", subjectCode);
             redirectAttributes.addAttribute("subjectCode", subjectCode);
             redirectAttributes.addAttribute("number", number);
             redirectAttributes.addAttribute("number", number);
@@ -301,6 +300,7 @@ public class MarkGroupController extends BaseExamController {
         }
         }
     }
     }
 
 
+    @SuppressWarnings("unchecked")
     @RequestMapping("/insert")
     @RequestMapping("/insert")
     @Transactional
     @Transactional
     @RoleRequire(Role.SCHOOL_ADMIN)
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -324,7 +324,7 @@ public class MarkGroupController extends BaseExamController {
             // create group
             // create group
             picList = StringEscapeUtils.unescapeHtml(picList);
             picList = StringEscapeUtils.unescapeHtml(picList);
             JSONArray array = JSONArray.fromObject(picList);
             JSONArray array = JSONArray.fromObject(picList);
-            List<PictureConfigItem> list = JSONArray.toList(array, PictureConfigItem.class);
+            List<PictureConfigItem> list = JSONArray.toList(array, new PictureConfigItem(), new JsonConfig());
             group = new MarkGroup(examId, subjectCode, number, StringUtils.trimToNull(title), list, 0d, doubleRate,
             group = new MarkGroup(examId, subjectCode, number, StringUtils.trimToNull(title), list, 0d, doubleRate,
                     arbitrateThreshold, scorePolicy);
                     arbitrateThreshold, scorePolicy);
             List<Double> scores = buildDoubleList(scoreList);
             List<Double> scores = buildDoubleList(scoreList);

+ 17 - 18
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkTrackController.java

@@ -69,24 +69,23 @@ public class MarkTrackController extends BaseExamController {
         List<Object> list = new ArrayList<Object>();
         List<Object> list = new ArrayList<Object>();
         HashMap<String, Object> map = new HashMap<String, Object>();
         HashMap<String, Object> map = new HashMap<String, Object>();
         for (MarkLibrary library : librarys) {
         for (MarkLibrary library : librarys) {
-        	if(null!=library.getTaskNumber() && library.getTaskNumber()==2){
-        		continue;
-        	}
-	            MarkGroup group = groupService.findOne(examStudent.getExamId(), examStudent.getSubjectCode(),
-	                    library.getGroupNumber());
-	            List<String> picUrls = PictureUrlBuilder.getSliceUrls(examStudent.getExamId(), campus.getId(),
-	                    examStudent.getSubjectCode(), examStudent.getExamNumber(), examStudent.getSliceCount());
-	            List<MarkTrack> markTracks = markTrackService.findByStudentIdAndGroupNumber(library.getStudentId(),
-	                    group.getNumber());
-	            HashMap<String, Object> groups = new HashMap<String, Object>();
-	            List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
-	            groups.put("picUrls", picUrls);
-	            groups.put("pictureConfig", group.getPictureConfigList());
-	            groups.put("markTracks", markTracks);
-	            groups.put("groupTitle", group.getTitle());
-	            groups.put("groupNumber", group.getNumber());
-	            groups.put("markSpecialTagList", markSpecialTagList);
-	            list.add(groups);
+            if (null != library.getTaskNumber() && library.getTaskNumber() == 2) {
+                continue;
+            }
+            MarkGroup group = groupService.findOne(examStudent.getExamId(), examStudent.getSubjectCode(),
+                    library.getGroupNumber());
+            List<String> picUrls = PictureUrlBuilder.getSliceUrls(examStudent.getExamId(), campus.getId(),
+                    examStudent.getSubjectCode(), examStudent.getExamNumber(), examStudent.getSliceCount());
+            List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
+            HashMap<String, Object> groups = new HashMap<String, Object>();
+            List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
+            groups.put("picUrls", picUrls);
+            groups.put("pictureConfig", group.getPictureConfigList());
+            groups.put("markTracks", markTracks);
+            groups.put("groupTitle", group.getTitle());
+            groups.put("groupNumber", group.getNumber());
+            groups.put("markSpecialTagList", markSpecialTagList);
+            list.add(groups);
         }
         }
         map.put("list", list);
         map.put("list", list);
         map.put("imageServer", imageServer);
         map.put("imageServer", imageServer);

+ 0 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java

@@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.InitBinder;
 
 
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.model.User;
@@ -25,9 +24,6 @@ import cn.com.qmth.stmms.common.utils.DateUtils;
 
 
 public class BaseController {
 public class BaseController {
 
 
-    @Autowired
-    private ExamService examService;
-
     @Autowired
     @Autowired
     private UserService userService;
     private UserService userService;
 
 

+ 5 - 6
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -7,9 +7,6 @@ import java.util.Set;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 
 
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
@@ -42,6 +39,8 @@ import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
 
 
 @Controller
 @Controller
 @RequestMapping("/mark")
 @RequestMapping("/mark")
@@ -66,7 +65,7 @@ public class MarkController extends BaseController {
 
 
     @Autowired
     @Autowired
     private MarkService markService;
     private MarkService markService;
-    
+
     @Autowired
     @Autowired
     private ExamService examService;
     private ExamService examService;
 
 
@@ -165,7 +164,7 @@ public class MarkController extends BaseController {
         modelAndView.addObject("marker", marker);
         modelAndView.addObject("marker", marker);
         modelAndView.addObject("subject", subjectService.find(marker.getExamId(), marker.getSubjectCode()));
         modelAndView.addObject("subject", subjectService.find(marker.getExamId(), marker.getSubjectCode()));
         Exam exam = examService.findById(marker.getExamId());
         Exam exam = examService.findById(marker.getExamId());
-        modelAndView.addObject("forceSpecialTag",exam.isForceSpecialTag() );
+        modelAndView.addObject("forceSpecialTag", exam.isForceSpecialTag());
         markService.releaseByMarker(marker);
         markService.releaseByMarker(marker);
     }
     }
 
 
@@ -284,7 +283,7 @@ public class MarkController extends BaseController {
                 library.setMarkerScoreList(task.getScoreList());
                 library.setMarkerScoreList(task.getScoreList());
                 library.setStatus(LibraryStatus.MARKED);
                 library.setStatus(LibraryStatus.MARKED);
                 library.setTags(StringUtils.trimToNull(task.getTags()));
                 library.setTags(StringUtils.trimToNull(task.getTags()));
-                markService.submitLibrary(library, task.getTrackMap(library), task.getSpecialTagList(library));
+                markService.submitLibrary(library, task.getTrackList(library), task.getSpecialTagList(library));
                 markService.releaseLibrary(library, marker);
                 markService.releaseLibrary(library, marker);
                 result.accumulate("success", true);
                 result.accumulate("success", true);
                 result.accumulate("status", status(request));
                 result.accumulate("status", status(request));