浏览代码

评卷分组支持多大题;统分时显示进度

ting.yin 6 年之前
父节点
当前提交
ed9857c074

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

@@ -34,4 +34,8 @@ public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaS
     public void updateNeedCalculate(Integer examId, boolean needCalculate);
 
     public List<Exam> findBySchoolIdOrderByIdDesc(Integer schoolId);
+
+    @Modifying
+    @Query("update Exam e set e.process=?2 where e.id=?1")
+    public void updateProcess(Integer id, Double process);
 }

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

@@ -33,7 +33,7 @@ public interface ExamQuestionDao extends JpaRepository<ExamQuestion, Integer>, J
             boolean objective, Integer mainNumber);
 
     @Query("select q from ExamQuestion q where q.examId=?1 and q.subjectCode=?2 and q.objective=?3"
-            + "  and q.mainNumber=?4 order by q.mainNumber, q.subNumber")
+            + "  and q.groupNumber=?4 order by q.mainNumber, q.subNumber")
     public List<ExamQuestion> findByExamIdAndSubjectCodeAndObjectiveAndGroupNumber(Integer examId, String subjectCode,
             boolean objective, Integer groupNumber);
 

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

@@ -90,10 +90,6 @@ public interface MarkGroupDao
     @Query("update MarkGroup g set g.picList=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
     void updatePicList(Integer examId, String subjectCode, Integer number, String picList);
 
-    @Modifying(clearAutomatically = true)
-    @Query("update MarkGroup g set g.title=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
-    void updateTitle(Integer examId, String subjectCode, Integer number, String title);
-
     @Modifying(clearAutomatically = true)
     @Query("update MarkGroup g set g.totalScore=?4 where g.pk.examId=?1 and g.pk.subjectCode=?2 and g.pk.number=?3")
     void updateTotalScore(Integer examId, String subjectCode, Integer number, Double score);

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

@@ -86,6 +86,12 @@ public class Exam implements Serializable {
     @Column(name = "excellent_score")
     private Double excellentScore;
 
+    /**
+     * 统分进度
+     */
+    @Column(name = "process")
+    private Double process;
+
     public Integer getId() {
         return id;
     }
@@ -201,4 +207,13 @@ public class Exam implements Serializable {
     public void setExcellentScore(Double excellentScore) {
         this.excellentScore = excellentScore;
     }
+
+    public Double getProcess() {
+        return process;
+    }
+
+    public void setProcess(Double process) {
+        this.process = process;
+    }
+
 }

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java

@@ -31,4 +31,6 @@ public interface ExamService {
 
     List<Exam> findBySchoolId(Integer schoolId);
 
+    void updateProcess(Integer examId, Double process);
+
 }

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

@@ -148,4 +148,10 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
         return examDao.findBySchoolIdOrderByIdDesc(schoolId);
     }
 
+    @Transactional
+    @Override
+    public void updateProcess(Integer id, Double process) {
+        examDao.updateProcess(id,process);
+    }
+
 }

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

@@ -123,6 +123,7 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
             marker.setLoginName(marker.getLoginName());
             marker.setName(marker.getLoginName());
             marker.setGroupNumber(groupNumber);
+            marker.setClassCount(0);
             if (save(marker) != null) {
                 result++;
             }

+ 8 - 6
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/ExamQuestionDTO.java

@@ -1,14 +1,16 @@
 package cn.com.qmth.stmms.admin.dto;
 
+import java.util.List;
+
 public class ExamQuestionDTO {
 
     private Integer mainNumber;
 
     private String mainTitle;
 
-    private double[] scoreList;
+    private List<Double> scoreList;
 
-    private double[] intervalScoreList;
+    private List<Double> intervalScoreList;
 
     public Integer getMainNumber() {
         return mainNumber;
@@ -26,19 +28,19 @@ public class ExamQuestionDTO {
         this.mainTitle = mainTitle;
     }
 
-    public double[] getScoreList() {
+    public List<Double> getScoreList() {
         return scoreList;
     }
 
-    public void setScoreList(double[] scoreList) {
+    public void setScoreList(List<Double> scoreList) {
         this.scoreList = scoreList;
     }
 
-    public double[] getIntervalScoreList() {
+    public List<Double> getIntervalScoreList() {
         return intervalScoreList;
     }
 
-    public void setIntervalScoreList(double[] intervalScoreList) {
+    public void setIntervalScoreList(List<Double> intervalScoreList) {
         this.intervalScoreList = intervalScoreList;
     }
 

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

@@ -1,10 +1,16 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.text.DecimalFormat;
+import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
+
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -18,9 +24,6 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 import cn.com.qmth.stmms.admin.dto.ExamQuestionDTO;
 import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.campus.service.CampusService;
@@ -46,9 +49,9 @@ import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.ScorePolicy;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-import net.sf.json.JsonConfig;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 
 @Controller("markGroupController")
 @RequestMapping("/admin/exam/group")
@@ -100,9 +103,8 @@ public class MarkGroupController extends BaseExamController {
                     false, group.getNumber()));
             group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, subjectCode, group.getNumber()));
             group.setCurrentCount(markService.applyCount(group));
-            int percent = group.getLibraryCount() > 0
-                    ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount())
-                    : 0;
+            int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
+                    .getLibraryCount()) : 0;
             group.setPercent(percent);
         }
         model.addAttribute("resultList", list);
@@ -117,11 +119,13 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) Boolean withDouble, @RequestParam(required = false) MarkStatus status) {
         int examId = getSessionExamId(request);
         JSONArray array = new JSONArray();
-        List<MarkGroup> list = withDouble != null && withDouble
-                ? groupService.findByExamAndSubjectWithDouble(examId, subjectCode)
-                : (status != null ? groupService.findByExamAndSubjectAndStatus(examId, subjectCode, status)
-                        : groupService.findByExamAndSubject(examId, subjectCode));
+        List<MarkGroup> list = withDouble != null && withDouble ? groupService.findByExamAndSubjectWithDouble(examId,
+                subjectCode) : (status != null ? groupService
+                .findByExamAndSubjectAndStatus(examId, subjectCode, status) : groupService.findByExamAndSubject(examId,
+                subjectCode));
         for (MarkGroup group : list) {
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
+                    false, group.getNumber()));
             JSONObject obj = new JSONObject();
             obj.accumulate("number", group.getNumber());
             obj.accumulate("title", group.getTitle());
@@ -251,9 +255,13 @@ public class MarkGroupController extends BaseExamController {
         if (group != null) {
             String pictureConfig = buildPictureConfig(group);
             group.setPicList(pictureConfig);
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
+                    false, group.getNumber()));
             model.addAttribute("group", group);
-            model.addAttribute("questions", questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
-                    group.getExamId(), group.getSubjectCode(), false, group.getNumber()));
+            model.addAttribute(
+                    "questions",
+                    questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
+                            group.getSubjectCode(), false, group.getNumber()));
             model.addAttribute("pictureConfig", pictureConfig);
             model.addAttribute("markModeList", MarkMode.values());
             model.addAttribute("scorePolicyList", ScorePolicy.values());
@@ -273,9 +281,30 @@ public class MarkGroupController extends BaseExamController {
         if (group != null) {
             String pictureConfig = buildPictureConfig(group);
             group.setPicList(pictureConfig);
-            group.setQuestionList(
-                    questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number));
+            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();
+                }
+                MarkGroup question = new MarkGroup();
+                question.setMainNumber(mainNumber);
+                question.setTitle(title);
+                question.setScoreList(score.toString());
+                questionList.add(question);
+            }
             model.addAttribute("group", group);
+            model.addAttribute("questionList", questionList);
             model.addAttribute("pictureConfig", pictureConfig);
             model.addAttribute("markModeList", MarkMode.values());
             model.addAttribute("scorePolicyList", ScorePolicy.values());
@@ -319,7 +348,8 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Integer scorePolicy, @RequestParam(required = false) MarkMode markMode,
             @RequestParam(required = false) Integer trialCount, @RequestParam(required = false) boolean sheetView,
-            @RequestParam(required = false) String questionDetail) {
+            @RequestParam(required = false) String questionDetail,
+            @RequestParam(required = false) String intervalScoreList) {
         int examId = getSessionExamId(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
         if (group != null) {
@@ -341,35 +371,42 @@ public class MarkGroupController extends BaseExamController {
                 groupService.updateTrialCount(examId, subjectCode, number, trialCount);
             }
             groupService.updateSheetView(examId, subjectCode, number, sheetView);
-            // build questionDetail
-            questionDetail = StringEscapeUtils.unescapeHtml(questionDetail);
-            array = JSONArray.fromObject(picList);
-            List<ExamQuestionDTO> detailList = JSONArray.toList(array, new ExamQuestionDTO(), new JsonConfig());
-            if (detailList != null && detailList.size() > 0) {
+            if (questionDetail != null && reset.booleanValue()) {
                 // advance update
-                if (reset != null && reset.booleanValue()) {
+                questionDetail = StringEscapeUtils.unescapeHtml(questionDetail);
+                array = JSONArray.fromObject(questionDetail);
+                List<ExamQuestionDTO> detailList = JSONArray.toList(array, new ExamQuestionDTO(), new JsonConfig());
+                for (int i = 0; i < detailList.size(); i++) {
+                    ExamQuestionDTO dto = detailList.get(i);
+                    Object scoreListArray[] = array.getJSONObject(i).getJSONArray("scoreList").toArray();
+                    List<Double> scoreList = new ArrayList<Double>();
+                    for (int j = 0; j < scoreListArray.length; j++) {
+                        scoreList.add(Double.parseDouble(scoreListArray[j].toString()));
+                    }
+                    dto.setScoreList(scoreList);
+                }
+                if (detailList != null && detailList.size() > 0) {
                     ScorePolicy policy = scorePolicy != null ? ScorePolicy.findByValue(scorePolicy) : null;
                     try {
-                        lockService.waitlock(LockType.GROUP, true, group.getExamId(), group.getSubjectCode(),
-                                group.getNumber());
+                        lockService.waitlock(LockType.GROUP, true, group.getExamId(), group.getSubjectCode(),group.getNumber());
                         markService.updateGroup(group, buildQuestionList(group, detailList), policy);
                     } catch (Exception e) {
                         log.error("update group error", e);
                         throw new RuntimeException("重置更新大题失败", e);
                     } finally {
-                        lockService.unlock(LockType.GROUP, true, group.getExamId(), group.getSubjectCode(),
-                                group.getNumber());
+                        lockService.unlock(LockType.GROUP, true, group.getExamId(), group.getSubjectCode(),group.getNumber());
                     }
-                } else {
-                    for (ExamQuestionDTO detail : detailList) {
-                        List<ExamQuestion> subList = questionService.findByExamAndSubjectAndObjectiveAndMainNumber(
-                                examId, subjectCode, false, detail.getMainNumber());
-                        for (int i = 0; i < subList.size(); i++) {
-                            ExamQuestion question = subList.get(i);
-                            question.setMainTitle(detail.getMainTitle());
-                            question.setIntervalScore(detail.getIntervalScoreList()[i]);
-                            questionService.save(question);
-                        }
+                }
+            } else {
+                // simple update
+                List<Double> intervalScores = buildDoubleList(intervalScoreList);
+                List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                        examId, subjectCode, false, number);
+                if (intervalScores.size() == questionList.size()) {
+                    for (int i = 0; i < questionList.size(); i++) {
+                        ExamQuestion q = questionList.get(i);
+                        q.setIntervalScore(intervalScores.get(i));
+                        questionService.save(q);
                     }
                 }
             }
@@ -415,9 +452,17 @@ public class MarkGroupController extends BaseExamController {
             List<PictureConfigItem> picConfigList = JSONArray.toList(array, new PictureConfigItem(), new JsonConfig());
             // build questionDetail
             questionDetail = StringEscapeUtils.unescapeHtml(questionDetail);
-            array = JSONArray.fromObject(picList);
+            array = JSONArray.fromObject(questionDetail);
             List<ExamQuestionDTO> detailList = JSONArray.toList(array, new ExamQuestionDTO(), new JsonConfig());
-
+            for (int i = 0; i < detailList.size(); i++) {
+                ExamQuestionDTO dto = detailList.get(i);
+                Object o[] = array.getJSONObject(i).getJSONArray("scoreList").toArray();
+                List<Double> scoreList = new ArrayList<Double>();
+                for (int j = 0; j < o.length; j++) {
+                    scoreList.add(Double.parseDouble(o[j].toString()));
+                }
+                dto.setScoreList(scoreList);
+            }
             if (picConfigList != null && detailList != null && picConfigList.size() > 0 && detailList.size() > 0) {
                 for (ExamQuestionDTO detail : detailList) {
                     if (questionService.countByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false,
@@ -515,4 +560,25 @@ public class MarkGroupController extends BaseExamController {
         group.setTotalScore(totalScore);
         return list;
     }
+
+    private List<Double> buildDoubleList(String content) {
+        List<Double> list = new ArrayList<Double>();
+        content = StringUtils.trimToNull(content);
+        if (content != null) {
+            String[] values = StringUtils.split(content, ",");
+            if (values != null) {
+                for (String value : values) {
+                    try {
+                        Double number = Double.valueOf(value);
+                        if (number != null) {
+                            list.add(number);
+                        }
+                    } catch (Exception e) {
+                        continue;
+                    }
+                }
+            }
+        }
+        return list;
+    }
 }

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

@@ -34,6 +34,7 @@ import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.model.MarkerDTO;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
@@ -80,6 +81,9 @@ public class MarkerController extends BaseExamController {
     
     @Autowired
     private ExamStudentService studentService;
+    
+    @Autowired
+    private ExamQuestionService questionService; 
 
     @Value("${marker.showBtnImportAndBtnUpdateImport}")
     private String showBtnImport;
@@ -94,7 +98,10 @@ public class MarkerController extends BaseExamController {
         query = markerService.findByQuery(query);
         for (Marker marker : query.getResult()) {
             marker.setSubject(subjectService.find(marker.getExamId(), marker.getSubjectCode()));
-            marker.setGroup(groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber()));
+            MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, marker.getSubjectCode(),
+                    false, group.getNumber()));
+            marker.setGroup(group);
             marker.setMarkedCount(markService.markedCount(marker));
             marker.setCurrentCount(markService.applyCount(marker));
         }
@@ -374,6 +381,7 @@ public class MarkerController extends BaseExamController {
                 marker.setExamId(examId);
                 marker.setName(marker.getLoginName());
                 marker.setEnable(true);
+                marker.setClassCount(0);
                 if (StringUtils.isBlank(marker.getPassword())) {
                     Random random = new Random();
                     for (int i = 0; i < 6; i++) {

+ 18 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.text.DecimalFormat;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -275,6 +276,23 @@ public class ScoreController extends BaseExamController {
         }
         return obj;
     }
+    
+    @RequestMapping("/getProcess")
+    @ResponseBody
+    public JSONObject getProcess(HttpServletRequest request) {
+        int examId = getSessionExamId(request);
+        Exam exam = examService.findById(examId);
+        boolean running = lockService.isLocked(LockType.SCORE_CALCULATE, examId);
+        JSONObject obj = new JSONObject();
+        obj.accumulate("running", running);
+        if(exam.getProcess()!=null){
+            DecimalFormat format = new DecimalFormat("##.##");
+            obj.accumulate("process", format.format(exam.getProcess()*100));
+        }else{
+            obj.accumulate("process", 0);
+        }
+        return obj;
+    }
 
     private List<ScoreItem> buildScoreList(ExamStudent student) {
         List<ScoreItem> scoreList = new LinkedList<ScoreItem>();

+ 7 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ScoreCalculateThread.java

@@ -86,6 +86,7 @@ public class ScoreCalculateThread implements Runnable {
             reportService.deleteData(examId);
             context = new ReportContext(exam);
             // checkStudentService.deleteByExamId(examId);
+            long totalCount = studentService.countByExamId(examId);
 
             int pageNumber = 1;
             int pageSize = 1000;
@@ -97,6 +98,11 @@ public class ScoreCalculateThread implements Runnable {
                     // 后统计
                     statistic(student);
                 }
+                double process = pageSize * pageNumber * 1.0 / totalCount;
+                if (process >= 100) {
+                    process = 99;
+                }
+                examService.updateProcess(examId, process);
                 pageNumber++;
                 list = studentService.findByExamId(examId, pageNumber, pageSize);
             }
@@ -118,6 +124,7 @@ public class ScoreCalculateThread implements Runnable {
             context.save();
             // 统分结束修改标记
             examService.updateNeedCalculate(examId, false);
+            examService.updateProcess(examId, null);
         } catch (Exception e) {
             log.error("calculate exception for examId=" + examId, e);
         } finally {

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

@@ -31,7 +31,6 @@
 				}else{
 					$(".doubleDiv").hide();
 				}
-
 			});
 		});
 	</script>
@@ -43,24 +42,28 @@
 	<form:form id="inputForm" modelAttribute="group" action="${ctx}/admin/exam/group/insert" method="post" class="form-horizontal">
 		<tags:message content="${message}"/>
 		<form:hidden path="subjectCode"/>
-        <div class="control-group">
-            <label class="control-label">题号</label>
+		<input type="hidden" id="questionDetail" name="questionDetail" />
+		<div class="control-group">
+            <label class="control-label">序号</label>
             <div class="controls">
                 <form:input path="number" htmlEscape="false" maxlength="10" min="1" class="required digits"/>
             </div>
         </div>
-		<div class="control-group">
-			<label class="control-label">名称</label>
-			<div class="controls">
-				<form:input path="title" htmlEscape="false" maxlength="30" class="required"/>
-			</div>
-		</div>
+        <div id="questionDiv">
         <div class="control-group">
-            <label class="control-label">步骤分</label>
+            <label class="control-label">大题</label>
             <div class="controls">
-                <form:input path="scoreList" htmlEscape="false" maxlength="100" class="required"/>
+                <input name="mainNumber" type ="number" htmlEscape="false" maxlength="10" min="1" class="required digits" placeholder="大题号"/>
+                <input name="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required" placeholder="名称"/>
+                <input name="scoreList" type="text" htmlEscape="false" maxlength="100" class="required" placeholder="步骤分"/>
             </div>
         </div>
+        </div>
+        <div class="control-group">
+        	<div class="controls">
+        	<input type="button" value="增加大题" id="quetion-add">
+        	</div>
+        </div>
         <div class="control-group">
             <label class="control-label">试评数量</label>
             <div class="controls">
@@ -123,9 +126,50 @@
 			</div>
 		</div>
         <div class="form-actions">
-            <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>&nbsp;
-            <input id="btnCancel" class="btn" type="button" value="返 回" onclick="history.go(-1)"/>
+            <a id="btnSubmit" href="##" class="btn btn-primary">保 存</a>&nbsp;
+            <a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}" class="btn">返回</a>
         </div>
 	</form:form>
+<script type="text/javascript">
+$("#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);
+});
+
+function questionDelete(obj){
+$(obj).parent().parent().remove();
+}
+$('#btnSubmit').click(function(){
+	var questionDetail = [];
+	var fill = true;
+	$("#questionDiv div div").each(function(){
+		var question = []
+		$(this).children("input").each(function(){
+			var q = $(this).val();
+	        if(q==''){
+	            fill = false;
+	        }
+			question.push(q);
+		});
+		var detail = {
+				mainNumber:question[0],
+				mainTitle:question[1],
+				scoreList:question[2].split(",")
+		};
+	    questionDetail.push(detail);
+	});
+	 if(fill){
+		$('#questionDetail').val(JSON.stringify(questionDetail));
+	    $('#inputForm').submit();
+	 }else{
+		 alert('大题不能为空');
+	 }
+});
+</script>
 </body>
 </html>

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

@@ -53,23 +53,39 @@
 	<ul class="nav nav-tabs">
 		<li><a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}">大题列表</a></li>
 		<li><a href="${ctx}/admin/exam/group/edit-simple?subjectCode=${group.subjectCode}&number=${group.number}">简要修改</a></li>
-		<li class="active"><a href="##">详细修改</a></li>
+		<li class="active"><a href="##">重置修改</a></li>
 	</ul><br/>
 	<form:form id="inputForm" modelAttribute="group" action="${ctx}/admin/exam/group/save" method="post" class="form-horizontal">
 		<tags:message content="${message}"/>
 		<form:hidden path="subjectCode"/>
+		<input type="hidden" id="rest" name="reset" value="true"/>
+		<input type="hidden" id="questionDetail" name="questionDetail" />
         <div class="control-group">
-            <label class="control-label">题号</label>
+            <label class="control-label">分组序号</label>
             <div class="controls">
                 <form:input path="number" htmlEscape="false" maxlength="10" class="required" readonly="true"/>
             </div>
         </div>
-		<div class="control-group">
-			<label class="control-label">名称</label>
-			<div class="controls">
-				<form:input path="title" htmlEscape="false" maxlength="30" class="required"/>
-			</div>
-		</div>
+        <div id="questionDiv">
+	        <c:forEach items="${questionList}" var="question" varStatus="questionStatus">
+	        <div class="control-group">
+	            <label class="control-label">大题</label>
+	            <div class="controls">
+	                <input name="mainNumber" type ="number" htmlEscape="false" maxlength="10" min="1" class="required digits" placeholder="大题号" value="${question.mainNumber }"/>
+	                <input name="mainTitle" type="text" htmlEscape="false" maxlength="30" class="required" placeholder="名称" value="${question.title }"/>
+	                <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>
+	            </div>
+	        </div>
+	        </c:forEach>
+        </div>
+        <div class="control-group">
+        	<div class="controls">
+        	<input type="button" value="增加大题" id="quetion-add">
+        	</div>
+        </div>
 		<c:if test="${group.status.value==1}">
         <div class="control-group">
             <label class="control-label">试评数量</label>
@@ -78,12 +94,6 @@
             </div>
         </div>
         </c:if>
-        <div class="control-group">
-            <label class="control-label">步骤分</label>
-            <div class="controls">
-                <form:input path="scoreList" htmlEscape="false" maxlength="100" class="required"/>
-            </div>
-        </div>
         <div class="control-group">
             <label class="control-label">评卷模式</label>
             <div class="controls">
@@ -145,9 +155,51 @@
             </div>
         </div>
         <div class="form-actions">
-            <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>&nbsp;
-            <input id="btnCancel" class="btn" type="button" value="返 回" onclick="history.go(-1)"/>
+            <a id="btnSubmit" href="##" class="btn btn-primary">保 存</a>&nbsp;
+            <a id="btnCancel" href="##" class="btn" onclick="history.go(-1)">返 回</a>
         </div>
 	</form:form>
+<script type="text/javascript">
+$("#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);
+});
+
+function questionDelete(obj){
+$(obj).parent().parent().remove();
+}
+$('#btnSubmit').click(function(){
+	var questionDetail = [];
+	var fill = true;
+	$("#questionDiv div div").each(function(){
+		debugger;
+		var question = []
+		$(this).children("input").each(function(){
+			var q = $(this).val();
+	        if(q==''){
+	            fill = false;
+	        }
+			question.push(q);
+		});
+		var detail = {
+				mainNumber:question[0],
+				mainTitle:question[1],
+				scoreList:question[2].split(",")
+		};
+	    questionDetail.push(detail);
+	});
+	 if(fill){
+		$('#questionDetail').val(JSON.stringify(questionDetail));
+	    $('#inputForm').submit();
+	 }else{
+		 alert('大题不能为空');
+	 }
+});
+</script>
 </body>
 </html>

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

@@ -29,13 +29,14 @@
 			var openDouble = "${group.doubleRate}";
 			if(openDouble!=null&&openDouble>0){
 				$("#openDouble").attr("checked","checked");
-				$(".doubleDiv").show();
 				$("#openDouble").attr("disabled","disabled");
+				$(".doubleDiv").show();
 			}else{
 				$(".doubleDiv").hide();
 				$("#doubleRate").value = null;
 				$("#arbitrateThreshold").value = null;
 			}
+			
 			$("#openDouble").change(function() { 
 				if ($("#openDouble").is(':checked')){
 					$(".doubleDiv").show();
@@ -59,11 +60,12 @@
 		<tags:message content="${message}"/>
 		<form:hidden path="subjectCode"/>
 		<form:hidden path="number"/>
+		<input type="hidden" id="rest" name="reset" value="false"/>
 		<input type="hidden" id="intervalScoreList" name="intervalScoreList" value=""/>
 		<div class="control-group">
 			<label class="control-label">名称</label>
 			<div class="controls">
-				<form:input path="title" htmlEscape="false" maxlength="30" class="required"/>
+				<form:input path="title" htmlEscape="false" class="required" readonly="true"/>
 			</div>
 		</div>
 		<c:if test="${group.status.value==1}">

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

@@ -39,6 +39,7 @@
 	<table id="contentTable" class="table table-striped table-bordered table-condensed">
 		<thead>
 			<tr>
+				<th>序号</th>
 			    <th>大题号</th>
 				<th>大题名称</th>
 				<th>步骤分</th>
@@ -55,7 +56,8 @@
 		<tbody>
 		<c:forEach items="${resultList}" var="result">
 			<tr>
-			    <td>${result.number}</td>
+				<td>${result.number}</td>
+			    <td>${result.mainNumber}</td>
 				<td>${result.title}</td>
 				<td>${result.scoreList}</td>
                 <td>

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

@@ -67,7 +67,7 @@
 			<a href="${ctx}/admin/exam/score/calculate" class="btn">重新统分</a>
 			</c:if>
 			<c:if test="${running==true}">
-			<a href="javascript:void(0)" class="btn" disabled>正在统分</a>
+			<a href="javascript:void(0)" class="btn" id="exam-process" disabled >正在统分</a>
 			</c:if>
 			</c:if>
 		</div>
@@ -195,6 +195,8 @@ $(document).ready(function() {
     	initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
     	return false;
     });
+    
+    var timer = setInterval(function(){getExamProcess(timer)},5000);
 });
 function page(n,s){
 	$("#pageNumber").val(n);
@@ -244,6 +246,20 @@ $('#subject-select').change(function(){
         }
     });
 });
+function getExamProcess(timer){
+	var running = "${running}";
+	if(running){
+		$.post('${ctx}/admin/exam/score/getProcess', function(result){
+			if(result.running){
+				$("#exam-process").html("正在统分: "+result.process+"%");
+			}
+	    });
+	}else{
+		window.clearInterval(clock);
+	}
+	
+}
+
 </script>	
 </body>
 </html>