소스 검색

新增打回次数;按角色导出用户;复核进度;登录强制改密码;

ting.yin 3 년 전
부모
커밋
7982c3121a
28개의 변경된 파일808개의 추가작업 그리고 26개의 파일을 삭제
  1. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  2. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkerDao.java
  3. 11 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Marker.java
  4. 10 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/MarkerSearchQuery.java
  5. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java
  6. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkerService.java
  7. 5 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  8. 30 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkerServiceImpl.java
  9. 9 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java
  10. 76 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkerDTO.java
  11. 54 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectUserDTO.java
  12. 66 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  13. 53 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/home/AdminController.java
  14. 2 1
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/interceptor/AdminInterceptor.java
  15. 99 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java
  16. 67 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/InspectedSubjectVO.java
  17. 9 0
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/LoginController.java
  18. 3 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examIndex.jsp
  19. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examSelect.jsp
  20. 155 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/inspectedInfo.jsp
  21. 7 3
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/inspectedList.jsp
  22. 3 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/markerList.jsp
  23. 4 4
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityList.jsp
  24. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/reset.jsp
  25. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/mark/subjectSelect.jsp
  26. 1 1
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/login.jsp
  27. 103 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/sys/reset.jsp
  28. 25 4
      stmms-web/src/main/webapp/WEB-INF/views/modules/user/userList.jsp

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.biz.exam.dao;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
+import java.util.Set;
 
 
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
@@ -204,4 +205,7 @@ public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent,
     @Query("select sum(s.sheetCount) from ExamStudent s where s.examId=?1 and s.subjectCode=?2 ")
     @Query("select sum(s.sheetCount) from ExamStudent s where s.examId=?1 and s.subjectCode=?2 ")
     public long sumSheetCountByExamIdAndSubjectCode(int examId, String subjectCode);
     public long sumSheetCountByExamIdAndSubjectCode(int examId, String subjectCode);
 
 
+    @Query("select distinct m.subjectCode from ExamStudent m where m.examId=?1 and m.subjectiveStatus in (?2) ")
+    Set<String> findSubjectUnInspectedByExamId(int examId, SubjectiveStatus... status);
+
 }
 }

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkerDao.java

@@ -67,4 +67,8 @@ public interface MarkerDao extends PagingAndSortingRepository<Marker, Integer>,
     public List<Marker> findByExamIdAndSubjectCodeAndUserIdAndEnable(Integer examId, String subjectCode,
     public List<Marker> findByExamIdAndSubjectCodeAndUserIdAndEnable(Integer examId, String subjectCode,
             Integer userId, boolean enable);
             Integer userId, boolean enable);
 
 
+    @Modifying
+    @Query(value = "update eb_marker m set m.reject_count=?2 where m.id=?1", nativeQuery = true)
+    public void updateRejectCountById(Integer markerId, Integer rejectCount);
+
 }
 }

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

@@ -47,6 +47,9 @@ public class Marker implements Serializable {
     @Column(name = "valid_count")
     @Column(name = "valid_count")
     private Integer validCount;
     private Integer validCount;
 
 
+    @Column(name = "reject_count")
+    private Integer rejectCount;
+
     @Column(name = "avg_speed")
     @Column(name = "avg_speed")
     private Double avgSpeed;
     private Double avgSpeed;
 
 
@@ -292,4 +295,12 @@ public class Marker implements Serializable {
         this.classCount = classCount;
         this.classCount = classCount;
     }
     }
 
 
+    public Integer getRejectCount() {
+        return rejectCount;
+    }
+
+    public void setRejectCount(Integer rejectCount) {
+        this.rejectCount = rejectCount;
+    }
+
 }
 }

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/MarkerSearchQuery.java

@@ -18,6 +18,8 @@ public class MarkerSearchQuery extends BaseQuery<Marker> {
 
 
     private String loginName;
     private String loginName;
 
 
+    private String name;
+
     public void orderById() {
     public void orderById() {
         setSort(new Sort(Direction.ASC, "id"));
         setSort(new Sort(Direction.ASC, "id"));
     }
     }
@@ -62,4 +64,12 @@ public class MarkerSearchQuery extends BaseQuery<Marker> {
         this.loginName = loginName;
         this.loginName = loginName;
     }
     }
 
 
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
 }
 }

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

@@ -11,6 +11,7 @@ import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.Set;
 
 
 public interface ExamStudentService {
 public interface ExamStudentService {
 
 
@@ -152,4 +153,6 @@ public interface ExamStudentService {
     public long countSheetCountByExamId(Integer examId);
     public long countSheetCountByExamId(Integer examId);
 
 
     public long countSheetCountByExamIdAndSubjectCode(int examId, String code);
     public long countSheetCountByExamIdAndSubjectCode(int examId, String code);
+
+    public Set<String> findSubjectUnInspectedByExamId(int examId);
 }
 }

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

@@ -42,4 +42,6 @@ public interface MarkerService {
 
 
     void logoutByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer number);
     void logoutByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer number);
 
 
+    void updateRejectCountById(Integer markerId);
+
 }
 }

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

@@ -1104,4 +1104,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     public long countSheetCountByExamIdAndSubjectCode(int examId, String code) {
     public long countSheetCountByExamIdAndSubjectCode(int examId, String code) {
         return studentDao.sumSheetCountByExamIdAndSubjectCode(examId, code);
         return studentDao.sumSheetCountByExamIdAndSubjectCode(examId, code);
     }
     }
+
+    @Override
+    public Set<String> findSubjectUnInspectedByExamId(int examId) {
+        return studentDao.findSubjectUnInspectedByExamId(examId, SubjectiveStatus.MARKED);
+    }
 }
 }

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

@@ -19,14 +19,18 @@ import org.springframework.transaction.annotation.Transactional;
 
 
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
 import cn.com.qmth.stmms.biz.exam.dao.MarkerDao;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 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.model.Marker;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
 import cn.com.qmth.stmms.biz.mark.dao.MarkLibraryDao;
 import cn.com.qmth.stmms.biz.user.dao.UserDao;
 import cn.com.qmth.stmms.biz.user.dao.UserDao;
 import cn.com.qmth.stmms.biz.user.model.User;
 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;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 
 
@@ -45,6 +49,12 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
     @Autowired
     @Autowired
     private UserDao userDao;
     private UserDao userDao;
 
 
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private ExamService examService;
+
     @Transactional
     @Transactional
     @Override
     @Override
     public Marker save(Marker marker) {
     public Marker save(Marker marker) {
@@ -132,8 +142,15 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
                 if (query.getGroupNumber() != null) {
                 if (query.getGroupNumber() != null) {
                     predicates.add(cb.equal(root.get("groupNumber"), query.getGroupNumber()));
                     predicates.add(cb.equal(root.get("groupNumber"), query.getGroupNumber()));
                 }
                 }
-                if (StringUtils.isNotBlank(query.getLoginName())) {
-                    List<User> users = userDao.findStartWithLoginName(query.getLoginName());
+                if (StringUtils.isNotBlank(query.getLoginName()) || StringUtils.isNotBlank(query.getName())) {
+                    UserSearchQuery uQuery = new UserSearchQuery();
+                    uQuery.setLoginName(query.getLoginName());
+                    uQuery.setName(query.getName());
+                    if (query.getExamId() != null) {
+                        Exam exam = examService.findById(query.getExamId());
+                        uQuery.setSchoolId(exam.getSchoolId());
+                    }
+                    List<User> users = userService.findByQuery(uQuery).getResult();
                     if (!users.isEmpty()) {
                     if (!users.isEmpty()) {
                         List<Integer> list = new ArrayList<Integer>();
                         List<Integer> list = new ArrayList<Integer>();
                         for (User user : users) {
                         for (User user : users) {
@@ -218,4 +235,15 @@ public class MarkerServiceImpl extends BaseQueryService<Marker> implements Marke
             userDao.save(list);
             userDao.save(list);
         }
         }
     }
     }
+
+    @Override
+    public void updateRejectCountById(Integer markerId) {
+        Marker marker = markerDao.findOne(markerId);
+        int rejectCount = 1;
+        if (marker.getRejectCount() != null) {
+            rejectCount = marker.getRejectCount() + 1;
+        }
+        markerDao.updateRejectCountById(markerId, rejectCount);
+
+    }
 }
 }

+ 9 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java

@@ -87,6 +87,9 @@ public class MarkServiceImpl implements MarkService {
     @Autowired
     @Autowired
     private ExamService examService;
     private ExamService examService;
 
 
+    @Autowired
+    private MarkerService markerService;
+
     @Autowired
     @Autowired
     private SelectiveGroupService selectiveGroupService;
     private SelectiveGroupService selectiveGroupService;
 
 
@@ -772,6 +775,9 @@ public class MarkServiceImpl implements MarkService {
         if (libraryDao.resetById(library.getId(), null, reason,
         if (libraryDao.resetById(library.getId(), null, reason,
                 isRest ? LibraryStatus.WAITING : LibraryStatus.REJECTED, LibraryStatus.MARKED, LibraryStatus.PROBLEM,
                 isRest ? LibraryStatus.WAITING : LibraryStatus.REJECTED, LibraryStatus.MARKED, LibraryStatus.PROBLEM,
                 LibraryStatus.INSPECTED) > 0) {
                 LibraryStatus.INSPECTED) > 0) {
+            if (!isRest) {
+                markerService.updateRejectCountById(library.getMarkerId());
+            }
             trackDao.deleteByLibraryId(library.getId());
             trackDao.deleteByLibraryId(library.getId());
             specialTagDao.deleteByLibraryId(library.getId());
             specialTagDao.deleteByLibraryId(library.getId());
             resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
             resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
@@ -1507,6 +1513,7 @@ public class MarkServiceImpl implements MarkService {
                 }
                 }
                 if (library.getStatus().equals(LibraryStatus.ARBITRATED) || qList.size() == questions.size()) {
                 if (library.getStatus().equals(LibraryStatus.ARBITRATED) || qList.size() == questions.size()) {
                     // 仲裁任务直接重置 或者该分组下所有分数被打回也重置
                     // 仲裁任务直接重置 或者该分组下所有分数被打回也重置
+                    markerService.updateRejectCountById(library.getMarkerId());
                     libraryDao.resetById(library.getId(), null, reason, LibraryStatus.REJECTED, LibraryStatus.MARKED,
                     libraryDao.resetById(library.getId(), null, reason, LibraryStatus.REJECTED, LibraryStatus.MARKED,
                             LibraryStatus.PROBLEM, LibraryStatus.INSPECTED, LibraryStatus.ARBITRATED);
                             LibraryStatus.PROBLEM, LibraryStatus.INSPECTED, LibraryStatus.ARBITRATED);
                     trackDao.deleteByLibraryId(library.getId());
                     trackDao.deleteByLibraryId(library.getId());
@@ -1545,6 +1552,7 @@ public class MarkServiceImpl implements MarkService {
                     if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.REJECTED, library.getMarkerId(),
                     if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.REJECTED, library.getMarkerId(),
                             null, markerScoreList.toString(), null, null, reason, LibraryStatus.MARKED,
                             null, markerScoreList.toString(), null, null, reason, LibraryStatus.MARKED,
                             LibraryStatus.INSPECTED) == 1) {
                             LibraryStatus.INSPECTED) == 1) {
+                        markerService.updateRejectCountById(library.getMarkerId());
                         count++;
                         count++;
                     }
                     }
                 }
                 }
@@ -1640,6 +1648,7 @@ public class MarkServiceImpl implements MarkService {
         }
         }
         if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.REJECTED, library.getMarkerId(), null,
         if (libraryDao.updateMarkerResult(library.getId(), LibraryStatus.REJECTED, library.getMarkerId(), null,
                 markerScoreList.toString(), null, null, reason, LibraryStatus.MARKED, LibraryStatus.INSPECTED) == 1) {
                 markerScoreList.toString(), null, null, reason, LibraryStatus.MARKED, LibraryStatus.INSPECTED) == 1) {
+            markerService.updateRejectCountById(library.getMarkerId());
             resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
             resetStudentGroup(library.getStudentId(), library.getExamId(), library.getSubjectCode(),
                     library.getGroupNumber());
                     library.getGroupNumber());
             problemHistoryDao.resetByLibraryId(library.getId(), HistoryStatus.WAITING, userId, HistoryStatus.BACK,
             problemHistoryDao.resetByLibraryId(library.getId(), HistoryStatus.WAITING, userId, HistoryStatus.BACK,

+ 76 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkerDTO.java

@@ -0,0 +1,76 @@
+package cn.com.qmth.stmms.admin.dto;
+
+import cn.com.qmth.stmms.common.annotation.ExcelField;
+
+public class MarkerDTO {
+
+    @ExcelField(title = "课程代码", align = 2, sort = 10)
+    private String subjectCode;
+
+    @ExcelField(title = "课程名称", align = 2, sort = 20)
+    private String subjectName;
+
+    @ExcelField(title = "评卷分组", align = 2, sort = 30)
+    private int groupNumber;
+
+    @ExcelField(title = "分组题目", align = 2, sort = 40)
+    private String groupName;
+
+    @ExcelField(title = "角色", align = 2, sort = 50)
+    private String role;
+
+    @ExcelField(title = "账号", align = 2, sort = 60)
+    private String loginName;
+
+    public MarkerDTO() {
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public int getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(int groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+}

+ 54 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectUserDTO.java

@@ -0,0 +1,54 @@
+package cn.com.qmth.stmms.admin.dto;
+
+import cn.com.qmth.stmms.common.annotation.ExcelField;
+
+public class SubjectUserDTO {
+
+    @ExcelField(title = "课程代码", align = 2, sort = 10)
+    private String subjectCode;
+
+    @ExcelField(title = "课程名称", align = 2, sort = 20)
+    private String subjectName;
+
+    @ExcelField(title = "角色", align = 2, sort = 50)
+    private String role;
+
+    @ExcelField(title = "账号", align = 2, sort = 60)
+    private String loginName;
+
+    public SubjectUserDTO() {
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getRole() {
+        return role;
+    }
+
+    public void setRole(String role) {
+        this.role = role;
+    }
+
+}

+ 66 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -1,8 +1,11 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
+import java.text.DecimalFormat;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.List;
+import java.util.Set;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 
 
@@ -23,6 +26,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 
 import cn.com.qmth.stmms.admin.dto.RejectResult;
 import cn.com.qmth.stmms.admin.dto.RejectResult;
+import cn.com.qmth.stmms.admin.vo.InspectedSubjectVO;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 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.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
@@ -32,6 +36,7 @@ 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.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.InspectedService;
 import cn.com.qmth.stmms.biz.exam.service.InspectedService;
+import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.Task;
@@ -86,7 +91,7 @@ public class InspectedController extends BaseExamController {
 
 
     public static final String UN_SELECTIVE_SCORE = "-1";
     public static final String UN_SELECTIVE_SCORE = "-1";
 
 
-    @RequestMapping
+    @RequestMapping(value = "/list")
     public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query,
     public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query,
             @RequestParam(required = false) SubjectiveStatus status,
             @RequestParam(required = false) SubjectiveStatus status,
             @RequestParam(required = false) SelectiveStatus selectiveStatus,
             @RequestParam(required = false) SelectiveStatus selectiveStatus,
@@ -435,6 +440,65 @@ public class InspectedController extends BaseExamController {
                 }
                 }
             }
             }
         }
         }
-        return "redirect:/admin/exam/inspected";
+        return "redirect:/admin/exam/inspected/list";
+    }
+
+    @Logging(menu = "评卷管理查询", type = LogType.QUERY)
+    @RequestMapping(value = "/info")
+    public String info(HttpServletRequest request, Model model, ExamSubjectSearchQuery query) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        int examId = getSessionExamId(request);
+        query.setExamId(examId);
+        Set<String> unFinishSet = studentService.findSubjectUnInspectedByExamId(examId);
+        if (query.getFinished() != null) {
+            String subjectCodeIn = StringUtils.join(unFinishSet, ",");
+            if (query.getFinished()) {
+                query.setCodeNotIn(subjectCodeIn);
+            } else {
+                query.setCodeIn(subjectCodeIn);
+            }
+        }
+        if (wu.isSubjectHeader()) {
+            String subjectCodeIn = StringUtils.join(wu.getSubjectCodeSet(), ",");
+            query.setCodeIn(subjectCodeIn);
+        }
+        query = subjectService.findByQuery(query);
+
+        List<InspectedSubjectVO> list = new LinkedList<InspectedSubjectVO>();
+        for (ExamSubject subject : query.getResult()) {
+            InspectedSubjectVO vo = new InspectedSubjectVO();
+            vo.setSubject(subject);
+            ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+            sQuery.setExamId(examId);
+            sQuery.setUpload(true);
+            sQuery.setSubjectCode(subject.getCode());
+            sQuery.addStatus(SubjectiveStatus.INSPECTED);
+            long inspectedCount = studentService.countByQuery(sQuery);
+            vo.setInspectedCount(inspectedCount);
+            sQuery.addStatus(SubjectiveStatus.MARKED);
+            long totalCount = studentService.countByQuery(sQuery);
+            vo.setTotalCount(totalCount);
+            vo.setLeftCount(totalCount - inspectedCount);
+            String percent = totalCount > 0 ? (new DecimalFormat("####.###")
+                    .format(inspectedCount * 100.0 / totalCount) + "%") : "0%";
+            vo.setPercent(percent);
+            list.add(vo);
+        }
+        ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+        sQuery.setExamId(examId);
+        sQuery.setUpload(true);
+        sQuery.addStatus(SubjectiveStatus.INSPECTED);
+        long markedCount = studentService.countByQuery(sQuery);
+        sQuery.addStatus(SubjectiveStatus.MARKED);
+        long total = studentService.countByQuery(sQuery);
+        model.addAttribute("unMarkedCount", total - markedCount);
+        model.addAttribute("markedCount", markedCount);
+        long subjectCount = subjectService.count(examId);
+        model.addAttribute("unFinishCount", unFinishSet.size());
+        model.addAttribute("finishCount", subjectCount - unFinishSet.size());
+        model.addAttribute("resultList", list);
+        model.addAttribute("query", query);
+        model.addAttribute("subjectList", getExamSubject(examId, wu));
+        return "modules/exam/inspectedInfo";
     }
     }
 }
 }

+ 53 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/home/AdminController.java

@@ -0,0 +1,53 @@
+package cn.com.qmth.stmms.admin.home;
+
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.servlet.ModelAndView;
+
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.utils.EncryptUtils;
+import cn.com.qmth.stmms.common.utils.RequestIPUtil;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+
+@Controller
+@RequestMapping("/admin")
+public class AdminController {
+
+    @Autowired
+    private UserService userService;
+
+    @Value("${marker.name.verify}")
+    private boolean nameVerify;
+
+    @RequestMapping(value = "/reset", method = RequestMethod.GET)
+    public ModelAndView reset(HttpServletRequest request) {
+        User user = RequestUtils.getWebUser(request).getUser();
+        ModelAndView modelAndView = new ModelAndView("modules/sys/reset");
+        modelAndView.addObject("user", user);
+        modelAndView.addObject("nameVerify", nameVerify);
+        return modelAndView;
+    }
+
+    @Logging(menu = "修改姓名密码", type = LogType.UPDATE)
+    @RequestMapping(value = "/reset", method = RequestMethod.POST)
+    public ModelAndView reset(HttpServletRequest request, User user) {
+        User current = RequestUtils.getWebUser(request).getUser();
+        current.setName(user.getName());
+        current.setPassword(EncryptUtils.md5(user.getPassword()));
+        current.setLastLoginIp(RequestIPUtil.getIpAddress(request));
+        current.setLastLoginTime(new Date());
+        userService.save(current);
+        return new ModelAndView("redirect:/admin/exam/select");
+    }
+
+}

+ 2 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/interceptor/AdminInterceptor.java

@@ -41,7 +41,8 @@ public class AdminInterceptor extends SessionInterceptor {
             Integer examId = SessionExamUtils.getExamId(request);
             Integer examId = SessionExamUtils.getExamId(request);
             String uri = request.getRequestURI();
             String uri = request.getRequestURI();
             if (examId > 0 || uri.startsWith("/admin/exam/select") || uri.startsWith("/admin/home")
             if (examId > 0 || uri.startsWith("/admin/exam/select") || uri.startsWith("/admin/home")
-                    || uri.startsWith("/admin/exam/create") || uri.startsWith("/admin/exam/save")) {
+                    || uri.startsWith("/admin/exam/create") || uri.startsWith("/admin/exam/save")
+                    || uri.startsWith("/admin/reset")) {
                 return true;
                 return true;
             }
             }
             return redirect(request, response, "/admin/exam/select");
             return redirect(request, response, "/admin/exam/select");

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

@@ -1,8 +1,11 @@
 package cn.com.qmth.stmms.admin.user;
 package cn.com.qmth.stmms.admin.user;
 
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.Set;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
@@ -22,7 +25,18 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
 
+import cn.com.qmth.stmms.admin.dto.MarkerDTO;
+import cn.com.qmth.stmms.admin.dto.SubjectUserDTO;
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
+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.model.SubjectUser;
+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.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.SubjectUserService;
 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.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
@@ -51,6 +65,18 @@ public class UserController extends BaseExamController {
     @Autowired
     @Autowired
     private SubjectUserService subjectUserService;
     private SubjectUserService subjectUserService;
 
 
+    @Autowired
+    private MarkerService markerService;
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private MarkGroupService groupService;
+
+    @Autowired
+    private ExamQuestionService questionService;
+
     @Logging(menu = "查询用户", type = LogType.QUERY)
     @Logging(menu = "查询用户", type = LogType.QUERY)
     @RequestMapping("/list")
     @RequestMapping("/list")
     @RoleRequire(Role.SCHOOL_ADMIN)
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -188,21 +214,91 @@ public class UserController extends BaseExamController {
     public String exportFile(UserSearchQuery query, HttpServletRequest request, HttpServletResponse response,
     public String exportFile(UserSearchQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
             RedirectAttributes redirectAttributes) {
         try {
         try {
+            String fileName = "用户数据.xlsx";
             User user = RequestUtils.getWebUser(request).getUser();
             User user = RequestUtils.getWebUser(request).getUser();
             query.setSchoolId(user.getSchoolId());
             query.setSchoolId(user.getSchoolId());
             query.setPageNumber(1);
             query.setPageNumber(1);
             query.setPageSize(Integer.MAX_VALUE);
             query.setPageSize(Integer.MAX_VALUE);
+            int examId = getSessionExamId(request);
+            if (query.getRole() != null && query.getRole().equals(Role.MARKER)) {
+                Map<String, ExamSubject> subjectMap = new HashMap<String, ExamSubject>();
+                Map<String, MarkGroup> groupMap = new HashMap<String, MarkGroup>();
+                MarkerSearchQuery mQuery = new MarkerSearchQuery();
+                mQuery.setExamId(examId);
+                mQuery.setLoginName(query.getLoginName());
+                mQuery.setName(query.getName());
+                mQuery.setPageSize(Integer.MAX_VALUE);
+                mQuery = markerService.findByQuery(mQuery);
+                List<MarkerDTO> list = new ArrayList<MarkerDTO>();
+                for (Marker m : mQuery.getResult()) {
+                    MarkerDTO s = new MarkerDTO();
+                    ExamSubject subject = subjectMap.get(m.getSubjectCode());
+                    if (subject == null) {
+                        subject = subjectService.find(examId, m.getSubjectCode());
+                        subjectMap.put(m.getSubjectCode(), subject);
+                    }
+                    s.setSubjectCode(m.getSubjectCode());
+                    s.setSubjectName(subject.getName());
+                    String groupKey = m.getSubjectCode() + "/t" + m.getGroupNumber();
+                    MarkGroup group = groupMap.get(groupKey);
+                    if (group == null) {
+                        group = groupService.findOne(examId, m.getSubjectCode(), m.getGroupNumber());
+                        group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+                                subject.getCode(), false, group.getNumber()));
+                        groupMap.put(groupKey, group);
+                    }
+                    s.setGroupName(group.getTitle());
+                    s.setGroupNumber(m.getGroupNumber());
+                    s.setRole(Role.MARKER.getName());
+                    s.setLoginName(userService.findById(m.getUserId()).getLoginName());
+                    list.add(s);
+                }
+                new ExportExcel("评卷员数据", MarkerDTO.class).setDataList(list).write(response, fileName).dispose();
+                return null;
+            }
+            if (query.getRole() != null
+                    && (query.getRole().equals(Role.SUBJECT_HEADER) || query.getRole().equals(Role.INSPECTOR))) {
+                List<SubjectUserDTO> list = new ArrayList<SubjectUserDTO>();
+                Map<String, ExamSubject> subjectMap = new HashMap<String, ExamSubject>();
+                query = userService.findByQuery(query);
+                for (User u : query.getResult()) {
+                    List<SubjectUser> subjectUsers = subjectUserService.findByUserId(u.getId());
+                    if (subjectUsers.isEmpty()) {
+                        SubjectUserDTO s = new SubjectUserDTO();
+                        s.setRole(query.getRole().getName());
+                        s.setLoginName(user.getLoginName());
+                        list.add(s);
+                    } else {
+                        for (SubjectUser subjectUser : subjectUsers) {
+                            SubjectUserDTO s = new SubjectUserDTO();
+                            s.setRole(query.getRole().getName());
+                            s.setLoginName(u.getLoginName());
+                            ExamSubject subject = subjectMap.get(subjectUser.getSubjectCode());
+                            if (subject == null) {
+                                subject = subjectService.find(examId, subjectUser.getSubjectCode());
+                                subjectMap.put(subjectUser.getSubjectCode(), subject);
+                            }
+                            if (subject != null) {
+                                s.setSubjectCode(subjectUser.getSubjectCode());
+                                s.setSubjectName(subject.getName());
+                            }
+                            list.add(s);
+                        }
+                    }
+                }
+                new ExportExcel("用户数据", SubjectUserDTO.class).setDataList(list).write(response, fileName).dispose();
+                return null;
+            }
             query = userService.findByQuery(query);
             query = userService.findByQuery(query);
             for (User s : query.getResult()) {
             for (User s : query.getResult()) {
                 s.setRoleName(s.getRole().getName());
                 s.setRoleName(s.getRole().getName());
             }
             }
-            String fileName = "用户数据.xlsx";
             new ExportExcel("用户数据", User.class).setDataList(query.getResult()).write(response, fileName).dispose();
             new ExportExcel("用户数据", User.class).setDataList(query.getResult()).write(response, fileName).dispose();
             return null;
             return null;
         } catch (Exception e) {
         } catch (Exception e) {
-            addMessage(redirectAttributes, "导出考生数据失败!" + e.getMessage());
+            addMessage(redirectAttributes, "导出用户数据失败!" + e.getMessage());
         }
         }
-        return "redirect:/admin/exam/student";
+        return "redirect:/admin/user/list";
     }
     }
 
 
     @Logging(menu = "用户启用/禁用", type = LogType.UPDATE)
     @Logging(menu = "用户启用/禁用", type = LogType.UPDATE)

+ 67 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/InspectedSubjectVO.java

@@ -0,0 +1,67 @@
+package cn.com.qmth.stmms.admin.vo;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+
+public class InspectedSubjectVO {
+
+    private ExamSubject subject;
+
+    private long totalCount;
+
+    private long inspectedCount;
+
+    private long leftCount;
+
+    private String percent;
+
+    private boolean finishCount;
+
+    public ExamSubject getSubject() {
+        return subject;
+    }
+
+    public void setSubject(ExamSubject subject) {
+        this.subject = subject;
+    }
+
+    public long getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(long totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public long getInspectedCount() {
+        return inspectedCount;
+    }
+
+    public void setInspectedCount(long inspectedCount) {
+        this.inspectedCount = inspectedCount;
+    }
+
+    public long getLeftCount() {
+        return leftCount;
+    }
+
+    public void setLeftCount(long leftCount) {
+        this.leftCount = leftCount;
+    }
+
+    public String getPercent() {
+        return percent;
+    }
+
+    public void setPercent(String percent) {
+        this.percent = percent;
+    }
+
+    public boolean isFinishCount() {
+        return finishCount;
+    }
+
+    public void setFinishCount(boolean finishCount) {
+        this.finishCount = finishCount;
+    }
+
+}

+ 9 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/LoginController.java

@@ -95,6 +95,15 @@ public class LoginController {
         if (ADMIN_LOGIN.equals(loginType)) {
         if (ADMIN_LOGIN.equals(loginType)) {
             if (u.getRole() == Role.SYS_ADMIN || u.getRole() == Role.SCHOOL_ADMIN || u.getRole() == Role.SUBJECT_HEADER
             if (u.getRole() == Role.SYS_ADMIN || u.getRole() == Role.SCHOOL_ADMIN || u.getRole() == Role.SUBJECT_HEADER
                     || u.getRole() == Role.SCHOOL_VIEWER || u.getRole() == Role.INSPECTOR) {
                     || u.getRole() == Role.SCHOOL_VIEWER || u.getRole() == Role.INSPECTOR) {
+                if (u.getLastLoginTime() == null
+                        && (u.getRole() == Role.SUBJECT_HEADER || u.getRole() == Role.SCHOOL_VIEWER || u.getRole() == Role.INSPECTOR)) {
+                    u.refreshAccessToken();
+                    userService.save(u);
+                    WebUser wu = new WebUser(u);
+                    session.saveWebUser(wu);
+                    sessionService.put(request, response, session);
+                    return new ModelAndView("redirect:/admin/reset");
+                }
                 u.setLastLoginTime(new Date());
                 u.setLastLoginTime(new Date());
                 u.setLastLoginIp(RequestIPUtil.getIpAddress(request));
                 u.setLastLoginIp(RequestIPUtil.getIpAddress(request));
                 u.refreshAccessToken();
                 u.refreshAccessToken();

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

@@ -134,7 +134,7 @@
                                         <li><a href="${ctx}/admin/exam/scan" target="mainFrame"><i class="icon-print"></i><span data-i18n-text="index.scan">扫描进度</span></a></li>
                                         <li><a href="${ctx}/admin/exam/scan" target="mainFrame"><i class="icon-print"></i><span data-i18n-text="index.scan">扫描进度</span></a></li>
                                         <li><a href="${ctx}/admin/exam/mark" target="mainFrame"><i class="icon-pencil"></i><span data-i18n-text="index.mark">评卷管理</span></a></li>
                                         <li><a href="${ctx}/admin/exam/mark" target="mainFrame"><i class="icon-pencil"></i><span data-i18n-text="index.mark">评卷管理</span></a></li>
                                         <li><a href="${ctx}/admin/exam/score" target="mainFrame"><i class="icon-search"></i><span data-i18n-text="index.score">成绩查询</span></a></li>
                                         <li><a href="${ctx}/admin/exam/score" target="mainFrame"><i class="icon-search"></i><span data-i18n-text="index.score">成绩查询</span></a></li>
-                                        <li><a href="${ctx}/admin/exam/inspected" target="mainFrame"><i class="icon-flag"></i><span data-i18n-text="index.inspected">成绩复核</span></a></li>
+                                        <li><a href="${ctx}/admin/exam/inspected/info" target="mainFrame"><i class="icon-flag"></i><span data-i18n-text="index.inspected">成绩复核</span></a></li>
                                         <li><a href="${ctx}/admin/exam/problem/history" target="mainFrame"><i class="icon-tag"></i><span data-i18n-text="index.problem">问题试卷</span></a></li>
                                         <li><a href="${ctx}/admin/exam/problem/history" target="mainFrame"><i class="icon-tag"></i><span data-i18n-text="index.problem">问题试卷</span></a></li>
                                         <li><a href="${ctx}/admin/exam/reportSubject" target="mainFrame"><i class="icon-signal"></i><span data-i18n-text="index.report.total">总量分析</span></a></li>
                                         <li><a href="${ctx}/admin/exam/reportSubject" target="mainFrame"><i class="icon-signal"></i><span data-i18n-text="index.report.total">总量分析</span></a></li>
                                         <li><a href="${ctx}/admin/exam/reportSubjectRange" target="mainFrame"><i class="icon-asterisk"></i><span data-i18n-text="index.report.subject">科目分析</span></a></li>
                                         <li><a href="${ctx}/admin/exam/reportSubjectRange" target="mainFrame"><i class="icon-asterisk"></i><span data-i18n-text="index.report.subject">科目分析</span></a></li>
@@ -147,14 +147,14 @@
                                         <c:if test="${forbiddenScore!=true}">
                                         <c:if test="${forbiddenScore!=true}">
                                         <li><a href="${ctx}/admin/exam/score" target="mainFrame"><i class="icon-search"></i><span data-i18n-text="index.score">成绩查询</span></a></li>
                                         <li><a href="${ctx}/admin/exam/score" target="mainFrame"><i class="icon-search"></i><span data-i18n-text="index.score">成绩查询</span></a></li>
                                         </c:if>
                                         </c:if>
-                                        <li><a href="${ctx}/admin/exam/inspected" target="mainFrame"><i class="icon-flag"></i><span data-i18n-text="index.inspected">成绩复核</span></a></li>
+                                        <li><a href="${ctx}/admin/exam/inspected/info" target="mainFrame"><i class="icon-flag"></i><span data-i18n-text="index.inspected">成绩复核</span></a></li>
                                         <li><a href="${ctx}/admin/exam/problem/history" target="mainFrame"><i class="icon-tag"></i><span data-i18n-text="index.problem">问题试卷</span></a></li>
                                         <li><a href="${ctx}/admin/exam/problem/history" target="mainFrame"><i class="icon-tag"></i><span data-i18n-text="index.problem">问题试卷</span></a></li>
                                         <li><a href="${ctx}/admin/exam/reportSubject" target="mainFrame"><i class="icon-signal"></i><span data-i18n-text="index.report.total">总量分析</span></a></li>
                                         <li><a href="${ctx}/admin/exam/reportSubject" target="mainFrame"><i class="icon-signal"></i><span data-i18n-text="index.report.total">总量分析</span></a></li>
                                         <li><a href="${ctx}/admin/exam/reportSubjectRange" target="mainFrame"><i class="icon-asterisk"></i><span data-i18n-text="index.report.subject">科目分析</span></a></li>
                                         <li><a href="${ctx}/admin/exam/reportSubjectRange" target="mainFrame"><i class="icon-asterisk"></i><span data-i18n-text="index.report.subject">科目分析</span></a></li>
                                     </c:if>
                                     </c:if>
                                     
                                     
                                     <c:if test="${web_user.inspector==true}">
                                     <c:if test="${web_user.inspector==true}">
-                                        <li><a href="${ctx}/admin/exam/inspected" target="mainFrame"><i class="icon-flag"></i><span data-i18n-text="index.inspected">成绩复核</span></a></li>
+                                        <li><a href="${ctx}/admin/exam/inspected/info" target="mainFrame"><i class="icon-flag"></i><span data-i18n-text="index.inspected">成绩复核</span></a></li>
                                     </c:if>
                                     </c:if>
                                     
                                     
                                     <c:if test="${web_user.schoolViewer==true}">
                                     <c:if test="${web_user.schoolViewer==true}">

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

@@ -64,7 +64,7 @@
     <div class="middle cl">
     <div class="middle cl">
         <div class="left">
         <div class="left">
             <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
             <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
-            <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright&#169 2021 启明泰和 v1.3.7</p></a>
+            <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright&#169 2021 启明泰和 v1.3.8</p></a>
             <a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
             <a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
         </div>
         </div>
         <div class="right">
         <div class="right">

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

@@ -0,0 +1,155 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>成绩复核</title>
+	<meta name="decorator" content="default"/>
+	<%@include file="/WEB-INF/views/include/head.jsp" %>
+	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+	<script src="${ctxStatic}/echarts/echarts.min.js" type="text/javascript"></script>
+</head>
+<body>
+    <ul class="nav nav-tabs">
+        <li class="active"><a href="##">成绩复核进度</a></li>
+        <li><a href="${ctx}/admin/exam/inspected/list">全卷复核</a></li>
+    </ul>
+     <c:if test="${web_user.schoolAdmin==true}">
+    	<div id="main" style="width: 1000px;height:400px;"></div>
+   	</c:if>
+	<form id="searchForm" action="${ctx}/admin/exam/inspected/info" method="post" class="breadcrumb form-search">
+		<input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
+		<input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
+		<div>
+			<label>科目</label>
+			<select class="input-large" name="code">
+				<option value="">请选择</option>
+				<c:forEach items="${subjectList}" var="subject">
+				<option value="${subject.code}" <c:if test="${subject.code==query.code}">selected</c:if>>${subject.code}-${subject.name}</option>
+				</c:forEach>
+			</select>
+			<c:if test="${web_user.schoolAdmin==true }">
+			<label>完成进度</label>
+			<select class="input-small" name="finished">
+				<option value="" <c:if test="${null==query.finished}">selected</c:if>>请选择</option>
+				<option value="1" <c:if test="${query.finished!=null &&query.finished}">selected</c:if>>已完成</option>
+				<option value="0" <c:if test="${query.finished!=null &&!query.finished}">selected</c:if>>未完成</option>
+			</select>
+			</c:if>
+			&nbsp;
+			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+		</div>
+	</form>
+	<tags:message content="${message}"/>
+	<form id="checkForm" action="${ctx}/admin/exam/mark/finish" method="post" class="breadcrumb form-search">
+	<table id="contentTable" class="table table-striped table-bordered table-condensed">
+		<thead>
+			<tr>
+				<th>科目</th>
+				<th>任务数</th>
+				<th>已复核数</th>
+				<th>待复核数</th>
+				<th>完成进度</th>
+				<th>已复核次数</th>
+			</tr>
+		</thead>
+		<tbody>
+		<c:forEach items="${resultList}" var="result">
+			<tr>
+				<td>
+				${result.subject.code}-${result.subject.name}
+				</td>
+				<td>${result.totalCount}</td>
+				<td>${result.inspectedCount}</td>
+				<td>${result.leftCount}</td>
+				<td>${result.percent}</td>
+				<td></td>
+			</tr>
+		</c:forEach>
+		</tbody>
+	</table>
+	</form>
+	<div class="pagination">${query}</div>
+<script type="text/javascript">
+function page(n,s){
+	$("#pageNumber").val(n);
+	$("#pageSize").val(s);
+	$("#searchForm").attr('action', '${ctx}/admin/exam/inspected/info');
+	$("#searchForm").submit();
+	return false;
+}
+function goSearch(){
+	$("#pageNumber").val(1);
+	$("#pageSize").val('${query.pageSize}');
+	$("#searchForm").attr('action', '${ctx}/admin/exam/inspected/info');
+	$("#searchForm").submit();
+	return false;
+}
+var markedCount =${markedCount};
+var unMarkedCount =${unMarkedCount};
+var finishCount =${finishCount};
+var unFinishCount =${unFinishCount};
+var myChart = echarts.init(document.getElementById('main'));
+var unMarkedCountTitle="任务待完成"+unMarkedCount;
+var markedCountTitle="任务已完成"+markedCount;
+var unFinishCountTitle="科目待完成"+unFinishCount;
+var finishCountTitle="科目已完成"+finishCount;
+myChart.setOption({
+	title: [{
+        text: '复核总进度'
+    }, {
+        text: '科目复核进度',
+        left: '50%',
+     
+    }],
+    tooltip: [{
+        trigger: "item",
+        formatter: "占比:{d}%",
+    }],
+	legend: [{
+	    orient: "vertical",
+	    left: "left",
+	    top: "50px",
+	    data: [unMarkedCountTitle, markedCountTitle]
+	  },
+	  {
+		orient: "vertical",
+	    left: "50%",
+	    top: "50px",
+	    data: [unFinishCountTitle, finishCountTitle]
+	}],
+    series : [
+        {
+        type: 'pie',
+        radius: '55%',
+        center: ['25%', '50%'],
+        data:[
+              {value:unMarkedCount, name:unMarkedCountTitle},
+  			  {value:markedCount, name:markedCountTitle}
+           ],
+        animation: false,
+        label: {
+            position: 'outer',
+            alignTo: 'none',
+            bleedMargin: 5
+        },
+        color:["#7CB5EC",'#FE8463']
+    }, {
+        type: 'pie',
+        radius: '55%',
+        center: ['75%', '50%'],
+        data:[
+            {value:unFinishCount, name:unFinishCountTitle},
+			{value:finishCount, name:finishCountTitle}
+         ],
+        animation: false,
+        label: {
+            position: 'outer',
+            alignTo: 'none',
+            bleedMargin: 5
+        },
+        color:["#7CB5EC",'#FE8463']
+    }]
+})
+</script>	
+</body>
+</html>

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

@@ -19,7 +19,11 @@
         <a href="${ctx}/admin/exam/inspected/import/template">下载模板</a>
         <a href="${ctx}/admin/exam/inspected/import/template">下载模板</a>
     </form>
     </form>
 </div>
 </div>
-<form id="searchForm" action="${ctx}/admin/exam/inspected" method="post" class="breadcrumb form-search" >
+<ul class="nav nav-tabs">
+        <li><a href="${ctx}/admin/exam/inspected/info">成绩复核进度</a></li>
+        <li class="active"><a href="##">全卷复核</a></li>
+</ul>
+<form id="searchForm" action="${ctx}/admin/exam/inspected/list" method="post" class="breadcrumb form-search" >
     <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
     <input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
     <input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
     <input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
     <div>
     <div>
@@ -198,7 +202,7 @@
         $("#pageNumber").val(n);
         $("#pageNumber").val(n);
         $("#pageSize").val(s);
         $("#pageSize").val(s);
         $("#searchForm").attr('target', "_self");
         $("#searchForm").attr('target', "_self");
-        $("#searchForm").attr('action', '${ctx}/admin/exam/inspected');
+        $("#searchForm").attr('action', '${ctx}/admin/exam/inspected/list');
         $("#searchForm").submit();
         $("#searchForm").submit();
         return false;
         return false;
     }
     }
@@ -207,7 +211,7 @@
         $("#pageNumber").val(1);
         $("#pageNumber").val(1);
         $("#pageSize").val('${query.pageSize}');
         $("#pageSize").val('${query.pageSize}');
         $("#searchForm").attr('target', "_self");
         $("#searchForm").attr('target', "_self");
-        $("#searchForm").attr('action', '${ctx}/admin/exam/inspected');
+        $("#searchForm").attr('action', '${ctx}/admin/exam/inspected/list');
         $("#searchForm").submit();
         $("#searchForm").submit();
         return false;
         return false;
     }
     }

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

@@ -138,6 +138,9 @@
         <label>登录名</label>
         <label>登录名</label>
         <input type="text" name="loginName" value="${query.loginName}" maxlength="30" class="input-small"/>
         <input type="text" name="loginName" value="${query.loginName}" maxlength="30" class="input-small"/>
         &nbsp;
         &nbsp;
+        <label>姓名</label>
+        <input type="text" name="name" value="${query.name}" maxlength="30" class="input-small"/>
+        &nbsp;
         <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
         <input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
 		&nbsp;<input id="btnImport" class="btn" type="button" value="导入"/>
 		&nbsp;<input id="btnImport" class="btn" type="button" value="导入"/>
 		&nbsp;<a href="###" class="btn hide" id="save-button"">绑定评卷员</a>
 		&nbsp;<a href="###" class="btn hide" id="save-button"">绑定评卷员</a>

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

@@ -53,7 +53,7 @@
 				<th>评卷员</th>
 				<th>评卷员</th>
 				<th>姓名</th>
 				<th>姓名</th>
 				<th>完成任务数</th>
 				<th>完成任务数</th>
-				<th>有效评卷数</th>
+				<th>打回任务数</th>
 				<th>评卷采用率</th>
 				<th>评卷采用率</th>
 				<th>评卷速度(秒)</th>
 				<th>评卷速度(秒)</th>
 				<th>平均分</th>
 				<th>平均分</th>
@@ -66,11 +66,11 @@
 				<td>${marker.user.loginName}</td>
 				<td>${marker.user.loginName}</td>
 				<td>${marker.user.name}</td>
 				<td>${marker.user.name}</td>
 				<td>${marker.finishCount}</td>
 				<td>${marker.finishCount}</td>
-				<td>${marker.validCount}</td>
+				<td>${marker.rejectCount}</td>
 				<td>
 				<td>
 				<c:choose>
 				<c:choose>
-		        <c:when test="${marker.finishCount!=null && marker.validCount!=null && marker.finishCount>0}">
-		        <fmt:formatNumber type="percent" maxIntegerDigits="3" value="${marker.validCount/marker.finishCount}" />
+		        <c:when test="${marker.finishCount!=null && marker.rejectCount!=null && marker.finishCount>0}">
+		        <fmt:formatNumber type="percent" maxIntegerDigits="3" value="${(marker.finishCount-marker.rejectCount)/marker.finishCount}" />
 		        </c:when>
 		        </c:when>
 		        <c:otherwise>0%</c:otherwise>
 		        <c:otherwise>0%</c:otherwise>
 		        </c:choose>
 		        </c:choose>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/reset.jsp

@@ -68,7 +68,7 @@
     <div class="middle cl">
     <div class="middle cl">
         <div class="left">
         <div class="left">
             <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
             <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
-            <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright &#169 2021 启明泰和 v1.3.7</p></a>
+            <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright &#169 2021 启明泰和 v1.3.8</p></a>
         </div>
         </div>
         <div class="right">
         <div class="right">
             <div class="title">
             <div class="title">

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

@@ -101,7 +101,7 @@
     <div class="middle cl">
     <div class="middle cl">
         <div class="left">
         <div class="left">
             <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
             <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
-            <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright&#169 2021 启明泰和 v1.3.7</p></a>
+            <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright&#169 2021 启明泰和 v1.3.8</p></a>
             <a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
             <a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
         </div>
         </div>
         <div class="right">
         <div class="right">

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/sys/login.jsp

@@ -34,7 +34,7 @@
                     src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/>
                     src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/>
             </div> --%>
             </div> --%>
             <p>
             <p>
-				<a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)">Copyright &#169 2021 启明泰和 v1.3.7</a><br/>
+				<a href="http://www.qmth.com.cn" target="_blank" style="color: rgba(255,255,255,.65)">Copyright &#169 2021 启明泰和 v1.3.8</a><br/>
 				<a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
 				<a href="https://beian.miit.gov.cn/" target="_blank" style="color: rgba(255,255,255,.65)">鄂ICP备12000033号-3</a>
 			</p>
 			</p>
         </div>
         </div>

+ 103 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/sys/reset.jsp

@@ -0,0 +1,103 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp" %>
+<html>
+<head>
+    <title><spring:message code="user.reset.title"/></title>
+    <meta name="decorator" content="default"/>
+    <%@include file="/WEB-INF/views/include/head.jsp" %>
+    <link rel="stylesheet" href="${ctxStatic}/common/login.css">
+    <script type="text/javascript">
+        $(document).ready(function () {
+            <!--针对nw.js评卷客户端,自动窗口最大化-->
+            try {
+                require('nw.gui').Window.get().maximize();
+            } catch (e) {
+            }
+            var nameVerify =${nameVerify};
+            $('#submit-button').click(function () {
+                var name = $('#loginName').val();
+                if (name == '') {
+                    showError($.i18n.prop("user.reset.name"));
+                    return false;
+                }
+                if (name.length > 10) {
+                    showError($.i18n.prop("user.reset.name.length"));
+                    return false;
+                }
+                if (nameVerify == true) {
+                    //var reg = new RegExp("[\\u4E00-\\u9FFF]+");
+                    var pattern = /^[\u4E00-\u9FFF]{1,10}$/;
+                    if (!pattern.test(name)) {
+                        showError($.i18n.prop("user.reset.name.chinese"));
+                        return false;
+                    }
+                }
+
+                var password = $('#password').val();
+                var password2 = $('#password2').val();
+                if (password == '') {
+                    showError($.i18n.prop("user.reset.password"));
+                    return false;
+                }
+                if (password.length > 8 || password.length < 4) {
+                    showError($.i18n.prop("user.reset.password.length"));
+                    return false;
+                }
+                if (password != password2) {
+                    showError($.i18n.prop("user.reset.password.same"));
+                    return false;
+                }
+                return true;
+            });
+        });
+
+        function showError(message) {
+            $('.point').show();
+            $('.error').html(message);
+        }
+
+        // 如果在框架中,则跳转刷新上级页面
+        if (self.frameElement && self.frameElement.tagName == "IFRAME") {
+            parent.location.reload();
+        }
+        load();
+    </script>
+</head>
+<body>
+<div class="container">
+    <div class="middle cl">
+        <div class="left">
+            <div class="logo"><img src="${ctxStatic}/images/<c:if test="${indexLogo ==null||indexLogo =='' }">logo@2x.png</c:if><c:if test="${indexLogo !=null }">${indexLogo }</c:if>"/></div>
+            <a href="http://www.qmth.com.cn" target="_blank"><p>Copyright &#169 2021 启明泰和 v1.3.8</p></a>
+        </div>
+        <div class="right">
+            <div class="title">
+                <h1 data-i18n-text="user.reset.title">首次登录,请完善资料</h1>
+                <br/>
+            </div>
+            <div class="loginbox">
+                <form action="${ctx}/admin/reset" method="post" role="form" id="loginForm">
+                    <div class="input-group">
+                        <input type="text" class="form-control required" id="loginName" name="name" placeholder="请输入姓名" autocomplete="off" value="${loginName }"
+                               data-i18n-placeholder="user.reset.name"/>
+                    </div>
+                    <div class="input-group">
+                        <input type="password" class="form-control required" id="password" name="password" placeholder="请输入密码" autocomplete="off" data-i18n-placeholder="user.reset.password"/>
+                    </div>
+                    <div class="input-group">
+                        <input type="password" class="form-control required" id=password2 name="password2" placeholder="再次输入密码" autocomplete="off" data-i18n-placeholder="user.reset.password.again"/>
+                    </div>
+                    <div class="point hide">
+                        <em class="error"></em>
+                    </div>
+                    <div class="login-btn">
+                        <input class="opacity" type="submit" id="submit-button" value="确 定" data-i18n-value="user.reset.submit"/>
+                        <a href="${ctx}/logout" class="opacity" data-i18n-text="user.reset.logout">退 出</a>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>
+</body>
+</html>

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

@@ -50,6 +50,9 @@
         <label>登录名</label>
         <label>登录名</label>
         <input type="text" name="loginName" value="${query.loginName}" maxlength="20" class="input-small"/>
         <input type="text" name="loginName" value="${query.loginName}" maxlength="20" class="input-small"/>
         &nbsp;
         &nbsp;
+        <label>姓名</label>
+        <input type="text" name="name" value="${query.name}" maxlength="20" class="input-small"/>
+        &nbsp;
         <label>来源</label>
         <label>来源</label>
         <select class="input-small" name="source" id="source-select">
         <select class="input-small" name="source" id="source-select">
             <option value="">不限</option>
             <option value="">不限</option>
@@ -92,7 +95,15 @@
             &nbsp;
             &nbsp;
             <input id="btnImportClass" class="btn" type="button" value="导入评卷员班级"/>
             <input id="btnImportClass" class="btn" type="button" value="导入评卷员班级"/>
             &nbsp;
             &nbsp;
-            <input id="export-button" class="btn" type="button" value="导出"/>
+            <div class="btn-group">
+				<a class="btn dropdown-toggle" data-toggle="dropdown" href="#">
+					导出<span class="caret"></span>
+				</a>
+				<ul class="dropdown-menu">
+					<li><a href="##" onclick="goExport()">导出</a></li>
+					<li><a href="##" onclick="goExportExam()">按考试导出</a></li>
+				</ul>
+			</div>
             &nbsp;
             &nbsp;
             <input id="btnEnable" class="btn" type="button" value="启用" onclick="goEnable(true)"/>
             <input id="btnEnable" class="btn" type="button" value="启用" onclick="goEnable(true)"/>
             &nbsp;
             &nbsp;
@@ -104,8 +115,9 @@
 </form>
 </form>
 <form id="exportForm" action="${ctx}/admin/user/export" method="post" class="breadcrumb form-search hide">
 <form id="exportForm" action="${ctx}/admin/user/export" method="post" class="breadcrumb form-search hide">
         <input type="text" name="loginName" value="${query.loginName}" maxlength="20" class="input-small"/>
         <input type="text" name="loginName" value="${query.loginName}" maxlength="20" class="input-small"/>
+        <input type="text" name="name" value="${query.name}" maxlength="20" class="input-small"/>
         <input type="text" name="source" value="${query.source.value}" maxlength="20" class="input-small"/>
         <input type="text" name="source" value="${query.source.value}" maxlength="20" class="input-small"/>
-         <input type="text" name="role" value="${query.role.value}" maxlength="20" class="input-small"/>
+         <input type="text" name="role" id="roleId" value="${query.role.value}" maxlength="20" class="input-small"/>
          <input type="text" name="enable" value="${query.enable}" maxlength="20" class="input-small"/>
          <input type="text" name="enable" value="${query.enable}" maxlength="20" class="input-small"/>
 </form>
 </form>
 <tags:message content="${message}"/>
 <tags:message content="${message}"/>
@@ -268,10 +280,19 @@
   	  $.jBox($("#importClassBox").html(), {title:"导入评卷员班级", buttons:{"关闭":true},
   	  $.jBox($("#importClassBox").html(), {title:"导入评卷员班级", buttons:{"关闭":true},
   	    bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
   	    bottomText:"导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!"});
   });
   });
-    $("#export-button").click(function () {
+    function goExport() {
         $("#exportForm").attr("action", "${ctx}/admin/user/export");
         $("#exportForm").attr("action", "${ctx}/admin/user/export");
         $("#exportForm").submit();
         $("#exportForm").submit();
-    });
+    }
+    function goExportExam() {
+    	var roleId= $('#roleId').val();
+    	if(roleId!="4" && roleId!="5" && roleId!="8"){
+    		alert("请选择角色,查询后导出");
+    		return false;
+    	}
+        $("#exportForm").attr("action", "${ctx}/admin/user/export");
+        $("#exportForm").submit();
+    }
     $("#ids").change(function () {
     $("#ids").change(function () {
         if ($("#ids").is(':checked')) {
         if ($("#ids").is(':checked')) {
             $(".ids").attr("checked", true);
             $(".ids").attr("checked", true);