Parcourir la source

修改主观大题与评卷分组的绑定逻辑,支持一个大题的所有小题可以拆分属于多个评卷分组

luoshi il y a 4 ans
Parent
commit
7bb9197ff5

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

@@ -1,14 +1,13 @@
 package cn.com.qmth.stmms.biz.exam.dao;
 package cn.com.qmth.stmms.biz.exam.dao;
 
 
-import java.util.List;
-
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.jpa.repository.Query;
 
 
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+import java.util.List;
 
 
 public interface ExamQuestionDao extends JpaRepository<ExamQuestion, Integer>, JpaSpecificationExecutor<ExamQuestion> {
 public interface ExamQuestionDao extends JpaRepository<ExamQuestion, Integer>, JpaSpecificationExecutor<ExamQuestion> {
 
 
@@ -21,6 +20,10 @@ public interface ExamQuestionDao extends JpaRepository<ExamQuestion, Integer>, J
     public long countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(Integer examId, String subjectCode,
     public long countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber);
             boolean objective, Integer mainNumber);
 
 
+    @Query("select count(q) from ExamQuestion q where q.examId=?1 and q.subjectCode=?2 and q.objective=?3 and q.mainNumber=?4 and q.subNumber=?5")
+    public long countByExamIdAndSubjectCodeAndObjectiveAndMainNumberAndSubNumber(Integer examId, String subjectCode,
+            boolean objective, Integer mainNumber, Integer subNumber);
+
     // @Query("select q from ExamQuestion q where q.examId=?1 and
     // @Query("select q from ExamQuestion q where q.examId=?1 and
     // q.subjectCode=?2 and q.objective=?3 "
     // q.subjectCode=?2 and q.objective=?3 "
     // + "and q.paperType=?4 order by q.mainNumber, q.subNumber")
     // + "and q.paperType=?4 order by q.mainNumber, q.subNumber")
@@ -37,6 +40,11 @@ public interface ExamQuestionDao extends JpaRepository<ExamQuestion, Integer>, J
     public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(Integer examId, String subjectCode,
     public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(Integer examId, String subjectCode,
             boolean objective, Integer groupNumber);
             boolean objective, Integer groupNumber);
 
 
+    @Query("select q from ExamQuestion q where q.examId=?1 and q.subjectCode=?2 and q.objective=?3"
+            + "  and q.groupNumber!=?4 order by q.mainNumber, q.subNumber")
+    public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjectiveAndGroupNumberNotEqual(Integer examId,
+            String subjectCode, boolean objective, Integer groupNumber);
+
     // @Query("select q from ExamQuestion q where q.examId=?1 and
     // @Query("select q from ExamQuestion q where q.examId=?1 and
     // q.subjectCode=?2 and q.objective=?3 "
     // q.subjectCode=?2 and q.objective=?3 "
     // + "and q.paperType=?4 and q.mainNumber=?5 order by q.subNumber")
     // + "and q.paperType=?4 and q.mainNumber=?5 order by q.subNumber")

+ 9 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkGroup.java

@@ -11,7 +11,10 @@ import org.apache.commons.lang.StringUtils;
 import javax.persistence.*;
 import javax.persistence.*;
 import java.io.Serializable;
 import java.io.Serializable;
 import java.text.DecimalFormat;
 import java.text.DecimalFormat;
-import java.util.*;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
 
 
 /**
 /**
  * 评卷分组对象
  * 评卷分组对象
@@ -124,7 +127,7 @@ public class MarkGroup implements Serializable {
     private String scoreList;
     private String scoreList;
 
 
     @Transient
     @Transient
-    private Map<Integer, List<ExamQuestion>> questionMap;
+    private List<ExamQuestion> importQuestionList;
 
 
     @Transient
     @Transient
     private long markerCount;
     private long markerCount;
@@ -399,12 +402,12 @@ public class MarkGroup implements Serializable {
         this.sheetView = sheetView;
         this.sheetView = sheetView;
     }
     }
 
 
-    public Map<Integer, List<ExamQuestion>> getQuestionMap() {
-        return questionMap;
+    public List<ExamQuestion> getImportQuestionList() {
+        return importQuestionList;
     }
     }
 
 
-    public void setQuestionMap(Map<Integer, List<ExamQuestion>> questionMap) {
-        this.questionMap = questionMap;
+    public void setImportQuestionList(List<ExamQuestion> importQuestionList) {
+        this.importQuestionList = importQuestionList;
     }
     }
 
 
     public String getMainNumber() {
     public String getMainNumber() {

+ 8 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamQuestionService.java

@@ -1,11 +1,11 @@
 package cn.com.qmth.stmms.biz.exam.service;
 package cn.com.qmth.stmms.biz.exam.service;
 
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
 import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
 
 
+import java.util.List;
+
 public interface ExamQuestionService {
 public interface ExamQuestionService {
 
 
     ExamQuestion save(ExamQuestion question);
     ExamQuestion save(ExamQuestion question);
@@ -36,6 +36,9 @@ public interface ExamQuestionService {
     List<ExamQuestion> findByExamAndSubjectAndObjectiveAndGroupNumber(Integer examId, String subjectCode,
     List<ExamQuestion> findByExamAndSubjectAndObjectiveAndGroupNumber(Integer examId, String subjectCode,
             boolean objective, Integer groupNumber);
             boolean objective, Integer groupNumber);
 
 
+    List<ExamQuestion> findByExamAndSubjectAndObjectiveAndGroupNumberNotEqual(Integer examId, String subjectCode,
+            boolean objective, Integer groupNumber);
+
     List<ExamQuestion> findByExamAndSubjectAndObjectiveAndMainNumber(Integer examId, String subjectCode,
     List<ExamQuestion> findByExamAndSubjectAndObjectiveAndMainNumber(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber);
             boolean objective, Integer mainNumber);
 
 
@@ -45,6 +48,9 @@ public interface ExamQuestionService {
     long countByExamAndSubjectAndObjectiveAndMainNumberAndPaperType(Integer examId, String subjectCode,
     long countByExamAndSubjectAndObjectiveAndMainNumberAndPaperType(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber, String paperType);
             boolean objective, Integer mainNumber, String paperType);
 
 
+    long countByExamAndSubjectAndObjectiveAndMainNumberAndSubNumber(Integer examId, String subjectCode,
+            boolean objective, Integer mainNumber, Integer subNumber);
+
     List<String> getPaperTypeWitnNull(Integer examId, String subjectCode);
     List<String> getPaperTypeWitnNull(Integer examId, String subjectCode);
 
 
     ExamQuestion updateObjectivePolicy(Integer questionId, ObjectivePolicy objectivePolicy);
     ExamQuestion updateObjectivePolicy(Integer questionId, ObjectivePolicy objectivePolicy);

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

@@ -4,8 +4,6 @@ import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.ExamQuestionDao;
 import cn.com.qmth.stmms.biz.exam.dao.ExamQuestionDao;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
 import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,12 +27,6 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     @Autowired
     @Autowired
     private ExamQuestionDao questionDao;
     private ExamQuestionDao questionDao;
 
 
-    @Autowired
-    private ExamService examService;
-
-    @Autowired
-    private ExamSubjectService subjectService;
-
     @Transactional
     @Transactional
     @Override
     @Override
     public ExamQuestion save(ExamQuestion question) {
     public ExamQuestion save(ExamQuestion question) {
@@ -86,6 +78,13 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
                 .findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(examId, subjectCode, objective, groupNumber);
                 .findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(examId, subjectCode, objective, groupNumber);
     }
     }
 
 
+    @Override
+    public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndGroupNumberNotEqual(Integer examId, String subjectCode,
+            boolean objective, Integer groupNumber) {
+        return questionDao.findByExamIdAndSubjectCodeAndObjectiveAndGroupNumberNotEqual(examId, subjectCode, objective,
+                groupNumber);
+    }
+
     @Override
     @Override
     public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndMainNumber(Integer examId, String subjectCode,
     public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndMainNumber(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber) {
             boolean objective, Integer mainNumber) {
@@ -173,6 +172,14 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
                         paperType);
                         paperType);
     }
     }
 
 
+    @Override
+    public long countByExamAndSubjectAndObjectiveAndMainNumberAndSubNumber(Integer examId, String subjectCode,
+            boolean objective, Integer mainNumber, Integer subNumber) {
+        return questionDao
+                .countByExamIdAndSubjectCodeAndObjectiveAndMainNumberAndSubNumber(examId, subjectCode, objective,
+                        mainNumber, subNumber);
+    }
+
     @Override
     @Override
     public List<String> getPaperTypeWitnNull(Integer examId, String subjectCode) {
     public List<String> getPaperTypeWitnNull(Integer examId, String subjectCode) {
         return questionDao.getPaperTypeWitnNull(examId, subjectCode, true);
         return questionDao.getPaperTypeWitnNull(examId, subjectCode, true);

+ 27 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/ExamQuestionDTO.java

@@ -1,5 +1,9 @@
 package cn.com.qmth.stmms.admin.dto;
 package cn.com.qmth.stmms.admin.dto;
 
 
+import org.apache.commons.lang.StringUtils;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
 public class ExamQuestionDTO {
 public class ExamQuestionDTO {
@@ -8,6 +12,8 @@ public class ExamQuestionDTO {
 
 
     private String mainTitle;
     private String mainTitle;
 
 
+    private Integer subNumber;
+
     private List<Double> scoreList;
     private List<Double> scoreList;
 
 
     private List<Double> intervalScoreList;
     private List<Double> intervalScoreList;
@@ -20,6 +26,14 @@ public class ExamQuestionDTO {
         this.mainNumber = mainNumber;
         this.mainNumber = mainNumber;
     }
     }
 
 
+    public Integer getSubNumber() {
+        return subNumber;
+    }
+
+    public void setSubNumber(Integer subNumber) {
+        this.subNumber = subNumber;
+    }
+
     public String getMainTitle() {
     public String getMainTitle() {
         return mainTitle;
         return mainTitle;
     }
     }
@@ -44,4 +58,17 @@ public class ExamQuestionDTO {
         this.intervalScoreList = intervalScoreList;
         this.intervalScoreList = intervalScoreList;
     }
     }
 
 
+    public String getScoreString() {
+        DecimalFormat format = new DecimalFormat("####.###");
+        List<String> list = new ArrayList<>();
+        if (scoreList != null) {
+            for (Double score : scoreList) {
+                if (score != null) {
+                    list.add(format.format(score));
+                }
+            }
+        }
+        return StringUtils.join(list, ",");
+    }
+
 }
 }

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

@@ -59,15 +59,10 @@ public class SubjectQuestionDTO {
                             PictureConfigItem.parse(question.getPicList()), 0d, question.getDoubleRate(),
                             PictureConfigItem.parse(question.getPicList()), 0d, question.getDoubleRate(),
                             question.getArbitrateThreshold(), question.getScorePolicy(), question.getMarkMode(),
                             question.getArbitrateThreshold(), question.getScorePolicy(), question.getMarkMode(),
                             question.getTrialCount(), false, true, 1);
                             question.getTrialCount(), false, true, 1);
-                    group.setQuestionMap(new HashMap<Integer, List<ExamQuestion>>());
+                    group.setImportQuestionList(new LinkedList<>());
                     groups.put(question.getGroupNumber(), group);
                     groups.put(question.getGroupNumber(), group);
                 }
                 }
-                List<ExamQuestion> list = group.getQuestionMap().get(question.getMainNumber());
-                if (list == null) {
-                    list = new ArrayList<ExamQuestion>();
-                    group.getQuestionMap().put(question.getMainNumber(), list);
-                }
-                list.add(question);
+                group.getImportQuestionList().add(question);
                 group.setTotalScore(group.getTotalScore() + question.getTotalScore());
                 group.setTotalScore(group.getTotalScore() + question.getTotalScore());
                 totalScore += question.getTotalScore();
                 totalScore += question.getTotalScore();
             }
             }
@@ -94,7 +89,7 @@ public class SubjectQuestionDTO {
         if (list.size() > 0) {
         if (list.size() > 0) {
             Set<String> numberSet = new HashSet<String>();
             Set<String> numberSet = new HashSet<String>();
             Map<Integer, String> titleMap = new HashMap<Integer, String>();
             Map<Integer, String> titleMap = new HashMap<Integer, String>();
-            Map<Integer, Integer> groupNumberMap = new HashMap<Integer, Integer>();
+            //Map<Integer, Integer> groupNumberMap = new HashMap<Integer, Integer>();
             try {
             try {
                 // 基本字段合法性校验
                 // 基本字段合法性校验
                 for (ExamQuestion question : list) {
                 for (ExamQuestion question : list) {
@@ -131,13 +126,14 @@ public class SubjectQuestionDTO {
                         titleMap.put(question.getMainNumber(), question.getMainTitle());
                         titleMap.put(question.getMainNumber(), question.getMainTitle());
                     }
                     }
 
 
-                    Integer groupNumber = groupNumberMap.get(question.getMainNumber());
-                    if (groupNumber != null && !groupNumber.equals(question.getGroupNumber())) {
-                        error.add("[" + subjectCode + "] 大题号" + question.getMainNumber() + "有评卷分组不一致的记录");
-                        return false;
-                    } else {
-                        groupNumberMap.put(question.getMainNumber(), question.getGroupNumber());
-                    }
+                    //不再限制一个大题只能属于一个评卷分组
+                    //                    Integer groupNumber = groupNumberMap.get(question.getMainNumber());
+                    //                    if (groupNumber != null && !groupNumber.equals(question.getGroupNumber())) {
+                    //                        error.add("[" + subjectCode + "] 大题号" + question.getMainNumber() + "有评卷分组不一致的记录");
+                    //                        return false;
+                    //                    } else {
+                    //                        groupNumberMap.put(question.getMainNumber(), question.getGroupNumber());
+                    //                    }
 
 
                     String number = question.getQuestionNumber();
                     String number = question.getQuestionNumber();
                     if (objective) {
                     if (objective) {
@@ -181,7 +177,7 @@ public class SubjectQuestionDTO {
             } finally {
             } finally {
                 numberSet.clear();
                 numberSet.clear();
                 titleMap.clear();
                 titleMap.clear();
-                groupNumberMap.clear();
+                //groupNumberMap.clear();
             }
             }
         } else {
         } else {
             return false;
             return false;

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

@@ -32,7 +32,6 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
-import java.text.DecimalFormat;
 import java.util.*;
 import java.util.*;
 
 
 @Controller("markGroupController")
 @Controller("markGroupController")
@@ -278,35 +277,27 @@ public class MarkGroupController extends BaseExamController {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         if (group != null) {
         if (group != null) {
-            String pictureConfig = buildPictureConfig(group);
-            group.setPicList(pictureConfig);
-            group.setQuestionList(
-                    questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number));
-            List<MarkGroup> questionList = new ArrayList<MarkGroup>();
-            String[] mainNumbers = group.getMainNumber().split(",");
-            for (String mainNumber : mainNumbers) {
-                List<ExamQuestion> list = questionService
-                        .findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false,
-                                Integer.parseInt(mainNumber));
-                StringBuilder score = new StringBuilder();
-                DecimalFormat format = new DecimalFormat("####.###");
-                String title = "";
-                for (ExamQuestion question : list) {
-                    if (score.length() > 0) {
-                        score.append(",");
-                    }
-                    score.append(format.format(question.getTotalScore()));
-                    title = question.getMainTitle();
+            group.setPicList(buildPictureConfig(group));
+            List<ExamQuestion> list = questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
+            List<ExamQuestionDTO> questionList = new ArrayList<>();
+            Map<Integer, ExamQuestionDTO> mainMap = new HashMap<>();
+            for (ExamQuestion question : list) {
+                ExamQuestionDTO dto = mainMap.get(question.getMainNumber());
+                if (dto == null) {
+                    dto = new ExamQuestionDTO();
+                    dto.setMainNumber(question.getMainNumber());
+                    dto.setMainTitle(question.getMainTitle());
+                    dto.setSubNumber(question.getSubNumber());
+                    dto.setScoreList(new ArrayList<>());
+                    mainMap.put(question.getMainNumber(), dto);
+                    questionList.add(dto);
                 }
                 }
-                MarkGroup question = new MarkGroup();
-                question.setMainNumber(mainNumber);
-                question.setTitle(title);
-                question.setScoreList(score.toString());
-                questionList.add(question);
+                dto.getScoreList().add(question.getTotalScore());
             }
             }
             model.addAttribute("group", group);
             model.addAttribute("group", group);
             model.addAttribute("questionList", questionList);
             model.addAttribute("questionList", questionList);
-            model.addAttribute("pictureConfig", pictureConfig);
+            model.addAttribute("pictureConfig", group.getPicList());
             model.addAttribute("markModeList", MarkMode.values());
             model.addAttribute("markModeList", MarkMode.values());
             model.addAttribute("scorePolicyList", ScorePolicy.values());
             model.addAttribute("scorePolicyList", ScorePolicy.values());
             model.addAttribute("thirdPolicyList", ThirdPolicy.values());
             model.addAttribute("thirdPolicyList", ThirdPolicy.values());
@@ -359,8 +350,8 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Integer thirdPolicy, @RequestParam(required = false) Integer scorePolicy,
             @RequestParam(required = false) Integer thirdPolicy, @RequestParam(required = false) Integer scorePolicy,
             @RequestParam(required = false) MarkMode markMode, @RequestParam(required = false) Integer trialCount,
             @RequestParam(required = false) MarkMode markMode, @RequestParam(required = false) Integer trialCount,
-            @RequestParam(defaultValue = "false") Boolean sheetView,
-            @RequestParam(defaultValue = "false") Boolean enableAllZero,
+            @RequestParam(required = false, defaultValue = "false") Boolean sheetView,
+            @RequestParam(required = false, defaultValue = "false") Boolean enableAllZero,
             @RequestParam(required = false) String questionDetail,
             @RequestParam(required = false) String questionDetail,
             @RequestParam(required = false) String intervalScoreList) {
             @RequestParam(required = false) String intervalScoreList) {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
@@ -372,25 +363,8 @@ public class MarkGroupController extends BaseExamController {
                     questionDetail = StringEscapeUtils.unescapeHtml(questionDetail);
                     questionDetail = StringEscapeUtils.unescapeHtml(questionDetail);
                     JSONArray array = JSONArray.fromObject(questionDetail);
                     JSONArray array = JSONArray.fromObject(questionDetail);
                     List<ExamQuestionDTO> detailList = JSONArray.toList(array, new ExamQuestionDTO(), new JsonConfig());
                     List<ExamQuestionDTO> detailList = JSONArray.toList(array, new ExamQuestionDTO(), new JsonConfig());
-                    List<ExamQuestion> all = questionService
-                            .findByExamAndSubjectAndObjective(examId, subjectCode, false);
-                    List<ExamQuestion> old = questionService
-                            .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
-                    Set<Integer> mainNumbers = new HashSet<Integer>();
-                    for (ExamQuestion examQuestion : all) {
-                        mainNumbers.add(examQuestion.getMainNumber());
-                    }
-                    for (ExamQuestion examQuestion : old) {
-                        mainNumbers.remove(examQuestion.getMainNumber());
-                    }
                     for (int i = 0; i < detailList.size(); i++) {
                     for (int i = 0; i < detailList.size(); i++) {
                         ExamQuestionDTO dto = detailList.get(i);
                         ExamQuestionDTO dto = detailList.get(i);
-                        if (mainNumbers.contains(dto.getMainNumber())) {
-                            addMessage(redirectAttributes, "大题号不能重复");
-                            redirectAttributes.addAttribute("subjectCode", subjectCode);
-                            redirectAttributes.addAttribute("number", number);
-                            return "redirect:/admin/exam/group/edit-full";
-                        }
                         Object scoreListArray[] = array.getJSONObject(i).getJSONArray("scoreList").toArray();
                         Object scoreListArray[] = array.getJSONObject(i).getJSONArray("scoreList").toArray();
                         List<Double> scoreList = new ArrayList<Double>();
                         List<Double> scoreList = new ArrayList<Double>();
                         for (int j = 0; j < scoreListArray.length; j++) {
                         for (int j = 0; j < scoreListArray.length; j++) {
@@ -398,14 +372,29 @@ public class MarkGroupController extends BaseExamController {
                         }
                         }
                         dto.setScoreList(scoreList);
                         dto.setScoreList(scoreList);
                     }
                     }
-                    if (detailList != null && detailList.size() > 0) {
+                    List<ExamQuestion> questionList = buildQuestionList(group, detailList);
+                    List<ExamQuestion> others = questionService
+                            .findByExamAndSubjectAndObjectiveAndGroupNumberNotEqual(examId, subjectCode, false, number);
+                    Set<String> numbers = new HashSet<>();
+                    for (ExamQuestion examQuestion : others) {
+                        numbers.add(examQuestion.getQuestionNumber());
+                    }
+                    for (ExamQuestion question : questionList) {
+                        if (numbers.contains(question.getQuestionNumber())) {
+                            addMessage(redirectAttributes, "题号不能重复");
+                            redirectAttributes.addAttribute("subjectCode", subjectCode);
+                            redirectAttributes.addAttribute("number", number);
+                            return "redirect:/admin/exam/group/edit-full";
+                        }
+                    }
+                    if (!questionList.isEmpty()) {
                         ScorePolicy policy = scorePolicy != null ? ScorePolicy.findByValue(scorePolicy) : null;
                         ScorePolicy policy = scorePolicy != null ? ScorePolicy.findByValue(scorePolicy) : null;
                         ThirdPolicy third =
                         ThirdPolicy third =
                                 thirdPolicy != null ? ThirdPolicy.findByValue(thirdPolicy) : ThirdPolicy.DISABLE;
                                 thirdPolicy != null ? ThirdPolicy.findByValue(thirdPolicy) : ThirdPolicy.DISABLE;
                         try {
                         try {
                             lockService.waitlock(LockType.GROUP, true, group.getExamId(), group.getSubjectCode(),
                             lockService.waitlock(LockType.GROUP, true, group.getExamId(), group.getSubjectCode(),
                                     group.getNumber());
                                     group.getNumber());
-                            markService.updateGroup(group, buildQuestionList(group, detailList), policy, third);
+                            markService.updateGroup(group, questionList, policy, third);
                         } catch (Exception e) {
                         } catch (Exception e) {
                             log.error("update group error", e);
                             log.error("update group error", e);
                             throw new RuntimeException("重置更新大题失败", e);
                             throw new RuntimeException("重置更新大题失败", e);
@@ -476,11 +465,12 @@ public class MarkGroupController extends BaseExamController {
     @Transactional
     @Transactional
     public String insert(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
     public String insert(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
             @RequestParam String subjectCode, @RequestParam Integer number, @RequestParam String questionDetail,
             @RequestParam String subjectCode, @RequestParam Integer number, @RequestParam String questionDetail,
-            @RequestParam(required = false) String picList, @RequestParam(required = false) Double doubleRate,
+            @RequestParam String picList, @RequestParam(required = false) Double doubleRate,
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Integer thirdPolicy, @RequestParam(required = false) Integer scorePolicy,
             @RequestParam(required = false) Integer thirdPolicy, @RequestParam(required = false) Integer scorePolicy,
             @RequestParam(required = false) String markMode, @RequestParam(required = false) Integer trialCount,
             @RequestParam(required = false) String markMode, @RequestParam(required = false) Integer trialCount,
-            @RequestParam boolean sheetView, @RequestParam boolean enableAllZero) {
+            @RequestParam(required = false, defaultValue = "false") boolean sheetView,
+            @RequestParam(defaultValue = "false") boolean enableAllZero) {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         Exam exam = examService.findById(examId);
         Exam exam = examService.findById(examId);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
@@ -492,17 +482,13 @@ public class MarkGroupController extends BaseExamController {
             addMessage(redirectAttributes, "大题详情必须设置");
             addMessage(redirectAttributes, "大题详情必须设置");
             redirectAttributes.addAttribute("subjectCode", subjectCode);
             redirectAttributes.addAttribute("subjectCode", subjectCode);
             return "redirect:/admin/exam/group/add";
             return "redirect:/admin/exam/group/add";
-        } else if (StringUtils.isBlank(picList) && !exam.getType().equals(ExamType.MULTI_MEDIA)) {
-            addMessage(redirectAttributes, "图片范围必须设置");
-            redirectAttributes.addAttribute("subjectCode", subjectCode);
-            return "redirect:/admin/exam/group/add";
         } else {
         } else {
             try {
             try {
                 // create group
                 // create group
                 // build picList
                 // build picList
                 List<PictureConfigItem> picConfigList = null;
                 List<PictureConfigItem> picConfigList = null;
                 if (!exam.getType().equals(ExamType.MULTI_MEDIA)) {
                 if (!exam.getType().equals(ExamType.MULTI_MEDIA)) {
-                    picList = StringEscapeUtils.unescapeHtml(picList);
+                    picList = StringEscapeUtils.unescapeHtml(StringUtils.trimToNull(picList));
                     JSONArray array = JSONArray.fromObject(picList);
                     JSONArray array = JSONArray.fromObject(picList);
                     picConfigList = JSONArray.toList(array, new PictureConfigItem(), new JsonConfig());
                     picConfigList = JSONArray.toList(array, new PictureConfigItem(), new JsonConfig());
                 }
                 }
@@ -520,21 +506,22 @@ public class MarkGroupController extends BaseExamController {
                     dto.setScoreList(scoreList);
                     dto.setScoreList(scoreList);
                 }
                 }
                 if (detailList != null && detailList.size() > 0) {
                 if (detailList != null && detailList.size() > 0) {
-                    for (ExamQuestionDTO detail : detailList) {
-                        if (questionService.countByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false,
-                                detail.getMainNumber()) > 0) {
-                            addMessage(redirectAttributes, "大题号不能重复");
+                    group = new MarkGroup(examId, subjectCode, number, picConfigList, 0d, doubleRate,
+                            arbitrateThreshold, scorePolicy, markMode, trialCount, sheetView, enableAllZero,
+                            thirdPolicy);
+                    List<ExamQuestion> list = buildQuestionList(group, detailList);
+                    for (ExamQuestion question : list) {
+                        if (questionService
+                                .countByExamAndSubjectAndObjectiveAndMainNumberAndSubNumber(examId, subjectCode, false,
+                                        question.getMainNumber(), question.getSubNumber()) > 0) {
+                            addMessage(redirectAttributes, "题号不能重复");
                             redirectAttributes.addAttribute("subjectCode", subjectCode);
                             redirectAttributes.addAttribute("subjectCode", subjectCode);
                             return "redirect:/admin/exam/group/add";
                             return "redirect:/admin/exam/group/add";
                         }
                         }
                     }
                     }
-                    group = new MarkGroup(examId, subjectCode, number, picConfigList, 0d, doubleRate,
-                            arbitrateThreshold, scorePolicy, markMode, trialCount, sheetView, enableAllZero,
-                            thirdPolicy);
                     // clear and replace exam_question
                     // clear and replace exam_question
                     questionService
                     questionService
                             .deleteByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
                             .deleteByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
-                    List<ExamQuestion> list = buildQuestionList(group, detailList);
                     questionService.save(list);
                     questionService.save(list);
                     groupService.save(group);
                     groupService.save(group);
                     subjectService
                     subjectService
@@ -604,19 +591,19 @@ public class MarkGroupController extends BaseExamController {
         for (ExamQuestionDTO detail : detailList) {
         for (ExamQuestionDTO detail : detailList) {
             int i = 0;
             int i = 0;
             for (double score : detail.getScoreList()) {
             for (double score : detail.getScoreList()) {
-                i++;
                 totalScore += score;
                 totalScore += score;
                 ExamQuestion question = new ExamQuestion();
                 ExamQuestion question = new ExamQuestion();
                 question.setExamId(group.getExamId());
                 question.setExamId(group.getExamId());
                 question.setSubjectCode(group.getSubjectCode());
                 question.setSubjectCode(group.getSubjectCode());
                 question.setMainTitle(detail.getMainTitle());
                 question.setMainTitle(detail.getMainTitle());
                 question.setMainNumber(detail.getMainNumber());
                 question.setMainNumber(detail.getMainNumber());
-                question.setSubNumber(i);
+                question.setSubNumber(detail.getSubNumber() + i);
                 question.setGroupNumber(group.getNumber());
                 question.setGroupNumber(group.getNumber());
                 question.setObjective(false);
                 question.setObjective(false);
                 question.setTotalScore(score);
                 question.setTotalScore(score);
                 question.setIntervalScore(1d);
                 question.setIntervalScore(1d);
                 list.add(question);
                 list.add(question);
+                i++;
             }
             }
         }
         }
         group.setTotalScore(totalScore);
         group.setTotalScore(totalScore);

+ 40 - 52
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -1,36 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.core.task.AsyncTaskExecutor;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.dto.ObjectiveQuestionDTO;
 import cn.com.qmth.stmms.admin.dto.ObjectiveQuestionDTO;
 import cn.com.qmth.stmms.admin.dto.QuestionDTO;
 import cn.com.qmth.stmms.admin.dto.QuestionDTO;
 import cn.com.qmth.stmms.admin.dto.SubjectQuestionDTO;
 import cn.com.qmth.stmms.admin.dto.SubjectQuestionDTO;
@@ -41,11 +10,7 @@ import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 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.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 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.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
@@ -54,14 +19,28 @@ import cn.com.qmth.stmms.biz.report.service.ReportService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.LockType;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
-import cn.com.qmth.stmms.common.enums.ObjectiveStatus;
-import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
 
 
 @Controller("examPaperController")
 @Controller("examPaperController")
 @RequestMapping("/admin/exam/paper")
 @RequestMapping("/admin/exam/paper")
@@ -131,8 +110,8 @@ public class PaperController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         if (wu.isSubjectHeader()
         if (wu.isSubjectHeader()
-        // TODO - subjectheader check
-        // &&!subjectCode.equals(wu.getUser().getSubjectCode())
+            // TODO - subjectheader check
+            // &&!subjectCode.equals(wu.getUser().getSubjectCode())
         ) {
         ) {
             return "redirect:/admin/exam/paper";
             return "redirect:/admin/exam/paper";
         }
         }
@@ -198,9 +177,10 @@ public class PaperController extends BaseExamController {
         query.setPageSize(Integer.MAX_VALUE);
         query.setPageSize(Integer.MAX_VALUE);
         query = questionService.findByQuery(query);
         query = questionService.findByQuery(query);
         for (ExamQuestion q : query.getResult()) {
         for (ExamQuestion q : query.getResult()) {
-            list.add(objective ? new ObjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()))
-                    : new SubjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()), groupMap.get(q.getSubjectCode()
-                            + "_" + q.getGroupNumber())));
+            list.add(objective ?
+                    new ObjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode())) :
+                    new SubjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()),
+                            groupMap.get(q.getSubjectCode() + "_" + q.getGroupNumber())));
         }
         }
         try {
         try {
             String fileName = objective ? "客观题数据.xlsx" : "主观题数据.xlsx";
             String fileName = objective ? "客观题数据.xlsx" : "主观题数据.xlsx";
@@ -241,14 +221,22 @@ public class PaperController extends BaseExamController {
                             for (MarkGroup group : dto.getGroups().values()) {
                             for (MarkGroup group : dto.getGroups().values()) {
                                 MarkGroup old = groupService.findOne(examId, group.getSubjectCode(), group.getNumber());
                                 MarkGroup old = groupService.findOne(examId, group.getSubjectCode(), group.getNumber());
                                 // 已存在的评卷分组跳过
                                 // 已存在的评卷分组跳过
-                                if (old == null && group.getQuestionMap() != null) {
-                                    for (Entry<Integer, List<ExamQuestion>> entry : group.getQuestionMap().entrySet()) {
-                                        // 已存在的大题跳过
-                                        if (questionService.countByExamAndSubjectAndObjectiveAndMainNumber(examId,
-                                                group.getSubjectCode(), objective, entry.getKey()) == 0) {
-                                            questionService.save(entry.getValue());
+                                if (old == null && group.getImportQuestionList() != null) {
+                                    boolean validate = true;
+                                    for (ExamQuestion question : group.getImportQuestionList()) {
+                                        if (questionService.countByExamAndSubjectAndObjectiveAndMainNumberAndSubNumber(
+                                                question.getExamId(), question.getSubjectCode(), question.isObjective(),
+                                                question.getMainNumber(), question.getSubNumber()) > 0) {
+                                            error.add("[" + group.getSubjectCode() + "_" + group.getNumber()
+                                                    + "] 有小题已存在");
+                                            validate = false;
+                                            break;
                                         }
                                         }
                                     }
                                     }
+                                    // 校验通过小题才保存
+                                    if (validate && !group.getImportQuestionList().isEmpty()) {
+                                        questionService.save(group.getImportQuestionList());
+                                    }
                                     // 有题目的分组才保存
                                     // 有题目的分组才保存
                                     if (questionService.countByExamAndSubjectAndObjectiveAndGroupNumber(examId,
                                     if (questionService.countByExamAndSubjectAndObjectiveAndGroupNumber(examId,
                                             group.getSubjectCode(), objective, group.getNumber()) != 0) {
                                             group.getSubjectCode(), objective, group.getNumber()) != 0) {

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

@@ -51,25 +51,28 @@
     <div class="control-group">
     <div class="control-group">
         <label class="control-label">序号</label>
         <label class="control-label">序号</label>
         <div class="controls">
         <div class="controls">
-            <form:input path="number" htmlEscape="false" maxlength="10" min="1" class="required digits"/>
+            <form:input path="number" type="number" htmlEscape="false" max="100" min="1" class="required digits"/>
         </div>
         </div>
     </div>
     </div>
     <div id="questionDiv">
     <div id="questionDiv">
-        <div class="control-group">
-            <label class="control-label">分组</label>
+        <div class="control-group" id="questionBaseDiv">
+            <label class="control-label">大题</label>
             <div class="controls">
             <div class="controls">
-                <input name="mainNumber" type="number" htmlEscape="false" maxlength="10" min="1" class="required digits"
+                <input name="mainNumber" type="number" htmlEscape="false" max="100" min="1" class="required digits input-mini"
                        placeholder="大题号"/>
                        placeholder="大题号"/>
                 <input name="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required"
                 <input name="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required"
                        placeholder="名称"/>
                        placeholder="名称"/>
+                <input name="subNumber" type="number" htmlEscape="false" max="100" min="1" class="required digits input-small"
+                       placeholder="起始小题号"/>
                 <input name="scoreList" type="text" htmlEscape="false" maxlength="100" class="required"
                 <input name="scoreList" type="text" htmlEscape="false" maxlength="100" class="required"
                        placeholder="步骤分"/>
                        placeholder="步骤分"/>
+                <input type="button" class="btn question-delete hide" onclick="questionDelete(this)" value="删除"/>
             </div>
             </div>
         </div>
         </div>
     </div>
     </div>
     <div class="control-group">
     <div class="control-group">
         <div class="controls">
         <div class="controls">
-            <input type="button" value="增加大题" id="quetion-add">
+            <input type="button" class="btn" value="增加大题" id="quetion-add">
         </div>
         </div>
     </div>
     </div>
     <div class="control-group">
     <div class="control-group">
@@ -95,7 +98,7 @@
             <label class="control-label">图片显示</label>
             <label class="control-label">图片显示</label>
             <div class="controls">
             <div class="controls">
                 <a href="${ctx}/admin/exam/group/getPictureConfig?subjectCode=${group.subjectCode}&number=${group.number}"
                 <a href="${ctx}/admin/exam/group/getPictureConfig?subjectCode=${group.subjectCode}&number=${group.number}"
-                   target="_blank" class="required" id="configuration">设置</a>
+                   target="_blank" id="configuration">设置</a>
             </div>
             </div>
         </div>
         </div>
     </c:if>
     </c:if>
@@ -143,16 +146,17 @@
         </div>
         </div>
     </div>
     </div>
     <c:if test="${examType!='MULTI_MEDIA'}">
     <c:if test="${examType!='MULTI_MEDIA'}">
-        <div class="control-group">
-            <label class="control-label">原卷显示</label>
-            <div class="controls">
-                <input name="sheetView" type="checkbox" <c:if test="${group.sheetView}">checked</c:if>/>
-            </div>
+        <!--<div class="control-group">
+        <label class="control-label">原卷显示</label>
+        <div class="controls">
+        <input name="sheetView" type="checkbox" <c:if test="${group.sheetView}">checked</c:if>/>
+        </div>
         </div>
         </div>
+        -->
         <div class="control-group">
         <div class="control-group">
             <label class="control-label">启用全零分</label>
             <label class="control-label">启用全零分</label>
             <div class="controls">
             <div class="controls">
-                <input name="enableAllZero" type="checkbox" <c:if test="${group.enableAllZero}">checked</c:if>/>
+                <input name="enableAllZero" type="checkbox" value="1" <c:if test="${group.enableAllZero}">checked</c:if>/>
             </div>
             </div>
         </div>
         </div>
     </c:if>
     </c:if>
@@ -163,13 +167,10 @@
 </form:form>
 </form:form>
 <script type="text/javascript">
 <script type="text/javascript">
     $("#quetion-add").click(function () {
     $("#quetion-add").click(function () {
-        var dom = '<div class="control-group"><label class="control-label">大题</label><div class="controls">\
-<input name="mainNumber" class="mainNumber" type ="number" htmlEscape="false" maxlength="10" min="1" class="required digits" placeholder="大题号"/>\
-<input name="mainTitle" class="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required" placeholder="名称"/>\
-<input name="scoreList" class="scoreList" type="text" htmlEscape="false" maxlength="100" class="required" placeholder="步骤分"/>\
-&nbsp;<a href="#" class="question-delete" onclick="questionDelete(this)">删除</a>\
-</div></div>';
-        $("#questionDiv").append(dom);
+        var dom = $('#questionBaseDiv').clone();
+        dom.find('.question-delete').show();
+        dom.find("input[type='text'],input[type='number']").val('');
+        $("#questionDiv").append(dom)
     });
     });
 
 
     function questionDelete(obj) {
     function questionDelete(obj) {
@@ -181,7 +182,7 @@
         var fill = true;
         var fill = true;
         $("#questionDiv div div").each(function () {
         $("#questionDiv div div").each(function () {
             var question = []
             var question = []
-            $(this).children("input").each(function () {
+            $(this).children("input[type='text'],input[type='number']").each(function () {
                 var q = $(this).val();
                 var q = $(this).val();
                 if (q == '') {
                 if (q == '') {
                     fill = false;
                     fill = false;
@@ -191,7 +192,8 @@
             var detail = {
             var detail = {
                 mainNumber: question[0],
                 mainNumber: question[0],
                 mainTitle: question[1],
                 mainTitle: question[1],
-                scoreList: question[2].split(",")
+                subNumber: question[2],
+                scoreList: question[3].split(",")
             };
             };
             questionDetail.push(detail);
             questionDetail.push(detail);
         });
         });

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

@@ -69,30 +69,30 @@
     <div class="control-group">
     <div class="control-group">
         <label class="control-label">分组序号</label>
         <label class="control-label">分组序号</label>
         <div class="controls">
         <div class="controls">
-            <form:input path="number" htmlEscape="false" maxlength="10" class="required" readonly="true"/>
+            <form:input path="number" htmlEscape="false" class="required" readonly="true"/>
         </div>
         </div>
     </div>
     </div>
     <div id="questionDiv">
     <div id="questionDiv">
         <c:forEach items="${questionList}" var="question" varStatus="questionStatus">
         <c:forEach items="${questionList}" var="question" varStatus="questionStatus">
             <div class="control-group">
             <div class="control-group">
-                <label class="control-label">分组</label>
+                <label class="control-label">大题</label>
                 <div class="controls">
                 <div class="controls">
-                    <input name="mainNumber" type="number" htmlEscape="false" maxlength="10" min="1"
-                           class="required digits" placeholder="大题号" value="${question.mainNumber }"/>
+                    <input name="mainNumber" type="number" htmlEscape="false" max="100" min="1"
+                           class="required digits input-mini" placeholder="大题号" value="${question.mainNumber }"/>
                     <input name="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required"
                     <input name="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required"
-                           placeholder="名称" value="${question.title }"/>
+                           placeholder="名称" value="${question.mainTitle }"/>
+                    <input name="subNumber" type="number" htmlEscape="false" max="100" min="1"
+                           class="required digits input-small" placeholder="起始小题号" value="${question.subNumber }"/>
                     <input name="scoreList" type="text" htmlEscape="false" maxlength="100" class="required"
                     <input name="scoreList" type="text" htmlEscape="false" maxlength="100" class="required"
-                           placeholder="步骤分" value="${question.scoreList }"/>
-                    <c:if test="${!questionStatus.first }">
-                        &nbsp;<a href="#" class="question-delete" onclick="questionDelete(this)">删除</a>
-                    </c:if>
+                           placeholder="步骤分" value="${question.scoreString }"/>
+                    <input type="button" class="btn question-delete <c:if test="${questionStatus.first}">hide</c:if>" onclick="questionDelete(this)" value="删除"/>
                 </div>
                 </div>
             </div>
             </div>
         </c:forEach>
         </c:forEach>
     </div>
     </div>
     <div class="control-group">
     <div class="control-group">
         <div class="controls">
         <div class="controls">
-            <input type="button" value="增加大题" id="quetion-add">
+            <input type="button" class="btn" value="增加大题" id="quetion-add">
         </div>
         </div>
     </div>
     </div>
     <c:if test="${group.status.value==1}">
     <c:if test="${group.status.value==1}">
@@ -170,16 +170,17 @@
         </div>
         </div>
     </div>
     </div>
     <c:if test="${examType!='MULTI_MEDIA'}">
     <c:if test="${examType!='MULTI_MEDIA'}">
-        <div class="control-group">
-            <label class="control-label">原卷显示</label>
-            <div class="controls">
-                <input name="sheetView" type="checkbox" <c:if test="${group.sheetView}">checked</c:if>/>
-            </div>
+        <!--<div class="control-group">
+        <label class="control-label">原卷显示</label>
+        <div class="controls">
+        <input name="sheetView" type="checkbox" <c:if test="${group.sheetView}">checked</c:if>/>
         </div>
         </div>
+        </div>
+        -->
         <div class="control-group">
         <div class="control-group">
             <label class="control-label">启用全零分</label>
             <label class="control-label">启用全零分</label>
             <div class="controls">
             <div class="controls">
-                <input name="enableAllZero" type="checkbox" <c:if test="${group.enableAllZero}">checked</c:if>/>
+                <input name="enableAllZero" type="checkbox" value="1" <c:if test="${group.enableAllZero}">checked</c:if>/>
             </div>
             </div>
         </div>
         </div>
     </c:if>
     </c:if>
@@ -191,18 +192,15 @@
     </div>
     </div>
     <div class="form-actions">
     <div class="form-actions">
         <a id="btnSubmit" href="##" class="btn btn-primary">保 存</a>&nbsp;
         <a id="btnSubmit" href="##" class="btn btn-primary">保 存</a>&nbsp;
-        <a href="${ctx}/admin/exam/group/edit-simple?subjectCode=${group.subjectCode}&number=${group.number}"
-           class="btn">返回</a>
+        <a href="${ctx}/admin/exam/group/delete?subjectCode=${group.subjectCode}&number=${group.number}" data-number="${group.number}" class="delete-button btn btn-danger">删除</a>
+        <a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}&number=${group.number}" class="btn">返回</a>
     </div>
     </div>
 </form:form>
 </form:form>
 <script type="text/javascript">
 <script type="text/javascript">
     $("#quetion-add").click(function () {
     $("#quetion-add").click(function () {
-        var dom = '<div class="control-group"><label class="control-label">分组</label><div class="controls">\
-<input name="mainNumber" class="mainNumber" type ="number" htmlEscape="false" maxlength="10" min="1" class="required digits" placeholder="大题号"/>\
-<input name="mainTitle" class="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required" placeholder="名称"/>\
-<input name="scoreList" class="scoreList" type="text" htmlEscape="false" maxlength="100" class="required" placeholder="步骤分"/>\
-&nbsp;<a href="#" class="question-delete" onclick="questionDelete(this)">删除</a>\
-</div></div>';
+        var dom = $('#questionDiv div:first').clone();
+        dom.find('.question-delete').show();
+        dom.find("input[type='text'],input[type='number']").val('');
         $("#questionDiv").append(dom);
         $("#questionDiv").append(dom);
     });
     });
 
 
@@ -215,7 +213,7 @@
         var fill = true;
         var fill = true;
         $("#questionDiv div div").each(function () {
         $("#questionDiv div div").each(function () {
             var question = []
             var question = []
-            $(this).children("input").each(function () {
+            $(this).children("input[type='text'],input[type='number']").each(function () {
                 var q = $(this).val();
                 var q = $(this).val();
                 if (q == '') {
                 if (q == '') {
                     fill = false;
                     fill = false;
@@ -225,7 +223,8 @@
             var detail = {
             var detail = {
                 mainNumber: question[0],
                 mainNumber: question[0],
                 mainTitle: question[1],
                 mainTitle: question[1],
-                scoreList: question[2].split(",")
+                subNumber: question[2],
+                scoreList: question[3].split(",")
             };
             };
             questionDetail.push(detail);
             questionDetail.push(detail);
         });
         });
@@ -236,6 +235,11 @@
             alert('大题不能为空');
             alert('大题不能为空');
         }
         }
     });
     });
+
+    $('.delete-button').click(function () {
+        var number = $(this).attr('data-number');
+        return confirm('确定要删除第' + number + '分组吗?相关评卷任务与评卷员都将一并删除!');
+    });
 </script>
 </script>
 </body>
 </body>
 </html>
 </html>

+ 124 - 123
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupList.jsp

@@ -1,133 +1,134 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <html>
 <head>
 <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>
+    <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>
 </head>
 <body>
 <body>
-    <ul class="nav nav-tabs">
-    	<li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
-        <li class="active"><a href="##">分组管理</a></li>
-        <li><a href="${ctx}/admin/exam/marker?subjectCode=${subject.code}">评卷员管理</a></li>
-        <li><a href="${ctx}/admin/exam/trial?subjectCode=${subject.code}">试评管理</a></li>
-        <li><a href="${ctx}/admin/exam/library?subjectCode=${subject.code}">任务管理</a></li>
-        <li><a href="${ctx}/admin/exam/arbitrate?subjectCode=${subject.code}">仲裁管理</a></li>
-        <li><a href="${ctx}/admin/exam/quality?subjectCode=${subject.code}">质量监控</a></li>
-    </ul>
-	<form id="searchForm" action="${ctx}/admin/exam/group" method="post" class="breadcrumb form-search">
-		<div>
-			<label>科目</label>
-			<select class="input-large" name="subjectCode">
-				<c:forEach items="${subjectList}" var="item">
-				<option value="${item.code}" <c:if test="${item.code==subject.code}">selected</c:if>>${item.code}-${item.name}</option>
-				</c:forEach>
-			</select>
-			&nbsp;
-			<input id="btnSubmit" class="btn btn-primary" type="submit" value="查询"/>
-			
-			<c:if test="${web_user.schoolAdmin==true}">
-				<c:if test="${examType!='MULTI_MEDIA'}">
-			&nbsp;
-				<a href="${ctx}/admin/exam/group/add?subjectCode=${subject.code}" class="btn">新增</a>
-				</c:if>
-			&nbsp;
-			<a href="${ctx}/admin/exam/group/check-count?subjectCode=${subject.code}" class="btn">数量校对</a>
-			</c:if>
-		</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>剩余总数</th>
-				<th>正在评卷</th>
-				<th>进度</th>
-				<th>状态</th>
-				<th>操作</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${resultList}" var="result">
-			<tr>
-				<td>${result.number}</td>
-			    <td>${result.mainNumber}</td>
-				<td>${result.title}</td>
-				<td>${result.scoreList}</td>
-                <td>
-                    <a href="${ctx}/admin/exam/marker?subjectCode=${result.subjectCode}&groupNumber=${result.number}">${result.markerCount}</a>
-                </td>
-				<td>${result.libraryCount}</td>
-				<td>${result.markedCount}</td>
-				<td>${result.leftCount}</td>
-				<td>${result.currentCount}</td>
-				<td>${result.percent}%</td>
-				<td>${result.status.name}</td>
-				<td>
-				    <c:if test="${web_user.schoolAdmin==true && result.status.value!=3}">
-				    <c:if test="${result.status.value==1}">
-                    <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FORMAL" data-number="${result.number}" class="edit-button" id="statusButton">开始正评</a>
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
+    <li class="active"><a href="##">分组管理</a></li>
+    <li><a href="${ctx}/admin/exam/marker?subjectCode=${subject.code}">评卷员管理</a></li>
+    <li><a href="${ctx}/admin/exam/trial?subjectCode=${subject.code}">试评管理</a></li>
+    <li><a href="${ctx}/admin/exam/library?subjectCode=${subject.code}">任务管理</a></li>
+    <li><a href="${ctx}/admin/exam/arbitrate?subjectCode=${subject.code}">仲裁管理</a></li>
+    <li><a href="${ctx}/admin/exam/quality?subjectCode=${subject.code}">质量监控</a></li>
+</ul>
+<form id="searchForm" action="${ctx}/admin/exam/group" method="post" class="breadcrumb form-search">
+    <div>
+        <label>科目</label>
+        <select class="input-large" name="subjectCode">
+            <c:forEach items="${subjectList}" var="item">
+                <option value="${item.code}" <c:if test="${item.code==subject.code}">selected</c:if>>${item.code}-${item.name}</option>
+            </c:forEach>
+        </select>
+        &nbsp;
+        <input id="btnSubmit" class="btn btn-primary" type="submit" value="查询"/>
+        
+        <c:if test="${web_user.schoolAdmin==true}">
+            <c:if test="${examType!='MULTI_MEDIA'}">
+                &nbsp;
+                <a href="${ctx}/admin/exam/group/add?subjectCode=${subject.code}" class="btn">新增</a>
+            </c:if>
+            &nbsp;
+            <a href="${ctx}/admin/exam/group/check-count?subjectCode=${subject.code}" class="btn">数量校对</a>
+        </c:if>
+    </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>剩余总数</th>
+        <th>正在评卷</th>
+        <th>进度</th>
+        <th>状态</th>
+        <th>操作</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${resultList}" var="result">
+        <tr>
+            <td>${result.number}</td>
+            <td>${result.mainNumber}</td>
+            <td>${result.title}</td>
+            <td>${result.scoreList}</td>
+            <td>
+                <a href="${ctx}/admin/exam/marker?subjectCode=${result.subjectCode}&groupNumber=${result.number}">${result.markerCount}</a>
+            </td>
+            <td>${result.libraryCount}</td>
+            <td>${result.markedCount}</td>
+            <td>${result.leftCount}</td>
+            <td>${result.currentCount}</td>
+            <td>${result.percent}%</td>
+            <td>${result.status.name}</td>
+            <td>
+                <c:if test="${web_user.schoolAdmin==true && result.status.value!=3}">
+                    <c:if test="${result.status.value==1}">
+                        <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FORMAL" data-number="${result.number}" class="edit-button"
+                           id="statusButton">开始正评</a>
                     </c:if>
                     </c:if>
-				    <c:if test="${result.status.value==2 && result.leftCount==0}">
-                    <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FINISH" data-number="${result.number}" class="edit-button">结束</a>
+                    <c:if test="${result.status.value==2 && result.leftCount==0}">
+                        <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FINISH" data-number="${result.number}" class="edit-button">结束</a>
                     </c:if>
                     </c:if>
-					<c:if test="${result.currentCount>0}">
-					&nbsp;
-					<a href="${ctx}/admin/exam/group/release?subjectCode=${result.subjectCode}&number=${result.number}">回收</a>
-					</c:if>
-					<c:if test="${result.libraryCount>0}">
-					&nbsp;
-					<a href="${ctx}/admin/exam/group/reset?subjectCode=${result.subjectCode}&number=${result.number}" data-number="${result.number}" class="reset-button">重置</a>
-					</c:if>
-					&nbsp;
-					<c:if test="${examType!='MULTI_MEDIA'}">
-					<a href="${ctx}/admin/exam/group/edit-simple?subjectCode=${result.subjectCode}&number=${result.number}" data-number="${result.number}" class="edit-button">修改</a>
-					&nbsp;
-					</c:if>
-					<a href="${ctx}/admin/exam/group/delete?subjectCode=${result.subjectCode}&number=${result.number}" data-number="${result.number}" class="delete-button">删除</a>
-					</c:if>
-					
-					<c:if test="${web_user.schoolAdmin==true && result.status.value==3}">
-					&nbsp;
-					<a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FORMAL" data-number="${result.number}" class="edit-button">开始正评</a>
-					</c:if>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
+                    <c:if test="${result.currentCount>0}">
+                        &nbsp;
+                        <a href="${ctx}/admin/exam/group/release?subjectCode=${result.subjectCode}&number=${result.number}">回收</a>
+                    </c:if>
+                    <c:if test="${result.libraryCount>0}">
+                        &nbsp;
+                        <a href="${ctx}/admin/exam/group/reset?subjectCode=${result.subjectCode}&number=${result.number}" data-number="${result.number}" class="reset-button">重置</a>
+                    </c:if>
+                    &nbsp;
+                    <c:if test="${examType!='MULTI_MEDIA'}">
+                        <a href="${ctx}/admin/exam/group/edit-simple?subjectCode=${result.subjectCode}&number=${result.number}" data-number="${result.number}" class="edit-button">修改</a>
+                        &nbsp;
+                    </c:if>
+                </c:if>
+                
+                <c:if test="${web_user.schoolAdmin==true && result.status.value==3}">
+                    &nbsp;
+                    <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FORMAL" data-number="${result.number}" class="edit-button">开始正评</a>
+                </c:if>
+            </td>
+        </tr>
+    </c:forEach>
+    </tbody>
+</table>
 <script type="text/javascript">
 <script type="text/javascript">
-function page(n,s){
-    $("#pageNumber").val(n);
-    $("#pageSize").val(s);
-    $("#searchForm").submit();
-    return false;
-}
-function goSearch(){
-    $("#pageNumber").val(1);
-    $("#searchForm").submit();
-    return false;
-}
-$('.reset-button').click(function(){
-	var number = $(this).attr('data-number');
-	return confirm('确定要重置第'+number+'分组的评卷任务吗?');
-});
-$('.delete-button').click(function(){
-    var number = $(this).attr('data-number');
-    return confirm('确定要删除第'+number+'分组吗?相关评卷任务与评卷员都将一并删除!');
-});
-$('#statusButton').click(function(){
-    return confirm('确定开始正评吗?');
-});
-</script>	
+    function page(n, s) {
+        $("#pageNumber").val(n);
+        $("#pageSize").val(s);
+        $("#searchForm").submit();
+        return false;
+    }
+
+    function goSearch() {
+        $("#pageNumber").val(1);
+        $("#searchForm").submit();
+        return false;
+    }
+
+    $('.reset-button').click(function () {
+        var number = $(this).attr('data-number');
+        return confirm('确定要重置第' + number + '分组的评卷任务吗?');
+    });
+    $('#statusButton').click(function () {
+        return confirm('确定开始正评吗?');
+    });
+</script>
 </body>
 </body>
 </html>
 </html>