Browse Source

增加标记违纪卷备注功能;修复评卷端登录课程禁用跳转;标记卷考生编号输入问题;

ting.yin 5 years ago
parent
commit
4e86ad3cb6
23 changed files with 612 additions and 45 deletions
  1. 38 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/TagInfoDao.java
  2. 11 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java
  3. 77 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/TagInfo.java
  4. 13 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamStudentSearchQuery.java
  5. 26 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/TagInfoService.java
  6. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  7. 60 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/TagInfoServiceImpl.java
  8. 38 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TagInfoDTO.java
  9. 12 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/Task.java
  10. 11 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java
  11. 41 11
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java
  12. 49 0
      stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/TagType.java
  13. 10 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java
  14. 13 0
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java
  15. 8 5
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/LoginController.java
  16. 25 20
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  17. 10 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/scoreList.jsp
  18. 4 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/tagInfo.jsp
  19. 4 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markNew.jsp
  20. 4 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markTrack.jsp
  21. 2 1
      stmms-web/src/main/webapp/static/mark-new/js/mark-control.js
  22. 152 0
      stmms-web/src/main/webapp/static/mark-new/js/modules/tagInfo.js
  23. 2 1
      stmms-web/src/main/webapp/static/mark-track/js/mark-control.js

+ 38 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/TagInfoDao.java

@@ -0,0 +1,38 @@
+package cn.com.qmth.stmms.biz.exam.dao;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.exam.model.TagInfo;
+import cn.com.qmth.stmms.common.enums.TagType;
+
+public interface TagInfoDao extends PagingAndSortingRepository<TagInfo, Integer>, JpaSpecificationExecutor<TagInfo> {
+
+    List<TagInfo> findByLibraryId(Integer libraryId);
+
+    TagInfo findByStudentIdAndType(Integer studentId, TagType type);
+
+    @Modifying
+    @Query("delete from TagInfo t where t.libraryId=?1")
+    void deleteByLibraryId(Integer libraryId);
+
+    @Modifying
+    @Query("delete from TagInfo s where s.libraryId in (select m.id from MarkLibrary m where m.markerId=?1 ) ")
+    public void deleteByMarkerId(Integer markerId);
+
+    @Modifying
+    @Query("delete from TagInfo s where s.libraryId in (select m.id from MarkLibrary m where m.examId=?1 and m.subjectCode=?2 )")
+    public void deleteByExamAndSubject(Integer examId, String subjectCode);
+
+    @Modifying
+    @Query("delete from TagInfo t where t.studentId=?1")
+    public void deleteByStudentId(Integer studentId);
+
+    @Modifying
+    @Query("delete from TagInfo s where s.libraryId in (select m.id from MarkLibrary m where m.examId=?1 )")
+    public void deleteByExam(int examId);
+}

+ 11 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java

@@ -270,6 +270,9 @@ public class ExamStudent implements Serializable {
     @Transient
     private String tagValue;
 
+    @Transient
+    private TagInfo tagInfo;
+
     public Integer getId() {
         return id;
     }
@@ -694,4 +697,12 @@ public class ExamStudent implements Serializable {
         this.tagValue = tagValue;
     }
 
+    public TagInfo getTagInfo() {
+        return tagInfo;
+    }
+
+    public void setTagInfo(TagInfo tagInfo) {
+        this.tagInfo = tagInfo;
+    }
+
 }

+ 77 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/TagInfo.java

@@ -0,0 +1,77 @@
+package cn.com.qmth.stmms.biz.exam.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+import cn.com.qmth.stmms.common.enums.TagType;
+
+@Entity
+@Table(name = "b_tag_info")
+public class TagInfo implements Serializable {
+
+    private static final long serialVersionUID = 4059391572310941581L;
+
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    @Column(name = "library_id", nullable = false)
+    private Integer libraryId;
+
+    @Column(name = "student_id", nullable = false)
+    private Integer studentId;
+
+    @Column(name = "tag_type", nullable = false)
+    @Enumerated(EnumType.STRING)
+    private TagType type;
+
+    private String remark;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getLibraryId() {
+        return libraryId;
+    }
+
+    public void setLibraryId(Integer libraryId) {
+        this.libraryId = libraryId;
+    }
+
+    public TagType getType() {
+        return type;
+    }
+
+    public void setType(TagType type) {
+        this.type = type;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public Integer getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Integer studentId) {
+        this.studentId = studentId;
+    }
+
+}

+ 13 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamStudentSearchQuery.java

@@ -5,6 +5,7 @@ import org.springframework.data.domain.Sort.Direction;
 
 import cn.com.qmth.stmms.biz.common.BaseQuery;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.common.enums.TagType;
 
 public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
 
@@ -69,9 +70,11 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
     private Double endScroe;
 
     private Boolean breach;
-    
+
     private Integer studentId;
 
+    private TagType tagType;
+
     public void orderByExamNumber() {
         setSort(new Sort(Direction.ASC, "examNumber"));
     }
@@ -331,4 +334,13 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
     public void setStudentId(Integer studentId) {
         this.studentId = studentId;
     }
+
+    public TagType getTagType() {
+        return tagType;
+    }
+
+    public void setTagType(TagType tagType) {
+        this.tagType = tagType;
+    }
+
 }

+ 26 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/TagInfoService.java

@@ -0,0 +1,26 @@
+package cn.com.qmth.stmms.biz.exam.service;
+
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.exam.model.TagInfo;
+import cn.com.qmth.stmms.common.enums.TagType;
+
+public interface TagInfoService {
+
+    List<TagInfo> findByLibraryId(Integer libraryId);
+
+    TagInfo findByStudentIdAndType(Integer studentId, TagType type);
+
+    void deleteByLibraryId(Integer libraryId);
+
+    TagInfo save(TagInfo tagInfo);
+
+    void deleteByStudentId(Integer studentId);
+
+    void deleteByExamId(int examId);
+
+    void deleteByExamAndSubject(Integer examId, String subjectCode);
+
+    void deleteByMarkerId(Integer markerId);
+
+}

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

@@ -609,6 +609,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 if (query.getStudentId() != null) {
                     predicates.add(cb.equal(root.get("id"), query.getStudentId()));
                 }
+                if (query.getTagType() != null) {
+                }
                 return predicates.isEmpty() ? cb.conjunction()
                         : cb.and(predicates.toArray(new Predicate[predicates.size()]));
             }

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

@@ -0,0 +1,60 @@
+package cn.com.qmth.stmms.biz.exam.service.impl;
+
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.dao.TagInfoDao;
+import cn.com.qmth.stmms.biz.exam.model.TagInfo;
+import cn.com.qmth.stmms.biz.exam.service.TagInfoService;
+import cn.com.qmth.stmms.common.enums.TagType;
+
+@Service
+public class TagInfoServiceImpl extends BaseQueryService<TagInfo> implements TagInfoService {
+
+    @Autowired
+    private TagInfoDao tagInfoDao;
+
+    @Override
+    public List<TagInfo> findByLibraryId(Integer libraryId) {
+        return tagInfoDao.findByLibraryId(libraryId);
+    }
+
+    @Override
+    public TagInfo findByStudentIdAndType(Integer studentId, TagType type) {
+        return tagInfoDao.findByStudentIdAndType(studentId, type);
+    }
+
+    @Override
+    public void deleteByLibraryId(Integer libraryId) {
+        tagInfoDao.deleteByLibraryId(libraryId);
+    }
+
+    @Override
+    public TagInfo save(TagInfo tagInfo) {
+        return tagInfoDao.save(tagInfo);
+    }
+
+    @Override
+    public void deleteByStudentId(Integer studentId) {
+        tagInfoDao.deleteByStudentId(studentId);        
+    }
+
+    @Override
+    public void deleteByExamId(int examId) {
+        tagInfoDao.deleteByExam(examId);
+    }
+
+    @Override
+    public void deleteByExamAndSubject(Integer examId, String subjectCode) {
+        tagInfoDao.deleteByExamAndSubject(examId, subjectCode);        
+    }
+
+    @Override
+    public void deleteByMarkerId(Integer markerId) {
+        tagInfoDao.deleteByMarkerId(markerId);        
+    }
+
+}

+ 38 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/TagInfoDTO.java

@@ -0,0 +1,38 @@
+package cn.com.qmth.stmms.biz.mark.model;
+
+import java.io.Serializable;
+
+public class TagInfoDTO implements Serializable {
+
+    private static final long serialVersionUID = -8318483576431947980L;
+
+    private String remark;
+
+    private int value;
+
+    public TagInfoDTO() {
+
+    }
+
+    public TagInfoDTO(int value, String remark) {
+        this.remark = remark;
+        this.value = value;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public void setValue(int value) {
+        this.value = value;
+    }
+
+}

+ 12 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/Task.java

@@ -118,8 +118,10 @@ public class Task implements Serializable {
 
     private String message;
 
-    //特殊标识:√ 或 ❌ 或 乄
-    private SpecialTagDTO [] tagList;
+    // 特殊标识:√ 或 ❌ 或 乄
+    private SpecialTagDTO[] tagList;
+
+    private TagInfoDTO[] tagInfoList;
 
     public Task() {
 
@@ -324,4 +326,12 @@ public class Task implements Serializable {
     public void setTagList(SpecialTagDTO[] tagList) {
         this.tagList = tagList;
     }
+
+    public TagInfoDTO[] getTagInfoList() {
+        return tagInfoList;
+    }
+
+    public void setTagInfoList(TagInfoDTO[] tagInfoList) {
+        this.tagInfoList = tagInfoList;
+    }
 }

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

@@ -23,6 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.service.TagInfoService;
 import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
@@ -42,6 +43,9 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
     
     @Autowired
     private MarkSpecialTagService specialTagService;
+    
+    @Autowired
+    private TagInfoService tagInfoService;
 
     @PersistenceContext
     private EntityManager em;
@@ -52,6 +56,7 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         if (library != null) {
             trackService.deleteByStudentId(library.getStudentId());
             specialTagService.deleteByLibraryId(library.getId());
+            tagInfoService.deleteByLibraryId(library.getId());
         }
         libraryDao.delete(library);
     }
@@ -64,7 +69,8 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
             delete(library);
         }
         trackService.deleteByStudentId(studentId);
-        specialTagService.deleteByLibraryId(studentId);
+        specialTagService.deleteByStudentId(studentId);
+        tagInfoService.deleteByStudentId(studentId);
     }
 
     @Transactional
@@ -73,6 +79,7 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         libraryDao.deleteByExamId(examId);
         trackService.deleteByExamId(examId);
         specialTagService.deleteByExamId(examId);
+        tagInfoService.deleteByExamId(examId);
     }
 
     @Transactional
@@ -107,6 +114,7 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         libraryDao.resetByExamIdAndSubjectCode(subject.getExamId(), subject.getCode(), LibraryStatus.WAITING);
         trackService.deleteByExamIdAndSubjectCode(subject.getExamId(), subject.getCode());
         specialTagService.deleteByExamAndSubject(subject.getExamId(), subject.getCode());
+        tagInfoService.deleteByExamAndSubject(subject.getExamId(), subject.getCode());
         
     }
 
@@ -116,6 +124,7 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         libraryDao.resetByMarkerId(marker.getId(), LibraryStatus.WAITING);
         trackService.deleteByMarkerId(marker.getId());
         specialTagService.deleteByMarkerId(marker.getId());
+        tagInfoService.deleteByMarkerId(marker.getId());
     }
 
     @Override
@@ -126,6 +135,7 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         if (library != null) {
             trackService.deleteByStudentId(library.getStudentId());
             specialTagService.deleteByLibraryId(id);
+            tagInfoService.deleteByLibraryId(id);
         }
     }
 

+ 41 - 11
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/TaskServiceImpl.java

@@ -23,15 +23,18 @@ import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudentPaper;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.model.TagInfo;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentPaperService;
 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.TagInfoService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkStepDTO;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
 import cn.com.qmth.stmms.biz.mark.model.SpecialTagDTO;
+import cn.com.qmth.stmms.biz.mark.model.TagInfoDTO;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.TrackDTO;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
@@ -42,6 +45,7 @@ import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.biz.utils.CurrentTaskUtil;
 import cn.com.qmth.stmms.biz.utils.MarkRedisUtil;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.TagType;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 
 /**
@@ -80,6 +84,9 @@ public class TaskServiceImpl implements TaskService, ApplicationContextAware, In
     @Autowired
     private MarkSpecialTagService markSpecialTagService;
 
+    @Autowired
+    private TagInfoService tagInfoService;
+
     @Value("${use.redis}")
     private boolean useRedis;
 
@@ -126,9 +133,22 @@ public class TaskServiceImpl implements TaskService, ApplicationContextAware, In
         if (library.getStatus() == LibraryStatus.QUEUED && library.getMarkerId() != null) {
             task.setBack(true);
         }
+        task.setTagInfoList(getTagInfoList(library.getId()));
         return task;
     }
 
+    private TagInfoDTO[] getTagInfoList(Integer libraryId) {
+        TagInfoDTO[] tagInfos = null;
+        List<TagInfo> list = tagInfoService.findByLibraryId(libraryId);
+        if (!CollectionUtils.isEmpty(list)) {
+            tagInfos = new TagInfoDTO[list.size()];
+            for (int i = 0; i < list.size(); i++) {
+                tagInfos[i] = new TagInfoDTO(list.get(i).getType().getValue(), list.get(i).getRemark());
+            }
+        }
+        return tagInfos;
+    }
+
     private List<MarkStepDTO> buildMarkStep(MarkLibrary library) {
         List<MarkStepDTO> list = new LinkedList<MarkStepDTO>();
         List<ExamQuestion> sList = null;
@@ -248,16 +268,16 @@ public class TaskServiceImpl implements TaskService, ApplicationContextAware, In
                             LibraryStatus.MARKED));
 
             Map<String, List<TrackDTO>> trackMap = task.getTrackMap();
-            if(trackMap.isEmpty()){
-            	trackService.deleteByStudentId(library.getStudentId());
-            }else{
-            	for (String questionNumber : trackMap.keySet()) {
-            		trackService.deleteByStudentIdAndQuestionNumber(library.getStudentId(), questionNumber);
-            		List<TrackDTO> list = trackMap.get(questionNumber);
-            		for (TrackDTO dto : list) {
-            			trackService.save(dto.transform(library));
-            		}
-            	}
+            if (trackMap.isEmpty()) {
+                trackService.deleteByStudentId(library.getStudentId());
+            } else {
+                for (String questionNumber : trackMap.keySet()) {
+                    trackService.deleteByStudentIdAndQuestionNumber(library.getStudentId(), questionNumber);
+                    List<TrackDTO> list = trackMap.get(questionNumber);
+                    for (TrackDTO dto : list) {
+                        trackService.save(dto.transform(library));
+                    }
+                }
             }
 
             SpecialTagDTO[] tagList = task.getTagList();
@@ -272,6 +292,17 @@ public class TaskServiceImpl implements TaskService, ApplicationContextAware, In
                     markSpecialTagService.save(markSpecialTag);
                 }
             }
+            tagInfoService.deleteByLibraryId(library.getId());
+            if (task.getTagInfoList() != null && task.getTagInfoList().length > 0) {
+                for (TagInfoDTO tagInfoDTO : task.getTagInfoList()) {
+                    TagInfo tagInfo = new TagInfo();
+                    tagInfo.setLibraryId(library.getId());
+                    tagInfo.setStudentId(library.getStudentId());
+                    tagInfo.setRemark(tagInfoDTO.getRemark());
+                    tagInfo.setType(TagType.findByValue(tagInfoDTO.getValue()));
+                    tagInfoService.save(tagInfo);
+                }
+            }
         }
     }
 
@@ -368,7 +399,6 @@ public class TaskServiceImpl implements TaskService, ApplicationContextAware, In
 
     /*
      * 客户端非正常情况下退出系统时,对内存中的没有及时清除的任务进行处理
-     * 
      */
     @Override
     public void clearTaskMap(long cleanMapinterval) throws Exception {

+ 49 - 0
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/TagType.java

@@ -0,0 +1,49 @@
+package cn.com.qmth.stmms.common.enums;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public enum TagType {
+
+    BREACH("违纪", 0);
+
+    private String name;
+
+    private int value;
+
+    private static List<TagType> list;
+
+    private TagType(String name, int value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public static TagType findByValue(int value) {
+        TagType status = null;
+        for (TagType s : TagType.values()) {
+            if (s.getValue() == value) {
+                status = s;
+                break;
+            }
+        }
+        return status;
+    }
+
+    public static List<TagType> getTypeList() {
+        if (list == null) {
+            list = new LinkedList<TagType>();
+            for (TagType type : TagType.values()) {
+                list.add(type);
+            }
+        }
+        return list;
+    }
+}

+ 10 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -35,6 +35,7 @@ import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudentPaper;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.Marker;
+import cn.com.qmth.stmms.biz.exam.model.TagInfo;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
 import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
@@ -44,11 +45,13 @@ 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.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.ScoreRateService;
+import cn.com.qmth.stmms.biz.exam.service.TagInfoService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.TagType;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ExportExcel2;
@@ -86,6 +89,9 @@ public class ScoreController extends BaseParameterController {
     @Autowired
     private ScoreRateService scoreRateService;
 
+    @Autowired
+    private TagInfoService tagInfoService;
+
     @Value("${sheet.image.server}")
     private String imageServer;
 
@@ -116,8 +122,6 @@ public class ScoreController extends BaseParameterController {
                 query.setSubjectCode(subjectCode);
             }
             query.setExamId(examId);
-            // query.setUpload(true);
-            // query.setAbsent(false);
             query.orderByExamNumber();
             if (filter == 1) {
                 query.setObjectiveScore(0d);
@@ -146,10 +150,13 @@ public class ScoreController extends BaseParameterController {
                 if (markLibrary != null) {
                     student.setTagValue(markLibrary.getTags());
                 }
+                TagInfo tagInfo = tagInfoService.findByStudentIdAndType(student.getId(), TagType.BREACH);
+                student.setTagInfo(tagInfo);
             }
             view.addObject("query", query);
             view.addObject("filter", filter);
             view.addObject("subjectList", getExamSubject(examId));
+            view.addObject("tagTypeList", TagType.getTypeList());
             view.addObject("exam", exam);
             view.addObject("imageServer", imageServer);
             view.addObject("packageServer", packageServer);
@@ -295,7 +302,7 @@ public class ScoreController extends BaseParameterController {
         int examId = getSessionExamId(request);
         Exam exam = examService.findById(examId);
         JSONObject obj = new JSONObject();
-        obj.accumulate("running", exam.getStatus().equals(ExamStatus.CALCULATING)?true:false);
+        obj.accumulate("running", exam.getStatus().equals(ExamStatus.CALCULATING) ? true : false);
         if (exam.getProcess() != null) {
             DecimalFormat format = new DecimalFormat("##.##");
             obj.accumulate("process", format.format(exam.getProcess() * 100));

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

@@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.InitBinder;
 
 import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
 import cn.com.qmth.stmms.common.enums.MarkMode;
+import cn.com.qmth.stmms.common.enums.TagType;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 
 public abstract class BaseController {
@@ -65,6 +66,18 @@ public abstract class BaseController {
                 }
             }
         });
+        // TagType 类型转换
+        binder.registerCustomEditor(TagType.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                try {
+                    setValue(TagType.findByValue(Integer.valueOf(text)));
+                } catch (Exception e) {
+                    setValue(null);
+                }
+            }
+        });
 
         binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor(true));
     }

+ 8 - 5
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/LoginController.java

@@ -91,10 +91,11 @@ public class LoginController extends BaseController{
      */
     @RequestMapping(value = "/admin-login", method = RequestMethod.POST)
     public ModelAndView adminLogin(User user, HttpServletRequest request, HttpServletResponse response) {
-        StmmsSession session = RequestUtils.getSession(request);
+        HttpSession httpSession = request.getSession();
+        httpSession.removeAttribute("message");
         User u = userService.findByLoginNameAndStatus(user.getLoginName());
         if (u != null) {
-            return adminLogin(u, user.getPassword(), request, session);
+            return adminLogin(u, user.getPassword(), request);
         } else {
             if ("aopeng".equals(appIndex)) {
                 ModelAndView aPview = new ModelAndView(AP_SYS_LOGIN_VIEW);
@@ -130,11 +131,13 @@ public class LoginController extends BaseController{
             HttpServletRequest request, HttpServletResponse response) {
         StmmsSession session = RequestUtils.getSession(request);
         String loginType = session.getParameter(LOGIN_TYPE_KEY);
+        HttpSession httpSession = request.getSession();
+        httpSession.removeAttribute("message");
         // 管理员
         if ("admin-login".equals(showType)) {
             User u = userService.findByLoginNameAndStatus(user.getLoginName());
             if (u != null) {
-                return adminLogin(u, user.getPassword(), request, session);
+                return adminLogin(u, user.getPassword(), request);
             } else {
                 if ("aopeng".equals(appIndex)) {
                     ModelAndView aPview = new ModelAndView(AP_SYS_LOGIN_VIEW);
@@ -153,7 +156,6 @@ public class LoginController extends BaseController{
                 return markerLogin(request, marker, user.getPassword());
             }
             if(loginType!=null){
-                HttpSession httpSession = request.getSession();
                 httpSession.setAttribute("message", "帐号不存在");
                 ModelAndView view = new ModelAndView("redirect:/mark-login");
                 return view;
@@ -178,12 +180,13 @@ public class LoginController extends BaseController{
      * @param session
      * @return
      */
-    private ModelAndView adminLogin(User u, String password, HttpServletRequest request, StmmsSession session) {
+    private ModelAndView adminLogin(User u, String password, HttpServletRequest request) {
         if (u.getPassword().equals(Md5EncryptUtils.md5(password))) {
             u.setLastLoginTime(new Date());
             u.setLastLoginIp(request.getRemoteAddr());
             userService.save(u);
 
+            StmmsSession session = RequestUtils.getSession(request);
             new WebUser(u.getId(), u.getType()).writeToSession(session);
 
             if (u.getType() == UserType.ADMIN || u.getType() == UserType.VIEWER || u.getType() == UserType.SCHOOLVIEWER) {

+ 25 - 20
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -5,6 +5,7 @@ import java.util.Date;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
@@ -32,6 +33,7 @@ import cn.com.qmth.stmms.biz.exam.model.Tag;
 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.MarkerService;
+import cn.com.qmth.stmms.biz.exam.service.TagInfoService;
 import cn.com.qmth.stmms.biz.exam.service.TagService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.Task;
@@ -42,6 +44,7 @@ import cn.com.qmth.stmms.common.controller.BaseController;
 import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.MarkMode;
+import cn.com.qmth.stmms.common.enums.TagType;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -51,9 +54,7 @@ public class MarkController extends BaseController {
 
     private static Logger log = LoggerFactory.getLogger(MarkController.class);
 
-    protected static final String MARK_LOGIN_VIEW = "modules/sys/markLogin";
-
-    protected static final String AP_MARK_LOGIN_VIEW = "modules/sys/markLoginAp";
+    protected static final String MARK_LOGIN_VIEW = "redirect:/mark-login";
 
     @Autowired
     private ExamSubjectService subjectService;
@@ -72,6 +73,9 @@ public class MarkController extends BaseController {
 
     @Autowired
     private ExamService examService;
+    
+    @Autowired
+    private TagInfoService tagInfoService;
 
     @Value("${slice.image.server}")
     private String sliceServer;
@@ -124,32 +128,20 @@ public class MarkController extends BaseController {
 
     @RequestMapping(value = "/subject-select", method = RequestMethod.POST)
     public ModelAndView select(HttpServletRequest request, @RequestParam String subjectCode) {
-        Marker marker = RequestUtils.getWebUser(request).getMarker();
+        HttpSession httpSession = request.getSession();
         ModelAndView modelAndView = new ModelAndView(MARK_LOGIN_VIEW);
-        ModelAndView modelAndViewForAP = new ModelAndView(AP_MARK_LOGIN_VIEW);
+        Marker marker = RequestUtils.getWebUser(request).getMarker();
         ExamSubject subject = subjectService.find(marker.getExamId(), subjectCode);
         if (subject == null) {
-            if ("aopeng".equals(appIndex)) {
-                modelAndViewForAP.addObject("message", "科目不存在");
-                return modelAndViewForAP;
-            }
-            modelAndView.addObject("message", "科目不存在");
+            httpSession.setAttribute("message", "科目不存在");
             return modelAndView;
         }
         if (subject.getStatus() == ExamSubjectStatus.PAUSE) {
-            if ("aopeng".equals(appIndex)) {
-                modelAndViewForAP.addObject("message", "当前科目暂停评卷");
-                return modelAndViewForAP;
-            }
-            modelAndView.addObject("message", "当前科目暂停评卷");
+            httpSession.setAttribute("message", "当前科目暂停评卷");
             return modelAndView;
         }
         if (subject.getStatus() == ExamSubjectStatus.FINISH) {
-            if ("aopeng".equals(appIndex)) {
-                modelAndViewForAP.addObject("message", "当前科目评卷已结束");
-                return modelAndViewForAP;
-            }
-            modelAndView.addObject("message", "当前科目评卷已结束");
+            httpSession.setAttribute("message", "当前科目评卷已结束");
             return modelAndView;
         }
         marker.setSubjectCode(subjectCode);
@@ -448,4 +440,17 @@ public class MarkController extends BaseController {
     private boolean setCurrentTask(Marker marker, int libraryId) {
         return taskService.setCurrent(marker, libraryId);
     }
+    
+    @RequestMapping("/tagType")
+    @ResponseBody
+    public JSONArray getTagType(HttpServletRequest request) {
+        JSONArray array = new JSONArray();
+        for (TagType tag : TagType.values()) {
+            JSONObject obj = new JSONObject();
+            obj.accumulate("value", tag.getValue());
+            obj.accumulate("name", tag.getName());
+            array.add(obj);
+        }
+        return array;
+    }
 }

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

@@ -76,6 +76,14 @@
 			<label>考生编号</label>
             <input type="text" name="studentId" id="studentId" value="${query.studentId}" maxlength="10" class="input-small"onkeyup="this.value=this.value.replace(/\D/g,'')"/>
             &nbsp;
+<!--             <label>违纪卷</label> -->
+<!-- 			<select class="input-large" name="tagType"> -->
+<!-- 				<option value="">请选择</option> -->
+<%-- 				<c:forEach items="${tagTypeList}" var="tagType"> --%>
+<%-- 				<option value="${tagType.value}" <c:if test="${tagType.value==query.tagType.value}">selected</c:if>>${tagType.name}</option> --%>
+<%-- 				</c:forEach> --%>
+<!-- 			</select> -->
+<!-- 			&nbsp; -->
             <div style="float: right;">
                 <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
                 &nbsp;
@@ -123,6 +131,7 @@
 				<th>标记卷类型</th>
 				<th>阅卷账号</th>
 				<th>阅卷姓名</th>
+				<th>违纪备注</th>
 				<th>查看图片</th>
 			</tr>
 		</thead>
@@ -214,6 +223,7 @@
 				</td>
 				<td>${student.markLogin}</td>
 				<td>${student.markName}</td>
+				<td>${student.tagInfo.remark}</td>
 				<td>
 					<a class="sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>" data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">原图</a>
 					<!--  

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

@@ -107,6 +107,10 @@ function page(n,s){
 	return false;
 }
 function goSearch(){
+    var studentId = parseInt($("#studentId").val());
+    if( $("#studentId").val()!="" && studentId>2147483647 ){
+    	alert("考生编号不合法");return false;
+    };
 	$("#pageNumber").val(1);
 	$("#searchForm").attr('action', '${ctx}/admin/exam/tag');
 	$("#searchForm").submit();

+ 4 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markNew.jsp

@@ -35,6 +35,7 @@
 <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/tag-process.js"></script>
 <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
 <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/specialTag.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/tagInfo.js"></script>
 </head>
 <body>
 	<div class="container-fluid" id="container"></div>
@@ -98,6 +99,9 @@
 						]
 					},
                     'specialTag':{
+                    },
+                    'tagInfo':{
+                    	url : '${ctx}/mark/tagType'
                     }
 				}
 			});

+ 4 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/markTrack.jsp

@@ -28,6 +28,7 @@
 <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/tag-process.js"></script>
 <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/view-sidebar.js"></script>
 <script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/specialTag.js"></script>
+<script type="text/javascript" src="${ctxStatic}/mark-new/js/modules/tagInfo.js"></script>
 </head>
 <body>
 	<div class="container-fluid" id="container"></div>
@@ -78,6 +79,9 @@
 						url : '${ctx}/mark/tags'
 					},
                     'specialTag':{
+                    },
+                    'tagInfo':{
+                    	url : '${ctx}/mark/tagType'
                     },
 					<c:if test="${exam.showSheet==true}">
 					'sheet-view':{

+ 2 - 1
stmms-web/src/main/webapp/static/mark-new/js/mark-control.js

@@ -583,7 +583,8 @@ MarkControl.prototype.submitTask = function(submitUrl) {
                 tagList: task.tagList,
                 markId:task.markId,
                 tags: task.tags,
-                spent: new Date().getTime() - task.spent
+                spent: new Date().getTime() - task.spent,
+                tagInfoList : task.tagInfoList
             }
         this.trigger('task.submit.before');
         

+ 152 - 0
stmms-web/src/main/webapp/static/mark-new/js/modules/tagInfo.js

@@ -0,0 +1,152 @@
+//违纪卷
+var tagInfo = function(option, success) {
+    var object = new TagInfo(option);
+    success();
+    return object;
+}
+
+function TagInfo(option) {
+    this.markControl = option.markControl;
+    this.url = option.url;
+    this.context = option.markControl.context;
+    this.init();
+    this.markControl.on('task.get.before', this, function(event, context, eventObject) {
+        this.task = undefined;
+        this.reset();
+    });
+    this.markControl.on('task.get.success', this, function(event, context, eventObject) {
+        this.task = context.task;
+        this.reset();
+    });
+    this.markControl.on('task.get.none', this, function(event, context, eventObject) {
+        this.reset();
+    });
+    this.markControl.on('task.get.error', this, function(event, context, eventObject) {
+        this.reset();
+    });
+}
+
+TagInfo.prototype.init = function() {
+    this.container = getDom(this.container_dom, this.markControl).appendTo(this.markControl.container.assistant);
+    this.container.list = this.container.find('#type-info-list');
+    this.container.title = this.container.find('.popover-title');
+    this.popover = getDom(this.popover_dom, this.markControl);
+    this.popover.remarkInput = this.popover.find('input.remark-input');
+    this.popover.submitButton = this.popover.find('a.btn');
+    this.popover.cancelButton = this.popover.find('p.image-close');
+    this.popover.appendTo(this.markControl.container);
+    var self = this;
+    $.post(this.url, function(result) {
+        for (var i = 0; i < result.length; i++) {
+            var button = getDom(self.button_dom, self.markControl).appendTo(self.container.list);
+            button.attr('data-value', result[i].value);
+            button.html(result[i].name);
+        }
+
+        self.container.list.find('.tag-button').click(function(event) {
+        	self.currButton = $(this);
+            $(this).toggleClass('curr');
+            if($(this).hasClass('curr')){
+            	self.toggle(true,$(this));
+            }else{
+            	self.toggle(false,$(this));
+            }
+        });
+        
+        self.popover.submitButton.click(function() {
+        	var remark = self.popover.remarkInput.val();
+        	if (remark.length > 20) {
+                self.popover.find('i.remark').html('长度不能超20字');
+                return false;
+            }
+        	self.popover.find('i.remark').html('');
+        	self.currButton.attr('data-remark',remark);
+        	self.toggle(false);
+        });
+        
+        self.popover.cancelButton.click(function() {
+        	self.toggle(false);
+        });
+    });
+}
+
+TagInfo.prototype.reset = function() {
+    //this.container.list.find('.tag-button').removeClass('curr');
+	var self = this;
+    if (this.task != undefined) {
+    	if(this.task.tagInfoList!=undefined){
+    		this.container.list.find('.tag-button').each(function(index, obj) {
+    			var value = $(obj).attr('data-value');
+    			for (var i = 0; i < self.task.tagInfoList.length; i++) {
+    				var tagInfo = self.task.tagInfoList[i];
+    				if(tagInfo.value == value){
+    					$(obj).addClass('curr');
+    					$(obj).attr('data-remark',tagInfo.remark);
+    					break;
+    				}else{
+    					$(obj).removeClass('curr');
+    				}
+    			}
+    		});
+    	}else{
+    		this.container.list.find('.tag-button').each(function(index, obj) {
+    			$(obj).removeClass('curr');
+    			$(obj).removeAttr('data-remark');
+    		});
+    	}
+        this.container.show();
+    } else {
+        this.container.hide();
+    }
+}
+
+TagInfo.prototype.onTypeSelect = function() {
+	var self = this;
+    if (this.task != undefined) {
+        var array = [];
+        this.container.list.find('.tag-button').each(function(index, obj) {
+            if ($(obj).hasClass('curr')) {
+            	 var tagObj = {
+                         value: $(obj).attr('data-value'),
+                         remark: $(obj).attr('data-remark'),
+                     }
+                array.push(tagObj);
+            }
+        });
+
+        if (array.length > 0) {
+            this.task.tagInfoList = array;
+        } else {
+            this.task.tagInfoList = undefined;
+        }
+    }
+}
+
+TagInfo.prototype.toggle = function(enable,button) {
+	var self = this;
+    if (enable == true) {
+    	self.enable = true;
+    	var remark = button.attr('data-remark');
+    	self.popover.remarkInput.val(remark);
+    	self.popover.show();
+        self.context.listenKeyboard = false;
+    } else {
+    	self.enable = false;
+    	self.popover.hide();
+        self.context.listenKeyboard = true;
+    }
+    self.onTypeSelect();
+}
+
+TagInfo.prototype.container_dom = '<h3 class="popover-title">违纪卷</h3>\
+<div class="popover-content"><p id="type-info-list" class="popover-list">\
+</p></div>';
+
+TagInfo.prototype.button_dom = '<a class="tag-button" href="#"></a>';
+
+TagInfo.prototype.popover_dom = '<div class="message-popover" style="display:none"><div class="popover-header">\
+	<p class="title">违纪卷备注</p><p class="image-close"><img src="{staticServer}/mark-new/images/images-close.png" /></p></div>\
+	<div class="popover-cont"><input class="remark-input" placeholder="请输入备注" type="text"/>\
+	<i class="wrong remark"></i></div>\
+	<a href="#" class="btn btn-small btn-info text-userInfo">确定</a>\
+	</div>';

+ 2 - 1
stmms-web/src/main/webapp/static/mark-track/js/mark-control.js

@@ -599,7 +599,8 @@ MarkControl.prototype.submitTask = function(submitUrl) {
                 tagList: task.tagList,
                 markId:task.markId,
                 tags: task.tags,
-                spent: new Date().getTime() - task.spent
+                spent: new Date().getTime() - task.spent,
+                tagInfoList : task.tagInfoList
             }
         this.trigger('task.submit.before');
         this.trigger('mark.specialTag.before');