浏览代码

增加设置强制评卷模式的功能,设置项跟随MarkGroup进行保存,并控制评卷页面切换按钮是否显示

luoshi 6 年之前
父节点
当前提交
6a75ca0d8a
共有 19 个文件被更改,包括 247 次插入90 次删除
  1. 48 48
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamQuestionDao.java
  2. 13 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkGroupDao.java
  3. 11 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java
  4. 20 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkGroup.java
  5. 8 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Marker.java
  6. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkGroupService.java
  7. 19 15
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkGroupServiceImpl.java
  8. 3 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  9. 31 0
      stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/MarkMode.java
  10. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectQuestionDTO.java
  11. 13 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java
  12. 12 5
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  13. 26 12
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  14. 12 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupAdd.jsp
  15. 11 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditFull.jsp
  16. 11 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditSimple.jsp
  17. 2 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markNew.jsp
  18. 2 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markTrack.jsp
  19. 1 0
      stmms-web/src/main/webapp/sql/stmms_ft.sql

+ 48 - 48
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamQuestionDao.java

@@ -1,48 +1,48 @@
-package cn.com.qmth.stmms.biz.exam.dao;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
-import org.springframework.data.jpa.repository.Modifying;
-import org.springframework.data.jpa.repository.Query;
-
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.QuestionPK;
-
-public interface ExamQuestionDao
-        extends JpaRepository<ExamQuestion, QuestionPK>, JpaSpecificationExecutor<ExamQuestion> {
-
-    @Query("select q from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 order by q.pk.mainNumber, q.pk.subNumber")
-    public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
-
-    @Query("select q from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 and q.pk.mainNumber=?4 order by q.pk.subNumber")
-    public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(int examId, String subjectCode,
-            boolean objective, int mainNumber);
-
-    @Query("select sum(q.totalScore) from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3")
-    public Double sumScoreByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
-
-    @Modifying
-    @Query("delete from ExamQuestion q where q.pk.examId=?1")
-    public void deleteByExamId(int examId);
-
-    @Modifying
-    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2")
-    public void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
-
-    @Modifying
-    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3")
-    public void deleteByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
-
-    @Modifying
-    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 and q.pk.mainNumber=?4")
-    public void deleteByExamIdAndSubjectCodeAndObjectiveAndMainNumber(int examId, String subjectCode, boolean objective,
-            int mainNumber);
-
-    @Modifying
-    @Query("update ExamQuestion q set q.mainTitle=?5 where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 and q.pk.mainNumber=?4")
-    public void updateMainTitleByExamIdAndSubjectCodeAndObjectiveAndMainNumber(int examId, String subjectCode,
-            boolean objective, int mainNumber, String mainTitle);
-
-}
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+import cn.com.qmth.stmms.biz.exam.model.QuestionPK;
+
+public interface ExamQuestionDao
+        extends JpaRepository<ExamQuestion, QuestionPK>, JpaSpecificationExecutor<ExamQuestion> {
+
+    @Query("select q from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 order by q.pk.mainNumber, q.pk.subNumber")
+    public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
+
+    @Query("select q from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 and q.pk.mainNumber=?4 order by q.pk.subNumber")
+    public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjectiveAndMainNumber(int examId, String subjectCode,
+            boolean objective, int mainNumber);
+
+    @Query("select sum(q.totalScore) from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3")
+    public Double sumScoreByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
+
+    @Modifying
+    @Query("delete from ExamQuestion q where q.pk.examId=?1")
+    public void deleteByExamId(int examId);
+
+    @Modifying
+    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2")
+    public void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    @Modifying
+    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3")
+    public void deleteByExamIdAndSubjectCodeAndObjective(int examId, String subjectCode, boolean objective);
+
+    @Modifying(clearAutomatically = true)
+    @Query("delete from ExamQuestion q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 and q.pk.mainNumber=?4")
+    public void deleteByExamIdAndSubjectCodeAndObjectiveAndMainNumber(int examId, String subjectCode, boolean objective,
+            int mainNumber);
+
+    @Modifying
+    @Query("update ExamQuestion q set q.mainTitle=?5 where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.objective=?3 and q.pk.mainNumber=?4")
+    public void updateMainTitleByExamIdAndSubjectCodeAndObjectiveAndMainNumber(int examId, String subjectCode,
+            boolean objective, int mainNumber, String mainTitle);
+
+}

+ 13 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkGroupDao.java

@@ -10,6 +10,7 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
+import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 
 public interface MarkGroupDao
@@ -81,4 +82,16 @@ public interface MarkGroupDao
     @Query("update MarkGroup g set g.buildTime=?3 where g.pk.examId=?1 and g.pk.subjectCode=?2")
     void updateBuildTime(int examId, String subjectCode, Date time);
 
+    @Modifying(clearAutomatically = true)
+    @Query("update MarkGroup g set g.doubleRate=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
+    void updateDoubleRate(int examId, String subjectCode, int number, Double doubleRate);
+
+    @Modifying(clearAutomatically = true)
+    @Query("update MarkGroup g set g.markMode=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
+    void updateMarkMode(int examId, String subjectCode, int number, MarkMode markMode);
+
+    @Modifying(clearAutomatically = true)
+    @Query("update MarkGroup g set g.arbitrateThreshold=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
+    void updateArbitrateThreshold(int examId, String subjectCode, int number, Double arbitrateThreshold);
+
 }

+ 11 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java

@@ -64,6 +64,9 @@ public class ExamQuestion implements Serializable {
     @Transient
     private Integer scorePolicy;
 
+    @Transient
+    private String markMode;
+
     public ExamQuestion() {
         this.pk = new QuestionPK();
     }
@@ -236,4 +239,12 @@ public class ExamQuestion implements Serializable {
         this.scorePolicy = scorePolicy;
     }
 
+    public String getMarkMode() {
+        return markMode;
+    }
+
+    public void setMarkMode(String markMode) {
+        this.markMode = markMode;
+    }
+
 }

+ 20 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkGroup.java

@@ -19,6 +19,7 @@ import org.apache.commons.lang.StringUtils;
 
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 
 @Entity
@@ -58,6 +59,13 @@ public class MarkGroup implements Serializable {
     @Enumerated(EnumType.STRING)
     private ScorePolicy scorePolicy;
 
+    /**
+     * 强制评卷模式
+     */
+    @Column(name = "mark_mode", nullable = true)
+    @Enumerated(EnumType.STRING)
+    private MarkMode markMode;
+
     @Temporal(TemporalType.TIMESTAMP)
     @Column(name = "build_time", nullable = true)
     private Date buildTime;
@@ -98,7 +106,7 @@ public class MarkGroup implements Serializable {
 
     public MarkGroup(Integer examId, String subjectCode, Integer number, String title,
             List<PictureConfigItem> configList, Double totalScore, Double doubleRate, Double arbitrateThreshold,
-            Integer scorePolicy) {
+            Integer scorePolicy, String markMode) {
         this.pk = new MarkGroupPK();
         this.pk.setExamId(examId);
         this.pk.setNumber(number);
@@ -121,6 +129,9 @@ public class MarkGroup implements Serializable {
         if (scorePolicy != null) {
             this.scorePolicy = ScorePolicy.findByValue(scorePolicy);
         }
+        if (markMode != null) {
+            this.markMode = MarkMode.findByName(markMode);
+        }
     }
 
     public Integer getExamId() {
@@ -305,4 +316,12 @@ public class MarkGroup implements Serializable {
         this.markScoreDetail = markScoreDetail;
     }
 
+    public MarkMode getMarkMode() {
+        return markMode;
+    }
+
+    public void setMarkMode(MarkMode markMode) {
+        this.markMode = markMode;
+    }
+
 }

+ 8 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Marker.java

@@ -5,6 +5,8 @@ import java.util.Date;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.Table;
@@ -13,6 +15,7 @@ import javax.persistence.Transient;
 import org.apache.commons.lang.StringUtils;
 
 import cn.com.qmth.stmms.common.annotation.ExcelField;
+import cn.com.qmth.stmms.common.enums.MarkMode;
 
 @Entity
 @Table(name = "eb_marker")
@@ -56,8 +59,9 @@ public class Marker implements Serializable {
     @Column(name = "last_login_time")
     private Date lastLoginTime;
 
-    @Column(name = "mode")
-    private String mode;
+    @Column(name = "mode", nullable = true)
+    @Enumerated(EnumType.STRING)
+    private MarkMode mode;
 
     @Column(name = "top_count")
     private Integer topCount;
@@ -224,11 +228,11 @@ public class Marker implements Serializable {
         this.name = name;
     }
 
-    public String getMode() {
+    public MarkMode getMode() {
         return mode;
     }
 
-    public void setMode(String mode) {
+    public void setMode(MarkMode mode) {
         this.mode = mode;
     }
 

+ 3 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkGroupService.java

@@ -5,6 +5,7 @@ import java.util.List;
 
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.common.enums.MarkMode;
 
 public interface MarkGroupService {
 
@@ -34,6 +35,8 @@ public interface MarkGroupService {
 
     void updateArbitrateThreshold(int examId, String subjectCode, Integer number, Double arbitrateThreshold);
 
+    void updateMarkMode(int examId, String subjectCode, Integer number, MarkMode markMode);
+
     long sumLibraryCount(Integer examId);
 
     long sumMarkedCount(Integer examId);

+ 19 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkGroupServiceImpl.java

@@ -15,6 +15,7 @@ import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.common.enums.MarkMode;
 
 @Service("markGroupService")
 public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements MarkGroupService {
@@ -59,6 +60,24 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
         groupDao.updateBuildTime(examId, subjectCode, number, time);
     }
 
+    @Transactional
+    @Override
+    public void updateDoubleRate(int examId, String subjectCode, Integer number, Double doubleRate) {
+        groupDao.updateDoubleRate(examId, subjectCode, number, doubleRate);
+    }
+
+    @Transactional
+    @Override
+    public void updateMarkMode(int examId, String subjectCode, Integer number, MarkMode markMode) {
+        groupDao.updateMarkMode(examId, subjectCode, number, markMode);
+    }
+
+    @Transactional
+    @Override
+    public void updateArbitrateThreshold(int examId, String subjectCode, Integer number, Double arbitrateThreshold) {
+        groupDao.updateArbitrateThreshold(examId, subjectCode, number, arbitrateThreshold);
+    }
+
     @Override
     public MarkGroup findOne(int examId, String subjectCode, int number) {
         MarkGroupPK pk = new MarkGroupPK();
@@ -105,19 +124,4 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
         return count != null ? count : 0;
     }
 
-    @Override
-    public void updateDoubleRate(int examId, String subjectCode, Integer number, Double doubleRate) {
-        MarkGroup group = findOne(examId, subjectCode, number);
-        group.setDoubleRate(doubleRate);
-        save(group);
-    }
-
-    @Override
-    public void updateArbitrateThreshold(int examId, String subjectCode, Integer number, Double arbitrateThreshold) {
-        MarkGroup group = findOne(examId, subjectCode, number);
-        group.setArbitrateThreshold(arbitrateThreshold);
-        save(group);
-
-    }
-
 }

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

@@ -184,15 +184,15 @@ public class MarkServiceImpl implements MarkService {
                 question.setObjective(false);
                 question.setTotalScore(score);
                 question.setIntervalScore(1d);
-                questionDao.save(question);
+                questionDao.saveAndFlush(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) {
-            e.printStackTrace();
-            throw e;
+            log.error("update group error", e);
+            throw new RuntimeException(e);
         } finally {
             lockService.unlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
         }

+ 31 - 0
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/MarkMode.java

@@ -0,0 +1,31 @@
+package cn.com.qmth.stmms.common.enums;
+
+/**
+ * 评卷模式
+ * 
+ * @author luoshi
+ *
+ */
+public enum MarkMode {
+
+    COMMON("普通"), TRACK("轨迹");
+
+    private String name;
+
+    private MarkMode(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public static MarkMode findByName(String name) {
+        for (MarkMode c : MarkMode.values()) {
+            if (c.toString().equalsIgnoreCase(name)) {
+                return c;
+            }
+        }
+        return null;
+    }
+}

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectQuestionDTO.java

@@ -47,7 +47,7 @@ public class SubjectQuestionDTO {
                 if (group == null) {
                     group = new MarkGroup(examId, subjectCode, question.getMainNumber(), question.getMainTitle(),
                             PictureConfigItem.parse(question.getPicList()), 0d, question.getDoubleRate(),
-                            question.getArbitrateThreshold(), question.getScorePolicy());
+                            question.getArbitrateThreshold(), question.getScorePolicy(), question.getMarkMode());
                     group.setQuestionList(new LinkedList<ExamQuestion>());
                     groups.put(question.getMainNumber(), group);
                 }

+ 13 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java

@@ -43,6 +43,9 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
     @ExcelField(title = "合分策略(1-平均,2-最高,3-最低)", align = 2, sort = 110)
     private Integer scorePolicy;
 
+    @ExcelField(title = "评卷模式(common-普通,track-轨迹)", align = 2, sort = 120)
+    private String markMode;
+
     public SubjectiveQuestionDTO() {
 
     }
@@ -61,6 +64,7 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
                 group != null && group.getArbitrateThreshold() != null ? group.getArbitrateThreshold() : 0d);
         setScorePolicy(group != null && group.getScorePolicy() != null ? group.getScorePolicy().getValue()
                 : ScorePolicy.AVG.getValue());
+        setMarkMode(group != null && group.getMarkMode() != null ? group.getMarkMode().getName() : "");
     }
 
     public ExamQuestion transform() {
@@ -79,6 +83,7 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         question.setDoubleRate(doubleRate);
         question.setArbitrateThreshold(arbitrateThreshold);
         question.setScorePolicy(scorePolicy);
+        question.setMarkMode(markMode);
         return question;
     }
 
@@ -200,4 +205,12 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         this.scorePolicy = scorePolicy;
     }
 
+    public String getMarkMode() {
+        return markMode;
+    }
+
+    public void setMarkMode(String markMode) {
+        this.markMode = markMode;
+    }
+
 }

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

@@ -38,6 +38,7 @@ import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
@@ -180,6 +181,7 @@ public class MarkGroupController extends BaseExamController {
         MarkGroup group = new MarkGroup();
         group.setSubjectCode(subjectCode);
         model.addAttribute("group", group);
+        model.addAttribute("markModeList", MarkMode.values());
         model.addAttribute("scorePolicyList", ScorePolicy.values());
         return "modules/exam/groupAdd";
     }
@@ -197,6 +199,7 @@ public class MarkGroupController extends BaseExamController {
             model.addAttribute("questions", questionService.findByExamAndSubjectAndObjectiveAndMainNumber(
                     group.getExamId(), group.getSubjectCode(), false, group.getNumber()));
             model.addAttribute("pictureConfig", pictureConfig);
+            model.addAttribute("markModeList", MarkMode.values());
             model.addAttribute("scorePolicyList", ScorePolicy.values());
             return "modules/exam/groupEditSimple";
         } else {
@@ -218,6 +221,7 @@ public class MarkGroupController extends BaseExamController {
                     questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false, number));
             model.addAttribute("group", group);
             model.addAttribute("pictureConfig", pictureConfig);
+            model.addAttribute("markModeList", MarkMode.values());
             model.addAttribute("scorePolicyList", ScorePolicy.values());
             return "modules/exam/groupEditFull";
         } else {
@@ -250,7 +254,7 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) String intervalScoreList, @RequestParam(required = false) String scoreList,
             @RequestParam(required = false) Double doubleRate,
             @RequestParam(required = false) Double arbitrateThreshold,
-            @RequestParam(required = false) Integer scorePolicy) {
+            @RequestParam(required = false) Integer scorePolicy, @RequestParam(required = false) String markMode) {
         int examId = getSessionExamId(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId,
@@ -277,10 +281,13 @@ public class MarkGroupController extends BaseExamController {
                 groupService.updateTitle(examId, subjectCode, number, title);
             }
             if (doubleRate != null) {
-            	groupService.updateDoubleRate(examId, subjectCode, number, doubleRate);
+                groupService.updateDoubleRate(examId, subjectCode, number, doubleRate);
             }
             if (arbitrateThreshold != null) {
-            	groupService.updateArbitrateThreshold(examId, subjectCode, number, arbitrateThreshold);
+                groupService.updateArbitrateThreshold(examId, subjectCode, number, arbitrateThreshold);
+            }
+            if (markMode != null) {
+                groupService.updateMarkMode(examId, subjectCode, number, MarkMode.findByName(markMode));
             }
             // advance update
             ScorePolicy policy = scorePolicy != null ? ScorePolicy.findByValue(scorePolicy) : null;
@@ -308,7 +315,7 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) String title, @RequestParam(required = false) String picList,
             @RequestParam(required = false) String scoreList, @RequestParam(required = false) Double doubleRate,
             @RequestParam(required = false) Double arbitrateThreshold,
-            @RequestParam(required = false) Integer scorePolicy) {
+            @RequestParam(required = false) Integer scorePolicy, @RequestParam(required = false) String markMode) {
         int examId = getSessionExamId(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         if (group != null) {
@@ -325,7 +332,7 @@ public class MarkGroupController extends BaseExamController {
             JSONArray array = JSONArray.fromObject(picList);
             List<PictureConfigItem> list = JSONArray.toList(array, new PictureConfigItem(), new JsonConfig());
             group = new MarkGroup(examId, subjectCode, number, StringUtils.trimToNull(title), list, 0d, doubleRate,
-                    arbitrateThreshold, scorePolicy);
+                    arbitrateThreshold, scorePolicy, markMode);
             List<Double> scores = buildDoubleList(scoreList);
             if (group.getTitle() != null && group.getPicList() != null && scores.size() > 0) {
                 // clear and replace exam_question

+ 26 - 12
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -20,10 +20,12 @@ import org.springframework.web.servlet.ModelAndView;
 
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.model.Tag;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.TagService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
@@ -36,6 +38,7 @@ import cn.com.qmth.stmms.biz.mark.service.Impl.MarkLockService;
 import cn.com.qmth.stmms.common.controller.BaseController;
 import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
@@ -67,6 +70,9 @@ public class MarkController extends BaseController {
     @Autowired
     private ExamService examService;
 
+    @Autowired
+    private MarkGroupService groupService;
+
     @Autowired
     private MarkLockService lockService;
 
@@ -101,24 +107,32 @@ public class MarkController extends BaseController {
     @RequestMapping("/index")
     public ModelAndView index(HttpServletRequest request, @RequestParam(value = "mode", required = false) String mode) {
         Marker marker = RequestUtils.getWebUser(request).getMarker();
-        ModelAndView modelAndView = getMarkModeView(marker, mode);
+        ModelAndView modelAndView = getMarkModeView(marker, MarkMode.findByName(mode));
         preProcess(marker, modelAndView);
         return modelAndView;
     }
 
-    private ModelAndView getMarkModeView(Marker marker, String mode) {
-        if (StringUtils.isNotBlank(mode)) {
-            marker.setMode(mode);
+    private ModelAndView getMarkModeView(Marker marker, MarkMode mode) {
+        boolean forceMode = false;
+        MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+        if (group != null && group.getMarkMode() != null) {
+            mode = group.getMarkMode();
+            forceMode = true;
         }
-        String view = null;
-        if ("track".equals(marker.getMode())) {
-            view = "modules/mark/markTrack";
-        } else {
-            marker.setMode("common");
-            view = "modules/mark/markNew";
+        if (mode == null) {
+            mode = marker.getMode();
+        }
+        if (mode == null) {
+            mode = MarkMode.COMMON;
+        }
+        if (marker.getMode() != mode) {
+            marker.setMode(mode);
+            markerService.save(marker);
         }
-        markerService.save(marker);
-        return new ModelAndView(view);
+        ModelAndView view = new ModelAndView(
+                mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
+        view.addObject("forceMode", forceMode);
+        return view;
     }
 
     @RequestMapping("/logout")

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

@@ -61,6 +61,17 @@
                 <form:input path="scoreList" htmlEscape="false" maxlength="100" class="required"/>
             </div>
         </div>
+        <div class="control-group">
+            <label class="control-label">评卷模式</label>
+            <div class="controls">
+            <select name="markMode">
+                <option value="">不限</option>
+                <c:forEach items="${markModeList}" var="item">
+                     <option value="${item}" >${item.name}</option>
+                </c:forEach>
+            </select>
+            </div>
+        </div>
         <div class="control-group">
             <label class="control-label">图片显示</label>
             <div class="controls">
@@ -74,7 +85,7 @@
                 <input type="checkbox" id="openDouble">开启
             </div>
         </div>
-        <div  class="doubleDiv">
+        <div class="doubleDiv">
         <div class="control-group">
             <label class="control-label">双评比例</label>
             <div class="controls">

+ 11 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditFull.jsp

@@ -76,6 +76,17 @@
                 <form:input path="scoreList" htmlEscape="false" maxlength="100" class="required"/>
             </div>
         </div>
+        <div class="control-group">
+            <label class="control-label">评卷模式</label>
+            <div class="controls">
+            <select name="markMode">
+                <option value="">不限</option>
+                <c:forEach items="${markModeList}" var="item">
+                    <option value="${item}" <c:if test="${group.markMode!=null && group.markMode==item}">selected</c:if>>${item.name}</option>
+                </c:forEach>
+            </select>
+            </div>
+        </div>
         <div class="control-group">
             <label class="control-label">图片显示</label>
             <div class="controls">                

+ 11 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditSimple.jsp

@@ -66,6 +66,17 @@
 				<form:input path="title" htmlEscape="false" maxlength="30" class="required"/>
 			</div>
 		</div>
+		<div class="control-group">
+            <label class="control-label">评卷模式</label>
+            <div class="controls">
+            <select name="markMode">
+                <option value="">不限</option>
+                <c:forEach items="${markModeList}" var="item">
+                    <option value="${item}" <c:if test="${group.markMode!=null && group.markMode==item}">selected</c:if>>${item.name}</option>
+                </c:forEach>
+            </select>
+            </div>
+        </div>
         <div class="control-group">
             <label class="control-label">图片显示</label>
             <div class="controls">

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

@@ -49,7 +49,9 @@
 				userName : '${web_user.name}',
 				logoutUrl: '${ctx}/mark/logout',
 				clearUrl: '${ctx}/mark/clear',
+				<c:if test="${forceMode==false}">
 				switchTrackUrl: '${ctx}/mark/index?mode=track',
+				</c:if>
 				forceSpecialTag : eval('${forceSpecialTag}'.toLowerCase()),
 				modules : {
 					'single-image-view' : {},

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

@@ -40,7 +40,9 @@
 				userName : '${web_user.name}',
 				logoutUrl: '${ctx}/mark/logout',
 				clearUrl: '${ctx}/mark/clear',
+				<c:if test="${forceMode==false}">
 				switchCommonUrl: '${ctx}/mark/index?mode=common',
+				</c:if>
 				forceSpecialTag : eval('${forceSpecialTag}'.toLowerCase()),
 				modules : {
 					'single-image-view' : {},

+ 1 - 0
stmms-web/src/main/webapp/sql/stmms_ft.sql

@@ -258,6 +258,7 @@ CREATE TABLE `eb_mark_group` (
   `double_rate` double DEFAULT NULL COMMENT '双评比例',
   `arbitrate_threshold` double DEFAULT NULL COMMENT '仲裁阈值',
   `score_policy` varchar(16) DEFAULT NULL COMMENT '合分策略',
+  `mark_mode` varchar(16) DEFAULT NULL COMMENT '强制评卷模式',
   `build_time` datetime DEFAULT NULL COMMENT '最后生成任务时间',
   `library_count` int(11) NOT NULL COMMENT '任务总量',
   `marked_count` int(11) NOT NULL COMMENT '已评数量',