ソースを参照

所有考试相关功能页面增加考试列表选择;评卷员与班级的绑定关系,改为评卷用户与班级的绑定

ting.yin 4 年 前
コミット
5d41b4c722
39 ファイル変更1060 行追加565 行削除
  1. 2 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java
  2. 8 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  3. 7 5
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkerClassDao.java
  4. 1 26
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Marker.java
  5. 44 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkerClass.java
  6. 3 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java
  7. 2 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java
  8. 10 8
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkerClassService.java
  9. 2 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java
  10. 37 36
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  11. 26 24
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkerClassServiceImpl.java
  12. 26 24
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java
  13. 4 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java
  14. 1 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkLibraryService.java
  15. 13 9
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/MarkRedisUtil.java
  16. 2 4
      stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/MarkerExcelError.java
  17. 20 28
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/AnswerCheckController.java
  18. 21 29
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java
  19. 0 5
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/DataSyncController.java
  20. 42 23
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java
  21. 32 36
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  22. 76 58
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java
  23. 34 37
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ProblemHistoryController.java
  24. 1 6
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ProblemTypeController.java
  25. 9 8
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/home/HomeController.java
  26. 15 8
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/interceptor/AdminInterceptor.java
  27. 12 21
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/SubjectUserController.java
  28. 158 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserClassController.java
  29. 6 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/utils/SessionExamUtils.java
  30. 2 2
      stmms-web/src/main/java/cn/com/qmth/stmms/common/domain/WebUser.java
  31. 21 36
      stmms-web/src/main/java/cn/com/qmth/stmms/common/interceptor/LogInterceptor.java
  32. 62 38
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  33. 12 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examIndex.jsp
  34. 97 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examSelect.jsp
  35. 14 4
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/markerList.jsp
  36. 79 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/markerSubject.jsp
  37. 92 59
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/subjectSelect.jsp
  38. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/user/userList.jsp
  39. 66 1
      stmms-web/src/main/webapp/static/common/login.css

+ 2 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java

@@ -40,8 +40,7 @@ public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaS
 
     public Exam findFirstBySchoolIdAndCode(Integer schoolId, String code);
 
-    @Query(value =
-            "select * from eb_exam e where e.id in (select m.exam_id from eb_marker m where m.user_id=?1) and e.create_time >?2 "
-                    + "order by e.id", nativeQuery = true)
+    @Query(value = "select * from eb_exam e where e.id in (select m.exam_id from eb_marker m where m.user_id=?1) and e.create_time >?2 "
+            + "order by e.id", nativeQuery = true)
     public List<Exam> findByUserId(Integer id, Date time);
 }

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

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.biz.exam.dao;
 
 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;
@@ -10,8 +11,8 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 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);
 
@@ -120,8 +121,7 @@ public interface ExamStudentDao
 
     @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)")
@@ -148,8 +148,7 @@ public interface ExamStudentDao
     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);
@@ -166,4 +165,7 @@ public interface ExamStudentDao
             + "in (select e.id from Exam e where e.schoolId=?1)")
     public List<ExamStudent> findBySchoolIdAndStudentCodeAndName(Integer schoolId, String studentCode, String name);
 
+    @Query("select s.className from ExamStudent s where s.examId=?1 group by s.className")
+    public List<String> findDistinctClassName(Integer examId);
+
 }

+ 7 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkerClassDao.java

@@ -12,13 +12,15 @@ import cn.com.qmth.stmms.biz.exam.model.MarkerClass;
 public interface MarkerClassDao extends PagingAndSortingRepository<MarkerClass, Integer>,
         JpaSpecificationExecutor<MarkerClass> {
 
-    List<MarkerClass> findByMarkerId(int markerId);
+    List<MarkerClass> findByUserIdAndExamId(int userId, int examId);
 
-    @Query("select count(s) from MarkerClass s where s.markerId=?1")
-    public long countByMarkerId(int markerId);
+    @Query("select count(s) from MarkerClass s where s.userId=?1 and s.examId=?2 ")
+    public long countByUserIdAndExamId(int userId, int examId);
 
     @Modifying
-    @Query("delete MarkerClass c where c.markerId=?1 ")
-    void deleteByMarkerId(int markerId);
+    @Query("delete MarkerClass c where c.userId=?1 and c.examId=?2 ")
+    void deleteByUserIdAndExamId(int userId, int examId);
+
+    MarkerClass findByUserIdAndExamIdAndClassName(Integer userId, Integer examId, String className);
 
 }

+ 1 - 26
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Marker.java

@@ -33,6 +33,7 @@ public class Marker implements Serializable {
     private String subjectCode;
 
     @Column(name = "group_number", nullable = false)
+    @ExcelField(title = "分组号", align = 2, sort = 30)
     private Integer groupNumber;
 
     @Column(name = "user_id", nullable = false)
@@ -63,12 +64,6 @@ public class Marker implements Serializable {
     @Column(name = "stdev_score")
     private Double stdevScore;
 
-    /**
-     * 班级数量
-     */
-    @Column(name = "class_count", nullable = false)
-    private Integer classCount;
-
     /**
      * 个性化评卷参数设置
      */
@@ -82,10 +77,6 @@ public class Marker implements Serializable {
     @Transient
     private String groupName;
 
-    @Transient
-    @ExcelField(title = "分组号", align = 2, sort = 30)
-    private int number;
-
     @Transient
     @ExcelField(title = "登录名", align = 2, sort = 40)
     private String loginName;
@@ -148,14 +139,6 @@ public class Marker implements Serializable {
         this.enable = enable;
     }
 
-    public int getNumber() {
-        return number;
-    }
-
-    public void setNumber(int number) {
-        this.number = number;
-    }
-
     public ExamSubject getSubject() {
         return subject;
     }
@@ -268,14 +251,6 @@ public class Marker implements Serializable {
         this.stdevScore = stdevScore;
     }
 
-    public Integer getClassCount() {
-        return classCount;
-    }
-
-    public void setClassCount(Integer classCount) {
-        this.classCount = classCount;
-    }
-
     public String getMarkSetting() {
         return markSetting;
     }

+ 44 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkerClass.java

@@ -7,6 +7,9 @@ import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.Table;
+import javax.persistence.Transient;
+
+import cn.com.qmth.stmms.common.annotation.ExcelField;
 
 @Entity
 @Table(name = "eb_marker_class")
@@ -18,12 +21,31 @@ public class MarkerClass implements Serializable {
     @GeneratedValue
     private Integer id;
 
-    @Column(name = "marker_id")
-    private Integer markerId;
+    @Column(name = "user_id")
+    private Integer userId;
+
+    @Column(name = "exam_id")
+    @ExcelField(title = "考试ID", align = 2, sort = 20)
+    private Integer examId;
 
+    @ExcelField(title = "班级", align = 2, sort = 30)
     @Column(name = "class_name")
     private String className;
 
+    @Transient
+    @ExcelField(title = "登录名", align = 2, sort = 10)
+    private String loginName;
+
+    public MarkerClass(Integer userId, Integer examId, String className) {
+        this.userId = userId;
+        this.examId = examId;
+        this.className = className;
+    }
+
+    public MarkerClass() {
+
+    }
+
     public Integer getId() {
         return id;
     }
@@ -32,12 +54,12 @@ public class MarkerClass implements Serializable {
         this.id = id;
     }
 
-    public Integer getMarkerId() {
-        return markerId;
+    public Integer getUserId() {
+        return userId;
     }
 
-    public void setMarkerId(Integer markerId) {
-        this.markerId = markerId;
+    public void setUserId(Integer userId) {
+        this.userId = userId;
     }
 
     public String getClassName() {
@@ -48,4 +70,20 @@ public class MarkerClass implements Serializable {
         this.className = className;
     }
 
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
 }

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

@@ -1,13 +1,13 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
+import java.util.Date;
+import java.util.List;
+
 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.ExamType;
 
-import java.util.Date;
-import java.util.List;
-
 public interface ExamService {
 
     Exam save(Exam exam);

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

@@ -95,8 +95,7 @@ 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);
 
@@ -130,4 +129,5 @@ public interface ExamStudentService {
 
     public List<ExamStudent> findBySchoolIdAndStudentCodeAndName(Integer schoolId, String studentCode, String name);
 
+    public List<String> findDistinctClassName(Integer examId);
 }

+ 10 - 8
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkerClassService.java

@@ -8,16 +8,18 @@ import cn.com.qmth.stmms.biz.exam.model.MarkerClass;
 
 public interface MarkerClassService {
 
-    MarkerClass save(MarkerClass m);
+    List<MarkerClass> findByUserIdAndExamId(int userId, int examId);
 
-    List<MarkerClass> findByMarkerId(int markerId);
+    long countByUserIdAndExamId(int userId, int examId);
 
-    long countByMarkerId(int markerId);
-    
-    void deleteByMarkerId(int markerId);
+    void deleteByUserIdAndExamId(int userId, int examId);
 
-    void save(Marker marker, String[] classesModel);
-    
-    Set<String> findClassNameByMarkerId(int markerId);
+    void save(Marker marker, String[] classes);
+
+    Set<String> findClassNameByUserIdAndExamId(int userId, int examId);
+
+    MarkerClass findByUserIdAndExamIdAndClassName(Integer userId, Integer examId, String className);
+
+    int batchSave(List<MarkerClass> saveList);
 
 }

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

@@ -98,9 +98,8 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
                     predicates.add(cb.equal(root.get("code"), query.getCode()));
                 }
 
-                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()]));
             }
         }, query);
         fillResult(result, query);

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

@@ -18,6 +18,7 @@ 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;
@@ -29,6 +30,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.persistence.criteria.*;
+
 import java.text.DecimalFormat;
 import java.util.*;
 
@@ -391,10 +393,9 @@ 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
@@ -448,14 +449,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 {
@@ -615,9 +616,8 @@ 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()]));
             }
         };
     }
@@ -636,8 +636,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
@@ -670,9 +670,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);
     }
 
@@ -711,8 +711,7 @@ 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);
@@ -760,9 +759,8 @@ 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) {
@@ -780,9 +778,8 @@ 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);
@@ -803,8 +800,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) {
@@ -826,14 +823,13 @@ 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;
@@ -913,14 +909,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;
@@ -958,4 +954,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     public List<ExamStudent> findBySchoolIdAndStudentCodeAndName(Integer schoolId, String studentCode, String name) {
         return studentDao.findBySchoolIdAndStudentCodeAndName(schoolId, studentCode, name);
     }
+
+    @Override
+    public List<String> findDistinctClassName(Integer examId) {
+        return studentDao.findDistinctClassName(examId);
+    }
 }

+ 26 - 24
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkerClassServiceImpl.java

@@ -24,50 +24,52 @@ public class MarkerClassServiceImpl extends BaseQueryService<MarkerClass> implem
     @Autowired
     private MarkerService markerService;
 
-    @Override
-    public MarkerClass save(MarkerClass m) {
-        return markerClassDao.save(m);
-    }
-
-    @Override
-    public List<MarkerClass> findByMarkerId(int markerId) {
-        return markerClassDao.findByMarkerId(markerId);
-    }
-
-    @Override
-    public long countByMarkerId(int markerId) {
-        return markerClassDao.countByMarkerId(markerId);
-    }
-
     @Transactional
     @Override
     public void save(Marker marker, String[] classes) {
-        this.deleteByMarkerId(marker.getId());
+        this.deleteByUserIdAndExamId(marker.getUserId(), marker.getExamId());
         if (classes != null) {
             for (String className : classes) {
-                MarkerClass m = new MarkerClass();
-                m.setClassName(className);
-                m.setMarkerId(marker.getId());
+                MarkerClass m = new MarkerClass(marker.getUserId(), marker.getExamId(), className);
                 markerClassDao.save(m);
             }
         }
-        marker.setClassCount((int) countByMarkerId(marker.getId()));
         markerService.save(marker);
     }
 
     @Override
-    public void deleteByMarkerId(int markerId) {
-        markerClassDao.deleteByMarkerId(markerId);
+    public long countByUserIdAndExamId(int userId, int examId) {
+        return markerClassDao.countByUserIdAndExamId(userId, examId);
+    }
+
+    @Override
+    public void deleteByUserIdAndExamId(int userId, int examId) {
+        markerClassDao.deleteByUserIdAndExamId(userId, examId);
     }
 
     @Override
-    public Set<String> findClassNameByMarkerId(int markerId) {
+    public Set<String> findClassNameByUserIdAndExamId(int userId, int examId) {
         Set<String> set = new HashSet<String>();
-        List<MarkerClass> classes = this.findByMarkerId(markerId);
+        List<MarkerClass> classes = this.findByUserIdAndExamId(userId, examId);
         for (MarkerClass markerClass : classes) {
             set.add(markerClass.getClassName());
         }
         return set;
     }
 
+    @Override
+    public List<MarkerClass> findByUserIdAndExamId(int userId, int examId) {
+        return markerClassDao.findByUserIdAndExamId(userId, examId);
+    }
+
+    @Override
+    public MarkerClass findByUserIdAndExamIdAndClassName(Integer userId, Integer examId, String className) {
+        return markerClassDao.findByUserIdAndExamIdAndClassName(userId, examId, className);
+    }
+
+    @Override
+    public int batchSave(List<MarkerClass> list) {
+        markerClassDao.save(list);
+        return list.size();
+    }
 }

+ 26 - 24
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java

@@ -4,9 +4,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
-import cn.com.qmth.stmms.common.enums.MarkStatus;
 import org.springframework.data.domain.Pageable;
-import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
@@ -19,22 +17,22 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
 
     List<MarkLibrary> findByExamIdAndSubjectCode(Integer examId, String subjectCode, Pageable page);
 
-    List<MarkLibrary> findByExamIdAndSubjectCodeAndGroupNumberAndStatus(Integer examId, String subjectCode, Integer groupNumber,
-            LibraryStatus status, Pageable page);
+    List<MarkLibrary> findByExamIdAndSubjectCodeAndGroupNumberAndStatus(Integer examId, String subjectCode,
+            Integer groupNumber, LibraryStatus status, Pageable page);
 
-    List<MarkLibrary> findByExamIdAndSubjectCodeAndGroupNumberAndStatusIn(Integer examId, String subjectCode, Integer groupNumber,
-            Set<LibraryStatus> statusSet, Pageable page);
+    List<MarkLibrary> findByExamIdAndSubjectCodeAndGroupNumberAndStatusIn(Integer examId, String subjectCode,
+            Integer groupNumber, Set<LibraryStatus> statusSet, Pageable page);
 
     @Query("select l1 from MarkLibrary l1 where l1.examId=?1 and l1.subjectCode=?2 and l1.groupNumber=?3 and l1.status in (?5) "
             + "and not exists (select l2 from MarkLibrary l2 where l2.studentId=l1.studentId and l2.id!=l1.id and l2.markerId=?4)")
-    List<MarkLibrary> findUnMarked(Integer examId, String subjectCode, Integer groupNumber, Integer markerId, Set<LibraryStatus> statusSet,
-            Pageable page);
+    List<MarkLibrary> findUnMarked(Integer examId, String subjectCode, Integer groupNumber, Integer markerId,
+            Set<LibraryStatus> statusSet, Pageable page);
 
-    @Query("select l1 from MarkLibrary l1 where l1.examId=?1 and l1.subjectCode=?2 and l1.groupNumber=?3 and l1.status in (?5) "
+    @Query("select l1 from MarkLibrary l1 where l1.examId=?1 and l1.subjectCode=?2 and l1.groupNumber=?3 and l1.status in (?6) "
             + "and not exists (select l2 from MarkLibrary l2 where l2.studentId=l1.studentId and l2.id!=l1.id and l2.markerId=?4) "
-            + "and exists (select mc.id from MarkerClass mc, ExamStudent s where l1.studentId=s.id and mc.markerId=?4 and s.className=mc.className)")
-    List<MarkLibrary> findUnMarkedFilterClass(Integer examId, String subjectCode, Integer groupNumber, Integer markerId,
-            Set<LibraryStatus> statusSet, Pageable page);
+            + "and exists (select mc.id from MarkerClass mc, ExamStudent s where l1.studentId=s.id and mc.userId=?5 and s.className=mc.className)")
+    List<MarkLibrary> findUnMarkedFilterClass(Integer examId, String subjectCode, Integer groupNumber,
+            Integer markerId, Integer userId, Set<LibraryStatus> statusSet, Pageable page);
 
     List<MarkLibrary> findByMarkerId(Integer markerId);
 
@@ -46,14 +44,15 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     List<MarkLibrary> findByStudentIdAndGroupNumber(Integer studentId, Integer groupNumber);
 
     @Query("select l from MarkLibrary l where l.studentId=?1 and l.groupNumber=?2 and l.status in (?3) ")
-    List<MarkLibrary> findByStudentIdAndGroupNumberAndStatus(Integer studentId, Integer groupNumber, LibraryStatus... status);
+    List<MarkLibrary> findByStudentIdAndGroupNumberAndStatus(Integer studentId, Integer groupNumber,
+            LibraryStatus... status);
 
     @Query("select count(f) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3")
     long countByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber);
 
     @Query("select count(f) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3 and f.taskNumber=?4")
-    long countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(Integer examId, String subjectCode, Integer groupNumber,
-            Integer taskNumber);
+    long countByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(Integer examId, String subjectCode,
+            Integer groupNumber, Integer taskNumber);
 
     @Query("select count(f) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.groupNumber=?3 and f.status in (?4)")
     long countByExamIdAndSubjectCodeAndGroupNumberAndStatus(Integer examId, String subjectCode, Integer groupNumber,
@@ -71,12 +70,14 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.status=?4, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null, m.markerSpent=null, "
             + "m.headerId=null , m.headerTime=null , m.headerScore=null , m.headerScoreList=null where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3")
-    void resetByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber, LibraryStatus status);
+    void resetByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer groupNumber,
+            LibraryStatus status);
 
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.status=?2, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null, m.markerSpent=null, "
             + "m.headerId=null , m.headerTime=null , m.headerScore=null , m.headerScoreList=null  where m.markerId=?1 and m.status!=?3 and m.status not in (?4) ")
-    void resetByMarkerId(Integer markerId, LibraryStatus status, LibraryStatus libraryStatus1, LibraryStatus... libraryStatus);
+    void resetByMarkerId(Integer markerId, LibraryStatus status, LibraryStatus libraryStatus1,
+            LibraryStatus... libraryStatus);
 
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.status=?2, m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null, m.markerSpent=null, "
@@ -106,8 +107,8 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.headerId=?3, m.headerScore=?4, m.headerScoreList=?5, m.headerTime=?6, m.status=?7 "
             + " where m.studentId=?1 and m.groupNumber=?2")
-    void updateHeaderResult(Integer studentId, Integer groupNumber, Integer userId, Double totalScore, String scoreList, Date updateTime,
-            LibraryStatus arbitrated);
+    void updateHeaderResult(Integer studentId, Integer groupNumber, Integer userId, Double totalScore,
+            String scoreList, Date updateTime, LibraryStatus arbitrated);
 
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary m set m.status=?3 where m.studentId=?1 and m.groupNumber=?2")
@@ -116,19 +117,20 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary l set l.status=?2, l.markerId=?3, l.markerScore=?4, l.markerScoreList=?5, l.markerTime=?6, "
             + "l.markerSpent=?7 where l.id=?1 and l.status in (?8) and (l.markerId=null or l.markerId=?3)")
-    int updateMarkerResult(Integer id, LibraryStatus newStatus, Integer markerId, Double markerScore, String markerScoreList,
-            Date markerTime, Integer spent, LibraryStatus... previousStatus);
+    int updateMarkerResult(Integer id, LibraryStatus newStatus, Integer markerId, Double markerScore,
+            String markerScoreList, Date markerTime, Integer spent, LibraryStatus... previousStatus);
 
     @Query("select m.markerScore ,count(m) from MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3 and m.markerId=?4 and m.status in (?5) group by m.markerScore ")
-    List<Object[]> findScoreCount(int examId, String subjectCode, Integer groupNumber, Integer markerId, LibraryStatus... status);
+    List<Object[]> findScoreCount(int examId, String subjectCode, Integer groupNumber, Integer markerId,
+            LibraryStatus... status);
 
     @Query("select m.markerScore from MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3 and m.status in (?4) group by m.markerScore ")
     List<Double> findScore(int examId, String subjectCode, Integer groupNumber, LibraryStatus... status);
 
     @Modifying
     @Query("delete MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3 and m.taskNumber=?4")
-    void deleteByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(Integer examId, String subjectCode, Integer groupNumber,
-            Integer taskNumber);
+    void deleteByExamIdAndSubjectCodeAndGroupNumberAndTaskNumber(Integer examId, String subjectCode,
+            Integer groupNumber, Integer taskNumber);
 
     @Modifying(clearAutomatically = true)
     @Query("update MarkLibrary l set l.status=?2, l.markerId=?3, l.markerTime=?4, "

+ 4 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java

@@ -46,7 +46,7 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
 
     @Override
     public List<MarkLibrary> findUnMarked(Integer examId, String subjectCode, Integer groupNumber, Integer markerId,
-            boolean filterClass, int pageNumber, int pageSize) {
+            Integer userId, boolean filterClass, int pageNumber, int pageSize) {
         Set<LibraryStatus> statusSet = new HashSet<>();
         statusSet.add(LibraryStatus.WAITING);
 
@@ -54,8 +54,9 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         query.setPageNumber(pageNumber);
         query.setPageSize(pageSize);
 
-        return filterClass ? libraryDao.findUnMarkedFilterClass(examId, subjectCode, groupNumber, markerId, statusSet,
-                query) : libraryDao.findUnMarked(examId, subjectCode, groupNumber, markerId, statusSet, query);
+        return filterClass ? libraryDao.findUnMarkedFilterClass(examId, subjectCode, groupNumber, markerId, userId,
+                statusSet, query) : libraryDao.findUnMarked(examId, subjectCode, groupNumber, markerId, statusSet,
+                query);
     }
 
     @Override

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkLibraryService.java

@@ -17,7 +17,7 @@ public interface MarkLibraryService {
     MarkLibrarySearchQuery findByQuery(MarkLibrarySearchQuery query);
 
     List<MarkLibrary> findUnMarked(Integer examId, String subjectCode, Integer groupNumber, Integer markerId,
-            boolean filterClass, int pageNumber, int pageSize);
+            Integer userId, boolean filterClass, int pageNumber, int pageSize);
 
     long countByExamAndSubjectAndGroupAndStatus(int examId, String subjectCode, int groupNumber, LibraryStatus status);
 

+ 13 - 9
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/MarkRedisUtil.java

@@ -14,7 +14,9 @@ public class MarkRedisUtil {
     public static void addCurrentTask(StringRedisTemplate redisTemplate, Marker marker, int libraryId) {
         String key = getKey(marker);
         redisTemplate.opsForZSet().add(key, String.valueOf(libraryId), marker.getId());
-        redisTemplate.opsForZSet().add(RedisKeyBuilder.getCurrentTaskTimeKey(marker.getExamId(), marker.getSubjectCode(),marker.getNumber()),String.valueOf(libraryId),System.currentTimeMillis());
+        redisTemplate.opsForZSet().add(
+                RedisKeyBuilder.getCurrentTaskTimeKey(marker.getExamId(), marker.getSubjectCode(),
+                        marker.getGroupNumber()), String.valueOf(libraryId), System.currentTimeMillis());
     }
 
     public static int countCurrentTask(StringRedisTemplate redisTemplate, int examId, String subjectCode, int number) {
@@ -33,7 +35,8 @@ public class MarkRedisUtil {
             int libraryId) {
         String key = RedisKeyBuilder.getCurrentTaskKey(examId, subjectCode, number);
         redisTemplate.opsForZSet().remove(key, String.valueOf(libraryId));
-        redisTemplate.opsForZSet().remove(RedisKeyBuilder.getCurrentTaskTimeKey(examId, subjectCode,number),String.valueOf(libraryId));
+        redisTemplate.opsForZSet().remove(RedisKeyBuilder.getCurrentTaskTimeKey(examId, subjectCode, number),
+                String.valueOf(libraryId));
     }
 
     public static boolean isCurrentTask(StringRedisTemplate redisTemplate, int examId, String subjectCode, int number,
@@ -51,22 +54,23 @@ public class MarkRedisUtil {
     public static void clearCurrentTask(StringRedisTemplate redisTemplate, int examId, String subjectCode, int number) {
         String key = RedisKeyBuilder.getCurrentTaskKey(examId, subjectCode, number);
         redisTemplate.delete(key);
-        redisTemplate.delete(RedisKeyBuilder.getCurrentTaskTimeKey(examId, subjectCode,number));
+        redisTemplate.delete(RedisKeyBuilder.getCurrentTaskTimeKey(examId, subjectCode, number));
     }
 
     private static String getKey(Marker marker) {
         return RedisKeyBuilder.getCurrentTaskKey(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
     }
+
     public static void QuartzClearTask(StringRedisTemplate redisTemplate, long cleanMapinterval) {
-        Set<String> keys = redisTemplate.keys(RedisKeyBuilder.getCurrentTaskTimePrefix()+"*");
-        Iterator<String> iterators =keys.iterator();
-        while (iterators.hasNext()){
+        Set<String> keys = redisTemplate.keys(RedisKeyBuilder.getCurrentTaskTimePrefix() + "*");
+        Iterator<String> iterators = keys.iterator();
+        while (iterators.hasNext()) {
             String key = iterators.next();
-            Set<ZSetOperations.TypedTuple<String>> rangeWithScores =
-                    redisTemplate.opsForZSet().rangeWithScores(key, 0  , -1);
+            Set<ZSetOperations.TypedTuple<String>> rangeWithScores = redisTemplate.opsForZSet().rangeWithScores(key, 0,
+                    -1);
 
             Iterator<ZSetOperations.TypedTuple<String>> iterator = rangeWithScores.iterator();
-            while(iterator.hasNext()){
+            while (iterator.hasNext()) {
                 ZSetOperations.TypedTuple<String> next = iterator.next();
                 if ((System.currentTimeMillis() - next.getScore()) > cleanMapinterval * 1000 * 60) {
 

+ 2 - 4
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/MarkerExcelError.java

@@ -1,10 +1,8 @@
 package cn.com.qmth.stmms.common.enums;
 
 public enum MarkerExcelError {
-    MARKERNOTCODE("课程代码不存在", 0), 
-    MARKERNAMENULL("用户名为空", 1), 
-    MARKERNAMEUSED("用户名已被其他学校占用", 2), 
-    MARKERNOTGROUP("大题号不存在", 3);
+    CODENULL("课程代码不存在", 0), NAMENULL("用户名为空", 1), NAMEUSED("用户名已被其他学校占用", 2), NAMENOTMARKER("用户名已被占用,且不是评卷员类型", 3), GROUPNULL(
+            "大题号不存在", 4), EXAMNULL("考试为空", 5), CLASSNULL("班级为空", 6), EXAMCLASSNULL("考试下没有该班级", 7);
 
     private String name;
 

+ 20 - 28
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/AnswerCheckController.java

@@ -56,16 +56,12 @@ public class AnswerCheckController extends BaseExamController {
     @RequestMapping
     public ModelAndView index(HttpServletRequest request) {
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            Exam exam = examService.findById(examId);
-            ModelAndView view = new ModelAndView("modules/exam/checkAnswer");
-            if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
-                view = new ModelAndView("modules/exam/permission");
-            }
-            return view;
-        } else {
-            return new ModelAndView("redirect:/admin/exam/list");
+        Exam exam = examService.findById(examId);
+        ModelAndView view = new ModelAndView("modules/exam/checkAnswer");
+        if (ExamType.MULTI_MEDIA.equals(exam.getType())) {
+            view = new ModelAndView("modules/exam/permission");
         }
+        return view;
     }
 
     @Logging(menu = "识别结果查询数量", type = LogType.QUERY)
@@ -86,27 +82,23 @@ public class AnswerCheckController extends BaseExamController {
     @ResponseBody
     public ModelAndView start(HttpServletRequest request, ExamStudentSearchQuery query) {
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            ModelAndView view = new ModelAndView("modules/exam/checkAnswerEdit");
-            List<Integer> ids = new ArrayList<Integer>();
-            query.setExamId(examId);
-            query.setUpload(true);
-            query.setPageNumber(1);
-            query.setPageSize(1000);
-            query = studentService.findByQuery(query);
-            while (query.getCurrentCount() > 0) {
-                for (ExamStudent student : query.getResult()) {
-                    ids.add(student.getId());
-                }
-                query.setPageNumber(query.getPageNumber() + 1);
-                query = studentService.findByQuery(query);
+        ModelAndView view = new ModelAndView("modules/exam/checkAnswerEdit");
+        List<Integer> ids = new ArrayList<Integer>();
+        query.setExamId(examId);
+        query.setUpload(true);
+        query.setPageNumber(1);
+        query.setPageSize(1000);
+        query = studentService.findByQuery(query);
+        while (query.getCurrentCount() > 0) {
+            for (ExamStudent student : query.getResult()) {
+                ids.add(student.getId());
             }
-            view.addObject("sheetServer", sheetServer);
-            view.addObject("ids", StringUtils.join(ids, ","));
-            return view;
-        } else {
-            return new ModelAndView("redirect:/admin/exam/list");
+            query.setPageNumber(query.getPageNumber() + 1);
+            query = studentService.findByQuery(query);
         }
+        view.addObject("sheetServer", sheetServer);
+        view.addObject("ids", StringUtils.join(ids, ","));
+        return view;
     }
 
     @Logging(menu = "识别结果修改", type = LogType.UPDATE)

+ 21 - 29
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java

@@ -42,43 +42,35 @@ public class CheckStudentController extends BaseExamController {
     @RequestMapping
     public String index(Model model, HttpServletRequest request, CheckStudentSearchQuery query) {
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            List<ExamStudent> studentList = new ArrayList<ExamStudent>();
-            query.setExamId(examId);
-            query.setChecked(false);
-            if (query.getType() == null) {
-                query.setType(CheckType.MANUAL);
-            }
-            query = checkStudentService.findByQuery(query);
-            for (CheckStudent c : query.getResult()) {
-                studentList.add(studentService.findById(c.getStudentId()));
-            }
-            model.addAttribute("typeList", CheckType.values());
-            model.addAttribute("studentList", studentList);
-            model.addAttribute("query", query);
-            return "modules/exam/checkStudent";
-        } else {
-            return "redirect:/admin/exam/list";
+        List<ExamStudent> studentList = new ArrayList<ExamStudent>();
+        query.setExamId(examId);
+        query.setChecked(false);
+        if (query.getType() == null) {
+            query.setType(CheckType.MANUAL);
+        }
+        query = checkStudentService.findByQuery(query);
+        for (CheckStudent c : query.getResult()) {
+            studentList.add(studentService.findById(c.getStudentId()));
         }
+        model.addAttribute("typeList", CheckType.values());
+        model.addAttribute("studentList", studentList);
+        model.addAttribute("query", query);
+        return "modules/exam/checkStudent";
     }
 
     @RequestMapping("/start")
     @ResponseBody
     public ModelAndView start(HttpServletRequest request, @RequestParam CheckType type) {
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            ModelAndView view = new ModelAndView("modules/exam/checkStudentEdit");
-            List<Integer> ids = new ArrayList<Integer>();
-            List<CheckStudent> list = checkStudentService.findByExamIdAndIsCheckedAndType(examId, false, type);
-            for (CheckStudent student : list) {
-                ids.add(student.getStudentId());
-            }
-            view.addObject("sheetServer", sheetServer);
-            view.addObject("ids", StringUtils.join(ids, ","));
-            return view;
-        } else {
-            return new ModelAndView("redirect:/admin/exam/list");
+        ModelAndView view = new ModelAndView("modules/exam/checkStudentEdit");
+        List<Integer> ids = new ArrayList<Integer>();
+        List<CheckStudent> list = checkStudentService.findByExamIdAndIsCheckedAndType(examId, false, type);
+        for (CheckStudent student : list) {
+            ids.add(student.getStudentId());
         }
+        view.addObject("sheetServer", sheetServer);
+        view.addObject("ids", StringUtils.join(ids, ","));
+        return view;
     }
 
     @Logging(menu = "人工确认考生", type = LogType.UPDATE)

+ 0 - 5
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/DataSyncController.java

@@ -25,7 +25,6 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import cn.com.qmth.stmms.admin.dto.SubjectiveQuestionDTO;
 import cn.com.qmth.stmms.admin.thread.DataSyncThread;
 import cn.com.qmth.stmms.admin.utils.HttpUtil;
-import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.admin.utils.UpyunConfig;
 import cn.com.qmth.stmms.biz.exam.model.DataSync;
 import cn.com.qmth.stmms.biz.exam.service.DataSyncService;
@@ -104,11 +103,7 @@ public class DataSyncController extends BaseExamController {
 
     @RequestMapping()
     public ModelAndView index(HttpServletRequest request, @RequestParam Integer examId) {
-        if (examId != null) {
-            SessionExamUtils.setExamId(request, examId);
-        }
         examId = getSessionExamId(request);
-
         DataSync dataSync = dataSyncService.findByExamId(examId);
         if (dataSync == null) {
             dataSync = new DataSync();

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

@@ -1,5 +1,27 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import net.sf.json.JSONArray;
+import net.sf.json.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 cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.admin.vo.ExamInfoVO;
 import cn.com.qmth.stmms.biz.campus.model.Campus;
@@ -24,25 +46,6 @@ import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.session.service.SessionService;
 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/exam")
@@ -152,7 +155,6 @@ public class ExamController extends BaseExamController {
     @Logging(menu = "考试详情", type = LogType.QUERY)
     @RequestMapping("/view/{examId}")
     public String view(Model model, HttpServletRequest request, @PathVariable Integer examId) {
-        SessionExamUtils.setExamId(request, examId);
         Exam exam = examService.findById(examId);
         long studentCount = examStudentService.countByExamId(exam.getId());
         long subjectCount = examSubjectService.count(examId);
@@ -229,9 +231,26 @@ 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;
     }
+
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
+    @RequestMapping(value = "/select")
+    public String select(Model model, HttpServletRequest request) {
+        User user = RequestUtils.getWebUser(request).getUser();
+        List<Exam> examList = examService.findBySchoolIdAndStatus(user.getSchoolId());
+        model.addAttribute("examList", examList);
+        SessionExamUtils.clearExamId(request);
+        return "modules/exam/examSelect";
+    }
+
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
+    @RequestMapping(value = "/select", method = RequestMethod.POST)
+    public String selectExam(HttpServletRequest request, @RequestParam Integer examId) {
+        Exam exam = examService.findById(examId);
+        SessionExamUtils.setExamId(request, examId, exam.getName());
+        return "redirect:/admin/home";
+    }
 }

+ 32 - 36
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -100,44 +100,40 @@ public class InspectedController extends BaseExamController {
     public ModelAndView start(HttpServletRequest request, RedirectAttributes redirectAttributes,
             @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
-            WebUser wu = RequestUtils.getWebUser(request);
-            releaseByUser(wu.getUser().getId());
-            ModelAndView view = new ModelAndView("modules/exam/inspected");
-
-            if (group == null) {
-                view.addObject("message", "大题不存在或评卷已结束");
-                return view;
-            } else if (group.getStatus() == MarkStatus.FINISH) {
-                view.addObject("message", "评卷已结束");
-                return view;
-            } else if (group.getStatus() == MarkStatus.TRIAL) {
-                view.addObject("message", "试评任务无需复核");
-                return view;
-            } else {
-                List<Integer> ids = new ArrayList<Integer>();
-                MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
-                query.setExamId(examId);
-                query.setSubjectCode(subjectCode);
-                query.setGroupNumber(groupNumber);
-                query.setPageNumber(1);
-                query.setPageSize(1000);
-                query.addStatus(LibraryStatus.MARKED);
-                query = libraryService.findByQuery(query);
-                while (query.getCurrentCount() > 0) {
-                    for (MarkLibrary library : query.getResult()) {
-                        ids.add(library.getId());
-                    }
-                    query.setPageNumber(query.getPageNumber() + 1);
-                    query = libraryService.findByQuery(query);
+        MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
+        WebUser wu = RequestUtils.getWebUser(request);
+        releaseByUser(wu.getUser().getId());
+        ModelAndView view = new ModelAndView("modules/exam/inspected");
+
+        if (group == null) {
+            view.addObject("message", "大题不存在或评卷已结束");
+            return view;
+        } else if (group.getStatus() == MarkStatus.FINISH) {
+            view.addObject("message", "评卷已结束");
+            return view;
+        } else if (group.getStatus() == MarkStatus.TRIAL) {
+            view.addObject("message", "试评任务无需复核");
+            return view;
+        } else {
+            List<Integer> ids = new ArrayList<Integer>();
+            MarkLibrarySearchQuery query = new MarkLibrarySearchQuery();
+            query.setExamId(examId);
+            query.setSubjectCode(subjectCode);
+            query.setGroupNumber(groupNumber);
+            query.setPageNumber(1);
+            query.setPageSize(1000);
+            query.addStatus(LibraryStatus.MARKED);
+            query = libraryService.findByQuery(query);
+            while (query.getCurrentCount() > 0) {
+                for (MarkLibrary library : query.getResult()) {
+                    ids.add(library.getId());
                 }
-                view.addObject("sliceServer", sliceServer);
-                view.addObject("ids", StringUtils.join(ids, ","));
-                return view;
+                query.setPageNumber(query.getPageNumber() + 1);
+                query = libraryService.findByQuery(query);
             }
-        } else {
-            return new ModelAndView("redirect:/admin/exam/list");
+            view.addObject("sliceServer", sliceServer);
+            view.addObject("ids", StringUtils.join(ids, ","));
+            return view;
         }
     }
 

+ 76 - 58
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java

@@ -1,11 +1,44 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
 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.*;
+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.MarkerClassService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
@@ -19,26 +52,13 @@ import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkerExcelError;
 import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.UserSource;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
 import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-import com.google.common.collect.Lists;
-import net.sf.json.JSONArray;
-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.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.*;
+import com.google.common.collect.Lists;
 
 @Controller("examMarkerController")
 @RequestMapping("/admin/exam/marker")
@@ -90,16 +110,14 @@ public class MarkerController extends BaseExamController {
         query.orderById();
         if (StringUtils.isNotBlank(query.getLoginName())) {
             User user = userService.findByLoginName(query.getLoginName());
-            query.setUserId(
-                    user != null && user.getSchoolId().equals(wu.getUser().getSchoolId()) ? user.getId() : null);
+            query.setUserId(user != null && user.getSchoolId().equals(wu.getUser().getSchoolId()) ? user.getId() : null);
         }
         query = markerService.findByQuery(query);
         for (Marker marker : query.getResult()) {
             marker.setSubject(subjectService.find(marker.getExamId(), marker.getSubjectCode()));
             MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
-            group.setQuestionList(questionService
-                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, marker.getSubjectCode(), false,
-                            group.getNumber()));
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+                    marker.getSubjectCode(), false, group.getNumber()));
             marker.setGroup(group);
             marker.setMarkedCount(markService.markedCount(marker));
             marker.setCurrentCount(markService.applyCount(marker));
@@ -202,8 +220,8 @@ public class MarkerController extends BaseExamController {
         JSONObject obj = new JSONObject();
         if (marker != null) {
             try {
-                lockService
-                        .waitlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+                lockService.waitlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(),
+                        marker.getGroupNumber());
                 lockService.waitlock(LockType.MARKER, marker.getId());
 
                 markService.resetMarker(marker);
@@ -357,7 +375,7 @@ public class MarkerController extends BaseExamController {
             for (Marker marker : list) {
                 if (StringUtils.isBlank(marker.getLoginName())) {
                     failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," + marker.getSubjectCode()
-                            + MarkerExcelError.MARKERNAMENULL.getName());
+                            + MarkerExcelError.NAMENULL.getName());
                     failureNum++;
                     continue;
                 }
@@ -366,17 +384,17 @@ public class MarkerController extends BaseExamController {
                     examSubject = subjectService.find(examId, marker.getSubjectCode());
                     if (examSubject == null) {
                         failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," + marker.getSubjectCode()
-                                + MarkerExcelError.MARKERNOTCODE.getName());
+                                + MarkerExcelError.CODENULL.getName());
                         failureNum++;
                         continue;
                     }
                 }
-                MarkGroup markGroup = groupMap.get(marker.getSubjectCode() + "-" + marker.getNumber());
+                MarkGroup markGroup = groupMap.get(marker.getSubjectCode() + "-" + marker.getGroupNumber());
                 if (markGroup == null) {
-                    markGroup = groupService.findOne(examId, marker.getSubjectCode(), marker.getNumber());
+                    markGroup = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
                     if (markGroup == null) {
                         failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," + marker.getSubjectCode() + ","
-                                + marker.getNumber() + MarkerExcelError.MARKERNOTGROUP.getName());
+                                + marker.getGroupName() + MarkerExcelError.GROUPNULL.getName());
                         failureNum++;
                         continue;
                     }
@@ -386,7 +404,13 @@ public class MarkerController extends BaseExamController {
                     user = userService.findByLoginName(marker.getLoginName().trim());
                     if (user != null && !schoolId.equals(user.getSchoolId())) {
                         failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," + marker.getSubjectCode()
-                                + MarkerExcelError.MARKERNAMEUSED.getName());
+                                + MarkerExcelError.NAMEUSED.getName());
+                        failureNum++;
+                        continue;
+                    }
+                    if (user != null && !user.getRole().equals(Role.MARKER)) {
+                        failureMsg.append("<br/>评卷员 " + marker.getLoginName() + "," + marker.getSubjectCode()
+                                + MarkerExcelError.NAMENOTMARKER.getName());
                         failureNum++;
                         continue;
                     }
@@ -413,12 +437,13 @@ public class MarkerController extends BaseExamController {
         return "redirect:" + "/admin/exam/marker?subjectCode=" + subjectCode;
     }
 
-    private Marker getMarker(int examId, String subjectCode, Integer number, Integer userId) {
-        Marker marker = markerService.findByExamAndSubjectAndNumberAndUserId(examId, subjectCode, number, userId);
+    private Marker getMarker(int examId, String subjectCode, Integer groupNumber, Integer userId) {
+        Marker marker = markerService.findByExamAndSubjectAndNumberAndUserId(examId, subjectCode, groupNumber, userId);
         if (marker == null) {
             marker = new Marker();
             marker.setExamId(examId);
             marker.setSubjectCode(subjectCode);
+            marker.setGroupNumber(groupNumber);
             marker.setUserId(userId);
             marker.setEnable(true);
         }
@@ -433,6 +458,7 @@ public class MarkerController extends BaseExamController {
             user.setName(loginName);
             user.setPassword(Md5EncryptUtils.md5(USER_PASSWORD));
             user.setRole(Role.MARKER);
+            user.setSource(UserSource.INTERNAL);
             user.setSchoolId(schoolId);
             user.setEnable(true);
             user.setCreatedTime(new Date());
@@ -443,20 +469,16 @@ public class MarkerController extends BaseExamController {
     }
 
     @RequestMapping("/save")
-    public String add(Model model, HttpServletRequest request, UserSearchQuery query,
-            @RequestParam String subjectCode) {
+    public String add(Model model, HttpServletRequest request, UserSearchQuery query, @RequestParam String subjectCode,
+            @RequestParam Integer groupNumber) {
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            Exam exam = examService.findById(examId);
-            query.setSchoolId(exam.getSchoolId());
-            query.setRole(Role.MARKER);
-            query = userService.findByQuery(query);
-            model.addAttribute("query", query);
-            model.addAttribute("subject", subjectService.find(examId, subjectCode));
-            return "modules/exam/markerSubject";
-        } else {
-            return "redirect:/admin/exam/list";
-        }
+        Exam exam = examService.findById(examId);
+        query.setSchoolId(exam.getSchoolId());
+        query.setRole(Role.MARKER);
+        query = userService.findByQuery(query);
+        model.addAttribute("query", query);
+        model.addAttribute("group", groupService.findOne(examId, subjectCode, groupNumber));
+        return "modules/exam/markerSubject";
     }
 
     @Logging(menu = "评卷员绑定", type = LogType.ADD)
@@ -464,18 +486,14 @@ public class MarkerController extends BaseExamController {
     public String save(@RequestParam String subjectCode, @RequestParam Integer groupNumber,
             @RequestParam Integer[] userIds, HttpServletRequest request, RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
-            if (group != null) {
-                markerService.save(group, userIds);
-                addMessage(redirectAttributes, subjectCode + "设置成功");
-                return "redirect:/admin/exam/marker?subjectCode=" + subjectCode + "&groupNumber=" + groupNumber;
-            }
-            addMessage(redirectAttributes, "科目不存在");
-            return "redirect:/admin/exam/marker";
-        } else {
-            return "redirect:/admin/exam/list";
+        MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
+        if (group != null) {
+            markerService.save(group, userIds);
+            addMessage(redirectAttributes, "设置成功");
+            return "redirect:/admin/exam/marker?subjectCode=" + subjectCode + "&groupNumber=" + groupNumber;
         }
+        addMessage(redirectAttributes, "科目分组不存在");
+        return "redirect:/admin/exam/marker";
     }
 
     @RequestMapping("/delete")
@@ -501,7 +519,7 @@ public class MarkerController extends BaseExamController {
         if (marker != null) {
             model.addAttribute("marker", marker);
             List<String> classList = studentService.findDistinctClassName(marker.getExamId(), marker.getSubjectCode());
-            Set<String> classes = classService.findClassNameByMarkerId(markerId);
+            Set<String> classes = classService.findClassNameByUserIdAndExamId(marker.getUserId(), marker.getExamId());
             classList.removeAll(classes);
             model.addAttribute("classList", classList);
             model.addAttribute("classes", classes);
@@ -519,8 +537,8 @@ public class MarkerController extends BaseExamController {
         if (marker != null) {
             classService.save(marker, classes);
             addMessage(redirectAttributes, "保存成功");
-            return "redirect:" + "/admin/exam/marker?subjectCode=" + marker.getSubjectCode() + "&groupNumber=" + marker
-                    .getGroupNumber();
+            return "redirect:" + "/admin/exam/marker?subjectCode=" + marker.getSubjectCode() + "&groupNumber="
+                    + marker.getGroupNumber();
         }
         addMessage(redirectAttributes, "评卷员不存在");
         return "redirect:/admin/exam/marker";

+ 34 - 37
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ProblemHistoryController.java

@@ -66,44 +66,41 @@ public class ProblemHistoryController extends BaseExamController {
     @RequestMapping
     public String list(HttpServletRequest request, Model model, ProblemHistorySearchQuery query) {
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            List<ProblemType> problemTypes = problemService.findByExamId(examId);
-            Map<Integer, ProblemType> problemMap = new HashMap<Integer, ProblemType>();
-            for (ProblemType problemType : problemTypes) {
-                problemMap.put(problemType.getId(), problemType);
-            }
-            query.setExamId(examId);
-            query.setStatus(HistoryStatus.WAITING);
-            query.orderByExamNumber();
-            query = historyService.findByQuery(query);
-
-            List<ExamStudent> list = new LinkedList<ExamStudent>();
-            for (ProblemHistory history : query.getResult()) {
-                ExamStudent student = studentService.findById(history.getStudentId());
-                student.setNumber(history.getGroupNumber());
-                student.setProblemType(problemMap.get(history.getProblemId()));
-                student.setMarkTime(DateUtils.formatDateTime(history.getCreateTime()));
-                student.setLibraryId(history.getLibraryId());
-                list.add(student);
-            }
-            model.addAttribute("resultList", list);
-            model.addAttribute("query", query);
-            model.addAttribute("subjectList", getProblemSubject(examId));
-            model.addAttribute("problemList", problemTypes);
-            List<MarkGroup> groupList = groupService.findByExamAndSubjectAndStatus(examId, query.getSubjectCode(),
-                    MarkStatus.FORMAL);
-            for (MarkGroup group : groupList) {
-                List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                        group.getSubjectCode(), false, group.getNumber());
-                group.setQuestionList(questions);
-            }
-            model.addAttribute("groupList", groupList);
-            model.addAttribute("statusList", HistoryStatus.getOptionList());
-            Exam exam = examService.findById(examId);
-            model.addAttribute("examType", exam.getType());
-            return "modules/exam/problemHistory";
+        List<ProblemType> problemTypes = problemService.findByExamId(examId);
+        Map<Integer, ProblemType> problemMap = new HashMap<Integer, ProblemType>();
+        for (ProblemType problemType : problemTypes) {
+            problemMap.put(problemType.getId(), problemType);
+        }
+        query.setExamId(examId);
+        query.setStatus(HistoryStatus.WAITING);
+        query.orderByExamNumber();
+        query = historyService.findByQuery(query);
+
+        List<ExamStudent> list = new LinkedList<ExamStudent>();
+        for (ProblemHistory history : query.getResult()) {
+            ExamStudent student = studentService.findById(history.getStudentId());
+            student.setNumber(history.getGroupNumber());
+            student.setProblemType(problemMap.get(history.getProblemId()));
+            student.setMarkTime(DateUtils.formatDateTime(history.getCreateTime()));
+            student.setLibraryId(history.getLibraryId());
+            list.add(student);
+        }
+        model.addAttribute("resultList", list);
+        model.addAttribute("query", query);
+        model.addAttribute("subjectList", getProblemSubject(examId));
+        model.addAttribute("problemList", problemTypes);
+        List<MarkGroup> groupList = groupService.findByExamAndSubjectAndStatus(examId, query.getSubjectCode(),
+                MarkStatus.FORMAL);
+        for (MarkGroup group : groupList) {
+            List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+                    group.getSubjectCode(), false, group.getNumber());
+            group.setQuestionList(questions);
         }
-        return "redirect:/admin/exam/list";
+        model.addAttribute("groupList", groupList);
+        model.addAttribute("statusList", HistoryStatus.getOptionList());
+        Exam exam = examService.findById(examId);
+        model.addAttribute("examType", exam.getType());
+        return "modules/exam/problemHistory";
     }
 
     private List<ExamSubject> getProblemSubject(int examId) {

+ 1 - 6
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ProblemTypeController.java

@@ -19,7 +19,6 @@ 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.biz.mark.model.ProblemType;
 import cn.com.qmth.stmms.biz.mark.service.ProblemHistoryService;
 import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
@@ -42,11 +41,7 @@ public class ProblemTypeController extends BaseExamController {
 
     @Logging(menu = "查询问题卷分类", type = LogType.QUERY)
     @RequestMapping
-    public String list(HttpServletRequest request, Model model, @RequestParam(required = false) Integer examId) {
-        if (examId != null) {
-            SessionExamUtils.setExamId(request, examId);
-        }
-        examId = getSessionExamId(request);
+    public String list(HttpServletRequest request, Model model, @RequestParam Integer examId) {
         List<ProblemType> list = problemService.findByExamId(examId);
         model.addAttribute("list", list);
         return "modules/exam/problemList";

+ 9 - 8
stmms-web/src/main/java/cn/com/qmth/stmms/admin/home/HomeController.java

@@ -7,8 +7,8 @@ import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.ModelAndView;
 
+import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
@@ -18,14 +18,16 @@ import cn.com.qmth.stmms.common.utils.RequestUtils;
 public class HomeController {
 
     @RequestMapping
-    public ModelAndView index(HttpServletRequest request) {
+    public String index(HttpServletRequest request) {
         WebUser user = RequestUtils.getWebUser(request);
         if (user.getRole() == Role.SYS_ADMIN) {
-            ModelAndView modelAndView = new ModelAndView("modules/sys/sysIndex");
-            return modelAndView;
+            return "modules/sys/sysIndex";
         } else {
-            ModelAndView modelAndView = new ModelAndView("modules/exam/examIndex");
-            return modelAndView;
+            int examId = SessionExamUtils.getExamId(request);
+            if (examId > 0) {
+                return "modules/exam/examIndex";
+            }
+            return "redirect:exam/select";
         }
     }
 
@@ -33,8 +35,7 @@ public class HomeController {
      * 获取主题方案
      */
     @RequestMapping(value = "/theme/{theme}")
-    public String getThemeInCookie(@PathVariable String theme, HttpServletRequest request,
-            HttpServletResponse response) {
+    public String getThemeInCookie(@PathVariable String theme, HttpServletRequest request, HttpServletResponse response) {
         if (StringUtils.isNotBlank(theme)) {
             RequestUtils.setCookie(response, "theme", theme, 60 * 60 * 24);
         } else {

+ 15 - 8
stmms-web/src/main/java/cn/com/qmth/stmms/admin/interceptor/AdminInterceptor.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.admin.interceptor;
 
+import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.biz.exam.service.SubjectUserService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
@@ -9,6 +10,7 @@ import cn.com.qmth.stmms.common.interceptor.SessionInterceptor;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.utils.AccessControlUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -29,16 +31,21 @@ public class AdminInterceptor extends SessionInterceptor {
     private SubjectUserService subjectUserService;
 
     @Override
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
-            throws Exception {
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         return validateAdminUser(buildWebUser(request), request, response);
     }
 
     private boolean validateAdminUser(WebUser wu, HttpServletRequest request, HttpServletResponse response)
             throws Exception {
-        if (wu != null && (wu.getRole() == Role.SYS_ADMIN || wu.getRole() == Role.SCHOOL_ADMIN
-                || wu.getRole() == Role.SUBJECT_HEADER || wu.getRole() == Role.SCHOOL_VIEWER)) {
-            return true;
+        if (wu != null
+                && (wu.getRole() == Role.SYS_ADMIN || wu.getRole() == Role.SCHOOL_ADMIN
+                        || wu.getRole() == Role.SUBJECT_HEADER || wu.getRole() == Role.SCHOOL_VIEWER)) {
+            Integer examId = SessionExamUtils.getExamId(request);
+            String uri = request.getRequestURI();
+            if (examId > 0 || uri.startsWith("/admin/exam/select") || uri.startsWith("/admin/home")) {
+                return true;
+            }
+            return redirect(request, response, "/admin/exam/select");
         }
         return sessionExpire(request, response, "/login");
     }
@@ -49,9 +56,9 @@ public class AdminInterceptor extends SessionInterceptor {
         Role role = session.getWebUserRole();
         if (userId != null && role != null) {
             User user = userService.findById(userId);
-            if (user != null && user.getRole() == role && user.getAccessTokenRefreshTime() != null && StringUtils
-                    .equals(session.getWebUserToken(), user.getAccessToken()) && !AccessControlUtils
-                    .expired(user.getAccessTokenRefreshTime())) {
+            if (user != null && user.getRole() == role && user.getAccessTokenRefreshTime() != null
+                    && StringUtils.equals(session.getWebUserToken(), user.getAccessToken())
+                    && !AccessControlUtils.expired(user.getAccessTokenRefreshTime())) {
                 WebUser wu = new WebUser(user, null, null);
                 if (user.getRole() == Role.SUBJECT_HEADER) {
                     wu.setSubjectCodeSet(subjectUserService.findSubjectCode(user.getId()));

+ 12 - 21
stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/SubjectUserController.java

@@ -87,7 +87,7 @@ public class SubjectUserController extends BaseExamController {
             for (SubjectUser subjectUser : list) {
                 if (StringUtils.isBlank(subjectUser.getLoginName())) {
                     failureMsg.append("<br/>用户 " + subjectUser.getLoginName() + "," + subjectUser.getSubjectCode()
-                            + MarkerExcelError.MARKERNAMENULL.getName());
+                            + MarkerExcelError.NAMENULL.getName());
                     failureNum++;
                     continue;
                 }
@@ -96,7 +96,7 @@ public class SubjectUserController extends BaseExamController {
                     user = userService.findByLoginName(subjectUser.getLoginName().trim());
                     if (user != null && !schoolId.equals(user.getSchoolId())) {
                         failureMsg.append("<br/>用户 " + subjectUser.getLoginName() + "," + subjectUser.getSubjectCode()
-                                + MarkerExcelError.MARKERNAMEUSED.getName());
+                                + MarkerExcelError.NAMEUSED.getName());
                         failureNum++;
                         continue;
                     }
@@ -151,29 +151,20 @@ public class SubjectUserController extends BaseExamController {
     @RequestMapping("/save")
     public String add(Model model, HttpServletRequest request, UserSearchQuery query, @RequestParam String subjectCode) {
         int examId = getSessionExamId(request);
-        if (examId > 0) {
-            Exam exam = examService.findById(examId);
-            query.setSchoolId(exam.getSchoolId());
-            query.setRole(Role.SUBJECT_HEADER);
-            query = userService.findByQuery(query);
-            model.addAttribute("query", query);
-            model.addAttribute("subject", subjectService.find(examId, subjectCode));
-            return "modules/exam/userSubject";
-        } else {
-            return "redirect:/admin/exam/list";
-        }
+        Exam exam = examService.findById(examId);
+        query.setSchoolId(exam.getSchoolId());
+        query.setRole(Role.SUBJECT_HEADER);
+        query = userService.findByQuery(query);
+        model.addAttribute("query", query);
+        model.addAttribute("subject", subjectService.find(examId, subjectCode));
+        return "modules/exam/userSubject";
     }
 
     @RequestMapping(value = "/add", method = RequestMethod.POST)
     public String save(@RequestParam String subjectCode, @RequestParam Integer[] userIds, HttpServletRequest request,
             RedirectAttributes redirectAttributes) {
-        int examId = getSessionExamId(request);
-        if (examId > 0) {
-            subjectUserService.save(subjectCode, userIds);
-            addMessage(redirectAttributes, subjectCode + "设置成功");
-            return "redirect:/admin/user/subject?subjectCode=" + subjectCode;
-        } else {
-            return "redirect:/admin/exam/list";
-        }
+        subjectUserService.save(subjectCode, userIds);
+        addMessage(redirectAttributes, subjectCode + "设置成功");
+        return "redirect:/admin/user/subject?subjectCode=" + subjectCode;
     }
 }

+ 158 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserClassController.java

@@ -0,0 +1,158 @@
+package cn.com.qmth.stmms.admin.user;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import cn.com.qmth.stmms.admin.exam.BaseExamController;
+import cn.com.qmth.stmms.biz.exam.model.MarkerClass;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerClassService;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.MarkerExcelError;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.UserSource;
+import cn.com.qmth.stmms.common.utils.ExportExcel;
+import cn.com.qmth.stmms.common.utils.ImportExcel;
+import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+
+@Controller
+@RequestMapping("/admin/user/class")
+public class UserClassController extends BaseExamController {
+
+    public static final String USER_PASSWORD = "123456";
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private MarkerClassService markerClassService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @RequestMapping(value = "/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+        try {
+            String fileName = "评卷员班级导入模板.xlsx";
+            List<MarkerClass> list = new ArrayList<MarkerClass>();
+            list.add(new MarkerClass());
+            new ExportExcel("评卷员班级数据", MarkerClass.class, 2).setDataList(list).write(response, fileName).dispose();
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
+        }
+        return "redirect:/admin/user/list";
+    }
+
+    @RequestMapping(value = "/import", method = RequestMethod.POST)
+    public String importFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        try {
+            int successNum = 0;
+            int failureNum = 0;
+            StringBuilder failureMsg = new StringBuilder();
+            ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<MarkerClass> list = ei.getDataList(MarkerClass.class);
+            Map<String, User> userMap = new HashMap<String, User>();
+            List<MarkerClass> saveList = new ArrayList<MarkerClass>();
+            Map<Integer, List<String>> classMap = new HashMap<Integer, List<String>>();
+            Integer schoolId = wu.getUser().getSchoolId();
+            for (MarkerClass markerClass : list) {
+                if (markerClass.getExamId() == null) {
+                    failureMsg.append("<br/>用户 " + markerClass.getLoginName() + MarkerExcelError.EXAMNULL.getName());
+                    failureNum++;
+                    continue;
+                }
+                if (StringUtils.isBlank(markerClass.getClassName())) {
+                    failureMsg.append("<br/>用户 " + markerClass.getLoginName() + MarkerExcelError.CLASSNULL.getName());
+                    failureNum++;
+                    continue;
+                }
+                List<String> classes = classMap.get(markerClass.getExamId());
+                if (classes == null) {
+                    classes = studentService.findDistinctClassName(markerClass.getExamId());
+                    classMap.put(markerClass.getExamId(), classes);
+                }
+                if (!classes.contains(markerClass.getClassName())) {
+                    failureMsg.append("<br/>考试 " + markerClass.getExamId() + " 班级 " + markerClass.getClassName()
+                            + MarkerExcelError.EXAMCLASSNULL.getName());
+                    failureNum++;
+                    continue;
+                }
+                if (StringUtils.isBlank(markerClass.getLoginName())) {
+                    failureMsg.append("<br/>用户 " + markerClass.getLoginName() + MarkerExcelError.NAMENULL.getName());
+                    failureNum++;
+                    continue;
+                }
+                User user = userMap.get(markerClass.getLoginName().trim());
+                if (user == null) {
+                    user = userService.findByLoginName(markerClass.getLoginName().trim());
+                    if (user != null && !schoolId.equals(user.getSchoolId())) {
+                        failureMsg
+                                .append("<br/>用户 " + markerClass.getLoginName() + MarkerExcelError.NAMEUSED.getName());
+                        failureNum++;
+                        continue;
+                    }
+                    if (user == null) {
+                        user = getUser(userMap, markerClass.getLoginName().trim(), schoolId);
+                    }
+                }
+                markerClass = getMarkerClass(user.getId(), markerClass.getExamId(), markerClass.getClassName());
+                saveList.add(markerClass);
+            }
+            successNum = markerClassService.batchSave(saveList);
+            if (failureNum > 0) {
+                failureMsg.insert(0, ",失败 " + failureNum + " 条记录!");
+            }
+            addMessage(redirectAttributes, "已成功导入" + successNum + " 条 " + failureMsg);
+        } catch (Exception e) {
+            log.error("Batch import subject user error!", e);
+            addMessage(redirectAttributes, "导入用户失败!失败信息:" + e.getMessage());
+        }
+        return "redirect:/admin/user/list";
+    }
+
+    private MarkerClass getMarkerClass(Integer userId, Integer examId, String className) {
+        MarkerClass m = markerClassService.findByUserIdAndExamIdAndClassName(userId, examId, className);
+        if (m == null) {
+            m = new MarkerClass(userId, examId, className);
+        }
+        return m;
+    }
+
+    private User getUser(Map<String, User> saveMap, String loginName, Integer schoolId) {
+        User user = saveMap.get(loginName);
+        if (user == null) {
+            user = new User();
+            user.setLoginName(loginName);
+            user.setName(loginName);
+            user.setPassword(Md5EncryptUtils.md5(USER_PASSWORD));
+            user.setRole(Role.SUBJECT_HEADER);
+            user.setSchoolId(schoolId);
+            user.setEnable(true);
+            user.setCreatedTime(new Date());
+            user.setSource(UserSource.INTERNAL);
+            userService.save(user);
+            saveMap.put(loginName, user);
+        }
+        return user;
+    }
+
+}

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

@@ -9,6 +9,8 @@ public class SessionExamUtils {
 
     public static final String EXAM_ID_KEY = "examId";
 
+    public static final String EXAM_NAME_KEY = "examName";
+
     public static int getExamId(HttpServletRequest request) {
         int examId = 0;
         try {
@@ -29,11 +31,14 @@ public class SessionExamUtils {
     public static void clearExamId(HttpServletRequest request) {
         StmmsSession session = RequestUtils.getSession(request);
         session.setParameter(EXAM_ID_KEY, null);
+        session.setParameter(EXAM_NAME_KEY, null);
         request.removeAttribute(EXAM_ID_KEY);
+        request.removeAttribute(EXAM_NAME_KEY);
     }
 
-    public static void setExamId(HttpServletRequest request, int examId) {
+    public static void setExamId(HttpServletRequest request, int examId, String name) {
         StmmsSession session = RequestUtils.getSession(request);
         session.setParameter(EXAM_ID_KEY, String.valueOf(examId));
+        session.setParameter(EXAM_NAME_KEY, name);
     }
 }

+ 2 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/common/domain/WebUser.java

@@ -33,8 +33,7 @@ public class WebUser {
 
     private Set<String> subjectCodeSet;
 
-    private WebUser(Integer id, String name, Role role, String token, Object userData, String logoutUrl,
-            String markerId) {
+    private WebUser(Integer id, String name, Role role, String token, Object userData, String logoutUrl, String markerId) {
         this.id = id;
         this.name = name;
         this.role = role;
@@ -110,4 +109,5 @@ public class WebUser {
     public void setSubjectCodeSet(Set<String> subjectCodeSet) {
         this.subjectCodeSet = subjectCodeSet;
     }
+
 }

+ 21 - 36
stmms-web/src/main/java/cn/com/qmth/stmms/common/interceptor/LogInterceptor.java

@@ -1,7 +1,18 @@
 package cn.com.qmth.stmms.common.interceptor;
 
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
-import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.model.OperationLog;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
@@ -14,16 +25,6 @@ import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.utils.AccessControlUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.method.HandlerMethod;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.Date;
 
 /**
  * @author ting.yin
@@ -87,13 +88,8 @@ public class LogInterceptor extends HandlerInterceptorAdapter {
         log.setIpAddress(wu.getUser().getLastLoginIp());
         log.setLoginName(wu.getUser().getLoginName());
         log.setSchoolId(wu.getUser().getSchoolId());
-        if (wu.isMarker()) {
-            Marker marker = markerService.findById(wu.getMarkerId());
-            log.setExamId(marker.getExamId());
-        } else {
-            int examId = SessionExamUtils.getExamId(request);
-            log.setExamId(examId > 0 ? examId : null);
-        }
+        int examId = SessionExamUtils.getExamId(request);
+        log.setExamId(examId > 0 ? examId : null);
         log.setDescription(RequestUtils.getLog(request));
         logService.save(log);
     }
@@ -108,24 +104,13 @@ public class LogInterceptor extends HandlerInterceptorAdapter {
         Integer userId = session.getWebUserId();
         Role role = session.getWebUserRole();
         if (userId != null && role != null) {
-            if (Role.MARKER == role) {
-                User user = userService.findById(userId);
-                if (user != null && user.getAccessTokenRefreshTime() != null && StringUtils
-                        .equals(session.getWebUserToken(), user.getAccessToken()) && !AccessControlUtils
-                        .expired(user.getAccessTokenRefreshTime())) {
-                    WebUser wu = new WebUser(user, session.getWebUserLogoutUrl(), session.getWebMarkerId().toString());
-                    RequestUtils.setWebUser(request, wu);
-                    return wu;
-                }
-            } else {
-                User user = userService.findById(userId);
-                if (user != null && user.getRole() == role && user.getAccessTokenRefreshTime() != null && StringUtils
-                        .equals(session.getWebUserToken(), user.getAccessToken()) && !AccessControlUtils
-                        .expired(user.getAccessTokenRefreshTime())) {
-                    WebUser wu = new WebUser(user, null, null);
-                    RequestUtils.setWebUser(request, wu);
-                    return wu;
-                }
+            User user = userService.findById(userId);
+            if (user != null && user.getAccessTokenRefreshTime() != null
+                    && StringUtils.equals(session.getWebUserToken(), user.getAccessToken())
+                    && !AccessControlUtils.expired(user.getAccessTokenRefreshTime())) {
+                WebUser wu = new WebUser(user, session.getWebUserLogoutUrl(), null);
+                RequestUtils.setWebUser(request, wu);
+                return wu;
             }
         }
         return null;

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

@@ -1,5 +1,32 @@
 package cn.com.qmth.stmms.mark;
 
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import net.sf.json.JSONObject;
+
+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.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+import org.springframework.stereotype.Controller;
+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 org.springframework.web.servlet.ModelAndView;
+
+import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 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;
@@ -7,42 +34,40 @@ import cn.com.qmth.stmms.biz.exam.model.Marker;
 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.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerClassService;
 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.*;
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
+import cn.com.qmth.stmms.biz.mark.model.MarkResult;
+import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.mark.model.ProblemType;
+import cn.com.qmth.stmms.biz.mark.model.Task;
+import cn.com.qmth.stmms.biz.mark.model.TrialHistory;
+import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.*;
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
+import cn.com.qmth.stmms.biz.mark.service.TaskService;
+import cn.com.qmth.stmms.biz.mark.service.TrialService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.controller.BaseController;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.*;
+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.MarkMode;
+import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import net.sf.json.JSONObject;
-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.data.domain.Sort;
-import org.springframework.data.domain.Sort.Direction;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.servlet.ModelAndView;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
 
 @Controller
 @RequestMapping("/mark")
@@ -83,6 +108,9 @@ public class MarkController extends BaseController {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private MarkerClassService markerClassService;
+
     @Autowired
     private SessionService sessionService;
 
@@ -134,8 +162,7 @@ public class MarkController extends BaseController {
     }
 
     @RequestMapping(value = "/subject-select", method = RequestMethod.POST)
-    public ModelAndView select(HttpServletRequest request, HttpServletResponse response,
-            @RequestParam Integer markerId) {
+    public ModelAndView select(HttpServletRequest request, HttpServletResponse response, @RequestParam Integer markerId) {
         User user = RequestUtils.getWebUser(request).getUser();
         ModelAndView modelAndView = new ModelAndView("modules/mark/subjectSelectAp");
         Calendar rightNow = Calendar.getInstance();
@@ -160,6 +187,7 @@ public class MarkController extends BaseController {
         StmmsSession session = RequestUtils.getSession(request);
         session.saveWebUser(new WebUser(user, null, markerId.toString()));
         sessionService.put(request, response, session);
+        SessionExamUtils.setExamId(request, exam.getId(), exam.getName());
         return new ModelAndView("redirect:/mark/index");
     }
 
@@ -206,8 +234,7 @@ public class MarkController extends BaseController {
                 markerService.save(marker);
             }
         }
-        ModelAndView view = new ModelAndView(
-                mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
+        ModelAndView view = new ModelAndView(mode == MarkMode.TRACK ? "modules/mark/markTrack" : "modules/mark/markNew");
         view.addObject("forceMode", forceMode);
         view.addObject("sheetView", group.isSheetView());
         view.addObject("enableAllZero", group.isEnableAllZero());
@@ -363,9 +390,9 @@ public class MarkController extends BaseController {
         while (task == null) {
             List<MarkLibrary> list = new ArrayList<MarkLibrary>();
             // 需要判断评卷员是否绑定了班级
-            list = libraryService
-                    .findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(), marker.getId(),
-                            marker.getClassCount() != null && marker.getClassCount() > 0, retry, 20);
+            long classCount = markerClassService.countByUserIdAndExamId(marker.getUserId(), marker.getExamId());
+            list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
+                    marker.getId(), marker.getUserId(), classCount > 0, retry, 20);
             if (list.isEmpty()) {
                 break;
             }
@@ -386,9 +413,8 @@ public class MarkController extends BaseController {
         int retry = 1;
         Task task = null;
         while (task == null) {
-            List<TrialLibrary> list = trialService
-                    .findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
-                            marker.getId(), retry, 10);
+            List<TrialLibrary> list = trialService.findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(),
+                    marker.getGroupNumber(), marker.getId(), retry, 10);
             if (list.isEmpty()) {
                 break;
             }
@@ -484,13 +510,11 @@ public class MarkController extends BaseController {
             // 试评查找给分历史记录
             List<TrialHistory> historyList = new ArrayList<TrialHistory>();
             if (studentId != null) {
-                historyList = trialService
-                        .findHistory(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
-                                marker.getId(), studentId, pageNumber, pageSize, querySort);
+                historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
+                        marker.getGroupNumber(), marker.getId(), studentId, pageNumber, pageSize, querySort);
             } else {
-                historyList = trialService
-                        .findHistory(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
-                                marker.getId(), pageNumber, pageSize, querySort, null);
+                historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
+                        marker.getGroupNumber(), marker.getId(), pageNumber, pageSize, querySort, null);
             }
             for (TrialHistory history : historyList) {
                 TrialLibrary library = trialService.findLibrary(history.getLibraryId());

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

@@ -2,7 +2,7 @@
 <%@ include file="/WEB-INF/views/include/taglib.jsp" %>
 <html>
 <head>
-    <title>高校云阅卷</title>
+    <title data-i18n-text="head.title">高校云阅卷</title>
     <meta name="decorator" content="default"/>
     <%@include file="/WEB-INF/views/include/head.jsp" %>
     <style type="text/css">
@@ -82,6 +82,7 @@
                   <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>
@@ -95,6 +96,12 @@
                         <!--[if lte IE 6]>
                         <script type="text/javascript">$('#themeSwitch').hide();</script><![endif]-->
                     </li>
+                    <li class="dropdown">
+                        <a class="dropdown-toggle" data-toggle="dropdown" href="#">考试:${examName}</a>
+                        <ul class="dropdown-menu">
+                            <li><a href="#" target="mainFrame" id="exam-select">返回选择考试</a></li>
+                        </ul>
+                    </li>
                     <li class="dropdown">
                         <a class="dropdown-toggle" data-toggle="dropdown" href="#" title="个人信息">${web_user.name}</a>
                         <ul class="dropdown-menu">
@@ -184,6 +191,10 @@
         }
         $("#right").width($("#content").width() - $("#left").width() - $("#openClose").width() - 5);
     }
+   
+    $('#exam-select').click(function(){
+    	window.location="${ctx}/admin/exam/select";
+	});
 </script>
 <script src="${ctxStatic}/common/wsize.min.js" type="text/javascript"></script>
 </body>

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

@@ -0,0 +1,97 @@
+<%@ 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" %> --%>
+<script src="${ctxStatic}/jquery/jquery-1.9.1.min.js" type="text/javascript"></script>
+<script src="${ctxStatic}/jquery/jquery-migrate-1.1.1.min.js" type="text/javascript"></script>
+<link href="${ctxStatic}/jquery-validation/1.11.1/jquery.validate.min.css" type="text/css" rel="stylesheet" />
+<script src="${ctxStatic}/jquery-validation/1.11.1/jquery.validate.min.js" type="text/javascript"></script>
+<script src="${ctxStatic}/jquery-validation/1.11.1/jquery.validate.method.min.js" type="text/javascript"></script>
+<link href="${ctxStatic}/fancyBox/source/jquery.fancybox.css" type="text/css" rel="stylesheet" />
+<script src="${ctxStatic}/fancyBox/source/jquery.fancybox.js" type="text/javascript"></script>
+<script src="${ctxStatic}/common/jeesite.min.js" type="text/javascript"></script>
+<link href="${ctxStatic}/common/jeesite.min.css" type="text/css" rel="stylesheet" />
+<script src="${ctxStatic}/select2/select2.js" type="text/javascript"></script>
+<script src="${ctxStatic}/select2/select2_locale_zh-CN.js" type="text/javascript"></script>
+<link href="${ctxStatic}/select2/select2.css" type="text/css" rel="stylesheet" />
+    <link rel="stylesheet" href="${ctxStatic}/common/login.css">
+	<script type="text/javascript">
+		$(document).ready(function() {
+			<!--针对nw.js评卷客户端,自动窗口最大化-->
+			try{
+				require('nw.gui').Window.get().maximize();
+			}catch(e){
+			}
+
+			$('#submit-button').click(function(){
+				var examId = $('#exam-select').val();
+				return examId!=undefined && examId!='' && examId!=null;
+			});
+
+			$('.point').hide();
+			var message="${message}";
+			if(message!=null && message!="" ){
+				showError(message);
+			}
+
+			$(document).ajaxError(function(evt, req, settings){
+				if(req.status==401) {
+					alert("权限失效,请重新登录!");
+					 window.location.href = "/login";
+		       	}
+			});
+			
+		});
+
+		function showError(message){
+			$('.point').show();
+			$('.error').html(message);
+		}
+
+		// 如果在框架中,则跳转刷新上级页面
+		if(self.frameElement && self.frameElement.tagName=="IFRAME"){
+			parent.location.reload();
+		}
+		
+		
+	</script>
+</head>
+<body>
+	<div class="container">
+	  <div class="middle cl">
+	   <div class="left">
+	    <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
+	    <p>Copyright &#169武汉启明软件 2012-2014</p>
+	   </div>
+	   <div class="right">
+	     <div class="title">
+	       <h1>请选择考试批次</h1>
+	       <br/>
+	     </div>
+	     <div class="loginbox">
+	      <form class="form login-form" action="${ctx}/admin/exam/select" method="post">
+	      <div class="exam-select">
+		        <select name="examId" id="exam-select">
+		        	<option value="">请选择考试</option>
+					<c:forEach items="${examList}" var="item">
+						<option value="${item.id}" <c:if test="${item.id==exam.id}">selected</c:if>>${item.id}-${item.name}</option>
+					</c:forEach>
+				</select>
+	      </div>
+	        <div class="point hide" >
+	        	<em class="error"></em>
+	        </div>
+	        <div class="login-btn">
+	        	<input class="opacity" type="submit" id="submit-button" value="确 定"/>
+	        	<a href="${ctx}/logout" class="opacity">退 出</a>
+	        </div>
+	      </form>
+	     </div>
+	   </div>
+	  </div>
+	</div>
+  </body>
+</html>

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

@@ -140,8 +140,9 @@
         <c:if test="${web_user.schoolAdmin==true}">
             &nbsp;
             <a href="${ctx}/admin/exam/marker/add" class="btn btn-success">新增</a>
-        </c:if>
             &nbsp;<input id="btnImport" class="btn" type="button" value="导入"/>
+             &nbsp;<a href="###" class="btn" id="save-button"">绑定评卷员</a>
+        </c:if>
     <!--     <input id="btnExport" class="btn" type="button" value="导出"/> -->
     </div>
 </form>
@@ -157,7 +158,6 @@
         <th>已评数量</th>
         <th>正在评卷</th>
         <th>任务数</th>
-        <th>绑定班级</th>
         <th>操作</th>
     </tr>
     </thead>
@@ -180,8 +180,6 @@
             <td>${marker.markedCount}</td>
             <td>${marker.currentCount}</td>
             <td>${marker.topCount}</td>
-            <td><a href="${ctx}/admin/exam/marker/class/${marker.id}"><c:if test="${marker.classCount == null}">0</c:if>
-                    ${marker.classCount}</a></td>
             <td>
                 <c:if test="${web_user.schoolAdmin==true}">
                     <a href="javascript:void(0)" class="reset-button" data-id="${marker.id}">重置</a>
@@ -191,6 +189,7 @@
                     <c:if test="${marker.enable==false}">
                         <a href="javascript:void(0)" class="toggle-button" data-id="${marker.id}" data-value="true">启用</a>
                     </c:if>
+                    <a href="${ctx}/admin/exam/marker/delete?markerId=${marker.id}">解绑</a>
                     <a href="javascript:void(0)" class="release-button" data-id="${marker.id}">回收</a>
                     <a href="javascript:void(0)" class="task-button" data-id="${marker.id}" onclick="showTaskWin('${marker.id}');">设置评卷数</a>
                     <a href="javascript:void(0)" class="reSetPassword-button" data-id="${marker.id}"
@@ -384,6 +383,7 @@
         }
         $.post('${ctx}/admin/exam/marker/reSetPassword', {id: markerId, password: password}, function (result) {
             if (result.success == true) {
+            	alert('修改成功');
                 $("#searchForm").submit();
             } else {
                 alert(result.message);
@@ -391,6 +391,16 @@
             $('.reSetPasswordWin').hide();
         });
     });
+    $('#save-button').click(function(){
+    	var subjectCode = $('#subject-select').val();
+    	var groupNumber = $('#group-select').val();
+        if(groupNumber==''||subjectCode=="") {
+            alert('请选择科目分组');
+            return false;
+        }
+        $(this).attr('href','${ctx}/admin/exam/marker/save?subjectCode='+subjectCode+'&groupNumber='+groupNumber);
+        return true;
+    });
 </script>
 
 </body>

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

@@ -0,0 +1,79 @@
+<%@ 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" %>
+	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+</head>
+<body>
+	<ul class="nav nav-tabs">
+		<li><a href="${ctx}/admin/exam/marker?subjectCode=${group.subjectCode}&groupNumber=${group.number}">评卷员管理</a></li>
+		<li  class="active"><a href="#">科目:${subject.code }-${subject.name } 分组号:${group.number} 设置</a></li>
+	</ul>
+	<form id="searchForm"  action="${ctx}/admin/exam/marker/save" 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}"/>
+		<input type="hidden" name="subjectCode" value="${group.subjectCode}"/>
+		<input type="hidden" name="groupNumber" value="${group.number}"/>
+		<div>
+			<label>登录名</label>
+			<input type="text" name="loginName" value="${query.loginName }"  maxlength="20" class="input-small"/> 
+			&nbsp;
+			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+			<input id="addSubmit" class="btn btn-primary" type="button" value="绑定" onclick="goAdd()"/>
+		</div>
+	</form>
+	<tags:message content="${message}"/>
+	<form id="addForm"  action="${ctx}/admin/exam/marker/add" method="post" class="breadcrumb form-search">
+	<input type="hidden" id="subjectCode" name="subjectCode" value="${group.subjectCode}"/>
+	<input type="hidden" name="groupNumber" value="${group.number}"/>
+	<table id="contentTable" class="table table-striped table-bordered table-condensed">
+		<thead>
+			<tr>
+				<th></th>
+				<th>登录名</th>
+				<th>姓名</th>
+			</tr>
+		</thead>
+		<tbody>
+		<c:forEach items="${query.result}" var="user">
+			<tr>
+				<td><input name="userIds" type="checkbox" value="${user.id }"/></td>
+				<td>${user.loginName}</td>
+				<td>${user.name}</td>
+			</tr>
+		</c:forEach>
+		</tbody>
+	</table>
+	</form>
+	<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;
+}
+function goAdd(){
+	var check_list = []
+	$("input[name='userIds']:checked").each(function(){
+		check_list.push($(this).val())
+	})
+    if(check_list.length==0) {
+        alert('请选择用户');
+        return false;
+    }
+	$("#addForm").submit();
+	return false;
+}
+</script>	
+</body>
+</html>

+ 92 - 59
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/subjectSelect.jsp

@@ -4,12 +4,13 @@
 <head>
 	<title>评卷科目选择</title>
 	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-    <link rel="stylesheet" href="${ctxStatic}/common/typica-login.css">
-	<style type="text/css">
-		.control-group{border-bottom:0px;}
-	</style>
-    <script src="${ctxStatic}/common/backstretch.min.js"></script>
+	<%-- <%@include file="/WEB-INF/views/include/head.jsp" %> --%>
+<script src="${ctxStatic}/jquery/jquery-1.9.1.min.js" type="text/javascript"></script>
+<script src="${ctxStatic}/jquery/jquery-migrate-1.1.1.min.js" type="text/javascript"></script>
+<link href="${ctxStatic}/jquery-validation/1.11.1/jquery.validate.min.css" type="text/css" rel="stylesheet" />
+<script src="${ctxStatic}/jquery-validation/1.11.1/jquery.validate.min.js" type="text/javascript"></script>
+<script src="${ctxStatic}/jquery-validation/1.11.1/jquery.validate.method.min.js" type="text/javascript"></script>
+    <link rel="stylesheet" href="${ctxStatic}/common/login.css">
 	<script type="text/javascript">
 		$(document).ready(function() {
 			<!--针对nw.js评卷客户端,自动窗口最大化-->
@@ -18,69 +19,101 @@
 			}catch(e){
 			}
 
-			$.backstretch([
- 		      "${ctxStatic}/images/bg1.jpg", 
- 		      "${ctxStatic}/images/bg2.jpg",
- 		      "${ctxStatic}/images/bg3.jpg"
- 		  	], {duration: 10000, fade: 2000});
+			$('#submit-button').click(function(){
+				var markerId = $('#marker-select').val();
+				return markerId!=undefined && markerId!='' && markerId!=null;
+			});
 
- 		  	if($('#subject-select option').length==0){
- 	 		  	$('#submit-button').hide();
- 	 		}
+			$('.point').hide();
+			var message="${message}";
+			if(message!=null && message!="" ){
+				showError(message);
+			}
 
-			$('#submit-button').click(function(){
-				var code = $('#subject-select').val();
-				return code!=undefined && code!='' && code!=null;
+			$('#exam-select').change(function(){
+							var examId = $(this).val();
+						    $('#marker-select').empty();
+						    if(examId==''){
+						        $('#marker-select').val('').trigger('change');
+						        return;
+						    }
+						    $.post('${ctx}/mark/subject/query', {examId: examId}, function(result){
+						        var parent = $('#marker-select');
+						        var first = '';
+						        for(var i=0;i<result.length;i++){
+						            var marker = result[i];
+						            $('<option value="'+marker.id+'">'+marker.subjectCode+'-'+marker.subjectName+'</option>').appendTo(parent);
+						            if(i==0){
+						                first = marker.id;
+						            }
+						        }
+						        parent.val(first).trigger('change');
+						    });
+						    $('.point').hide();
+			});
+
+			$(document).ajaxError(function(evt, req, settings){
+				if(req.status==401) {
+					alert("权限失效,请重新登录!");
+					 window.location.href = "/mark-login";
+		       	}
 			});
+			
 		});
+
+		function showError(message){
+			$('.point').show();
+			$('.error').html(message);
+		}
+
 		// 如果在框架中,则跳转刷新上级页面
 		if(self.frameElement && self.frameElement.tagName=="IFRAME"){
 			parent.location.reload();
 		}
+		
+		
 	</script>
 </head>
 <body>
-    <div class="navbar navbar-fixed-top">
-      <div class="navbar-inner">
-        <div class="container">
-          <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-            <span class="icon-bar"></span>
-          </a>
-          <a class="brand" href="${ctx}"><img src="${ctxStatic}/images/logo.png" alt="" style="height:40px;"></a>
-        </div>
-      </div>
-    </div>
-
-    <div class="container">
-		<!--[if lte IE 6]><br/><div class='alert alert-block' style="text-align:left;padding-bottom:10px;"><a class="close" data-dismiss="alert">x</a><h4>温馨提示:</h4><p>你使用的浏览器版本过低。为了获得更好的浏览体验,我们强烈建议您 <a href="http://browsehappy.com" target="_blank">升级</a> 到最新版本的IE浏览器,或者使用较新版本的 Chrome、Firefox、Safari 等。</p></div><![endif]-->
-		<div id="messageBox" class="alert alert-error <c:if test="${message == null }">hide</c:if>">
-			<label id="error" class="error">${message}</label>
-		</div>
-        <div id="login-wraper">
-            <form class="form login-form" action="${ctx}/mark/subject-select" method="post">
-                <legend><span style="color:#033249">请选择评卷科目</span></legend>
-                <div class="body">
-					<div class="control-group">
-						<div class="controls">
-							<select name="subjectCode" id="subject-select">
-							<c:forEach items="${subjectList}" var="subject">
-							<option value="${subject.code}" <c:if test="${subject.code==marker.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
-							</c:forEach>
-							</select>
-						</div>
-					</div>
-                </div>
-                <div class="footer">
-                    <input class="btn btn-primary" type="submit" id="submit-button" value="确 定"/>
-                    <a href="${ctx}/logout" class="btn">退 出</a>
-                </div>
-            </form>
-        </div>
-    </div>
-    <footer class="white navbar-fixed-bottom">
-		Copyright &copy;武汉启明软件 2012-2014
-    </footer>
+	<div class="container">
+	  <div class="middle cl">
+	   <div class="left">
+	    <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
+	    <p>Copyright &#169武汉启明软件 2012-2014</p>
+	   </div>
+	   <div class="right">
+	     <div class="title">
+	       <h1>请选择评卷科目</h1>
+	       <br/>
+	     </div>
+	     <div class="loginbox">
+	      <form class="form login-form" action="${ctx}/mark/subject-select" method="post">
+	      	<div class="option">
+		        <select name="examId" id="exam-select">
+		        	<option value="">请选择考试</option>
+					<c:forEach items="${examList}" var="item">
+						<option value="${item.id}" <c:if test="${item.id==exam.id}">selected</c:if>>${item.name}</option>
+					</c:forEach>
+				</select>
+        	</div>
+        	<div class="option">
+		        <select name="markerId" id="marker-select">
+		        	<c:if test="${subject!=null}">
+		        	<option value="" >${subject.name}</option>
+		        	</c:if>
+				</select>
+        	</div>
+	        <div class="point hide" >
+	        	<em class="error"></em>
+	        </div>
+	        <div class="login-btn">
+	        	<input class="opacity" type="submit" id="submit-button" value="确 定"/>
+	        	<a href="${ctx}/mark-logout" class="opacity">退 出</a>
+	        </div>
+	      </form>
+	     </div>
+	   </div>
+	  </div>
+	</div>
   </body>
 </html>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/user/userList.jsp

@@ -33,7 +33,7 @@
         <input type="text" name="loginName" value="${query.name}" maxlength="20" class="input-small"/>
         &nbsp;
         <label>来源</label>
-        <select class="input-medium" name="source" id="source-select">
+        <select class="input-small" name="source" id="source-select">
             <option value="">不限</option>
             <c:forEach items="${sourceList}" var="source">
                 <option value="${source.value}"

+ 66 - 1
stmms-web/src/main/webapp/static/common/login.css

@@ -200,7 +200,7 @@ input:-internal-autofill-selected{
 }
 /*point*/
 .point {
-	height: 16px;
+	height: 30px;
 	line-height: 16px;
 	overflow: hidden;
 	font-size: 12px;
@@ -285,4 +285,69 @@ input#submit-button:hover  {
 	-moz-box-shadow: 0px 10px 20px 0px rgba(100,204,202,.1);
 	-webkit-box-shadow: 0px 10px 20px 0px rgba(100,204,202,.1);
 	box-shadow: 0px 10px 20px 0px rgba(100,204,202,.1);
+}
+
+/*optionbox*/
+.option {
+	position: relative;
+	width: 340px;
+	height: 48px;
+	border: 1px solid #E2E5EB;
+	-moz-border-radius: 8px;
+	-webkit-border-radius: 8px;
+	border-radius: 8px;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+	transition: none!important;
+	margin-top: 20px;
+}
+.option:hover {
+	border: 1px solid #E2E5EB;
+	-webkit-box-shadow: 0px 10px 15px 0px rgba(203,205,211,.1);
+	-moz-box-shadow: 0px 10px 15px 0px rgba(203,205,211,.1);
+	box-shadow: 0px 10px 15px 0px rgba(203,205,211,.1);
+}
+.option select {
+	border: 0;
+	outline: 0;
+	background: none;
+	width: 100%;
+	height: 48px;
+	line-height: 48px;
+	color: #1B2C5F;
+	font-weight: bold;
+	appearance: none;
+    -webkit-appearance: none;
+    -moz-appearance: none;
+	padding-left: 20px;
+}
+.option:after {
+	 content: "";
+	 width: 29px;
+	 height: 48px;
+	 background: url(../images/arrow-down.png) no-repeat 0 0;
+	 position: absolute;
+	 top: 0;
+	 right: 0;
+	 pointer-events: none;
+}
+.exam-select {
+	position: relative;
+	width: 340px;
+	height: 48px;
+	margin-top: 20px;
+}
+.exam-select select {
+	border: 0;
+	outline: 0;
+	background: none;
+	width: 100%;
+	height: 48px;
+	line-height: 48px;
+	color: #1B2C5F;
+	font-weight: bold;
+	appearance: none;
+    -webkit-appearance: none;
+    -moz-appearance: none;
+	padding-left: 20px;
 }