浏览代码

解决合并冲突;修改用户管理模块对科组长角色的特殊处理

luoshi 4 年之前
父节点
当前提交
164ccee6f4
共有 21 个文件被更改,包括 369 次插入425 次删除
  1. 9 9
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java
  2. 9 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamSubjectDao.java
  3. 10 7
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/SubjectUserDao.java
  4. 4 10
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SubjectUser.java
  5. 4 12
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java
  6. 5 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamSubjectService.java
  7. 6 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/SubjectUserService.java
  8. 20 46
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java
  9. 21 16
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamSubjectServiceImpl.java
  10. 28 9
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/SubjectUserServiceImpl.java
  11. 5 11
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/model/User.java
  12. 0 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/UserService.java
  13. 20 56
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/BaseExamController.java
  14. 20 18
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ImageCheckController.java
  15. 60 79
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  16. 28 44
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java
  17. 21 15
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/interceptor/AdminInterceptor.java
  18. 54 54
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java
  19. 14 17
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CoreController.java
  20. 13 0
      stmms-web/src/main/java/cn/com/qmth/stmms/common/domain/WebUser.java
  21. 18 9
      stmms-web/src/main/webapp/WEB-INF/views/modules/user/userEdit.jsp

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

@@ -1,8 +1,7 @@
 package cn.com.qmth.stmms.biz.exam.dao;
 
-import java.util.Date;
-import java.util.List;
-
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.common.enums.ExamStatus;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -10,8 +9,8 @@ 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.Exam;
-import cn.com.qmth.stmms.common.enums.ExamStatus;
+import java.util.Date;
+import java.util.List;
 
 public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaSpecificationExecutor<Exam> {
 
@@ -34,15 +33,16 @@ public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaS
     @Query("update Exam e set e.needCalculate=?2 where e.id=?1")
     public void updateNeedCalculate(Integer examId, boolean needCalculate);
 
-    public List<Exam> findBySchoolIdOrderByIdDesc(Integer schoolId);
+    public List<Exam> findBySchoolIdAndStatusOrderByIdDesc(Integer schoolId, ExamStatus status);
 
     @Modifying
     @Query("update Exam e set e.process=?2 where e.id=?1")
     public void updateProcess(Integer id, Double process);
 
-    public Exam findBySchoolIdAndCode(Integer schoolId, String code);
+    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);
 }

+ 9 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamSubjectDao.java

@@ -1,21 +1,24 @@
 package cn.com.qmth.stmms.biz.exam.dao;
 
-import java.util.List;
-
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubjectPK;
 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.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubjectPK;
+import java.util.List;
+import java.util.Set;
 
-public interface ExamSubjectDao extends PagingAndSortingRepository<ExamSubject, ExamSubjectPK>,
-        JpaSpecificationExecutor<ExamSubject> {
+public interface ExamSubjectDao
+        extends PagingAndSortingRepository<ExamSubject, ExamSubjectPK>, JpaSpecificationExecutor<ExamSubject> {
 
     @Query("select s from ExamSubject s where s.pk.examId=?1")
     public List<ExamSubject> findByExamId(int examId);
 
+    @Query("select s from ExamSubject s where s.pk.examId=?1 and s.pk.code in (?2)")
+    public List<ExamSubject> findByExamIdAndSubjectCodeIn(int examId, Set<String> codes);
+
     @Query("select s.level from ExamSubject s where s.pk.examId=?1 and s.level is not null group by s.level")
     public List<String> findDistinctLevel(int examId);
 

+ 10 - 7
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/SubjectUserDao.java

@@ -1,18 +1,21 @@
 package cn.com.qmth.stmms.biz.exam.dao;
 
-import java.util.List;
-
+import cn.com.qmth.stmms.biz.exam.model.SubjectUser;
 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.SubjectUser;
+import java.util.List;
 
-public interface SubjectUserDao extends PagingAndSortingRepository<SubjectUser, Integer>,
-        JpaSpecificationExecutor<SubjectUser> {
+public interface SubjectUserDao
+        extends PagingAndSortingRepository<SubjectUser, Integer>, JpaSpecificationExecutor<SubjectUser> {
 
     List<SubjectUser> findByUserId(Integer userId);
 
-    List<SubjectUser> findBySubjectCode(String subjectCode);
-
     SubjectUser findBySubjectCodeAndUserId(String subjectCode, Integer userId);
+
+    @Modifying
+    @Query("delete su from SubjectUser su where su.userId=?1")
+    void deleteByUserId(Integer userId);
 }

+ 4 - 10
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/SubjectUser.java

@@ -1,17 +1,11 @@
 package cn.com.qmth.stmms.biz.exam.model;
 
-import java.io.Serializable;
-
-import javax.persistence.Column;
-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.biz.user.model.User;
 import cn.com.qmth.stmms.common.annotation.ExcelField;
 
+import javax.persistence.*;
+import java.io.Serializable;
+
 @Entity
 @Table(name = "eb_subject_user")
 public class SubjectUser implements Serializable {
@@ -22,7 +16,7 @@ public class SubjectUser implements Serializable {
     @GeneratedValue
     private Integer id;
 
-    @Column(name = "subject_code", nullable = false)
+    @Column(name = "subject_code", length = 32, nullable = false)
     @ExcelField(title = "科目代码", align = 2, sort = 20)
     private String subjectCode;
 

+ 4 - 12
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.ExamStatus;
 
+import java.util.Date;
+import java.util.List;
+
 public interface ExamService {
 
     Exam save(Exam exam);
@@ -20,21 +20,13 @@ public interface ExamService {
 
     void updateNeedCalculate(Integer id, boolean needCalculate);
 
-    void deleteById(Integer id);
-
-    void delete(Exam exam);
-
     ExamSearchQuery findByQuery(ExamSearchQuery query);
 
-    List<Exam> findByStatus(ExamStatus status);
-
-    List<Exam> findByCreatorAndStatus(Integer id, ExamStatus status);
-
     List<Exam> findBySchoolId(Integer schoolId);
 
     void updateProcess(Integer examId, Double process);
 
-    Exam findByCode(Integer schoolId, String code);
+    Exam findBySchoolAndCode(Integer schoolId, String code);
 
     List<Exam> findByUserId(Integer id, Date time);
 

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

@@ -1,11 +1,12 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 
+import java.util.List;
+import java.util.Set;
+
 public interface ExamSubjectService {
 
     ExamSubject save(ExamSubject subject);
@@ -14,6 +15,8 @@ public interface ExamSubjectService {
 
     List<ExamSubject> list(int examId);
 
+    List<ExamSubject> list(int examId, Set<String> codes);
+
     void delete(ExamSubject markSubject);
 
     long count(int examId);

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

@@ -1,16 +1,17 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
-import java.util.List;
-
 import cn.com.qmth.stmms.biz.exam.model.SubjectUser;
 
+import java.util.List;
+import java.util.Set;
+
 public interface SubjectUserService {
 
     SubjectUser save(SubjectUser u);
 
     List<SubjectUser> findByUserId(Integer userId);
 
-    List<SubjectUser> findBySubjectCode(String subjectCode);
+    Set<String> findSubjectCode(Integer userId);
 
     int batchSave(List<SubjectUser> saveList);
 
@@ -20,4 +21,6 @@ public interface SubjectUserService {
 
     void save(String subjectCode, Integer[] userIds);
 
+    void updateByUserId(Integer userId, Set<String> subjectCodeSet);
+
 }

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

@@ -1,21 +1,5 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.data.jpa.domain.Specification;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.ExamDao;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
@@ -26,6 +10,20 @@ import cn.com.qmth.stmms.biz.mark.model.ProblemType;
 import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
 
 @Service
 public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamService {
@@ -83,21 +81,6 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
                 configList != null ? StringUtils.join(configList, PictureConfigItem.DB_ITEM_JOINER) : "");
     }
 
-    @Transactional
-    // @CacheEvict(value = "exam_cache", beforeInvocation = true, allEntries =
-    // true)
-    public void deleteById(Integer id) {
-        examDao.delete(id);
-    }
-
-    @Override
-    // @CacheEvict(value = "exam_cache", beforeInvocation = true, allEntries =
-    // true)
-    @Transactional
-    public void delete(Exam exam) {
-        examDao.delete(exam);
-    }
-
     @Override
     public ExamSearchQuery findByQuery(final ExamSearchQuery query) {
         checkQuery(query);
@@ -147,27 +130,18 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
                     }
                 }
 
-                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);
         return query;
     }
 
-    @Override
-    public List<Exam> findByStatus(ExamStatus status) {
-        return examDao.findByStatus(status);
-    }
-
-    @Override
-    public List<Exam> findByCreatorAndStatus(Integer id, ExamStatus status) {
-        return examDao.findByCreatorAndStatus(id, status);
-    }
-
     @Override
     public List<Exam> findBySchoolId(Integer schoolId) {
-        return examDao.findBySchoolIdOrderByIdDesc(schoolId);
+        return examDao.findBySchoolIdAndStatusOrderByIdDesc(schoolId, ExamStatus.START);
     }
 
     @Transactional
@@ -177,8 +151,8 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
     }
 
     @Override
-    public Exam findByCode(Integer schoolId, String code) {
-        return examDao.findBySchoolIdAndCode(schoolId, code);
+    public Exam findBySchoolAndCode(Integer schoolId, String code) {
+        return examDao.findFirstBySchoolIdAndCode(schoolId, code);
     }
 
     @Override

+ 21 - 16
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamSubjectServiceImpl.java

@@ -1,13 +1,11 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.exam.dao.ExamSubjectDao;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -15,12 +13,13 @@ import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import cn.com.qmth.stmms.biz.common.BaseQueryService;
-import cn.com.qmth.stmms.biz.exam.dao.ExamSubjectDao;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
 
 @Service("examSubjectService")
 public class ExamSubjectServiceImpl extends BaseQueryService<ExamSubject> implements ExamSubjectService {
@@ -50,6 +49,11 @@ public class ExamSubjectServiceImpl extends BaseQueryService<ExamSubject> implem
         return subjectDao.findByExamId(examId);
     }
 
+    @Override
+    public List<ExamSubject> list(int examId, Set<String> codes) {
+        return subjectDao.findByExamIdAndSubjectCodeIn(examId, codes);
+    }
+
     @Override
     public List<String> listLevel(int examId) {
         return subjectDao.findDistinctLevel(examId);
@@ -150,8 +154,9 @@ public class ExamSubjectServiceImpl extends BaseQueryService<ExamSubject> implem
                 if (query.getUploadCountEqual() != null) {
                     predicates.add(cb.equal(root.get("uploadCount").as(Integer.class), query.getUploadCountEqual()));
                 }
-                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()]));
             }
         };
     }

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

@@ -1,16 +1,17 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.SubjectUserDao;
 import cn.com.qmth.stmms.biz.exam.model.SubjectUser;
 import cn.com.qmth.stmms.biz.exam.service.SubjectUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 @Service("subjectUserService")
 public class SubjectUserServiceImpl extends BaseQueryService<SubjectUser> implements SubjectUserService {
@@ -30,8 +31,13 @@ public class SubjectUserServiceImpl extends BaseQueryService<SubjectUser> implem
     }
 
     @Override
-    public List<SubjectUser> findBySubjectCode(String subjectCode) {
-        return subjectUserDao.findBySubjectCode(subjectCode);
+    public Set<String> findSubjectCode(Integer userId) {
+        Set<String> set = new HashSet<>();
+        List<SubjectUser> list = subjectUserDao.findByUserId(userId);
+        for (SubjectUser su : list) {
+            set.add(su.getSubjectCode());
+        }
+        return set;
     }
 
     @Override
@@ -51,6 +57,7 @@ public class SubjectUserServiceImpl extends BaseQueryService<SubjectUser> implem
     }
 
     @Override
+    @Transactional
     public void save(String subjectCode, Integer[] userIds) {
         List<SubjectUser> list = new ArrayList<SubjectUser>();
         if (userIds != null && userIds.length > 0) {
@@ -69,4 +76,16 @@ public class SubjectUserServiceImpl extends BaseQueryService<SubjectUser> implem
 
     }
 
+    @Override
+    @Transactional
+    public void updateByUserId(Integer userId, Set<String> subjectCodeSet) {
+        subjectUserDao.deleteByUserId(userId);
+        for (String subjectCode : subjectCodeSet) {
+            SubjectUser subjectUser = new SubjectUser();
+            subjectUser.setSubjectCode(subjectCode);
+            subjectUser.setUserId(userId);
+            subjectUserDao.save(subjectUser);
+        }
+    }
+
 }

+ 5 - 11
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/model/User.java

@@ -1,19 +1,13 @@
 package cn.com.qmth.stmms.biz.user.model;
 
-import java.io.Serializable;
-import java.util.Date;
-
-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.Role;
+import cn.com.qmth.stmms.common.enums.UserSource;
 import cn.com.qmth.stmms.common.utils.AccessControlUtils;
 
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.Date;
+
 @Entity
 @Table(name = "b_user")
 public class User implements Serializable {

+ 0 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/user/service/UserService.java

@@ -24,6 +24,4 @@ public interface UserService {
 
     User findByMarkerId(Integer markerId);
 
-    User findByLoginNameAndSchoolId(String loginName, Integer schoolId);
-
 }

+ 20 - 56
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/BaseExamController.java

@@ -1,20 +1,5 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.beanutils.BeanUtils;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.biz.common.BaseQuery;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
@@ -23,10 +8,20 @@ import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.common.controller.BaseController;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.LinkedList;
+import java.util.List;
 
 public class BaseExamController extends BaseController {
 
@@ -34,32 +29,25 @@ public class BaseExamController extends BaseController {
 
     protected static Logger log = LoggerFactory.getLogger(BaseExamController.class);
 
-    @Autowired
-    private MarkLibraryService libraryService;
-
     @Autowired
     private ExamSubjectService subjectService;
 
     @Autowired
     private ExamService examService;
 
-    @Autowired
-    private SubjectUserService subjectUserService;
-
     protected int getSessionExamId(HttpServletRequest request) {
         return SessionExamUtils.getExamId(request);
     }
 
     protected boolean isFinish(int examId) {
         Exam exam = examService.findById(examId);
-        return exam != null ? exam.getStatus() == ExamStatus.FINISH : false;
+        return exam != null && exam.getStatus() == ExamStatus.FINISH;
     }
 
     /**
      * 添加Flash消息
-     * 
-     * @param messages
-     *            消息
+     *
+     * @param messages 消息
      */
     protected void addMessage(RedirectAttributes redirectAttributes, String... messages) {
         StringBuilder sb = new StringBuilder();
@@ -69,34 +57,16 @@ public class BaseExamController extends BaseController {
         redirectAttributes.addFlashAttribute("message", sb.toString());
     }
 
+    protected List<Exam> getExam(WebUser wu) {
+        return examService.findBySchoolId(wu.getUser().getSchoolId());
+    }
+
     protected List<ExamSubject> getExamSubject(int examId, WebUser wu) {
         List<ExamSubject> list = new LinkedList<ExamSubject>();
         if (wu.isSchoolAdmin() || wu.isSchoolViewer()) {
             list = subjectService.list(examId);
         } else if (wu.isSubjectHeader()) {
-            List<SubjectUser> subjectUsers = subjectUserService.findByUserId(wu.getId());
-            for (SubjectUser subjectUser : subjectUsers) {
-                ExamSubject subject = subjectService.find(examId, subjectUser.getSubjectCode());
-                if (subject != null) {
-                    list.add(subject);
-                }
-            }
-        }
-        return list;
-    }
-
-    protected List<ExamSubject> getUploadExamSubject(int examId, WebUser wu) {
-        List<ExamSubject> list = new LinkedList<ExamSubject>();
-        if (wu.isSchoolAdmin()) {
-            list = subjectService.list(examId, 0);
-        } else if (wu.isSubjectHeader()) {
-            List<SubjectUser> subjectUsers = subjectUserService.findByUserId(wu.getId());
-            for (SubjectUser subjectUser : subjectUsers) {
-                ExamSubject subject = subjectService.find(examId, subjectUser.getSubjectCode());
-                if (subject != null) {
-                    list.add(subject);
-                }
-            }
+            list.addAll(subjectService.list(examId, wu.getSubjectCodeSet()));
         }
         return list;
     }
@@ -120,13 +90,7 @@ public class BaseExamController extends BaseController {
 
     protected boolean subjectCheck(String subjectCode, WebUser wu) {
         if (wu.isSubjectHeader()) {
-            List<SubjectUser> list = subjectUserService.findByUserId(wu.getId());
-            for (SubjectUser subjectUser : list) {
-                if (subjectUser.getSubjectCode().equals(subjectCode)) {
-                    return true;
-                }
-            }
-            return false;
+            return wu.getSubjectCodeSet().contains(subjectCode);
         } else {
             return true;
         }

+ 20 - 18
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ImageCheckController.java

@@ -1,26 +1,11 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.util.LinkedList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.core.task.AsyncTaskExecutor;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
 import cn.com.qmth.stmms.admin.dto.ExceptionStudentDTO;
 import cn.com.qmth.stmms.admin.thread.ImageCheckThread;
 import cn.com.qmth.stmms.admin.utils.UpyunConfig;
 import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.common.annotation.Logging;
@@ -30,6 +15,20 @@ import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 @Controller
 @RequestMapping("/admin/exam/check/image")
@@ -58,17 +57,20 @@ public class ImageCheckController extends BaseExamController {
     public ModelAndView list(HttpServletRequest request, ExamStudentSearchQuery query) {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
+        List<ExamSubject> subjectList = getExamSubject(examId, wu);
         ModelAndView view = new ModelAndView("modules/exam/checkImage");
         query.setExamId(examId);
         query.setUpload(true);
         query.setAbsent(false);
         query.setException(true);
         query.orderByExamNumber();
-        subjectFilter(query, wu);
+        if (query.getSubjectCode() == null && !subjectList.isEmpty()) {
+            query.setSubjectCode(subjectList.get(0).getCode());
+        }
         query = studentService.findByQuery(query);
 
         view.addObject("query", query);
-        view.addObject("subjectList", getExamSubject(examId, wu));
+        view.addObject("subjectList", subjectList);
         view.addObject("campusList", studentService.findDistinctCampusName(examId));
         view.addObject("running", running.get());
         return view;

+ 60 - 79
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java

@@ -1,18 +1,25 @@
 package cn.com.qmth.stmms.admin.exam;
 
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-
+import cn.com.qmth.stmms.admin.dto.ExamQuestionDTO;
+import cn.com.qmth.stmms.biz.campus.model.Campus;
+import cn.com.qmth.stmms.biz.campus.service.CampusService;
+import cn.com.qmth.stmms.biz.exam.model.*;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.*;
+import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 import net.sf.json.JsonConfig;
-
 import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -27,40 +34,9 @@ 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.dto.ExamQuestionDTO;
-import cn.com.qmth.stmms.biz.campus.model.Campus;
-import cn.com.qmth.stmms.biz.campus.service.CampusService;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
-import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
-import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.exam.service.MarkerService;
-import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.biz.mark.service.MarkService;
-import cn.com.qmth.stmms.common.annotation.Logging;
-import cn.com.qmth.stmms.common.annotation.RoleRequire;
-import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.ExamType;
-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.enums.Role;
-import cn.com.qmth.stmms.common.enums.ScorePolicy;
-import cn.com.qmth.stmms.common.enums.ThirdPolicy;
-import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
+import javax.servlet.http.HttpServletRequest;
+import java.text.DecimalFormat;
+import java.util.*;
 
 @Controller("markGroupController")
 @RequestMapping("/admin/exam/group")
@@ -115,12 +91,12 @@ public class MarkGroupController extends BaseExamController {
         }
         List<MarkGroup> list = groupService.findByExamAndSubject(examId, subjectCode);
         for (MarkGroup group : list) {
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
-                    false, group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, group.getNumber()));
             group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, subjectCode, group.getNumber()));
             group.setCurrentCount(markService.applyCount(group));
-            int percent = group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group
-                    .getLibraryCount()) : 0;
+            int percent =
+                    group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount()) : 0;
             group.setPercent(percent);
         }
         model.addAttribute("resultList", list);
@@ -137,13 +113,14 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) Boolean withDouble, @RequestParam(required = false) MarkStatus status) {
         int examId = getSessionExamId(request);
         JSONArray array = new JSONArray();
-        List<MarkGroup> list = withDouble != null && withDouble ? groupService.findByExamAndSubjectWithDouble(examId,
-                subjectCode) : (status != null ? groupService
-                .findByExamAndSubjectAndStatus(examId, subjectCode, status) : groupService.findByExamAndSubject(examId,
-                subjectCode));
+        List<MarkGroup> list = withDouble != null && withDouble ?
+                groupService.findByExamAndSubjectWithDouble(examId, subjectCode) :
+                (status != null ?
+                        groupService.findByExamAndSubjectAndStatus(examId, subjectCode, status) :
+                        groupService.findByExamAndSubject(examId, subjectCode));
         for (MarkGroup group : list) {
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
-                    false, group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, group.getNumber()));
             JSONObject obj = new JSONObject();
             obj.accumulate("number", group.getNumber());
             obj.accumulate("title", group.getTitle());
@@ -280,13 +257,12 @@ public class MarkGroupController extends BaseExamController {
         if (group != null) {
             String pictureConfig = buildPictureConfig(group);
             group.setPicList(pictureConfig);
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
-                    false, group.getNumber()));
+            group.setQuestionList(questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, group.getNumber()));
             model.addAttribute("group", group);
-            model.addAttribute(
-                    "questions",
-                    questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(),
-                            group.getSubjectCode(), false, group.getNumber()));
+            model.addAttribute("questions", questionService
+                    .findByExamAndSubjectAndObjectiveAndGroupNumber(group.getExamId(), group.getSubjectCode(), false,
+                            group.getNumber()));
             model.addAttribute("pictureConfig", pictureConfig);
             model.addAttribute("markModeList", MarkMode.values());
             model.addAttribute("scorePolicyList", ScorePolicy.values());
@@ -309,13 +285,14 @@ public class MarkGroupController extends BaseExamController {
         if (group != null) {
             String pictureConfig = buildPictureConfig(group);
             group.setPicList(pictureConfig);
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode,
-                    false, number));
+            group.setQuestionList(
+                    questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number));
             List<MarkGroup> questionList = new ArrayList<MarkGroup>();
             String[] mainNumbers = group.getMainNumber().split(",");
             for (String mainNumber : mainNumbers) {
-                List<ExamQuestion> list = questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId,
-                        subjectCode, false, Integer.parseInt(mainNumber));
+                List<ExamQuestion> list = questionService
+                        .findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false,
+                                Integer.parseInt(mainNumber));
                 StringBuilder score = new StringBuilder();
                 DecimalFormat format = new DecimalFormat("####.###");
                 String title = "";
@@ -385,7 +362,8 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Integer thirdPolicy, @RequestParam(required = false) Integer scorePolicy,
             @RequestParam(required = false) MarkMode markMode, @RequestParam(required = false) Integer trialCount,
-            @RequestParam(required = false) boolean sheetView, @RequestParam(required = false) String questionDetail,
+            @RequestParam boolean sheetView, @RequestParam boolean enableAllZero,
+            @RequestParam(required = false) String questionDetail,
             @RequestParam(required = false) String intervalScoreList) {
         int examId = getSessionExamId(request);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
@@ -396,10 +374,10 @@ public class MarkGroupController extends BaseExamController {
                     questionDetail = StringEscapeUtils.unescapeHtml(questionDetail);
                     JSONArray array = JSONArray.fromObject(questionDetail);
                     List<ExamQuestionDTO> detailList = JSONArray.toList(array, new ExamQuestionDTO(), new JsonConfig());
-                    List<ExamQuestion> all = questionService.findByExamAndSubjectAndObjective(examId, subjectCode,
-                            false);
-                    List<ExamQuestion> old = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                            subjectCode, false, number);
+                    List<ExamQuestion> all = questionService
+                            .findByExamAndSubjectAndObjective(examId, subjectCode, false);
+                    List<ExamQuestion> old = questionService
+                            .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
                     Set<Integer> mainNumbers = new HashSet<Integer>();
                     for (ExamQuestion examQuestion : all) {
                         mainNumbers.add(examQuestion.getMainNumber());
@@ -424,8 +402,8 @@ public class MarkGroupController extends BaseExamController {
                     }
                     if (detailList != null && detailList.size() > 0) {
                         ScorePolicy policy = scorePolicy != null ? ScorePolicy.findByValue(scorePolicy) : null;
-                        ThirdPolicy third = thirdPolicy != null ? ThirdPolicy.findByValue(thirdPolicy)
-                                : ThirdPolicy.DISABLE;
+                        ThirdPolicy third =
+                                thirdPolicy != null ? ThirdPolicy.findByValue(thirdPolicy) : ThirdPolicy.DISABLE;
                         try {
                             lockService.waitlock(LockType.GROUP, true, group.getExamId(), group.getSubjectCode(),
                                     group.getNumber());
@@ -441,8 +419,8 @@ public class MarkGroupController extends BaseExamController {
                 } else {
                     // simple update
                     List<Double> intervalScores = buildDoubleList(intervalScoreList);
-                    List<ExamQuestion> questionList = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
-                            examId, subjectCode, false, number);
+                    List<ExamQuestion> questionList = questionService
+                            .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
                     if (intervalScores.size() == questionList.size()) {
                         for (int i = 0; i < questionList.size(); i++) {
                             ExamQuestion q = questionList.get(i);
@@ -469,6 +447,7 @@ public class MarkGroupController extends BaseExamController {
                     groupService.updateTrialCount(examId, subjectCode, number, trialCount);
                 }
                 groupService.updateSheetView(examId, subjectCode, number, sheetView);
+                groupService.updateEnableAllZero(examId, subjectCode, number, enableAllZero);
                 redirectAttributes.addAttribute("subjectCode", subjectCode);
                 redirectAttributes.addAttribute("number", number);
                 return "redirect:/admin/exam/group";
@@ -499,7 +478,7 @@ public class MarkGroupController extends BaseExamController {
             @RequestParam(required = false) Double arbitrateThreshold,
             @RequestParam(required = false) Integer thirdPolicy, @RequestParam(required = false) Integer scorePolicy,
             @RequestParam(required = false) String markMode, @RequestParam(required = false) Integer trialCount,
-            @RequestParam(required = false) boolean sheetView) {
+            @RequestParam boolean sheetView, @RequestParam boolean enableAllZero) {
         int examId = getSessionExamId(request);
         Exam exam = examService.findById(examId);
         MarkGroup group = groupService.findOne(examId, subjectCode, number);
@@ -548,15 +527,16 @@ public class MarkGroupController extends BaseExamController {
                         }
                     }
                     group = new MarkGroup(examId, subjectCode, number, picConfigList, 0d, doubleRate,
-                            arbitrateThreshold, scorePolicy, markMode, trialCount, sheetView, thirdPolicy);
+                            arbitrateThreshold, scorePolicy, markMode, trialCount, sheetView, enableAllZero,
+                            thirdPolicy);
                     // clear and replace exam_question
                     questionService
                             .deleteByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, false, number);
                     List<ExamQuestion> list = buildQuestionList(group, detailList);
                     questionService.save(list);
                     groupService.save(group);
-                    subjectService.updateScore(examId, subjectCode, false,
-                            groupService.sumTotalScore(examId, subjectCode));
+                    subjectService
+                            .updateScore(examId, subjectCode, false, groupService.sumTotalScore(examId, subjectCode));
                     redirectAttributes.addAttribute("subjectCode", subjectCode);
                     return "redirect:/admin/exam/group";
                 } else {
@@ -614,8 +594,9 @@ public class MarkGroupController extends BaseExamController {
 
     private List<String> buildPicUrl(ExamStudent examStudent) {
         Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
-        List<String> picUrls = PictureUrlBuilder.getSliceUrls(examStudent.getExamId(), campus.getId(),
-                examStudent.getSubjectCode(), examStudent.getExamNumber(), examStudent.getSliceCount());
+        List<String> picUrls = PictureUrlBuilder
+                .getSliceUrls(examStudent.getExamId(), campus.getId(), examStudent.getSubjectCode(),
+                        examStudent.getExamNumber(), examStudent.getSliceCount());
         return picUrls;
     }
 

+ 28 - 44
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java

@@ -1,44 +1,11 @@
 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.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.exam.service.*;
 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;
@@ -56,8 +23,22 @@ 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.*;
 
 @Controller("examMarkerController")
 @RequestMapping("/admin/exam/marker")
@@ -109,15 +90,17 @@ public class MarkerController extends BaseExamController {
         query.orderById();
         subjectFilter(query, wu);
         if (StringUtils.isNotBlank(query.getLoginName())) {
-            User user = userService.findByLoginNameAndSchoolId(query.getLoginName(), wu.getUser().getSchoolId());
-            query.setUserId(user == null ? null : user.getId());
+            User user = userService.findByLoginName(query.getLoginName());
+            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));
@@ -220,8 +203,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);
@@ -461,7 +444,8 @@ 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) {
         int examId = getSessionExamId(request);
         if (examId > 0) {
             Exam exam = examService.findById(examId);
@@ -536,8 +520,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";

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

@@ -1,19 +1,19 @@
 package cn.com.qmth.stmms.admin.interceptor;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import cn.com.qmth.stmms.common.session.model.StmmsSession;
-import cn.com.qmth.stmms.common.utils.AccessControlUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-
+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;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.Role;
 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;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 
 /**
  * Admin模块操作拦截器
@@ -25,16 +25,19 @@ public class AdminInterceptor extends SessionInterceptor {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    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)) {
+        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;
         }
         return sessionExpire(request, response, "/login");
@@ -46,10 +49,13 @@ 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()));
+                }
                 RequestUtils.setWebUser(request, wu);
                 return wu;
             }

+ 54 - 54
stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java

@@ -1,19 +1,6 @@
 package cn.com.qmth.stmms.admin.user;
 
-import java.util.Date;
-
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
+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;
 import cn.com.qmth.stmms.biz.user.service.query.UserSearchQuery;
@@ -22,20 +9,37 @@ import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.controller.BaseController;
 import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.UserSource;
 import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
 
 @Controller
 @RequestMapping("/admin/user")
 public class UserController extends BaseController {
 
-    public static Role[] QUERY_ROLE_LIST = { Role.SCANNER, Role.SUBJECT_HEADER, Role.MARKER };
+    public static final String SUBJECT_CODE_SPLIT = ",";
 
-    public static Role[] ADD_ROLE_LIST = { Role.SCANNER, Role.MARKER };
+    public static Role[] ROLE_LIST = { Role.SCANNER, Role.SUBJECT_HEADER, Role.MARKER };
 
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private SubjectUserService subjectUserService;
+
     @Logging(menu = "查询用户", type = LogType.QUERY)
     @RequestMapping("/list")
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -45,32 +49,12 @@ public class UserController extends BaseController {
         query = userService.findByQuery(query);
 
         ModelAndView view = new ModelAndView("modules/user/userList");
-        view.addObject("roleList", QUERY_ROLE_LIST);
+        view.addObject("roleList", ROLE_LIST);
         view.addObject("sourceList", UserSource.values());
         view.addObject("query", query);
         return view;
     }
 
-    //    @Logging(menu = "删除用户", type = LogType.DELETE)
-    //    @RequestMapping("/delete")
-    //    @RoleRequire(Role.SCHOOL_ADMIN)
-    //    public String delete(HttpServletRequest request, RedirectAttributes redirectAttributes, @RequestParam Integer id) {
-    //        User current = RequestUtils.getWebUser(request).getUser();
-    //        User user = userService.findById(id);
-    //        String message = null;
-    //        if (user == null) {
-    //            message = "找不到指定用户";
-    //        } else if (!user.getSchoolId().equals(current.getSchoolId()) || user.getId().equals(current.getId())) {
-    //            message = "不能删除指定用户";
-    //        } else {
-    //            userService.delete(user);
-    //            message = "删除成功";
-    //        }
-    //        redirectAttributes.addFlashAttribute("message", message);
-    //        RequestUtils.setLog(request, message + "id:" + id);
-    //        return "redirect:/admin/user/list";
-    //    }
-
     @RequestMapping(value = "/add", method = RequestMethod.GET)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public ModelAndView addInit(HttpServletRequest request) {
@@ -78,7 +62,7 @@ public class UserController extends BaseController {
         User user = new User();
         user.setEnable(true);
         view.addObject("user", user);
-        view.addObject("roleList", ADD_ROLE_LIST);
+        view.addObject("roleList", ROLE_LIST);
         return view;
     }
 
@@ -90,7 +74,10 @@ public class UserController extends BaseController {
         if (user != null && user.getSchoolId().equals(current.getSchoolId())) {
             ModelAndView view = new ModelAndView("modules/user/userEdit");
             view.addObject("user", user);
-            //view.addObject("roleList", QUERY_ROLE_LIST);
+            if (user.getRole() == Role.SUBJECT_HEADER) {
+                view.addObject("subjectCodeString",
+                        StringUtils.join(subjectUserService.findSubjectCode(user.getId()), SUBJECT_CODE_SPLIT));
+            }
             return view;
         } else {
             return new ModelAndView("redirect:/admin/user/list");
@@ -100,14 +87,15 @@ public class UserController extends BaseController {
     @Logging(menu = "新增(修改)用户", type = LogType.UPDATE)
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
-    public String save(HttpServletRequest request, Model model, User user) {
+    public String save(HttpServletRequest request, Model model, User user,
+            @RequestParam(required = false) String subjectCodeString) {
         User current = RequestUtils.getWebUser(request).getUser();
         User previous = null;
         if (user.getId() != null) {
             previous = userService.findById(user.getId());
         }
         if (previous == null) {
-            String message = validate(user);
+            String message = validate(user, subjectCodeString);
             if (message == null) {
                 user.setPassword(Md5EncryptUtils.md5(user.getPassword()));
                 user.setSchoolId(current.getSchoolId());
@@ -117,30 +105,27 @@ public class UserController extends BaseController {
                 userService.save(user);
             } else {
                 model.addAttribute("user", user);
-                model.addAttribute("roleList", QUERY_ROLE_LIST);
+                model.addAttribute("roleList", ROLE_LIST);
                 model.addAttribute("message", message);
                 return "modules/user/userEdit";
             }
         } else if (previous.getSchoolId().equals(current.getSchoolId())) {
             previous.setLoginName(user.getLoginName());
             previous.setName(user.getName());
-            //previous.setRole(user.getRole());
             if (StringUtils.isNotBlank(user.getPassword())) {
                 previous.setPassword(Md5EncryptUtils.md5(user.getPassword()));
             }
-            //if (previous.getRole() != Role.SUBJECT_HEADER) {
-            //    previous.setSubjectCode(null);
-            //} else {
-            //    previous.setSubjectCode(user.getSubjectCode());
-            //}
             previous.setEnable(user.isEnable());
-            String message = validate(previous);
+            String message = validate(previous, subjectCodeString);
             if (message == null) {
+                if (previous.getRole() == Role.SUBJECT_HEADER) {
+                    subjectUserService.updateByUserId(previous.getId(), getSubjectCodeSet(subjectCodeString));
+                }
                 previous.setUpdatedTime(new Date());
                 userService.save(previous);
             } else {
                 model.addAttribute("user", previous);
-                model.addAttribute("roleList", QUERY_ROLE_LIST);
+                model.addAttribute("roleList", ROLE_LIST);
                 model.addAttribute("message", message);
                 return "modules/user/userEdit";
             }
@@ -148,7 +133,7 @@ public class UserController extends BaseController {
         return "redirect:/admin/user/list";
     }
 
-    private String validate(User user) {
+    private String validate(User user, String subjectCodeString) {
         String message = null;
         if (StringUtils.isBlank(user.getLoginName())) {
             message = "登录名不能为空";
@@ -158,10 +143,25 @@ public class UserController extends BaseController {
             message = "名称不能为空";
         } else if (StringUtils.isBlank(user.getPassword())) {
             message = "密码不能为空";
+        } else if (user.getRole() == Role.SUBJECT_HEADER && StringUtils.isBlank(subjectCodeString)) {
+            message = "科组长必须绑定科目代码";
         }
-        //else if (user.getRole() == Role.SUBJECT_HEADER && StringUtils.isBlank(user.getSubjectCode())) {
-        //    message = "科组长必须绑定科目代码";
-        //}
         return message;
     }
+
+    private Set<String> getSubjectCodeSet(String subjectCodeString) {
+        Set<String> set = new HashSet<>();
+        try {
+            String[] values = StringUtils.split(subjectCodeString, SUBJECT_CODE_SPLIT);
+            for (String value : values) {
+                value = StringUtils.trimToNull(value);
+                if (value != null) {
+                    set.add(value.toUpperCase());
+                }
+            }
+        } catch (Exception e) {
+
+        }
+        return set;
+    }
 }

+ 14 - 17
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CoreController.java

@@ -1,13 +1,16 @@
 package cn.com.qmth.stmms.api.controller;
 
-import java.text.DecimalFormat;
-import java.util.Date;
-
-import javax.servlet.http.HttpServletRequest;
-
+import cn.com.qmth.stmms.api.exception.ApiException;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.utils.DateUtils;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
-
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -16,15 +19,9 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import cn.com.qmth.stmms.api.exception.ApiException;
-import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
-import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
-import cn.com.qmth.stmms.common.domain.ApiUser;
-import cn.com.qmth.stmms.common.utils.DateUtils;
-import cn.com.qmth.stmms.common.utils.RequestUtils;
+import javax.servlet.http.HttpServletRequest;
+import java.text.DecimalFormat;
+import java.util.Date;
 
 @Controller("coreApiController")
 @RequestMapping("/api/core")
@@ -56,7 +53,7 @@ public class CoreController extends BaseApiController {
         if (id != null) {
             exam = examService.findById(id);
         } else if (code != null) {
-            exam = examService.findByCode(user.getSchoolId(), code);
+            exam = examService.findBySchoolAndCode(user.getSchoolId(), code);
         }
         if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
             exam.setName(name);
@@ -157,7 +154,7 @@ public class CoreController extends BaseApiController {
         Exam exam = examService.findById(examId);
         if (exam == null) {
             ApiUser user = RequestUtils.getApiUser(request);
-            exam = examService.findByCode(user.getSchoolId(), examCode);
+            exam = examService.findBySchoolAndCode(user.getSchoolId(), examCode);
         }
         if (exam == null) {
             throw ApiException.EXAM_NOT_ACCESSIBLED;

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

@@ -5,6 +5,9 @@ import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.enums.Role;
 import org.apache.commons.lang.StringUtils;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * web端访问用户抽象描述类
  *
@@ -28,6 +31,8 @@ public class WebUser {
 
     private Marker marker;
 
+    private Set<String> subjectCodeSet;
+
     private WebUser(Integer id, String name, Role role, String token, Object userData, String logoutUrl,
             String markerId) {
         this.id = id;
@@ -39,6 +44,7 @@ public class WebUser {
         if (role.equals(Role.MARKER) && StringUtils.trimToNull(markerId) != null) {
             this.markerId = Integer.valueOf(markerId);
         }
+        this.subjectCodeSet = new HashSet<>();
     }
 
     public WebUser(User user, String logoutUrl, String markerId) {
@@ -97,4 +103,11 @@ public class WebUser {
         this.marker = marker;
     }
 
+    public Set<String> getSubjectCodeSet() {
+        return subjectCodeSet;
+    }
+
+    public void setSubjectCodeSet(Set<String> subjectCodeSet) {
+        this.subjectCodeSet = subjectCodeSet;
+    }
 }

+ 18 - 9
stmms-web/src/main/webapp/WEB-INF/views/modules/user/userEdit.jsp

@@ -61,6 +61,15 @@
             <form:password path="password" htmlEscape="false" maxlength="20"/>
         </div>
     </div>
+    <div class="control-group">
+        <label class="control-label">状态</label>
+        <div class="controls">
+            <select name="enable" id="enable-select">
+                <option value="true" <c:if test="${user.enable==true}">selected</c:if>>启用</option>
+                <option value="false" <c:if test="${user.enable==false}">selected</c:if>>禁用</option>
+            </select>
+        </div>
+    </div>
     <div class="control-group">
         <label class="control-label">角色</label>
         <div class="controls">
@@ -72,20 +81,20 @@
                     </c:forEach>
                 </c:if>
                 <c:if test="user.role!=null && roleList==null">
-                    <option value="${user.role.value}">${user.role.name}</option>
+                    <option value="${user.role.value}" selected>${user.role.name}</option>
                 </c:if>
             </select>
         </div>
     </div>
-    <div class="control-group">
-        <label class="control-label">状态</label>
-        <div class="controls">
-            <select name="enable" id="enable-select">
-                <option value="true" <c:if test="${user.enable==true}">selected</c:if>>启用</option>
-                <option value="false" <c:if test="${user.enable==false}">selected</c:if>>禁用</option>
-            </select>
+    <c:if test="user.role==null || user.role.value==4">
+        <div class="control-group" id="subject-code-div">
+            <label class="control-label">绑定科目代码</label>
+            <div class="controls">
+            <textarea name="subjectCodeString" rows="4" maxlength="200" class="input-xxlarge"
+                      value="${subjectCodeString}"/>
+            </div>
         </div>
-    </div>
+    </c:if>
     <div class="form-actions">
         <input id="btnSubmit" class="btn btn-primary" type="submit" value="保 存"/>
         &nbsp;