yin 1 سال پیش
والد
کامیت
0f4a68918c
18فایلهای تغییر یافته به همراه222 افزوده شده و 209 حذف شده
  1. 9 6
      install/mysql/init/stmms_ft.sql
  2. 5 1
      install/mysql/upgrade/1.5.0.sql
  3. 2 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/config/service/impl/SystemCache.java
  4. 1 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/config/service/impl/SystemConfigServiceImpl.java
  5. 6 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java
  6. 13 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java
  7. 20 5
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkGroup.java
  8. 3 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java
  9. 10 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/ArbitrateHistory.java
  10. 37 0
      stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/ArbitrateType.java
  11. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectQuestionDTO.java
  12. 20 6
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java
  13. 40 65
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  14. 42 82
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java
  15. 8 24
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/OnlineExamThread.java
  16. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CoreController.java
  17. 2 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/configEdit.jsp
  18. 2 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/configList.jsp

+ 9 - 6
install/mysql/init/stmms_ft.sql

@@ -274,11 +274,12 @@ CREATE TABLE `eb_exam_question`
     `sub_number`       varchar(32) NOT NULL COMMENT '小题号',
     `main_title`       varchar(128) NOT NULL COMMENT '大题名称',
     `name`       	   varchar(128) DEFAULT NULL COMMENT '名称',
-    `answer`           varchar(16)          DEFAULT NULL COMMENT '正确答案',
+    `answer`           varchar(16) DEFAULT NULL COMMENT '正确答案',
     `total_score`      double      NOT NULL COMMENT '满分',
     `interval_score`   double      NOT NULL COMMENT '评卷间隔分',
-    `objective_policy` varchar(16)          DEFAULT NULL COMMENT '客观题判分策略',
-	`question_type`		varchar(32)         DEFAULT NULL COMMENT '题型',
+    `objective_policy` varchar(16)  DEFAULT NULL COMMENT '客观题判分策略',
+	`question_type`    varchar(32)  DEFAULT NULL COMMENT '题型',
+    `arbitrate_threshold` double    DEFAULT NULL COMMENT '仲裁阈值',
     PRIMARY KEY (`id`),
     KEY `index1` (`exam_id`, `subject_code`, `is_objective`, `main_number`, `sub_number`, `paper_type`)
 ) ENGINE = InnoDB
@@ -456,6 +457,7 @@ CREATE TABLE `eb_mark_group`
     `total_score`         double      NOT NULL COMMENT '满分',
     `double_rate`         double       DEFAULT NULL COMMENT '双评比例',
     `arbitrate_threshold` double       DEFAULT NULL COMMENT '仲裁阈值',
+    `arbitrate_type`      varchar(16)  DEFAULT NULL COMMENT '仲裁方式',
     `score_policy`        varchar(16)  DEFAULT NULL COMMENT '合分策略',
     `third_policy`        varchar(32)  DEFAULT NULL COMMENT '三评规则',
     `mark_mode`           varchar(16)  DEFAULT NULL COMMENT '强制评卷模式',
@@ -580,7 +582,7 @@ CREATE TABLE `eb_operation_log`
 # ------------------------------------------------------------
 
 DROP TABLE IF EXISTS `m_arbitrate_history`;
-
+m_a
 CREATE TABLE `m_arbitrate_history`
 (
     `id`            int(11)     NOT NULL AUTO_INCREMENT COMMENT '自增主键',
@@ -594,8 +596,9 @@ CREATE TABLE `m_arbitrate_history`
     `user_id`       int(11)      DEFAULT NULL COMMENT '处理人ID',
     `total_score`   double       DEFAULT NULL COMMENT '总分',
     `score_list`    text		 DEFAULT NULL COMMENT '给分明细',
-	`unanswered_count`  int(11)		 DEFAULT NULL COMMENT '未作答的步骤数量',
-    `create_time`   datetime    NOT NULL COMMENT '创建时间',
+	`unanswered_count`  int(11)	 DEFAULT NULL COMMENT '未作答的步骤数量',
+    `question_index` text		 DEFAULT NULL COMMENT '题目序号',
+    `create_time`   datetime     NOT NULL COMMENT '创建时间',
     `update_time`   datetime     DEFAULT NULL COMMENT '处理时间',
     PRIMARY KEY (`id`),
     KEY `index1` (`exam_id`, `subject_code`, `group_number`, `status`),

+ 5 - 1
install/mysql/upgrade/1.5.0.sql

@@ -1,4 +1,8 @@
 -- 1.5.0
 USE `stmms_ft`;
 INSERT INTO `b_sys_config` (`id`, `type`, `description`, `update_time`)
-VALUES (4, 'STUDENT_SHEET_COUNT', null, '2021-08-09 15:38:58');
+VALUES (4, 'STUDENT_SHEET_COUNT', null, '2021-08-09 15:38:58');
+
+ALTER TABLE eb_mark_group ADD COLUMN `arbitrate_type`      varchar(16)  DEFAULT NULL COMMENT '仲裁方式';
+ALTER TABLE eb_exam_question ADD COLUMN `arbitrate_threshold` double    DEFAULT NULL COMMENT '仲裁阈值';
+ALTER TABLE m_arbitrate_history ADD COLUMN `question_index` text        DEFAULT NULL COMMENT '题目序号';

+ 2 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/config/service/impl/SystemCache.java

@@ -76,7 +76,8 @@ public class SystemCache {
         }
         fileServer = configService.findByType(ConfigType.FILE_SERVER);
         markTime = Long.parseLong(configService.findByType(ConfigType.MARK_TIME));
-        enableStudentSheetCount = Boolean.parseBoolean(configService.findByType(ConfigType.STUDENT_SHEET_COUNT));
+        String studentSheetCount = configService.findByType(ConfigType.STUDENT_SHEET_COUNT);
+        enableStudentSheetCount = studentSheetCount!=null&&studentSheetCount.equals("on");
     }
 
     public boolean isAuth() {

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/config/service/impl/SystemConfigServiceImpl.java

@@ -34,7 +34,7 @@ public class SystemConfigServiceImpl extends BaseQueryService<SystemConfig> impl
             systemCache.setMarkTime(Long.parseLong(value));
         }
         if (ConfigType.STUDENT_SHEET_COUNT.equals(s.getType())) {
-            systemCache.setEnableStudentSheetCount(Boolean.parseBoolean(value));
+            systemCache.setEnableStudentSheetCount(value!=null&&value.equals("on"));
         }
         return s;
     }

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

@@ -39,21 +39,21 @@ public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaS
 
     public Exam findFirstBySchoolIdAndCode(Integer schoolId, String code);
 
-    @Query(value = "select * from eb_exam e where e.id in (select DISTINCT m.exam_id from eb_marker m where m.user_id=?1) and e.create_time >?2  and e.status = ?3"
+    @Query(value = "select * from eb_exam e where e.id in (select DISTINCT m.exam_id from eb_marker m where m.user_id=?1) and e.create_time >?2  and e.status = 'START' "
             + "order by e.id desc", nativeQuery = true)
-    public List<Exam> findByMarkerUserId(Integer userId, Date time, ExamStatus status);
+    public List<Exam> findByMarkerUserId(Integer userId, Date time);
 
-    @Query(value = "select * from eb_exam e where e.school_id = ?1 and e.id in (select s.exam_id from eb_exam_subject s where s.code in (select su.subject_code from eb_subject_user su where su.user_id=?2) ) and e.status = ?3 "
+    @Query(value = "select * from eb_exam e where e.school_id = ?1 and e.id in (select s.exam_id from eb_exam_subject s where s.code in (select su.subject_code from eb_subject_user su where su.user_id=?2) ) and e.status = 'START' "
             + "order by e.id desc", nativeQuery = true)
-    public List<Exam> findBySubjectHeaderUserId(Integer schoolId, Integer userId, ExamStatus status);
+    public List<Exam> findBySubjectHeaderUserId(Integer schoolId, Integer userId);
 
     @Modifying
     @Query("update Exam e set e.objectiveStatus=?2 where e.id=?1")
     public int updateObjectiveStatus(int examId, ObjectiveStatus status);
 
-    @Query(value = "select * from eb_exam e where e.school_id = ?1 and e.id in (select s.exam_id from eb_user_exam s where s.user_id=?2 ) and e.status =?3 "
+    @Query(value = "select * from eb_exam e where e.school_id = ?1 and e.id in (select s.exam_id from eb_user_exam s where s.user_id=?2 ) and e.status ='START' "
             + "order by e.id desc", nativeQuery = true)
-    public List<Exam> findBySchoolViewUserId(Integer schoolId, Integer userId, ExamStatus status);
+    public List<Exam> findBySchoolViewUserId(Integer schoolId, Integer userId);
 
     @Modifying
     @Query("update Exam e set e.updateTime=?2 where e.id=?1")

+ 13 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java

@@ -74,6 +74,9 @@ public class ExamQuestion implements Serializable, QuestionNumberBean {
     @Column(name = "name", nullable = true, length = 128)
     private String name;
 
+    @Column(name = "arbitrate_threshold", nullable = true)
+    private Double arbitrateThreshold;
+
     @Transient
     private ExamSubject subject;
 
@@ -83,9 +86,6 @@ public class ExamQuestion implements Serializable, QuestionNumberBean {
     @Transient
     private Double doubleRate;
 
-    @Transient
-    private Double arbitrateThreshold;
-
     @Transient
     private Integer scorePolicy;
 
@@ -110,6 +110,9 @@ public class ExamQuestion implements Serializable, QuestionNumberBean {
     @Transient
     private boolean deleting;
 
+    @Transient
+    private Integer arbitrateType;
+
     public Integer getId() {
         return id;
     }
@@ -364,4 +367,11 @@ public class ExamQuestion implements Serializable, QuestionNumberBean {
         this.deleting = deleting;
     }
 
+    public Integer getArbitrateType() {
+        return arbitrateType;
+    }
+
+    public void setArbitrateType(Integer arbitrateType) {
+        this.arbitrateType = arbitrateType;
+    }
 }

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

@@ -17,14 +17,11 @@ import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 import javax.persistence.Transient;
 
+import cn.com.qmth.stmms.common.enums.*;
 import org.apache.commons.lang.StringUtils;
 
 import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
-import cn.com.qmth.stmms.common.enums.MarkMode;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.enums.ScorePolicy;
-import cn.com.qmth.stmms.common.enums.ThirdPolicy;
 
 /**
  * 评卷分组对象
@@ -61,6 +58,12 @@ public class MarkGroup implements Serializable {
      */
     @Column(name = "arbitrate_threshold", nullable = true)
     private Double arbitrateThreshold;
+    /**
+     * 仲裁方式
+     */
+    @Column(name = "arbitrate_type", nullable = true, length = 16)
+    @Enumerated(EnumType.STRING)
+    private ArbitrateType arbitrateType;
 
     /**
      * 合分策略(1-平均,2-最高,3-最低)
@@ -162,7 +165,7 @@ public class MarkGroup implements Serializable {
     }
 
     public MarkGroup(Integer examId, String subjectCode, Integer number, List<MarkConfigItem> configList,
-            Double totalScore, Double doubleRate, Double arbitrateThreshold, Integer scorePolicy, String markMode,
+            Double totalScore, Double doubleRate, Double arbitrateThreshold, Integer scorePolicy,Integer arbitrateType, String markMode,
             Integer trialCount, boolean sheetView, boolean enableAllZero, Integer thirdPolicy, boolean selective) {
         this.pk = new MarkGroupPK();
         this.pk.setExamId(examId);
@@ -186,6 +189,11 @@ public class MarkGroup implements Serializable {
         } else {
             this.scorePolicy = ScorePolicy.AVG;
         }
+        if (arbitrateType != null) {
+            this.arbitrateType = ArbitrateType.findByValue(arbitrateType);
+        } else {
+            this.arbitrateType = ArbitrateType.GROUP;
+        }
         if (StringUtils.isNotBlank(markMode)) {
             this.markMode = MarkMode.findByName(markMode);
         }
@@ -475,4 +483,11 @@ public class MarkGroup implements Serializable {
         this.selectiveIndex = selectiveIndex;
     }
 
+    public ArbitrateType getArbitrateType() {
+        return arbitrateType;
+    }
+
+    public void setArbitrateType(ArbitrateType arbitrateType) {
+        this.arbitrateType = arbitrateType;
+    }
 }

+ 3 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java

@@ -139,12 +139,12 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
 
     @Override
     public List<Exam> findByMarkerUserId(Integer id, Date time) {
-        return examDao.findByMarkerUserId(id, time, ExamStatus.START);
+        return examDao.findByMarkerUserId(id, time);
     }
 
     @Override
     public List<Exam> findBySubjectHeaderUserId(Integer schoolId, Integer userId) {
-        return examDao.findBySubjectHeaderUserId(schoolId, userId, ExamStatus.START);
+        return examDao.findBySubjectHeaderUserId(schoolId, userId);
     }
 
     @Override
@@ -155,7 +155,7 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
 
     @Override
     public List<Exam> findBySchoolViewUserId(Integer schoolId, Integer userId) {
-        return examDao.findBySchoolViewUserId(schoolId, userId, ExamStatus.START);
+        return examDao.findBySchoolViewUserId(schoolId, userId);
     }
 
     @Override

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

@@ -114,6 +114,9 @@ public class ArbitrateHistory implements Serializable {
     @Column(name = "create_time", nullable = false)
     private Date createTime;
 
+    @Column(name = "question_index", nullable = true)
+    private String questionIndex;
+
     @Transient
     private User user;
 
@@ -261,4 +264,11 @@ public class ArbitrateHistory implements Serializable {
         this.unansweredCount = unansweredCount;
     }
 
+    public String getQuestionIndex() {
+        return questionIndex;
+    }
+
+    public void setQuestionIndex(String questionIndex) {
+        this.questionIndex = questionIndex;
+    }
 }

+ 37 - 0
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/ArbitrateType.java

@@ -0,0 +1,37 @@
+package cn.com.qmth.stmms.common.enums;
+
+/**
+ * 多评情况下的合分策略
+ * 
+ * @author luoshi
+ *
+ */
+public enum ArbitrateType {
+    GROUP("分组", 0), QUESTION("小题", 1);
+
+    private String name;
+
+    private int value;
+
+    private ArbitrateType(String name, int value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public static ArbitrateType findByValue(int value) {
+        for (ArbitrateType c : ArbitrateType.values()) {
+            if (c.getValue() == value) {
+                return c;
+            }
+        }
+        return null;
+    }
+}

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

@@ -65,7 +65,7 @@ public class SubjectQuestionDTO {
                 if (group == null) {
                     group = new MarkGroup(examId, subjectCode, question.getGroupNumber(),
                             MarkConfigItem.parse(question.getPicList()), 0d, question.getDoubleRate(),
-                            question.getArbitrateThreshold(), question.getScorePolicy(), question.getMarkMode(),
+                            question.getArbitrateThreshold(), question.getScorePolicy(),question.getArbitrateType(), question.getMarkMode(),
                             question.getTrialCount(), false, false, 1, false);
                     group.setImportQuestionList(new LinkedList<>());
                     groups.put(question.getGroupNumber(), group);

+ 20 - 6
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectiveQuestionDTO.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.admin.dto;
 
+import cn.com.qmth.stmms.common.enums.ArbitrateType;
 import org.apache.commons.lang.StringUtils;
 
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
@@ -42,22 +43,25 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
     @ExcelField(title = "图片序号(用英文逗号分割)", align = 2, sort = 100)
     private String picList;
 
-    @ExcelField(title = "双评比例(0~1)", align = 2, sort = 110)
+    @ExcelField(title = "仲裁方式(0-分组,1-小题)", align = 2, sort = 110)
+    private Integer arbitrateType;
+
+    @ExcelField(title = "双评比例(0~1)", align = 2, sort = 120)
     private Double doubleRate;
 
-    @ExcelField(title = "仲裁阀值", align = 2, sort = 120)
+    @ExcelField(title = "仲裁阀值", align = 2, sort = 130)
     private Double arbitrateThreshold;
 
-    @ExcelField(title = "合分策略(1-平均,2-最高,3-最低)", align = 2, sort = 130)
+    @ExcelField(title = "合分策略(1-平均,2-最高,3-最低)", align = 2, sort = 140)
     private Integer scorePolicy;
 
-    @ExcelField(title = "评卷模式(common-普通,track-轨迹)", align = 2, sort = 140)
+    @ExcelField(title = "评卷模式(common-普通,track-轨迹)", align = 2, sort = 150)
     private String markMode;
 
-    @ExcelField(title = "试评数量(0-跳过试评)", align = 2, sort = 150)
+    @ExcelField(title = "试评数量(0-跳过试评)", align = 2, sort = 160)
     private Integer trialCount;
 
-    @ExcelField(title = "选做题数量", align = 2, sort = 160)
+    @ExcelField(title = "选做题数量", align = 2, sort = 170)
     private Integer selectiveCount;
 
     public SubjectiveQuestionDTO() {
@@ -80,6 +84,8 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
                 : 0d);
         setScorePolicy(group != null && group.getScorePolicy() != null ? group.getScorePolicy().getValue()
                 : ScorePolicy.AVG.getValue());
+        setArbitrateType(group != null && group.getArbitrateType() != null ? group.getArbitrateType().getValue()
+                : ArbitrateType.GROUP.getValue());
         setMarkMode(group != null && group.getMarkMode() != null ? group.getMarkMode().toString() : "");
         setTrialCount(subject != null && subject.getTrialCount() != null ? subject.getTrialCount() : 0);
     }
@@ -99,6 +105,7 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         question.setPicList(picList);
         question.setDoubleRate(doubleRate);
         question.setArbitrateThreshold(arbitrateThreshold);
+        question.setArbitrateType(arbitrateType);
         question.setScorePolicy(scorePolicy);
         question.setMarkMode(markMode);
         question.setTrialCount(trialCount);
@@ -246,4 +253,11 @@ public class SubjectiveQuestionDTO implements QuestionDTO {
         this.name = name;
     }
 
+    public Integer getArbitrateType() {
+        return arbitrateType;
+    }
+
+    public void setArbitrateType(Integer arbitrateType) {
+        this.arbitrateType = arbitrateType;
+    }
 }

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

@@ -1,19 +1,10 @@
 package cn.com.qmth.stmms.admin.exam;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import javax.servlet.http.HttpServletRequest;
 
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-import net.sf.json.JsonConfig;
-
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -31,23 +22,14 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 import cn.com.qmth.stmms.admin.thread.MarkGroupDeleteThread;
 import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
+import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-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.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.InspectHistoryService;
-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.SelectiveGroupService;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
@@ -58,19 +40,11 @@ import cn.com.qmth.stmms.biz.school.service.SchoolService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.ExamType;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.MarkMode;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.enums.ScorePolicy;
-import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
-import cn.com.qmth.stmms.common.enums.ThirdPolicy;
+import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
 
 @Controller("markGroupController")
 @RequestMapping("/admin/exam/group")
@@ -147,11 +121,12 @@ public class MarkGroupController extends BaseExamController {
             List<ExamQuestion> qList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
                     subject.getCode(), false, group.getNumber());
             group.setQuestionList(qList);
-            group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, subject.getCode(),
-                    group.getNumber()));
+            group.setMarkerCount(
+                    markerService.countByExamAndSubjectAndGroup(examId, subject.getCode(), group.getNumber()));
             group.setCurrentCount(markService.applyCount(group));
-            int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
-                    .getLibraryCount()) : 0;
+            int percent = group.getLibraryCount() > 0
+                    ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount())
+                    : 0;
             if (group.getMarkedCount() > 0 && percent == 0) {
                 percent = 1;
             } else if (group.getLeftCount() > 0 && percent == 100) {
@@ -161,8 +136,8 @@ public class MarkGroupController extends BaseExamController {
             group.setDeleting(lockService.isLocked(LockType.GROUP_DELETE, group.getExamId(), group.getSubjectCode(),
                     group.getNumber()));
             if (!qList.isEmpty() && group.isSelective()) {
-                SelectiveGroup selectiveGroup = selectiveGroupService.findOne(examId, group.getSubjectCode(), qList
-                        .get(0).getMainNumber());
+                SelectiveGroup selectiveGroup = selectiveGroupService.findOne(examId, group.getSubjectCode(),
+                        qList.get(0).getMainNumber());
                 if (selectiveGroup != null) {
                     group.setSelectiveIndex(selectiveGroup.getSelectiveIndex());
                 }
@@ -182,10 +157,10 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) Boolean withDouble, @RequestParam(required = false) MarkStatus status) {
         int examId = getSessionExamId(request);
         JSONArray array = new JSONArray();
-        List<MarkGroup> list = withDouble != null && withDouble ? groupService.findByExamAndSubjectWithDouble(examId,
-                subjectCode) : (status != null ? groupService
-                .findByExamAndSubjectAndStatus(examId, subjectCode, status) : groupService.findByExamAndSubject(examId,
-                subjectCode));
+        List<MarkGroup> list = withDouble != null && withDouble
+                ? groupService.findByExamAndSubjectWithDouble(examId, subjectCode)
+                : (status != null ? groupService.findByExamAndSubjectAndStatus(examId, subjectCode, status)
+                        : groupService.findByExamAndSubject(examId, subjectCode));
         for (MarkGroup group : list) {
             group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
                     false, group.getNumber()));
@@ -301,8 +276,7 @@ public class MarkGroupController extends BaseExamController {
         try {
             lockService.waitlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
             if (groupService.updateStatus(group.getExamId(), group.getSubjectCode(), group.getNumber(), status,
-                    group.getStatus())
-                    && status == MarkStatus.FORMAL) {
+                    group.getStatus()) && status == MarkStatus.FORMAL) {
                 // 切换到正评成功后刷新任务数量
                 group.setStatus(status);
                 markService.updateLibraryCount(group);
@@ -363,10 +337,8 @@ public class MarkGroupController extends BaseExamController {
             group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
                     false, group.getNumber()));
             model.addAttribute("group", group);
-            model.addAttribute(
-                    "questions",
-                    questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
-                            group.getSubjectCode(), false, group.getNumber()));
+            model.addAttribute("questions", questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                    group.getExamId(), group.getSubjectCode(), false, group.getNumber()));
             model.addAttribute("pictureConfig", pictureConfig);
             model.addAttribute("markModeList", MarkMode.values());
             model.addAttribute("scorePolicyList", ScorePolicy.values());
@@ -400,8 +372,9 @@ public class MarkGroupController extends BaseExamController {
                     examQuestion.setSelectivePart(map.get(examQuestion.getMainNumber()).getSelectivePart());
                 }
             }
-            int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
-                    .getLibraryCount()) : 0;
+            int percent = group.getLibraryCount() > 0
+                    ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount())
+                    : 0;
             if (group.getMarkedCount() > 0 && percent == 0) {
                 percent = 1;
             } else if (group.getLeftCount() > 0 && percent == 100) {
@@ -488,7 +461,8 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false, defaultValue = "false") Boolean sheetView,
             @RequestParam(required = false, defaultValue = "false") Boolean enableAllZero,
             @RequestParam(required = false) Integer[] questionIds,
-            @RequestParam(required = false) String intervalScoreList, @RequestParam(required = false) String deleteCode) {
+            @RequestParam(required = false) String intervalScoreList,
+            @RequestParam(required = false) String deleteCode) {
         int examId = getSessionExamId(request);
         Exam exam = examService.findById(examId);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
@@ -516,8 +490,8 @@ public class MarkGroupController extends BaseExamController {
                     for (Integer questionId : questionIds) {
                         ExamQuestion question = questionService.findById(questionId);
                         questionList.add(question);
-                        if (selective == false
-                                && selectiveGroupService.findOne(examId, subjectCode, question.getMainNumber()) != null) {
+                        if (selective == false && selectiveGroupService.findOne(examId, subjectCode,
+                                question.getMainNumber()) != null) {
                             selective = true;
                         }
                     }
@@ -540,8 +514,8 @@ public class MarkGroupController extends BaseExamController {
                 } else {
                     // simple update
                     List<Double> intervalScores = buildDoubleList(intervalScoreList);
-                    List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
-                            examId, subjectCode, false, number);
+                    List<ExamQuestion> questionList = questionService
+                            .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
                     if (intervalScores.size() == questionList.size()) {
                         for (int i = 0; i < questionList.size(); i++) {
                             ExamQuestion q = questionList.get(i);
@@ -633,7 +607,8 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam String picList, @RequestParam(required = false) Double doubleRate,
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Integer thirdPolicy, @RequestParam(required = false) Integer scorePolicy,
-            @RequestParam(required = false) String markMode, @RequestParam(required = false) Integer trialCount,
+            @RequestParam(required = false) Integer arbitrateType, @RequestParam(required = false) String markMode,
+            @RequestParam(required = false) Integer trialCount,
             @RequestParam(required = false, defaultValue = "false") boolean sheetView,
             @RequestParam(defaultValue = "false") boolean enableAllZero) {
         int examId = getSessionExamId(request);
@@ -670,8 +645,8 @@ public class MarkGroupController extends BaseExamController {
                         question.setGroupNumber(number);
                         list.add(question);
                         totalScore = totalScore.add(BigDecimal.valueOf(question.getTotalScore()));
-                        if (selective == false
-                                && selectiveGroupService.findOne(examId, subjectCode, question.getMainNumber()) != null) {
+                        if (selective == false && selectiveGroupService.findOne(examId, subjectCode,
+                                question.getMainNumber()) != null) {
                             selective = true;
                         }
                     }
@@ -683,14 +658,14 @@ public class MarkGroupController extends BaseExamController {
                         trialCount = subject.getTrialCount();
                     }
                     group = new MarkGroup(examId, subjectCode, number, picConfigList, totalScore.doubleValue(),
-                            doubleRate, arbitrateThreshold, scorePolicy, markMode, trialCount, sheetView,
+                            doubleRate, arbitrateThreshold, scorePolicy, arbitrateType, markMode, trialCount, sheetView,
                             enableAllZero, thirdPolicy, selective);
                     // clear and replace exam_question
                     questionService.save(list);
                     groupService.save(group);
 
-                    studentService
-                            .updateSubjectiveStatusAndScore(examId, subjectCode, SubjectiveStatus.UNMARK, 0, null);
+                    studentService.updateSubjectiveStatusAndScore(examId, subjectCode, SubjectiveStatus.UNMARK, 0,
+                            null);
                     inspectHistoryService.deleteByExamIdAndSubjectCode(examId, subjectCode);
                     redirectAttributes.addAttribute("subjectCode", subjectCode);
                     return "redirect:/admin/exam/group";

+ 42 - 82
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -1,28 +1,13 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
+import java.io.*;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,15 +18,14 @@ import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
 import org.springframework.stereotype.Controller;
 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.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
+import com.aliyun.oss.common.utils.BinaryUtil;
+import com.qmth.boot.tools.io.ZipReader;
+
 import cn.com.qmth.stmms.admin.dto.ObjectiveQuestionDTO;
 import cn.com.qmth.stmms.admin.dto.QuestionDTO;
 import cn.com.qmth.stmms.admin.dto.SubjectQuestionDTO;
@@ -54,51 +38,24 @@ import cn.com.qmth.stmms.admin.vo.StructQuestion;
 import cn.com.qmth.stmms.biz.common.domain.card.AnswerCardSubjectFile;
 import cn.com.qmth.stmms.biz.common.domain.card.AnswerCardSubjectItem;
 import cn.com.qmth.stmms.biz.common.domain.card.CardFile;
-import cn.com.qmth.stmms.biz.exam.model.AnswerCard;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-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.SelectiveGroup;
-import cn.com.qmth.stmms.biz.exam.service.AnswerCardService;
-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.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.InspectHistoryService;
-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.SelectiveGroupService;
+import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.file.enums.FormatType;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
-import cn.com.qmth.stmms.biz.report.service.ReportService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectCollegeService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
+import cn.com.qmth.stmms.biz.report.service.*;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.CardSource;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
-import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
-import cn.com.qmth.stmms.common.enums.QuestionType;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-import com.aliyun.oss.common.utils.BinaryUtil;
-import com.qmth.boot.tools.io.ZipReader;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
 
 @Controller("examPaperController")
 @RequestMapping("/admin/exam/paper")
@@ -107,8 +64,8 @@ public class PaperController extends BaseExamController {
     private static final String NULL_PAPER_TYPE_PLACEHOLDER = "#";
 
     private static final String[] SUBJECTIVE_EXCEL_HEADER = new String[] { "科目代码*", "科目名称", "大题名称*", "题目昵称",
-            "大题号(只能用小写数字)*", "小题号(只能用小写数字)*", "小题满分*", "间隔分*", "评卷分组(只能用小写数字)*", "图片序号(用英文逗号分割)", "双评比例(0~1)", "仲裁阀值",
-            "合分策略(1-平均,2-最高,3-最低)", "评卷模式(common-普通,track-轨迹)", "试评数量(0-跳过试评)", "选做题数量" };
+            "大题号(只能用小写数字)*", "小题号(只能用小写数字)*", "小题满分*", "间隔分*", "评卷分组(只能用小写数字)*", "图片序号(用英文逗号分割)", "仲裁方式(0-分组,1-小题)",
+            "双评比例(0~1)", "仲裁阀值", "合分策略(1-平均,2-最高,3-最低)", "评卷模式(common-普通,track-轨迹)", "试评数量(0-跳过试评)", "选做题数量" };
 
     private static final String[] OBJECTIVE_EXCEL_HEADER = new String[] { "科目代码", "科目名称", "试卷类型", "大题名称", "题目昵称",
             "大题号(只能用小写数字)", "小题号(只能用小写数字)", "标准答案", "小题满分", "题型(1-单选,2-多选,3-判断)" };
@@ -232,9 +189,10 @@ public class PaperController extends BaseExamController {
         if (subject != null) {
             List<ExamQuestion> list = new LinkedList<ExamQuestion>();
             if (objective == null || objective) {
-                List<ExamQuestion> objectiveList = mainNumber == null ? questionService
-                        .findByExamAndSubjectAndObjective(examId, subjectCode, true) : questionService
-                        .findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, true, mainNumber);
+                List<ExamQuestion> objectiveList = mainNumber == null
+                        ? questionService.findByExamAndSubjectAndObjective(examId, subjectCode, true)
+                        : questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, true,
+                                mainNumber);
                 list.addAll(objectiveList);
             }
             if (objective == null || !objective) {
@@ -249,9 +207,10 @@ public class PaperController extends BaseExamController {
                 for (SelectiveGroup selectiveGroup : selectiveGroups) {
                     selectiveMap.put(selectiveGroup.getMainNumber(), selectiveGroup);
                 }
-                List<ExamQuestion> subjectiveList = mainNumber == null ? questionService
-                        .findByExamAndSubjectAndObjective(examId, subjectCode, false) : questionService
-                        .findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false, mainNumber);
+                List<ExamQuestion> subjectiveList = mainNumber == null
+                        ? questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false)
+                        : questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false,
+                                mainNumber);
                 for (ExamQuestion examQuestion : subjectiveList) {
                     if (examQuestion.getGroupNumber() != null
                             && maps.get(examQuestion.getGroupNumber()).getMarkedCount() > 0) {
@@ -262,12 +221,12 @@ public class PaperController extends BaseExamController {
                     // 选做题判分策略
                     if (selectiveMap.containsKey(examQuestion.getMainNumber())) {
                         examQuestion.setSelective(true);
-                        examQuestion.setSelectiveIndex(selectiveMap.get(examQuestion.getMainNumber())
-                                .getSelectiveIndex());
+                        examQuestion
+                                .setSelectiveIndex(selectiveMap.get(examQuestion.getMainNumber()).getSelectiveIndex());
                         examQuestion
                                 .setSelectivePart(selectiveMap.get(examQuestion.getMainNumber()).getSelectivePart());
-                        examQuestion.setScorePolicy(selectiveMap.get(examQuestion.getMainNumber()).getScorePolicy()
-                                .getValue());
+                        examQuestion.setScorePolicy(
+                                selectiveMap.get(examQuestion.getMainNumber()).getScorePolicy().getValue());
                     } else {
                         examQuestion.setSelective(false);
                     }
@@ -339,8 +298,8 @@ public class PaperController extends BaseExamController {
         query = questionService.findByQuery(query);
         for (ExamQuestion q : query.getResult()) {
             list.add(objective ? new ObjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()))
-                    : new SubjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()), groupMap.get(q.getSubjectCode()
-                            + "_" + q.getGroupNumber())));
+                    : new SubjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()),
+                            groupMap.get(q.getSubjectCode() + "_" + q.getGroupNumber())));
         }
         try {
             String fileName = objective ? "客观题数据.xlsx" : "主观题数据.xlsx";
@@ -447,7 +406,8 @@ public class PaperController extends BaseExamController {
     @Logging(menu = "导入主观题分组", type = LogType.IMPORT_FILE)
     @RequestMapping(value = "/importGroup", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
-    public String importGroupFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
+    public String importGroupFile(HttpServletRequest request, MultipartFile file,
+            RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
         List<String> error = new LinkedList<String>();
         Map<String, SubjectQuestionDTO> map = parseQuestion(file, examId, false, error);
@@ -488,11 +448,13 @@ public class PaperController extends BaseExamController {
                                                     subject.getCode(), false, question.getMainNumber(),
                                                     question.getSubNumber());
                                     if (old == null) {
-                                        error.add("[" + group.getSubjectCode() + "_" + group.getNumber() + "] 分组有小题不存在");
+                                        error.add(
+                                                "[" + group.getSubjectCode() + "_" + group.getNumber() + "] 分组有小题不存在");
                                         validate = false;
                                         break;
                                     }
                                     old.setGroupNumber(group.getNumber());
+                                    old.setArbitrateThreshold(question.getArbitrateThreshold());
                                     questionGroup.add(old);
                                 }
                                 // 校验通过小题才保存
@@ -607,9 +569,8 @@ public class PaperController extends BaseExamController {
         String t = query.getTotalScoreNotEqual() == null ? "" : query.getTotalScoreNotEqual().toString();
         ExamQuestion newQ = questionService.findByExamAndSubjectAndObjectiveAndMainNumberAndSubNumber(examId,
                 question.getSubjectCode(), question.isObjective(), question.getMainNumber(), question.getSubNumber());
-        if (old == null
-                || ((old.getMainNumber() != question.getMainNumber() || !old.getSubNumber().equals(
-                        question.getSubNumber())) && newQ != null)) {
+        if (old == null || ((old.getMainNumber() != question.getMainNumber()
+                || !old.getSubNumber().equals(question.getSubNumber())) && newQ != null)) {
             addMessage(redirectAttributes, "编辑失败,编辑题目不存在或编辑后的题号已存在");
             return "redirect:/admin/exam/paper/detail?subjectCode=" + question.getSubjectCode() + "&pageNumber="
                     + query.getPageNumber() + "&code=" + query.getCode() + "&category=" + query.getCategory()
@@ -624,8 +585,8 @@ public class PaperController extends BaseExamController {
                         + "&level=" + query.getLevel() + "&upload=" + u + "&totalScoreNotEqual=" + t;
             }
         }
-        SelectiveGroup selectiveGroup = selectiveGroupService
-                .findOne(examId, old.getSubjectCode(), old.getMainNumber());
+        SelectiveGroup selectiveGroup = selectiveGroupService.findOne(examId, old.getSubjectCode(),
+                old.getMainNumber());
         if (!old.isObjective() && selectiveGroup != null) {
             addMessage(redirectAttributes, "编辑失败,已经存在选做题分组");
             return "redirect:/admin/exam/paper/detail?subjectCode=" + question.getSubjectCode() + "&pageNumber="
@@ -693,9 +654,8 @@ public class PaperController extends BaseExamController {
             List<ExamQuestion> list = new ArrayList<ExamQuestion>();
             list.add(question);
             taskExecutor.submit(new QuestionDeleteThread(list, markService, lockService));
-            RequestUtils.setLog(request,
-                    "开始删除题目,subjectCode:" + subjectCode + " main number:" + question.getMainNumber() + " sub number:"
-                            + question.getSubNumber());
+            RequestUtils.setLog(request, "开始删除题目,subjectCode:" + subjectCode + " main number:"
+                    + question.getMainNumber() + " sub number:" + question.getSubNumber());
         }
         String u = upload == null ? "" : upload.toString();
         String t = query.getTotalScoreNotEqual() == null ? "" : query.getTotalScoreNotEqual().toString();
@@ -874,8 +834,8 @@ public class PaperController extends BaseExamController {
             question.setType(null);
         }
         Map<Integer, String> titleMap = new HashMap<>();
-        List<ExamQuestion> current = questionService.findByExamAndSubjectAndObjective(examId,
-                question.getSubjectCode(), question.isObjective());
+        List<ExamQuestion> current = questionService.findByExamAndSubjectAndObjective(examId, question.getSubjectCode(),
+                question.isObjective());
         for (ExamQuestion q : current) {
             titleMap.put(q.getMainNumber(), q.getMainTitle());
         }
@@ -1111,7 +1071,7 @@ public class PaperController extends BaseExamController {
             questionService.save(sList);
             for (Integer number : mainMap.keySet()) {
                 MarkGroup group = new MarkGroup(examId, subject.getCode(), number, null, mainMap.get(number), null,
-                        null, null, null, 0, false, false, null, false);
+                        null, null, null, null, 0, false, false, null, false);
                 group.setPicList(cardFile.getMarkConfigAdd(cardFile.getMarkConfig(number), 0.015));
                 groupService.save(group);
             }

+ 8 - 24
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/OnlineExamThread.java

@@ -3,40 +3,24 @@ package cn.com.qmth.stmms.admin.thread;
 import java.io.ByteArrayInputStream;
 import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
+import java.util.*;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.aliyun.oss.common.utils.BinaryUtil;
+
 import cn.com.qmth.stmms.admin.utils.OnlineExamHttpUtil;
-import cn.com.qmth.stmms.biz.exam.model.DataSync;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.service.DataSyncService;
-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.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.file.enums.FormatType;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
-import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
-
-import com.aliyun.oss.common.utils.BinaryUtil;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
 
 public class OnlineExamThread implements Runnable {
 
@@ -294,7 +278,7 @@ public class OnlineExamThread implements Runnable {
         }
         questionService.save(list);
         // 保存group
-        MarkGroup group = new MarkGroup(examId, subjectCode, 1, null, totalScore.doubleValue(), 0d, null, null,
+        MarkGroup group = new MarkGroup(examId, subjectCode, 1, null, totalScore.doubleValue(), 0d, null, null, null,
                 MarkMode.COMMON.toString(), 0, false, false, null, false);
         groupService.save(group);
 

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CoreController.java

@@ -812,7 +812,7 @@ public class CoreController extends BaseApiController {
                 questionGroup.add(old);
             }
             MarkGroup group = new MarkGroup(dto.getExamId(), dto.getSubjectCode(), g.getNumber(), g.getPicConfig(),
-                    totalScore.doubleValue(), g.getDoubleRate(), g.getArbitrateThreshold(), g.getScorePolicy(),
+                    totalScore.doubleValue(), g.getDoubleRate(), g.getArbitrateThreshold(), g.getScorePolicy(),null,
                     g.getMarkMode(), dto.getTrialCount(), false, g.getEnableAllZero() == null ? false
                             : g.getEnableAllZero(), null, false);
             if (!questionGroup.isEmpty()) {

+ 2 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/sys/configEdit.jsp

@@ -37,14 +37,14 @@
         </div>
     </div>
     <div class="control-group">
-		<c:if test="${config.type.value!=3 }">
+		<c:if test="${config.type.value!=3 && config.type.value!=4}">
         <label class="control-label">详情</label>
         <div class="controls">
             <form:textarea path="description" htmlEscape="false" rows="4" maxlength="200" class="input-xxlarge"/>
         </div>
 		</c:if>
 		
-		<c:if test="${config.type.value==3 }">
+		<c:if test="${config.type.value==3 || config.type.value==4}">
 		<label class="control-label">是否开启</label>
         	<div class="controls">
         		<input name="description" type="checkbox" <c:if test="${config.description=='on'}">checked</c:if>/>

+ 2 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/sys/configList.jsp

@@ -22,11 +22,11 @@
 			<tr>
 				<td>${config.type.name}</td>
 				<td>
-				<c:if test="${config.type.value==3 }">
+				<c:if test="${config.type.value==3 ||config.type.value==4}">
         			<c:if test="${config.description=='on'}">开启</c:if>
         			<c:if test="${config.description!='on'}">关闭</c:if>
         		</c:if>
-        		<c:if test="${config.type.value!=3 }">
+        		<c:if test="${config.type.value!=3 && config.type.value!=4 }">
 				${config.description}
         		</c:if>
 				</td>