1
0
Pārlūkot izejas kodu

去掉管理后台对于session中examId的必须限制;考生管理增加考试选择的支持;将考生新增与修改页面分开;

luoshi 4 gadi atpakaļ
vecāks
revīzija
4e12649afe
39 mainītis faili ar 1936 papildinājumiem un 1936 dzēšanām
  1. 4 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java
  2. 13 8
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  3. 6 15
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java
  4. 36 46
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java
  5. 21 51
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamSearchQuery.java
  6. 4 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java
  7. 8 5
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java
  8. 13 32
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java
  9. 61 73
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  10. 38 45
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java
  11. 18 28
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/BaseExamController.java
  12. 39 74
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java
  13. 0 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ImageCheckController.java
  14. 28 45
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java
  15. 25 26
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java
  16. 38 50
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java
  17. 0 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java
  18. 24 31
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java
  19. 150 155
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScanController.java
  20. 15 19
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreCheckController.java
  21. 47 59
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java
  22. 174 160
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StudentController.java
  23. 27 12
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SubjectController.java
  24. 38 56
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TrialController.java
  25. 0 43
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/interceptor/AdminExamInterceptor.java
  26. 11 13
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/log/OperationLogController.java
  27. 5 5
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/SessionExamUtils.java
  28. 10 17
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamInfoController.java
  29. 12 0
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java
  30. 9 16
      stmms-web/src/main/webapp/WEB-INF/spring-mvc.xml
  31. 108 103
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examEdit.jsp
  32. 105 102
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examForm.jsp
  33. 183 151
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examIndex.jsp
  34. 104 83
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examList.jsp
  35. 113 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentAdd.jsp
  36. 106 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentEdit.jsp
  37. 0 105
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentForm.jsp
  38. 313 271
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentList.jsp
  39. 30 30
      stmms-web/src/main/webapp/static/mark-new/js/modules/image-builder.js

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

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.biz.exam.dao;
 
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.ExamType;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -33,7 +34,9 @@ public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaS
     @Query("update Exam e set e.needCalculate=?2 where e.id=?1")
     public void updateNeedCalculate(Integer examId, boolean needCalculate);
 
-    public List<Exam> findBySchoolIdAndStatusOrderByIdDesc(Integer schoolId, ExamStatus status);
+    List<Exam> findBySchoolIdAndTypeAndStatusOrderByIdDesc(Integer schoolId, ExamType type, ExamStatus status);
+
+    List<Exam> findBySchoolIdAndStatusOrderByIdDesc(Integer schoolId, ExamStatus status);
 
     @Modifying
     @Query("update Exam e set e.process=?2 where e.id=?1")

+ 13 - 8
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -1,18 +1,17 @@
 package cn.com.qmth.stmms.biz.exam.dao;
 
-import java.util.Date;
-import java.util.List;
-
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.PagingAndSortingRepository;
 
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import java.util.Date;
+import java.util.List;
 
-public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent, Integer>,
-        JpaSpecificationExecutor<ExamStudent> {
+public interface ExamStudentDao
+        extends PagingAndSortingRepository<ExamStudent, Integer>, JpaSpecificationExecutor<ExamStudent> {
 
     public List<ExamStudent> findByExamId(int examId, Pageable pageable);
 
@@ -73,6 +72,10 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     @Query("update ExamStudent s set s.manualAbsent=?2 where s.id=?1")
     public void updateManualAbsent(int id, boolean manualAbsent);
 
+    @Modifying
+    @Query("update ExamStudent s set s.breach=?2 where s.id=?1")
+    public int updateBreach(int id, boolean breach);
+
     @Modifying
     @Query("update ExamStudent s set s.manualAbsent=?3 where s.examId=?1 and s.examNumber=?2")
     public void updateManualAbsent(int examId, String examNumber, boolean manualAbsent);
@@ -115,7 +118,8 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
 
     @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false and s.uploadTime!=null "
             + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
-    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber, Pageable page);
+    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber,
+            Pageable page);
 
     @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false and s.uploadTime!=null and s.uploadTime>=?4 "
             + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
@@ -142,7 +146,8 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     public List<String> findDistinctClassName(Integer examId, String subjectCode);
 
     @Query(value = "select s.objective_score+s.subjective_score from eb_exam_student s where s.exam_id=?1 and s.subject_code=?2 and s.is_upload =true and s.is_absent=false and s.is_breach=false order by s.objective_score+s.subjective_score desc limit ?3 ", nativeQuery = true)
-    public List<Double> findHighCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode, int highCount);
+    public List<Double> findHighCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode,
+            int highCount);
 
     @Query(value = "select s.objective_score+s.subjective_score from eb_exam_student s where s.exam_id=?1 and s.subject_code=?2 and s.is_upload =true and s.is_absent=false and s.is_breach=false order by s.objective_score+s.subjective_score asc limit ?3 ", nativeQuery = true)
     public List<Double> findLowCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode, int lowCount);

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

@@ -1,23 +1,14 @@
 package cn.com.qmth.stmms.biz.exam.model;
 
-import java.io.Serializable;
-import java.util.Date;
-import java.util.List;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
 
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
 @Entity
 @Table(name = "eb_exam")
 public class Exam implements Serializable {
@@ -68,7 +59,7 @@ public class Exam implements Serializable {
     @Column(name = "update_time")
     private Date updateTime;
 
-    @Column(name = "creator_id")
+    @Column(name = "creator_id", nullable = true)
     private Integer creatorId;
 
     /**

+ 36 - 46
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java

@@ -1,31 +1,21 @@
 package cn.com.qmth.stmms.biz.exam.model;
 
+import cn.com.qmth.stmms.biz.mark.model.ProblemType;
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.common.annotation.ExcelField;
+import org.apache.commons.lang.StringUtils;
+
+import javax.persistence.*;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-
-import org.apache.commons.lang.StringUtils;
-
-import cn.com.qmth.stmms.biz.mark.model.ProblemType;
-import cn.com.qmth.stmms.biz.utils.ScoreItem;
-import cn.com.qmth.stmms.common.annotation.ExcelField;
-
 /**
  * 针对某次考试的考生信息
- * 
+ *
  * @author LS
- * 
  */
 @Entity
 @Table(name = "eb_exam_student")
@@ -56,159 +46,159 @@ public class ExamStudent implements Serializable {
     /**
      * 学习中心
      */
-    @Column(name = "campus_name")
+    @Column(name = "campus_name", length = 32, nullable = true)
     @ExcelField(title = "学习中心", align = 2, sort = 10)
     private String campusName;
 
     /**
      * 科目代码
      */
-    @Column(name = "subject_code")
+    @Column(name = "subject_code", length = 32, nullable = false)
     @ExcelField(title = "课程代码", align = 2, sort = 20)
     private String subjectCode;
 
     /**
      * 科目名称
      */
-    @Column(name = "subject_name")
+    @Column(name = "subject_name", length = 32, nullable = false)
     @ExcelField(title = "课程名称", align = 2, sort = 30)
     private String subjectName;
 
     /**
      * 试卷类型
      */
-    @Column(name = "paper_type", length = 32, nullable = true)
+    @Column(name = "paper_type", length = 8, nullable = true)
     private String paperType;
 
     /**
      * 准考证号
      */
-    @Column(name = "exam_number")
+    @Column(name = "exam_number", length = 64, nullable = false)
     @ExcelField(title = "准考证号", align = 2, sort = 40)
     private String examNumber;
 
     /**
      * 学号
      */
-    @Column(name = "student_code")
+    @Column(name = "student_code", length = 64, nullable = false)
     @ExcelField(title = "学号", align = 2, sort = 50)
     private String studentCode;
 
     /**
      * 姓名
      */
-    @Column(name = "name")
+    @Column(name = "name", length = 64, nullable = false)
     @ExcelField(title = "姓名", align = 2, sort = 60)
     private String name;
 
     /**
      * 试卷袋签到表编号
      */
-    @Column(name = "package_code")
+    @Column(name = "package_code", length = 64, nullable = true)
     @ExcelField(title = "签到表编号", align = 2, sort = 70)
     private String packageCode;
 
     /**
      * 考生考点信息
      */
-    @Column(name = "exam_site")
+    @Column(name = "exam_site", length = 32, nullable = true)
     @ExcelField(title = "考点信息", align = 2, sort = 80)
     private String examSite;
 
     /**
      * 考生考场信息
      */
-    @Column(name = "exam_room")
+    @Column(name = "exam_room", length = 32, nullable = true)
     @ExcelField(title = "考场信息", align = 2, sort = 90)
     private String examRoom;
 
     /**
      * 考生备注信息
      */
-    @Column(name = "remark")
+    @Column(name = "remark", length = 128, nullable = true)
     @ExcelField(title = "考生备注信息", align = 2, sort = 100)
     private String remark;
 
     /**
      * 扫描批次编号
      */
-    @Column(name = "batch_code")
+    @Column(name = "batch_code", length = 64, nullable = true)
     private String batchCode;
 
     /**
      * 原图数量
      */
-    @Column(name = "sheet_count")
+    @Column(name = "sheet_count", nullable = false)
     private Integer sheetCount;
 
     /**
-     * 图数量
+     * 裁切图数量
      */
-    @Column(name = "slice_count")
+    @Column(name = "slice_count", nullable = false)
     private Integer sliceCount;
 
     /**
      * 客观答案
      */
-    @Column(name = "answers")
+    @Column(name = "answers", nullable = true, columnDefinition = "text")
     private String answers;
 
     /**
      * 是否已上传
      */
-    @Column(name = "is_upload")
+    @Column(name = "is_upload", nullable = false)
     private boolean upload;
 
     /**
      * 是否缺考
      */
-    @Column(name = "is_absent")
+    @Column(name = "is_absent", nullable = false)
     private boolean absent;
 
     /**
      * 是否人工指定缺考
      */
-    @Column(name = "is_manual_absent")
+    @Column(name = "is_manual_absent", nullable = false)
     private boolean manualAbsent;
 
-    @Column(name = "is_breach")
+    @Column(name = "is_breach", nullable = false)
     private boolean breach;
 
     /**
      * 是否数据校验异常
      */
-    @Column(name = "is_exception")
+    @Column(name = "is_exception", nullable = false)
     private boolean exception;
 
     /**
      * 上传时间
      */
     @Temporal(TemporalType.TIMESTAMP)
-    @Column(name = "upload_time")
+    @Column(name = "upload_time", nullable = true)
     private Date uploadTime;
 
     /**
      * 客观总分
      */
-    @Column(name = "objective_score")
+    @Column(name = "objective_score", nullable = true)
     private Double objectiveScore;
 
     /**
      * 客观题得分明细
      */
-    @Column(name = "objective_score_list")
+    @Column(name = "objective_score_list", nullable = true, columnDefinition = "text")
     private String objectiveScoreList;
 
     /**
      * 主观总分
      */
-    @Column(name = "subjective_score")
+    @Column(name = "subjective_score", nullable = true)
     private Double subjectiveScore;
 
     /**
      * 主观题得分明细
      */
-    @Column(name = "subjective_score_list")
+    @Column(name = "subjective_score_list", nullable = true, columnDefinition = "text")
     private String subjectiveScoreList;
 
     /**
@@ -229,21 +219,21 @@ public class ExamStudent implements Serializable {
      * 学院
      */
     @ExcelField(title = "学院", align = 2, sort = 130)
-    @Column(name = "college")
+    @Column(name = "college", length = 64, nullable = false)
     private String college;
 
     /**
      * 班级
      */
     @ExcelField(title = "班级", align = 2, sort = 140)
-    @Column(name = "class_name")
+    @Column(name = "class_name", length = 64, nullable = false)
     private String className;
 
     /**
      * 任课老师
      */
     @ExcelField(title = "任课老师", align = 2, sort = 150)
-    @Column(name = "teacher")
+    @Column(name = "teacher", length = 64, nullable = false)
     private String teacher;
 
     /**

+ 21 - 51
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamSearchQuery.java

@@ -1,42 +1,28 @@
 package cn.com.qmth.stmms.biz.exam.query;
 
-import java.util.HashSet;
-import java.util.Set;
-
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-
 import cn.com.qmth.stmms.biz.common.BaseQuery;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
 
 public class ExamSearchQuery extends BaseQuery<Exam> {
 
     private String name;
 
-    private Integer creatorId;
+    private String code;
 
     private Integer schoolId;
 
-    private Set<ExamStatus> statusSet;
-
-    private Set<Integer> ids;
+    private ExamStatus status;
 
-    private Set<ExamType> typeSet;
+    private ExamType type;
 
     public void orderByIdDesc() {
         setSort(new Sort(Direction.DESC, "id"));
     }
 
-    public Integer getCreatorId() {
-        return creatorId;
-    }
-
-    public void setCreatorId(Integer creatorId) {
-        this.creatorId = creatorId;
-    }
-
     public String getName() {
         return name;
     }
@@ -45,51 +31,35 @@ public class ExamSearchQuery extends BaseQuery<Exam> {
         this.name = name;
     }
 
-    public Set<ExamStatus> getStatusSet() {
-        return statusSet;
+    public Integer getSchoolId() {
+        return schoolId;
     }
 
-    public void addStatus(ExamStatus status) {
-        if (statusSet == null) {
-            statusSet = new HashSet<ExamStatus>();
-        }
-        if (status != null) {
-            statusSet.add(status);
-        }
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
     }
 
-    public Set<ExamType> getTypeSet() {
-        return typeSet;
+    public String getCode() {
+        return code;
     }
 
-    public void addTypes(ExamType type) {
-        if (typeSet == null) {
-            typeSet = new HashSet<ExamType>();
-        }
-        if (type != null) {
-            typeSet.add(type);
-        }
+    public void setCode(String code) {
+        this.code = code;
     }
 
-    public Set<Integer> getIds() {
-        return ids;
+    public ExamStatus getStatus() {
+        return status;
     }
 
-    public void addId(Integer id) {
-        if (ids == null) {
-            ids = new HashSet<Integer>();
-        }
-        if (id != null) {
-            ids.add(id);
-        }
+    public void setStatus(ExamStatus status) {
+        this.status = status;
     }
 
-    public Integer getSchoolId() {
-        return schoolId;
+    public ExamType getType() {
+        return type;
     }
 
-    public void setSchoolId(Integer schoolId) {
-        this.schoolId = schoolId;
+    public void setType(ExamType type) {
+        this.type = type;
     }
-
 }

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

@@ -3,7 +3,7 @@ package cn.com.qmth.stmms.biz.exam.service;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.ExamType;
 
 import java.util.Date;
 import java.util.List;
@@ -14,15 +14,15 @@ public interface ExamService {
 
     Exam findById(Integer id);
 
-    void updateStatus(Integer id, ExamStatus status);
-
     void updateSliceConfig(Integer id, List<PictureConfigItem> configList);
 
     void updateNeedCalculate(Integer id, boolean needCalculate);
 
     ExamSearchQuery findByQuery(ExamSearchQuery query);
 
-    List<Exam> findBySchoolId(Integer schoolId);
+    List<Exam> findBySchoolIdAndTypeAndStatus(Integer schoolId, ExamType type);
+
+    List<Exam> findBySchoolIdAndStatus(Integer schoolId);
 
     void updateProcess(Integer examId, Double process);
 

+ 8 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -1,9 +1,5 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
 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;
@@ -11,6 +7,10 @@ import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.utils.OriginTag;
 import cn.com.qmth.stmms.biz.utils.PictureTag;
 
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
 public interface ExamStudentService {
 
     public ExamStudent findById(int id);
@@ -66,6 +66,8 @@ public interface ExamStudentService {
 
     void updateManualAbsent(int id, boolean manualAbsent);
 
+    boolean updateBreach(int id, boolean breach);
+
     void updateManualAbsent(int examId, String examNumber, boolean manualAbsent);
 
     void clearManualAbsent(int examId);
@@ -93,7 +95,8 @@ public interface ExamStudentService {
     public Long countByExamIdAndSubjectCodeAndCampus(Integer examId, String code, String campusName, boolean upload,
             boolean absent);
 
-    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent, boolean breach);
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,
+            boolean breach);
 
     public long countByAbsentAndBreach(int examId, String subjectCode, Boolean absent, Boolean breach);
 

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

@@ -93,41 +93,17 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
                 if (query.getSchoolId() != null) {
                     predicates.add(cb.equal(root.get("schoolId"), query.getSchoolId()));
                 }
-                if (query.getCreatorId() != null) {
-                    predicates.add(cb.equal(root.get("creatorId"), query.getCreatorId()));
+                if (query.getStatus() != null) {
+                    predicates.add(cb.equal(root.get("status"), query.getStatus()));
+                }
+                if (query.getType() != null) {
+                    predicates.add(cb.equal(root.get("type"), query.getType()));
                 }
                 if (StringUtils.isNotBlank(query.getName())) {
                     predicates.add(cb.like(root.get("name").as(String.class), query.getName() + "%"));
                 }
-
-                if (query.getStatusSet() != null && query.getStatusSet().size() > 0) {
-                    List<Predicate> statusPredicates = new LinkedList<Predicate>();
-                    for (ExamStatus status : query.getStatusSet()) {
-                        statusPredicates.add(cb.equal(root.get("status"), status));
-                    }
-                    if (!statusPredicates.isEmpty()) {
-                        predicates.add(cb.or(statusPredicates.toArray(new Predicate[statusPredicates.size()])));
-                    }
-                }
-
-                if (query.getTypeSet() != null && query.getTypeSet().size() > 0) {
-                    List<Predicate> typePredicates = new LinkedList<Predicate>();
-                    for (ExamType type : query.getTypeSet()) {
-                        typePredicates.add(cb.equal(root.get("type"), type));
-                    }
-                    if (!typePredicates.isEmpty()) {
-                        predicates.add(cb.or(typePredicates.toArray(new Predicate[typePredicates.size()])));
-                    }
-                }
-
-                if (query.getIds() != null && query.getIds().size() > 0) {
-                    List<Predicate> idsPredicates = new LinkedList<Predicate>();
-                    for (Integer id : query.getIds()) {
-                        idsPredicates.add(cb.equal(root.get("id"), id));
-                    }
-                    if (!idsPredicates.isEmpty()) {
-                        predicates.add(cb.or(idsPredicates.toArray(new Predicate[idsPredicates.size()])));
-                    }
+                if (StringUtils.isNotBlank(query.getCode())) {
+                    predicates.add(cb.equal(root.get("code"), query.getCode()));
                 }
 
                 return predicates.isEmpty() ?
@@ -140,7 +116,12 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
     }
 
     @Override
-    public List<Exam> findBySchoolId(Integer schoolId) {
+    public List<Exam> findBySchoolIdAndTypeAndStatus(Integer schoolId, ExamType type) {
+        return examDao.findBySchoolIdAndTypeAndStatusOrderByIdDesc(schoolId, type, ExamStatus.START);
+    }
+
+    @Override
+    public List<Exam> findBySchoolIdAndStatus(Integer schoolId) {
         return examDao.findBySchoolIdAndStatusOrderByIdDesc(schoolId, ExamStatus.START);
     }
 

+ 61 - 73
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -1,49 +1,12 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Expression;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.math.RandomUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
-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.model.*;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-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.exam.service.*;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
@@ -55,6 +18,19 @@ import cn.com.qmth.stmms.biz.utils.OriginTag;
 import cn.com.qmth.stmms.biz.utils.PictureConfigTransform;
 import cn.com.qmth.stmms.biz.utils.PictureTag;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.RandomUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.criteria.*;
+import java.text.DecimalFormat;
+import java.util.*;
 
 @Service
 public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implements ExamStudentService {
@@ -102,7 +78,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
 
     /**
      * 批量添加考生
-     * 
+     *
      * @param list
      * @return
      */
@@ -406,9 +382,10 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Transactional
     public boolean updateScanInfo(ExamStudent student) {
         student.setUploadTime(new Date());
-        return studentDao.updateScanInfo(student.getId(), student.getSheetCount(), student.getSliceCount(),
-                student.getAnswers(), student.getBatchCode(), student.getPaperType(), student.isAbsent(),
-                student.getUploadTime(), student.getObjectiveScore(), student.getObjectiveScoreList()) > 0;
+        return studentDao
+                .updateScanInfo(student.getId(), student.getSheetCount(), student.getSliceCount(), student.getAnswers(),
+                        student.getBatchCode(), student.getPaperType(), student.isAbsent(), student.getUploadTime(),
+                        student.getObjectiveScore(), student.getObjectiveScoreList()) > 0;
     }
 
     @Override
@@ -417,6 +394,12 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         studentDao.updateManualAbsent(id, manualAbsent);
     }
 
+    @Override
+    @Transactional
+    public boolean updateBreach(int id, boolean breach) {
+        return studentDao.updateBreach(id, breach) > 1;
+    }
+
     @Override
     @Transactional
     public void updateManualAbsent(int examId, String examNumber, boolean manualAbsent) {
@@ -456,14 +439,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             @Override
             public Predicate toPredicate(Root<ExamStudent> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
                 List<Predicate> predicates = new LinkedList<Predicate>();
-                Expression<Double> evaluationItemSum = cb.sum(root.get("objectiveScore").as(Double.class),
-                        root.get("subjectiveScore").as(Double.class));
+                Expression<Double> evaluationItemSum = cb
+                        .sum(root.get("objectiveScore").as(Double.class), root.get("subjectiveScore").as(Double.class));
                 if (query.getStartScroe() != null) {
                     Predicate predicate1 = cb.ge(evaluationItemSum, query.getStartScroe());
                     Predicate predicate2 = cb.le(evaluationItemSum, query.getEndScroe());
                     if (query.getStartScroe() == 0) {
-                        Predicate predicate = cb.or(cb.equal(root.get("absent"), true),
-                                cb.equal(root.get("breach"), true));
+                        Predicate predicate = cb
+                                .or(cb.equal(root.get("absent"), true), cb.equal(root.get("breach"), true));
                         Predicate predicate3 = cb.and(predicate1, predicate2);
                         predicates.add(cb.or(predicate, predicate3));
                     } else {
@@ -623,8 +606,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 if (StringUtils.isNotBlank(query.getTeacher())) {
                     predicates.add(cb.equal(root.get("teacher"), query.getTeacher()));
                 }
-                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
-                        .size()]));
+                return predicates.isEmpty() ?
+                        cb.conjunction() :
+                        cb.and(predicates.toArray(new Predicate[predicates.size()]));
             }
         };
     }
@@ -632,7 +616,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Override
     public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCode(Integer schoolId, String subjectCode,
             String studentCode) {
-        List<Exam> exams = examService.findBySchoolId(schoolId);
+        List<Exam> exams = examService.findBySchoolIdAndStatus(schoolId);
         if (exams != null && exams.size() > 0) {
             return studentDao.findByExamIdAndSubjectCodeAndStudentCode(exams.get(0).getId(), subjectCode, studentCode);
         } else {
@@ -643,8 +627,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Override
     public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(Integer schoolId, String subjectCode,
             String studentCode, String examSeqCode) {
-        return studentDao.findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode, studentCode,
-                examSeqCode);
+        return studentDao
+                .findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode, studentCode, examSeqCode);
     }
 
     @Override
@@ -677,9 +661,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         query.setPageNumber(1);
         query.setPageSize(1);
         query.setSort(new Sort(Direction.ASC, "uploadTime", "id"));
-        List<ExamStudent> list = minUploadTime != null ? studentDao.findUnLibraryStudent(examId, subjectCode,
-                groupNumber, minUploadTime, query) : studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber,
-                query);
+        List<ExamStudent> list = minUploadTime != null ?
+                studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, minUploadTime, query) :
+                studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, query);
         return list.isEmpty() ? null : list.get(0);
     }
 
@@ -718,7 +702,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         return countByQuery(query);
     }
 
-    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent, boolean breach) {
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,
+            boolean breach) {
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
         query.setExamId(examId);
         query.setSubjectCode(subjectCode);
@@ -766,8 +751,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         // 构造评卷标记信息
         Exam exam = examService.findById(student.getExamId());
         ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-        List<PictureConfigItem> sliceConfig = subject.getSliceConfigList().isEmpty() ? exam.getSliceConfigList()
-                : subject.getSliceConfigList();
+        List<PictureConfigItem> sliceConfig = subject.getSliceConfigList().isEmpty() ?
+                exam.getSliceConfigList() :
+                subject.getSliceConfigList();
         if (!sliceConfig.isEmpty()) {
             List<PictureTag> tags = PictureConfigTransform.process(sliceConfig, getSliceTags(student)).get(index);
             if (tags != null) {
@@ -785,8 +771,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
         Exam exam = examService.findById(student.getExamId());
         ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
-        List<PictureConfigItem> sliceConfig = subject.getSliceConfigList().isEmpty() ? exam.getSliceConfigList()
-                : subject.getSliceConfigList();
+        List<PictureConfigItem> sliceConfig = subject.getSliceConfigList().isEmpty() ?
+                exam.getSliceConfigList() :
+                subject.getSliceConfigList();
         if (!sliceConfig.isEmpty()) {
             // 有裁切图配置时才需要获取原始评卷标记信息
             tagMap = getSliceTags(student);
@@ -807,8 +794,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     @Override
     public Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student) {
         Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
-                student.getSubjectCode(), false);
+        List<ExamQuestion> questions = questionService
+                .findByExamAndSubjectAndObjective(student.getExamId(), student.getSubjectCode(), false);
         List<ScoreItem> scoreList = student.getScoreList(false);
         List<MarkGroup> markGroups = groupService.findByExamAndSubject(student.getExamId(), student.getSubjectCode());
         for (MarkGroup group : markGroups) {
@@ -819,7 +806,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
 
     /**
      * 根据考生构造显示到第一张原图左上角的总分与主客观题明细标记
-     * 
+     *
      * @param student
      * @return
      */
@@ -830,13 +817,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         List<String> lines = new LinkedList<>();
         lines.add("成绩明细");
         // 总分得分明细
-        lines.add("总分 (客观+主观) | " + format.format(student.getTotalScore()) + "="
-                + format.format(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0) + "+"
-                + format.format(student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0));
+        lines.add("总分 (客观+主观) | " + format.format(student.getTotalScore()) + "=" + format
+                .format(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0) + "+" + format
+                .format(student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0));
         // 客观题得分明细
         List<String> objectives = new LinkedList<>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(
-                student.getExamId(), student.getSubjectCode(), true, student.getPaperType());
+        List<ExamQuestion> questions = questionService
+                .findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(), student.getSubjectCode(), true,
+                        student.getPaperType());
         List<ScoreItem> scoreList = student.getScoreList(true);
         List<String> details = new ArrayList<>();
         int i = 0;
@@ -877,7 +865,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
 
     /**
      * 获取某个考生某个评卷分组的所有评卷标记
-     * 
+     *
      * @param student
      * @param group
      * @param questions
@@ -916,14 +904,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             // 添加轨迹分
             List<MarkTrack> tracks = trackService.findByLibraryId(selected.getId());
             for (MarkTrack markTrack : tracks) {
-                originTags.add(new OriginTag(format.format(markTrack.getScore()), markTrack.getPositionX(), markTrack
-                        .getPositionY()));
+                originTags.add(new OriginTag(format.format(markTrack.getScore()), markTrack.getPositionX(),
+                        markTrack.getPositionY()));
             }
             // 添加特殊标记
             List<MarkSpecialTag> specialTags = specialTagService.findByLibraryId(selected.getId());
             for (MarkSpecialTag markSpecialTag : specialTags) {
-                originTags.add(new OriginTag(markSpecialTag.getTagName(), markSpecialTag.getPositionX(), markSpecialTag
-                        .getPositionY()));
+                originTags.add(new OriginTag(markSpecialTag.getTagName(), markSpecialTag.getPositionX(),
+                        markSpecialTag.getPositionY()));
             }
         }
         return originTags;

+ 38 - 45
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java

@@ -1,32 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONObject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
 import 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;
@@ -45,12 +18,21 @@ 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.ExamType;
-import cn.com.qmth.stmms.common.enums.HistoryStatus;
-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.enums.*;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
 
 @Controller("arbitrateController")
 @RequestMapping("/admin/exam/arbitrate")
@@ -102,24 +84,33 @@ public class ArbitrateController extends BaseExamController {
 
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ArbitrateHistorySearchQuery query) {
-        int examId = getSessionExamId(request);
         WebUser wu = RequestUtils.getWebUser(request);
-        List<ExamSubject> subjectList = getExamSubject(examId, wu);
+        List<Exam> examList = getExamList(wu);
+        if (examList.isEmpty()) {
+            return "redirect:/admin/exam/mark";
+        }
+        if (query.getExamId() == null) {
+            query.setExamId(getSessionExamId(request));
+        }
+        if (query.getExamId() == null) {
+            query.setExamId(examList.get(0).getId());
+        }
+        List<ExamSubject> subjectList = getExamSubject(query.getExamId(), wu);
         if (subjectList.isEmpty()) {
             return "redirect:/admin/exam/mark";
         }
-        query.setExamId(examId);
-        if (query.getSubjectCode() == null && !subjectList.isEmpty()) {
+        if (query.getSubjectCode() == null) {
             query.setSubjectCode(subjectList.get(0).getCode());
         }
-        subjectFilter(query, wu);
-        List<MarkGroup> groupList = groupService.findByExamAndSubjectWithDouble(examId, query.getSubjectCode());
+        List<MarkGroup> groupList = groupService
+                .findByExamAndSubjectWithDouble(query.getExamId(), query.getSubjectCode());
         if (query.getGroupNumber() == null && groupList.size() > 0) {
             query.setGroupNumber(groupList.get(0).getNumber());
         }
         for (MarkGroup group : groupList) {
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                    group.getSubjectCode(), false, group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(query.getExamId(), group.getSubjectCode(), false,
+                            group.getNumber()));
         }
         query.orderByIdDesc();
         query = arbitrateService.findByQuery(query);
@@ -129,6 +120,7 @@ public class ArbitrateController extends BaseExamController {
             }
         }
         model.addAttribute("query", query);
+        model.addAttribute("examList", examList);
         model.addAttribute("subjectList", subjectList);
         model.addAttribute("groupList", groupList);
         model.addAttribute("statusList", HistoryStatus.getOptionList());
@@ -274,8 +266,8 @@ public class ArbitrateController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         ArbitrateHistory history = arbitrateService.findById(historyId);
         if (history != null && history.getExamId().equals(examId) && subjectCheck(history.getSubjectCode(), wu)) {
-            MarkGroup group = groupService.findOne(history.getExamId(), history.getSubjectCode(),
-                    history.getGroupNumber());
+            MarkGroup group = groupService
+                    .findOne(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
             return taskService.build(history, group);
         }
         Task task = new Task();
@@ -286,7 +278,8 @@ public class ArbitrateController extends BaseExamController {
     @RequestMapping("/getTask")
     @ResponseBody
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
-    public Task getTask(HttpServletRequest request, @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
+    public Task getTask(HttpServletRequest request, @RequestParam String subjectCode,
+            @RequestParam Integer groupNumber) {
         int examId = getSessionExamId(request);
         WebUser wu = RequestUtils.getWebUser(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
@@ -332,8 +325,8 @@ public class ArbitrateController extends BaseExamController {
         if (history != null && subjectCheck(history.getSubjectCode(), wu) && task.getTotalScore() >= 0
                 && task.getScoreList() != null) {
             try {
-                lockService.watch(LockType.GROUP, history.getExamId(), history.getSubjectCode(),
-                        history.getGroupNumber());
+                lockService
+                        .watch(LockType.GROUP, history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
 
                 history.setUserId(wu.getUser().getId());
                 history.setTotalScore(task.getTotalScore());

+ 18 - 28
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/BaseExamController.java

@@ -1,16 +1,14 @@
 package cn.com.qmth.stmms.admin.exam;
 
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
-import cn.com.qmth.stmms.biz.common.BaseQuery;
 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.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.common.controller.BaseController;
 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 com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.commons.lang.StringUtils;
@@ -25,8 +23,6 @@ import java.util.List;
 
 public class BaseExamController extends BaseController {
 
-    public static final int EXAM_SELECT_COUNT = 5;
-
     protected static Logger log = LoggerFactory.getLogger(BaseExamController.class);
 
     @Autowired
@@ -35,13 +31,20 @@ public class BaseExamController extends BaseController {
     @Autowired
     private ExamService examService;
 
-    protected int getSessionExamId(HttpServletRequest request) {
+    protected Integer getSessionExamId(HttpServletRequest request) {
         return SessionExamUtils.getExamId(request);
     }
 
-    protected boolean isFinish(int examId) {
-        Exam exam = examService.findById(examId);
-        return exam != null && exam.getStatus() == ExamStatus.FINISH;
+    protected void setSessionExamId(HttpServletRequest request, Integer examId) {
+        SessionExamUtils.setExamId(request, examId);
+    }
+
+    protected Integer getQueryExamId(HttpServletRequest request, List<Exam> examList) {
+        Integer examId = getSessionExamId(request);
+        if (examId == null && !examList.isEmpty()) {
+            examId = examList.get(0).getId();
+        }
+        return examId;
     }
 
     /**
@@ -57,8 +60,12 @@ public class BaseExamController extends BaseController {
         redirectAttributes.addFlashAttribute("message", sb.toString());
     }
 
-    protected List<Exam> getExam(WebUser wu) {
-        return examService.findBySchoolId(wu.getUser().getSchoolId());
+    protected List<Exam> getExamList(WebUser wu, ExamType type) {
+        return examService.findBySchoolIdAndTypeAndStatus(wu.getUser().getSchoolId(), type);
+    }
+
+    protected List<Exam> getExamList(WebUser wu) {
+        return examService.findBySchoolIdAndStatus(wu.getUser().getSchoolId());
     }
 
     protected List<ExamSubject> getExamSubject(int examId, WebUser wu) {
@@ -71,23 +78,6 @@ public class BaseExamController extends BaseController {
         return list;
     }
 
-    @SuppressWarnings("rawtypes")
-    protected BaseQuery subjectFilter(BaseQuery query, WebUser wu) {
-        if (wu.isSubjectHeader()) {
-            //TODO - subjectHeader subjectCode filter
-            if (query instanceof ExamSubjectSearchQuery) {
-                //((ExamSubjectSearchQuery) query).setCode(wu.getUser().getSubjectCode());
-            } else {
-                //                try {
-                //                    BeanUtils.setProperty(query, "subjectCode", wu.getUser().getSubjectCode());
-                //                } catch (Exception e) {
-                //
-                //                }
-            }
-        }
-        return query;
-    }
-
     protected boolean subjectCheck(String subjectCode, WebUser wu) {
         if (wu.isSubjectHeader()) {
             return wu.getSubjectCodeSet().contains(subjectCode);

+ 39 - 74
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java

@@ -1,29 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import net.sf.json.JSONArray;
-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.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.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.campus.model.Campus;
@@ -41,18 +17,35 @@ 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.session.service.SessionService;
-import cn.com.qmth.stmms.common.utils.Paginator;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.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.beans.factory.annotation.Value;
+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")
+@RequestMapping("/admin/exam")
 public class ExamController extends BaseExamController {
 
     protected static Logger log = LoggerFactory.getLogger(ExamController.class);
@@ -79,23 +72,23 @@ public class ExamController extends BaseExamController {
     private String imageServer;
 
     @Logging(menu = "查询考试", type = LogType.QUERY)
-    @RequestMapping(value = { "/exam-list" })
-    public String examList(Model model, HttpServletRequest request, ExamSearchQuery query) {
-        SessionExamUtils.clearExamId(request);
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    @RequestMapping(value = { "/list" })
+    public String list(Model model, HttpServletRequest request, ExamSearchQuery query) {
         User user = RequestUtils.getWebUser(request).getUser();
         query.setSchoolId(user.getSchoolId());
         query.orderByIdDesc();
         query = examService.findByQuery(query);
         if (query.getCurrentCount() > 0) {
             model.addAttribute("examList", query.getResult());
-            model.addAttribute("paginator",
-                    new Paginator(query.getPageNumber(), query.getPageSize(), (int) query.getTotalCount()));
         }
+        model.addAttribute("statusList", ExamStatus.values());
+        model.addAttribute("typeList", ExamType.values());
         model.addAttribute("query", query);
         return "modules/exam/examList";
     }
 
-    @RequestMapping("/exam-create")
+    @RequestMapping("/create")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String add(Exam exam, Model model) {
         model.addAttribute("exam", exam);
@@ -104,7 +97,7 @@ public class ExamController extends BaseExamController {
         return "modules/exam/examForm";
     }
 
-    @RequestMapping("/exam-edit/{examId}")
+    @RequestMapping("/edit/{examId}")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String edit(@PathVariable Integer examId, Model model) {
         Exam exam = examService.findById(examId);
@@ -115,7 +108,7 @@ public class ExamController extends BaseExamController {
     }
 
     @Logging(menu = "创建考试", type = LogType.ADD)
-    @RequestMapping(value = "/exam-save", method = RequestMethod.POST)
+    @RequestMapping(value = "/save", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String save(HttpServletRequest request, Exam exam, RedirectAttributes redirectAttributes) {
         User user = RequestUtils.getWebUser(request).getUser();
@@ -127,22 +120,21 @@ public class ExamController extends BaseExamController {
         }
         exam = examService.save(exam);
         addMessage(redirectAttributes, "创建考试'" + exam.getName() + "'成功");
-        return "redirect:/admin/exam-list";
+        return "redirect:/admin/exam/list";
     }
 
     @Logging(menu = "编辑考试", type = LogType.UPDATE)
     @SuppressWarnings("unchecked")
-    @RequestMapping(value = "/exam-edit", method = RequestMethod.POST)
+    @RequestMapping(value = "/edit", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
-    public String examEdit(HttpServletRequest request, Exam exam, int StatusValue,
-            @RequestParam(required = false) String picList, RedirectAttributes redirectAttributes) {
+    public String edit(HttpServletRequest request, Exam exam, @RequestParam(required = false) String picList) {
         User user = RequestUtils.getWebUser(request).getUser();
         Exam oldExam = examService.findById(exam.getId());
-        if (oldExam != null && oldExam.getCreatorId().intValue() == user.getId().intValue()) {
+        if (oldExam != null && oldExam.getSchoolId().equals(user.getSchoolId())) {
             oldExam.setName(exam.getName());
             oldExam.setExamTime(exam.getExamTime());
             oldExam.setDescription(exam.getDescription());
-            oldExam.setStatus(ExamStatus.findByValue(StatusValue));
+            oldExam.setStatus(exam.getStatus());
             oldExam.setForceSpecialTag(exam.isForceSpecialTag());
             oldExam.setPassScore(exam.getPassScore());
             oldExam.setExcellentScore(exam.getExcellentScore());
@@ -154,23 +146,11 @@ public class ExamController extends BaseExamController {
             }
             examService.save(oldExam);
         }
-        return "redirect:/admin/exam-list";
-    }
-
-    @RequestMapping("/exam-select/{examId}")
-    public String select(Model model, HttpServletRequest request, HttpServletResponse response,
-            @PathVariable Integer examId) {
-        SessionExamUtils.setExamId(request, examId);
-        sessionService.put(request, response, RequestUtils.getSession(request));
-        WebUser wu = RequestUtils.getWebUser(request);
-        if (wu.isSchoolViewer()) {
-            return "redirect:/admin/exam/score";
-        }
-        return "redirect:/admin/exam/student";
+        return "redirect:/admin/exam/list";
     }
 
     @Logging(menu = "考试详情", type = LogType.QUERY)
-    @RequestMapping("/exam-view/{examId}")
+    @RequestMapping("/view/{examId}")
     public String view(Model model, HttpServletRequest request, @PathVariable Integer examId) {
         SessionExamUtils.setExamId(request, examId);
         Exam exam = examService.findById(examId);
@@ -224,23 +204,7 @@ public class ExamController extends BaseExamController {
         return "modules/exam/examInfo";
     }
 
-    @RequestMapping("/exam/info")
-    @ResponseBody
-    public Exam getExamInfo(HttpServletRequest request) {
-        Exam exam = examService.findById(getSessionExamId(request));
-        return exam;
-    }
-
-    @RequestMapping("/exam/finish")
-    @ResponseBody
-    @RoleRequire(Role.SCHOOL_ADMIN)
-    public void finished(HttpServletRequest request) {
-        Exam exam = examService.findById(getSessionExamId(request));
-        exam.setStatus(ExamStatus.FINISH);
-        examService.save(exam);
-    }
-
-    @RequestMapping("/exam/getSheetConfig")
+    @RequestMapping("/getSheetConfig")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String get(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
             @RequestParam Integer examId, @RequestParam(required = false) String subjectCode) {
@@ -265,8 +229,9 @@ public class ExamController extends BaseExamController {
 
     private List<String> buildPicUrl(ExamStudent examStudent) {
         Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
-        List<String> picUrls = PictureUrlBuilder.getSheetUrls(examStudent.getExamId(), campus.getId(),
-                examStudent.getSubjectCode(), examStudent.getExamNumber(), examStudent.getSheetCount());
+        List<String> picUrls = PictureUrlBuilder
+                .getSheetUrls(examStudent.getExamId(), campus.getId(), examStudent.getSubjectCode(),
+                        examStudent.getExamNumber(), examStudent.getSheetCount());
         return picUrls;
     }
 }

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

@@ -100,7 +100,6 @@ public class ImageCheckController extends BaseExamController {
         query.setException(true);
         query.setPageNumber(1);
         query.setPageSize(Integer.MAX_VALUE);
-        subjectFilter(query, wu);
         query = studentService.findByQuery(query);
         for (ExamStudent student : query.getResult()) {
             ExceptionStudentDTO dto = new ExceptionStudentDTO(student);

+ 28 - 45
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -1,12 +1,19 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
+import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
+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.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.*;
+import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONObject;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,31 +25,9 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.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.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.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
-import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
-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.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.MarkStatus;
-import cn.com.qmth.stmms.common.enums.Role;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
 
 @Controller("libraryController")
 @RequestMapping("/admin/exam/library")
@@ -94,9 +79,8 @@ public class LibraryController extends BaseExamController {
         if (query.getSubjectCode() == null && !subjectList.isEmpty()) {
             query.setSubjectCode(subjectList.get(0).getCode());
         }
-        subjectFilter(query, wu);
-        List<MarkGroup> groupList = groupService.findByExamAndSubjectAndStatus(examId, query.getSubjectCode(),
-                MarkStatus.FORMAL);
+        List<MarkGroup> groupList = groupService
+                .findByExamAndSubjectAndStatus(examId, query.getSubjectCode(), MarkStatus.FORMAL);
         // if (groupList.isEmpty()) {
         // return "redirect:/admin/exam/mark";
         // }
@@ -112,8 +96,9 @@ public class LibraryController extends BaseExamController {
                 }
             }
             for (MarkGroup group : groupList) {
-                group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                        group.getSubjectCode(), false, group.getNumber()));
+                group.setQuestionList(questionService
+                        .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, group.getSubjectCode(), false,
+                                group.getNumber()));
             }
         }
         MarkLibrarySearchQuery query2 = new MarkLibrarySearchQuery();
@@ -148,9 +133,8 @@ public class LibraryController extends BaseExamController {
                 try {
                     lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
                             library.getGroupNumber());
-                    if ((library.getStatus().equals(LibraryStatus.MARKED) || library.getStatus().equals(
-                            LibraryStatus.PROBLEM))
-                            && markService.backLibrary(library, wu.getId())) {
+                    if ((library.getStatus().equals(LibraryStatus.MARKED) || library.getStatus()
+                            .equals(LibraryStatus.PROBLEM)) && markService.backLibrary(library, wu.getId())) {
                         obj.accumulate("success", true);
                     } else {
                         obj.accumulate("success", false);
@@ -182,8 +166,9 @@ public class LibraryController extends BaseExamController {
         int examId = getSessionExamId(request);
         ExamStudent student = studentService.findById(studentId);
         if (groupNumber != null) {
-            List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                    student.getSubjectCode(), false, groupNumber);
+            List<ExamQuestion> questions = questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, student.getSubjectCode(), false,
+                            groupNumber);
             List<String> strings = new ArrayList<String>();
             for (ExamQuestion examQuestion : questions) {
                 strings.add(examQuestion.getQuestionNumber());
@@ -192,10 +177,8 @@ public class LibraryController extends BaseExamController {
             model.addAttribute("questionNumbers", questionNumbers);
         }
         model.addAttribute("jsonServer", jsonServer);
-        model.addAttribute(
-                "answerUrl",
-                PictureUrlBuilder.getAnswerJson(examId, student.getSubjectCode(), student.getPaperType(),
-                        student.getExamNumber()));
+        model.addAttribute("answerUrl", PictureUrlBuilder
+                .getAnswerJson(examId, student.getSubjectCode(), student.getPaperType(), student.getExamNumber()));
         return "modules/exam/jsonView";
     }
 }

+ 25 - 26
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java

@@ -1,21 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.text.DecimalFormat;
-import java.util.LinkedList;
-import java.util.List;
-
-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.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 cn.com.qmth.stmms.admin.dto.MarkGroupDTO;
 import cn.com.qmth.stmms.admin.dto.MarkerInfoDTO;
 import cn.com.qmth.stmms.admin.vo.SubjectLibraryVO;
@@ -33,6 +17,20 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 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")
@@ -57,7 +55,7 @@ public class MarkController extends BaseExamController {
 
     /**
      * 评卷进度
-     * 
+     *
      * @param request
      * @param model
      * @param query
@@ -70,7 +68,6 @@ public class MarkController extends BaseExamController {
         int examId = getSessionExamId(request);
         query.setExamId(examId);
         // query.setUploadCountGt(0);
-        subjectFilter(query, wu);
         query = subjectService.findByQuery(query);
 
         List<SubjectLibraryVO> list = new LinkedList<SubjectLibraryVO>();
@@ -106,10 +103,11 @@ public class MarkController extends BaseExamController {
                 //wu.isSubjectHeader() ? groupService.findByExamAndSubject(examId, wu.getUser().getSubjectCode()) :
                 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);
         }
@@ -137,11 +135,12 @@ public class MarkController extends BaseExamController {
                 markerService.getMarkCount(examId);
         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);
         }
 

+ 38 - 50
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java

@@ -1,38 +1,12 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-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.beans.factory.annotation.Value;
-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.bind.annotation.ResponseBody;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.vo.MarkerVO;
 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.query.MarkerSearchQuery;
-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.*;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
@@ -47,13 +21,27 @@ 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.ExamType;
-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.MarkStatus;
-import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.*;
 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.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+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.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @Controller("markQualityController")
 @RequestMapping("/admin/exam/quality")
@@ -124,17 +112,14 @@ public class MarkQualityController extends BaseExamController {
         if (query.getSubjectCode() == null && !subjectList.isEmpty()) {
             query.setSubjectCode(subjectList.get(0).getCode());
         }
-        subjectFilter(query, wu);
         List<MarkGroup> groupList = groupService.findByExamAndSubject(examId, query.getSubjectCode());
         if (query.getGroupNumber() == null && groupList.size() > 0) {
             query.setGroupNumber(groupList.get(0).getNumber());
         }
         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())));
         }
         model.addAttribute("query", query);
         model.addAttribute("subjectList", subjectList);
@@ -151,8 +136,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);
         }
@@ -173,11 +158,12 @@ 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];
@@ -192,8 +178,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);
@@ -212,8 +198,9 @@ 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);
@@ -306,8 +293,9 @@ 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) {

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

@@ -88,7 +88,6 @@ public class MarkerController extends BaseExamController {
         int examId = getSessionExamId(request);
         query.setExamId(examId);
         query.orderById();
-        subjectFilter(query, wu);
         if (StringUtils.isNotBlank(query.getLoginName())) {
             User user = userService.findByLoginName(query.getLoginName());
             query.setUserId(

+ 24 - 31
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -1,32 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.dto.ObjectiveQuestionDTO;
 import cn.com.qmth.stmms.admin.dto.QuestionDTO;
 import cn.com.qmth.stmms.admin.dto.SubjectQuestionDTO;
@@ -50,6 +23,26 @@ import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 @Controller("examPaperController")
 @RequestMapping("/admin/exam/paper")
@@ -84,7 +77,6 @@ public class PaperController extends BaseExamController {
                 query.setUploadCountEqual(0);
             }
         }
-        subjectFilter(query, wu);
         query = subjectService.findByQuery(query);
         model.addAttribute("query", query);
         model.addAttribute("upload", upload);
@@ -171,9 +163,10 @@ public class PaperController extends BaseExamController {
         query.setPageSize(Integer.MAX_VALUE);
         query = questionService.findByQuery(query);
         for (ExamQuestion q : query.getResult()) {
-            list.add(objective ? new ObjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()))
-                    : new SubjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()), groupMap.get(q.getSubjectCode()
-                            + "_" + q.getGroupNumber())));
+            list.add(objective ?
+                    new ObjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode())) :
+                    new SubjectiveQuestionDTO(q, subjectMap.get(q.getSubjectCode()),
+                            groupMap.get(q.getSubjectCode() + "_" + q.getGroupNumber())));
         }
         try {
             String fileName = objective ? "客观题数据.xlsx" : "主观题数据.xlsx";

+ 150 - 155
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScanController.java

@@ -1,155 +1,150 @@
-package cn.com.qmth.stmms.admin.exam;
-
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.ModelAndView;
-
-import cn.com.qmth.stmms.admin.vo.ScanInfoVO;
-import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
-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.query.ExamPackageSearchQuery;
-import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
-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.query.ExamSubjectSearchQuery;
-import cn.com.qmth.stmms.common.annotation.Logging;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-@Controller("scanInfoController")
-@RequestMapping("/admin/exam/scan")
-public class ScanController extends BaseExamController {
-
-    protected static Logger log = LoggerFactory.getLogger(ScanController.class);
-
-    @Autowired
-    private ExamStudentService studentService;
-
-    @Autowired
-    private ExamSubjectService subjectService;
-
-    @Autowired
-    private ExamPackageService packageService;
-
-    @Value("${package.image.server}")
-    private String packageServer;
-
-    /**
-     * 按科目统计扫描进度
-     * 
-     * @param request
-     * @param model
-     * @param query
-     * @return
-     */
-    @Logging(menu = "扫描进度-按科目查询", type = LogType.QUERY)
-    @RequestMapping(value = { "", "/subject" })
-    public ModelAndView progress(HttpServletRequest request, Model model, ExamSubjectSearchQuery query) {
-        WebUser wu = RequestUtils.getWebUser(request);
-        int examId = getSessionExamId(request);
-        List<ScanInfoVO> list = new LinkedList<ScanInfoVO>();
-        query.setExamId(examId);
-        subjectFilter(query, wu);
-        query = subjectService.findByQuery(query);
-        for (ExamSubject subject : query.getResult()) {
-            ScanInfoVO vo = new ScanInfoVO();
-            vo.setName(subject.getCode()
-                    + "-"
-                    + subject.getName()
-                    + (StringUtils.isNotBlank(subject.getRemark()) ? ("-" + StringUtils.trimToEmpty(subject.getRemark()))
-                            : ""));
-            vo.setTotalCount(studentService.countByExamIdAndSubjectCode(examId, subject.getCode()));
-            vo.setScanCount(studentService.countByExamIdAndSubjectCode(examId, subject.getCode(), true));
-            list.add(vo);
-        }
-
-        ModelAndView view = new ModelAndView("modules/exam/scanInfo");
-        view.addObject("subjectList", getExamSubject(examId, wu));
-        view.addObject("levelList", subjectService.listLevel(examId));
-        view.addObject("categoryList", subjectService.listCategory(examId));
-        view.addObject("infoList", list);
-        view.addObject("query", query);
-        view.addObject("type", "subject");
-        return view;
-    }
-
-    /**
-     * 按学习中心统计扫描进度
-     * 
-     * @param request
-     * @param subjectCode
-     * @return
-     */
-    @Logging(menu = "扫描进度-按学习中心查询", type = LogType.QUERY)
-    @RequestMapping("/campus")
-    public ModelAndView campus(HttpServletRequest request, ExamStudentSearchQuery query) {
-        int examId = getSessionExamId(request);
-        List<ScanInfoVO> list = new LinkedList<ScanInfoVO>();
-        if (StringUtils.isBlank(query.getCampusName())) {
-            query.setExamId(examId);
-            query = studentService.findDistinctCampusName(query);
-            for (ExamStudent s : query.getResult()) {
-                ScanInfoVO vo = new ScanInfoVO();
-                vo.setName(s.getCampusName());
-                vo.setTotalCount(studentService.countByExamIdAndCampusName(examId, s.getCampusName()));
-                vo.setScanCount(studentService.countByExamIdAndCampusName(examId, s.getCampusName(), true));
-                list.add(vo);
-            }
-        } else {
-            ScanInfoVO vo = new ScanInfoVO();
-            vo.setName(query.getCampusName());
-            vo.setTotalCount(studentService.countByExamIdAndCampusName(examId, query.getCampusName()));
-            vo.setScanCount(studentService.countByExamIdAndCampusName(examId, query.getCampusName(), true));
-            list.add(vo);
-
-            query.setTotalCount(1);
-            query.setTotalPage(1);
-            query.setCurrentCount(1);
-        }
-
-        ModelAndView view = new ModelAndView("modules/exam/scanInfo");
-        view.addObject("campusList", studentService.findDistinctCampusName(examId));
-        view.addObject("infoList", list);
-        view.addObject("query", query);
-        view.addObject("type", "campus");
-        return view;
-    }
-
-    /**
-     * 统计签到表扫描进度
-     * 
-     * @param request
-     * @return
-     */
-    @Logging(menu = "扫描进度-按签到表查询", type = LogType.QUERY)
-    @RequestMapping("/package")
-    public ModelAndView packageProgress(HttpServletRequest request, ExamPackageSearchQuery query) {
-        int examId = getSessionExamId(request);
-        query.setExamId(examId);
-        query = packageService.findByQuery(query);
-        for (ExamPackage ep : query.getResult()) {
-            ep.setUrls(PictureUrlBuilder.getPackageUrls(examId, ep.getCode(), ep.getPicCount()));
-        }
-        ModelAndView view = new ModelAndView("modules/exam/scanPackage");
-        view.addObject("packageList", query.getResult());
-        view.addObject("query", query);
-        view.addObject("totalCount", packageService.sumByExam(examId));
-        view.addObject("packageServer", packageServer);
-        return view;
-    }
-}
+package cn.com.qmth.stmms.admin.exam;
+
+import cn.com.qmth.stmms.admin.vo.ScanInfoVO;
+import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
+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.query.ExamPackageSearchQuery;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
+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.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.LinkedList;
+import java.util.List;
+
+@Controller("scanInfoController")
+@RequestMapping("/admin/exam/scan")
+public class ScanController extends BaseExamController {
+
+    protected static Logger log = LoggerFactory.getLogger(ScanController.class);
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamPackageService packageService;
+
+    @Value("${package.image.server}")
+    private String packageServer;
+
+    /**
+     * 按科目统计扫描进度
+     *
+     * @param request
+     * @param model
+     * @param query
+     * @return
+     */
+    @Logging(menu = "扫描进度-按科目查询", type = LogType.QUERY)
+    @RequestMapping(value = { "", "/subject" })
+    public ModelAndView progress(HttpServletRequest request, Model model, ExamSubjectSearchQuery query) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        int examId = getSessionExamId(request);
+        List<ScanInfoVO> list = new LinkedList<ScanInfoVO>();
+        query.setExamId(examId);
+        query = subjectService.findByQuery(query);
+        for (ExamSubject subject : query.getResult()) {
+            ScanInfoVO vo = new ScanInfoVO();
+            vo.setName(subject.getCode() + "-" + subject.getName() + (StringUtils.isNotBlank(subject.getRemark()) ?
+                    ("-" + StringUtils.trimToEmpty(subject.getRemark())) :
+                    ""));
+            vo.setTotalCount(studentService.countByExamIdAndSubjectCode(examId, subject.getCode()));
+            vo.setScanCount(studentService.countByExamIdAndSubjectCode(examId, subject.getCode(), true));
+            list.add(vo);
+        }
+
+        ModelAndView view = new ModelAndView("modules/exam/scanInfo");
+        view.addObject("subjectList", getExamSubject(examId, wu));
+        view.addObject("levelList", subjectService.listLevel(examId));
+        view.addObject("categoryList", subjectService.listCategory(examId));
+        view.addObject("infoList", list);
+        view.addObject("query", query);
+        view.addObject("type", "subject");
+        return view;
+    }
+
+    /**
+     * 按学习中心统计扫描进度
+     *
+     * @param request
+     * @param subjectCode
+     * @return
+     */
+    @Logging(menu = "扫描进度-按学习中心查询", type = LogType.QUERY)
+    @RequestMapping("/campus")
+    public ModelAndView campus(HttpServletRequest request, ExamStudentSearchQuery query) {
+        int examId = getSessionExamId(request);
+        List<ScanInfoVO> list = new LinkedList<ScanInfoVO>();
+        if (StringUtils.isBlank(query.getCampusName())) {
+            query.setExamId(examId);
+            query = studentService.findDistinctCampusName(query);
+            for (ExamStudent s : query.getResult()) {
+                ScanInfoVO vo = new ScanInfoVO();
+                vo.setName(s.getCampusName());
+                vo.setTotalCount(studentService.countByExamIdAndCampusName(examId, s.getCampusName()));
+                vo.setScanCount(studentService.countByExamIdAndCampusName(examId, s.getCampusName(), true));
+                list.add(vo);
+            }
+        } else {
+            ScanInfoVO vo = new ScanInfoVO();
+            vo.setName(query.getCampusName());
+            vo.setTotalCount(studentService.countByExamIdAndCampusName(examId, query.getCampusName()));
+            vo.setScanCount(studentService.countByExamIdAndCampusName(examId, query.getCampusName(), true));
+            list.add(vo);
+
+            query.setTotalCount(1);
+            query.setTotalPage(1);
+            query.setCurrentCount(1);
+        }
+
+        ModelAndView view = new ModelAndView("modules/exam/scanInfo");
+        view.addObject("campusList", studentService.findDistinctCampusName(examId));
+        view.addObject("infoList", list);
+        view.addObject("query", query);
+        view.addObject("type", "campus");
+        return view;
+    }
+
+    /**
+     * 统计签到表扫描进度
+     *
+     * @param request
+     * @return
+     */
+    @Logging(menu = "扫描进度-按签到表查询", type = LogType.QUERY)
+    @RequestMapping("/package")
+    public ModelAndView packageProgress(HttpServletRequest request, ExamPackageSearchQuery query) {
+        int examId = getSessionExamId(request);
+        query.setExamId(examId);
+        query = packageService.findByQuery(query);
+        for (ExamPackage ep : query.getResult()) {
+            ep.setUrls(PictureUrlBuilder.getPackageUrls(examId, ep.getCode(), ep.getPicCount()));
+        }
+        ModelAndView view = new ModelAndView("modules/exam/scanPackage");
+        view.addObject("packageList", query.getResult());
+        view.addObject("query", query);
+        view.addObject("totalCount", packageService.sumByExam(examId));
+        view.addObject("packageServer", packageServer);
+        return view;
+    }
+}

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

@@ -1,20 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.LinkedList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-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.servlet.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.dto.ExceptionQuestionDTO;
 import cn.com.qmth.stmms.admin.thread.ScoreCheckThread;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
@@ -27,6 +12,19 @@ import cn.com.qmth.stmms.common.domain.WebUser;
 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.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.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 @Controller
 @RequestMapping("/admin/exam/check/score")
@@ -59,7 +57,6 @@ public class ScoreCheckController extends BaseExamController {
         if (query.getZeroRateGt() == null) {
             query.setZeroRateGt(1.0);
         }
-        subjectFilter(query, wu);
         query = questionService.findByQuery(query);
 
         for (ExamQuestion q : query.getResult()) {
@@ -94,12 +91,11 @@ public class ScoreCheckController extends BaseExamController {
         query.orderBySubjectAndNumber();
         query.setPageNumber(1);
         query.setPageSize(Integer.MAX_VALUE);
-        subjectFilter(query, wu);
         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);
             }
         }

+ 47 - 59
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -1,45 +1,12 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import 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.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
-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 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.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.model.*;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-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.exam.service.*;
 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;
@@ -54,6 +21,25 @@ import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 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.beans.factory.annotation.Value;
+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.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
 
 @Controller
 @RequestMapping("/admin/exam/score")
@@ -125,17 +111,18 @@ public class ScoreController extends BaseExamController {
             query.setObjectiveScoreGt(0d);
             query.setSubjectiveScore(0d);
         }
-        subjectFilter(query, wu);
         query = studentService.findByQuery(query);
         for (ExamStudent student : query.getResult()) {
             buildSheetUrl(student);
             buildPackageUrl(student);
             buildAnswerUrl(student);
-            student.setAnswerUrl(PictureUrlBuilder.getAnswerJson(student.getExamId(), student.getSubjectCode(),
-                    student.getPaperType(), student.getExamNumber()));
+            student.setAnswerUrl(PictureUrlBuilder
+                    .getAnswerJson(student.getExamId(), student.getSubjectCode(), student.getPaperType(),
+                            student.getExamNumber()));
         }
-        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ? enableExport(examId,
-                query.getSubjectCode()) : enableExport(examId);
+        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ?
+                enableExport(examId, query.getSubjectCode()) :
+                enableExport(examId);
         if (exportMessage != null) {
             view.addObject("exportMessage", exportMessage);
             view.addObject("enableExport", false);
@@ -218,8 +205,8 @@ public class ScoreController extends BaseExamController {
     public ModelAndView calculate(HttpServletRequest request) {
         int examId = getSessionExamId(request);
         if (lockService.trylock(LockType.SCORE_CALCULATE, examId)) {
-            ScoreCalculateThread thread = new ScoreCalculateThread(examId, lockService, studentService,
-                    questionService, markService, reportService, examService, subjectService, groupService);
+            ScoreCalculateThread thread = new ScoreCalculateThread(examId, lockService, studentService, questionService,
+                    markService, reportService, examService, subjectService, groupService);
             taskExecutor.submit(thread);
         }
         return new ModelAndView("redirect:/admin/exam/score");
@@ -231,8 +218,9 @@ public class ScoreController extends BaseExamController {
             RedirectAttributes redirectAttributes) {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ? enableExport(examId,
-                query.getSubjectCode()) : enableExport(examId);
+        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ?
+                enableExport(examId, query.getSubjectCode()) :
+                enableExport(examId);
         if (exportMessage == null && StringUtils.isNotBlank(query.getSubjectCode())) {
             exportMessage = enableExport(examId, query.getSubjectCode());
         }
@@ -243,7 +231,6 @@ public class ScoreController extends BaseExamController {
         query.setExamId(examId);
         query.setPageNumber(1);
         query.setPageSize(Integer.MAX_VALUE);
-        subjectFilter(query, wu);
         query = studentService.findByQuery(query);
         String fileName = "成绩单.xlsx";
         String paperType = null;
@@ -275,8 +262,8 @@ public class ScoreController extends BaseExamController {
 
     private List<String> getOptionHeader(int examId, String subjectCode, String paerType) {
         List<String> headerList = new ArrayList<String>();
-        List<ExamQuestion> oQuestions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(examId,
-                subjectCode, true, paerType);
+        List<ExamQuestion> oQuestions = questionService
+                .findByExamAndSubjectAndObjectiveAndPaperType(examId, subjectCode, true, paerType);
         List<ExamQuestion> sQestions = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false);
         for (ExamQuestion examQuestion : oQuestions) {
             headerList.add(getTitle(examQuestion) + "选项");
@@ -332,8 +319,9 @@ 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) {
@@ -348,8 +336,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) {
@@ -369,16 +357,16 @@ public class ScoreController extends BaseExamController {
 
     private void buildSheetUrl(ExamStudent student) {
         // 改为内部原图浏览地址,直接附带标记内容
-        student.setSheetUrls(PictureUrlBuilder.getInnerSheetUrls(student.getExamId(), student.getExamNumber(),
-                student.getSheetCount()));
+        student.setSheetUrls(PictureUrlBuilder
+                .getInnerSheetUrls(student.getExamId(), student.getExamNumber(), student.getSheetCount()));
     }
 
     private void buildPackageUrl(ExamStudent student) {
         if (StringUtils.isNotBlank(student.getPackageCode())) {
             ExamPackage ep = packageService.find(student.getExamId(), student.getPackageCode());
             if (ep != null && ep.getPicCount() > 0) {
-                student.setPackageUrls(PictureUrlBuilder.getPackageUrls(student.getExamId(), student.getPackageCode(),
-                        ep.getPicCount()));
+                student.setPackageUrls(PictureUrlBuilder
+                        .getPackageUrls(student.getExamId(), student.getPackageCode(), ep.getPicCount()));
             }
         }
     }
@@ -417,8 +405,8 @@ public class ScoreController extends BaseExamController {
 
         List<ExamSubject> subjects = subjectService.list(examId);
         for (ExamSubject examSubject : subjects) {
-            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, examSubject.getCode(),
-                    MarkStatus.FORMAL, MarkStatus.TRIAL);
+            List<MarkGroup> groups = groupService
+                    .findByExamAndSubjectAndStatus(examId, examSubject.getCode(), MarkStatus.FORMAL, MarkStatus.TRIAL);
             if (groups != null && !groups.isEmpty()) {
                 String message = examSubject.getCode() + " 科目未评卷完成";
                 return message;
@@ -435,8 +423,8 @@ public class ScoreController extends BaseExamController {
             return message;
         }
 
-        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()) {
             String message = subjectCode + " 科目未评卷完成";
             return message;

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

@@ -1,29 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import net.sf.json.JSONObject;
-
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-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.bind.annotation.ResponseBody;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.vo.ExamStudentVO;
 import cn.com.qmth.stmms.admin.vo.UploadStudentVO;
 import cn.com.qmth.stmms.biz.campus.model.Campus;
@@ -41,14 +17,35 @@ import cn.com.qmth.stmms.biz.mark.service.MarkService;
 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.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-
 import com.google.common.collect.Lists;
+import net.sf.json.JSONObject;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+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.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 
 @Controller("examStudentController")
 @RequestMapping("/admin/exam/student")
@@ -82,136 +79,138 @@ public class StudentController extends BaseExamController {
 
     @Logging(menu = "查询考生", type = LogType.QUERY)
     @RequestMapping
-    public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query) {
+    public String query(Model model, HttpServletRequest request, ExamStudentSearchQuery query) {
         WebUser wu = RequestUtils.getWebUser(request);
-        int examId = getSessionExamId(request);
-        query.setExamId(examId);
-        if (query.getBatchCode() != null) {
-            query.setBatchCode(StringUtils.upperCase(query.getBatchCode()));
+        List<Exam> examList = getExamList(wu);
+        if (query.getExamId() == null) {
+            query.setExamId(getQueryExamId(request, examList));
         }
-        subjectFilter(query, wu);
-        query = studentService.findByQuery(query);
-        if (query.getCurrentCount() > 0) {
-            for (ExamStudent student : query.getResult()) {
-                student.setSubject(subjectService.find(student.getExamId(), student.getSubjectCode()));
-                buildSheetUrl(student);
-                buildPackageUrl(student);
+        if (query.getExamId() != null) {
+            setSessionExamId(request, query.getExamId());
+
+            if (query.getBatchCode() != null) {
+                query.setBatchCode(StringUtils.upperCase(query.getBatchCode()));
             }
-            model.addAttribute("studentList", query.getResult());
+            query = studentService.findByQuery(query);
+            if (query.getCurrentCount() > 0) {
+                for (ExamStudent student : query.getResult()) {
+                    student.setSubject(subjectService.find(student.getExamId(), student.getSubjectCode()));
+                    buildSheetUrl(student);
+                    buildPackageUrl(student);
+                }
+                model.addAttribute("studentList", query.getResult());
+            }
+            model.addAttribute("campusList", studentService.findDistinctCampusName(query.getExamId()));
+            model.addAttribute("subjectList", getExamSubject(query.getExamId(), wu));
+            model.addAttribute("levelList", subjectService.listLevel(query.getExamId()));
+            model.addAttribute("categoryList", subjectService.listCategory(query.getExamId()));
+            Exam exam = examService.findById(query.getExamId());
+            model.addAttribute("examType", exam.getType());
         }
         model.addAttribute("query", query);
-        model.addAttribute("campusList", studentService.findDistinctCampusName(examId));
-        model.addAttribute("subjectList", getExamSubject(examId, wu));
-        model.addAttribute("levelList", subjectService.listLevel(examId));
-        model.addAttribute("categoryList", subjectService.listCategory(examId));
+        model.addAttribute("examList", examList);
         model.addAttribute("imageServer", imageServer);
         model.addAttribute("packageServer", packageServer);
-        Exam exam = examService.findById(examId);
-        model.addAttribute("examType", exam.getType());
         return "modules/exam/studentList";
     }
 
     @RequestMapping(value = "/add")
     @RoleRequire(Role.SCHOOL_ADMIN)
-    public String form(HttpServletRequest request, ExamStudent student, Model model) {
-        Exam exam = examService.findById(getSessionExamId(request));
+    public String add(HttpServletRequest request, ExamStudent student, Model model) {
+        WebUser wu = RequestUtils.getWebUser(request);
         model.addAttribute("student", student);
-        model.addAttribute("subjectList", getExamSubject(exam.getId(), RequestUtils.getWebUser(request)));
-        model.addAttribute("campusList", studentService.findDistinctCampusName(exam.getId()));
-        return "modules/exam/studentForm";
+        model.addAttribute("examList", getExamList(wu));
+        return "modules/exam/studentAdd";
+    }
+
+    @Logging(menu = "新增考生", type = LogType.ADD)
+    @RequestMapping(value = "/insert")
+    @RoleRequire(Role.SCHOOL_ADMIN)
+    public String insert(ExamStudent student, RedirectAttributes redirectAttributes, HttpServletRequest request) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        Exam exam = student.getExamId() != null ? examService.findById(student.getExamId()) : null;
+        ExamSubject subject = exam != null ? subjectService.find(exam.getId(), student.getSubjectCode()) : null;
+        if (exam == null) {
+            addMessage(redirectAttributes, "考试不存在");
+        } else if (exam.getStatus() != ExamStatus.START || !exam.getSchoolId().equals(wu.getUser().getSchoolId())) {
+            addMessage(redirectAttributes, "考试不可操作");
+        } else if (subject == null) {
+            addMessage(redirectAttributes, "科目不存在");
+        } else {
+            student.setSchoolId(exam.getSchoolId());
+            student.setSubjectName(subject.getName());
+            student.setAbsent(false);
+            student.setUpload(false);
+            student.setException(false);
+            student.setSliceCount(0);
+            student.setSheetCount(0);
+            student.setObjectiveScore(0d);
+            student.setSubjectiveScore(0d);
+            if (studentService.findByExamIdAndExamNumber(student.getExamId(), student.getExamNumber()) != null) {
+                redirectAttributes.addAttribute("student", student);
+                addMessage(redirectAttributes, "准考证号" + student.getExamNumber() + "已经存在");
+                return "redirect:/admin/exam/student/add";
+            } else {
+                studentService.save(student);
+                addMessage(redirectAttributes, "考生" + student.getExamNumber() + "添加成功");
+            }
+        }
+        return "redirect:/admin/exam/student";
     }
 
     @RequestMapping(value = "/update")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String update(HttpServletRequest request, Integer id, Model model) {
-        Exam exam = examService.findById(getSessionExamId(request));
+        WebUser wu = RequestUtils.getWebUser(request);
         ExamStudent student = studentService.findById(id);
-        model.addAttribute("student", student);
-        model.addAttribute("subjectList", getExamSubject(exam.getId(), RequestUtils.getWebUser(request)));
-        model.addAttribute("campusList", studentService.findDistinctCampusName(exam.getId()));
-        return "modules/exam/studentForm";
+        Exam exam = student != null ? examService.findById(student.getExamId()) : null;
+        if (exam != null && exam.getStatus() == ExamStatus.START) {
+            model.addAttribute("student", student);
+            model.addAttribute("subjectList", getExamSubject(exam.getId(), wu));
+            return "modules/exam/studentEdit";
+        } else {
+            return "redirect:/admin/exam/student";
+        }
     }
 
-    @Logging(menu = "新增(修改)考生", type = LogType.UPDATE)
+    @Logging(menu = "修改考生", type = LogType.UPDATE)
     @RequestMapping(value = "/save")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String save(ExamStudent student, Model model, RedirectAttributes redirectAttributes,
             HttpServletRequest request, HttpServletResponse response) {
-        int examId = getSessionExamId(request);
-        Exam exam = examService.findById(examId);
-        ExamSubject subject = subjectService.find(examId, student.getSubjectCode());
-        Campus campus = campusService.findBySchoolAndName(exam.getSchoolId(), student.getCampusName());
-        if (subject == null) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        Exam exam = student.getExamId() != null ? examService.findById(student.getExamId()) : null;
+        ExamSubject subject = exam != null ? subjectService.find(exam.getId(), student.getSubjectCode()) : null;
+        if (exam == null) {
+            addMessage(redirectAttributes, "考试不存在");
+        } else if (exam.getStatus() != ExamStatus.START || !exam.getSchoolId().equals(wu.getUser().getSchoolId())) {
+            addMessage(redirectAttributes, "考试不可操作");
+        } else if (subject == null) {
             addMessage(redirectAttributes, "科目不存在");
-        } else if (campus == null) {
-            addMessage(redirectAttributes, "学习中心不存在");
         } else {
-            if (student.getId() != null) {
-                ExamStudent previous = studentService.findById(student.getId());
-                if (previous != null) {
-                    // String previousSubjectCode = previous.getSubjectCode();
-                    student.setExamId(examId);
-                    ExamStudent old = checkExamNumber(student, new HashMap<String, ExamStudent>(),
-                            new HashMap<String, ExamStudent>());
-                    if (old != null && !old.getExamNumber().equals(previous.getExamNumber())) {
-                        addMessage(redirectAttributes, "准考证号" + student.getExamNumber() + "已经存在");
-                        return "redirect:/admin/exam/student";
-                    }
-                    if (!previous.isUpload()) {
-                        // 还未扫描上传的考生,才能修改准考证号、学习中心、科目
-                        previous.setCampusName(student.getCampusName());
-                        previous.setSubjectCode(subject.getCode());
-                        previous.setSubjectName(subject.getName());
-                        previous.setExamNumber(student.getExamNumber());
-                    }
-                    previous.setStudentCode(student.getStudentCode());
-                    previous.setName(student.getName());
-                    previous.setPackageCode(student.getPackageCode());
-                    previous.setCollege(student.getCollege());
-                    previous.setClassName(student.getClassName());
-                    previous.setTeacher(student.getTeacher());
-                    previous = studentService.save(previous);
-                    // if
-                    // (!previousSubjectCode.equals(previous.getSubjectCode()))
-                    // {
-                    // // 更新科目上传考生数量
-                    // subjectService.updateUploadCount(examId,
-                    // previousSubjectCode);
-                    // subjectService.updateUploadCount(examId,
-                    // previous.getSubjectCode());
-                    // // 删除已生成的评卷任务
-                    // libraryService.deleteByStudent(previous.getId());
-                    // // 更新科目大题任务数量
-                    // groupService.updateLibraryCount(examId,
-                    // previousSubjectCode);
-                    // // 重置科目所有大题构造评卷任务时间
-                    // groupService.resetBuildTime(examId,
-                    // previous.getSubjectCode());
-                    // }
-                    addMessage(redirectAttributes, "考生" + previous.getName() + "保存成功");
-                } else {
-                    addMessage(redirectAttributes, "考生不存在");
-                }
-            } else {
-                student.setExamId(examId);
-                student.setSchoolId(exam.getSchoolId());
-                student.setSubjectName(subject.getName());
-                student.setAbsent(false);
-                student.setUpload(false);
-                student.setException(false);
-                student.setSliceCount(0);
-                student.setSheetCount(0);
-                student.setObjectiveScore(0d);
-                student.setSubjectiveScore(0d);
-                ExamStudent old = checkExamNumber(student, new HashMap<String, ExamStudent>(),
-                        new HashMap<String, ExamStudent>());
-                if (old != null) {
+            ExamStudent previous = studentService.findById(student.getId());
+            if (previous != null) {
+                if (studentService.findByExamIdAndExamNumber(exam.getId(), student.getExamNumber()) != null) {
                     addMessage(redirectAttributes, "准考证号" + student.getExamNumber() + "已经存在");
-                    return "redirect:/admin/exam/student";
-                } else {
-                    studentService.save(student);
+                    return "redirect:/admin/exam/student/update?id=" + student.getId();
+                }
+                if (!previous.isUpload()) {
+                    // 还未扫描上传的考生,才能修改准考证号、学习中心、科目
+                    previous.setSubjectCode(subject.getCode());
+                    previous.setSubjectName(subject.getName());
+                    previous.setExamNumber(student.getExamNumber());
+                    previous.setCampusName(student.getCampusName());
                 }
-                addMessage(redirectAttributes, "考生" + student.getName() + "保存成功");
+                previous.setStudentCode(student.getStudentCode());
+                previous.setName(student.getName());
+                previous.setPackageCode(student.getPackageCode());
+                previous.setCollege(student.getCollege());
+                previous.setClassName(student.getClassName());
+                previous.setTeacher(student.getTeacher());
+                previous = studentService.save(previous);
+                addMessage(redirectAttributes, "考生" + previous.getExamNumber() + "保存成功");
+            } else {
+                addMessage(redirectAttributes, "考生不存在");
             }
         }
         return "redirect:/admin/exam/student";
@@ -225,11 +224,8 @@ 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 {
@@ -255,9 +251,15 @@ public class StudentController extends BaseExamController {
     @Logging(menu = "导入考生", type = LogType.IMPORT_FILE)
     @RequestMapping(value = "/import", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
-    public String importFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
-        int examId = getSessionExamId(request);
+    public String importFile(HttpServletRequest request, @RequestParam Integer examId, MultipartFile file,
+            RedirectAttributes redirectAttributes) {
+        WebUser wu = RequestUtils.getWebUser(request);
         Exam exam = examService.findById(examId);
+        if (exam == null || exam.getStatus() != ExamStatus.START || !exam.getSchoolId()
+                .equals(wu.getUser().getSchoolId())) {
+            addMessage(redirectAttributes, "考试不存在或不可操作");
+            return "redirect:/admin/exam/student";
+        }
         try {
             int successNum = 0;
             int failureNum = 0;
@@ -278,14 +280,12 @@ 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;
                 }
-
                 student.setExamId(examId);
                 student.setSchoolId(exam.getSchoolId());
                 student.setAbsent(false);
@@ -322,14 +322,10 @@ 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);
             query.setPageSize(Integer.MAX_VALUE);
-            query.setExamId(examId);
             query.orderByExamNumber();
-            subjectFilter(query, wu);
             query = studentService.findByQuery(query);
             for (ExamStudent student : query.getResult()) {
                 ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
@@ -375,8 +371,15 @@ 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) {
-        int examId = getSessionExamId(request);
+    public String absentImportFile(HttpServletRequest request, @RequestParam Integer examId, MultipartFile file,
+            RedirectAttributes redirectAttributes) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        Exam exam = examService.findById(examId);
+        if (exam == null || exam.getStatus() != ExamStatus.START || !exam.getSchoolId()
+                .equals(wu.getUser().getSchoolId())) {
+            addMessage(redirectAttributes, "考试不存在或不可操作");
+            return "redirect:/admin/exam/student";
+        }
         try {
             int successNum = 0;
             int failureNum = 0;
@@ -427,9 +430,15 @@ 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) {
-        int examId = getSessionExamId(request);
-        // Exam exam = examService.findById(examId);
+    public String breachImportFile(HttpServletRequest request, @RequestParam Integer examId, MultipartFile file,
+            RedirectAttributes redirectAttributes) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        Exam exam = examService.findById(examId);
+        if (exam == null || exam.getStatus() != ExamStatus.START || !exam.getSchoolId()
+                .equals(wu.getUser().getSchoolId())) {
+            addMessage(redirectAttributes, "考试不存在或不可操作");
+            return "redirect:/admin/exam/student";
+        }
         try {
             int successNum = 0;
             int failureNum = 0;
@@ -469,18 +478,16 @@ public class StudentController extends BaseExamController {
     }
 
     @Logging(menu = "违纪重置", type = LogType.UPDATE)
+    @RoleRequire(Role.SCHOOL_ADMIN)
     @RequestMapping(value = "/updateBreach", method = RequestMethod.POST)
     @ResponseBody
     public JSONObject updateBreach(HttpServletRequest request, Integer id) {
         JSONObject result = new JSONObject();
-        ExamStudent student = studentService.findById(id);
-        student.setBreach(false);
-        student = studentService.save(student);
-        if (student != null) {
+        if (studentService.updateBreach(id, false)) {
             result.accumulate("message", "重置成功!");
             result.accumulate("success", true);
         } else {
-            result.accumulate("message", "将违纪考生信息重置为正常时出错!");
+            result.accumulate("message", "重置失败!");
             result.accumulate("success", false);
         }
         return result;
@@ -501,9 +508,15 @@ public class StudentController extends BaseExamController {
     }
 
     @RequestMapping(value = "/uploadImport", method = RequestMethod.POST)
-    public String uploadImportFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
-        int examId = getSessionExamId(request);
-        // Exam exam = examService.findById(examId);
+    public String uploadImportFile(HttpServletRequest request, @RequestParam Integer examId, MultipartFile file,
+            RedirectAttributes redirectAttributes) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        Exam exam = examService.findById(examId);
+        if (exam == null || exam.getStatus() != ExamStatus.START || !exam.getSchoolId()
+                .equals(wu.getUser().getSchoolId())) {
+            addMessage(redirectAttributes, "考试不存在或不可操作");
+            return "redirect:/admin/exam/student";
+        }
         try {
             int successNum = 0;
             int failureNum = 0;
@@ -577,16 +590,17 @@ public class StudentController extends BaseExamController {
 
     private void buildSheetUrl(ExamStudent student) {
         Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        student.setSheetUrls(PictureUrlBuilder.getSheetUrls(student.getExamId(), campus.getId(),
-                student.getSubjectCode(), student.getExamNumber(), student.getSheetCount()));
+        student.setSheetUrls(PictureUrlBuilder
+                .getSheetUrls(student.getExamId(), campus.getId(), student.getSubjectCode(), student.getExamNumber(),
+                        student.getSheetCount()));
     }
 
     private void buildPackageUrl(ExamStudent student) {
         if (StringUtils.isNotBlank(student.getPackageCode())) {
             ExamPackage ep = packageService.find(student.getExamId(), student.getPackageCode());
             if (ep != null && ep.getPicCount() > 0) {
-                student.setPackageUrls(PictureUrlBuilder.getPackageUrls(student.getExamId(), student.getPackageCode(),
-                        ep.getPicCount()));
+                student.setPackageUrls(PictureUrlBuilder
+                        .getPackageUrls(student.getExamId(), student.getPackageCode(), ep.getPicCount()));
             }
         }
     }

+ 27 - 12
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SubjectController.java

@@ -1,12 +1,15 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.Role;
 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.springframework.beans.factory.annotation.Autowired;
@@ -15,14 +18,10 @@ 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.bind.annotation.ResponseBody;
 
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.common.annotation.Logging;
-import cn.com.qmth.stmms.common.annotation.RoleRequire;
-import cn.com.qmth.stmms.common.enums.LogType;
-import cn.com.qmth.stmms.common.enums.Role;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 @Controller
 @RequestMapping("/admin/exam/subject")
@@ -31,6 +30,22 @@ public class SubjectController extends BaseExamController {
     @Autowired
     private ExamSubjectService subjectService;
 
+    @RequestMapping("/list")
+    @ResponseBody
+    public JSONArray list(HttpServletRequest request, @RequestParam Integer examId) {
+        List<ExamSubject> list = subjectService.list(examId);
+        JSONArray array = new JSONArray();
+        for (ExamSubject subject : list) {
+            JSONObject obj = new JSONObject();
+            obj.accumulate("code", subject.getCode());
+            obj.accumulate("name", subject.getName());
+            obj.accumulate("level", StringUtils.trimToEmpty(subject.getLevel()));
+            obj.accumulate("category", StringUtils.trimToEmpty(subject.getCategory()));
+            array.add(obj);
+        }
+        return array;
+    }
+
     @RequestMapping("/edit")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String edit(HttpServletRequest request, @RequestParam String code, Model model) {

+ 38 - 56
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TrialController.java

@@ -1,36 +1,7 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-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.bind.annotation.ResponseBody;
-
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
-import cn.com.qmth.stmms.biz.exam.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.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
+import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
 import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
@@ -42,15 +13,27 @@ 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.ExamType;
-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.MarkStatus;
-import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.*;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+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.bind.annotation.ResponseBody;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.List;
 
 @Controller("trialController")
 @RequestMapping("/admin/exam/trial")
@@ -105,9 +88,8 @@ public class TrialController extends BaseExamController {
         if (query.getSubjectCode() == null && !subjectList.isEmpty()) {
             query.setSubjectCode(subjectList.get(0).getCode());
         }
-        subjectFilter(query, wu);
-        List<MarkGroup> groupList = groupService.findByExamAndSubjectAndStatus(examId, query.getSubjectCode(),
-                MarkStatus.TRIAL);
+        List<MarkGroup> groupList = groupService
+                .findByExamAndSubjectAndStatus(examId, query.getSubjectCode(), MarkStatus.TRIAL);
         if (!groupList.isEmpty()) {
             if (query.getGroupNumber() == null) {
                 query.setGroupNumber(groupList.get(0).getNumber());
@@ -118,8 +100,9 @@ public class TrialController extends BaseExamController {
                 library.setMarkCount(trialService.countHistory(library.getId()));
             }
             for (MarkGroup group : groupList) {
-                group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                        group.getSubjectCode(), false, group.getNumber()));
+                group.setQuestionList(questionService
+                        .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, group.getSubjectCode(), false,
+                                group.getNumber()));
             }
             model.addAttribute("group",
                     groupService.findOne(query.getExamId(), query.getSubjectCode(), query.getGroupNumber()));
@@ -139,8 +122,8 @@ public class TrialController extends BaseExamController {
         int examId = getSessionExamId(request);
         TrialLibrary library = trialService.findLibrary(libraryId);
         if (library != null) {
-            if (library.getExamId().equals(examId)
-                    && subjectCheck(library.getSubjectCode(), RequestUtils.getWebUser(request))) {
+            if (library.getExamId().equals(examId) && subjectCheck(library.getSubjectCode(),
+                    RequestUtils.getWebUser(request))) {
                 try {
                     lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
                             library.getGroupNumber());
@@ -181,19 +164,19 @@ public class TrialController extends BaseExamController {
         Exam exam = examService.findById(library.getExamId());
         if (library != null) {
             ExamStudent student = studentService.findById(library.getStudentId());
-            MarkGroup group = groupService.findOne(library.getExamId(), library.getSubjectCode(),
-                    library.getGroupNumber());
+            MarkGroup group = groupService
+                    .findOne(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
             if (group != null && student != null) {
                 obj.accumulate("success", true);
                 if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
                     // 多媒体配置
                     obj.accumulate("jsonServer", jsonServer);
-                    obj.accumulate(
-                            "urls",
-                            PictureUrlBuilder.getAnswerJson(library.getExamId(), library.getSubjectCode(),
-                                    student.getPaperType(), library.getExamNumber()));
-                    List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
-                            library.getExamId(), student.getSubjectCode(), false, group.getNumber());
+                    obj.accumulate("urls", PictureUrlBuilder
+                            .getAnswerJson(library.getExamId(), library.getSubjectCode(), student.getPaperType(),
+                                    library.getExamNumber()));
+                    List<ExamQuestion> questions = questionService
+                            .findByExamAndSubjectAndObjectiveAndGroupNumber(library.getExamId(),
+                                    student.getSubjectCode(), false, group.getNumber());
                     List<String> strings = new ArrayList<String>();
                     for (ExamQuestion examQuestion : questions) {
                         strings.add(examQuestion.getQuestionNumber());
@@ -203,10 +186,9 @@ public class TrialController extends BaseExamController {
                 } else {
                     // 裁切图配置
                     obj.accumulate("imageServer", sliceServer);
-                    obj.accumulate(
-                            "urls",
-                            PictureUrlBuilder.getSliceUrls(library.getExamId(), library.getCampusId(),
-                                    library.getSubjectCode(), library.getExamNumber(), student.getSliceCount()));
+                    obj.accumulate("urls", PictureUrlBuilder
+                            .getSliceUrls(library.getExamId(), library.getCampusId(), library.getSubjectCode(),
+                                    library.getExamNumber(), student.getSliceCount()));
                     obj.accumulate("pictureConfig", group.getPictureConfigList());
                 }
                 // 评卷记录集合

+ 0 - 43
stmms-web/src/main/java/cn/com/qmth/stmms/admin/interceptor/AdminExamInterceptor.java

@@ -1,43 +0,0 @@
-package cn.com.qmth.stmms.admin.interceptor;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import cn.com.qmth.stmms.common.domain.WebUser;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.user.model.User;
-import cn.com.qmth.stmms.common.interceptor.SessionInterceptor;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-/**
- * Admin Exam模块操作拦截器
- *
- * @author LS
- */
-public class AdminExamInterceptor extends SessionInterceptor {
-
-    @Autowired
-    private ExamService examService;
-
-    @Override
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        int examId = SessionExamUtils.getExamId(request);
-        if (examId > 0) {
-            WebUser wu = RequestUtils.getWebUser(request);
-            Exam exam = examService.findById(examId);
-            if (exam == null || wu == null || !exam.getSchoolId().equals(wu.getUser().getSchoolId())) {
-                response.sendRedirect(request.getContextPath() + "/admin/home");
-                return false;
-            }
-            return true;
-        } else {
-            response.sendRedirect(request.getContextPath() + "/admin/exam-list");
-            return false;
-        }
-    }
-
-}

+ 11 - 13
stmms-web/src/main/java/cn/com/qmth/stmms/admin/log/OperationLogController.java

@@ -1,17 +1,5 @@
 package cn.com.qmth.stmms.admin.log;
 
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-
-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 cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.exam.model.OperationLog;
 import cn.com.qmth.stmms.biz.exam.query.OperationLogSearchQuery;
@@ -20,6 +8,16 @@ import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LogType;
 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 javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
+import java.util.Map;
 
 @Controller
 @RequestMapping("/admin/operation/log")
@@ -52,7 +50,7 @@ public class OperationLogController extends BaseExamController {
         }
 
         model.addAttribute("query", query);
-        model.addAttribute("examList", examService.findBySchoolId(wu.getUser().getSchoolId()));
+        model.addAttribute("examList", examService.findBySchoolIdAndStatus(wu.getUser().getSchoolId()));
         model.addAttribute("typeList", LogType.values());
         return "modules/log/logList";
     }

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

@@ -1,22 +1,22 @@
 package cn.com.qmth.stmms.admin.utils;
 
-import javax.servlet.http.HttpServletRequest;
-
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
+import javax.servlet.http.HttpServletRequest;
+
 public class SessionExamUtils {
 
     public static final String EXAM_ID_KEY = "examId";
 
-    public static int getExamId(HttpServletRequest request) {
-        int examId = 0;
+    public static Integer getExamId(HttpServletRequest request) {
+        Integer examId = null;
         try {
             examId = Integer.valueOf(RequestUtils.getSession(request).getParameter(EXAM_ID_KEY));
         } catch (Exception e) {
             // log.error("考试-基础参数设置-examId类型转换出错", e);
         }
-        if (examId == 0) {
+        if (examId == null) {
             try {
                 examId = Integer.valueOf(request.getParameter(EXAM_ID_KEY));
             } catch (Exception e) {

+ 10 - 17
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamInfoController.java

@@ -1,21 +1,5 @@
 package cn.com.qmth.stmms.api.controller;
 
-import java.util.Arrays;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
 import cn.com.qmth.stmms.admin.vo.ExamSubjectVO;
 import cn.com.qmth.stmms.api.exception.ApiException;
 import cn.com.qmth.stmms.biz.campus.model.Campus;
@@ -34,6 +18,15 @@ import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.List;
 
 @Controller("examInfoApiController")
 @RequestMapping("/api")
@@ -61,7 +54,7 @@ public class ExamInfoController extends BaseApiController {
         ApiUser user = RequestUtils.getApiUser(request);
         JSONArray array = new JSONArray();
         query.setSchoolId(user.getSchoolId());
-        query.addStatus(ExamStatus.START);
+        query.setStatus(ExamStatus.START);
         if (query.getPageSize() < 1) {
             query.setPageSize(20);
         }

+ 12 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java

@@ -185,6 +185,18 @@ public class BaseController {
                 }
             }
         });
+        // ExamStatus 类型转换
+        binder.registerCustomEditor(ExamStatus.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                try {
+                    setValue(ExamStatus.findByValue(Integer.valueOf(text)));
+                } catch (Exception e) {
+                    setValue(null);
+                }
+            }
+        });
         // ExamType 类型转换
         binder.registerCustomEditor(ExamType.class, new PropertyEditorSupport() {
 

+ 9 - 16
stmms-web/src/main/webapp/WEB-INF/spring-mvc.xml

@@ -1,17 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:task="http://www.springframework.org/schema/task"
-       xsi:schemaLocation="
-        http://www.springframework.org/schema/beans
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:mvc="http://www.springframework.org/schema/mvc"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd
         http://www.springframework.org/schema/mvc
-        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
-        http://www.springframework.org/schema/task
-		 http://www.springframework.org/schema/task/spring-task-3.2.xsd">
+        http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
 
     <bean id="sessionService" class="cn.com.qmth.stmms.common.session.service.impl.CookieSessionServiceImpl"/>
 
@@ -30,7 +27,7 @@
 					  cn.com.qmth.stmms.monitor,
 					  cn.com.qmth.stmms.report,
 					  cn.com.qmth.stmms.open,
-					  cn.com.qmth.stmms.card">
+					  cn.com.qmth.stmms.student">
         <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
         <context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/>
     </context:component-scan>
@@ -45,7 +42,7 @@
             <bean id="sessionInterceptor" class="cn.com.qmth.stmms.common.interceptor.SessionInterceptor"/>
         </mvc:interceptor>
         <mvc:interceptor>
-        	<mvc:mapping path="/login"/>
+            <mvc:mapping path="/login"/>
             <mvc:mapping path="/admin/**"/>
             <mvc:mapping path="/mark/**"/>
             <mvc:mapping path="/api/**"/>
@@ -59,10 +56,6 @@
             <mvc:mapping path="/admin/sys/**"/>
             <bean id="sysAdminInterceptor" class="cn.com.qmth.stmms.admin.interceptor.SysAdminInterceptor"/>
         </mvc:interceptor>
-        <mvc:interceptor>
-            <mvc:mapping path="/admin/exam/**"/>
-            <bean id="adminExamInterceptor" class="cn.com.qmth.stmms.admin.interceptor.AdminExamInterceptor"/>
-        </mvc:interceptor>
         <mvc:interceptor>
             <mvc:mapping path="/mark/**"/>
             <bean id="markInterceptor" class="cn.com.qmth.stmms.mark.interceptor.MarkInterceptor"/>
@@ -119,7 +112,7 @@
     <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
         <property name="prefix" value="/WEB-INF/views/"/>
         <property name="suffix" value=".jsp"/>
-        <property name="redirectHttp10Compatible" value="false" />
+        <property name="redirectHttp10Compatible" value="false"/>
         <property name="exposedContextBeanNames">
             <list>
                 <value>properties</value>
@@ -170,7 +163,7 @@
             </list>
         </property>
     </bean>
-    
+
     <!-- 配置国际化 -->
     <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
     <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

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

@@ -1,115 +1,120 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-	<title>考试管理</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			$("#name").focus();
-			var pictureConfig = '${pictureConfig}';
-			window.localStorage.setItem("pictureConfig",pictureConfig);
-			$("#inputForm").validate({
-				submitHandler: function(form){
-					loading('正在提交,请稍等...');
-					form.submit();
-				},
-				errorContainer: "#messageBox",
-				errorPlacement: function(error, element) {
-					$("#messageBox").text("输入有误,请先更正。");
-					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
-						error.appendTo(element.parent().parent());
-					} else {
-						error.insertAfter(element);
-					}
-				}
-			});
-		});
-	</script>
+    <title>考试管理</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            $("#name").focus();
+            var pictureConfig = '${pictureConfig}';
+            window.localStorage.setItem("pictureConfig", pictureConfig);
+            $("#inputForm").validate({
+                submitHandler: function (form) {
+                    loading('正在提交,请稍等...');
+                    form.submit();
+                },
+                errorContainer: "#messageBox",
+                errorPlacement: function (error, element) {
+                    $("#messageBox").text("输入有误,请先更正。");
+                    if (element.is(":checkbox") || element.is(":radio") || element.parent().is(".input-append")) {
+                        error.appendTo(element.parent().parent());
+                    } else {
+                        error.insertAfter(element);
+                    }
+                }
+            });
+        });
+    </script>
 </head>
 <body>
-	<ul class="nav nav-tabs">
-		<li><a href="${ctx}/admin/exam-list">考试列表</a></li>
-		<li class="active"><a href="##">编辑考试</a></li>
-	</ul><br/>
-	<form:form id="inputForm" modelAttribute="exam" action="${ctx}/admin/exam-edit" method="post" class="form-horizontal">
-		<form:hidden path="id"/>
-		<tags:message content="${message}"/>
-		<div class="control-group">
-			<label class="control-label">考试名称</label>
-			<div class="controls">
-				<form:input path="name" htmlEscape="false" maxlength="200" class="required"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">类型</label>
-			<div class="controls">
-				<select class="input-small" name="type" disabled="disabled" id="examType">
-                	 <option value="${exam.type.value}">${exam.type.name}</option>
-            	</select>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">考试日期</label>
-			<div class="controls">
-				<input name="examTime" type="text" readonly="readonly" maxlength="20" class="Wdate required"
-					value="${exam.examTime }"
-					onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:true});"/>
-			</div>
-		</div>
-		<c:if test="${exam.type!='MULTI_MEDIA'}">
-		<div class="control-group">
-			<label class="control-label">强制标记</label>
-			<div class="controls">
-				<input name="forceSpecialTag" type="checkbox" <c:if test="${exam.forceSpecialTag}">checked</c:if>/>
-			</div>
-		</div>
-		</c:if>
-		<div class="control-group">
-			<label class="control-label">及格分</label>
-			<div class="controls">
-				<input name="passScore" type="number" value="${exam.passScore }"class="required" oninput="if(value<0)value=0"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">优秀分</label>
-			<div class="controls">
-				<input name="excellentScore" type="number" value="${exam.excellentScore }" class="required" oninput="if(value<0)value=0"/>
-			</div>
-		</div>
-		<c:if test="${exam.id!=null }">
-		<div class="control-group">
-			<label class="control-label">状态</label>
-			<div class="controls">
-				<select class="input-small" name="StatusValue">
-                <c:forEach items="${statusList}" var="item">
-                	 <option value="${item.value}" <c:if test="${item.value==exam.status.value}">selected</c:if>>${item.name}</option>
-                </c:forEach>
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/admin/exam/list">考试列表</a></li>
+    <li class="active"><a href="##">编辑考试</a></li>
+</ul>
+<br/>
+<form:form id="inputForm" modelAttribute="exam" action="${ctx}/admin/exam/edit" method="post" class="form-horizontal">
+    <form:hidden path="id"/>
+    <tags:message content="${message}"/>
+    <div class="control-group">
+        <label class="control-label">考试名称</label>
+        <div class="controls">
+            <form:input path="name" htmlEscape="false" maxlength="200" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">类型</label>
+        <div class="controls">
+            <select class="input-small" name="type" disabled="disabled" id="examType">
+                <option value="${exam.type.value}">${exam.type.name}</option>
             </select>
-			</div>
-		</div>
-		<c:if test="${exam.type!='MULTI_MEDIA'}">
-		<div class="control-group">
-            <label class="control-label">原图遮盖</label>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">考试日期</label>
+        <div class="controls">
+            <input name="examTime" type="text" readonly="readonly" maxlength="20" class="Wdate required"
+                   value="${exam.examTime }"
+                   onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:true});"/>
+        </div>
+    </div>
+    <c:if test="${exam.type!='MULTI_MEDIA'}">
+        <div class="control-group">
+            <label class="control-label">强制标记</label>
+            <div class="controls">
+                <input name="forceSpecialTag" type="checkbox" <c:if test="${exam.forceSpecialTag}">checked</c:if>/>
+            </div>
+        </div>
+    </c:if>
+    <div class="control-group">
+        <label class="control-label">及格分</label>
+        <div class="controls">
+            <input name="passScore" type="number" value="${exam.passScore }" class="required"
+                   oninput="if(value<0)value=0"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">优秀分</label>
+        <div class="controls">
+            <input name="excellentScore" type="number" value="${exam.excellentScore }" class="required"
+                   oninput="if(value<0)value=0"/>
+        </div>
+    </div>
+    <c:if test="${exam.id!=null }">
+        <div class="control-group">
+            <label class="control-label">状态</label>
             <div class="controls">
-                <input name="picList" id="picList"  type="hidden"/>
-                <a href="${ctx}/admin/exam/getSheetConfig?examId=${exam.id}" target="_blank" class="required" id= "configuration">设置</a>
+                <select class="input-small" name="StatusValue">
+                    <c:forEach items="${statusList}" var="item">
+                        <option value="${item.value}"
+                                <c:if test="${item.value==exam.status.value}">selected</c:if>>${item.name}</option>
+                    </c:forEach>
+                </select>
             </div>
         </div>
+        <c:if test="${exam.type!='MULTI_MEDIA'}">
+            <div class="control-group">
+                <label class="control-label">原图遮盖</label>
+                <div class="controls">
+                    <input name="picList" id="picList" type="hidden"/>
+                    <a href="${ctx}/admin/exam/getSheetConfig?examId=${exam.id}" target="_blank" class="required"
+                       id="configuration">设置</a>
+                </div>
+            </div>
         </c:if>
-		</c:if>
-		<div class="control-group">
-			<label class="control-label">描述</label>
-			<div class="controls">
-				<form:textarea path="description" htmlEscape="false" rows="4" maxlength="200" class="input-xxlarge"/>
-			</div>
-		</div>
-		<div class="form-actions">
-			<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
-			&nbsp;
-			<a href="${ctx}/admin/exam-list" class="btn"/>返回</a>
-		</div>
-	</form:form>
+    </c:if>
+    <div class="control-group">
+        <label class="control-label">描述</label>
+        <div class="controls">
+            <form:textarea path="description" htmlEscape="false" rows="4" maxlength="200" class="input-xxlarge"/>
+        </div>
+    </div>
+    <div class="form-actions">
+        <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
+        &nbsp;
+        <a href="${ctx}/admin/exam/list" class="btn">返回</a>
+    </div>
+</form:form>
 </body>
 </html>

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

@@ -1,112 +1,115 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-	<title>考试管理</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<script type="text/javascript">
-		$(document).ready(function() {
-			$("#name").focus();
-			$("#inputForm").validate({
-				submitHandler: function(form){
-					loading('正在提交,请稍等...');
-					form.submit();
-				},
-				errorContainer: "#messageBox",
-				errorPlacement: function(error, element) {
-					$("#messageBox").text("输入有误,请先更正。");
-					if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
-						error.appendTo(element.parent().parent());
-					} else {
-						error.insertAfter(element);
-					}
-				}
-			});
-			$("#examType").change(function() { 
-				if ($("#examType").val()=='2'){
-					$("#forceSpecialTagDiv").hide();
-				}else{
-					$("#forceSpecialTagDiv").show();
-				}
-			});
-		});
-	</script>
+    <title>考试管理</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            $("#name").focus();
+            $("#inputForm").validate({
+                submitHandler: function (form) {
+                    loading('正在提交,请稍等...');
+                    form.submit();
+                },
+                errorContainer: "#messageBox",
+                errorPlacement: function (error, element) {
+                    $("#messageBox").text("输入有误,请先更正。");
+                    if (element.is(":checkbox") || element.is(":radio") || element.parent().is(".input-append")) {
+                        error.appendTo(element.parent().parent());
+                    } else {
+                        error.insertAfter(element);
+                    }
+                }
+            });
+            $("#examType").change(function () {
+                if ($("#examType").val() == '2') {
+                    $("#forceSpecialTagDiv").hide();
+                } else {
+                    $("#forceSpecialTagDiv").show();
+                }
+            });
+        });
+    </script>
 </head>
 <body>
-	<ul class="nav nav-tabs">
-		<li><a href="${ctx}/admin/exam-list">考试列表</a></li>
-		<li class="active"><a href="##">创建考试</a></li>
-	</ul><br/>
-	<form:form id="inputForm" modelAttribute="exam" action="${ctx}/admin/exam-save" method="post" class="form-horizontal">
-		<tags:message content="${message}"/>
-		<div class="control-group">
-			<label class="control-label">考试名称</label>
-			<div class="controls">
-				<form:input path="name" htmlEscape="false" maxlength="200" class="required"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">类型</label>
-			<div class="controls">
-				<select class="input-small" name="type" id="examType">
+<ul class="nav nav-tabs">
+    <li><a href="${ctx}/admin/exam/list">考试列表</a></li>
+    <li class="active"><a href="##">创建考试</a></li>
+</ul>
+<br/>
+<form:form id="inputForm" modelAttribute="exam" action="${ctx}/admin/exam/save" method="post" class="form-horizontal">
+    <tags:message content="${message}"/>
+    <div class="control-group">
+        <label class="control-label">考试名称</label>
+        <div class="controls">
+            <form:input path="name" htmlEscape="false" maxlength="200" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">类型</label>
+        <div class="controls">
+            <select class="input-small" name="type" id="examType">
                 <c:forEach items="${typeList}" var="item">
-                	 <option value="${item.value}" <c:if test="${item.value==exam.type.value}">selected</c:if>>${item.name}</option>
+                    <option value="${item.value}"
+                            <c:if test="${item.value==exam.type.value}">selected</c:if>>${item.name}</option>
                 </c:forEach>
             </select>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">考试日期</label>
-			<div class="controls">
-				<input name="examTime" type="text" readonly="readonly" maxlength="20" class="Wdate required"
-					value="${exam.examTime }"
-					onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:true});"/>
-			</div>
-		</div>
-		<div id="forceSpecialTagDiv">
-		<div class="control-group">
-			<label class="control-label">强制标记</label>
-			<div class="controls">
-				<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="passScore" type="number" value="60" class="required"oninput="if(value<0)value=0"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">优秀分</label>
-			<div class="controls">
-				<input name="excellentScore" type="number" value="85" class="required"oninput="if(value<0)value=0"/>
-			</div>
-		</div>
-		<c:if test="${exam.id!=null }">
-		<div class="control-group">
-			<label class="control-label">状态</label>
-			<div class="controls">
-				<select class="input-small" name="status">
-                <c:forEach items="${statusList}" var="item">
-                	 <option value="${item.value}" <c:if test="${item.value==exam.status.value}">selected</c:if>>${item.name}</option>
-                </c:forEach>
-            </select>
-			</div>
-		</div>
-		</c:if>
-		<div class="control-group">
-			<label class="control-label">描述</label>
-			<div class="controls">
-				<form:textarea path="description" htmlEscape="false" rows="4" maxlength="200" class="input-xxlarge"/>
-			</div>
-		</div>
-		<div class="form-actions">
-			<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
-			&nbsp;
-			<a href="${ctx}/admin/exam-list" class="btn"/>返回</a>
-		</div>
-	</form:form>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">考试日期</label>
+        <div class="controls">
+            <input name="examTime" type="text" readonly="readonly" maxlength="20" class="Wdate required"
+                   value="${exam.examTime }"
+                   onclick="WdatePicker({dateFmt:'yyyy-MM-dd',isShowClear:true});"/>
+        </div>
+    </div>
+    <div id="forceSpecialTagDiv">
+        <div class="control-group">
+            <label class="control-label">强制标记</label>
+            <div class="controls">
+                <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="passScore" type="number" value="60" class="required" oninput="if(value<0)value=0"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">优秀分</label>
+        <div class="controls">
+            <input name="excellentScore" type="number" value="85" class="required" oninput="if(value<0)value=0"/>
+        </div>
+    </div>
+    <c:if test="${exam.id!=null }">
+        <div class="control-group">
+            <label class="control-label">状态</label>
+            <div class="controls">
+                <select class="input-small" name="status">
+                    <c:forEach items="${statusList}" var="item">
+                        <option value="${item.value}"
+                                <c:if test="${item.value==exam.status.value}">selected</c:if>>${item.name}</option>
+                    </c:forEach>
+                </select>
+            </div>
+        </div>
+    </c:if>
+    <div class="control-group">
+        <label class="control-label">描述</label>
+        <div class="controls">
+            <form:textarea path="description" htmlEscape="false" rows="4" maxlength="200" class="input-xxlarge"/>
+        </div>
+    </div>
+    <div class="form-actions">
+        <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
+        &nbsp;
+        <a href="${ctx}/admin/exam/list" class="btn">返回</a>
+    </div>
+</form:form>
 </body>
 </html>

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

@@ -1,158 +1,190 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-	<title>高校云阅卷</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<style type="text/css">
-		#main {padding:0;margin:0;} #main .container-fluid{padding:0 7px 0 10px;}
-		#header {margin:0 0 10px;position:static;} #header li {font-size:14px;_font-size:12px;}
-		#header .brand {font-family:Helvetica, Georgia, Arial, sans-serif, 黑体;font-size:26px;padding-left:33px;}
-		#footer {margin:8px 0 0 0;padding:3px 0 0 0;font-size:11px;text-align:center;border-top:2px solid #0663A2;}
-		#footer, #footer a {color:#999;} 
-	</style>
-	<script type="text/javascript"> 
-		$(document).ready(function() {
-			$("#menu a.menu").click(function(){
-				$("#menu li.menu").removeClass("active");
-				$(this).parent().addClass("active");
-				if(!$("#openClose").hasClass("close")){
-					$("#openClose").click();
-				}
-			});
-			
-			$(".accordion-heading a").click(function(){
-				$('.accordion-toggle i').removeClass('icon-chevron-down');
-				$('.accordion-toggle i').addClass('icon-chevron-right');
-				if(!$($(this).attr('href')).hasClass('in')){
-					$(this).children('i').removeClass('icon-chevron-right');
-					$(this).children('i').addClass('icon-chevron-down');
-				}
-			});
-			$(".accordion-body a").click(function(){
-				$("#menu li").removeClass("active");
-				$("#menu li i").removeClass("icon-white");
-				$(this).parent().addClass("active");
-				$(this).children("i").addClass("icon-white");
-			}); 
-			$(".accordion-body a:first i").click();
-		});
-	</script>
+    <title>高校云阅卷</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <style type="text/css">
+        #main {
+            padding: 0;
+            margin: 0;
+        }
+        
+        #main .container-fluid {
+            padding: 0 7px 0 10px;
+        }
+        
+        #header {
+            margin: 0 0 10px;
+            position: static;
+        }
+        
+        #header li {
+            font-size: 14px;
+            _font-size: 12px;
+        }
+        
+        #header .brand {
+            font-family: Helvetica, Georgia, Arial, sans-serif, 黑体;
+            font-size: 26px;
+            padding-left: 33px;
+        }
+        
+        #footer {
+            margin: 8px 0 0 0;
+            padding: 3px 0 0 0;
+            font-size: 11px;
+            text-align: center;
+            border-top: 2px solid #0663A2;
+        }
+        
+        #footer, #footer a {
+            color: #999;
+        }
+    </style>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            $("#menu a.menu").click(function () {
+                $("#menu li.menu").removeClass("active");
+                $(this).parent().addClass("active");
+                if (!$("#openClose").hasClass("close")) {
+                    $("#openClose").click();
+                }
+            });
+
+            $(".accordion-heading a").click(function () {
+                $('.accordion-toggle i').removeClass('icon-chevron-down');
+                $('.accordion-toggle i').addClass('icon-chevron-right');
+                if (!$($(this).attr('href')).hasClass('in')) {
+                    $(this).children('i').removeClass('icon-chevron-right');
+                    $(this).children('i').addClass('icon-chevron-down');
+                }
+            });
+            $(".accordion-body a").click(function () {
+                $("#menu li").removeClass("active");
+                $("#menu li i").removeClass("icon-white");
+                $(this).parent().addClass("active");
+                $(this).children("i").addClass("icon-white");
+            });
+            $(".accordion-body a:first i").click();
+        });
+    </script>
 </head>
 <body>
-	<div id="main">
-		<div id="header" class="navbar navbar-fixed-top">
-	      <div class="navbar-inner">
-	      	 <div class="brand">云阅卷</div>
-	         <div class="nav-collapse">
-	           <%-- <ul id="menu" class="nav">
-				 <c:set var="firstMenu" value="true"/>
-		 		<li class="menu "><a class="menu" href="${ctx }/admin/exam" target="menuFrame" >考试管理</a></li>
-				<li class="menu "><a class="menu" href="" target="menuFrame" >基础管理</a></li>
-	           </ul> --%>
-	           <ul class="nav pull-right">
-			  	 <li id="themeSwitch" class="dropdown">
-			       	<a class="dropdown-toggle" data-toggle="dropdown" href="#" title="主题切换"><i class="icon-th-large"></i></a>
-				    <ul class="dropdown-menu">
-				      <li><a href="#" onclick="location='${ctx}/admin/home/theme/default?url='+location.href">默认主题</a></li>
-				      <li><a href="#" onclick="location='${ctx}/admin/home/theme/cerulean?url='+location.href">天蓝主题</a></li>
-				      <li><a href="#" onclick="location='${ctx}/admin/home/theme/readable?url='+location.href">橙色主题</a></li>
-				      <li><a href="#" onclick="location='${ctx}/admin/home/theme/united?url='+location.href">红色主题</a></li>
-				      <li><a href="#" onclick="location='${ctx}/admin/home/theme/flat?url='+location.href">Flat主题</a></li>
-				    </ul>
-				    <!--[if lte IE 6]><script type="text/javascript">$('#themeSwitch').hide();</script><![endif]-->
-			     </li>
-			  	 <li class="dropdown">
-				    <a class="dropdown-toggle" data-toggle="dropdown" href="#" title="个人信息">${web_user.name}</a>
-				    <ul class="dropdown-menu">
-				      <li><a href="${ctx}/admin/account/info" target="mainFrame"><i class="icon-user"></i>&nbsp; 个人信息</a></li>
-				      <li><a href="${ctx}/admin/account/modifyPwd" target="mainFrame"><i class="icon-lock"></i>&nbsp; 修改密码</a></li>
-				    </ul>
-			  	 </li>
-			  	 <li><a href="${ctx}/logout" title="退出登录">退出</a></li>
-			  	 <li>&nbsp;</li>
-	           </ul>
-	         </div><!--/.nav-collapse -->
-	      </div>
-	    </div>
-	    <div class="container-fluid">
-			<div id="content" class="row-fluid">
-				<div id="left">
-							<div class="accordion" id="menu"><c:set var="firstMenu" value="true"/>
-							<div class="accordion-group">
-							    <%-- <div class="accordion-heading">
-							    	<a class="accordion-toggle" data-toggle="collapse" data-parent="#menu" href="#collapse${menu.id}" title="考试管理"><i class="icon-chevron-${firstMenu?'down':'right'}"></i>&nbsp;考试管理</a>
-							    </div> --%>
-							    <div id="collapse1" class="accordion-body collapse ${firstMenu?'in':''}">
-									<div class="accordion-inner">
-										<ul class="nav nav-list">
-										    <c:if test="${web_user.schoolAdmin==true}">
-										    <li><a href="${ctx}/admin/user/list" target="mainFrame" ><i class="icon-user"></i>用户管理</a></li>
-											<li><a href="${ctx}/admin/exam-list" target="mainFrame" ><i class="icon-th-list"></i>考试管理</a></li>	
-											<li><a href="${ctx}/admin/exam/student" target="mainFrame" ><i class="icon-user"></i>考生管理</a></li>
-											<li><a href="${ctx}/admin/exam/paper" target="mainFrame" ><i class="icon-book"></i>试卷管理</a></li>
-											<li><a href="${ctx}/admin/exam/scan" target="mainFrame" ><i class="icon-print"></i>扫描进度</a></li>
-											<li><a href="${ctx}/admin/exam/mark" target="mainFrame" ><i class="icon-pencil"></i>评卷管理</a></li>
-											<li><a href="${ctx}/admin/exam/score" target="mainFrame" ><i class="icon-search"></i>成绩查询</a></li>
-											<li><a href="${ctx}/admin/exam/problem/history" target="mainFrame" ><i class="icon-tag"></i>问题试卷</a></li>	
-                                            <li><a href="${ctx}/admin/exam/reportSubject" target="mainFrame" ><i class="icon-signal"></i>总量分析</a></li>
-                                            <li><a href="${ctx}/admin/exam/reportSubjectCollege" target="mainFrame" ><i class="icon-asterisk"></i>科目分析</a></li>       
-											<li><a href="${ctx}/admin/exam/check/answer" target="mainFrame" ><i class="icon-check"></i>数据检查</a></li>			
-											<li><a href="${ctx}/admin/operation/log" target="mainFrame" ><i class="icon-tasks"></i>操作日志</a></li>			
-											</c:if>
-											
-											<c:if test="${web_user.subjectHeader==true}">
-                                            <li><a href="${ctx}/admin/exam-list" target="mainFrame" ><i class="icon-th-list"></i>考试管理</a></li>
-                                            <li><a href="${ctx}/admin/exam/student" target="mainFrame" ><i class="icon-user"></i>考生管理</a></li>
-                                            <li><a href="${ctx}/admin/exam/mark" target="mainFrame" ><i class="icon-pencil"></i>评卷管理</a></li>
-                                            <li><a href="${ctx}/admin/exam/score" target="mainFrame" ><i class="icon-search"></i>成绩查询</a></li> 
-                                            <li><a href="${ctx}/admin/exam/problem/history" target="mainFrame" ><i class="icon-tag"></i>问题试卷</a></li>	
-                                            <li><a href="${ctx}/admin/exam/reportSubject" target="mainFrame" ><i class="icon-signal"></i>总量分析</a></li> 
-                                            <li><a href="${ctx}/admin/exam/reportSubjectCollege" target="mainFrame" ><i class="icon-asterisk"></i>科目分析</a></li>         
-                                            </c:if>
-                                            
-                                            <c:if test="${web_user.schoolViewer==true}">
-                                            <li><a href="${ctx}/admin/exam-list" target="mainFrame" ><i class="icon-th-list"></i>考试管理</a></li>
-                                            <li><a href="${ctx}/admin/exam/score" target="mainFrame" ><i class="icon-search"></i>成绩查询</a></li>      
-                                            </c:if>
-                                            
-											<c:set var="firstMenu" value="false"/>
-										</ul>
-									</div>
-							    </div>
-							</div>
-						</div>
-				</div>
-				<div id="openClose" class="close">&nbsp;</div>
-				<div id="right">
-					<iframe id="mainFrame" name="mainFrame" src="" style="overflow:auto;"
-						scrolling="yes" frameborder="no" width="100%" height="650"></iframe>
-				</div>
-<%-- 			    <%@include file="/WEB-INF/views/include/picConfig.jsp" %> --%>
-			</div>
-		    <div id="footer" class="row-fluid">
-	            Copyright &copy; 2012-2014 云阅卷(高校版) - Powered By <a href="http://www.qmth.com.cn" target="_blank">启明软件</a> V1.0
-			</div>
-		</div>
-	</div>
-	<script type="text/javascript"> 
-		var leftWidth = "160"; // 左侧窗口大小
-		function wSize(){
-			var minHeight = 500, minWidth = 980;
-			var strs=getWindowSize().toString().split(",");
-			$("#menuFrame, #mainFrame, #openClose").height((strs[0]<minHeight?minHeight:strs[0])-$("#header").height()-$("#footer").height()-32);
-			$("#openClose").height($("#openClose").height()-5);
-			if(strs[1]<minWidth){
-				$("#main").css("width",minWidth-10);
-				$("html,body").css({"overflow":"auto","overflow-x":"auto","overflow-y":"auto"});
-			}else{
-				$("#main").css("width","auto");
-				$("html,body").css({"overflow":"hidden","overflow-x":"hidden","overflow-y":"hidden"});
-			}
-			$("#right").width($("#content").width()-$("#left").width()-$("#openClose").width()-5);
-		}
-	</script>
-	<script src="${ctxStatic}/common/wsize.min.js" type="text/javascript"></script>
+<div id="main">
+    <div id="header" class="navbar navbar-fixed-top">
+        <div class="navbar-inner">
+            <div class="brand">云阅卷</div>
+            <div class="nav-collapse">
+                <%-- <ul id="menu" class="nav">
+                  <c:set var="firstMenu" value="true"/>
+                  <li class="menu "><a class="menu" href="${ctx }/admin/exam" target="menuFrame" >考试管理</a></li>
+                 <li class="menu "><a class="menu" href="" target="menuFrame" >基础管理</a></li>
+                </ul> --%>
+                <ul class="nav pull-right">
+                    <li id="themeSwitch" class="dropdown">
+                        <a class="dropdown-toggle" data-toggle="dropdown" href="#" title="主题切换"><i class="icon-th-large"></i></a>
+                        <ul class="dropdown-menu">
+                            <li><a href="#" onclick="location='${ctx}/admin/home/theme/default?url='+location.href">默认主题</a></li>
+                            <li><a href="#" onclick="location='${ctx}/admin/home/theme/cerulean?url='+location.href">天蓝主题</a></li>
+                            <li><a href="#" onclick="location='${ctx}/admin/home/theme/readable?url='+location.href">橙色主题</a></li>
+                            <li><a href="#" onclick="location='${ctx}/admin/home/theme/united?url='+location.href">红色主题</a></li>
+                            <li><a href="#" onclick="location='${ctx}/admin/home/theme/flat?url='+location.href">Flat主题</a></li>
+                        </ul>
+                        <!--[if lte IE 6]>
+                        <script type="text/javascript">$('#themeSwitch').hide();</script><![endif]-->
+                    </li>
+                    <li class="dropdown">
+                        <a class="dropdown-toggle" data-toggle="dropdown" href="#" title="个人信息">${web_user.name}</a>
+                        <ul class="dropdown-menu">
+                            <li><a href="${ctx}/admin/account/info" target="mainFrame"><i class="icon-user"></i>&nbsp; 个人信息</a></li>
+                            <li><a href="${ctx}/admin/account/modifyPwd" target="mainFrame"><i class="icon-lock"></i>&nbsp; 修改密码</a></li>
+                        </ul>
+                    </li>
+                    <li><a href="${ctx}/logout" title="退出登录">退出</a></li>
+                    <li>&nbsp;</li>
+                </ul>
+            </div><!--/.nav-collapse -->
+        </div>
+    </div>
+    <div class="container-fluid">
+        <div id="content" class="row-fluid">
+            <div id="left">
+                <div class="accordion" id="menu"><c:set var="firstMenu" value="true"/>
+                    <div class="accordion-group">
+                        <%-- <div class="accordion-heading">
+                            <a class="accordion-toggle" data-toggle="collapse" data-parent="#menu" href="#collapse${menu.id}" title="考试管理"><i class="icon-chevron-${firstMenu?'down':'right'}"></i>&nbsp;考试管理</a>
+                        </div> --%>
+                        <div id="collapse1" class="accordion-body collapse ${firstMenu?'in':''}">
+                            <div class="accordion-inner">
+                                <ul class="nav nav-list">
+                                    <c:if test="${web_user.schoolAdmin==true}">
+                                        <li><a href="${ctx}/admin/user/list" target="mainFrame"><i class="icon-user"></i>用户管理</a></li>
+                                        <li><a href="${ctx}/admin/exam/list" target="mainFrame"><i class="icon-th-list"></i>考试管理</a></li>
+                                        <li><a href="${ctx}/admin/exam/student" target="mainFrame"><i class="icon-user"></i>考生管理</a></li>
+                                        <li><a href="${ctx}/admin/exam/paper" target="mainFrame"><i class="icon-book"></i>试卷管理</a></li>
+                                        <li><a href="${ctx}/admin/exam/scan" target="mainFrame"><i class="icon-print"></i>扫描进度</a></li>
+                                        <li><a href="${ctx}/admin/exam/mark" target="mainFrame"><i class="icon-pencil"></i>评卷管理</a></li>
+                                        <li><a href="${ctx}/admin/exam/score" target="mainFrame"><i class="icon-search"></i>成绩查询</a></li>
+                                        <li><a href="${ctx}/admin/exam/problem/history" target="mainFrame"><i class="icon-tag"></i>问题试卷</a></li>
+                                        <li><a href="${ctx}/admin/exam/reportSubject" target="mainFrame"><i class="icon-signal"></i>总量分析</a></li>
+                                        <li><a href="${ctx}/admin/exam/reportSubjectCollege" target="mainFrame"><i class="icon-asterisk"></i>科目分析</a></li>
+                                        <li><a href="${ctx}/admin/exam/check/answer" target="mainFrame"><i class="icon-check"></i>数据检查</a></li>
+                                        <li><a href="${ctx}/admin/operation/log" target="mainFrame"><i class="icon-tasks"></i>操作日志</a></li>
+                                    </c:if>
+                                    
+                                    <c:if test="${web_user.subjectHeader==true}">
+                                        <li><a href="${ctx}/admin/exam-list" target="mainFrame"><i class="icon-th-list"></i>考试管理</a></li>
+                                        <li><a href="${ctx}/admin/exam/student" target="mainFrame"><i class="icon-user"></i>考生管理</a></li>
+                                        <li><a href="${ctx}/admin/exam/mark" target="mainFrame"><i class="icon-pencil"></i>评卷管理</a></li>
+                                        <li><a href="${ctx}/admin/exam/score" target="mainFrame"><i class="icon-search"></i>成绩查询</a></li>
+                                        <li><a href="${ctx}/admin/exam/problem/history" target="mainFrame"><i class="icon-tag"></i>问题试卷</a></li>
+                                        <li><a href="${ctx}/admin/exam/reportSubject" target="mainFrame"><i class="icon-signal"></i>总量分析</a></li>
+                                        <li><a href="${ctx}/admin/exam/reportSubjectCollege" target="mainFrame"><i class="icon-asterisk"></i>科目分析</a></li>
+                                    </c:if>
+                                    
+                                    <c:if test="${web_user.schoolViewer==true}">
+                                        <li><a href="${ctx}/admin/exam-list" target="mainFrame"><i class="icon-th-list"></i>考试管理</a></li>
+                                        <li><a href="${ctx}/admin/exam/score" target="mainFrame"><i class="icon-search"></i>成绩查询</a></li>
+                                    </c:if>
+                                    
+                                    <c:set var="firstMenu" value="false"/>
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div id="openClose" class="close">&nbsp;</div>
+            <div id="right">
+                <iframe id="mainFrame" name="mainFrame" src="" style="overflow:auto;"
+                        scrolling="yes" frameborder="no" width="100%" height="650"></iframe>
+            </div>
+            <%-- 			    <%@include file="/WEB-INF/views/include/picConfig.jsp" %> --%>
+        </div>
+        <div id="footer" class="row-fluid">
+            Copyright &copy; 2012-2014 云阅卷(高校版) - Powered By <a href="http://www.qmth.com.cn" target="_blank">启明软件</a> V1.0
+        </div>
+    </div>
+</div>
+<script type="text/javascript">
+    var leftWidth = "160"; // 左侧窗口大小
+    function wSize() {
+        var minHeight = 500, minWidth = 980;
+        var strs = getWindowSize().toString().split(",");
+        $("#menuFrame, #mainFrame, #openClose").height((strs[0] < minHeight ? minHeight : strs[0]) - $("#header").height() - $("#footer").height() - 32);
+        $("#openClose").height($("#openClose").height() - 5);
+        if (strs[1] < minWidth) {
+            $("#main").css("width", minWidth - 10);
+            $("html,body").css({"overflow": "auto", "overflow-x": "auto", "overflow-y": "auto"});
+        } else {
+            $("#main").css("width", "auto");
+            $("html,body").css({"overflow": "hidden", "overflow-x": "hidden", "overflow-y": "hidden"});
+        }
+        $("#right").width($("#content").width() - $("#left").width() - $("#openClose").width() - 5);
+    }
+</script>
+<script src="${ctxStatic}/common/wsize.min.js" type="text/javascript"></script>
 </body>
 </html>

+ 104 - 83
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examList.jsp

@@ -1,91 +1,112 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-	<title>考试管理</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<%@include file="/WEB-INF/views/include/dialog.jsp" %>
-	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+    <title>考试管理</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <%@include file="/WEB-INF/views/include/dialog.jsp" %>
+    <style type="text/css">.sort {
+        color: #0663A2;
+        cursor: pointer;
+    }</style>
 </head>
 <body>
-	<ul class="nav nav-tabs">
-		<li class="active"><a href="${ctx}/admin/exam-list">考试列表</a></li>
-		<c:if test="${web_user.schoolAdmin==true}">
-		<li><a href="${ctx}/admin/exam-create">创建考试</a></li>
-		</c:if>
-	</ul>
-	<form id="searchForm"  action="${ctx}/admin/exam-list" method="post" class="breadcrumb form-search">
-		<input id="pageNumber" name="pageNumber" type="hidden"/>
-		<input id="pageSize" name="pageSize" type="hidden"/>
-		<div>
-			<label>名称</label>
-			<input type="text" id="name" name="name" value="${query.name}" htmlEscape="false" maxlength="50" class="input-medium"/>
-			&nbsp;
-			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-		</div>
-	</form>
-	<tags:message content="${message}"/>
-	<table id="contentTable" class="table table-striped table-bordered table-condensed">
-		<thead>
-			<tr>
-				<th>编号</th>
-				<th>考试名称</th>
-				<th>考试时间</th>
-				<th>强制标记</th>
-				<th>需要统分</th>
-				<th>状态</th>
-				<th>操作</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${examList}" var="exam">
-			<tr>
-				<td>${exam.id}</td>
-				<td><a href="${ctx}/admin/exam-select/${exam.id}">${exam.name}</a></td>
-				<td><fmt:formatDate value="${exam.examTime}" pattern="yyyy-MM-dd" /></td>
-				<td><c:if test="${exam.forceSpecialTag}">是</c:if>
-					<c:if test="${!exam.forceSpecialTag}">否</c:if>
-				</td>
-				<td><c:if test="${exam.needCalculate}">是</c:if>
-					<c:if test="${!exam.needCalculate}">否</c:if>
-				</td>
-				<td>${exam.status.name}</td>
-				<td>
-    				<a href="${ctx}/admin/exam-view/${exam.id}">详情</a>
-    				<c:if test="${web_user.schoolAdmin==true}">
-    				&nbsp;
-    					<a href="${ctx}/admin/exam-edit/${exam.id}">编辑</a>
-    					<a href="${ctx}/admin/exam/problem/type?examId=${exam.id}">问题卷分类</a>
-    					<c:if test="${exam.type=='MULTI_MEDIA'}">
-    					<a href="${ctx}/admin/exam/data/sync?examId=${exam.id}">数据同步</a>
-    					</c:if>
-    				</c:if>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<div class="pagination">${query}</div>
+<ul class="nav nav-tabs">
+    <li class="active"><a href="${ctx}/admin/exam/list">考试列表</a></li>
+    <c:if test="${web_user.schoolAdmin==true}">
+        <li><a href="${ctx}/admin/exam/create">创建考试</a></li>
+    </c:if>
+</ul>
+<form id="searchForm" action="${ctx}/admin/exam/list" method="post" class="breadcrumb form-search">
+    <input id="pageNumber" name="pageNumber" type="hidden"/>
+    <input id="pageSize" name="pageSize" type="hidden"/>
+    <div>
+        <label>名称</label>
+        <input type="text" id="name" name="name" value="${query.name}" htmlEscape="false" maxlength="20" class="input-medium"/>
+        <label>状态</label>
+        <select class="input-small" name="status">
+            <option value="">不限</option>
+            <c:forEach items="${statusList}" var="item">
+                <option value="${item.value}" <c:if test="${item.value==query.status.value}">selected</c:if>>${item.name}</option>
+            </c:forEach>
+        </select>
+        <label>类型</label>
+        <select class="input-small" name="type">
+            <option value="">不限</option>
+            <c:forEach items="${typeList}" var="item">
+                <option value="${item.value}" <c:if test="${item.value==query.type.value}">selected</c:if>>${item.name}</option>
+            </c:forEach>
+        </select>
+        &nbsp;
+        <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+    </div>
+</form>
+<tags:message content="${message}"/>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>ID</th>
+        <th>名称</th>
+        <th>类型</th>
+        <th>考试时间</th>
+        <th>强制标记</th>
+        <th>需要统分</th>
+        <th>状态</th>
+        <th>操作</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${examList}" var="exam">
+        <tr>
+            <td>${exam.id}</td>
+            <td><a href="${ctx}/admin/exam/edit/${exam.id}">${exam.name}</a></td>
+            <td>${exam.type.name}</td>
+            <td><fmt:formatDate value="${exam.examTime}" pattern="yyyy-MM-dd"/></td>
+            <td><c:if test="${exam.forceSpecialTag}">是</c:if>
+                <c:if test="${!exam.forceSpecialTag}">否</c:if>
+            </td>
+            <td><c:if test="${exam.needCalculate}">是</c:if>
+                <c:if test="${!exam.needCalculate}">否</c:if>
+            </td>
+            <td>${exam.status.name}</td>
+            <td>
+                <a href="${ctx}/admin/exam/view/${exam.id}">详情</a>
+                <c:if test="${web_user.schoolAdmin==true}">
+                    &nbsp;
+                    <a href="${ctx}/admin/exam/edit/${exam.id}">编辑</a>
+                    <a href="${ctx}/admin/exam/problem/type?examId=${exam.id}">问题卷分类</a>
+                    <c:if test="${exam.type=='MULTI_MEDIA'}">
+                        <a href="${ctx}/admin/exam/data/sync?examId=${exam.id}">数据同步</a>
+                    </c:if>
+                </c:if>
+            </td>
+        </tr>
+    </c:forEach>
+    </tbody>
+</table>
+<div class="pagination">${query}</div>
 <script type="text/javascript">
-function page(n,s){
-	$("#pageNumber").val(n);
-	$("#pageSize").val(s);
-	$("#searchForm").submit();
-	return false;
-}
-function goSearch(){
-	$("#pageNumber").val(1);
-	$("#pageSize").val('${query.pageSize}');
-	$("#searchForm").submit();
-	return false;
-}
-$(document).keydown(function(event) {
-	if(event.keyCode == 13 || event.keyCode== 108){
-		goSearch();
-		return false;
-	}
-});
-</script>	
+    function page(n, s) {
+        $("#pageNumber").val(n);
+        $("#pageSize").val(s);
+        $("#searchForm").submit();
+        return false;
+    }
+
+    function goSearch() {
+        $("#pageNumber").val(1);
+        $("#pageSize").val('${query.pageSize}');
+        $("#searchForm").submit();
+        return false;
+    }
+
+    $(document).keydown(function (event) {
+        if (event.keyCode == 13 || event.keyCode == 108) {
+            goSearch();
+            return false;
+        }
+    });
+</script>
 </body>
 </html>

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

@@ -0,0 +1,113 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
+<html>
+<head>
+    <title>考生添加</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+</head>
+<body>
+<form:form id="inputForm" modelAttribute="student" action="${ctx}/admin/exam/student/insert" method="post" class="form-horizontal">
+    <tags:message content="${message}"/>
+    <div class="control-group">
+        <label class="control-label">考试</label>
+        <div class="controls">
+            <form:select idd="examSelect" path="examId" class="required">
+                <c:forEach items="${examList }" var="exam">
+                    <option value="${exam.id }">${exam.id}-${exam.name}</option>
+                </c:forEach>
+            </form:select>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">科目</label>
+        <div class="controls">
+            <form:select id="subjectCodeSelect" path="subjectCode" class="required">
+            </form:select>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">姓名</label>
+        <div class="controls">
+            <form:input path="name" htmlEscape="false" maxlength="32" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">学号</label>
+        <div class="controls">
+            <form:input path="studentCode" htmlEscape="false" maxlength="32" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">准考证号</label>
+        <div class="controls">
+            <form:input path="examNumber" htmlEscape="false" maxlength="32" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">学院</label>
+        <div class="controls">
+            <form:input path="college" htmlEscape="false" maxlength="32" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">班级</label>
+        <div class="controls">
+            <form:input path="className" htmlEscape="false" maxlength="32" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">任课老师</label>
+        <div class="controls">
+            <form:input path="teacher" htmlEscape="false" maxlength="32" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">签到表编号</label>
+        <div class="controls">
+            <form:input path="packageCode" htmlEscape="false" maxlength="32" class=""/>
+        </div>
+    </div>
+    <div class="form-actions">
+        <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>&nbsp;
+        <a href="${ctx}/admin/exam/student" class="btn">返回</a>
+    </div>
+</form:form>
+<script type="text/javascript">
+    $(document).ready(function () {
+        //$("#name").focus();
+        $("#inputForm").validate({
+
+            submitHandler: function (form) {
+                //alert("studentId="+$("#studentId").val()+" subjectCode="+$("#subjectCode").val());
+                //$("#subjectCode").removeAttr("disabled");
+                loading('正在提交,请稍等...');
+                form.submit();
+            },
+            errorContainer: "#messageBox",
+            errorPlacement: function (error, element) {
+                $("#messageBox").text("输入有误,请先更正。");
+                if (element.is(":checkbox") || element.is(":radio") || element.parent().is(".input-append")) {
+                    error.appendTo(element.parent().parent());
+                } else {
+                    error.insertAfter(element);
+                }
+            }
+        });
+        $('#examSelect').change(function () {
+            let examId = $('#examSelect').val();
+            $.post('${ctx}/admin/exam/subject/list', {examId: examId}, function (list) {
+                $('#subjectCodeSelect').empty();
+                for (let i = 0; i < list.length; i++) {
+                    let item = list.get(i);
+                    $('#subjectCodeSelect').append('<option value="' + item.code + '">'
+                        + item.code + '-' + item.name + '</option>');
+                }
+                $('#subjectCodeSelect').trigger('change');
+            });
+        })
+        $('#examSelect').trigger('change');
+    });
+</script>
+</body>
+</html>

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

@@ -0,0 +1,106 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
+<html>
+<head>
+    <title>考生修改</title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+</head>
+<body>
+<form:form id="inputForm" modelAttribute="student" action="${ctx}/admin/exam/student/save" method="post" class="form-horizontal">
+    <form:hidden path="id"/>
+    <tags:message content="${message}"/>
+    <div class="control-group">
+        <label class="control-label">学习中心</label>
+        <div class="controls">
+            <select id="campusName" name="campusName" <c:if test="${student.upload }">disabled="disabled"</c:if>>
+                <c:forEach items="${campusList }" var="campusName">
+                    <option value="${campusName}" <c:if test="${student.campusName eq campusName }">selected</c:if>>${campusName }</option>
+                </c:forEach>
+            </select>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">科目</label>
+        <div class="controls">
+            <select id="subjectCode" name="subjectCode" <c:if test="${student.upload }">disabled="disabled"</c:if>>
+                <c:forEach items="${subjectList }" var="subject">
+                    <option value="${subject.code }" <c:if test="${student.subjectCode eq subject.code }">selected</c:if>>${subject.code}-${subject.name}</option>
+                </c:forEach>
+            </select>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">姓名</label>
+        <div class="controls">
+            <form:input path="name" htmlEscape="false" maxlength="200" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">学号</label>
+        <div class="controls">
+            <form:input path="studentCode" htmlEscape="false" maxlength="200" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">准考证号</label>
+        <div class="controls">
+            <input name="examNumber" htmlEscape="false" maxlength="200" class="required"
+                   <c:if test="${student.upload }">readonly="readonly"</c:if> value="${student.examNumber }"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">学院</label>
+        <div class="controls">
+            <form:input path="college" htmlEscape="false" maxlength="200" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">班级</label>
+        <div class="controls">
+            <form:input path="className" htmlEscape="false" maxlength="200" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">任课老师</label>
+        <div class="controls">
+            <form:input path="teacher" htmlEscape="false" maxlength="200" class="required"/>
+        </div>
+    </div>
+    <div class="control-group">
+        <label class="control-label">签到表编号</label>
+        <div class="controls">
+            <form:input path="packageCode" htmlEscape="false" maxlength="200" class=""/>
+        </div>
+    </div>
+    <div class="form-actions">
+        <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>&nbsp;
+        <a href="${ctx}/admin/exam/student" class="btn">返回</a>
+    </div>
+</form:form>
+<script type="text/javascript">
+    $(document).ready(function () {
+        //$("#name").focus();
+        $("#inputForm").validate({
+
+            submitHandler: function (form) {
+                //alert("studentId="+$("#studentId").val()+" subjectCode="+$("#subjectCode").val());
+                $("#subjectCode").removeAttr("disabled");
+                $("#campusName").removeAttr("disabled");
+                loading('正在提交,请稍等...');
+                form.submit();
+            },
+            errorContainer: "#messageBox",
+            errorPlacement: function (error, element) {
+                $("#messageBox").text("输入有误,请先更正。");
+                if (element.is(":checkbox") || element.is(":radio") || element.parent().is(".input-append")) {
+                    error.appendTo(element.parent().parent());
+                } else {
+                    error.insertAfter(element);
+                }
+            }
+        });
+    });
+</script>
+</body>
+</html>

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

@@ -1,105 +0,0 @@
-<%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
-<html>
-<head>
-	<title>考试管理</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-</head>
-<body>
-	<form:form id="inputForm" modelAttribute="student" action="${ctx}/admin/exam/student/save" method="post" class="form-horizontal">
-		<form:hidden path="id"/>
-		<tags:message content="${message}"/>
-		<div class="control-group">
-			<label class="control-label">学习中心</label>
-			<div class="controls">
-				<select id="campusName" name="campusName" <c:if test="${student.upload }">disabled="disabled"</c:if>>
-					<c:forEach items="${campusList }" var="campusName">
-					<option value="${campusName}" <c:if test="${student.campusName eq campusName }">selected</c:if>>${campusName }</option>
-					</c:forEach>
-				</select>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">科目</label>
-			<div class="controls">
-				<select id="subjectCode" name="subjectCode" <c:if test="${student.upload }">disabled="disabled"</c:if>>
-				<c:forEach items="${subjectList }" var="subject">
-					<option value="${subject.code }" <c:if test="${student.subjectCode eq subject.code }">selected</c:if>>${subject.code}-${subject.name}</option>
-				</c:forEach>
-				</select>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">姓名</label>
-			<div class="controls">
-				<form:input path="name" htmlEscape="false" maxlength="200" class="required"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">学号</label>
-			<div class="controls">
-				<form:input path="studentCode" htmlEscape="false" maxlength="200" class="required"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">准考证号</label>
-			<div class="controls">
-				<input name="examNumber" htmlEscape="false" maxlength="200" class="required" <c:if test="${student.upload }">readonly="readonly"</c:if> value="${student.examNumber }"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">学院</label>
-			<div class="controls">
-				<form:input path="college" htmlEscape="false" maxlength="200" class="required"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">班级</label>
-			<div class="controls">
-				<form:input path="className" htmlEscape="false" maxlength="200" class="required"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">任课老师</label>
-			<div class="controls">
-				<form:input path="teacher" htmlEscape="false" maxlength="200" class="required"/>
-			</div>
-		</div>
-		<div class="control-group">
-			<label class="control-label">签到表编号</label>
-			<div class="controls">
-				<form:input path="packageCode" htmlEscape="false" maxlength="200" class=""/>
-			</div>
-		</div>
-		<div class="form-actions">
-			<input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>&nbsp;
-			<a href="${ctx}/admin/exam/student" class="btn">返回</a>
-		</div>
-	</form:form>
-<script type="text/javascript">
-	$(document).ready(function() {
-		//$("#name").focus();
-		$("#inputForm").validate({
-			
-			submitHandler: function(form){
-				//alert("studentId="+$("#studentId").val()+" subjectCode="+$("#subjectCode").val());
-				 $("#subjectCode").removeAttr("disabled");
-				 $("#campusName").removeAttr("disabled");
-				loading('正在提交,请稍等...');
-				form.submit();
-			},
-			errorContainer: "#messageBox",
-			errorPlacement: function(error, element) {
-				$("#messageBox").text("输入有误,请先更正。");
-				if (element.is(":checkbox")||element.is(":radio")||element.parent().is(".input-append")){
-					error.appendTo(element.parent().parent());
-				} else {
-					error.insertAfter(element);
-				}
-			}
-		});
-	});
-</script>	
-</body>
-</html>

+ 313 - 271
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/studentList.jsp

@@ -1,288 +1,330 @@
 <%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-	<title>考生管理</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+    <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>
-	<div id="importBox" class="hide">
-		<form id="importForm" action="${ctx}/admin/exam/student/import" method="post" enctype="multipart/form-data"
-			style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-			<input id="uploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
-			<input id="btnImportSubmit" class="btn btn-primary" type="submit" value="   导    入   "/>
-			<a href="${ctx}/admin/exam/student/template">下载模板</a>
-		</form>
-	</div>
-	<div id="breachImportBox" class="hide">
-        <form id="breachImportForm" action="${ctx}/admin/exam/student/breachImport" method="post" enctype="multipart/form-data"
-              style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-            <input id="breachUploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
-            <input id="breachBtnImportSubmit" class="btn btn-primary" type="submit" value="违纪考生导入"/>
-            <a href="${ctx}/admin/exam/student/breachTemplate">下载模板</a>
-        </form>
+<div id="importBox" class="hide">
+    <form id="importForm" action="${ctx}/admin/exam/student/import" method="post" enctype="multipart/form-data"
+          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
+        <select class="input-large" name="examId">
+            <c:forEach items="${examList }" var="exam">
+                <option value="${exam.id }">${exam.id}-${exam.name}</option>
+            </c:forEach>
+        </select>
+        <input id="uploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
+        <input id="btnImportSubmit" class="btn btn-primary" type="submit" value="   导    入   "/>
+        <a href="${ctx}/admin/exam/student/template">下载模板</a>
+    </form>
+</div>
+<div id="breachImportBox" class="hide">
+    <form id="breachImportForm" action="${ctx}/admin/exam/student/breachImport" method="post" enctype="multipart/form-data"
+          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
+        <select class="input-large" name="examId">
+            <c:forEach items="${examList }" var="exam">
+                <option value="${exam.id }">${exam.id}-${exam.name}</option>
+            </c:forEach>
+        </select>
+        <input id="breachUploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
+        <input id="breachBtnImportSubmit" class="btn btn-primary" type="submit" value="违纪考生导入"/>
+        <a href="${ctx}/admin/exam/student/breachTemplate">下载模板</a>
+    </form>
+</div>
+<div id="absentImportBox" class="hide">
+    <form id="absentImportForm" action="${ctx}/admin/exam/student/absentImport" method="post" enctype="multipart/form-data"
+          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
+        <select class="input-large" name="examId">
+            <c:forEach items="${examList }" var="exam">
+                <option value="${exam.id }">${exam.id}-${exam.name}</option>
+            </c:forEach>
+        </select>
+        <input id="absentUploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
+        <input id="absentBtnImportSubmit" class="btn btn-primary" type="submit" value="缺考考生导入"/>
+        <a href="${ctx}/admin/exam/student/absentTemplate">下载模板</a>
+    </form>
+</div>
+<div id="uploadImportBox" class="hide">
+    <form id="uploadImportForm" action="${ctx}/admin/exam/student/uploadImport" method="post" enctype="multipart/form-data"
+          style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
+        <select class="input-large" name="examId">
+            <c:forEach items="${examList }" var="exam">
+                <option value="${exam.id }">${exam.id}-${exam.name}</option>
+            </c:forEach>
+        </select>
+        <input id="studentUploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
+        <input id="uploadBtnImportSubmit" class="btn btn-primary" type="submit" value="多媒体考生上传导入"/>
+        <a href="${ctx}/admin/exam/student/uploadTemplate">下载模板</a>
+    </form>
+</div>
+<form id="searchForm" action="${ctx}/admin/exam-param/student" 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}"/>
+    <div>
+        <label>考试</label>
+        <select class="input-large" id="examId" name="examId">
+            <c:forEach items="${examList }" var="exam">
+                <option value="${exam.id }" <c:if test="${query.examId eq exam.id }">selected</c:if>>${exam.id}-${exam.name}</option>
+            </c:forEach>
+        </select>
+        <label>姓名</label>
+        <input type="text" name="name" value="${query.name}" maxlength="10" class="input-mini"/>
+        <label>准考证号</label>
+        <input type="text" name="examNumber" value="${query.examNumber}" maxlength="50" class="input-small"/>
+        <label>学号</label>
+        <input type="text" name="studentCode" value="${query.studentCode}" maxlength="30" class="input-small"/>
+        <label>科目</label>
+        <select class="input-large" id="subjectCode" name="subjectCode">
+            <option value="">请选择</option>
+            <c:forEach items="${subjectList }" var="subject">
+                <option value="${subject.code }" <c:if test="${query.subjectCode eq subject.code }">selected</c:if>>${subject.code}-${subject.name}</option>
+            </c:forEach>
+        </select>
+        <br><br>
+        <label>层次</label>
+        <select class="input-small" id="subjectLevel" name="subjectLevel">
+            <option value="">请选择</option>
+            <c:forEach items="${levelList }" var="level">
+                <option value="${level}" <c:if test="${query.subjectLevel eq level }">selected</c:if>>${level}</option>
+            </c:forEach>
+        </select>
+        <label>专业类型</label>
+        <select class="input-small" id="subjectCategory" name="subjectCategory">
+            <option value="">请选择</option>
+            <c:forEach items="${categoryList }" var="category">
+                <option value="${category}" <c:if test="${query.subjectCategory eq category }">selected</c:if>>${category}</option>
+            </c:forEach>
+        </select>
+        
+        <label>状态</label>
+        <select id="upload" name="upload" class="input-small">
+            <option value="">不限</option>
+            <option value="1" <c:if test="${query.upload!=null && query.upload==true}">selected</c:if>>已上传</option>
+            <option value="0" <c:if test="${query.upload!=null && query.upload==false}">selected</c:if>>未上传</option>
+        </select>
+        <select id="absent" name="absent" class="input-small">
+            <option value="">不限</option>
+            <option value="1" <c:if test="${query.absent!=null && query.absent==true}">selected</c:if>>缺考</option>
+            <option value="0" <c:if test="${query.absent!=null && query.absent==false}">selected</c:if>>正常</option>
+        </select>
+        <select id="breach" name="breach" class="input-small">
+            <option value="">不限</option>
+            <option value="1" <c:if test="${query.breach!=null && query.breach==true}">selected</c:if>>违纪</option>
+            <option value="0" <c:if test="${query.breach!=null && query.breach==false}">selected</c:if>>正常</option>
+        </select>
+        <select id="manualAbsent" name="manualAbsent" class="input-small">
+            <option value="">不限</option>
+            <option value="1" <c:if test="${query.manualAbsent!=null && query.manualAbsent==true}">selected</c:if>>人工指定缺考</option>
+            <option value="0" <c:if test="${query.manualAbsent!=null && query.manualAbsent==false}">selected</c:if>>正常</option>
+        </select>
+        <br><br>
+        <label>签到表编号</label>
+        <input type="text" name="packageCode" value="${query.packageCode}" maxlength="30" class="input-small"/>
+        <label>批次编号</label>
+        <input type="text" name="batchCode" value="${query.batchCode}" maxlength="30" class="input-small"/>
+        <br><br>
+        &nbsp;<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+        <c:if test="${web_user.schoolAdmin==true}">
+            &nbsp;<a href="${ctx}/admin/exam/student/add" class="btn btn-primary">添加</a>
+            &nbsp;<input id="btnImport" class="btn" type="button" value="导入"/>
+            <c:if test="${examType!='MULTI_MEDIA' }">
+                &nbsp;<div class="btn-group">
+                <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
+                    导入名单<span class="caret"></span>
+                </a>
+                <ul class="dropdown-menu">
+                    <li><a href="##" id="breachBtnImport">违纪名单</a></li>
+                    <li><a href="##" id="absentBtnImport">缺考名单</a></li>
+                    <!-- <li><a href="##" id="uploadBtnImport">多媒体上传名单</a></li> -->
+                </ul>
+                </div>
+            </c:if>
+        </c:if>
+        <c:if test="${query.totalCount>0 && query.totalCount<=10000}">
+            &nbsp;<input id="export-button" class="btn" type="button" value="导出"/>
+        </c:if>
     </div>
-    <div id="absentImportBox" class="hide">
-        <form id="absentImportForm" action="${ctx}/admin/exam/student/absentImport" method="post" enctype="multipart/form-data"
-              style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-            <input id="absentUploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
-            <input id="absentBtnImportSubmit" class="btn btn-primary" type="submit" value="缺考考生导入"/>
-            <a href="${ctx}/admin/exam/student/absentTemplate">下载模板</a>
-        </form>
-    </div>
-    <div id="uploadImportBox" class="hide">
-        <form id="uploadImportForm" action="${ctx}/admin/exam/student/uploadImport" method="post" enctype="multipart/form-data"
-              style="padding-left:20px;text-align:center;" class="form-search" onsubmit="loading('正在导入,请稍等...');"><br/>
-            <input id="studentUploadFile" name="file" type="file" style="width:330px"/><br/><br/>  
-            <input id="uploadBtnImportSubmit" class="btn btn-primary" type="submit" value="多媒体考生上传导入"/>
-            <a href="${ctx}/admin/exam/student/uploadTemplate">下载模板</a>
-        </form>
-    </div>
-	<form id="searchForm"  action="${ctx}/admin/exam-param/student" 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}"/>
-		<div>
-			<label>姓名</label>
-			<input type="text" name="name" value="${query.name}"  maxlength="10" class="input-mini"/>
-			<label>准考证号</label>
-			<input type="text" name="examNumber" value="${query.examNumber}" maxlength="50" class="input-small"/>
-			<label>学号</label>
-			<input type="text" name="studentCode" value="${query.studentCode}" maxlength="30" class="input-small"/>
-			<label>科目</label>
-			<select class="input-large" id="subjectCode" name="subjectCode">
-				<option value="">请选择</option>
-				<c:forEach items="${subjectList }" var="subject">
-					<option value="${subject.code }" <c:if test="${query.subjectCode eq subject.code }">selected</c:if>>${subject.code}-${subject.name}</option>
-				</c:forEach>
-			</select>
-			<br><br>
-			<label>层次</label>
-			<select class="input-small" id="subjectLevel" name="subjectLevel">
-				<option value="">请选择</option>
-				<c:forEach items="${levelList }" var="level">
-					<option value="${level}" <c:if test="${query.subjectLevel eq level }">selected</c:if>>${level}</option>
-				</c:forEach>
-			</select>
-			<label>专业类型</label>
-			<select class="input-small" id="subjectCategory" name="subjectCategory">
-				<option value="">请选择</option>
-				<c:forEach items="${categoryList }" var="category">
-					<option value="${category}" <c:if test="${query.subjectCategory eq category }">selected</c:if>>${category}</option>
-				</c:forEach>
-			</select>
-			
-			<label>状态</label>
-			<select id="upload" name="upload" class="input-small">
-				<option value="">不限</option>
-				<option value="1" <c:if test="${query.upload!=null && query.upload==true}">selected</c:if>>已上传</option>
-				<option value="0" <c:if test="${query.upload!=null && query.upload==false}">selected</c:if>>未上传</option>
-			</select>
-			<select id="absent" name="absent" class="input-small">
-				<option value="">不限</option>
-				<option value="1" <c:if test="${query.absent!=null && query.absent==true}">selected</c:if>>缺考</option>
-				<option value="0" <c:if test="${query.absent!=null && query.absent==false}">selected</c:if>>正常</option>
-			</select>
-			<select id="breach" name="breach" class="input-small">
-				<option value="">不限</option>
-				<option value="1" <c:if test="${query.breach!=null && query.breach==true}">selected</c:if>>违纪</option>
-				<option value="0" <c:if test="${query.breach!=null && query.breach==false}">selected</c:if>>正常</option>
-			</select>
-			<select id="manualAbsent" name="manualAbsent" class="input-small">
-				<option value="">不限</option>
-				<option value="1" <c:if test="${query.manualAbsent!=null && query.manualAbsent==true}">selected</c:if>>人工指定缺考</option>
-				<option value="0" <c:if test="${query.manualAbsent!=null && query.manualAbsent==false}">selected</c:if>>正常</option>
-			</select>
-			<br><br>
-			<label>签到表编号</label>
-			<input type="text" name="packageCode" value="${query.packageCode}" maxlength="30" class="input-small"/>
-			<label>批次编号</label>
-			<input type="text" name="batchCode" value="${query.batchCode}" maxlength="30" class="input-small"/>
-			<br><br>
-			&nbsp;<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-			<c:if test="${web_user.schoolAdmin==true}">
-			&nbsp;<a href="${ctx}/admin/exam/student/add" class="btn btn-primary">添加</a>
-			&nbsp;<input id="btnImport" class="btn" type="button" value="导入"/>
-				<c:if test="${examType!='MULTI_MEDIA' }">
-			&nbsp;<div class="btn-group">
-                        <a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
-                            导入名单<span class="caret"></span>
-                        </a>
-                        <ul class="dropdown-menu">
-                            <li><a href="##" id="breachBtnImport">违纪名单</a></li>
-                            <li><a href="##" id="absentBtnImport">缺考名单</a></li>
-<!--                             <li><a href="##" id="uploadBtnImport">多媒体上传名单</a></li> -->
-                        </ul>
-            	</div>
-            	</c:if>
-			</c:if>
-			<c:if test="${query.totalCount>0 && query.totalCount<=10000}">
-			&nbsp;<input id="export-button" class="btn" type="button" value="导出"/>
-			</c:if>
-		</div>
-	</form>
-	<tags:message content="${message}"/>
-	<table id="contentTable" class="table table-striped table-bordered table-condensed">
-		<thead>
-			<tr>
-				<th>准考证号</th>
-				<th>姓名</th>
-				<th>学号</th>
-				<th>科目</th>
-				<th>试卷类型</th>
-				<th>层次</th>
-				<th>专业类型</th>
-				<th>扫描识别</th>
-				<th>人工指定</th>
-				<th>批次编号</th>
-				<th>签到表编号</th>
-				<th>考试备注信息</th>
-				<th>操作</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${studentList}" var="student">
-			<tr>
-				<td>${student.examNumber}</td>
-				<td>${student.name}</td>
-				<td>${student.studentCode}</td>
-				<td>${student.subjectCode}-${student.subjectName}</td>
-				<td>${student.paperType}</td>
-				<td>${student.subject.level}</td>
-				<td>${student.subject.category}</td>
-				<td>
-				<c:if test="${student.upload==true}">
-					<c:if test="${examType!='MULTI_MEDIA'}">
-					<a class="sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>" data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">已上传</a>
-					</c:if>
-					<c:if test="${examType=='MULTI_MEDIA'}">
-					已上传
-					</c:if>
-				&nbsp;
-				<c:if test="${student.absent==true}">
-				缺考
-				</c:if>
-				<c:if test="${student.absent==false}">
-				正常
-				</c:if>
-				</c:if>
-				
-				<c:if test="${student.upload==false}">
-				未上传
-				</c:if>
-				
-				</td>
-				<td >
-                    <c:if test="${student.breach==true}">
-                    	<c:if test="${web_user.schoolAdmin==true}">
-                        <a href="##" onclick="updateBreach(${student.id});">违纪</a></c:if>
-                        <c:if test="${web_user.schoolAdmin!=true}">违纪</c:if>
+</form>
+<tags:message content="${message}"/>
+<table id="contentTable" class="table table-striped table-bordered table-condensed">
+    <thead>
+    <tr>
+        <th>准考证号</th>
+        <th>姓名</th>
+        <th>学号</th>
+        <th>科目</th>
+        <th>试卷类型</th>
+        <th>层次</th>
+        <th>专业类型</th>
+        <th>扫描状态</th>
+        <th>人工指定</th>
+        <th>扫描批次</th>
+        <th>签到表编号</th>
+        <th>考点考场</th>
+        <th>操作</th>
+    </tr>
+    </thead>
+    <tbody>
+    <c:forEach items="${studentList}" var="student">
+        <tr>
+            <td>${student.examNumber}</td>
+            <td>${student.name}</td>
+            <td>${student.studentCode}</td>
+            <td>${student.subjectCode}-${student.subjectName}</td>
+            <td>${student.paperType}</td>
+            <td>${student.subject.level}</td>
+            <td>${student.subject.category}</td>
+            <td>
+                <c:if test="${student.upload==true}">
+                    <c:if test="${examType!='MULTI_MEDIA'}">
+                        <a class="sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>"
+                           data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">已上传</a>
                     </c:if>
-                    <c:if test="${student.breach==false}">
-                        正常
+                    <c:if test="${examType=='MULTI_MEDIA'}">
+                        已上传
                     </c:if>
                     &nbsp;
-                    <c:if test="${student.manualAbsent==true}">
-				    人工指定
-				    </c:if>
-				    <c:if test="${student.manualAbsent==false}">
-				    正常
-				    </c:if>
-                </td>
-				<td>${student.batchCode}</td>
-				<td>
-				<c:if test="${student.packageUrlString!=null && student.packageUrlString!=''}">
-					<a class="package-link" href="##" data-image-url="${student.packageUrlString}" data-title="${student.packageCode}">${student.packageCode}</a>
-				</c:if>
-				<c:if test="${student.packageUrlString==null || student.packageUrlString==''}">
-					${student.packageCode}
-				</c:if>
-				</td>
-				<td>${student.examSite}&nbsp;${student.examRoom}</td>
-				<td>
-				    <c:if test="${web_user.schoolAdmin==true}">
-    				<a href="${ctx}/admin/exam/student/update?id=${student.id}">修改</a>
-    				<c:if test="${examType!='MULTI_MEDIA'}">
-					&nbsp;
-    				<a href="${ctx}/admin/exam/student/delete?id=${student.id}" onclick="return confirmx('确认要删除该考生吗?', this.href)">删除</a>
-					</c:if>
-					</c:if>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<div class="pagination">${query}</div>
-	<%@include file="/WEB-INF/views/include/sheetView.jsp" %>
-	<%@include file="/WEB-INF/views/include/imageView.jsp" %>
+                    <c:if test="${student.absent==true}">
+                        缺考
+                    </c:if>
+                    <c:if test="${student.absent==false}">
+                        正常
+                    </c:if>
+                </c:if>
+                
+                <c:if test="${student.upload==false}">
+                    未上传
+                </c:if>
+            
+            </td>
+            <td>
+                <c:if test="${student.breach==true}">
+                    <c:if test="${web_user.schoolAdmin==true}">
+                        <a href="##" onclick="updateBreach(${student.id});">违纪</a></c:if>
+                    <c:if test="${web_user.schoolAdmin!=true}">违纪</c:if>
+                </c:if>
+                <c:if test="${student.breach==false}">
+                    正常
+                </c:if>
+                &nbsp;
+                <c:if test="${student.manualAbsent==true}">
+                    人工指定
+                </c:if>
+                <c:if test="${student.manualAbsent==false}">
+                    正常
+                </c:if>
+            </td>
+            <td>${student.batchCode}</td>
+            <td>
+                <c:if test="${student.packageUrlString!=null && student.packageUrlString!=''}">
+                    <a class="package-link" href="##" data-image-url="${student.packageUrlString}" data-title="${student.packageCode}">${student.packageCode}</a>
+                </c:if>
+                <c:if test="${student.packageUrlString==null || student.packageUrlString==''}">
+                    ${student.packageCode}
+                </c:if>
+            </td>
+            <td>${student.examSite}&nbsp;${student.examRoom}</td>
+            <td>
+                <c:if test="${web_user.schoolAdmin==true}">
+                    <a href="${ctx}/admin/exam/student/update?id=${student.id}">修改</a>
+                    <c:if test="${examType!='MULTI_MEDIA'}">
+                        &nbsp;
+                        <a href="${ctx}/admin/exam/student/delete?id=${student.id}" onclick="return confirmx('确认要删除该考生吗?', this.href)">删除</a>
+                    </c:if>
+                </c:if>
+            </td>
+        </tr>
+    </c:forEach>
+    </tbody>
+</table>
+<div class="pagination">${query}</div>
+<%@include file="/WEB-INF/views/include/sheetView.jsp" %>
+<%@include file="/WEB-INF/views/include/imageView.jsp" %>
 <script type="text/javascript">
 
-$(document).ready(function() {
-    $('.sheet-link').click(function(){
-    	initSheetPopover($(this).attr('data-title'), '${imageServer}', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
-    	return false;
+    $(document).ready(function () {
+        $('.sheet-link').click(function () {
+            initSheetPopover($(this).attr('data-title'), '${imageServer}', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
+            return false;
+        });
+        $('.package-link').click(function () {
+            initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
+            return false;
+        });
     });
-    $('.package-link').click(function(){
-    	initImagePopover($(this).attr('data-title'), '${packageServer}', $(this).attr('data-image-url'));
-    	return false;
+
+    $('#packageCode').click(function () {
+        console.log(1111);
+        $('#collapse1 > div > ul > li:nth-child(5)').addClass('active');
+    });
+
+    $("#btnImport").click(function () {
+        $.jBox($("#importBox").html(), {
+            title: "导入数据", buttons: {"关闭": true},
+            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
+        });
+    });
+    $("#breachBtnImport").click(function () {
+        $.jBox($("#breachImportBox").html(), {
+            title: "导入数据", buttons: {"关闭": true},
+            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
+        });
     });
-});
+    $("#absentBtnImport").click(function () {
+        $.jBox($("#absentImportBox").html(), {
+            title: "导入数据", buttons: {"关闭": true},
+            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
+        });
+    });
+    $("#uploadBtnImport").click(function () {
+        $.jBox($("#uploadImportBox").html(), {
+            title: "导入数据", buttons: {"关闭": true},
+            bottomText: "导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"
+        });
+    });
+    $("#export-button").click(function () {
+        $("#searchForm").attr("action", "${ctx}/admin/exam/student/export");
+        $("#searchForm").submit();
+    });
+
+    function page(n, s) {
+        $("#pageNumber").val(n);
+        $("#pageSize").val(s);
+        $("#searchForm").attr("action", "${ctx}/admin/exam/student");
+        $("#searchForm").submit();
+        return false;
+    }
 
-$('#packageCode').click(function(){
-	console.log(1111);
-	$('#collapse1 > div > ul > li:nth-child(5)').addClass('active');
-});
+    function goSearch() {
+        $("#pageNumber").val(1);
+        $("#pageSize").val('${query.pageSize}');
+        $("#searchForm").attr("action", "${ctx}/admin/exam/student");
+        $("#searchForm").submit();
+        return false;
+    }
 
-$("#btnImport").click(function(){
-	$.jBox($("#importBox").html(), {title:"导入数据", buttons:{"关闭":true}, 
-		bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
-});
-$("#breachBtnImport").click(function(){
-	$.jBox($("#breachImportBox").html(), {title:"导入数据", buttons:{"关闭":true},
-		bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
-});
-$("#absentBtnImport").click(function(){
-	$.jBox($("#absentImportBox").html(), {title:"导入数据", buttons:{"关闭":true},
-		bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
-});
-$("#uploadBtnImport").click(function(){
-	$.jBox($("#uploadImportBox").html(), {title:"导入数据", buttons:{"关闭":true},
-		bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
-});
-$("#export-button").click(function(){
-	$("#searchForm").attr("action","${ctx}/admin/exam/student/export");
-	$("#searchForm").submit();
-});
-function page(n,s){
-	$("#pageNumber").val(n);
-	$("#pageSize").val(s);
-	$("#searchForm").attr("action","${ctx}/admin/exam/student");
-	$("#searchForm").submit();
-	return false;
-}
-function goSearch(){
-	$("#pageNumber").val(1);
-	$("#pageSize").val('${query.pageSize}');
-	$("#searchForm").attr("action","${ctx}/admin/exam/student");
-	$("#searchForm").submit();
-	return false;
-}
-function updateBreach(studentId) {
-	  top.$.jBox.confirm("确认要将该考生违纪重置为正常?","提示",function(v,h,f){
-	    if(v=="ok"){
-	      var url = '${ctx}/admin/exam/student/updateBreach?id='+studentId;
-	      $.ajax( {
-	        url : url,
-	        type : "POST",
-	        success : function(val) {
-	          if(val.success){
-	            window.location.href="${ctx}/admin/exam/student";
-	          }
-	        }})
-	    }
-	  });
-}
-</script>	
+    function updateBreach(studentId) {
+        top.$.jBox.confirm("确认要将该考生违纪重置为正常?", "提示", function (v, h, f) {
+            if (v == "ok") {
+                var url = '${ctx}/admin/exam/student/updateBreach?id=' + studentId;
+                $.ajax({
+                    url: url,
+                    type: "POST",
+                    success: function (val) {
+                        if (val.success) {
+                            window.location.href = "${ctx}/admin/exam/student";
+                        }
+                    }
+                })
+            }
+        });
+    }
+</script>
 </body>
 </html>

+ 30 - 30
stmms-web/src/main/webapp/static/mark-new/js/modules/image-builder.js

@@ -1,5 +1,5 @@
 //简单多张图片排列显示模块
-var image_builder = function(option, success) {
+var image_builder = function (option, success) {
     var object = new ImageBuilder(option);
     success();
     return object;
@@ -10,33 +10,33 @@ function ImageBuilder(option) {
     this.init();
 }
 
-ImageBuilder.prototype.init = function() {
+ImageBuilder.prototype.init = function () {
     this.container = getDom(this.canvas_dom, this.markControl).appendTo(this.markControl.container);
     this.container.hide();
     this.canvas = document.getElementById('image-builder-canvas');
     this.ctx = this.canvas.getContext("2d");
 }
 
-ImageBuilder.prototype.build = function(task, callback) {
+ImageBuilder.prototype.build = function (task, callback) {
     var self = this;
     //初始化图片拼接配置,过滤实际需要加载的图片
     var config = task.pictureConfig;
     var indexSet = {};
-    for(var i=0;i<config.length;i++){
-    	indexSet[config[i].i-1] = true;
+    for (var i = 0; i < config.length; i++) {
+        indexSet[config[i].i - 1] = true;
     }
     //调用图片预加载函数,实现回调函数
     var imageObjects = [];
-    this.loadImages(imageObjects, indexSet, task.pictureUrls, 0, function(images) {
+    this.loadImages(imageObjects, indexSet, task.pictureUrls, 0, function (images) {
         var maxWidth = 0;
         var totalHeight = 0;
         for (var i = 0; i < config.length; i++) {
             //计算最大宽度与合计高度
-            if(config[i].w<=0){
-            	config[i].w=images[config[i].i-1].width;
+            if (config[i].w <= 0) {
+                config[i].w = images[config[i].i - 1].width;
             }
-            if(config[i].h<=0){
-            	config[i].h=images[config[i].i-1].height;
+            if (config[i].h <= 0) {
+                config[i].h = images[config[i].i - 1].height;
             }
             maxWidth = Math.max(maxWidth, config[i].w);
             totalHeight += config[i].h;
@@ -50,7 +50,7 @@ ImageBuilder.prototype.build = function(task, callback) {
             //绘画到画布
             var height = 0;
             for (var i = 0; i < config.length; i++) {
-                var image = images[config[i].i-1];
+                var image = images[config[i].i - 1];
                 self.ctx.drawImage(image, config[i].x, config[i].y, config[i].w, config[i].h, 0, height, config[i].w, config[i].h);
                 height += config[i].h;
             }
@@ -59,7 +59,7 @@ ImageBuilder.prototype.build = function(task, callback) {
             self.ctx.clearRect(0, 0, self.canvas.width, self.canvas.height);
         }
         callback();
-    }, function(error) {
+    }, function (error) {
         if (error) {
             console.log(error);
         }
@@ -75,27 +75,27 @@ ImageBuilder.prototype.build = function(task, callback) {
 参数callback:回调函数——所有图片加载完成后才执行此函数
 参数exception:回调函数——任一图片加载失败后立即执行此函数
 */
-ImageBuilder.prototype.loadImages = function(images, indexSet, urls, number, callback, exception) {
+ImageBuilder.prototype.loadImages = function (images, indexSet, urls, number, callback, exception) {
     var self = this;
     var imageServer = this.markControl.context.imageServer;
-    var defaultServer = this.markControl.option.imageServer;
+    //var defaultServer = this.markControl.option.imageServer;
     if (urls != undefined && number < urls.length) {
-    	if(indexSet[number]==true){
-    		var img = new Image();
-        	img.onload = function() {
-            	images.push(img);
-            	self.loadImages(images, indexSet, urls, number + 1, callback, exception);
-        	}
-        	img.onerror = function() {
-            	img.onerror = undefined;
-            	exception('load error for: ' + img.src);
-        	}
-        	img.crossOrigin = '';
-        	img.src = imageServer + urls[number] + '?' + new Date().getTime();
-    	}else{
-    		images.push({});
-    		self.loadImages(images, indexSet, urls, number + 1, callback, exception);
-    	}
+        if (indexSet[number] == true) {
+            var img = new Image();
+            img.onload = function () {
+                images.push(img);
+                self.loadImages(images, indexSet, urls, number + 1, callback, exception);
+            }
+            img.onerror = function () {
+                img.onerror = undefined;
+                exception('load error for: ' + img.src);
+            }
+            img.crossOrigin = '';
+            img.src = imageServer + urls[number] + '?' + new Date().getTime();
+        } else {
+            images.push({});
+            self.loadImages(images, indexSet, urls, number + 1, callback, exception);
+        }
     } else {
         callback.call(this, images);
     }