1
0
Эх сурвалжийг харах

修复一些问题,大题改名分组,新增信息隐藏功能

ting.yin 4 жил өмнө
parent
commit
e3fb935a26
40 өөрчлөгдсөн 493 нэмэгдсэн , 311 устгасан
  1. 5 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java
  2. 15 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java
  3. 3 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java
  4. 2 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkerService.java
  5. 9 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java
  6. 4 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkerServiceImpl.java
  7. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java
  8. 7 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectModule.java
  9. 32 23
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java
  10. 129 32
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java
  11. 40 44
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  12. 19 17
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java
  13. 2 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreCheckController.java
  14. 54 87
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java
  15. 15 15
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StudentController.java
  16. 0 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/HttpUtil.java
  17. 6 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/SessionExamUtils.java
  18. 21 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/SubjectLibraryVO.java
  19. 13 19
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  20. 4 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateList.jsp
  21. 6 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examEdit.jsp
  22. 6 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examForm.jsp
  23. 1 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examIndex.jsp
  24. 3 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupAdd.jsp
  25. 5 5
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditFull.jsp
  26. 2 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupEditSimple.jsp
  27. 6 5
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupList.jsp
  28. 5 4
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/libraryList.jsp
  29. 30 6
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/markInfo.jsp
  30. 4 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/markerList.jsp
  31. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/problemHistory.jsp
  32. 7 6
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityList.jsp
  33. 23 9
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreList.jsp
  34. 3 2
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/trialList.jsp
  35. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectClass.jsp
  36. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectCollege.jsp
  37. 3 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectGroup.jsp
  38. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectQuestion.jsp
  39. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectRange.jsp
  40. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectTeacher.jsp

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

@@ -38,5 +38,9 @@ public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaS
 
     @Query(value = "select * from eb_exam e where e.id in (select m.exam_id from eb_marker m where m.user_id=?1) and e.create_time >?2 "
             + "order by e.id", nativeQuery = true)
-    public List<Exam> findByUserId(Integer id, Date time);
+    public List<Exam> findByMarkerUserId(Integer userId, Date time);
+
+    @Query(value = "select * from eb_exam e where e.id in (select s.exam_id from eb_exam_subject s where s.code in (select su.subject_code from eb_subject_user su where su.user_id=?1) )"
+            + "order by e.id", nativeQuery = true)
+    public List<Exam> findBySubjectHeaderUserId(Integer userId);
 }

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

@@ -94,6 +94,12 @@ public class Exam implements Serializable {
     @Column(name = "card_type", length = 16, nullable = true)
     private FormatType cardType;
 
+    /**
+     * 禁止管理员以外人查看考生个人信息
+     */
+    @Column(name = "forbidden_info", nullable = false)
+    private boolean forbiddenInfo;
+
     public Integer getId() {
         return id;
     }
@@ -249,4 +255,13 @@ public class Exam implements Serializable {
     public void setCardType(FormatType cardType) {
         this.cardType = cardType;
     }
+
+    public boolean isForbiddenInfo() {
+        return forbiddenInfo;
+    }
+
+    public void setForbiddenInfo(boolean forbiddenInfo) {
+        this.forbiddenInfo = forbiddenInfo;
+    }
+
 }

+ 3 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java

@@ -24,6 +24,8 @@ public interface ExamService {
 
     Exam findBySchoolAndCode(Integer schoolId, String code);
 
-    List<Exam> findByUserId(Integer id, Date time);
+    List<Exam> findByMarkerUserId(Integer userId, Date time);
+
+    List<Exam> findBySubjectHeaderUserId(Integer userId);
 
 }

+ 2 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkerService.java

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
 import java.util.List;
+import java.util.Set;
 
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
@@ -27,7 +28,7 @@ public interface MarkerService {
 
     long countByExamAndSubjectAndGroup(int examId, String subjectCode, int number);
 
-    List<Marker> getMarkCount(int examId, String subjectCode);
+    List<Marker> getMarkCount(int examId, Set<String> subjectCodes);
 
     List<Marker> findMode(String commo);
 

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

@@ -10,6 +10,7 @@ import cn.com.qmth.stmms.biz.mark.model.ProblemType;
 import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
+
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -21,6 +22,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+
 import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
@@ -122,8 +124,13 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
     }
 
     @Override
-    public List<Exam> findByUserId(Integer id, Date time) {
-        return examDao.findByUserId(id, time);
+    public List<Exam> findByMarkerUserId(Integer id, Date time) {
+        return examDao.findByMarkerUserId(id, time);
+    }
+
+    @Override
+    public List<Exam> findBySubjectHeaderUserId(Integer userId) {
+        return examDao.findBySubjectHeaderUserId(userId);
     }
 
 }

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

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.biz.exam.service.impl;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 
 import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
@@ -178,10 +179,10 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
     }
 
     @Override
-    public List<Marker> getMarkCount(int examId, String subjectCode) {
+    public List<Marker> getMarkCount(int examId, Set<String> subjectCodes) {
         List<Marker> list = new LinkedList<Marker>();
-        List<Object[]> result = libraryDao.countMarkerAndStatus(examId, subjectCode, LibraryStatus.MARKED,
-                LibraryStatus.INSPECTED);
+        List<Object[]> result = libraryDao.countMarkerAndStatusAndSubjectCodeIn(examId, subjectCodes,
+                LibraryStatus.MARKED, LibraryStatus.INSPECTED);
         if (result != null) {
             for (Object[] array : result) {
                 try {

+ 3 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java

@@ -87,6 +87,9 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     @Query("select f.markerId, count(f) as markerCount from MarkLibrary f where f.examId=?1 and f.status in (?2) group by f.markerId")
     List<Object[]> countMarkerAndStatus(Integer examId, LibraryStatus... status);
 
+    @Query("select f.markerId, count(f) as markerCount from MarkLibrary f where f.examId=?1 and f.subjectCode in (?2) and f.status in (?3) group by f.markerId")
+    List<Object[]> countMarkerAndStatusAndSubjectCodeIn(Integer examId, Set<String> codes, LibraryStatus... status);
+
     @Query("select f.markerId, count(f) as markerCount from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.status in (?3) group by f.markerId")
     List<Object[]> countMarkerAndStatus(Integer examId, String subjectCode, LibraryStatus... status);
 

+ 7 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectModule.java

@@ -108,6 +108,13 @@ public class SubjectModule implements Module {
             unit = new BaseCalculatorUnit();
             unit.passScore = context.getPassScore();
             unit.excellentScore = context.getExcellentScore();
+            ExamSubject subject = context.getSubject(key);
+            if (subject != null && subject.getPassScore() != null) {
+                unit.passScore = subject.getPassScore();
+            }
+            if (subject != null && subject.getExcellentScore() != null) {
+                unit.excellentScore = subject.getExcellentScore();
+            }
             units.put(key, unit);
         }
         return unit;

+ 32 - 23
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java

@@ -1,5 +1,27 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.util.ArrayList;
+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;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+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.servlet.mvc.support.RedirectAttributes;
+
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.admin.vo.ExamInfoVO;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
@@ -16,32 +38,12 @@ import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-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;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-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.servlet.mvc.support.RedirectAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-
-import java.util.ArrayList;
-import java.util.List;
 
 @Controller
 @RequestMapping("/admin/exam")
@@ -137,6 +139,7 @@ public class ExamController extends BaseExamController {
             oldExam.setDescription(exam.getDescription());
             oldExam.setStatus(exam.getStatus());
             oldExam.setForceSpecialTag(exam.isForceSpecialTag());
+            oldExam.setForbiddenInfo(exam.isForbiddenInfo());
             JSONObject sasConfig = new JSONObject();
             sasConfig.accumulate("passScore", passScore);
             sasConfig.accumulate("excellentScore", excellentScore);
@@ -236,8 +239,14 @@ public class ExamController extends BaseExamController {
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
     @RequestMapping(value = "/select")
     public String select(Model model, HttpServletRequest request) {
+        WebUser wu = RequestUtils.getWebUser(request);
         User user = RequestUtils.getWebUser(request).getUser();
-        List<Exam> examList = examService.findBySchoolIdAndStatus(user.getSchoolId());
+        List<Exam> examList = new ArrayList<Exam>();
+        if (wu.isSubjectHeader()) {
+            examList = examService.findBySubjectHeaderUserId(user.getId());
+        } else {
+            examList = examService.findBySchoolIdAndStatus(user.getSchoolId());
+        }
         model.addAttribute("examList", examList);
         SessionExamUtils.clearExamId(request);
         return "modules/exam/examSelect";
@@ -247,7 +256,7 @@ public class ExamController extends BaseExamController {
     @RequestMapping(value = "/select", method = RequestMethod.POST)
     public String selectExam(HttpServletRequest request, @RequestParam Integer examId) {
         Exam exam = examService.findById(examId);
-        SessionExamUtils.setExamId(request, examId, exam.getName());
+        SessionExamUtils.setExamId(request, examId, exam.getName(), exam.isForbiddenInfo());
         return "redirect:/admin/home";
     }
 }

+ 129 - 32
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java

@@ -1,36 +1,58 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+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.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
 import cn.com.qmth.stmms.admin.dto.MarkGroupDTO;
 import cn.com.qmth.stmms.admin.dto.MarkerInfoDTO;
+import cn.com.qmth.stmms.admin.thread.ScoreCalculateThread;
 import cn.com.qmth.stmms.admin.vo.SubjectLibraryVO;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.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.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.biz.report.service.ReportService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.text.DecimalFormat;
-import java.util.LinkedList;
-import java.util.List;
 
 @Controller("markInfoController")
 @RequestMapping("/admin/exam/mark")
@@ -53,6 +75,28 @@ public class MarkController extends BaseExamController {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private ReportService reportService;
+
+    @Qualifier("task-executor")
+    @Autowired
+    private AsyncTaskExecutor taskExecutor;
+
+    @Autowired
+    private LockService lockService;
+
+    @Autowired
+    private MarkService markService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private MarkLibraryService libraryService;
+
     /**
      * 评卷进度
      *
@@ -76,6 +120,16 @@ public class MarkController extends BaseExamController {
             vo.setSubject(subject);
             vo.setStudentCount(subject.getUploadCount());
             vo.setGroupCount(groupService.countByExamAndSubject(examId, subject.getCode()));
+            vo.setLocked(lockService.isLocked(LockType.SCORE_CALCULATE, examId, subject.getCode()));
+            MarkLibrarySearchQuery mQuery = new MarkLibrarySearchQuery();
+            mQuery.setExamId(examId);
+            mQuery.setSubjectCode(subject.getCode());
+            long libraryCount = libraryService.countByQuery(mQuery);
+            mQuery.addStatus(LibraryStatus.MARKED);
+            long markedCount = libraryService.countByQuery(mQuery);
+            String percent = libraryCount > 0 ? (new DecimalFormat("####.###").format(markedCount * 100.0
+                    / libraryCount) + "%") : "0%";
+            vo.setPercent(percent);
             list.add(vo);
         }
 
@@ -98,16 +152,20 @@ public class MarkController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         List<MarkGroupDTO> result = new LinkedList<MarkGroupDTO>();
-        List<MarkGroup> list =
-                // TODO - subjectheader check
-                //wu.isSubjectHeader() ? groupService.findByExamAndSubject(examId, wu.getUser().getSubjectCode()) :
-                groupService.findByExam(examId);
+        List<MarkGroup> list = new ArrayList<MarkGroup>();
+        if (wu.isSubjectHeader()) {
+            List<ExamSubject> examSubjects = getExamSubject(examId, wu);
+            for (ExamSubject examSubject : examSubjects) {
+                list.addAll(groupService.findByExamAndSubject(examId, examSubject.getCode()));
+            }
+        } else {
+            list.addAll(groupService.findByExam(examId));
+        }
         for (MarkGroup group : list) {
-            group.setMarkerCount(
-                    markerService.countByExamAndSubjectAndGroup(examId, group.getSubjectCode(), group.getNumber()));
-            group.setQuestionList(questionService
-                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, group.getSubjectCode(), false,
-                            group.getNumber()));
+            group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, group.getSubjectCode(),
+                    group.getNumber()));
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+                    group.getSubjectCode(), false, group.getNumber()));
             MarkGroupDTO dto = new MarkGroupDTO(subjectService.find(examId, group.getSubjectCode()), group);
             result.add(dto);
         }
@@ -129,18 +187,21 @@ public class MarkController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         List<MarkerInfoDTO> result = new LinkedList<MarkerInfoDTO>();
-        List<Marker> list =
-                // TODO - subjectHeader check
-                //wu.isSubjectHeader() ? markerService.getMarkCount(examId, wu.getUser().getSubjectCode()) :
-                markerService.getMarkCount(examId);
+        List<Marker> list = markerService.getMarkCount(examId);
+        if (wu.isSubjectHeader()) {
+            Set<String> subjectCodes = new HashSet<String>();
+            for (ExamSubject subject : getExamSubject(examId, wu)) {
+                subjectCodes.add(subject.getCode());
+            }
+            list = markerService.getMarkCount(examId, subjectCodes);
+        }
         for (Marker marker : list) {
             MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
-            group.setQuestionList(questionService
-                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, group.getSubjectCode(), false,
-                            group.getNumber()));
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+                    group.getSubjectCode(), false, group.getNumber()));
             marker.setUser(userService.findById(marker.getUserId()));
-            MarkerInfoDTO dto = new MarkerInfoDTO(marker,
-                    subjectService.find(marker.getExamId(), marker.getSubjectCode()), group);
+            MarkerInfoDTO dto = new MarkerInfoDTO(marker, subjectService.find(marker.getExamId(),
+                    marker.getSubjectCode()), group);
             result.add(dto);
         }
 
@@ -154,4 +215,40 @@ public class MarkController extends BaseExamController {
         }
     }
 
+    @Logging(menu = "科目统分", type = LogType.UPDATE)
+    @RequestMapping("/calculate")
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public ModelAndView calculate(HttpServletRequest request, RedirectAttributes redirectAttributes,
+            @RequestParam(required = false) String subjectCode) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        Exam exam = examService.findById(getSessionExamId(request));
+        if (exam == null || !exam.getSchoolId().equals(wu.getUser().getSchoolId())) {
+            addMessage(redirectAttributes, "请选择正确的考试");
+        } else {
+            Set<String> subjectSet = new HashSet<String>();
+            if (subjectCode == null) {
+                subjectSet = getCalculateSubjectCodes(exam.getId());
+            } else if (!lockService.isLocked(LockType.SCORE_CALCULATE, exam.getId(), subjectCode)) {
+                subjectSet.add(subjectCode);
+            }
+            if (!subjectSet.isEmpty()) {
+                ScoreCalculateThread thread = new ScoreCalculateThread(exam.getId(), subjectSet, lockService,
+                        studentService, questionService, markService, reportService, examService, subjectService,
+                        groupService);
+                taskExecutor.submit(thread);
+            }
+        }
+        return new ModelAndView("redirect:/admin/exam/mark");
+    }
+
+    private Set<String> getCalculateSubjectCodes(Integer examId) {
+        List<ExamSubject> list = subjectService.list(examId);
+        Set<String> set = new HashSet<>();
+        for (ExamSubject subject : list) {
+            if (!lockService.isLocked(LockType.SCORE_CALCULATE, subject.getExamId(), subject.getCode())) {
+                set.add(subject.getCode());
+            }
+        }
+        return set;
+    }
 }

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

@@ -70,32 +70,29 @@ public class MarkGroupController extends BaseExamController {
 
     @Logging(menu = "大题管理查询", type = LogType.QUERY)
     @RequestMapping
-    public String list(HttpServletRequest request, Model model, @RequestParam String subjectCode) {
+    public String list(HttpServletRequest request, Model model, @RequestParam(required = false) String subjectCode) {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        ExamSubject subject = subjectService.find(examId, subjectCode);
-        if (subject == null) {
-            return "redirect:/admin/exam/mark";
-        }
-        if (wu.isSubjectHeader()
-            //TODO - subjectHeader check
-            //&& !subjectCode.equals(wu.getUser().getSubjectCode())
-        ) {
-            return "redirect:/admin/exam/mark";
+        List<ExamSubject> subjectList = getExamSubject(examId, wu);
+        ExamSubject subject = null;
+        if (StringUtils.isNotBlank(subjectCode)) {
+            subject = subjectService.find(examId, subjectCode);
+        } else {
+            subject = subjectList.get(0);
         }
-        List<MarkGroup> list = groupService.findByExamAndSubject(examId, subjectCode);
+        List<MarkGroup> list = groupService.findByExamAndSubject(examId, subject.getCode());
         for (MarkGroup group : list) {
-            group.setQuestionList(questionService
-                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, group.getNumber()));
-            group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, subjectCode, group.getNumber()));
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subject.getCode(),
+                    false, group.getNumber()));
+            group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, subject.getCode(), group.getNumber()));
             group.setCurrentCount(markService.applyCount(group));
-            int percent =
-                    group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount()) : 0;
+            int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
+                    .getLibraryCount()) : 0;
             group.setPercent(percent);
         }
         model.addAttribute("resultList", list);
         model.addAttribute("subject", subject);
-        model.addAttribute("subjectList", getExamSubject(examId, wu));
+        model.addAttribute("subjectList", subjectList);
         Exam exam = examService.findById(examId);
         model.addAttribute("examType", exam.getType());
         return "modules/exam/groupList";
@@ -107,14 +104,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()));
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
+                    false, group.getNumber()));
             JSONObject obj = new JSONObject();
             obj.accumulate("number", group.getNumber());
             obj.accumulate("title", group.getTitle());
@@ -251,12 +247,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()));
+            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());
@@ -279,14 +276,13 @@ 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));
+                List<ExamQuestion> list = questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId,
+                        subjectCode, false, Integer.parseInt(mainNumber));
                 StringBuilder score = new StringBuilder();
                 DecimalFormat format = new DecimalFormat("####.###");
                 String title = "";
@@ -368,10 +364,10 @@ public class MarkGroupController extends BaseExamController {
                     questionDetail = StringEscapeUtils.unescapeHtml(questionDetail);
                     JSONArray array = JSONArray.fromObject(questionDetail);
                     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);
+                    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());
@@ -396,8 +392,8 @@ public class MarkGroupController extends BaseExamController {
                     }
                     if (detailList != null && detailList.size() > 0) {
                         ScorePolicy policy = scorePolicy != null ? ScorePolicy.findByValue(scorePolicy) : null;
-                        ThirdPolicy third =
-                                thirdPolicy != null ? ThirdPolicy.findByValue(thirdPolicy) : ThirdPolicy.DISABLE;
+                        ThirdPolicy third = thirdPolicy != null ? ThirdPolicy.findByValue(thirdPolicy)
+                                : ThirdPolicy.DISABLE;
                         try {
                             lockService.waitlock(LockType.GROUP, true, group.getExamId(), group.getSubjectCode(),
                                     group.getNumber());
@@ -413,8 +409,8 @@ public class MarkGroupController extends BaseExamController {
                 } else {
                     // simple update
                     List<Double> intervalScores = buildDoubleList(intervalScoreList);
-                    List<ExamQuestion> questionList = questionService
-                            .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
+                    List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                            examId, subjectCode, false, number);
                     if (intervalScores.size() == questionList.size()) {
                         for (int i = 0; i < questionList.size(); i++) {
                             ExamQuestion q = questionList.get(i);
@@ -529,8 +525,8 @@ public class MarkGroupController extends BaseExamController {
                     List<ExamQuestion> list = buildQuestionList(group, detailList);
                     questionService.save(list);
                     groupService.save(group);
-                    subjectService
-                            .updateScore(examId, subjectCode, false, groupService.sumTotalScore(examId, subjectCode));
+                    subjectService.updateScore(examId, subjectCode, false,
+                            groupService.sumTotalScore(examId, subjectCode));
                     redirectAttributes.addAttribute("subjectCode", subjectCode);
                     return "redirect:/admin/exam/group";
                 } else {

+ 19 - 17
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java

@@ -109,8 +109,13 @@ public class MarkQualityController extends BaseExamController {
         }
         if (query.getSubjectCode() != null && query.getGroupNumber() != null) {
             query = markerService.findByQuery(query);
-            model.addAttribute("running", lockService.isLocked(LockType.BATCH_QUALITY,
-                    getLockKey(examId, query.getSubjectCode(), query.getGroupNumber())));
+            model.addAttribute(
+                    "running",
+                    lockService.isLocked(LockType.BATCH_QUALITY,
+                            getLockKey(examId, query.getSubjectCode(), query.getGroupNumber())));
+            for (Marker marker : query.getResult()) {
+                marker.setUser(userService.findById(marker.getUserId()));
+            }
         }
         model.addAttribute("query", query);
         model.addAttribute("subjectList", subjectList);
@@ -127,8 +132,8 @@ public class MarkQualityController extends BaseExamController {
         if (group != null) {
             final String lockKey = getLockKey(examId, subjectCode, groupNumber);
             if (lockService.trylock(LockType.BATCH_QUALITY, lockKey)) {
-                taskExecutor.submit(new MarkQualityThread(
-                        markerService.findByExamAndSubjectAndGroup(examId, subjectCode, groupNumber), lockKey));
+                taskExecutor.submit(new MarkQualityThread(markerService.findByExamAndSubjectAndGroup(examId,
+                        subjectCode, groupNumber), lockKey));
             }
             redirectAttributes.addAttribute("groupNumber", groupNumber);
         }
@@ -149,12 +154,11 @@ public class MarkQualityController extends BaseExamController {
         if (group != null) {
             List<MarkerVO> list = new ArrayList<MarkerVO>();
             List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subjectCode, groupNumber);
-            List<Double> scores = libraryService
-                    .findScore(examId, subjectCode, groupNumber, LibraryStatus.MARKED, LibraryStatus.INSPECTED);
+            List<Double> scores = libraryService.findScore(examId, subjectCode, groupNumber, LibraryStatus.MARKED,
+                    LibraryStatus.INSPECTED);
             for (Marker marker : markers) {
-                List<Object[]> libraries = libraryService
-                        .findScoreCount(examId, subjectCode, groupNumber, marker.getId(), LibraryStatus.MARKED,
-                                LibraryStatus.INSPECTED);
+                List<Object[]> libraries = libraryService.findScoreCount(examId, subjectCode, groupNumber,
+                        marker.getId(), LibraryStatus.MARKED, LibraryStatus.INSPECTED);
                 Map<Double, Long> scoreCount = new HashMap<Double, Long>();
                 for (Object[] array : libraries) {
                     Double score = (Double) array[0];
@@ -169,8 +173,8 @@ public class MarkQualityController extends BaseExamController {
                 vo.setScoreCount(scoreCount);
                 list.add(vo);
             }
-            group.setQuestionList(questionService
-                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, group.getNumber()));
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
+                    false, group.getNumber()));
             model.addAttribute("scores", scores);
             model.addAttribute("markers", list);
             model.addAttribute("group", group);
@@ -189,9 +193,8 @@ public class MarkQualityController extends BaseExamController {
         List<MarkerVO> list = new ArrayList<MarkerVO>();
         List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subjectCode, groupNumber);
         for (Marker marker : markers) {
-            List<Object[]> libraries = libraryService
-                    .findScoreCount(examId, subjectCode, groupNumber, marker.getId(), LibraryStatus.MARKED,
-                            LibraryStatus.INSPECTED);
+            List<Object[]> libraries = libraryService.findScoreCount(examId, subjectCode, groupNumber, marker.getId(),
+                    LibraryStatus.MARKED, LibraryStatus.INSPECTED);
             MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
             query.setMarkerId(marker.getId());
             query.addStatus(LibraryStatus.MARKED);
@@ -286,9 +289,8 @@ public class MarkQualityController extends BaseExamController {
         } else if (group != null && group.getStatus() == MarkStatus.TRIAL) {
             // 试评查找给分历史记录
             List<TrialHistory> historyList = new ArrayList<TrialHistory>();
-            historyList = trialService
-                    .findHistory(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(), marker.getId(),
-                            pageNumber, pageSize, null, markerScore);
+            historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
+                    marker.getGroupNumber(), marker.getId(), pageNumber, pageSize, null, markerScore);
             for (TrialHistory history : historyList) {
                 TrialLibrary library = trialService.findLibrary(history.getLibraryId());
                 if (library != null) {

+ 2 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreCheckController.java

@@ -83,7 +83,6 @@ public class ScoreCheckController extends BaseExamController {
     @RequestMapping("/export")
     public String export(ExamQuestionSearchQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
-        WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         List<ExceptionQuestionDTO> list = new LinkedList<ExceptionQuestionDTO>();
         query.setExamId(examId);
@@ -94,8 +93,8 @@ public class ScoreCheckController extends BaseExamController {
         query = questionService.findByQuery(query);
         for (ExamQuestion question : query.getResult()) {
             if (question.getTotalScore() > 0) {
-                ExceptionQuestionDTO dto = new ExceptionQuestionDTO(question,
-                        subjectService.find(question.getExamId(), question.getSubjectCode()));
+                ExceptionQuestionDTO dto = new ExceptionQuestionDTO(question, subjectService.find(question.getExamId(),
+                        question.getSubjectCode()));
                 list.add(dto);
             }
         }

+ 54 - 87
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -1,41 +1,52 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
 import cn.com.qmth.stmms.admin.dto.ExamStudentDTO;
 import cn.com.qmth.stmms.admin.dto.ScoreEditDTO;
-import cn.com.qmth.stmms.admin.thread.ScoreCalculateThread;
 import cn.com.qmth.stmms.admin.utils.ExportStudentExcel;
-import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
+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.file.service.FileService;
-import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.biz.mark.service.MarkService;
-import cn.com.qmth.stmms.biz.report.service.ReportService;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-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.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-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
 @RequestMapping("/admin/exam/score")
@@ -56,22 +67,9 @@ public class ScoreController extends BaseExamController {
     @Autowired
     private MarkGroupService groupService;
 
-    @Qualifier("task-executor")
-    @Autowired
-    private AsyncTaskExecutor taskExecutor;
-
-    @Autowired
-    private LockService lockService;
-
     @Autowired
     private ExamService examService;
 
-    @Autowired
-    private MarkService markService;
-
-    @Autowired
-    private ReportService reportService;
-
     @Autowired
     private CheckStudentService checkStudentService;
 
@@ -99,8 +97,8 @@ public class ScoreController extends BaseExamController {
             buildPackageUrl(student);
             buildAnswerUrl(student);
         }
-        String exportMessage =
-                query.getSubjectCode() != null ? enableExport(query.getExamId(), query.getSubjectCode()) : null;
+        String exportMessage = query.getSubjectCode() != null ? enableExport(query.getExamId(), query.getSubjectCode())
+                : null;
         if (exportMessage != null) {
             view.addObject("exportMessage", exportMessage);
             view.addObject("enableExport", false);
@@ -171,26 +169,6 @@ public class ScoreController extends BaseExamController {
         return result;
     }
 
-    @Logging(menu = "重新统分", type = LogType.UPDATE)
-    @RequestMapping("/calculate")
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public ModelAndView calculate(HttpServletRequest request, RedirectAttributes redirectAttributes) {
-        WebUser wu = RequestUtils.getWebUser(request);
-        Exam exam = examService.findById(getSessionExamId(request));
-        if (exam == null || !exam.getSchoolId().equals(wu.getUser().getSchoolId())) {
-            addMessage(redirectAttributes, "请选择正确的考试");
-        } else {
-            Set<String> subjectSet = getCalculateSubjectCodes(exam.getId());
-            if (!subjectSet.isEmpty()) {
-                ScoreCalculateThread thread = new ScoreCalculateThread(exam.getId(), subjectSet, lockService,
-                        studentService, questionService, markService, reportService, examService, subjectService,
-                        groupService);
-                taskExecutor.submit(thread);
-            }
-        }
-        return new ModelAndView("redirect:/admin/exam/score");
-    }
-
     @Logging(menu = "导出成绩", type = LogType.EXPORT)
     @RequestMapping("/export")
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -203,21 +181,21 @@ public class ScoreController extends BaseExamController {
             return "redirect:/admin/exam/score";
         }
         Set<String> subjectSet = new HashSet<>();
-        //单科目导出
+        // 单科目导出
         if (query.getSubjectCode() != null) {
             String exportMessage = enableExport(query.getExamId(), query.getSubjectCode());
-            //判断不允许导出则直接返回
+            // 判断不允许导出则直接返回
             if (exportMessage != null) {
                 addMessage(redirectAttributes, "该科目不能导出成绩 " + exportMessage);
                 return "redirect:/admin/exam/score";
             }
             subjectSet.add(query.getSubjectCode());
         }
-        //全体科目导出
+        // 全体科目导出
         else {
             List<ExamSubject> list = subjectService.list(query.getExamId());
             for (ExamSubject subject : list) {
-                //遍历所有科目,判断是否允许导出
+                // 遍历所有科目,判断是否允许导出
                 if (enableExport(subject.getExamId(), subject.getCode()) == null) {
                     subjectSet.add(subject.getCode());
                 }
@@ -260,8 +238,8 @@ public class ScoreController extends BaseExamController {
 
     private List<String> getOptionHeader(int examId, String subjectCode, String paperType) {
         List<String> headerList = new ArrayList<String>();
-        List<ExamQuestion> oQuestions = questionService
-                .findByExamAndSubjectAndObjectiveAndPaperType(examId, subjectCode, true, paperType);
+        List<ExamQuestion> oQuestions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(examId,
+                subjectCode, true, paperType);
         List<ExamQuestion> sQestions = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false);
         for (ExamQuestion examQuestion : oQuestions) {
             headerList.add(getTitle(examQuestion) + "选项");
@@ -295,9 +273,8 @@ public class ScoreController extends BaseExamController {
     private List<ScoreItem> buildScoreList(ExamStudent student) {
         List<ScoreItem> scoreList = new LinkedList<ScoreItem>();
 
-        List<ExamQuestion> oList = questionService
-                .findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(), student.getSubjectCode(), true,
-                        student.getPaperType());
+        List<ExamQuestion> oList = questionService.findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(),
+                student.getSubjectCode(), true, student.getPaperType());
         List<ScoreItem> list1 = student.getScoreList(true);
         int index = 0;
         for (ExamQuestion question : oList) {
@@ -312,8 +289,8 @@ public class ScoreController extends BaseExamController {
         }
         scoreList.addAll(list1);
 
-        List<ExamQuestion> sList = questionService
-                .findByExamAndSubjectAndObjective(student.getExamId(), student.getSubjectCode(), false);
+        List<ExamQuestion> sList = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
+                student.getSubjectCode(), false);
         List<ScoreItem> list2 = student.getScoreList(false);
         index = 0;
         for (ExamQuestion question : sList) {
@@ -333,10 +310,11 @@ public class ScoreController extends BaseExamController {
 
     private void buildSheetUrl(ExamStudent student) {
         // 改为内部原图浏览地址,直接附带标记内容
-        //student.setSheetUrls(PictureUrlBuilder
-        //        .getInnerSheetUrls(student.getExamId(), student.getExamNumber(), student.getSheetCount()));
-        student.setSheetUrls(
-                fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
+        // student.setSheetUrls(PictureUrlBuilder
+        // .getInnerSheetUrls(student.getExamId(), student.getExamNumber(),
+        // student.getSheetCount()));
+        student.setSheetUrls(fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1,
+                student.getSheetCount()));
     }
 
     private void buildPackageUrl(ExamStudent student) {
@@ -351,8 +329,8 @@ public class ScoreController extends BaseExamController {
     private void buildAnswerUrl(ExamStudent student) {
         ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
         if (subject != null && subject.getAnswerFileType() != null) {
-            student.setAnswerUrl(
-                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
+            student.setAnswerUrl(fileService.getAnswerUri(subject.getExamId(), subject.getCode(),
+                    subject.getAnswerFileType()));
         }
         if (subject != null) {
             student.setSubjectRemark(StringUtils.trimToEmpty(subject.getRemark()));
@@ -365,8 +343,8 @@ public class ScoreController extends BaseExamController {
             return "该科目需要统分";
         }
 
-        List<MarkGroup> groups = groupService
-                .findByExamAndSubjectAndStatus(examId, subjectCode, MarkStatus.FORMAL, MarkStatus.TRIAL);
+        List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subjectCode, MarkStatus.FORMAL,
+                MarkStatus.TRIAL);
         if (groups != null && !groups.isEmpty()) {
             return subjectCode + "评卷未完成";
         }
@@ -386,15 +364,4 @@ public class ScoreController extends BaseExamController {
         return null;
     }
 
-    private Set<String> getCalculateSubjectCodes(Integer examId) {
-        List<ExamSubject> list = subjectService.list(examId);
-        Set<String> set = new HashSet<>();
-        for (ExamSubject subject : list) {
-            if (!lockService.isLocked(LockType.SCORE_CALCULATE, subject.getExamId(), subject.getCode())) {
-                set.add(subject.getCode());
-            }
-        }
-        return set;
-    }
-
 }

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

@@ -207,8 +207,11 @@ public class StudentController extends BaseExamController {
         if (student != null) {
             studentService.deleteById(id);
             markService.deleteByStudent(student);
-            subjectService.updateUploadCount(student.getExamId(), student.getSubjectCode(), (int) studentService
-                    .countUploadedByExamIdAndSubjectCode(student.getExamId(), student.getSubjectCode()));
+            subjectService.updateUploadCount(
+                    student.getExamId(),
+                    student.getSubjectCode(),
+                    (int) studentService.countUploadedByExamIdAndSubjectCode(student.getExamId(),
+                            student.getSubjectCode()));
             addMessage(redirectAttributes, "删除考生成功");
             RequestUtils.setLog(request, "删除成功,id:" + id);
         } else {
@@ -257,10 +260,11 @@ public class StudentController extends BaseExamController {
 
             for (ExamStudent student : list) {
                 if (StringUtils.isBlank(student.getExamNumber()) || StringUtils.isBlank(student.getName())
-                        || StringUtils.isBlank(student.getSubjectCode()) || StringUtils
-                        .isBlank(student.getSubjectName()) || StringUtils.isBlank(student.getCampusName())
-                        || StringUtils.isBlank(student.getCollege()) || StringUtils.isBlank(student.getClassName())
-                        || StringUtils.isBlank(student.getTeacher()) || StringUtils.isBlank(student.getStudentCode())) {
+                        || StringUtils.isBlank(student.getSubjectCode())
+                        || StringUtils.isBlank(student.getSubjectName())
+                        || StringUtils.isBlank(student.getCampusName()) || StringUtils.isBlank(student.getCollege())
+                        || StringUtils.isBlank(student.getClassName()) || StringUtils.isBlank(student.getTeacher())
+                        || StringUtils.isBlank(student.getStudentCode())) {
                     continue;
                 }
 
@@ -300,7 +304,6 @@ public class StudentController extends BaseExamController {
     @RequestMapping(value = "/export", method = RequestMethod.POST)
     public String exportFile(ExamStudentSearchQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
-        WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         try {
             query.setPageNumber(1);
@@ -352,8 +355,7 @@ public class StudentController extends BaseExamController {
 
     @Logging(menu = "导入缺考名单", type = LogType.IMPORT_FILE)
     @RequestMapping(value = "/absentImport", method = RequestMethod.POST)
-    public String absentImportFile(HttpServletRequest request, MultipartFile file,
-            RedirectAttributes redirectAttributes) {
+    public String absentImportFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
         try {
             int successNum = 0;
@@ -405,8 +407,7 @@ public class StudentController extends BaseExamController {
 
     @Logging(menu = "导入违纪名单", type = LogType.IMPORT_FILE)
     @RequestMapping(value = "/breachImport", method = RequestMethod.POST)
-    public String breachImportFile(HttpServletRequest request, MultipartFile file,
-            RedirectAttributes redirectAttributes) {
+    public String breachImportFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
         // Exam exam = examService.findById(examId);
         try {
@@ -480,8 +481,7 @@ public class StudentController extends BaseExamController {
     }
 
     @RequestMapping(value = "/uploadImport", method = RequestMethod.POST)
-    public String uploadImportFile(HttpServletRequest request, MultipartFile file,
-            RedirectAttributes redirectAttributes) {
+    public String uploadImportFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
         // Exam exam = examService.findById(examId);
         try {
@@ -556,8 +556,8 @@ public class StudentController extends BaseExamController {
     }
 
     private void buildSheetUrl(ExamStudent student) {
-        student.setSheetUrls(
-                fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
+        student.setSheetUrls(fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1,
+                student.getSheetCount()));
     }
 
     private void buildPackageUrl(ExamStudent student) {

+ 0 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/HttpUtil.java

@@ -11,9 +11,6 @@ import java.util.Map;
 
 import net.sf.json.JSONObject;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 public class HttpUtil {
 
     // private static Logger log = LoggerFactory.getLogger(HttpUtil.class);

+ 6 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/SessionExamUtils.java

@@ -11,6 +11,8 @@ public class SessionExamUtils {
 
     public static final String EXAM_NAME_KEY = "examName";
 
+    public static final String FORBIDDEN_INFO_KEY = "forbiddenInfo";
+
     public static int getExamId(HttpServletRequest request) {
         int examId = 0;
         try {
@@ -32,13 +34,16 @@ public class SessionExamUtils {
         StmmsSession session = RequestUtils.getSession(request);
         session.setParameter(EXAM_ID_KEY, null);
         session.setParameter(EXAM_NAME_KEY, null);
+        session.setParameter(FORBIDDEN_INFO_KEY, null);
         request.removeAttribute(EXAM_ID_KEY);
         request.removeAttribute(EXAM_NAME_KEY);
+        request.removeAttribute(FORBIDDEN_INFO_KEY);
     }
 
-    public static void setExamId(HttpServletRequest request, int examId, String name) {
+    public static void setExamId(HttpServletRequest request, int examId, String name, boolean forbiddenInfo) {
         StmmsSession session = RequestUtils.getSession(request);
         session.setParameter(EXAM_ID_KEY, String.valueOf(examId));
         session.setParameter(EXAM_NAME_KEY, name);
+        session.setParameter(FORBIDDEN_INFO_KEY, String.valueOf(forbiddenInfo));
     }
 }

+ 21 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/SubjectLibraryVO.java

@@ -10,6 +10,10 @@ public class SubjectLibraryVO {
 
     private long groupCount;
 
+    private boolean locked;
+
+    private String percent;
+
     public ExamSubject getSubject() {
         return subject;
     }
@@ -33,4 +37,21 @@ public class SubjectLibraryVO {
     public void setGroupCount(long groupCount) {
         this.groupCount = groupCount;
     }
+
+    public boolean isLocked() {
+        return locked;
+    }
+
+    public void setLocked(boolean locked) {
+        this.locked = locked;
+    }
+
+    public String getPercent() {
+        return percent;
+    }
+
+    public void setPercent(String percent) {
+        this.percent = percent;
+    }
+
 }

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

@@ -121,20 +121,19 @@ public class MarkController extends BaseController {
         Calendar rightNow = Calendar.getInstance();
         rightNow.setTime(new Date());
         rightNow.add(Calendar.YEAR, -1);
-        List<Exam> examList = examService.findByUserId(user.getId(), rightNow.getTime());
+        List<Exam> examList = examService.findByMarkerUserId(user.getId(), rightNow.getTime());
         modelAndView.addObject("examList", examList);
         return modelAndView;
     }
 
     @RequestMapping(value = "/subject-select", method = RequestMethod.POST)
-    public ModelAndView select(HttpServletRequest request, HttpServletResponse response,
-            @RequestParam Integer markerId) {
+    public ModelAndView select(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer markerId) {
         User user = RequestUtils.getWebUser(request).getUser();
         ModelAndView modelAndView = new ModelAndView("modules/mark/subjectSelectAp");
         Calendar rightNow = Calendar.getInstance();
         rightNow.setTime(new Date());
         rightNow.add(Calendar.YEAR, -1);
-        List<Exam> examList = examService.findByUserId(user.getId(), rightNow.getTime());
+        List<Exam> examList = examService.findByMarkerUserId(user.getId(), rightNow.getTime());
         modelAndView.addObject("examList", examList);
 
         Marker marker = markerService.findById(markerId);
@@ -153,7 +152,7 @@ public class MarkController extends BaseController {
         StmmsSession session = RequestUtils.getSession(request);
         session.saveWebUser(new WebUser(user, null, markerId.toString()));
         sessionService.put(request, response, session);
-        SessionExamUtils.setExamId(request, exam.getId(), exam.getName());
+        SessionExamUtils.setExamId(request, exam.getId(), exam.getName(), exam.isForbiddenInfo());
         return new ModelAndView("redirect:/mark/index");
     }
 
@@ -200,8 +199,7 @@ public class MarkController extends BaseController {
                 markerService.save(marker);
             }
         }
-        ModelAndView view = new ModelAndView(
-                mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
+        ModelAndView view = new ModelAndView(mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
         view.addObject("forceMode", forceMode);
         view.addObject("sheetView", group.isSheetView());
         view.addObject("enableAllZero", group.isEnableAllZero());
@@ -356,9 +354,8 @@ public class MarkController extends BaseController {
             List<MarkLibrary> list = new ArrayList<MarkLibrary>();
             // 需要判断评卷员是否绑定了班级
             long classCount = markerClassService.countByUserIdAndExamId(marker.getUserId(), marker.getExamId());
-            list = libraryService
-                    .findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(), marker.getId(),
-                            marker.getUserId(), classCount > 0, retry, 20);
+            list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
+                    marker.getId(), marker.getUserId(), classCount > 0, retry, 20);
             if (list.isEmpty()) {
                 break;
             }
@@ -379,9 +376,8 @@ public class MarkController extends BaseController {
         int retry = 1;
         Task task = null;
         while (task == null) {
-            List<TrialLibrary> list = trialService
-                    .findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
-                            marker.getId(), retry, 10);
+            List<TrialLibrary> list = trialService.findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(),
+                    marker.getGroupNumber(), marker.getId(), retry, 10);
             if (list.isEmpty()) {
                 break;
             }
@@ -475,13 +471,11 @@ public class MarkController extends BaseController {
             // 试评查找给分历史记录
             List<TrialHistory> historyList = new ArrayList<TrialHistory>();
             if (secretNumber != null) {
-                historyList = trialService
-                        .findHistory(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
-                                marker.getId(), secretNumber, pageNumber, pageSize, querySort);
+                historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
+                        marker.getGroupNumber(), marker.getId(), secretNumber, pageNumber, pageSize, querySort);
             } else {
-                historyList = trialService
-                        .findHistory(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
-                                marker.getId(), pageNumber, pageSize, querySort, null);
+                historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
+                        marker.getGroupNumber(), marker.getId(), pageNumber, pageSize, querySort, null);
             }
             for (TrialHistory history : historyList) {
                 TrialLibrary library = trialService.findLibrary(history.getLibraryId());

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

@@ -9,7 +9,8 @@
 </head>
 <body>
     <ul class="nav nav-tabs">
-        <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">大题管理</a></li>
+    	<li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
+        <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">分组管理</a></li>
         <li><a href="${ctx}/admin/exam/marker?subjectCode=${query.subjectCode}">评卷员管理</a></li>
         <li><a href="${ctx}/admin/exam/trial?subjectCode=${query.subjectCode}">试评管理</a></li>
         <li><a href="${ctx}/admin/exam/library?subjectCode=${query.subjectCode}">任务管理</a></li>
@@ -26,7 +27,7 @@
 				<option value="${item.code}" <c:if test="${item.code==query.subjectCode}">selected</c:if>>${item.code}-${item.name}</option>
 				</c:forEach>
 			</select>
-			<label>大题</label>
+			<label>分组</label>
             <select class="input-medium" id="group-select" name="groupNumber">
                 <c:forEach items="${groupList}" var="item">
                 <option value="${item.number}" <c:if test="${item.number==query.groupNumber}">selected</c:if>>${item.number}-${item.title}</option>
@@ -122,7 +123,7 @@ $('#batch-process-link').click(function(){
         return false;
     }
     if(groupNumber==undefined || groupNumber=='') {
-        alert('请选择大题')
+        alert('请选择分组')
         return false;
     }
     $('#batch-process-link').attr('href', '${ctx}/admin/exam/arbitrate/batchProcess?subjectCode='+subjectCode+'&groupNumber='+groupNumber);

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

@@ -67,6 +67,12 @@
             </div>
         </div>
     </c:if>
+	<div class="control-group">
+        <label class="control-label">禁止其他人查看考生信息</label>
+        <div class="controls">
+            <input name="forbiddenInfo" type="checkbox" <c:if test="${exam.forbiddenInfo}">checked</c:if>/>
+        </div>
+    </div>
     <div class="control-group">
         <label class="control-label">及格分</label>
         <div class="controls">

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

@@ -73,6 +73,12 @@
                 <input name="forceSpecialTag" type="checkbox" <c:if test="${exam.forceSpecialTag}">checked</c:if>/>
             </div>
         </div>
+    </div>
+	<div class="control-group">
+        <label class="control-label">禁止其他人查看考生信息</label>
+        <div class="controls">
+            <input name="forbiddenInfo" type="checkbox" <c:if test="${exam.forbiddenInfo}">checked</c:if>/>
+        </div>
     </div>
     <div class="control-group">
         <label class="control-label">及格分</label>

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

@@ -97,7 +97,7 @@
                         <script type="text/javascript">$('#themeSwitch').hide();</script><![endif]-->
                     </li>
                     <li class="dropdown">
-                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">考试:${examName}</a>
+                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">考试:${examId}-${examName}</a>
                         <ul class="dropdown-menu">
                             <li><a href="#" target="mainFrame" id="exam-select">返回选择考试</a></li>
                         </ul>
@@ -142,7 +142,6 @@
                                     </c:if>
                                     
                                     <c:if test="${web_user.subjectHeader==true}">
-                                        <li><a href="${ctx}/admin/exam/student" target="mainFrame"><i class="icon-user"></i><span data-i18n-text="index.student">考生管理</span></a></li>
                                         <li><a href="${ctx}/admin/exam/mark" target="mainFrame"><i class="icon-pencil"></i><span data-i18n-text="index.mark">评卷管理</span></a></li>
                                         <li><a href="${ctx}/admin/exam/score" target="mainFrame"><i class="icon-search"></i><span data-i18n-text="index.score">成绩查询</span></a></li>
                                         <li><a href="${ctx}/admin/exam/problem/history" target="mainFrame"><i class="icon-tag"></i><span data-i18n-text="index.problem">问题试卷</span></a></li>

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

@@ -2,7 +2,7 @@
 <%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-    <title>评卷大题新增</title>
+    <title>评卷分组新增</title>
     <meta name="decorator" content="default"/>
     <%@include file="/WEB-INF/views/include/head.jsp" %>
     <script type="text/javascript">
@@ -40,7 +40,7 @@
 </head>
 <body>
 <ul class="nav nav-tabs">
-    <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/insert" method="post"
@@ -56,7 +56,7 @@
     </div>
     <div id="questionDiv">
         <div class="control-group">
-            <label class="control-label">大题</label>
+            <label class="control-label">分组</label>
             <div class="controls">
                 <input name="mainNumber" type="number" htmlEscape="false" maxlength="10" min="1" class="required digits"
                        placeholder="大题号"/>

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

@@ -2,7 +2,7 @@
 <%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-    <title>评卷大题修改</title>
+    <title>评卷分组修改</title>
     <meta name="decorator" content="default"/>
     <%@include file="/WEB-INF/views/include/head.jsp" %>
     <script type="text/javascript">
@@ -53,7 +53,7 @@
 </head>
 <body>
 <ul class="nav nav-tabs">
-    <li><a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}">大题列表</a></li>
+    <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>
@@ -75,7 +75,7 @@
     <div id="questionDiv">
         <c:forEach items="${questionList}" var="question" varStatus="questionStatus">
             <div class="control-group">
-                <label class="control-label">大题</label>
+                <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 }"/>
@@ -186,7 +186,7 @@
     <div class="control-group">
         <label class="control-label">重要提示</label>
         <div class="controls">
-            <span class="label label-important"><h5>保存后大题关联所有评卷任务都将重置</h5></span>
+            <span class="label label-important"><h5>保存后分组关联所有评卷任务都将重置</h5></span>
         </div>
     </div>
     <div class="form-actions">
@@ -197,7 +197,7 @@
 </form:form>
 <script type="text/javascript">
     $("#quetion-add").click(function () {
-        var dom = '<div class="control-group"><label class="control-label">大题</label><div class="controls">\
+        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="步骤分"/>\

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

@@ -2,7 +2,7 @@
 <%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-    <title>评卷大题修改</title>
+    <title>评卷分组修改</title>
     <meta name="decorator" content="default"/>
     <%@include file="/WEB-INF/views/include/head.jsp" %>
     <script type="text/javascript">
@@ -54,7 +54,7 @@
 </head>
 <body>
 <ul class="nav nav-tabs">
-    <li><a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}">大题列表</a></li>
+    <li><a href="${ctx}/admin/exam/group?subjectCode=${group.subjectCode}">分组列表</a></li>
     <li class="active"><a href="##">简要修改</a></li>
     <li><a href="${ctx}/admin/exam/group/edit-full?subjectCode=${group.subjectCode}&number=${group.number}&">重置修改</a>
     </li>

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

@@ -2,14 +2,15 @@
 <%@ include file="/WEB-INF/views/include/taglib.jsp"%>
 <html>
 <head>
-	<title>评卷大题管理</title>
+	<title>评卷分组管理</title>
 	<meta name="decorator" content="default"/>
 	<%@include file="/WEB-INF/views/include/head.jsp" %>
 	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
 </head>
 <body>
     <ul class="nav nav-tabs">
-        <li class="active"><a href="##">大题管理</a></li>
+    	<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>
@@ -41,7 +42,7 @@
 	<table id="contentTable" class="table table-striped table-bordered table-condensed">
 		<thead>
 			<tr>
-				<th>序号</th>
+				<th>分组序号</th>
 			    <th>大题号</th>
 				<th>大题名称</th>
 				<th>步骤分</th>
@@ -118,11 +119,11 @@ function goSearch(){
 }
 $('.reset-button').click(function(){
 	var number = $(this).attr('data-number');
-	return confirm('确定要重置第'+number+'大题的评卷任务吗?');
+	return confirm('确定要重置第'+number+'分组的评卷任务吗?');
 });
 $('.delete-button').click(function(){
     var number = $(this).attr('data-number');
-    return confirm('确定要删除第'+number+'大题吗?相关评卷任务与评卷员都将一并删除!');
+    return confirm('确定要删除第'+number+'分组吗?相关评卷任务与评卷员都将一并删除!');
 });
 $('#statusButton').click(function(){
     return confirm('确定开始正评吗?');

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

@@ -12,7 +12,8 @@
 </head>
 <body>
 <ul class="nav nav-tabs">
-    <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">大题管理</a></li>
+	<li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
+    <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">分组管理</a></li>
     <li><a href="${ctx}/admin/exam/marker?subjectCode=${query.subjectCode}">评卷员管理</a></li>
     <li><a href="${ctx}/admin/exam/trial?subjectCode=${query.subjectCode}">试评管理</a></li>
     <li class="active"><a href="##">任务管理</a></li>
@@ -29,7 +30,7 @@
                 <option value="${item.code}" <c:if test="${item.code==query.subjectCode}">selected</c:if>>${item.code}-${item.name}</option>
             </c:forEach>
         </select>
-        <label>大题</label>
+        <label>分组</label>
         <select class="input-medium" id="group-select" name="groupNumber">
             <c:forEach items="${groupList}" var="item">
                 <option value="${item.number}" <c:if test="${item.number==query.groupNumber}">selected</c:if>>${item.number}-${item.title}</option>
@@ -63,9 +64,9 @@
         &nbsp;&nbsp;
         <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
         &nbsp;
-        <c:if test="${examType!='MULTI_MEDIA'}">
+     <%--    <c:if test="${examType!='MULTI_MEDIA'}">
             <a target="_blank" href="${ctx}/admin/exam/inspected/start?subjectCode=${query.subjectCode}&groupNumber=${query.groupNumber}" class="btn">待复核:${inspectedCount }</a>
-        </c:if>
+        </c:if> --%>
     </div>
 </form>
 <tags:message content="${message}"/>

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

@@ -8,6 +8,15 @@
 	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
 </head>
 <body>
+    <ul class="nav nav-tabs">
+        <li class="active"><a href="##">评卷进度</a></li>
+        <li><a href="${ctx}/admin/exam/group?subjectCode=${query.code}">分组管理</a></li>
+        <li><a href="${ctx}/admin/exam/marker?subjectCode=${query.code}">评卷员管理</a></li>
+        <li><a href="${ctx}/admin/exam/trial?subjectCode=${query.code}">试评管理</a></li>
+        <li><a href="${ctx}/admin/exam/library?subjectCode=${query.code}">任务管理</a></li>
+        <li><a href="${ctx}/admin/exam/arbitrate?subjectCode=${query.code}">仲裁管理</a></li>
+        <li><a href="${ctx}/admin/exam/quality?subjectCode=${query.code}">质量监控</a></li>
+    </ul>
 	<form id="searchForm" action="${ctx}/admin/exam/mark" method="post" class="breadcrumb form-search">
 		<input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
 		<input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
@@ -47,6 +56,9 @@
 			</div>
 			&nbsp;
 			<input id="btnProgress" class="btn" type="button" value="总进度:${percent}%"/>
+		<c:if test="${web_user.schoolAdmin}">
+            <a href="${ctx}/admin/exam/score/calculate" class="btn">重新统分</a>
+        </c:if>
 		</div>
 	</form>
 	<tags:message content="${message}"/>
@@ -56,21 +68,33 @@
 				<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>
-					<a href="${ctx}/admin/exam/group?subjectCode=${result.subject.code}">
-					${result.subject.code}-${result.subject.name}&nbsp;${result.subject.remark}</a>
-				</td>
+				<td>${result.subject.code}-${result.subject.name}&nbsp;${result.subject.remark}</td>
 				<td>${result.subject.uploadCount}</td>
 				<td>
 				    <fmt:formatNumber type="number" value="${result.subject.subjectiveScore}" pattern="###.#"/>
 				</td>
-				<td>${result.groupCount}</td>
+				<td><a href="${ctx}/admin/exam/group?subjectCode=${result.subject.code}">
+					${result.groupCount}</a>
+				</td>
+				<td>${result.percent}</td>
+				<td>
+					<c:if test="${result.locked}">正在统分</c:if>
+					<c:if test="${!result.locked}">正常</c:if>
+				</td>
+				<td>
+					<c:if test="${!result.locked}">
+					<a href="${ctx}/admin/exam/mark/calculate?subjectCode=${result.subject.code}">统分</a>
+					</c:if>
+				</td>
 			</tr>
 		</c:forEach>
 		</tbody>

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

@@ -93,7 +93,8 @@
 </head>
 <body>
 <ul class="nav nav-tabs">
-    <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">大题管理</a></li>
+	<li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
+    <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">分组管理</a></li>
     <li class="active"><a href="##">评卷员管理</a></li>
     <li><a href="${ctx}/admin/exam/trial?subjectCode=${query.subjectCode}">试评管理</a></li>
     <li><a href="${ctx}/admin/exam/library?subjectCode=${query.subjectCode}">任务管理</a></li>
@@ -130,7 +131,7 @@
                         <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
             </c:forEach>
         </select>
-        <label>大题</label>
+        <label>分组</label>
         <select class="input-medium" id="group-select" name="groupNumber">
         </select>
         <label>登录名</label>
@@ -151,7 +152,7 @@
     <thead>
     <tr>
         <th>科目</th>
-        <th>大题</th>
+        <th>分组</th>
         <th>登录名</th>
         <th>姓名</th>
         <th>状态</th>

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

@@ -22,7 +22,7 @@
                 <option value="${subject.code}" <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
             </c:forEach>
         </select>
-        <label>大题</label>
+        <label>分组</label>
         <select class="input-medium" id="group-select" name="groupNumber">
             <option value="0">请选择</option>
             <c:forEach items="${groupList}" var="item">

+ 7 - 6
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityList.jsp

@@ -9,7 +9,8 @@
 </head>
 <body>
     <ul class="nav nav-tabs">
-        <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">大题管理</a></li>
+		<li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
+        <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">分组管理</a></li>
         <li><a href="${ctx}/admin/exam/marker?subjectCode=${query.subjectCode}">评卷员管理</a></li>
         <li><a href="${ctx}/admin/exam/trial?subjectCode=${query.subjectCode}">试评管理</a></li>
         <li><a href="${ctx}/admin/exam/library?subjectCode=${query.subjectCode}">任务管理</a></li>
@@ -27,7 +28,7 @@
 				<option value="${subject.code}" <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
 				</c:forEach>
 			</select>
-			<label>大题</label>
+			<label>分组</label>
             <select class="input-medium" id="group-select" name="groupNumber">
             </select>
 			&nbsp;
@@ -61,8 +62,8 @@
 		<tbody>
 		<c:forEach items="${query.result}" var="marker">
 			<tr>
-				<td>${marker.loginName}</td>
-				<td>${marker.name}</td>
+				<td>${marker.user.loginName}</td>
+				<td>${marker.user.name}</td>
 				<td>${marker.finishCount}</td>
 				<td>${marker.validCount}</td>
 				<td>
@@ -107,7 +108,7 @@ $('#update-button').click(function(){
         return false;
     }
     if(groupNumber=='') {
-        alert('请选择大题');
+        alert('请选择分组');
         return false;
     }
     $(this).attr('href','${ctx}/admin/exam/quality/update?subjectCode='+subjectCode+'&groupNumber='+groupNumber);
@@ -121,7 +122,7 @@ $('#chart-button').click(function(){
         return false;
     }
     if(groupNumber=='') {
-        alert('请选择大题');
+        alert('请选择分组');
         return false;
     }
     $(this).attr('href','${ctx}/admin/exam/quality/chart?subjectCode='+subjectCode+'&groupNumber='+groupNumber);

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

@@ -72,9 +72,6 @@
             <input id="export-button" class="btn" type="button" value="导出" onclick="goExport()"
                    <c:if test="${!enableExport}">disabled</c:if> title="${exportMessage}"/>
         </c:if>
-        <c:if test="${web_user.schoolAdmin}">
-            <a href="${ctx}/admin/exam/score/calculate" class="btn">重新统分</a>
-        </c:if>
     </div>
 </form>
 <tags:message content="${message}"/>
@@ -100,13 +97,30 @@
     <c:forEach items="${query.result}" var="student">
         <tr>
             <td>
-                <c:if test="${examType=='MULTI_MEDIA'}">${student.examNumber}</c:if>
-                <c:if test="${examType!='MULTI_MEDIA'}">
-                    <a href="##" class="detail-link" data-exam-number="${student.examNumber}">${student.examNumber}</a>
-                </c:if>
+                   <%--  <a href="##" class="detail-link" data-exam-number="${student.examNumber}">${student.examNumber}</a> --%>
+	            <c:if test="${web_user.subjectHeader==true && forbiddenInfo==true}">
+	            ${fn:substring(student.examNumber,0,1)}***
+	            </c:if>
+	            <c:if test="${web_user.schoolAdmin==true || forbiddenInfo==false}">
+	            ${student.examNumber}
+	            </c:if>
+            </td>
+            <td>
+	            <c:if test="${web_user.subjectHeader==true && forbiddenInfo==true}">
+	            ${fn:substring(student.name,0,1)}**
+	            </c:if>
+	            <c:if test="${web_user.schoolAdmin==true || forbiddenInfo==false}">
+	            ${student.name}
+	            </c:if>
+            </td>
+            <td>
+            	<c:if test="${web_user.subjectHeader==true && forbiddenInfo==true}">
+	            ${fn:substring(student.studentCode,0,1)}***
+	            </c:if>
+	            <c:if test="${web_user.schoolAdmin==true || forbiddenInfo==false}">
+	            ${student.studentCode}
+	            </c:if>
             </td>
-            <td>${student.name}</td>
-            <td>${student.studentCode}</td>
             <td>${student.subjectCode}-${student.subjectName}&nbsp;${student.subjectRemark}</td>
             <td>${student.subjectLevel}</td>
             <td>${student.subjectCategory}</td>

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

@@ -12,7 +12,8 @@
 </head>
 <body>
 <ul class="nav nav-tabs">
-    <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">大题管理</a></li>
+	<li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
+    <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">分组管理</a></li>
     <li><a href="${ctx}/admin/exam/marker?subjectCode=${query.subjectCode}">评卷员管理</a></li>
     <li class="active"><a href="##">试评管理</a></li>
     <li><a href="${ctx}/admin/exam/library?subjectCode=${query.subjectCode}">任务管理</a></li>
@@ -29,7 +30,7 @@
                 <option value="${item.code}" <c:if test="${item.code==query.subjectCode}">selected</c:if>>${item.code}-${item.name}</option>
             </c:forEach>
         </select>
-        <label>大题</label>
+        <label>分组</label>
         <select class="input-medium" id="group-select" name="groupNumber">
             <c:forEach items="${groupList}" var="item">
                 <option value="${item.number}" <c:if test="${item.number==query.groupNumber}">selected</c:if>>${item.number}-${item.title}</option>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectClass.jsp

@@ -23,7 +23,7 @@
     </li>
     <li><a href="${ctx}/admin/exam/reportSubjectQuestion?subjectCode=${query.subjectCode}&objective=false" data-i18n-text="report.question.subjective">主观题分析</a>
     </li>
-    <li><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">大题统计分析</a></li>
+    <li><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">分组统计分析</a></li>
 </ul>
 <form id="searchForm" action="${ctx}/admin/exam/reportSubjectClass" method="post" class="breadcrumb form-search">
 	    <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectCollege.jsp

@@ -25,7 +25,7 @@
     </li>
     <li><a href="${ctx}/admin/exam/reportSubjectQuestion?subjectCode=${query.subjectCode}&objective=false" data-i18n-text="report.question.subjective">主观题分析</a>
     </li>
-    <li><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">大题统计分析</a></li>
+    <li><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">分组统计分析</a></li>
 </ul>
 <form id="searchForm" action="${ctx}/admin/exam/reportSubjectCollege" method="post" class="breadcrumb form-search">
 	    <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>

+ 3 - 3
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectGroup.jsp

@@ -24,7 +24,7 @@
     </li>
     <li><a href="${ctx}/admin/exam/reportSubjectQuestion?subjectCode=${query.subjectCode}&objective=false" data-i18n-text="report.question.subjective">主观题分析</a>
     </li>
-    <li class="active"><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">大题统计分析</a></li>
+    <li class="active"><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">分组统计分析</a></li>
 </ul>
 <form id="searchForm" action="${ctx}/admin/exam/reportSubjectGroup" method="post" class="breadcrumb form-search">
     <div>
@@ -50,8 +50,8 @@
 <table id="contentTable" class="table table-striped table-bordered table-condensed">
     <thead>
     <tr>
-        <th data-i18n-text="report.group.name">大题</th>
-        <th data-i18n-text="report.group.number">号</th>
+        <th data-i18n-text="report.group.name">分组</th>
+        <th data-i18n-text="report.group.number">号</th>
         <th data-i18n-text="report.group.totalScore">满分</th>
         <th data-i18n-text="report.group.maxScore">最高分</th>
         <th data-i18n-text="report.group.minScore">最低分</th>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectQuestion.jsp

@@ -26,7 +26,7 @@
     <li id="subjectiveLi"><a
             href="${ctx}/admin/exam/reportSubjectQuestion?subjectCode=${query.subjectCode}&objective=false" data-i18n-text="report.question.subjective">主观题分析</a>
     </li>
-    <li><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">大题统计分析</a></li>
+    <li><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">分组统计分析</a></li>
 </ul>
 <form id="searchForm" action="${ctx}/admin/exam/reportSubjectQuestion" method="post" class="breadcrumb form-search">
     <input id="objective" name="objective" value="${query.objective}" type="hidden"/>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectRange.jsp

@@ -24,7 +24,7 @@
     </li>
     <li><a href="${ctx}/admin/exam/reportSubjectQuestion?subjectCode=${query.subjectCode}&objective=false" data-i18n-text="report.question.subjective">主观题分析</a>
     </li>
-    <li><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">大题统计分析</a></li>
+    <li><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">分组统计分析</a></li>
     <li class="active"><a href="${ctx}/admin/exam/reportSubjectRange">分段统计</a></li>
 </ul>
 <form id="searchForm" action="${ctx}/admin/exam/reportSubjectRange" method="post" class="breadcrumb form-search">

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectTeacher.jsp

@@ -23,7 +23,7 @@
     </li>
     <li><a href="${ctx}/admin/exam/reportSubjectQuestion?subjectCode=${query.subjectCode}&objective=false" data-i18n-text="report.question.subjective">主观题分析</a>
     </li>
-    <li><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">大题统计分析</a></li>
+    <li><a href="${ctx}/admin/exam/reportSubjectGroup?subjectCode=${query.subjectCode}" data-i18n-text="report.group">分组统计分析</a></li>
 </ul>
 <form id="searchForm" action="${ctx}/admin/exam/reportSubjectTeacher" method="post" class="breadcrumb form-search">
 	    <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>