Browse Source

重构统分

yin 10 months ago
parent
commit
a208e558fe

+ 2 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/SelectiveGroupDao.java

@@ -29,5 +29,6 @@ public interface SelectiveGroupDao extends PagingAndSortingRepository<SelectiveG
     @Modifying(clearAutomatically = true)
     @Query("update SelectiveGroup q set q.scorePolicy=?4 where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.selectiveIndex=?3 ")
     void updateScorePolicy(int examId, String subjectCode, Integer selectiveIndex, ScorePolicy scorePolicy);
-
+    @Query("select distinct(q.pk.mainNumber) from SelectiveGroup q where q.pk.examId=?1 and q.pk.subjectCode=?2 and q.pk.mainNumber in (select e.mainNumber from ExamQuestion e where e.examId=?1 and e.subjectCode=?2 and e.groupNumber=?3 )order by q.pk.mainNumber")
+    List<Integer> findByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
 }

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

@@ -30,4 +30,5 @@ public interface SelectiveGroupService {
 
     double sumScoreByExamIdAndSubjectCode(int examId, String subjectCode);
 
+    List<Integer> findByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
 }

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

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -110,15 +111,7 @@ public class SelectiveGroupServiceImpl extends BaseQueryService<SelectiveGroup>
     @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);
-        }
+        Map<Integer, List<SelectiveGroup>> map = list.stream().collect(Collectors.groupingBy(SelectiveGroup::getSelectiveIndex));
         return map;
     }
 
@@ -175,4 +168,9 @@ public class SelectiveGroupServiceImpl extends BaseQueryService<SelectiveGroup>
         }
         return totalScore;
     }
+
+    @Override
+    public List<Integer> findByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber) {
+        return this.selectiveGroupDao.findByExamIdAndSubjectCodeAndGroupNumber(examId,subjectCode,groupNumber);
+    }
 }

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

@@ -66,8 +66,6 @@ public class MarkResult {
      */
     private Integer problemTypeId;
 
-    private boolean unselective;
-
     public String getStatusValue() {
         return statusValue;
     }
@@ -258,12 +256,4 @@ public class MarkResult {
         this.problemTypeId = problemTypeId;
     }
 
-    public boolean isUnselective() {
-        return unselective;
-    }
-
-    public void setUnselective(boolean unselective) {
-        this.unselective = unselective;
-    }
-
 }

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

@@ -34,6 +34,8 @@ public class MarkStepDTO implements Serializable {
 
     private boolean rejected;
 
+    private boolean isSelective;
+
     private List<TrackDTO> trackList = new ArrayList<TrackDTO>();
 
     private List<TrackDTO> headerTrack = new ArrayList<TrackDTO>();
@@ -166,4 +168,11 @@ public class MarkStepDTO implements Serializable {
         this.headerTrack.add(trackDTO);
     }
 
+    public boolean isSelective() {
+        return isSelective;
+    }
+
+    public void setSelective(boolean selective) {
+        isSelective = selective;
+    }
 }

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

@@ -578,7 +578,7 @@ public class MarkServiceImpl implements MarkService {
                     }
                 }
             }
-        } else if (group.getStatus() == MarkStatus.TRIAL ) {
+        } else if (group.getStatus() == MarkStatus.TRIAL) {
             TrialLibrary library = trialLibraryDao.findOne(result.getLibraryId());
             if (library != null && library.getExamId().equals(group.getExamId())
                     && library.getSubjectCode().equals(group.getSubjectCode())
@@ -590,22 +590,15 @@ public class MarkServiceImpl implements MarkService {
                 }
                 library.setMarkerId(marker.getId());
                 library.setMarkerTime(now);
-                // 未选做
-                if (result.isUnselective() && group.isSelective()) {
-                    result.setMarkerScore(UN_SELECTIVE_SCORE);
-                    result.setScoreList(new Double[0]);
-                    trialTrackDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
-                    trialTagDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
-                }
                 library.setMarkerScore(result.getMarkerScore());
                 library.setMarkerScoreList(result.getScoreList());
-                if (result.getTrackList() != null && !result.isUnselective()) {
-                    trialTrackDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
+                trialTrackDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
+                if (result.getTrackList() != null) {
                     trialTrackDao.save(result.getTrackList(library));
                 }
                 library = trialLibraryDao.save(library);
-                if (result.getSpecialTagList() != null && !result.isUnselective()) {
-                    trialTagDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
+                trialTagDao.deleteByLibraryIdAndMarkerId(library.getId(), library.getMarkerId());
+                if (result.getSpecialTagList() != null) {
                     trialTagDao.save(result.getTagList(library));
                 }
                 if (!TrialMode.EXCLUSIVE.equals(systemCache.getTrialMode())) {
@@ -667,12 +660,12 @@ public class MarkServiceImpl implements MarkService {
             return false;
         }
         // 未选做
-        if (result.isUnselective() && group.isSelective()) {
-            result.setMarkerScore(UN_SELECTIVE_SCORE);
-            result.setScoreList(new Double[0]);
-            trackDao.deleteByLibraryId(library.getId());
-            specialTagDao.deleteByLibraryId(library.getId());
-        }
+        // if (result.isUnselective() && group.isSelective()) {
+        // result.setMarkerScore(UN_SELECTIVE_SCORE);
+        // result.setScoreList(new Double[0]);
+        // trackDao.deleteByLibraryId(library.getId());
+        // specialTagDao.deleteByLibraryId(library.getId());
+        // }
         // 尝试提交评卷结果
         Date now = new Date();
         if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.MARKED, marker.getId(),
@@ -685,10 +678,9 @@ public class MarkServiceImpl implements MarkService {
         inspectedService.cancelByStudent(library.getStudentId());
         // 保存阅卷轨迹
         int unansweredCount = 0;
-        if (result.getTrackList() != null && !result.isUnselective()) {
-            // trackDao.deleteByLibraryId(library.getId());
-            List<MarkTrack> oldTracks = trackDao.findByPkLibraryId(library.getId());
-            trackDao.delete(oldTracks);
+        List<MarkTrack> oldTracks = trackDao.findByPkLibraryId(library.getId());
+        trackDao.delete(oldTracks);
+        if (result.getTrackList() != null) {
             List<MarkTrack> tracks = result.getTrackList(library, marker);
             for (MarkTrack markTrack : tracks) {
                 trackDao.saveAndFlush(markTrack);
@@ -699,8 +691,8 @@ public class MarkServiceImpl implements MarkService {
             libraryDao.updateUnansweredCount(library.getId(), unansweredCount);
         }
         // 保存特殊标记
-        if (result.getSpecialTagList() != null && !result.isUnselective()) {
-            specialTagDao.deleteByLibraryId(library.getId());
+        specialTagDao.deleteByLibraryId(library.getId());
+        if (result.getSpecialTagList() != null) {
             specialTagDao.save(result.getSpecialTagList(library, marker));
         }
         // 判断多评模式下是否需要仲裁
@@ -774,7 +766,9 @@ public class MarkServiceImpl implements MarkService {
             if (questionList.size() == list1.size() && list1.size() == list2.length) {
                 for (int i = 0; i < questionList.size(); i++) {
                     Double arbitrateThreshold = questionList.get(i).getArbitrateThreshold();
-                    if (Math.abs(list1.get(i).getScore() - list2[i]) > arbitrateThreshold) {
+                    if ((list1.get(i).getScore() == UN_SELECTIVE_SCORE && list2[i] != UN_SELECTIVE_SCORE)
+                            || (list1.get(i).getScore() != UN_SELECTIVE_SCORE && list2[i] == UN_SELECTIVE_SCORE)
+                            || (Math.abs(list1.get(i).getScore() - list2[i]) > arbitrateThreshold)) {
                         if (arbitrateIndex == null) {
                             arbitrateIndex = new ArrayList<>();
                         }
@@ -939,30 +933,27 @@ public class MarkServiceImpl implements MarkService {
     }
 
     /**
-     * 管理员/组长处理仲裁卷
-     *
-     * - 仲裁卷
+     * 管理员/组长处理仲裁卷 - 仲裁卷
      */
     @Override
     @Transactional
     public void processArbitrate(MarkResult result, Integer userId) {
         ArbitrateHistory history = arbitrateDao.findOne(result.getLibraryId());
-        MarkGroup group = groupDao.findOne(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
         List<Double> markerScoreList = new ArrayList<>(Arrays.asList(result.getMarkerScoreList()));
         List<Integer> questionIndexList = history.getQuestionIndexList();
         if (!questionIndexList.isEmpty() && markerScoreList.size() != questionIndexList.size()) {
             return;
         }
         history.setUserId(userId);
-        history.setTotalScore(result.isUnselective() ? UN_SELECTIVE_SCORE : result.getMarkerScore());
-        history.setScoreList(result.isUnselective() ? null : result.getScoreList());
+        history.setTotalScore(result.getMarkerScore());
+        history.setScoreList(result.getScoreList());
         history.setStatus(HistoryStatus.MARKED);
         history.setUpdateTime(new Date());
         if (arbitrateDao.exists(history.getId())) {
             // 保存阅卷轨迹
             int unansweredCount = 0;
-            if (result.getTrackList() != null && !result.isUnselective()) {
-                headerTrackDao.deleteByPkStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
+            headerTrackDao.deleteByPkStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
+            if (result.getTrackList() != null) {
                 List<HeaderTrack> tracks = result.getTrackList(history);
                 for (HeaderTrack t : tracks) {
                     headerTrackDao.saveAndFlush(t);
@@ -973,8 +964,8 @@ public class MarkServiceImpl implements MarkService {
                 history.setUnansweredCount(unansweredCount);
             }
             // 保存特殊标记
-            if (result.getSpecialTagList() != null && !result.isUnselective()) {
-                headerTagDao.deleteByStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
+            headerTagDao.deleteByStudentIdAndGroupNumber(history.getStudentId(), history.getGroupNumber());
+            if (result.getSpecialTagList() != null) {
                 headerTagDao.save(result.getHeaderTagList(history));
             }
             List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
@@ -1086,44 +1077,31 @@ public class MarkServiceImpl implements MarkService {
         boolean notSelective = false;
         Map<Integer, List<SelectiveGroup>> indexMap = selectiveGroupService.findGroupByExamIdAndSubjectCode(examId,
                 subjectCode);
-        for (Integer index : indexMap.keySet()) {
+        for (List<SelectiveGroup> indexGroup : indexMap.values()) {
             // 循环选做题组
-            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();
-                }
-            }
+            Integer selectiveCount = indexGroup.get(0).getSelectiveCount();
+            ScorePolicy policy = indexGroup.get(0).getScorePolicy();
+            Map<Integer, List<SelectiveGroup>> partMap = indexGroup.stream()
+                    .collect(Collectors.groupingBy(SelectiveGroup::getSelectivePart));
             List<Double> partScoreList = new ArrayList<Double>();
             Map<Integer, Double> partScoreMap = new HashMap<Integer, Double>();
+
             // 循环选做分区
             for (Integer part : partMap.keySet()) {
                 List<SelectiveGroup> partList = partMap.get(part);
                 BigDecimal partScore = BigDecimal.ZERO;
-                boolean unselectivePart = false;
+                boolean unSelectivePart = false;
                 for (SelectiveGroup selectiveGroup : partList) {
                     double mainScore = scoreMap.get(selectiveGroup.getMainNumber());
                     scoreMap.remove(selectiveGroup.getMainNumber());
-                    if (mainScore == UN_SELECTIVE_SCORE || unselectivePart) {
-                        unselectivePart = true;
+                    if (mainScore == UN_SELECTIVE_SCORE || unSelectivePart) {
+                        unSelectivePart = true;
                     } else {
                         partScore = partScore.add(BigDecimal.valueOf(mainScore));
                     }
                 }
                 // 当前part未选做
-                if (unselectivePart) {
+                if (unSelectivePart) {
                     for (SelectiveGroup selectiveGroup : partList) {
                         List<SubjectiveScore> mainScoreList = mainScoreMap.get(selectiveGroup.getMainNumber());
                         for (SubjectiveScore ss : mainScoreList) {
@@ -1138,6 +1116,8 @@ public class MarkServiceImpl implements MarkService {
             Collections.sort(partScoreList);
             if (policy == null || ScorePolicy.MAX.equals(policy)) {
                 Collections.reverse(partScoreList);
+            } else if (ScorePolicy.MIN_WITHOUT_ZERO.equals(policy)) {
+                partScoreList = partScoreList.stream().filter(s -> s.doubleValue() > 0).collect(Collectors.toList());
             }
             // 计算一个选做题分组得分
             for (int i = 0; i < partScoreList.size(); i++) {
@@ -1175,8 +1155,7 @@ public class MarkServiceImpl implements MarkService {
             }
         }
         // 统一更新得分详情
-        for (Integer mainNumber : mainScoreMap.keySet()) {
-            List<SubjectiveScore> mainScoreList = mainScoreMap.get(mainNumber);
+        for (List<SubjectiveScore> mainScoreList : mainScoreMap.values()) {
             for (SubjectiveScore ss : mainScoreList) {
                 scoreDao.saveAndFlush(ss);
             }
@@ -1702,15 +1681,14 @@ public class MarkServiceImpl implements MarkService {
             ss.setGroupScore(score);
             ss.setMainNumber(question.getMainNumber());
             ss.setSubNumber(question.getSubNumber());
-            if (score != UN_SELECTIVE_SCORE) {
-                ScoreItem item = scoreList.get(i);
-                ss.setScore(item.getScore());
-                ss.setMainScore(0.0);
-                ss.setUncalculate(false);
-            } else {
-                ss.setScore(score);
-                ss.setMainScore(score);
+
+            ScoreItem item = scoreList.get(i);
+            ss.setScore(item.getScore());
+            ss.setMainScore(0.0);
+            if (item.getScore() == UN_SELECTIVE_SCORE) {
                 ss.setUncalculate(true);
+            } else {
+                ss.setUncalculate(false);
             }
             if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
                 ss.setUnansweredCount(headerTrackDao.countByStudentIdAndQuestionNumberAndUnanswered(studentId,
@@ -1881,8 +1859,8 @@ public class MarkServiceImpl implements MarkService {
         }
         int examId = list.get(0).getExamId();
         String subjectCode = list.get(0).getSubjectCode();
-        Boolean containObjective = false;
-        Boolean containSubjective = false;
+        boolean containObjective = false;
+        boolean containSubjective = false;
         for (ExamQuestion question : list) {
             SelectiveGroup selectiveGroup = selectiveGroupService.findOne(question.getExamId(),
                     question.getSubjectCode(), question.getMainNumber());

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

@@ -122,8 +122,13 @@ public class TaskServiceImpl implements TaskService {
             sItems = history.getScoreItemList();
         }
         ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
+        List<Integer> selectiveMainNumbers = selectiveGroupService.findByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                group.getSubjectCode(),group.getNumber());
         for (int i = 0; i < sList.size(); i++) {
             ExamQuestion question = sList.get(i);
+            if (selectiveMainNumbers.contains(question.getMainNumber())) {
+                question.setSelective(true);
+            }
             MarkStepDTO step = buildStep(question, subject.getDisplayQuestionName());
             if (history != null) {
                 if (!sItems.isEmpty() && sItems.size() == sList.size()) {
@@ -134,9 +139,9 @@ public class TaskServiceImpl implements TaskService {
                     sItems.remove(0);
                 }
                 // 未选做
-                if (history.getTotalScore() != null && history.getTotalScore() == UN_SELECTIVE_SCORE) {
-                    step.setScore(UN_SELECTIVE_SCORE);
-                }
+//                if (history.getTotalScore() != null && history.getTotalScore() == UN_SELECTIVE_SCORE) {
+//                    step.setScore(UN_SELECTIVE_SCORE);
+//                }
                 // 增加阅卷轨迹列表获取
                 String questionNumber = question.getQuestionNumber();
                 for (HeaderTrack track : tracks) {
@@ -248,8 +253,13 @@ public class TaskServiceImpl implements TaskService {
             rItems = rejectHistory.getRejectScoreItems();
         }
         ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
+        List<Integer> selectiveMainNumbers = selectiveGroupService.findByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                group.getSubjectCode(),group.getNumber());
         for (int i = 0; i < sList.size(); i++) {
             ExamQuestion question = sList.get(i);
+            if (selectiveMainNumbers.contains(question.getMainNumber())) {
+                question.setSelective(true);
+            }
             MarkStepDTO step = buildStep(question, subject.getDisplayQuestionName());
             if (library != null) {
                 if (!sItems.isEmpty() && sItems.size() == sList.size()) {
@@ -266,9 +276,9 @@ public class TaskServiceImpl implements TaskService {
                     step.setRejected(rItems.get(i).getScore() == null);
                 }
                 // 未选做
-                if (library.getMarkerScore() != null && library.getMarkerScore() == UN_SELECTIVE_SCORE) {
-                    step.setScore(UN_SELECTIVE_SCORE);
-                }
+//                if (library.getMarkerScore() != null && library.getMarkerScore() == UN_SELECTIVE_SCORE) {
+//                    step.setScore(UN_SELECTIVE_SCORE);
+//                }
                 // 增加阅卷轨迹列表获取
                 String questionNumber = question.getQuestionNumber();
                 for (MarkTrack track : tracks) {
@@ -293,15 +303,20 @@ public class TaskServiceImpl implements TaskService {
             sItems = library.getScoreList();
         }
         ExamSubject subject = subjectService.find(group.getExamId(), group.getSubjectCode());
+        List<Integer> selectiveMainNumbers = selectiveGroupService.findByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(),
+                group.getSubjectCode(),group.getNumber());
         for (int i = 0; i < sList.size(); i++) {
             ExamQuestion question = sList.get(i);
+            if (selectiveMainNumbers.contains(question.getMainNumber())) {
+                question.setSelective(true);
+            }
             MarkStepDTO step = buildStep(question, subject.getDisplayQuestionName());
             if (!sItems.isEmpty() && sItems.size() == sList.size()) {
                 step.setScore(sItems.get(i).getScore());
             }
-            if (library.getMarkerScore() != null && library.getMarkerScore() == UN_SELECTIVE_SCORE) {
-                step.setScore(UN_SELECTIVE_SCORE);
-            }
+//            if (library.getMarkerScore() != null && library.getMarkerScore() == UN_SELECTIVE_SCORE) {
+//                step.setScore(UN_SELECTIVE_SCORE);
+//            }
             // 增加阅卷轨迹列表获取
             String questionNumber = question.getQuestionNumber();
             for (TrialTrack track : tracks) {
@@ -329,6 +344,7 @@ public class TaskServiceImpl implements TaskService {
         step.setIntervalScore(question.getIntervalScore());
         step.setUncalculate(false);
         step.setSelectiveIndex(question.getSelectiveIndex());
+        step.setSelective(question.isSelective());
         return step;
     }
 
@@ -459,6 +475,7 @@ public class TaskServiceImpl implements TaskService {
             String questionNumber = question.getQuestionNumber();
             if (map.containsKey(question.getMainNumber())) {
                 question.setSelectiveIndex(map.get(question.getMainNumber()).getSelectiveIndex());
+                question.setSelective(true);
             }
             MarkStepDTO step = buildStep(question, subject.getDisplayQuestionName());
             if (!scoreList.isEmpty() && scoreList.size() == sList.size()) {

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

@@ -398,8 +398,6 @@ public class PaperController extends BaseExamController {
         if (error.isEmpty()) {
             int success = 0;
             for (SubjectQuestionDTO dto : map.values()) {
-                // 每次导入都需要重新统分
-                examService.updateObjectiveStatus(examId, ObjectiveStatus.WAITING);
                 ExamSubject subject = subjectService.find(examId, dto.getSubjectCode());
                 if (subject != null) {
                     // 验证是否存在分组
@@ -408,10 +406,10 @@ public class PaperController extends BaseExamController {
                         error.add("[" + subject.getCode() + "] 已存在分组");
                         continue;
                     }
-                    if (subject.isSelective()) {
-                        error.add("[" + subject.getCode() + "] 已存在选做题分组");
-                        continue;
-                    }
+//                    if (subject.isSelective()) {
+//                        error.add("[" + subject.getCode() + "] 已存在选做题分组");
+//                        continue;
+//                    }
                     Map<Integer, String> titleMap = new HashMap<>();
                     List<ExamQuestion> current = questionService.findByExamAndSubjectAndObjective(examId,
                             subject.getCode(), false);
@@ -448,10 +446,21 @@ public class PaperController extends BaseExamController {
                                 if (questionService.countByExamAndSubjectAndObjectiveAndGroupNumber(examId,
                                         group.getSubjectCode(), false, group.getNumber()) != 0) {
                                     BigDecimal totalScore = BigDecimal.ZERO;
+                                    List<SelectiveGroup> selectiveGroups = selectiveGroupService.findByExamIdAndSubjectCode(examId,
+                                            group.getSubjectCode());
+                                    Map<Integer, SelectiveGroup> selectiveMap = new HashMap<Integer, SelectiveGroup>();
+                                    for (SelectiveGroup selectiveGroup : selectiveGroups) {
+                                        selectiveMap.put(selectiveGroup.getMainNumber(), selectiveGroup);
+                                    }
+                                    boolean selective = false;
                                     for (ExamQuestion q : questionGroup) {
                                         totalScore = totalScore.add(BigDecimal.valueOf(q.getTotalScore()));
+                                        if(selectiveMap.containsKey(q.getMainNumber())){
+                                            selective =true;
+                                        }
                                     }
                                     group.setTotalScore(totalScore.doubleValue());
+                                    group.setSelective(selective);
                                     groupService.save(group);
                                     studentService.updateSubjectiveStatusAndScore(examId, group.getSubjectCode(),
                                             SubjectiveStatus.UNMARK, 0, null);

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

@@ -144,7 +144,7 @@ public class MarkController extends BaseController {
     @Value("${marker.secretNumber.hide}")
     private boolean secretNumberHide;
 
-    private static final String DEFALT_SECRET_NUMBER = "***";
+    private static final String DEFAULT_SECRET_NUMBER = "***";
 
     @RequestMapping(value = "/reset", method = RequestMethod.GET)
     public ModelAndView reset(HttpServletRequest request) {
@@ -350,10 +350,10 @@ public class MarkController extends BaseController {
     }
 
     private double[] getSplitConfig() {
-        String strs[] = splitConfig.split(",");
-        double[] config = new double[strs.length];
-        for (int i = 0; i < strs.length; i++) {
-            config[i] = Double.parseDouble(strs[i]);
+        String str[] = splitConfig.split(",");
+        double[] config = new double[str.length];
+        for (int i = 0; i < str.length; i++) {
+            config[i] = Double.parseDouble(str[i]);
         }
         return config;
     }
@@ -479,7 +479,7 @@ public class MarkController extends BaseController {
         task.setExamNumber(null);
         task.setStudentCode(null);
         if (secretNumberHide) {
-            task.setSecretNumber(DEFALT_SECRET_NUMBER);
+            task.setSecretNumber(DEFAULT_SECRET_NUMBER);
         }
         return task;
     }
@@ -639,7 +639,7 @@ public class MarkController extends BaseController {
             task.setExamNumber(null);
             task.setStudentCode(null);
             if (secretNumberHide) {
-                task.setSecretNumber(DEFALT_SECRET_NUMBER);
+                task.setSecretNumber(DEFAULT_SECRET_NUMBER);
             }
         }
         return list;

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

@@ -118,8 +118,9 @@
 				<td><fmt:formatNumber pattern="###.###" value="${question.intervalScore}"/></td>
 				<td>${question.selectiveIndex}-
 					<c:if test="${question.scorePolicy==1}">平均分</c:if>
-					<c:if test="${question.scorePolicy==2}">取高分</c:if>
-					<c:if test="${question.scorePolicy==3}">取低分</c:if>
+					<c:if test="${question.scorePolicy==2}">最高分</c:if>
+					<c:if test="${question.scorePolicy==3}">最低分</c:if>
+					<c:if test="${question.scorePolicy==4}">最低分(剔除0分)</c:if>
 				</td>
 				<td>${question.selectiveIndex}-${question.selectivePart}</td>
 			</tr>
@@ -216,6 +217,7 @@ function goScorePolicy(selectiveIndex,a,b,c) {
 	$('#scorePolicySelect').empty();
 	$('#scorePolicySelect').append('<option value="2">最高分</option>');
 	$('#scorePolicySelect').append('<option value="3">最低分</option>');
+	$('#scorePolicySelect').append('<option value="4">最低分(剔除0分)</option>');
 	$('#scorePolicySelect').val(c).trigger('change');;
 	
 	$('.scorePolicyWindow').show();