ting.yin %!s(int64=2) %!d(string=hai) anos
pai
achega
6fe2b738ea
Modificáronse 29 ficheiros con 789 adicións e 338 borrados
  1. 6 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/SelectiveGroupDao.java
  2. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/SubjectiveScoreDao.java
  3. 11 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java
  4. 56 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SelectiveGroup.java
  5. 15 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SubjectiveScore.java
  6. 8 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/SelectiveGroupService.java
  7. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/SubjectiveScoreService.java
  8. 70 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/SelectiveGroupServiceImpl.java
  9. 34 20
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/SubjectiveScoreServiceImpl.java
  10. 10 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkStepDTO.java
  11. 88 20
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  12. 10 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java
  13. 4 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/UserService.java
  14. 10 7
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/impl/UserServiceImpl.java
  15. 25 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SelectivePartDTO.java
  16. 1 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java
  17. 15 13
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  18. 11 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java
  19. 105 44
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SelectiveGroupController.java
  20. 6 11
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java
  21. 3 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examSelect.jsp
  22. 81 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/selectiveAdd.jsp
  23. 157 37
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/selectiveList.jsp
  24. 39 165
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/subjectSelect.jsp
  25. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/reset.jsp
  26. 3 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/subjectSelect.jsp
  27. 5 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/reset.jsp
  28. 5 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/user/userAdd.jsp
  29. 3 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/user/userEdit.jsp

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

@@ -7,20 +7,22 @@ import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
 import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
+import cn.com.qmth.stmms.biz.exam.model.SelectiveGroupPK;
 
-public interface SelectiveGroupDao extends PagingAndSortingRepository<SelectiveGroup, MarkGroupPK>,
+public interface SelectiveGroupDao extends PagingAndSortingRepository<SelectiveGroup, SelectiveGroupPK>,
         JpaSpecificationExecutor<SelectiveGroup> {
 
     @Query("select q from SelectiveGroup q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.mainNumber=?3")
     SelectiveGroup findOne(Integer examId, String subjectCode, Integer mainNumber);
 
     @Modifying(clearAutomatically = true)
-    @Query("delete from SelectiveGroup q where q.pk.examId=?1 and q.pk.subjectCode=?2")
-    void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
+    @Query("delete from SelectiveGroup q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.selectiveIndex=?3 ")
+    void deleteByExamIdAndSubjectCodeAndSelectiveIndex(Integer examId, String subjectCode, int selectiveIndex);
 
     @Query("select q from SelectiveGroup q where q.pk.examId=?1 and q.pk.subjectCode=?2 order by q.pk.mainNumber")
     List<SelectiveGroup> findByExamIdAndSubjectCode(Integer examId, String subjectCode);
 
+    long countByPkExamIdAndPkSubjectCode(int examId, String subjectCode);
+
 }

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/SubjectiveScoreDao.java

@@ -41,4 +41,8 @@ public interface SubjectiveScoreDao extends JpaRepository<SubjectiveScore, Subje
             + "(select g.pk.studentId from MarkGroupStudent g where g.pk.studentId=s.pk.studentId and g.status=?4)")
     void deleteByStudentGroupStatus(Integer examId, String subjectCode, Integer groupNumber, SubjectiveStatus status);
 
+    // @Query("select s from SubjectiveScore s where s.pk.studentId=?1 and s.uncalculate=?2 order by s.pk.mainNumber, s.pk.subNumber")
+    // List<SubjectiveScore> findByStudentIdAndUncalculate(Integer studentId,
+    // Boolean uncalculate);
+
 }

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

@@ -97,6 +97,9 @@ public class ExamQuestion implements Serializable {
     @Transient
     private boolean enableUpdate;
 
+    @Transient
+    private Integer selectiveIndex;
+
     public Integer getId() {
         return id;
     }
@@ -319,4 +322,12 @@ public class ExamQuestion implements Serializable {
         this.enableUpdate = enableUpdate;
     }
 
+    public Integer getSelectiveIndex() {
+        return selectiveIndex;
+    }
+
+    public void setSelectiveIndex(Integer selectiveIndex) {
+        this.selectiveIndex = selectiveIndex;
+    }
+
 }

+ 56 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SelectiveGroup.java

@@ -5,7 +5,12 @@ import java.io.Serializable;
 import javax.persistence.Column;
 import javax.persistence.EmbeddedId;
 import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
 import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import cn.com.qmth.stmms.common.enums.ScorePolicy;
 
 @Entity
 @Table(name = "eb_selective_group")
@@ -16,24 +21,43 @@ public class SelectiveGroup implements Serializable {
     @EmbeddedId
     private SelectiveGroupPK pk;
 
+    // 选做题分组
     @Column(name = "selective_index", nullable = false)
     private Integer selectiveIndex;
 
+    // 选做题合分数量
     @Column(name = "selective_count", nullable = false)
     private Integer selectiveCount;
 
+    // 选做题分区
+    @Column(name = "selective_part", nullable = false)
+    private Integer selectivePart;
+
+    // 选做题合分方式
+    @Column(name = "score_policy", nullable = true, length = 16)
+    @Enumerated(EnumType.STRING)
+    private ScorePolicy scorePolicy;
+
+    @Transient
+    private String title;
+
+    @Transient
+    private Double partScore;
+
     public SelectiveGroup() {
         this.pk = new SelectiveGroupPK();
     }
 
     public SelectiveGroup(Integer examId, String subjectCode, Integer mainNumber, Integer selectiveIndex,
-            Integer selectiveCount) {
+            Integer selectiveCount, Integer selectivePart, ScorePolicy scorePolicy) {
         this.pk = new SelectiveGroupPK();
         this.pk.setExamId(examId);
         this.pk.setSubjectCode(subjectCode);
         this.pk.setMainNumber(mainNumber);
         this.selectiveCount = selectiveCount;
         this.selectiveIndex = selectiveIndex;
+        this.selectivePart = selectivePart;
+        this.scorePolicy = scorePolicy == null ? ScorePolicy.MAX : scorePolicy;
     }
 
     public Integer getExamId() {
@@ -76,4 +100,35 @@ public class SelectiveGroup implements Serializable {
         this.selectiveCount = selectiveCount;
     }
 
+    public ScorePolicy getScorePolicy() {
+        return scorePolicy;
+    }
+
+    public void setScorePolicy(ScorePolicy scorePolicy) {
+        this.scorePolicy = scorePolicy;
+    }
+
+    public Integer getSelectivePart() {
+        return selectivePart;
+    }
+
+    public void setSelectivePart(Integer selectivePart) {
+        this.selectivePart = selectivePart;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public Double getPartScore() {
+        return partScore;
+    }
+
+    public void setPartScore(Double partScore) {
+        this.partScore = partScore;
+    }
 }

+ 15 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SubjectiveScore.java

@@ -61,6 +61,12 @@ public class SubjectiveScore implements Serializable, Comparable<SubjectiveScore
     @Column(name = "unanswered_count", nullable = false)
     private Integer unansweredCount;
 
+    /**
+     * 未计分
+     */
+    @Column(name = "uncalculate", nullable = false)
+    private Boolean uncalculate;
+
     public SubjectiveScore() {
         this.pk = new SubjectiveScorePK();
     }
@@ -164,4 +170,13 @@ public class SubjectiveScore implements Serializable, Comparable<SubjectiveScore
         }
         return i;
     }
+
+    public Boolean getUncalculate() {
+        return uncalculate;
+    }
+
+    public void setUncalculate(Boolean uncalculate) {
+        this.uncalculate = uncalculate;
+    }
+
 }

+ 8 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/SelectiveGroupService.java

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
 import java.util.List;
+import java.util.Map;
 
 import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
 
@@ -14,6 +15,12 @@ public interface SelectiveGroupService {
 
     List<SelectiveGroup> findByExamIdAndSubjectCode(int examId, String code);
 
-    void deleteByExamIdAndSubjectCode(int examId, String subjectCode);
+    void deleteByExamIdAndSubjectCodeAndSelectiveIndex(int examId, String subjectCode, int selectiveIndex);
+
+    List<SelectiveGroup> findIndexByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    long countByExamIdAndSubjectCode(int examId, String subjectCode);
+
+    Map<Integer, List<SelectiveGroup>> findGroupByExamIdAndSubjectCode(int examId, String subjectCode);
 
 }

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

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
 import java.util.List;
+import java.util.Set;
 
 import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
 import cn.com.qmth.stmms.biz.exam.query.SubjectiveScoreSearchQuery;
@@ -11,4 +12,6 @@ public interface SubjectiveScoreService {
 
     List<SubjectiveScore> findByStudentIdAndGroupNumber(Integer studentId, Integer number);
 
+    Set<Integer> findMainNumberByStudentIdAndUncalculate(Integer studentId, Boolean uncalculate);
+
 }

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

@@ -1,14 +1,22 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.SelectiveGroupDao;
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
 
 @Service("selectiveGroupService")
@@ -17,6 +25,9 @@ public class SelectiveGroupServiceImpl extends BaseQueryService<SelectiveGroup>
     @Autowired
     private SelectiveGroupDao selectiveGroupDao;
 
+    @Autowired
+    private ExamQuestionService questionService;
+
     @Transactional
     @Override
     public SelectiveGroup save(SelectiveGroup group) {
@@ -41,8 +52,65 @@ public class SelectiveGroupServiceImpl extends BaseQueryService<SelectiveGroup>
 
     @Transactional
     @Override
-    public void deleteByExamIdAndSubjectCode(int examId, String subjectCode) {
-        selectiveGroupDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
+    public void deleteByExamIdAndSubjectCodeAndSelectiveIndex(int examId, String subjectCode, int selectiveIndex) {
+        selectiveGroupDao.deleteByExamIdAndSubjectCodeAndSelectiveIndex(examId, subjectCode, selectiveIndex);
+    }
+
+    @Override
+    public List<SelectiveGroup> findIndexByExamIdAndSubjectCode(int examId, String subjectCode) {
+        Map<Integer, List<SelectiveGroup>> map = this.findGroupByExamIdAndSubjectCode(examId, subjectCode);
+        List<ExamQuestion> questionList = questionService.findMainByExamAndSubjectAndObjective(examId, subjectCode,
+                false);
+        Map<Integer, String> mainTileMap = new HashMap<Integer, String>();
+        Map<Integer, Double> mainScoreMap = new HashMap<Integer, Double>();
+        for (ExamQuestion question : questionList) {
+            mainTileMap.put(question.getMainNumber(), question.getMainTitle());
+            mainScoreMap.put(question.getMainNumber(), question.getTotalScore());
+        }
+        List<SelectiveGroup> result = new ArrayList<SelectiveGroup>();
+        for (Integer key : map.keySet()) {
+            List<SelectiveGroup> indexGroup = map.get(key);
+            Set<String> mainTitles = new LinkedHashSet<>();
+            double partScore = 0;
+            int selectivePart = 0;
+            for (SelectiveGroup selectiveGroup : indexGroup) {
+                // 显示分组下所有题目名称
+                mainTitles.add(mainTileMap.get(selectiveGroup.getMainNumber()));
+                // 显示最大的part
+                if (selectivePart < selectiveGroup.getSelectivePart()) {
+                    selectivePart = selectiveGroup.getSelectivePart();
+                }
+                // 计算分组一个part的分数
+                if (selectiveGroup.getSelectivePart() == 1) {
+                    partScore = partScore + mainScoreMap.get(selectiveGroup.getMainNumber());
+                }
+            }
+            SelectiveGroup group = indexGroup.get(0);
+            group.setSelectivePart(selectivePart);
+            group.setTitle(StringUtils.join(mainTitles, ","));
+            group.setPartScore(partScore);
+            result.add(group);
+        }
+        return result;
     }
 
+    @Override
+    public long countByExamIdAndSubjectCode(int examId, String subjectCode) {
+        return selectiveGroupDao.countByPkExamIdAndPkSubjectCode(examId, subjectCode);
+    }
+
+    @Override
+    public Map<Integer, List<SelectiveGroup>> findGroupByExamIdAndSubjectCode(int examId, String subjectCode) {
+        List<SelectiveGroup> list = selectiveGroupDao.findByExamIdAndSubjectCode(examId, subjectCode);
+        Map<Integer, List<SelectiveGroup>> map = new HashMap<Integer, List<SelectiveGroup>>();
+        for (SelectiveGroup selectiveGroup : list) {
+            List<SelectiveGroup> indexGroup = map.get(selectiveGroup.getSelectiveIndex());
+            if (indexGroup == null) {
+                indexGroup = new ArrayList<SelectiveGroup>();
+            }
+            indexGroup.add(selectiveGroup);
+            map.put(selectiveGroup.getSelectiveIndex(), indexGroup);
+        }
+        return map;
+    }
 }

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

@@ -1,24 +1,28 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import cn.com.qmth.stmms.biz.common.BaseQueryService;
-import cn.com.qmth.stmms.biz.exam.dao.SubjectiveScoreDao;
-import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
-import cn.com.qmth.stmms.biz.exam.query.SubjectiveScoreSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.dao.SubjectiveScoreDao;
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
+import cn.com.qmth.stmms.biz.exam.query.SubjectiveScoreSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
 
 @Service
 public class SubjectiveScoreServiceImpl extends BaseQueryService<SubjectiveScore> implements SubjectiveScoreService {
@@ -81,21 +85,20 @@ public class SubjectiveScoreServiceImpl extends BaseQueryService<SubjectiveScore
                 // predicates.add(predicate);
                 // }
                 if (query.getMainStartScore() != null) {
-                    Predicate predicate = cb
-                            .greaterThanOrEqualTo(root.get("mainScore").as(Double.class), query.getMainStartScore());
+                    Predicate predicate = cb.greaterThanOrEqualTo(root.get("mainScore").as(Double.class),
+                            query.getMainStartScore());
                     predicates.add(predicate);
                 }
                 if (query.getMainEndScore() != null) {
-                    Predicate predicate = cb
-                            .lessThanOrEqualTo(root.get("mainScore").as(Double.class), query.getMainEndScore());
+                    Predicate predicate = cb.lessThanOrEqualTo(root.get("mainScore").as(Double.class),
+                            query.getMainEndScore());
                     predicates.add(predicate);
                 }
                 if (query.getScore() != null) {
                     predicates.add(cb.equal(root.get("score"), query.getScore()));
                 }
-                return predicates.isEmpty() ?
-                        cb.conjunction() :
-                        cb.and(predicates.toArray(new Predicate[predicates.size()]));
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
             }
         };
     }
@@ -106,4 +109,15 @@ public class SubjectiveScoreServiceImpl extends BaseQueryService<SubjectiveScore
         list.sort(null);
         return list;
     }
+
+    @Override
+    public Set<Integer> findMainNumberByStudentIdAndUncalculate(Integer studentId, Boolean uncalculate) {
+        Set<Integer> mainNumbers = new HashSet<Integer>();
+        // List<SubjectiveScore> list =
+        // scoreDao.findByStudentIdAndUncalculate(studentId, uncalculate);
+        // for (SubjectiveScore subjectiveScore : list) {
+        // mainNumbers.add(subjectiveScore.getMainNumber());
+        // }
+        return mainNumbers;
+    }
 }

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

@@ -26,6 +26,8 @@ public class MarkStepDTO implements Serializable {
 
     private double minScore;
 
+    private boolean uncalculate;
+
     private List<TrackDTO> trackList = new ArrayList<TrackDTO>();
 
     public int getMainNumber() {
@@ -112,4 +114,12 @@ public class MarkStepDTO implements Serializable {
         this.score = score;
     }
 
+    public boolean isUncalculate() {
+        return uncalculate;
+    }
+
+    public void setUncalculate(boolean uncalculate) {
+        this.uncalculate = uncalculate;
+    }
+
 }

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

@@ -5,8 +5,10 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.slf4j.Logger;
@@ -945,32 +947,96 @@ public class MarkServiceImpl implements MarkService {
             scoreMap.put(mainNumber, mainScore.doubleValue());
         }
         // 计算选做题分数
+        BigDecimal totalScore = BigDecimal.ZERO;
         ExamStudent student = studentService.findById(studentId);
-        List<SelectiveGroup> selectiveGroups = selectiveGroupService.findByExamIdAndSubjectCode(student.getExamId(),
-                student.getSubjectCode());
-
-        List<Double> selectiveList = new ArrayList<Double>();
-        Integer selectiveCount = 0;
-        for (SelectiveGroup selectiveGroup : selectiveGroups) {
-            double mainScore = scoreMap.get(selectiveGroup.getMainNumber());
-            scoreMap.remove(selectiveGroup.getMainNumber());
-            selectiveList.add(mainScore);
-            if (selectiveCount == 0) {
-                selectiveCount = selectiveGroup.getSelectiveCount();
+        Map<Integer, List<SelectiveGroup>> indexMap = selectiveGroupService.findGroupByExamIdAndSubjectCode(
+                student.getExamId(), student.getSubjectCode());
+        for (Integer index : indexMap.keySet()) {
+            // 循环选做题组
+            List<SelectiveGroup> indexGroup = indexMap.get(index);
+            Integer selectiveCount = 0;
+            ScorePolicy policy = null;
+            Map<Integer, List<SelectiveGroup>> partMap = new HashMap<Integer, List<SelectiveGroup>>();
+            for (SelectiveGroup selectiveGroup : indexGroup) {
+                List<SelectiveGroup> partGroup = partMap.get(selectiveGroup.getSelectivePart());
+                if (partGroup == null) {
+                    partGroup = new ArrayList<SelectiveGroup>();
+                }
+                partGroup.add(selectiveGroup);
+                partMap.put(selectiveGroup.getSelectivePart(), partGroup);
+                if (selectiveCount == 0) {
+                    selectiveCount = selectiveGroup.getSelectiveCount();
+                }
+                if (policy == null) {
+                    policy = selectiveGroup.getScorePolicy();
+                }
+            }
+            List<Double> partScoreList = new ArrayList<Double>();
+            Map<Integer, Double> partScoreMap = new HashMap<Integer, Double>();
+            // 循环选做分区
+            for (Integer part : partMap.keySet()) {
+                List<Double> selectiveList = new ArrayList<Double>();
+                List<SelectiveGroup> partList = partMap.get(part);
+                boolean unselectivePart = false;
+                for (SelectiveGroup selectiveGroup : partList) {
+                    double mainScore = scoreMap.get(selectiveGroup.getMainNumber());
+                    scoreMap.remove(selectiveGroup.getMainNumber());
+                    if (mainScore == UN_SELECTIVE_SCORE) {
+                        unselectivePart = true;
+                    } else {
+                        selectiveList.add(mainScore);
+                    }
+                }
+                // 当前part未选做
+                if (unselectivePart) {
+                    for (SelectiveGroup selectiveGroup : partList) {
+                        List<SubjectiveScore> mainScoreList = mainScoreMap.get(selectiveGroup.getMainNumber());
+                        for (SubjectiveScore ss : mainScoreList) {
+                            ss.setUncalculate(true);
+                        }
+                        scoreDao.save(mainScoreList);
+                    }
+                } else {
+                    BigDecimal partScore = BigDecimal.ZERO;
+                    for (int i = 0; i < selectiveList.size(); i++) {
+                        partScore = partScore.add(BigDecimal.valueOf(selectiveList.get(i)));
+                    }
+                    partScoreList.add(partScore.doubleValue());
+                    partScoreMap.put(part, partScore.doubleValue());
+                }
+            }
+            Collections.sort(partScoreList);
+            if (policy == null || ScorePolicy.MAX.equals(policy)) {
+                Collections.reverse(partScoreList);
+            }
+            // 计算一个选做题分组得分
+            for (int i = 0; i < partScoreList.size(); i++) {
+                if (i < selectiveCount && partScoreList.get(i) != UN_SELECTIVE_SCORE) {
+                    totalScore = totalScore.add(BigDecimal.valueOf(partScoreList.get(i)));
+                    // 删除已经合分的part
+                    Iterator<Entry<Integer, Double>> it = partScoreMap.entrySet().iterator();
+                    while (it.hasNext()) {
+                        Entry<Integer, Double> entry = it.next();
+                        if (entry.getValue().doubleValue() == partScoreList.get(i).doubleValue())
+                            it.remove();
+                    }
+                }
+            }
+            for (Integer part : partScoreMap.keySet()) {
+                List<SelectiveGroup> selectiveGroups = partMap.get(part);
+                for (SelectiveGroup group : selectiveGroups) {
+                    List<SubjectiveScore> mainScoreList = mainScoreMap.get(group.getMainNumber());
+                    for (SubjectiveScore ss : mainScoreList) {
+                        ss.setUncalculate(true);
+                    }
+                    scoreDao.save(mainScoreList);
+                }
             }
         }
-        Collections.sort(selectiveList);
-        Collections.reverse(selectiveList);
-        // 计算总分
-        BigDecimal totalScore = BigDecimal.ZERO;
+        // 计算非选做题总分
         for (Integer mainNumber : scoreMap.keySet()) {
             totalScore = totalScore.add(BigDecimal.valueOf(scoreMap.get(mainNumber)));
         }
-        for (int i = 0; i < selectiveList.size(); i++) {
-            if (i < selectiveCount && selectiveList.get(i) != UN_SELECTIVE_SCORE) {
-                totalScore = totalScore.add(BigDecimal.valueOf(selectiveList.get(i)));
-            }
-        }
         // 全部评完,更新考生主观题得分
         studentService.updateSubjectiveStatusAndScore(studentId, SubjectiveStatus.MARKED, totalScore.doubleValue(),
                 ExamStudent.buildScoreList(scoreList));
@@ -1452,9 +1518,11 @@ public class MarkServiceImpl implements MarkService {
                 ScoreItem item = scoreList.get(i);
                 ss.setScore(item.getScore());
                 ss.setMainScore(0.0);
+                ss.setUncalculate(false);
             } else {
                 ss.setScore(score);
                 ss.setMainScore(score);
+                ss.setUncalculate(true);
             }
             if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
                 ss.setUnansweredCount(0);

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

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.biz.mark.service.Impl;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -21,6 +22,7 @@ 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.service.MarkerService;
+import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
@@ -94,6 +96,9 @@ public class TaskServiceImpl implements TaskService {
     @Autowired
     private ExamService examService;
 
+    @Autowired
+    private SubjectiveScoreService scoreService;
+
     @Override
     public List<Task> findByQuery(MarkLibrarySearchQuery query) {
         List<Task> list = new LinkedList<Task>();
@@ -313,6 +318,7 @@ public class TaskServiceImpl implements TaskService {
         step.setMaxScore(question.getTotalScore());
         step.setMinScore(0d);
         step.setIntervalScore(question.getIntervalScore());
+        step.setUncalculate(false);
         return step;
     }
 
@@ -409,12 +415,16 @@ public class TaskServiceImpl implements TaskService {
         List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
         List<ExamQuestion> sList = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
                 student.getSubjectCode(), false);
+        Set<Integer> mainList = scoreService.findMainNumberByStudentIdAndUncalculate(student.getId(), true);
         List<ScoreItem> sItems = student.getScoreList(false);
         for (int i = 0; i < sList.size(); i++) {
             ExamQuestion question = sList.get(i);
             MarkStepDTO step = buildStep(question);
             if (!sItems.isEmpty() && sItems.size() == sList.size()) {
                 step.setScore(sItems.get(i).getScore());
+                if (mainList.contains(step.getMainNumber())) {
+                    step.setUncalculate(true);
+                }
             }
             // 增加阅卷轨迹列表获取
             if (trialGroupCount > 0) {

+ 4 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/UserService.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.stmms.biz.user.service;
 
+import java.util.Set;
+
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
 import cn.com.qmth.stmms.common.enums.Role;
@@ -28,9 +30,9 @@ public interface UserService {
 
     User findByAccount(Integer schoolId, String account);
 
-    void batchSaveMarker(int examId, String[] subjectCodes, Integer number, String password);
+    void batchSaveMarker(int examId, Set<String> subjectCodes, Integer number, String password);
 
-    void batchSaveSubjectUser(int examId, Role role, String[] subjectCodes, Integer number);
+    void batchSaveSubjectUser(int examId, Role role, Set<String> subjectCodes, Integer number);
 
     public int findMaxNumberByLoginNameStart(String prefix);
 

+ 10 - 7
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/impl/UserServiceImpl.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
@@ -235,9 +236,9 @@ public class UserServiceImpl implements UserService {
 
     @Transactional
     @Override
-    public void batchSaveMarker(int examId, String[] subjectCodes, Integer number, String password) {
-        if (subjectCodes.length == 0) {
-            List<ExamSubject> subjects = subjectService.list(examId, 0);
+    public void batchSaveMarker(int examId, Set<String> subjectCodes, Integer number, String password) {
+        if (subjectCodes.size() == 0) {
+            List<ExamSubject> subjects = subjectService.list(examId);
             for (ExamSubject subject : subjects) {
                 saveMarkerBySubject(examId, number, password, subject.getCode());
             }
@@ -292,8 +293,8 @@ public class UserServiceImpl implements UserService {
 
     @Transactional
     @Override
-    public void batchSaveSubjectUser(int examId, Role role, String[] subjectCodes, Integer number) {
-        if (subjectCodes.length == 0) {
+    public void batchSaveSubjectUser(int examId, Role role, Set<String> subjectCodes, Integer number) {
+        if (subjectCodes.size() == 0) {
             List<ExamSubject> subjects = subjectService.list(examId);
             for (ExamSubject subject : subjects) {
                 saveSubjectUserBySubject(examId, number, role, subject.getCode());
@@ -326,8 +327,10 @@ public class UserServiceImpl implements UserService {
                 user.setEnable(true);
                 user.setSchoolId(exam.getSchoolId());
                 user.setCreatedTime(new Date());
-                userDao.save(user);
+            } else {
+                user.setPassword(EncryptUtils.md5(USER_PASSWORD));
             }
+            userDao.save(user);
             SubjectUser subjectUser = subjectUserService.findBySubjectCodeAndUserId(subjectCode, user.getId());
             if (subjectUser == null) {
                 subjectUser = new SubjectUser();
@@ -383,7 +386,7 @@ public class UserServiceImpl implements UserService {
     @Override
     public int findMaxNumberByLoginNameStart(String prefix) {
         List<User> list = userDao.findStartWithLoginName(prefix);
-        int number = 1;
+        int number = 0;
         for (User user : list) {
             String userNumber = user.getLoginName().substring(prefix.length() + 1, user.getLoginName().length() - 1);
             try {

+ 25 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SelectivePartDTO.java

@@ -0,0 +1,25 @@
+package cn.com.qmth.stmms.admin.dto;
+
+public class SelectivePartDTO {
+
+    Integer selectivePart;
+
+    Integer[] mainNumbers;
+
+    public Integer getSelectivePart() {
+        return selectivePart;
+    }
+
+    public void setSelectivePart(Integer selectivePart) {
+        this.selectivePart = selectivePart;
+    }
+
+    public Integer[] getMainNumbers() {
+        return mainNumbers;
+    }
+
+    public void setMainNumbers(Integer[] mainNumbers) {
+        this.mainNumbers = mainNumbers;
+    }
+
+}

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java

@@ -135,7 +135,7 @@ public class CheckStudentController extends BaseExamController {
     @ResponseBody
     public Object save(HttpServletRequest request, @RequestParam Integer studentId, @RequestParam String answers) {
         ExamStudent student = studentService.findById(studentId);
-        answers = StringEscapeUtils.unescapeHtml(StringUtils.trimToNull(answers));
+        answers = StringEscapeUtils.unescapeHtml(StringUtils.trimToEmpty(answers));
         CheckStudent cs = checkStudentService.findByStudentId(studentId);
         if (student != null && cs != null) {
             student.setAnswers(answers.toUpperCase());

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

@@ -532,19 +532,21 @@ public class MarkGroupController extends BaseExamController {
             mainNumbers.add(question.getMainNumber());
         }
         // 一个分组内只能有一个选做题大题
-        if (selectives.size() > 0 && mainNumbers.size() > 1) {
-            return false;
-        }
+        // if (selectives.size() > 0 && mainNumbers.size() > 1) {
+        // return false;
+        // }
         // 一个选做题大题内的小题必须在一个分组
-        if (selectives.size() > 0) {
-            for (Integer mainNumber : mainNumbers) {
-                Long count = questionService.countByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false,
-                        mainNumber);
-                if (count != selectives.size()) {
-                    return false;
-                }
-            }
-        }
+        // if (selectives.size() > 0) {
+        // for (Integer mainNumber : mainNumbers) {
+        // Long count =
+        // questionService.countByExamAndSubjectAndObjectiveAndMainNumber(examId,
+        // subjectCode, false,
+        // mainNumber);
+        // if (count != selectives.size()) {
+        // return false;
+        // }
+        // }
+        // }
         if (questionIds.length == selectives.size()) {
             return true;
         }
@@ -579,7 +581,7 @@ public class MarkGroupController extends BaseExamController {
             redirectAttributes.addAttribute("subjectCode", subjectCode);
             return "redirect:/admin/exam/group/add";
         } else if (!checkSelective(examId, subjectCode, questionIds)) {
-            addMessage(redirectAttributes, "选做题和非选做题不能在一组,并且选做题大题必须单独一组,同一大题不能被分开");
+            addMessage(redirectAttributes, "选做题和非选做题不能在一组");
             redirectAttributes.addAttribute("subjectCode", subjectCode);
             return "redirect:/admin/exam/group/add";
         } else {

+ 11 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -48,6 +48,7 @@ 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.service.MarkerService;
+import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.file.service.FileService;
@@ -132,6 +133,9 @@ public class PaperController extends BaseExamController {
     @Autowired
     private MarkerService markerService;
 
+    @Autowired
+    private SelectiveGroupService selectiveGroupService;
+
     @Logging(menu = "试卷管理查询", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ExamSubjectSearchQuery query,
@@ -519,6 +523,13 @@ public class PaperController extends BaseExamController {
                         + "&level=" + query.getLevel() + "&upload=" + u + "&totalScoreNotEqual=" + t;
             }
         }
+        long selectCount = selectiveGroupService.countByExamIdAndSubjectCode(examId, old.getSubjectCode());
+        if (!old.isObjective() && selectCount != 0) {
+            addMessage(redirectAttributes, "编辑失败,已经存在选做题分组");
+            return "redirect:/admin/exam/paper/detail?subjectCode=" + question.getSubjectCode() + "&pageNumber="
+                    + query.getPageNumber() + "&code=" + query.getCode() + "&category=" + query.getCategory()
+                    + "&level=" + query.getLevel() + "&upload=" + u + "&totalScoreNotEqual=" + t;
+        }
         List<String> error = new LinkedList<String>();
         if (validate(question, error, new HashMap<Integer, String>())) {
             old.setMainNumber(question.getMainNumber());

+ 105 - 44
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SelectiveGroupController.java

@@ -15,10 +15,12 @@ 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.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
+import cn.com.qmth.stmms.admin.dto.SelectivePartDTO;
 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;
@@ -29,6 +31,7 @@ import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
 
 @Controller("selectiveGroupController")
@@ -54,93 +57,151 @@ public class SelectiveGroupController extends BaseExamController {
     public String list(HttpServletRequest request, Model model, @RequestParam String subjectCode) {
         int examId = getSessionExamId(request);
         ExamSubject subject = subjectService.find(examId, subjectCode);
-        List<ExamQuestion> questions = questionService.findMainByExamAndSubjectAndObjective(examId, subjectCode, false);
         List<SelectiveGroup> list = selectiveGroupService.findByExamIdAndSubjectCode(examId, subjectCode);
-        Set<Integer> mainNumbers = new HashSet<Integer>();
+        Map<Integer, SelectiveGroup> map = new HashMap<Integer, SelectiveGroup>();
         for (SelectiveGroup selectiveGroup : list) {
-            mainNumbers.add(selectiveGroup.getMainNumber());
+            map.put(selectiveGroup.getMainNumber(), selectiveGroup);
         }
+        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false);
         for (ExamQuestion examQuestion : questions) {
-            if (mainNumbers.contains(examQuestion.getMainNumber())) {
+            if (map.get(examQuestion.getMainNumber()) != null) {
                 examQuestion.setSelective(true);
+                examQuestion.setSelectiveIndex(map.get(examQuestion.getMainNumber()).getSelectiveIndex());
             }
         }
-        if (!list.isEmpty()) {
-            model.addAttribute("selectiveCount", list.get(0).getSelectiveCount());
-        }
         model.addAttribute("subject", subject);
-        model.addAttribute("list", list);
+        model.addAttribute("list", selectiveGroupService.findIndexByExamIdAndSubjectCode(examId, subjectCode));
         model.addAttribute("questions", questions);
+        ScorePolicy[] scorePolicyList = { ScorePolicy.MAX, ScorePolicy.MIN };
+        model.addAttribute("scorePolicyList", scorePolicyList);
         return "modules/exam/selectiveList";
     }
 
-    @Logging(menu = "选做题设置", type = LogType.ADD)
     @RequestMapping("/add")
+    public String add(Model model, HttpServletRequest request, RedirectAttributes redirectAttributes,
+            @RequestParam String subjectCode, @RequestParam Integer selectiveCount, @RequestParam Integer scorePolicy,
+            @RequestParam Integer selectivePart) {
+        int examId = getSessionExamId(request);
+        List<MarkGroup> groups = groupService.findByExamAndSubject(examId, subjectCode);
+        if (groups != null && groups.size() > 0) {
+            addMessage(redirectAttributes, "该科目已经存在分组,无法设置");
+            return "redirect:/admin/exam/selectiveGroup?subjectCode=" + subjectCode;
+        }
+        ExamSubject subject = subjectService.find(examId, subjectCode);
+        List<SelectiveGroup> list = selectiveGroupService.findByExamIdAndSubjectCode(examId, subjectCode);
+        Map<Integer, SelectiveGroup> map = new HashMap<Integer, SelectiveGroup>();
+        for (SelectiveGroup selectiveGroup : list) {
+            map.put(selectiveGroup.getMainNumber(), selectiveGroup);
+        }
+
+        List<ExamQuestion> questions = questionService.findMainByExamAndSubjectAndObjective(examId, subjectCode, false);
+        for (ExamQuestion examQuestion : questions) {
+            if (map.get(examQuestion.getMainNumber()) != null) {
+                examQuestion.setSelective(true);
+                examQuestion.setSelectiveIndex(map.get(examQuestion.getMainNumber()).getSelectiveIndex());
+            }
+        }
+        model.addAttribute("selectiveCount", selectiveCount);
+        model.addAttribute("selectivePart", selectivePart);
+        model.addAttribute("scorePolicy", scorePolicy);
+        model.addAttribute("questions", questions);
+        model.addAttribute("subject", subject);
+        return "modules/exam/selectiveAdd";
+    }
+
+    @Logging(menu = "选做题新增", type = LogType.ADD)
+    @RequestMapping("/save")
     @Transactional
-    public String add(HttpServletRequest request, RedirectAttributes redirectAttributes,
-            @RequestParam String subjectCode, @RequestParam Integer[] mainNumbers, @RequestParam Integer selectiveCount) {
+    public String save(HttpServletRequest request, RedirectAttributes redirectAttributes,
+            @RequestParam String subjectCode, @RequestParam Integer selectiveCount, @RequestParam Integer scorePolicy,
+            @RequestParam Integer selectivePart, @RequestBody List<SelectivePartDTO> parts) {
         int examId = getSessionExamId(request);
-        if (selectiveCount >= mainNumbers.length) {
+        if (selectiveCount >= selectivePart) {
             addMessage(redirectAttributes, "选做题数量不能大于已选择题目数量");
-            return "redirect:/admin/exam/paper";
+            return "redirect:/admin/exam/selectiveGroup?subjectCode=" + subjectCode;
         }
         List<MarkGroup> groups = groupService.findByExamAndSubject(examId, subjectCode);
         if (groups != null && groups.size() > 0) {
             addMessage(redirectAttributes, "该科目已经存在分组,无法设置");
-            return "redirect:/admin/exam/paper";
+            return "redirect:/admin/exam/selectiveGroup?subjectCode=" + subjectCode;
         }
-        Double questionScore = checkTotalScore(examId, subjectCode, mainNumbers);
-        if (questionScore == null) {
-            addMessage(redirectAttributes, "选做题分数必须一样");
-            return "redirect:/admin/exam/paper";
+        if (checkTotalScore(examId, subjectCode, parts)) {
+            addMessage(redirectAttributes, "选做题区分数必须一样");
+            return "redirect:/admin/exam/selectiveGroup?subjectCode=" + subjectCode;
         }
-        selectiveGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
-        if (mainNumbers.length > 0) {
+        for (SelectivePartDTO part : parts) {
             List<SelectiveGroup> list = new ArrayList<SelectiveGroup>();
-            for (Integer mainNumber : mainNumbers) {
-                list.add(new SelectiveGroup(examId, subjectCode, mainNumber, 1, selectiveCount));
+            for (Integer mainNumber : part.getMainNumbers()) {
+                list.add(new SelectiveGroup(examId, subjectCode, mainNumber, part.getSelectivePart(), selectiveCount,
+                        selectivePart, ScorePolicy.findByValue(scorePolicy)));
             }
             selectiveGroupService.save(list);
-            Double totalScore = questionService.sumTotalScore(examId, subjectCode, false);
-            totalScore = BigDecimalUtils.sub(totalScore,
-                    BigDecimalUtils.mul(BigDecimalUtils.sub(mainNumbers.length, selectiveCount), questionScore));
-            subjectService.updateScore(examId, subjectCode, false, totalScore);
         }
-        return "redirect:/admin/exam/paper";
+        calculate(examId, subjectCode);
+        return "redirect:/admin/exam/selectiveGroup?subjectCode=" + subjectCode;
     }
 
-    private Double checkTotalScore(int examId, String subjectCode, Integer[] mainNumbers) {
+    private boolean checkTotalScore(int examId, String subjectCode, List<SelectivePartDTO> parts) {
         List<ExamQuestion> questions = questionService.findMainByExamAndSubjectAndObjective(examId, subjectCode, false);
         Map<Integer, ExamQuestion> map = new HashMap<Integer, ExamQuestion>();
         for (ExamQuestion examQuestion : questions) {
             map.put(examQuestion.getMainNumber(), examQuestion);
         }
-        Double totalScore = null;
-        for (Integer mainNumber : mainNumbers) {
-            if (totalScore == null) {
-                totalScore = map.get(mainNumber).getTotalScore();
-            }
-            if (totalScore.doubleValue() != map.get(mainNumber).getTotalScore().doubleValue()) {
-                return null;
+        Set<Double> scores = new HashSet<Double>();
+        for (SelectivePartDTO part : parts) {
+            double totalScore = 0;
+            for (Integer mainNumber : part.getMainNumbers()) {
+                totalScore = totalScore + map.get(mainNumber).getTotalScore();
             }
+            scores.add(totalScore);
         }
-        return totalScore;
+        return scores.size() > 1;
     }
 
-    @Logging(menu = "清空选做题设置", type = LogType.ADD)
-    @RequestMapping("/clear")
+    @Logging(menu = "删除选做题", type = LogType.DELETE)
+    @RequestMapping("/delete")
     @Transactional
     public String claer(HttpServletRequest request, RedirectAttributes redirectAttributes,
-            @RequestParam String subjectCode) {
+            @RequestParam String subjectCode, @RequestParam Integer selectiveIndex) {
         int examId = getSessionExamId(request);
         List<MarkGroup> groups = groupService.findByExamAndSubject(examId, subjectCode);
         if (groups != null && groups.size() > 0) {
             addMessage(redirectAttributes, "该科目已经存在分组,无法设置");
-            return "redirect:/admin/exam/paper";
+            return "redirect:/admin/exam/selectiveGroup?subjectCode=" + subjectCode;
+        }
+        selectiveGroupService.deleteByExamIdAndSubjectCodeAndSelectiveIndex(examId, subjectCode, selectiveIndex);
+        calculate(examId, subjectCode);
+        return "redirect:/admin/exam/selectiveGroup?subjectCode=" + subjectCode;
+    }
+
+    private void calculate(int examId, String subjectCode) {
+        List<SelectiveGroup> selectiveGroups = selectiveGroupService.findByExamIdAndSubjectCode(examId, subjectCode);
+        if (!selectiveGroups.isEmpty()) {
+            double totalScore = 0;
+            Map<Integer, SelectiveGroup> map = new HashMap<Integer, SelectiveGroup>();
+            for (SelectiveGroup selectiveGroup : selectiveGroups) {
+                map.put(selectiveGroup.getMainNumber(), selectiveGroup);
+            }
+            List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false);
+            for (ExamQuestion examQuestion : questions) {
+                if (map.get(examQuestion.getMainNumber()) != null) {
+                    examQuestion.setSelective(true);
+                    examQuestion.setSelectiveIndex(map.get(examQuestion.getMainNumber()).getSelectiveIndex());
+                } else {
+                    // 非选做题总分
+                    totalScore = BigDecimalUtils.add(totalScore, examQuestion.getTotalScore());
+                }
+            }
+            List<SelectiveGroup> indexGroup = selectiveGroupService
+                    .findIndexByExamIdAndSubjectCode(examId, subjectCode);
+            for (SelectiveGroup selectiveGroup : indexGroup) {
+                // 选做题分组总分
+                totalScore = BigDecimalUtils.add(totalScore, selectiveGroup.getPartScore());
+            }
+            subjectService.updateScore(examId, subjectCode, false, totalScore);
+        } else {
+            subjectService.updateScore(examId, subjectCode, false,
+                    questionService.sumTotalScore(examId, subjectCode, false));
         }
-        selectiveGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
-        subjectService.updateScore(examId, subjectCode, false,
-                questionService.sumTotalScore(examId, subjectCode, false));
-        return "redirect:/admin/exam/paper";
     }
 }

+ 6 - 11
stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java

@@ -28,13 +28,10 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import cn.com.qmth.stmms.admin.dto.MarkerDTO;
 import cn.com.qmth.stmms.admin.dto.SubjectUserDTO;
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-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.Marker;
 import cn.com.qmth.stmms.biz.exam.model.SubjectUser;
-import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
@@ -159,8 +156,7 @@ public class UserController extends BaseExamController {
                 if (user.getRole() == Role.COLLEGE_ADMIN) {
                     int examId = getSessionExamId(request);
                     subjectUserService.updateByUserId(user.getId(),
-                            getSubjectCodeSetByCollege(examId, subjectCodeString));
-                    user.setDescription(subjectCodeString);
+                            getSubjectCodeSetByCollege(examId, user.getDescription()));
                     userService.save(user);
                 }
             } else {
@@ -185,8 +181,7 @@ public class UserController extends BaseExamController {
                 if (user.getRole() == Role.COLLEGE_ADMIN) {
                     int examId = getSessionExamId(request);
                     subjectUserService.updateByUserId(user.getId(),
-                            getSubjectCodeSetByCollege(examId, subjectCodeString));
-                    user.setDescription(subjectCodeString);
+                            getSubjectCodeSetByCollege(examId, user.getDescription()));
                 }
                 previous.setUpdatedTime(new Date());
                 userService.save(previous);
@@ -214,7 +209,7 @@ public class UserController extends BaseExamController {
             message = "科组长必须绑定科目代码";
         } else if (user.getRole() == Role.INSPECTOR && StringUtils.isBlank(subjectCodeString)) {
             message = "复核员必须绑定科目代码";
-        } else if (user.getRole() == Role.COLLEGE_ADMIN && StringUtils.isBlank(subjectCodeString)) {
+        } else if (user.getRole() == Role.COLLEGE_ADMIN && StringUtils.isBlank(user.getDescription())) {
             message = "学院管理员必须绑定学院";
         }
         return message;
@@ -394,12 +389,12 @@ public class UserController extends BaseExamController {
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String batchSave(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
             @RequestParam Role role, @RequestParam String password, @RequestParam Integer number,
-            @RequestParam String[] subejctCodes) {
+            @RequestParam String subjectCodeString) {
         int examId = getSessionExamId(request);
         if (Role.MARKER.equals(role)) {
-            userService.batchSaveMarker(examId, subejctCodes, number, password);
+            userService.batchSaveMarker(examId, getSubjectCodeSet(subjectCodeString), number, password);
         } else {
-            userService.batchSaveSubjectUser(examId, role, subejctCodes, number);
+            userService.batchSaveSubjectUser(examId, role, getSubjectCodeSet(subjectCodeString), number);
         }
         return "redirect:/admin/user/list";
     }

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

@@ -63,9 +63,11 @@
 <div class="container">
     <div class="middle cl">
         <div class="left">
-            <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
+            <%-- <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div> --%>
+            <p>
             <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright&#169 2021 启明泰和 v1.3.8</p></a>
             <a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
+            </p>
         </div>
         <div class="right">
             <div class="title">

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

@@ -0,0 +1,81 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>试题列表</title>
+	<meta name="decorator" content="default"/>
+	<%@include file="/WEB-INF/views/include/head.jsp" %>
+	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+</head>
+<body>
+	<%-- <%@include file="/WEB-INF/views/include/examInfoNavTabs.jsp" %> --%>
+	<form id="inputForm" action="${ctx}/admin/exam/selectiveGroup/save" method="post" class="breadcrumb form-search">
+		<input name="subjectCode" value="${subject.code}" type="hidden"/>
+		<input name="selectiveCount" value="${selectiveCount}" type="hidden"/>
+		<input name="selectivePart" value="${selectivePart}" type="hidden"/>
+		<input name="scorePolicy" value="${scorePolicy}" type="hidden"/>
+		<div>
+			<label>科目:${subject.code}-${subject.name}</label>
+			<label>客观总分:<fmt:formatNumber pattern="###.###" value="${subject.objectiveScore}"/></label>
+			<label>主观总分:<fmt:formatNumber pattern="###.###" value="${subject.subjectiveScore}"/></label>
+			<label>试卷总分:<fmt:formatNumber pattern="###.###" value="${subject.totalScore}"/></label>
+		</div>
+		<br/>
+	<tags:message content="${message}"/>
+	<table id="contentTable" class="table table-striped table-bordered table-condensed">
+		<thead>
+			<tr>
+				<th>大题名称</th>
+				<th>大题号</th>
+				<th>满分</th>
+				<th>选做题分组</th>
+				<th>操作</th>
+			</tr>
+		</thead>
+		<tbody>
+		<c:forEach items="${questions}" var="question">
+			<tr>
+				<td>${question.mainTitle}</td>
+				<td>${question.mainNumber}</td>
+				<td><fmt:formatNumber pattern="###.###" value="${question.totalScore}"/></td>
+				<td>${question.selectiveIndex}</td>
+				<td><c:if test="${!question.selective}">
+					<input type="checkbox" name="mainNumbers" value = ${question.mainNumber }/>
+					</c:if>
+				</td>
+			</tr>
+		</c:forEach>
+		</tbody>
+	</table>
+	</form>
+<script type="text/javascript">
+$('#btnSubmit').click(function () {
+	var check_list = []
+	$("input[name='mainNumbers']:checked").each(function(){
+    	if($(this).val()!=""){
+    		check_list.push($(this).val())
+		}
+	})
+    if(check_list.length==0) {
+        alert('请选择题目');
+        return false;
+    }
+	var count = $("#selectiveCount").val();
+	if(count==null ||count==""){
+		alert("合分数量不能为空");
+		return;
+	}
+	if(!(/(^[1-9]\d*$)/.test(count))){
+		alert("合分数量必须是正整数");
+		return;
+	}
+	if(count>=check_list.length || count<1){
+		alert("合分数量必须小于选择的题目数量且大于等于1");
+		return;
+	}
+	
+   $('#inputForm').submit();
+});
+</script>	
+</body>
+</html>

+ 157 - 37
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/selectiveList.jsp

@@ -6,6 +6,79 @@
 	<meta name="decorator" content="default"/>
 	<%@include file="/WEB-INF/views/include/head.jsp" %>
 	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+	 <style type="text/css">.sort {
+        color: #0663A2;
+        cursor: pointer;
+    }</style>
+    <style type="text/css">
+        .sort {
+            color: #0663A2;
+            cursor: pointer;
+        }
+        
+        .addWindow, .editWindow {
+            width: 400px;
+            min-height: 200px;
+            background: #fff;
+            font-family: "微软雅黑", Fixedsys;
+            border: #5d6d7d solid 1px;
+            position: absolute;
+            left: 50%;
+            top: 50%;
+            margin: -150px 0 0 -200px;
+            text-align: center;
+            z-index: 99999;
+        }
+        
+        .task-header, .password-header {
+            width: 100%;
+            height: 46px;
+            background: #5d6d7d;
+            color: #fff;
+        }
+        
+        .task-content, .password-content {
+            font-size: 18px;
+            color: #005277;
+            text-align: left;
+            padding: 15px;
+            line-height: 30px;
+            word-wrap: break-word;
+        }
+        
+        .image-close {
+            margin-top: 15px;
+            margin-right: 15px;
+            cursor: pointer;
+            float: right;
+        }
+        
+        .title {
+            font-size: 22px;
+            font-weight: bold;
+            color: #fff;
+            margin: 0px;
+            padding: 13px 0 0 13px;
+            float: left;
+        }
+
+        .task-count, .password-value {
+            width: 50px;
+        }
+
+        .btn-info {
+            height: 25px;
+            margin-left: 320px;
+            margin-bottom: 20px;
+        }
+        
+        .wrong, .passwordWrong {
+            font-size: 12px;
+            color: #f00;
+            line-height: 30px;
+            padding-left: 20px;
+        }
+    </style>
 </head>
 <body>
 	<%-- <%@include file="/WEB-INF/views/include/examInfoNavTabs.jsp" %> --%>
@@ -17,14 +90,9 @@
 			<label>主观总分:<fmt:formatNumber pattern="###.###" value="${subject.subjectiveScore}"/></label>
 			<label>试卷总分:<fmt:formatNumber pattern="###.###" value="${subject.totalScore}"/></label>
 			&nbsp;		
-			<a class="btn" href="javascript:" onclick="history.go(-1);" >返回</a>
-			&nbsp;
-			<a href="${ctx}/admin/exam/selectiveGroup/clear?subjectCode=${subject.code}" class="delete-button btn">清空选做题分组设置</a>
-		</div>
-		<div>
-		<label>合分数量:</label><input name="selectiveCount" min="1" class="digits" type="number" id="selectiveCount" value="${selectiveCount }"/> 
-		<a id="btnSubmit" href="##" class="btn btn-primary">确定</a>*如选做为5选3,则合分数写3
-		
+			<input id="btnAdd" class="btn" type="button" value="新增" onclick="goAdd()"/>
+			&nbsp;		
+			<input class="btn" type="button" value="编辑" onclick="goEdit()"/>
 		</div>
 		<br/>
 	<tags:message content="${message}"/>
@@ -33,8 +101,10 @@
 			<tr>
 				<th>大题名称</th>
 				<th>大题号</th>
+				<th>小题号</th>
 				<th>满分</th>
-				<th>选择</th>
+				<th>间隔分</th>
+				<th>选做题分组</th>
 			</tr>
 		</thead>
 		<tbody>
@@ -42,45 +112,95 @@
 			<tr>
 				<td>${question.mainTitle}</td>
 				<td>${question.mainNumber}</td>
+				<td>${question.subNumber}</td>
 				<td><fmt:formatNumber pattern="###.###" value="${question.totalScore}"/></td>
-				<td><input type="checkbox" name="mainNumbers" value = ${question.mainNumber }  <c:if test="${question.selective}"> checked</c:if>/>
-				</td>
+				<td><fmt:formatNumber pattern="###.###" value="${question.intervalScore}"/></td>
+				<td>${question.selectiveIndex}</td>
+			</tr>
+		</c:forEach>
+		</tbody>
+	</table>
+	<div class="addWindow" style="display:none">
+	    <div class="task-header">
+	        <p class="title">设置选做题规则</p>
+	        <p class="image-close"><img src="${ctxStatic}/mark-new/images/images-close.png"/></p></div>
+	    <div class="task-content">选做题规则:<input type="number" id="selectivePart" name="selectivePart" class="task-count"/>选<input type="number" id="selectiveCount" name="selectiveCount" class="task-count"/><br/><br/>
+	    取分规则:<select name="scorePolicy">
+	    			<c:forEach items="${scorePolicyList}" var="item">
+                        <option value="${item.value}">${item.name}</option>
+                    </c:forEach>
+	    		</select><br/><br/>
+	    *如选做为5选3,则系统会校验后续选做题总量为5,合分数量为3。
+	    <i class="wrong">
+	    </i></div>
+	    <a href="#" class="btn btn-small btn-info task-btn">下一步</a>
+	</div>
+	<div class="editWindow" style="display:none">
+	    <div class="task-header">
+	        <p class="title">编辑选做题组</p>
+	        <p class="image-close"><img src="${ctxStatic}/mark-new/images/images-close.png"/></p></div>
+	    <div class="task-content">
+	    	<table id="contentTable" class="table table-striped table-bordered table-condensed">
+		<thead>
+			<tr>
+				<th>选做题组</th>
+				<th>规则</th>
+				<th>大题名称</th>
+				<th>分值</th>
+				<th>操作</th>
+			</tr>
+		</thead>
+		<tbody>
+		<c:forEach items="${list}" var="group">
+			<tr>
+				<td>${group.selectiveIndex}</td>
+				<td>${group.selectivePart}选${group.selectiveCount}</td>
+				<td>${group.title}</td>
+				<td><fmt:formatNumber pattern="###.###" value="${group.partScore}"/></td>
+				<td><a href="${ctx}/admin/exam/selectiveGroup/delete?subjectCode=${subject.code}&selectiveIndex=${group.selectiveIndex}">删除</a></td>
 			</tr>
 		</c:forEach>
 		</tbody>
 	</table>
+	    </div>
+	</div>
 	</form>
 <script type="text/javascript">
-$('#btnSubmit').click(function () {
-	var check_list = []
-	$("input[name='mainNumbers']:checked").each(function(){
-    	if($(this).val()!=""){
-    		check_list.push($(this).val())
-		}
-	})
-    if(check_list.length==0) {
-        alert('请选择题目');
+function goAdd() {
+	$('.addWindow').show();
+}
+function goEdit() {
+	$('.editWindow').show();
+}
+$('.image-close').click(function () {
+    $('.addWindow').hide();
+    $('.editWindow').hide();
+});
+$('.task-btn').click(function () {
+    var selectivePart = $('#selectivePart').val();
+    var selectiveCount = $('#selectiveCount').val();
+    var wrongMessage = $('.wrong');
+    selectivePart = selectivePart.replace(/(^\s*)|(\s*$)/g, "");
+    selectiveCount = selectiveCount.replace(/(^\s*)|(\s*$)/g, "");
+    if (selectivePart.length == 0 ||selectiveCount.length==0) {
+        wrongMessage.html('规则不能为空!');
         return false;
+    } else {
+        if (!/^\+?[1-9][0-9]*$/.test(selectivePart) || !/^\+?[1-9][0-9]*$/.test(selectiveCount)) {
+            wrongMessage.html('请输入正整数!');
+            return false;
+        }
+        if (selectivePart > 100 ||selectiveCount > 100) {
+            wrongMessage.html('数量不合法!');
+            return false;
+        }
+        if (selectivePart <= selectiveCount || selectiveCount<1) {
+            wrongMessage.html('合分数量必须小于选择数量且大于等于1');
+            return false;
+        }
     }
-	var count = $("#selectiveCount").val();
-	if(count==null ||count==""){
-		alert("合分数量不能为空");
-		return;
-	}
-	if(!(/(^[1-9]\d*$)/.test(count))){
-		alert("合分数量必须是正整数");
-		return;
-	}
-	if(count>=check_list.length || count<1){
-		alert("合分数量必须小于选择的题目数量且大于等于1");
-		return;
-	}
-	
    $('#inputForm').submit();
 });
-$('.delete-button').click(function () {
-    return confirm('确定要清空吗?');
-});
 </script>	
 </body>
 </html>

+ 39 - 165
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/subjectSelect.jsp

@@ -2,7 +2,7 @@
 <%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-    <title>试卷管理</title>
+    <title>科目选择</title>
     <meta name="decorator" content="default"/>
     <%@include file="/WEB-INF/views/include/head.jsp" %>
     <style type="text/css">.sort {
@@ -11,37 +11,8 @@
     }</style>
 </head>
 <body>
-<div id="objImportBox" class="hide">
-    <form id="objImportForm" action="${ctx}/admin/exam/paper/import" method="post" enctype="multipart/form-data"
-          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-        <input name="objective" type="hidden" value="true"/>
-        <input name="file" type="file" style="width:330px"/><br/><br/>  
-        <input class="btn btn-primary" type="submit" value="导入" onclick="goObjImport()"/>
-        <a href="${ctx}/admin/exam/paper/template?objective=true">下载模板</a>
-    </form>
-</div>
-<div id="subImportBox" class="hide">
-    <form id="subImportForm" action="${ctx}/admin/exam/paper/import" method="post" enctype="multipart/form-data"
-          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-        <input name="objective" type="hidden" value="false"/>
-        <input name="file" type="file" style="width:330px"/><br/><br/>  
-        <input class="btn btn-primary" type="submit" value="导入" onclick="goSubImport()"/>
-        <a href="${ctx}/admin/exam/paper/template?objective=false">下载模板</a>
-    </form>
-</div>
-<div id="groupImportBox" class="hide">
-    <form id="subImportForm" action="${ctx}/admin/exam/paper/importGroup" method="post" enctype="multipart/form-data"
-          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-        <input name="objective" type="hidden" value="false"/>
-        <input name="file" type="file" style="width:330px"/><br/><br/>  
-        <input class="btn btn-primary" type="submit" value="导入" onclick="goGroupImport()"/>
-        <a href="${ctx}/admin/exam/paper/template?objective=false">下载模板</a>
-    </form>
-</div>
 <%-- <%@include file="/WEB-INF/views/include/examInfoNavTabs.jsp" %> --%>
-<form id="searchForm" action="${ctx}/admin/exam/paper" method="post" class="breadcrumb form-search">
-    <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
-    <input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
+<form id="searchForm" action="${ctx}/admin/user/getSubjectCode" method="post" class="breadcrumb form-search">
     <div>
         <label>科目</label>
         <select class="input-large" name="code" id="subject-select">
@@ -50,171 +21,74 @@
                 <option value="${subject.code}" data-level="${subject.level}" <c:if test="${subject.code==query.code}">selected</c:if>>${subject.code}-${subject.name}</option>
             </c:forEach>
         </select>
-        <label>层次</label>
-        <select class="input-small" name="level" id="level-select">
-            <option value="">请选择</option>
-            <c:forEach items="${levelList}" var="level">
-                <option value="${level}" data-level="${level}" <c:if test="${level==query.level}">selected</c:if>>${level}</option>
-            </c:forEach>
-        </select>
-        <label>专业类型</label>
-        <select class="input-small" name="category" id="category-select">
-            <option value="">请选择</option>
-            <c:forEach items="${categoryList}" var="category">
-                <option value="${category}" <c:if test="${category==query.category}">selected</c:if>>${category}</option>
-            </c:forEach>
-        </select>
-        &nbsp;
-        <label>状态</label>
-        <select class="input-small" name="upload">
-            <option value="">不限</option>
-            <option value="1" <c:if test="${upload!=null && upload==true}">selected</c:if>>已扫描</option>
-            <option value="0" <c:if test="${upload!=null && upload==false}">selected</c:if>>未扫描</option>
-        </select>
-        &nbsp;
-        <label>总分不等于</label>
-        <input type="number" name="totalScoreNotEqual" value="${query.totalScoreNotEqual}" maxlength="10" class="input-mini"/>
-        <br/><br/>
         &nbsp;
         <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-        <c:if test="${web_user.schoolAdmin==true}">
-            &nbsp;
-            <div class="btn-group">
-                <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
-                    导入<span class="caret"></span>
-                </a>
-                <ul class="dropdown-menu">
-                    <li><a href="##" id="obj-import">客观题</a></li>
-                    <li><a href="##" id="sub-import">主观题结构</a></li>
-                    <li><a href="##" id="group-import">主观题分组</a></li>
-                </ul>
-            </div>
-        </c:if>
-        &nbsp;
-        <div class="btn-group">
-            <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
-                导出<span class="caret"></span>
-            </a>
-            <ul class="dropdown-menu">
-                <li><a href="${ctx}/admin/exam/paper/export?objective=true">客观题</a></li>
-                <li><a href="${ctx}/admin/exam/paper/export?objective=false">主观题</a></li>
-            </ul>
-        </div>
-        <c:if test="${!examLock}">
-            &nbsp;
-            <a href="${ctx}/admin/exam/paper/calculate" class="btn">客观题统分</a>
-            &nbsp;
-            <a href="${ctx}/admin/exam/paper/report" class="btn">分析计算</a>
-        </c:if>
-        <c:if test="${examLock}"
-        >&nbsp;
-            <a href="#" class="btn" disabled="disabled">正在计算</a>
-        </c:if>
+         &nbsp;
+        <input id="btnCheck" class="btn btn-primary" type="button" value="选中" onclick="goCheck()"/>
     </div>
 </form>
 <tags:message content="${message}"/>
 <table id="contentTable" class="table table-striped table-bordered table-condensed">
     <thead>
     <tr>
-        <th>科目名称</th>
-        <th>层次</th>
-        <th>专业类型</th>
-        <th>试卷</th>
-        <th>答案</th>
-        <th>试卷类型</th>
-        <th>卡格式</th>
+        <th><input type="checkbox" id="codes" checked="checked">科目名称</th>
         <th>客观总分</th>
         <th>主观总分</th>
         <th>试卷总分</th>
         <th>状态</th>
-        <th>操作</th>
     </tr>
     </thead>
     <tbody>
-    <c:forEach items="${query.result}" var="subject">
+    <c:forEach items="${list}" var="subject">
         <tr>
             <td>
-                <a href="${ctx}/admin/exam/paper/detail?subjectCode=${subject.code}&pageNumber=${query.pageNumber}&code=${query.code }&category=${ query.category}&level=${query.level }&upload=${ upload}&totalScoreNotEqual=${  query.totalScoreNotEqual}"">
-                ${subject.code}-${subject.name}&nbsp;${subject.remark}</a>
-            </td>
-            <td>${subject.level}</td>
-            <td>${subject.category}</td>
-            <td>
-                <c:if test="${subject.paperUrl != null && examType!='MULTI_MEDIA'}">
-                    <a href="${fileServer}${subject.paperUrl}" target="_blank">已上传</a>
-                </c:if>
-            </td>
-            <td>
-                <c:if test="${subject.answerUrl != null && examType!='MULTI_MEDIA'}">
-                    <a href="${fileServer}${subject.answerUrl}" target="_blank">已上传</a>
-                </c:if>
-            </td>
-            <td>
-                ${subject.paperType}
-            </td>
-            <td>
-                <c:if test="${subject.cardType == 'JSON'}">电子题卡</c:if>
-                <c:if test="${subject.cardType == 'ZIP'}">扫描题卡</c:if>
+            	<input type="checkbox" class="codes" name="codes" value="${subject.code}" checked="checked">
+                ${subject.code}-${subject.name}&nbsp;${subject.remark}
             </td>
             <td><fmt:formatNumber pattern="###.###" value="${subject.objectiveScore}"/></td>
             <td><fmt:formatNumber pattern="###.###" value="${subject.subjectiveScore}"/></td>
             <td><fmt:formatNumber pattern="###.###" value="${subject.totalScore}"/></td>
-            <td>
-                <c:if test="${examLock || subject.locked}">正在计算</c:if>
-                <c:if test="${!examLock && !subject.locked}">正常</c:if>
-            </td>
-            <td>
-                <c:if test="${!examLock && !subject.locked}">
-                    <a href="${ctx}/admin/exam/subject/edit?code=${subject.code}">编辑</a>
-                    <a href="${ctx}/admin/exam/paper/report?subjectCode=${subject.code}">分析计算</a>
-                </c:if>
-                <a href="${ctx}/admin/exam/selectiveGroup?subjectCode=${subject.code}">设置选做题</a>
+            <td>正常
             </td>
         </tr>
     </c:forEach>
     </tbody>
 </table>
-<div class="pagination">${query}</div>
 <script type="text/javascript">
-    function page(n, s) {
-        $("#pageNumber").val(n);
-        $("#pageSize").val(s);
-        $("#searchForm").submit();
-        return false;
+$("#codes").change(function () {
+    if ($("#codes").is(':checked')) {
+        $(".codes").attr("checked", true);
+    } else {
+    	$(".codes").attr("checked", false);
     }
+});
 
-    function goSearch() {
-        $("#pageNumber").val(1);
-        $("#pageSize").val('${query.pageSize}');
-        $("#searchForm").submit();
+$(".codes").change(function () {
+	var all = true;
+	$("input[name='codes']").each(function(){
+		if(!$(this).is(':checked')){
+			all = false;
+		}
+	})
+	 $("#codes").attr("checked", all);
+});
+function goCheck() {
+	var check_list = []
+	$("input[name='codes']:checked").each(function(){
+		check_list.push($(this).val())
+	})
+    if(check_list.length==0) {
+        alert('请选择');
         return false;
     }
-
-    $("#obj-import").click(function () {
-        $.jBox($("#objImportBox").html(), {
-            title: "导入客观题", buttons: {"关闭": true},
-            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
-        });
-    });
-    $("#sub-import").click(function () {
-        $.jBox($("#subImportBox").html(), {
-            title: "导入主观题结构", buttons: {"关闭": true},
-            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
-        });
-    });
-    $("#group-import").click(function () {
-        $.jBox($("#groupImportBox").html(), {
-            title: "导入主观题分组", buttons: {"关闭": true},
-            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
-        });
-    });
-    function goObjImport() {
-        alert("导入后请务必重新统分");
-    };
-
-    function goSubImport() {
-        alert("导入后请务必重新统分");
-    };
+	if (window.opener && !window.opener.closed) {
+		var result = check_list.join(",");
+        window.opener.document.getElementById("subjectCodeString").value = result;
+        window.opener.document.getElementById("configuration").innerText = "设置成功";
+        window.close();
+    }
+    return false;
+}
 </script>
 </body>
 </html>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/reset.jsp

@@ -67,7 +67,7 @@
 <div class="container">
     <div class="middle cl">
         <div class="left">
-            <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
+            <%-- <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div> --%>
             <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright &#169 2021 启明泰和 v1.3.8</p></a>
         </div>
         <div class="right">

+ 3 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/subjectSelect.jsp

@@ -100,9 +100,11 @@
 <div class="container">
     <div class="middle cl">
         <div class="left">
-            <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
+            <%-- <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div> --%>
+            <p>
             <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright&#169 2021 启明泰和 v1.3.8</p></a>
             <a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
+            </p>
         </div>
         <div class="right">
             <div class="title">

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

@@ -67,8 +67,11 @@
 <div class="container">
     <div class="middle cl">
         <div class="left">
-            <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
-            <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright &#169 2021 启明泰和 v1.3.8</p></a>
+            <%-- <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div> --%>
+            <p>
+            <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright&#169 2021 启明泰和 v1.3.8</p></a>
+            <a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
+            </p>
         </div>
         <div class="right">
             <div class="title">

+ 5 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/user/userAdd.jsp

@@ -89,9 +89,12 @@
         </div>
     </div>
 	<div class="control-group" id="subject-code-div">
-          <input name="subjectCode" id="subjectCode" type="hidden"/>
-                    <a href="${ctx}/admin/user/getSubjectCode?examId=${exam.id}" target="_blank" class="required"
+		<label class="control-label">选择科目</label>
+		<div class="controls">
+          <input name="subjectCodeString" id="subjectCodeString" type="hidden"/>
+                    <a href="${ctx}/admin/user/getSubjectCode" target="_blank" class="required"
                        id="configuration" rel="opener">设置</a>
+        </div>
 	 </div>
     <div class="form-actions">
         <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>

+ 3 - 3
stmms-web/src/main/webapp/WEB-INF/views/modules/user/userEdit.jsp

@@ -100,12 +100,12 @@
             </div>
         </div>
     </c:if>
-    <c:if test="${user.role.value==10}">
+    <c:if test="${user.role==null || user.role.value==10}">
         <div class="control-group" id="college-div">
             <label class="control-label">绑定学院</label>
             <div class="controls">
-            <textarea name="subjectCodeString" rows="4" maxlength="200" class="input-xxlarge"
-                      >${subjectCodeString}</textarea>
+            <textarea name="description" rows="4" maxlength="200" class="input-xxlarge"
+                      >${user.description}</textarea>
             </div>
         </div>
      </c:if>