ting.yin 5 年之前
父节点
当前提交
8ef693d03b
共有 55 个文件被更改,包括 955 次插入170 次删除
  1. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamDao.java
  2. 10 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java
  3. 12 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/OperationLog.java
  4. 30 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamStudentSearchQuery.java
  5. 88 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/OperationLogSearchQuery.java
  6. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamService.java
  7. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/OperationLogService.java
  8. 5 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamServiceImpl.java
  9. 47 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/OperationLogServiceImpl.java
  10. 5 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/AnswerCheckController.java
  11. 20 10
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java
  12. 4 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java
  13. 4 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/DataSyncController.java
  14. 6 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java
  15. 4 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ImageCheckController.java
  16. 12 9
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java
  17. 4 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java
  18. 5 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java
  19. 11 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
  20. 6 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java
  21. 53 28
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java
  22. 8 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java
  23. 3 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ProblemHistoryController.java
  24. 7 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ProblemTypeController.java
  25. 10 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScanController.java
  26. 33 21
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java
  27. 21 4
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StudentController.java
  28. 3 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SubjectController.java
  29. 5 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TrialController.java
  30. 4 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/home/AccountController.java
  31. 60 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/log/OperationLogController.java
  32. 7 4
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectClassController.java
  33. 6 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectCollegeController.java
  34. 6 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectController.java
  35. 6 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectGroupController.java
  36. 13 7
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectQuestionController.java
  37. 16 10
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectRangeController.java
  38. 16 9
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectTeacherClassController.java
  39. 8 3
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectTeacherController.java
  40. 10 2
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/school/SchoolController.java
  41. 6 0
      stmms-web/src/main/java/cn/com/qmth/stmms/admin/user/UserController.java
  42. 161 14
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/CoreController.java
  43. 5 0
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamInfoController.java
  44. 8 3
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamPackageController.java
  45. 4 0
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamStudentController.java
  46. 3 0
      stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ScanController.java
  47. 17 9
      stmms-web/src/main/java/cn/com/qmth/stmms/api/interceptor/ApiInterceptor.java
  48. 12 0
      stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java
  49. 27 7
      stmms-web/src/main/java/cn/com/qmth/stmms/common/interceptor/LogInterceptor.java
  50. 4 0
      stmms-web/src/main/java/cn/com/qmth/stmms/common/utils/RequestUtils.java
  51. 27 19
      stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java
  52. 5 3
      stmms-web/src/main/java/cn/com/qmth/stmms/open/controller/OpenAccountController.java
  53. 1 0
      stmms-web/src/main/webapp/WEB-INF/spring-mvc.xml
  54. 1 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examIndex.jsp
  55. 99 0
      stmms-web/src/main/webapp/WEB-INF/views/modules/log/logList.jsp

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

@@ -38,4 +38,6 @@ public interface ExamDao extends PagingAndSortingRepository<Exam, Integer>, JpaS
     @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);
 }

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -35,6 +35,8 @@ public class Exam implements Serializable {
     @Column(name = "school_id")
     private Integer schoolId;
 
+    private String code;
+
     @Temporal(TemporalType.DATE)
     @Column(name = "exam_time")
     private Date examTime;
@@ -264,4 +266,12 @@ public class Exam implements Serializable {
         this.type = type;
     }
 
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
 }

+ 12 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/OperationLog.java

@@ -12,6 +12,7 @@ import javax.persistence.Id;
 import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
+import javax.persistence.Transient;
 
 import cn.com.qmth.stmms.common.enums.LogType;
 
@@ -57,6 +58,9 @@ public class OperationLog implements Serializable {
     @Column(name = "ip_address")
     private String ipAddress;
 
+    @Transient
+    private String examName;
+
     public Integer getId() {
         return id;
     }
@@ -145,4 +149,12 @@ public class OperationLog implements Serializable {
         this.marker = marker;
     }
 
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
 }

+ 30 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamStudentSearchQuery.java

@@ -74,6 +74,12 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
 
     private Boolean breach;
 
+    private String college;
+
+    private String className;
+
+    private String teacher;
+
     public void orderByExamNumber() {
         setSort(new Sort(Direction.ASC, "examNumber"));
     }
@@ -334,4 +340,28 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
         this.manualAbsent = manualAbsent;
     }
 
+    public String getCollege() {
+        return college;
+    }
+
+    public void setCollege(String college) {
+        this.college = college;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getTeacher() {
+        return teacher;
+    }
+
+    public void setTeacher(String teacher) {
+        this.teacher = teacher;
+    }
+
 }

+ 88 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/OperationLogSearchQuery.java

@@ -0,0 +1,88 @@
+package cn.com.qmth.stmms.biz.exam.query;
+
+import java.util.Date;
+
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+
+import cn.com.qmth.stmms.biz.common.BaseQuery;
+import cn.com.qmth.stmms.biz.exam.model.OperationLog;
+import cn.com.qmth.stmms.common.enums.LogType;
+
+public class OperationLogSearchQuery extends BaseQuery<OperationLog> {
+
+    private Integer schoolId;
+
+    private Integer examId;
+
+    private LogType type;
+
+    private Date createTime;
+
+    private Boolean marker;
+
+    private Integer operatorId;
+
+    private String loginName;
+
+    public void orderByCreateTime() {
+        setSort(new Sort(Direction.DESC, "createTime"));
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public LogType getType() {
+        return type;
+    }
+
+    public void setType(LogType type) {
+        this.type = type;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Boolean getMarker() {
+        return marker;
+    }
+
+    public void setMarker(Boolean marker) {
+        this.marker = marker;
+    }
+
+    public Integer getOperatorId() {
+        return operatorId;
+    }
+
+    public void setOperatorId(Integer operatorId) {
+        this.operatorId = operatorId;
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+}

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

@@ -33,4 +33,6 @@ public interface ExamService {
 
     void updateProcess(Integer examId, Double process);
 
+    Exam findByCode(Integer schoolId, String code);
+
 }

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

@@ -1,9 +1,12 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
 import cn.com.qmth.stmms.biz.exam.model.OperationLog;
+import cn.com.qmth.stmms.biz.exam.query.OperationLogSearchQuery;
 
 public interface OperationLogService {
 
     OperationLog save(OperationLog examLog);
 
+    OperationLogSearchQuery findByQuery(OperationLogSearchQuery query);
+
 }

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

@@ -176,4 +176,9 @@ public class ExamServiceImpl extends BaseQueryService<Exam> implements ExamServi
         examDao.updateProcess(id, process);
     }
 
+    @Override
+    public Exam findByCode(Integer schoolId, String code) {
+        return examDao.findBySchoolIdAndCode(schoolId, code);
+    }
+
 }

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

@@ -1,12 +1,24 @@
 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 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.OperationLogDao;
 import cn.com.qmth.stmms.biz.exam.model.OperationLog;
+import cn.com.qmth.stmms.biz.exam.query.OperationLogSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
 
 @Service
@@ -21,4 +33,39 @@ public class OperationLogServiceImpl extends BaseQueryService<OperationLog> impl
         return logDao.save(log);
     }
 
+    @Override
+    public OperationLogSearchQuery findByQuery(OperationLogSearchQuery query) {
+        checkQuery(query);
+        Page<OperationLog> result = logDao.findAll(buildSpecification(query), query);
+        fillResult(result, query);
+        return query;
+    }
+
+    private Specification<OperationLog> buildSpecification(OperationLogSearchQuery query) {
+        return new Specification<OperationLog>() {
+
+            @Override
+            public Predicate toPredicate(Root<OperationLog> root, CriteriaQuery<?> cQuery, CriteriaBuilder cb) {
+                List<Predicate> predicates = new LinkedList<Predicate>();
+                if (query.getSchoolId() != null) {
+                    predicates.add(cb.equal(root.get("schoolId"), query.getSchoolId()));
+                }
+                if (query.getExamId() > 0) {
+                    predicates.add(cb.equal(root.get("examId"), query.getExamId()));
+                }
+                if (query.getMarker() != null) {
+                    predicates.add(cb.equal(root.get("marker"), query.getMarker()));
+                }
+                if (query.getType() != null) {
+                    predicates.add(cb.equal(root.get("type"), query.getType()));
+                }
+                if (StringUtils.isNotBlank(query.getLoginName())) {
+                    predicates.add(cb.equal(root.get("loginName"), query.getLoginName()));
+                }
+                return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
+                        .size()]));
+            }
+        };
+    }
+
 }

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

@@ -28,7 +28,9 @@ 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.common.annotation.Logging;
 import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 
 @Controller
@@ -50,6 +52,7 @@ public class AnswerCheckController extends BaseExamController {
     @Value("${sheet.image.server}")
     private String sheetServer;
 
+    @Logging(menu = "识别结果检查", type = LogType.QUERY)
     @RequestMapping
     public ModelAndView index(HttpServletRequest request) {
         int examId = getSessionExamId(request);
@@ -65,6 +68,7 @@ public class AnswerCheckController extends BaseExamController {
         }
     }
 
+    @Logging(menu = "识别结果查询数量", type = LogType.QUERY)
     @RequestMapping("/count")
     @ResponseBody
     public long count(HttpServletRequest request, ExamStudentSearchQuery query) {
@@ -105,6 +109,7 @@ public class AnswerCheckController extends BaseExamController {
         }
     }
 
+    @Logging(menu = "识别结果修改", type = LogType.UPDATE)
     @RequestMapping("/save")
     @ResponseBody
     public Object save(HttpServletRequest request, @RequestParam Integer studentId, @RequestParam String answers,

+ 20 - 10
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java

@@ -42,11 +42,13 @@ import cn.com.qmth.stmms.biz.mark.service.ArbitrateHistoryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.HistoryStatus;
 import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -116,8 +118,8 @@ public class ArbitrateController extends BaseExamController {
             query.setGroupNumber(groupList.get(0).getNumber());
         }
         for (MarkGroup group : groupList) {
-            group.setQuestionList(questionService
-                    .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, group.getSubjectCode(), false, group.getNumber()));
+            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+                    group.getSubjectCode(), false, group.getNumber()));
         }
         query.orderByIdDesc();
         query = arbitrateService.findByQuery(query);
@@ -188,6 +190,7 @@ public class ArbitrateController extends BaseExamController {
         return "modules/exam/arbitrateBatchProcess";
     }
 
+    @Logging(menu = "打回仲裁任务", type = LogType.UPDATE)
     @RequestMapping(value = "/back", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
@@ -217,9 +220,10 @@ public class ArbitrateController extends BaseExamController {
     @RequestMapping(value = "/history/{subjectCode}/{groupNumber}", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
-    public List<Task> getHistory(HttpServletRequest request, @PathVariable String subjectCode, @PathVariable Integer groupNumber,
-            @RequestParam(required = false) Integer pageNumber, @RequestParam(required = false) Integer pageSize,
-            @RequestParam String order, @RequestParam String sort, @RequestParam(required = false, defaultValue = "false") Boolean isTag,
+    public List<Task> getHistory(HttpServletRequest request, @PathVariable String subjectCode,
+            @PathVariable Integer groupNumber, @RequestParam(required = false) Integer pageNumber,
+            @RequestParam(required = false) Integer pageSize, @RequestParam String order, @RequestParam String sort,
+            @RequestParam(required = false, defaultValue = "false") Boolean isTag,
             @RequestParam(required = false) Integer studentId) {
         int examId = getSessionExamId(request);
         WebUser wu = RequestUtils.getWebUser(request);
@@ -270,7 +274,8 @@ public class ArbitrateController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         ArbitrateHistory history = arbitrateService.findById(historyId);
         if (history != null && history.getExamId().equals(examId) && subjectCheck(history.getSubjectCode(), wu)) {
-            MarkGroup group = groupService.findOne(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
+            MarkGroup group = groupService.findOne(history.getExamId(), history.getSubjectCode(),
+                    history.getGroupNumber());
             return taskService.build(history, group);
         }
         Task task = new Task();
@@ -316,6 +321,7 @@ public class ArbitrateController extends BaseExamController {
         return task;
     }
 
+    @Logging(menu = "处理仲裁", type = LogType.UPDATE)
     @RequestMapping(value = "/saveTask", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
@@ -323,9 +329,11 @@ public class ArbitrateController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         JSONObject result = new JSONObject();
         ArbitrateHistory history = arbitrateService.findById(task.getLibraryId());
-        if (history != null && subjectCheck(history.getSubjectCode(), wu) && task.getTotalScore() >= 0 && task.getScoreList() != null) {
+        if (history != null && subjectCheck(history.getSubjectCode(), wu) && task.getTotalScore() >= 0
+                && task.getScoreList() != null) {
             try {
-                lockService.watch(LockType.GROUP, history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
+                lockService.watch(LockType.GROUP, history.getExamId(), history.getSubjectCode(),
+                        history.getGroupNumber());
 
                 history.setUserId(wu.getUser().getId());
                 history.setTotalScore(task.getTotalScore());
@@ -340,7 +348,8 @@ public class ArbitrateController extends BaseExamController {
                 log.error("ArbitrateController-处理仲裁卷出错", e);
                 result.accumulate("success", false);
             } finally {
-                lockService.unwatch(LockType.GROUP, history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
+                lockService.unwatch(LockType.GROUP, history.getExamId(), history.getSubjectCode(),
+                        history.getGroupNumber());
             }
         } else {
             result.accumulate("success", false);
@@ -351,7 +360,8 @@ public class ArbitrateController extends BaseExamController {
     @RequestMapping("/status")
     @ResponseBody
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
-    public JSONObject status(HttpServletRequest request, @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
+    public JSONObject status(HttpServletRequest request, @RequestParam String subjectCode,
+            @RequestParam Integer groupNumber) {
         JSONObject status = new JSONObject();
         int examId = getSessionExamId(request);
         WebUser wu = RequestUtils.getWebUser(request);

+ 4 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java

@@ -21,7 +21,9 @@ import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.query.CheckStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.enums.CheckType;
+import cn.com.qmth.stmms.common.enums.LogType;
 
 @Controller
 @RequestMapping("/admin/exam/check/student")
@@ -36,6 +38,7 @@ public class CheckStudentController extends BaseExamController {
     @Value("${sheet.image.server}")
     private String sheetServer;
 
+    @Logging(menu = "人工确认查询", type = LogType.QUERY)
     @RequestMapping
     public String index(Model model, HttpServletRequest request, CheckStudentSearchQuery query) {
         int examId = getSessionExamId(request);
@@ -78,6 +81,7 @@ public class CheckStudentController extends BaseExamController {
         }
     }
 
+    @Logging(menu = "人工确认考生", type = LogType.UPDATE)
     @RequestMapping("/save")
     @ResponseBody
     public Object save(HttpServletRequest request, @RequestParam Integer studentId, @RequestParam String answers) {

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

@@ -34,8 +34,10 @@ 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.lock.LockService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 
@@ -121,6 +123,7 @@ public class DataSyncController extends BaseExamController {
         return view;
     }
 
+    @Logging(menu = "数据同步", type = LogType.UPDATE)
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String save(HttpServletRequest request, DataSync dataSync, RedirectAttributes redirectAttributes) {
@@ -139,6 +142,7 @@ public class DataSyncController extends BaseExamController {
         return "redirect:/admin/exam-list";
     }
 
+    @Logging(menu = "导出多媒体试卷结构", type = LogType.EXPORT)
     @RequestMapping(value = "/export", method = RequestMethod.GET)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public ModelAndView exportFile(HttpServletRequest request, HttpServletResponse response,

+ 6 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ExamController.java

@@ -39,10 +39,12 @@ import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.utils.Paginator;
@@ -76,6 +78,7 @@ public class ExamController extends BaseExamController {
     @Value("${sheet.image.server}")
     private String imageServer;
 
+    @Logging(menu = "查询考试", type = LogType.QUERY)
     @RequestMapping(value = { "/exam-list" })
     public String examList(Model model, HttpServletRequest request, ExamSearchQuery query) {
         SessionExamUtils.clearExamId(request);
@@ -111,6 +114,7 @@ public class ExamController extends BaseExamController {
         return "modules/exam/examEdit";
     }
 
+    @Logging(menu = "创建考试", type = LogType.ADD)
     @RequestMapping(value = "/exam-save", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String save(HttpServletRequest request, Exam exam, RedirectAttributes redirectAttributes) {
@@ -126,6 +130,7 @@ public class ExamController extends BaseExamController {
         return "redirect:/admin/exam-list";
     }
 
+    @Logging(menu = "编辑考试", type = LogType.UPDATE)
     @SuppressWarnings("unchecked")
     @RequestMapping(value = "/exam-edit", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -164,6 +169,7 @@ public class ExamController extends BaseExamController {
         return "redirect:/admin/exam/student";
     }
 
+    @Logging(menu = "考试详情", type = LogType.QUERY)
     @RequestMapping("/exam-view/{examId}")
     public String view(Model model, HttpServletRequest request, @PathVariable Integer examId) {
         SessionExamUtils.setExamId(request, examId);

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

@@ -23,8 +23,10 @@ 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.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+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.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;
@@ -51,6 +53,7 @@ public class ImageCheckController extends BaseExamController {
 
     private AtomicBoolean running = new AtomicBoolean(false);
 
+    @Logging(menu = "图片检查", type = LogType.QUERY)
     @RequestMapping
     public ModelAndView list(HttpServletRequest request, ExamStudentSearchQuery query) {
         WebUser wu = RequestUtils.getWebUser(request);
@@ -83,6 +86,7 @@ public class ImageCheckController extends BaseExamController {
         return new ModelAndView("redirect:/admin/exam/check/image");
     }
 
+    @Logging(menu = "图片检查导出", type = LogType.EXPORT)
     @RequestMapping("/export")
     public String export(ExamStudentSearchQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {

+ 12 - 9
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -43,9 +43,11 @@ import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
@@ -87,10 +89,11 @@ public class InspectedController extends BaseExamController {
     @Value("${slice.image.server}")
     private String sliceServer;
 
+    @Logging(menu = "开始复核", type = LogType.QUERY)
     @RequestMapping("/start")
     @ResponseBody
-    public ModelAndView start(HttpServletRequest request, RedirectAttributes redirectAttributes, @RequestParam String subjectCode,
-            @RequestParam Integer groupNumber) {
+    public ModelAndView start(HttpServletRequest request, RedirectAttributes redirectAttributes,
+            @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
         int examId = getSessionExamId(request);
         if (examId > 0) {
             MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
@@ -150,9 +153,8 @@ public class InspectedController extends BaseExamController {
             result.accumulate("markerScore", library.getMarkerScore());
 
             JSONArray array = new JSONArray();
-            List<ExamQuestion> questions = questionService
-                    .findByExamAndSubjectAndObjectiveAndGroupNumber(library.getExamId(), library.getSubjectCode(), false,
-                            library.getGroupNumber());
+            List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                    library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
             List<ScoreItem> scores = library.getScoreList();
             for (int i = 0; i < questions.size(); i++) {
                 ExamQuestion question = questions.get(i);
@@ -163,11 +165,11 @@ public class InspectedController extends BaseExamController {
             }
             result.accumulate("questions", array);
 
-            MarkGroup group = groupService.findOne(student.getExamId(), student.getSubjectCode(), library.getGroupNumber());
+            MarkGroup group = groupService.findOne(student.getExamId(), student.getSubjectCode(),
+                    library.getGroupNumber());
             Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-            List<String> picUrls = PictureUrlBuilder
-                    .getSliceUrls(student.getExamId(), campus.getId(), student.getSubjectCode(), student.getExamNumber(),
-                            student.getSliceCount());
+            List<String> picUrls = PictureUrlBuilder.getSliceUrls(student.getExamId(), campus.getId(),
+                    student.getSubjectCode(), student.getExamNumber(), student.getSliceCount());
             List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
             List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
             result.accumulate("picUrls", picUrls);
@@ -181,6 +183,7 @@ public class InspectedController extends BaseExamController {
         return result;
     }
 
+    @Logging(menu = "复核评卷任务", type = LogType.UPDATE)
     @RequestMapping("/save")
     @ResponseBody
     public Object save(HttpServletRequest request, @RequestParam Integer libraryId) {

+ 4 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -33,10 +33,12 @@ import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
@@ -75,6 +77,7 @@ public class LibraryController extends BaseExamController {
     @Value("${json.server}")
     private String jsonServer;
 
+    @Logging(menu = "评卷任务查询", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, MarkLibrarySearchQuery query,
             @RequestParam(required = false) LibraryStatus status) {
@@ -132,6 +135,7 @@ public class LibraryController extends BaseExamController {
         return "modules/exam/libraryList";
     }
 
+    @Logging(menu = "打回评卷任务", type = LogType.UPDATE)
     @RequestMapping(value = "/back", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })

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

@@ -27,7 +27,9 @@ 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.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -57,6 +59,7 @@ public class MarkController extends BaseExamController {
      * @param query
      * @return
      */
+    @Logging(menu = "评卷管理查询", type = LogType.QUERY)
     @RequestMapping(value = { "", "/subject" })
     public String subjectList(HttpServletRequest request, Model model, ExamSubjectSearchQuery query) {
         WebUser wu = RequestUtils.getWebUser(request);
@@ -87,6 +90,7 @@ public class MarkController extends BaseExamController {
         return "modules/exam/markInfo";
     }
 
+    @Logging(menu = "整体评卷进度导出", type = LogType.EXPORT)
     @RequestMapping(value = "/export-progress", method = RequestMethod.POST)
     public String exportProgress(HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
@@ -114,6 +118,7 @@ public class MarkController extends BaseExamController {
         }
     }
 
+    @Logging(menu = "评卷员工作量导出", type = LogType.EXPORT)
     @RequestMapping(value = "/export-marker", method = RequestMethod.POST)
     public String exportMarker(HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {

+ 11 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java

@@ -45,10 +45,12 @@ 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;
@@ -96,6 +98,7 @@ public class MarkGroupController extends BaseExamController {
     @Value("${slice.image.server}")
     private String imageServer;
 
+    @Logging(menu = "大题管理查询", type = LogType.QUERY)
     @RequestMapping
     public String list(HttpServletRequest request, Model model, @RequestParam String subjectCode) {
         WebUser wu = RequestUtils.getWebUser(request);
@@ -147,6 +150,7 @@ public class MarkGroupController extends BaseExamController {
         return array;
     }
 
+    @Logging(menu = "大题数量校对", type = LogType.UPDATE)
     @RequestMapping("/check-count")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String ckeckCount(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
@@ -162,6 +166,7 @@ public class MarkGroupController extends BaseExamController {
         return "redirect:/admin/exam/group";
     }
 
+    @Logging(menu = "大题任务回收", type = LogType.UPDATE)
     @RequestMapping("/release")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String release(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
@@ -181,6 +186,7 @@ public class MarkGroupController extends BaseExamController {
         return "redirect:/admin/exam/group";
     }
 
+    @Logging(menu = "大题重置", type = LogType.UPDATE)
     @RequestMapping("/reset")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String reset(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
@@ -204,6 +210,7 @@ public class MarkGroupController extends BaseExamController {
         return "redirect:/admin/exam/group";
     }
 
+    @Logging(menu = "大题状态修改", type = LogType.QUERY)
     @RequestMapping("/changeStatus")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String changeStatus(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
@@ -337,6 +344,7 @@ public class MarkGroupController extends BaseExamController {
         }
     }
 
+    @Logging(menu = "删除大题", type = LogType.DELETE)
     @RequestMapping("/delete")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String delete(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
@@ -350,6 +358,7 @@ public class MarkGroupController extends BaseExamController {
         try {
             lockService.waitlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
             markService.deleteGroup(group);
+            RequestUtils.setLog(request, "删除成功,subjectCode:" + subjectCode + " number:" + number);
         } catch (Exception e) {
             log.error("delete group error", e);
             throw new RuntimeException("删除大题失败", e);
@@ -362,6 +371,7 @@ public class MarkGroupController extends BaseExamController {
         return "redirect:/admin/exam/group";
     }
 
+    @Logging(menu = "修改大题", type = LogType.UPDATE)
     @SuppressWarnings("unchecked")
     @RequestMapping("/save")
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -475,6 +485,7 @@ public class MarkGroupController extends BaseExamController {
         }
     }
 
+    @Logging(menu = "新增大题", type = LogType.ADD)
     @SuppressWarnings("unchecked")
     @RequestMapping("/insert")
     @RoleRequire(Role.SCHOOL_ADMIN)

+ 6 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java

@@ -42,11 +42,13 @@ import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.biz.mark.service.TrialService;
 import cn.com.qmth.stmms.biz.mark.thread.MarkQualityThread;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
@@ -103,6 +105,7 @@ public class MarkQualityController extends BaseExamController {
     @Value("${json.server}")
     private String jsonServer;
 
+    @Logging(menu = "质量监控查询", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, MarkerSearchQuery query) {
         int examId = getSessionExamId(request);
@@ -134,6 +137,7 @@ public class MarkQualityController extends BaseExamController {
         return "modules/exam/qualityList";
     }
 
+    @Logging(menu = "重新计算质量监控", type = LogType.UPDATE)
     @RequestMapping("/update")
     public String update(HttpServletRequest request, RedirectAttributes redirectAttributes,
             @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
@@ -155,6 +159,7 @@ public class MarkQualityController extends BaseExamController {
         return examId + "_" + subjectCode + "_" + groupNumber;
     }
 
+    @Logging(menu = "查询给分曲线", type = LogType.QUERY)
     @RequestMapping("/chart")
     public String chart(HttpServletRequest request, Model model, @RequestParam String subjectCode,
             @RequestParam Integer groupNumber) {
@@ -228,6 +233,7 @@ public class MarkQualityController extends BaseExamController {
         return list;
     }
 
+    @Logging(menu = "质量监控查询给分记录详情", type = LogType.QUERY)
     @RequestMapping("/batchProcess")
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
     public String batchProcess(Model model, HttpServletRequest request, @RequestParam Integer markerId,

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

@@ -37,9 +37,11 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
 import cn.com.qmth.stmms.biz.lock.LockService;
 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.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkerExcelError;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
@@ -89,6 +91,7 @@ public class MarkerController extends BaseExamController {
     @Value("${marker.showBtnImportAndBtnUpdateImport}")
     private String showBtnImport;
 
+    @Logging(menu = "评卷员查询", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, MarkerSearchQuery query) {
         WebUser wu = RequestUtils.getWebUser(request);
@@ -100,8 +103,8 @@ public class MarkerController extends BaseExamController {
         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));
@@ -117,7 +120,8 @@ public class MarkerController extends BaseExamController {
 
     @RequestMapping("/query")
     @ResponseBody
-    public JSONArray query(HttpServletRequest request, @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
+    public JSONArray query(HttpServletRequest request, @RequestParam String subjectCode,
+            @RequestParam Integer groupNumber) {
         int examId = getSessionExamId(request);
         JSONArray array = new JSONArray();
         List<Marker> list = markerService.findByExamAndSubjectAndGroup(examId, subjectCode, groupNumber);
@@ -131,6 +135,7 @@ public class MarkerController extends BaseExamController {
         return array;
     }
 
+    @Logging(menu = "评卷员回收任务", type = LogType.UPDATE)
     @RequestMapping("/release")
     @ResponseBody
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -156,8 +161,8 @@ public class MarkerController extends BaseExamController {
 
     @RequestMapping("/batch-create")
     @RoleRequire(Role.SCHOOL_ADMIN)
-    public String createInit(Model model, HttpServletRequest request, @RequestParam(required = false) String subjectCode,
-            @RequestParam(required = false) Integer groupNumber) {
+    public String createInit(Model model, HttpServletRequest request,
+            @RequestParam(required = false) String subjectCode, @RequestParam(required = false) Integer groupNumber) {
         int examId = getSessionExamId(request);
         model.addAttribute("subjectList", getExamSubject(examId, RequestUtils.getWebUser(request)));
         if (subjectCode != null) {
@@ -172,10 +177,12 @@ public class MarkerController extends BaseExamController {
         return "modules/exam/markerCreate";
     }
 
+    @Logging(menu = "创建评卷员", type = LogType.ADD)
     @RequestMapping(value = "/batch-create", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
-    public ModelAndView create(HttpServletRequest request, @RequestParam String subjectCode, @RequestParam Integer groupNumber,
-            @RequestParam Integer count, @RequestParam(required = false) String password) {
+    public ModelAndView create(HttpServletRequest request, @RequestParam String subjectCode,
+            @RequestParam Integer groupNumber, @RequestParam Integer count,
+            @RequestParam(required = false) String password) {
         int examId = getSessionExamId(request);
         ExamSubject subject = subjectService.find(examId, subjectCode);
         ModelAndView view = new ModelAndView("redirect:/admin/exam/marker");
@@ -189,13 +196,15 @@ public class MarkerController extends BaseExamController {
         return view;
     }
 
+    @Logging(menu = "评卷员重置", type = LogType.UPDATE)
     @RequestMapping(value = "/reset")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String resetMarker(@RequestParam Integer id, Model model, RedirectAttributes redirectAttributes) {
         Marker marker = markerService.findById(id);
         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);
@@ -204,7 +213,8 @@ public class MarkerController extends BaseExamController {
                 throw new RuntimeException("重置评卷员失败", e);
             } finally {
                 lockService.unlock(LockType.MARKER, marker.getId());
-                lockService.unlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+                lockService
+                        .unlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
             }
         }
         redirectAttributes.addAttribute("subjectCode", marker.getSubjectCode());
@@ -212,6 +222,7 @@ public class MarkerController extends BaseExamController {
         return "redirect:/admin/exam/marker";
     }
 
+    @Logging(menu = "评卷员重置", type = LogType.UPDATE)
     @RequestMapping(value = "/reset", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -220,7 +231,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);
@@ -231,7 +243,8 @@ public class MarkerController extends BaseExamController {
                 obj.accumulate("message", "重置评卷员失败");
             } finally {
                 lockService.unlock(LockType.MARKER, marker.getId());
-                lockService.unlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+                lockService
+                        .unlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
             }
         } else {
             obj.accumulate("success", false);
@@ -240,6 +253,7 @@ public class MarkerController extends BaseExamController {
         return obj;
     }
 
+    @Logging(menu = "评卷员禁用/启用", type = LogType.UPDATE)
     @RequestMapping(value = "/toggle", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -257,6 +271,7 @@ public class MarkerController extends BaseExamController {
         return obj;
     }
 
+    @Logging(menu = "评卷员导出", type = LogType.EXPORT)
     @RequestMapping(value = "/export", method = RequestMethod.POST)
     public String exportFile(MarkerSearchQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
@@ -280,8 +295,8 @@ public class MarkerController extends BaseExamController {
                 }
                 MarkGroup group = groupService.findOne(examId, marker.getSubjectCode(), marker.getGroupNumber());
                 if (group != null) {
-                    group.setQuestionList(questionService
-                            .findByExamAndSubjectAndObjectiveAndGroupNumber(examId, group.getSubjectCode(), false, group.getNumber()));
+                    group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+                            group.getSubjectCode(), false, group.getNumber()));
                     marker.setGroupName(group.getNumber() + "-" + group.getTitle());
                 } else {
                     marker.setGroupName("");
@@ -295,6 +310,7 @@ public class MarkerController extends BaseExamController {
         return "redirect:/admin/exam/marker?repage";
     }
 
+    @Logging(menu = "评卷员重置密码", type = LogType.UPDATE)
     @RequestMapping(value = "/reSetPassword", method = RequestMethod.POST)
     @ResponseBody
     public JSONObject reSetPassword(@RequestParam Integer id, @RequestParam String password) {
@@ -311,6 +327,7 @@ public class MarkerController extends BaseExamController {
         return obj;
     }
 
+    @Logging(menu = "评卷员设置任务数量", type = LogType.UPDATE)
     @RequestMapping(value = "/setTaskCount", method = RequestMethod.POST)
     @ResponseBody
     public JSONObject setTaskCount(@RequestParam Integer id, @RequestParam Integer taskCount) {
@@ -355,6 +372,7 @@ public class MarkerController extends BaseExamController {
         return "redirect:" + "/admin/exam/marker";
     }
 
+    @Logging(menu = "评卷员导入", type = LogType.IMPORT_FILE)
     @RequestMapping(value = "/import", method = RequestMethod.POST)
     public String importFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes,
             @RequestParam String subjectCode) {
@@ -402,7 +420,9 @@ public class MarkerController extends BaseExamController {
             if (failureNum > 0) {
                 failureMsg.insert(0, ",失败 " + failureNum + " 条记录!");
             }
-            addMessage(redirectAttributes, "已成功导入 " + successNum + " 条评卷员" + failureMsg);
+            String message = "已成功导入 " + successNum + " 条评卷员 ";
+            addMessage(redirectAttributes, message + failureMsg);
+            RequestUtils.setLog(request, message);
         } catch (Exception e) {
             log.error("Batch import marker error!", e);
             addMessage(redirectAttributes, "导入评卷员失败!失败信息:" + e.getMessage());
@@ -428,8 +448,9 @@ public class MarkerController extends BaseExamController {
                 }
             }
             for (MarkerDTO markerDTO : list) {
-                if (StringUtils.isBlank(markerDTO.getSubjectCode()) || StringUtils.isBlank(markerDTO.getLoginName()) || StringUtils
-                        .isBlank(markerDTO.getNewLoginName()) || StringUtils.isBlank(markerDTO.getPassword())) {
+                if (StringUtils.isBlank(markerDTO.getSubjectCode()) || StringUtils.isBlank(markerDTO.getLoginName())
+                        || StringUtils.isBlank(markerDTO.getNewLoginName())
+                        || StringUtils.isBlank(markerDTO.getPassword())) {
                     continue;
                 }
                 MarkerExcelError markerExcelError = checkExcelData(markerDTO, current);
@@ -444,8 +465,8 @@ public class MarkerController extends BaseExamController {
                     marker.setPassword(markerDTO.getPassword());
                     saveList.add(marker);
                 } else {
-                    failureMsg.append("<br/>科目代码(" + markerDTO.getSubjectCode() + ")原评卷员(" + markerDTO.getLoginName() + ")更换新评卷员为("
-                            + markerDTO.getNewLoginName() + ")失败!");
+                    failureMsg.append("<br/>科目代码(" + markerDTO.getSubjectCode() + ")原评卷员(" + markerDTO.getLoginName()
+                            + ")更换新评卷员为(" + markerDTO.getNewLoginName() + ")失败!");
                     failureMsg.append("---->失败原因:(" + markerExcelError.getName() + ")");
                     failureNum++;
                 }
@@ -462,13 +483,15 @@ public class MarkerController extends BaseExamController {
         return "redirect:" + "/admin/exam/marker";
     }
 
-    private MarkerExcelError checkLongNameAndPassword(Marker marker, Map<String, ExamSubject> current, Map<String, Marker> saveMap) {
+    private MarkerExcelError checkLongNameAndPassword(Marker marker, Map<String, ExamSubject> current,
+            Map<String, Marker> saveMap) {
         Marker previous = null;
 
         if (current != null && current.get(marker.getSubjectCode()) == null) {
             return MarkerExcelError.MARKERNOTCODE;
         }
-        MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), Integer.valueOf(marker.getGroupName()));
+        MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(),
+                Integer.valueOf(marker.getGroupName()));
         if (group == null) {
             return MarkerExcelError.MARKERNOTGROUP;
         } else {
@@ -495,7 +518,7 @@ public class MarkerController extends BaseExamController {
     }
 
     // 校验excel中数据
-    public MarkerExcelError checkExcelData(MarkerDTO markerDTO, Map<String, Marker> current) {
+    private MarkerExcelError checkExcelData(MarkerDTO markerDTO, Map<String, Marker> current) {
         if (markerDTO != null) {
             Marker marker = null;
             if (current == null) {
@@ -540,14 +563,16 @@ public class MarkerController extends BaseExamController {
         return "redirect:/admin/exam/marker";
     }
 
+    @Logging(menu = "评卷员班级绑定", type = LogType.UPDATE)
     @RequestMapping(value = "/class/{markerId}", method = RequestMethod.POST)
-    public String classSave(@PathVariable Integer markerId, @RequestParam(required = false) String[] classes, Model model,
-            RedirectAttributes redirectAttributes) {
+    public String classSave(@PathVariable Integer markerId, @RequestParam(required = false) String[] classes,
+            Model model, RedirectAttributes redirectAttributes) {
         Marker marker = markerService.findById(markerId);
         if (marker != null) {
             classService.save(marker, classes);
             addMessage(redirectAttributes, "保存'" + marker.getLoginName() + "'成功");
-            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";
@@ -560,8 +585,8 @@ public class MarkerController extends BaseExamController {
         Marker marker = markerService.findById(markerId);
         if (exam != null && marker != null && exam.getId().equals(marker.getExamId())) {
             model.addAttribute("marker", marker);
-            model.addAttribute("openAccountList", userService
-                    .listUnbindOpenAccount(exam.getSchoolId(), marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber()));
+            model.addAttribute("openAccountList", userService.listUnbindOpenAccount(exam.getSchoolId(),
+                    marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber()));
             return "modules/exam/markerAccount";
         }
         addMessage(redirectAttributes, "评卷员不存在");
@@ -580,8 +605,8 @@ public class MarkerController extends BaseExamController {
         if (oa == null || !oa.isEnable()) {
             return false;
         }
-        if (markerService.countByExamAndSubjectAndGroupAndOpenAccount(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
-                accountId) == 0) {
+        if (markerService.countByExamAndSubjectAndGroupAndOpenAccount(marker.getExamId(), marker.getSubjectCode(),
+                marker.getGroupNumber(), accountId) == 0) {
             markerService.updateOpenAccountById(markerId, accountId);
             return true;
         }

+ 8 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -41,8 +41,10 @@ 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.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
+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.LogType;
 import cn.com.qmth.stmms.common.enums.ObjectivePolicy;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
@@ -68,6 +70,7 @@ public class PaperController extends BaseExamController {
     @Value("${card.server}")
     private String cardServer;
 
+    @Logging(menu = "试卷管理查询", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ExamSubjectSearchQuery query,
             @RequestParam(required = false) Boolean upload) {
@@ -94,6 +97,7 @@ public class PaperController extends BaseExamController {
         return "modules/exam/paperList";
     }
 
+    @Logging(menu = "科目详情", type = LogType.QUERY)
     @RequestMapping("/detail")
     public String detail(Model model, HttpServletRequest request, @RequestParam String subjectCode,
             @RequestParam(required = false) Boolean objective) {
@@ -137,6 +141,7 @@ public class PaperController extends BaseExamController {
         return "redirect:/admin/exam/paper";
     }
 
+    @Logging(menu = "导出客/主观题", type = LogType.EXPORT)
     @RequestMapping(value = "/export")
     public String exportFile(HttpServletRequest request, HttpServletResponse response, @RequestParam Boolean objective,
             RedirectAttributes redirectAttributes) {
@@ -179,6 +184,7 @@ public class PaperController extends BaseExamController {
         return "redirect:/admin/exam/paper";
     }
 
+    @Logging(menu = "导入客/主观题", type = LogType.IMPORT_FILE)
     @RequestMapping(value = "/import", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String importFile(HttpServletRequest request, MultipartFile file, @RequestParam Boolean objective,
@@ -233,6 +239,7 @@ public class PaperController extends BaseExamController {
             if (success > 0) {
                 subjectService.updateTotalScore(examId);
             }
+            RequestUtils.setLog(request, success + "个科目导入成功;");
         }
         if (error.size() > 0) {
             error.add("<br\\> 导入完毕后请重新统分!");
@@ -291,6 +298,7 @@ public class PaperController extends BaseExamController {
         return "modules/exam/questionEdit";
     }
 
+    @Logging(menu = "编辑题目判分策略", type = LogType.UPDATE)
     @RequestMapping(value = "/question-edit", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String update(@RequestParam Integer id, @RequestParam ObjectivePolicy objectivePolicy) {

+ 3 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ProblemHistoryController.java

@@ -29,7 +29,9 @@ import cn.com.qmth.stmms.biz.mark.model.ProblemType;
 import cn.com.qmth.stmms.biz.mark.query.ProblemHistorySearchQuery;
 import cn.com.qmth.stmms.biz.mark.service.ProblemHistoryService;
 import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.enums.HistoryStatus;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 
@@ -60,6 +62,7 @@ public class ProblemHistoryController extends BaseExamController {
     @Autowired
     private ExamQuestionService questionService;
 
+    @Logging(menu = "问题卷查询", type = LogType.QUERY)
     @RequestMapping
     public String list(HttpServletRequest request, Model model, ProblemHistorySearchQuery query) {
         int examId = getSessionExamId(request);

+ 7 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ProblemTypeController.java

@@ -23,7 +23,9 @@ import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.biz.mark.model.ProblemType;
 import cn.com.qmth.stmms.biz.mark.service.ProblemHistoryService;
 import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
 @Controller
@@ -38,6 +40,7 @@ public class ProblemTypeController extends BaseExamController {
     @Autowired
     private ProblemHistoryService historyService;
 
+    @Logging(menu = "查询问题卷分类", type = LogType.QUERY)
     @RequestMapping
     public String list(HttpServletRequest request, Model model, @RequestParam(required = false) Integer examId) {
         if (examId != null) {
@@ -55,6 +58,7 @@ public class ProblemTypeController extends BaseExamController {
         return "modules/exam/problemForm";
     }
 
+    @Logging(menu = "新增问题卷分类", type = LogType.ADD)
     @RequestMapping("/save")
     public String save(HttpServletRequest request, ProblemType problem, RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
@@ -81,6 +85,7 @@ public class ProblemTypeController extends BaseExamController {
         return "modules/exam/problemEdit";
     }
 
+    @Logging(menu = "编辑问题卷分类", type = LogType.UPDATE)
     @RequestMapping(value = "/edit", method = RequestMethod.POST)
     public String examEdit(HttpServletRequest request, ProblemType problem) {
         WebUser user = RequestUtils.getWebUser(request);
@@ -92,6 +97,7 @@ public class ProblemTypeController extends BaseExamController {
         return "redirect:/admin/exam/problem/type";
     }
 
+    @Logging(menu = "删除问题卷分类", type = LogType.DELETE)
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
     @ResponseBody
     public Object delete(HttpServletRequest request, RedirectAttributes redirectAttributes,
@@ -105,6 +111,7 @@ public class ProblemTypeController extends BaseExamController {
         } else {
             problemService.deleteById(problemId);
             result.accumulate("success", true);
+            RequestUtils.setLog(request, "删除成功,id:" + problemId);
         }
         return result;
     }

+ 10 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScanController.java

@@ -25,7 +25,9 @@ import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -55,6 +57,7 @@ public class ScanController extends BaseExamController {
      * @param query
      * @return
      */
+    @Logging(menu = "扫描进度-按科目查询", type = LogType.QUERY)
     @RequestMapping(value = { "", "/subject" })
     public ModelAndView progress(HttpServletRequest request, Model model, ExamSubjectSearchQuery query) {
         WebUser wu = RequestUtils.getWebUser(request);
@@ -65,8 +68,11 @@ public class ScanController extends BaseExamController {
         query = subjectService.findByQuery(query);
         for (ExamSubject subject : query.getResult()) {
             ScanInfoVO vo = new ScanInfoVO();
-            vo.setName(subject.getCode() + "-" + subject.getName() + (StringUtils.isNotBlank(subject.getRemark())
-                    ? ("-" + StringUtils.trimToEmpty(subject.getRemark())) : ""));
+            vo.setName(subject.getCode()
+                    + "-"
+                    + subject.getName()
+                    + (StringUtils.isNotBlank(subject.getRemark()) ? ("-" + StringUtils.trimToEmpty(subject.getRemark()))
+                            : ""));
             vo.setTotalCount(studentService.countByExamIdAndSubjectCode(examId, subject.getCode()));
             vo.setScanCount(studentService.countByExamIdAndSubjectCode(examId, subject.getCode(), true));
             list.add(vo);
@@ -89,6 +95,7 @@ public class ScanController extends BaseExamController {
      * @param subjectCode
      * @return
      */
+    @Logging(menu = "扫描进度-按学习中心查询", type = LogType.QUERY)
     @RequestMapping("/campus")
     public ModelAndView campus(HttpServletRequest request, ExamStudentSearchQuery query) {
         int examId = getSessionExamId(request);
@@ -129,6 +136,7 @@ public class ScanController extends BaseExamController {
      * @param request
      * @return
      */
+    @Logging(menu = "扫描进度-按签到表查询", type = LogType.QUERY)
     @RequestMapping("/package")
     public ModelAndView packageProgress(HttpServletRequest request, ExamPackageSearchQuery query) {
         int examId = getSessionExamId(request);

+ 33 - 21
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -44,9 +44,11 @@ import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.report.service.ReportService;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
+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.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
@@ -103,8 +105,10 @@ public class ScoreController extends BaseExamController {
     @Value("${json.server}")
     private String jsonServer;
 
+    @Logging(menu = "成绩查询", type = LogType.QUERY)
     @RequestMapping
-    public ModelAndView list(HttpServletRequest request, ExamStudentSearchQuery query, @RequestParam(defaultValue = "0") Integer filter) {
+    public ModelAndView list(HttpServletRequest request, ExamStudentSearchQuery query,
+            @RequestParam(defaultValue = "0") Integer filter) {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         String subjectCode = RequestUtils.getSession(request).getParameter("subjectCode");
@@ -127,12 +131,11 @@ public class ScoreController extends BaseExamController {
             buildSheetUrl(student);
             buildPackageUrl(student);
             buildAnswerUrl(student);
-            student.setAnswerUrl(PictureUrlBuilder
-                    .getAnswerJson(student.getExamId(), student.getSubjectCode(), student.getPaperType(), student.getExamNumber()));
+            student.setAnswerUrl(PictureUrlBuilder.getAnswerJson(student.getExamId(), student.getSubjectCode(),
+                    student.getPaperType(), student.getExamNumber()));
         }
-        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ?
-                enableExport(examId, query.getSubjectCode()) :
-                enableExport(examId);
+        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ? enableExport(examId,
+                query.getSubjectCode()) : enableExport(examId);
         if (exportMessage != null) {
             view.addObject("exportMessage", exportMessage);
             view.addObject("enableExport", false);
@@ -152,8 +155,10 @@ public class ScoreController extends BaseExamController {
         return view;
     }
 
+    @Logging(menu = "分数详情", type = LogType.QUERY)
     @RequestMapping("/detail")
-    public ModelAndView detail(HttpServletRequest request, @RequestParam String examNumber, @RequestParam String queryString) {
+    public ModelAndView detail(HttpServletRequest request, @RequestParam String examNumber,
+            @RequestParam String queryString) {
         int examId = getSessionExamId(request);
         ExamStudent student = studentService.findByExamIdAndExamNumber(examId, examNumber);
         if (student != null) {
@@ -173,6 +178,7 @@ public class ScoreController extends BaseExamController {
         }
     }
 
+    @Logging(menu = "修改分数详情", type = LogType.UPDATE)
     @RequestMapping("/edit")
     @ResponseBody
     @RoleRequire(Role.SCHOOL_ADMIN)
@@ -206,26 +212,27 @@ public class ScoreController extends BaseExamController {
         return result;
     }
 
+    @Logging(menu = "重新统分", type = LogType.UPDATE)
     @RequestMapping("/calculate")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public ModelAndView calculate(HttpServletRequest request) {
         int examId = getSessionExamId(request);
         if (lockService.trylock(LockType.SCORE_CALCULATE, examId)) {
-            ScoreCalculateThread thread = new ScoreCalculateThread(examId, lockService, studentService, questionService, markService,
-                    reportService, examService, subjectService, groupService);
+            ScoreCalculateThread thread = new ScoreCalculateThread(examId, lockService, studentService,
+                    questionService, markService, reportService, examService, subjectService, groupService);
             taskExecutor.submit(thread);
         }
         return new ModelAndView("redirect:/admin/exam/score");
     }
 
+    @Logging(menu = "导出成绩", type = LogType.EXPORT)
     @RequestMapping("/export")
     public String export(ExamStudentSearchQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ?
-                enableExport(examId, query.getSubjectCode()) :
-                enableExport(examId);
+        String exportMessage = StringUtils.isNotBlank(query.getSubjectCode()) ? enableExport(examId,
+                query.getSubjectCode()) : enableExport(examId);
         if (exportMessage == null && StringUtils.isNotBlank(query.getSubjectCode())) {
             exportMessage = enableExport(examId, query.getSubjectCode());
         }
@@ -268,7 +275,8 @@ public class ScoreController extends BaseExamController {
 
     private List<String> getOptionHeader(int examId, String subjectCode, String paerType) {
         List<String> headerList = new ArrayList<String>();
-        List<ExamQuestion> oQuestions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(examId, subjectCode, true, paerType);
+        List<ExamQuestion> oQuestions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(examId,
+                subjectCode, true, paerType);
         List<ExamQuestion> sQestions = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false);
         for (ExamQuestion examQuestion : oQuestions) {
             headerList.add(getTitle(examQuestion) + "选项");
@@ -324,8 +332,8 @@ public class ScoreController extends BaseExamController {
     private List<ScoreItem> buildScoreList(ExamStudent student) {
         List<ScoreItem> scoreList = new LinkedList<ScoreItem>();
 
-        List<ExamQuestion> oList = questionService
-                .findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(), student.getSubjectCode(), true, student.getPaperType());
+        List<ExamQuestion> oList = questionService.findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(),
+                student.getSubjectCode(), true, student.getPaperType());
         List<ScoreItem> list1 = student.getScoreList(true);
         int index = 0;
         for (ExamQuestion question : oList) {
@@ -340,7 +348,8 @@ public class ScoreController extends BaseExamController {
         }
         scoreList.addAll(list1);
 
-        List<ExamQuestion> sList = questionService.findByExamAndSubjectAndObjective(student.getExamId(), student.getSubjectCode(), false);
+        List<ExamQuestion> sList = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
+                student.getSubjectCode(), false);
         List<ScoreItem> list2 = student.getScoreList(false);
         index = 0;
         for (ExamQuestion question : sList) {
@@ -360,14 +369,16 @@ public class ScoreController extends BaseExamController {
 
     private void buildSheetUrl(ExamStudent student) {
         // 改为内部原图浏览地址,直接附带标记内容
-        student.setSheetUrls(PictureUrlBuilder.getInnerSheetUrls(student.getExamId(), student.getExamNumber(), student.getSheetCount()));
+        student.setSheetUrls(PictureUrlBuilder.getInnerSheetUrls(student.getExamId(), student.getExamNumber(),
+                student.getSheetCount()));
     }
 
     private void buildPackageUrl(ExamStudent student) {
         if (StringUtils.isNotBlank(student.getPackageCode())) {
             ExamPackage ep = packageService.find(student.getExamId(), student.getPackageCode());
             if (ep != null && ep.getPicCount() > 0) {
-                student.setPackageUrls(PictureUrlBuilder.getPackageUrls(student.getExamId(), student.getPackageCode(), ep.getPicCount()));
+                student.setPackageUrls(PictureUrlBuilder.getPackageUrls(student.getExamId(), student.getPackageCode(),
+                        ep.getPicCount()));
             }
         }
     }
@@ -406,8 +417,8 @@ public class ScoreController extends BaseExamController {
 
         List<ExamSubject> subjects = subjectService.list(examId);
         for (ExamSubject examSubject : subjects) {
-            List<MarkGroup> groups = groupService
-                    .findByExamAndSubjectAndStatus(examId, examSubject.getCode(), MarkStatus.FORMAL, MarkStatus.TRIAL);
+            List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, examSubject.getCode(),
+                    MarkStatus.FORMAL, MarkStatus.TRIAL);
             if (groups != null && !groups.isEmpty()) {
                 String message = examSubject.getCode() + " 科目未评卷完成";
                 return message;
@@ -424,7 +435,8 @@ public class ScoreController extends BaseExamController {
             return message;
         }
 
-        List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subjectCode, MarkStatus.FORMAL, MarkStatus.TRIAL);
+        List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subjectCode, MarkStatus.FORMAL,
+                MarkStatus.TRIAL);
         if (groups != null && !groups.isEmpty()) {
             String message = subjectCode + " 科目未评卷完成";
             return message;

+ 21 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StudentController.java

@@ -38,8 +38,10 @@ 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.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.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.ImportExcel;
@@ -78,6 +80,7 @@ public class StudentController extends BaseExamController {
     @Value("${package.image.server}")
     private String packageServer;
 
+    @Logging(menu = "查询考生", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query) {
         WebUser wu = RequestUtils.getWebUser(request);
@@ -129,6 +132,7 @@ public class StudentController extends BaseExamController {
         return "modules/exam/studentForm";
     }
 
+    @Logging(menu = "新增(修改)考生", type = LogType.UPDATE)
     @RequestMapping(value = "/save")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String save(ExamStudent student, Model model, RedirectAttributes redirectAttributes,
@@ -213,9 +217,10 @@ public class StudentController extends BaseExamController {
         return "redirect:/admin/exam/student";
     }
 
+    @Logging(menu = "删除考生", type = LogType.DELETE)
     @RequestMapping(value = "/delete")
     @RoleRequire(Role.SCHOOL_ADMIN)
-    public String delete(Integer id, RedirectAttributes redirectAttributes) {
+    public String delete(Integer id, RedirectAttributes redirectAttributes, HttpServletRequest request) {
         ExamStudent student = studentService.findById(id);
         if (student != null) {
             studentService.deleteById(id);
@@ -226,6 +231,7 @@ public class StudentController extends BaseExamController {
                     (int) studentService.countUploadedByExamIdAndSubjectCode(student.getExamId(),
                             student.getSubjectCode()));
             addMessage(redirectAttributes, "删除考生成功");
+            RequestUtils.setLog(request, "删除成功,id:" + id);
         } else {
             addMessage(redirectAttributes, "找不到对应的考生");
         }
@@ -246,6 +252,7 @@ public class StudentController extends BaseExamController {
         return "redirect:/admin/exam/student";
     }
 
+    @Logging(menu = "导入考生", type = LogType.IMPORT_FILE)
     @RequestMapping(value = "/import", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String importFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
@@ -301,7 +308,9 @@ public class StudentController extends BaseExamController {
             if (failureNum > 0) {
                 failureMsg.insert(0, ",失败 " + failureNum + " 条用户");
             }
-            addMessage(redirectAttributes, "已成功导入 " + successNum + " 条用户" + failureMsg);
+            String message = "已成功导入 " + successNum + " 条用户";
+            addMessage(redirectAttributes, message + failureMsg);
+            RequestUtils.setLog(request, message);
         } catch (Exception e) {
             log.error("Batch import student error!", e);
             addMessage(redirectAttributes, "导入考生失败!失败信息:" + e.getMessage());
@@ -309,6 +318,7 @@ public class StudentController extends BaseExamController {
         return "redirect:/admin/exam/student";
     }
 
+    @Logging(menu = "导出考生", type = LogType.EXPORT)
     @RequestMapping(value = "/export", method = RequestMethod.POST)
     public String exportFile(ExamStudentSearchQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
@@ -363,6 +373,7 @@ public class StudentController extends BaseExamController {
         return "redirect:/admin/exam/student";
     }
 
+    @Logging(menu = "导入缺考名单", type = LogType.IMPORT_FILE)
     @RequestMapping(value = "/absentImport", method = RequestMethod.POST)
     public String absentImportFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
@@ -390,7 +401,9 @@ public class StudentController extends BaseExamController {
             if (failureNum > 0) {
                 failureMsg.insert(0, ",失败 " + failureNum + " 条用户");
             }
-            addMessage(redirectAttributes, "已成功导入 " + successNum + " 条用户" + failureMsg);
+            String message = "已成功导入 " + successNum + " 条用户";
+            addMessage(redirectAttributes, message + failureMsg);
+            RequestUtils.setLog(request, message);
         } catch (Exception e) {
             log.error("Batch import absentStudent error!", e);
             addMessage(redirectAttributes, "导入缺考考生失败!失败信息:" + e.getMessage());
@@ -412,6 +425,7 @@ public class StudentController extends BaseExamController {
         return "redirect:/admin/exam/student";
     }
 
+    @Logging(menu = "导入违纪名单", type = LogType.IMPORT_FILE)
     @RequestMapping(value = "/breachImport", method = RequestMethod.POST)
     public String breachImportFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
         int examId = getSessionExamId(request);
@@ -444,7 +458,9 @@ public class StudentController extends BaseExamController {
             if (failureNum > 0) {
                 failureMsg.insert(0, ",失败 " + failureNum + " 条用户");
             }
-            addMessage(redirectAttributes, "已成功导入 " + successNum + " 条用户" + failureMsg);
+            String message = "已成功导入 " + successNum + " 条用户";
+            addMessage(redirectAttributes, message + failureMsg);
+            RequestUtils.setLog(request, message);
         } catch (Exception e) {
             log.error("Batch import BreachStudent error!", e);
             addMessage(redirectAttributes, "导入违纪考生失败!失败信息:" + e.getMessage());
@@ -452,6 +468,7 @@ public class StudentController extends BaseExamController {
         return "redirect:/admin/exam/student";
     }
 
+    @Logging(menu = "违纪重置", type = LogType.UPDATE)
     @RequestMapping(value = "/updateBreach", method = RequestMethod.POST)
     @ResponseBody
     public JSONObject updateBreach(HttpServletRequest request, Integer id) {

+ 3 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/SubjectController.java

@@ -19,7 +19,9 @@ import org.springframework.web.bind.annotation.RequestParam;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 
 @Controller
@@ -38,6 +40,7 @@ public class SubjectController extends BaseExamController {
         return "modules/exam/subjectEdit";
     }
 
+    @Logging(menu = "科目设置原图遮盖", type = LogType.UPDATE)
     @SuppressWarnings("unchecked")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     @RoleRequire(Role.SCHOOL_ADMIN)

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

@@ -34,11 +34,13 @@ import cn.com.qmth.stmms.biz.mark.model.TrialLibrary;
 import cn.com.qmth.stmms.biz.mark.query.TrialLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.TrialService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.DateUtils;
@@ -83,6 +85,7 @@ public class TrialController extends BaseExamController {
     @Value("${json.server}")
     private String jsonServer;
 
+    @Logging(menu = "试评管理查询", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, TrialLibrarySearchQuery query,
             @RequestParam(required = false) LibraryStatus status) {
@@ -121,6 +124,7 @@ public class TrialController extends BaseExamController {
         return "modules/exam/trialList";
     }
 
+    @Logging(menu = "打回试评任务", type = LogType.UPDATE)
     @RequestMapping(value = "/reset", method = RequestMethod.POST)
     @ResponseBody
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
@@ -161,6 +165,7 @@ public class TrialController extends BaseExamController {
         return obj;
     }
 
+    @Logging(menu = "试评详情", type = LogType.QUERY)
     @RequestMapping(value = "/detail")
     @ResponseBody
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })

+ 4 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/home/AccountController.java

@@ -13,6 +13,8 @@ import cn.com.qmth.stmms.biz.school.model.School;
 import cn.com.qmth.stmms.biz.school.service.SchoolService;
 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.Md5EncryptUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -32,6 +34,7 @@ public class AccountController {
     @Autowired
     private SchoolService schoolService;
 
+    @Logging(menu = "用户详情", type = LogType.QUERY)
     @RequestMapping(value = "/info")
     public String info(HttpServletRequest request, Model model) {
         User currentUser = RequestUtils.getWebUser(request).getUser();
@@ -57,6 +60,7 @@ public class AccountController {
         return "modules/sys/userModifyPwd";
     }
 
+    @Logging(menu = "修改密码", type = LogType.UPDATE)
     @RequestMapping(value = "/modifyPwd", method = RequestMethod.POST)
     public String modifyPwd(HttpServletRequest request, String oldPassword, String newPassword, Model model) {
         User user = RequestUtils.getWebUser(request).getUser();

+ 60 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/log/OperationLogController.java

@@ -0,0 +1,60 @@
+package cn.com.qmth.stmms.admin.log;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import cn.com.qmth.stmms.admin.exam.BaseExamController;
+import cn.com.qmth.stmms.biz.exam.model.OperationLog;
+import cn.com.qmth.stmms.biz.exam.query.OperationLogSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
+import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+
+@Controller
+@RequestMapping("/admin/operation/log")
+public class OperationLogController extends BaseExamController {
+
+    protected static Logger log = LoggerFactory.getLogger(OperationLogController.class);
+
+    @Autowired
+    private OperationLogService logService;
+
+    @Autowired
+    private ExamService examService;
+
+    @RequestMapping
+    public String list(HttpServletRequest request, Model model, OperationLogSearchQuery query) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        if (query.getExamId() == null) {
+            query.setExamId(0);
+        }
+        query.setSchoolId(wu.getUser().getSchoolId());
+        query.orderByCreateTime();
+        query = logService.findByQuery(query);
+        Map<Integer, String> map = new HashMap<Integer, String>();
+        for (OperationLog log : query.getResult()) {
+            String examName = map.get(log.getExamId());
+            if (examName == null && log.getExamId() != null) {
+                map.put(log.getExamId(), examService.findById(log.getExamId()).getName());
+            }
+            log.setExamName(map.get(log.getExamId()));
+        }
+
+        model.addAttribute("query", query);
+        model.addAttribute("examList", examService.findBySchoolId(wu.getUser().getSchoolId()));
+        model.addAttribute("typeList", LogType.values());
+        return "modules/log/logList";
+    }
+
+}

+ 7 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectClassController.java

@@ -20,7 +20,9 @@ import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -39,12 +41,12 @@ public class ReportSubjectClassController extends BaseExamController {
     @Autowired
     private ReportSubjectClassService reportSubjectClassService;
 
-
+    @Logging(menu = "课程班级分析", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ReportSubjectQuery query) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
@@ -58,13 +60,14 @@ public class ReportSubjectClassController extends BaseExamController {
         model.addAttribute("query", query);
         return "modules/report/reportSubjectClass";
     }
-    
+
+    @Logging(menu = "课程班级分析导出", type = LogType.EXPORT)
     @RequestMapping("/export")
     public String export(ReportSubjectQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);

+ 6 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectCollegeController.java

@@ -20,7 +20,9 @@ import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectCollege;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectCollegeService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -39,11 +41,12 @@ public class ReportSubjectCollegeController extends BaseExamController {
     @Autowired
     private ReportSubjectCollegeService reportSubjectCollegeService;
 
+    @Logging(menu = "课程学院分析", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ReportSubjectQuery query) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
@@ -58,12 +61,13 @@ public class ReportSubjectCollegeController extends BaseExamController {
         return "modules/report/reportSubjectCollege";
     }
 
+    @Logging(menu = "课程班级分析导出", type = LogType.EXPORT)
     @RequestMapping("/export")
     public String export(ReportSubjectQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);

+ 6 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectController.java

@@ -19,7 +19,9 @@ import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.report.model.ReportSubject;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -38,12 +40,13 @@ public class ReportSubjectController extends BaseExamController {
     @Autowired
     private ReportSubjectService reportSubjectService;
 
+    @Logging(menu = "课程总量统计", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ReportSubjectQuery query) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         query.setExamId(examId);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query = reportSubjectService.findByQuery(query);
@@ -55,12 +58,13 @@ public class ReportSubjectController extends BaseExamController {
         return "modules/report/reportSubject";
     }
 
+    @Logging(menu = "课程总量统计导出", type = LogType.EXPORT)
     @RequestMapping("/export")
     public String export(ReportSubjectQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);

+ 6 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectGroupController.java

@@ -22,7 +22,9 @@ import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectGroup;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -44,11 +46,12 @@ public class ReportSubjectGroupController extends BaseExamController {
     @Autowired
     private MarkGroupService groupService;
 
+    @Logging(menu = "课程大题分析", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ReportSubjectQuery query) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
@@ -65,12 +68,13 @@ public class ReportSubjectGroupController extends BaseExamController {
         return "modules/report/reportSubjectGroup";
     }
 
+    @Logging(menu = "课程大题分析导出", type = LogType.EXPORT)
     @RequestMapping("/export")
     public String export(ReportSubjectQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);

+ 13 - 7
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectQuestionController.java

@@ -21,7 +21,9 @@ import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -39,20 +41,22 @@ public class ReportSubjectQuestionController extends BaseExamController {
 
     @Autowired
     private ReportSubjectQuestionService reportSubjectQuestionService;
-    
+
     @Autowired
     private ExamQuestionService questionService;
 
+    @Logging(menu = "课程小题分析", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ReportSubjectQuery query) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
-        }        query.setExamId(examId);
+        }
+        query.setExamId(examId);
         query.setPageNumber(1);
         query.setPageSize(Integer.MAX_VALUE);
-        if (StringUtils.isNotBlank(query.getSubjectCode())&&query.getObjective()!=null) {
+        if (StringUtils.isNotBlank(query.getSubjectCode()) && query.getObjective() != null) {
             List<ReportSubjectQuestion> questions = reportSubjectQuestionService.findByQuery(query);
             model.addAttribute("list", questions);
             model.addAttribute("typeList", questionService.getPaperType(examId, query.getSubjectCode()));
@@ -62,12 +66,13 @@ public class ReportSubjectQuestionController extends BaseExamController {
         return "modules/report/reportSubjectQuestion";
     }
 
+    @Logging(menu = "课程小题分析导出", type = LogType.EXPORT)
     @RequestMapping("/export")
     public String export(ReportSubjectQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
@@ -80,9 +85,10 @@ public class ReportSubjectQuestionController extends BaseExamController {
             r.setScoreRate(new BigDecimal(r.getScoreRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
             r.setFullScoreRate(new BigDecimal(r.getFullScoreRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
         }
-        String fileName = query.getObjective()?"客观题统计分析.xlsx":"主观题统计分析.xlsx";
+        String fileName = query.getObjective() ? "客观题统计分析.xlsx" : "主观题统计分析.xlsx";
         try {
-            new ExportExcel(query.getObjective()?"客观题统计分析":"主观题统计分析", ReportSubjectQuestion.class).setDataList(list).write(response, fileName).dispose();
+            new ExportExcel(query.getObjective() ? "客观题统计分析" : "主观题统计分析", ReportSubjectQuestion.class)
+                    .setDataList(list).write(response, fileName).dispose();
             return null;
         } catch (Exception e) {
             addMessage(redirectAttributes, "导出成绩失败!" + e.getMessage());

+ 16 - 10
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectRangeController.java

@@ -19,7 +19,9 @@ import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectRangeQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -38,13 +40,14 @@ public class ReportSubjectRangeController extends BaseExamController {
     @Autowired
     private ReportSubjectRangeService reportSubjectRangeService;
 
+    @Logging(menu = "课程分段统计", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ReportSubjectRangeQuery query) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         // reportSubjectRangeService.saveReportRangeSubjectData(1);
         query.setExamId(examId);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query = reportSubjectRangeService.findByQuery(query);
@@ -56,12 +59,13 @@ public class ReportSubjectRangeController extends BaseExamController {
         return "modules/report/reportSubjectRange";
     }
 
+    @Logging(menu = "课程分段统计导出", type = LogType.EXPORT)
     @RequestMapping("/export")
     public String export(ReportSubjectRangeQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
@@ -70,14 +74,16 @@ public class ReportSubjectRangeController extends BaseExamController {
         query = reportSubjectRangeService.findByQuery(query);
         List<ReportSubjectRange> list = query.getResult();
         for (ReportSubjectRange r : list) {
-            r.setPercent0_49(new BigDecimal(r.getPercent0_49()*100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent50_59(new BigDecimal(r.getPercent50_59()*100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent60_69(new BigDecimal(r.getPercent60_69()*100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent70_79(new BigDecimal(r.getPercent70_79()*100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent80_89(new BigDecimal(r.getPercent80_89()*100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent90_100(new BigDecimal(r.getPercent90_100()*100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent_lt60(new BigDecimal(r.getPercent_lt60()*100).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setPercent_mte60(new BigDecimal(r.getPercent_mte60()*100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent0_49(new BigDecimal(r.getPercent0_49() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent50_59(new BigDecimal(r.getPercent50_59() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent60_69(new BigDecimal(r.getPercent60_69() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent70_79(new BigDecimal(r.getPercent70_79() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent80_89(new BigDecimal(r.getPercent80_89() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent90_100(new BigDecimal(r.getPercent90_100() * 100).setScale(2, RoundingMode.HALF_UP)
+                    .doubleValue());
+            r.setPercent_lt60(new BigDecimal(r.getPercent_lt60() * 100).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setPercent_mte60(new BigDecimal(r.getPercent_mte60() * 100).setScale(2, RoundingMode.HALF_UP)
+                    .doubleValue());
         }
         String fileName = "课程分段统计.xlsx";
         try {

+ 16 - 9
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectTeacherClassController.java

@@ -22,7 +22,9 @@ import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacherClass;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherClassService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -44,21 +46,23 @@ public class ReportSubjectTeacherClassController extends BaseExamController {
     @Autowired
     private ExamSubjectService subjectService;
 
-
+    @Logging(menu = "课程教师班级分析", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ReportSubjectQuery query) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
-        }        query.setExamId(examId);
+        }
+        query.setExamId(examId);
         query.setPageNumber(1);
         query.setPageSize(Integer.MAX_VALUE);
         if (StringUtils.isNotBlank(query.getSubjectCode()) && StringUtils.isNotBlank(query.getTeacherName())) {
-            List<ReportSubjectTeacherClass> reportSubjectTeacherClasses = reportSubjectTeacherClassService.findByQuery(query);
+            List<ReportSubjectTeacherClass> reportSubjectTeacherClasses = reportSubjectTeacherClassService
+                    .findByQuery(query);
             model.addAttribute("list", reportSubjectTeacherClasses);
-            ExamSubject subject = subjectService.find(examId,query.getSubjectCode());
-            model.addAttribute("subjectName", subject.getCode()+"-"+subject.getName());
+            ExamSubject subject = subjectService.find(examId, query.getSubjectCode());
+            model.addAttribute("subjectName", subject.getCode() + "-" + subject.getName());
         }
 
         model.addAttribute("subjectList", getExamSubject(examId, webuser));
@@ -66,12 +70,13 @@ public class ReportSubjectTeacherClassController extends BaseExamController {
         return "modules/report/reportSubjectTeacherClass";
     }
 
+    @Logging(menu = "课程教师班级分析导出", type = LogType.EXPORT)
     @RequestMapping("/export")
     public String export(ReportSubjectQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
@@ -82,11 +87,13 @@ public class ReportSubjectTeacherClassController extends BaseExamController {
             r.setAvgScore(new BigDecimal(r.getAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
             r.setExcellentRate(new BigDecimal(r.getExcellentRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
             r.setPassRate(new BigDecimal(r.getPassRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setRelativeAvgScore(new BigDecimal(r.getRelativeAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setRelativeAvgScore(new BigDecimal(r.getRelativeAvgScore()).setScale(2, RoundingMode.HALF_UP)
+                    .doubleValue());
         }
         String fileName = "课程老师班级成绩分析.xlsx";
         try {
-            new ExportExcel("课程老师班级成绩分析", ReportSubjectTeacherClass.class).setDataList(list).write(response, fileName).dispose();
+            new ExportExcel("课程老师班级成绩分析", ReportSubjectTeacherClass.class).setDataList(list).write(response, fileName)
+                    .dispose();
             return null;
         } catch (Exception e) {
             addMessage(redirectAttributes, "导出成绩失败!" + e.getMessage());

+ 8 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/admin/report/ReportSubjectTeacherController.java

@@ -20,7 +20,9 @@ import cn.com.qmth.stmms.admin.exam.BaseExamController;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectTeacher;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -39,11 +41,12 @@ public class ReportSubjectTeacherController extends BaseExamController {
     @Autowired
     private ReportSubjectTeacherService reportSubjectTeacherService;
 
+    @Logging(menu = "课程老师分析", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ReportSubjectQuery query) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
@@ -58,12 +61,13 @@ public class ReportSubjectTeacherController extends BaseExamController {
         return "modules/report/reportSubjectTeacher";
     }
 
+    @Logging(menu = "课程老师分析导出", type = LogType.EXPORT)
     @RequestMapping("/export")
     public String export(ReportSubjectQuery query, HttpServletRequest request, HttpServletResponse response,
             RedirectAttributes redirectAttributes) {
         WebUser webuser = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        if(webuser.isSubjectHeader()) {
+        if (webuser.isSubjectHeader()) {
             query.setSubjectCode(webuser.getUser().getSubjectCode());
         }
         query.setExamId(examId);
@@ -74,7 +78,8 @@ public class ReportSubjectTeacherController extends BaseExamController {
             r.setAvgScore(new BigDecimal(r.getAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
             r.setExcellentRate(new BigDecimal(r.getExcellentRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
             r.setPassRate(new BigDecimal(r.getPassRate()).setScale(2, RoundingMode.HALF_UP).doubleValue());
-            r.setRelativeAvgScore(new BigDecimal(r.getRelativeAvgScore()).setScale(2, RoundingMode.HALF_UP).doubleValue());
+            r.setRelativeAvgScore(new BigDecimal(r.getRelativeAvgScore()).setScale(2, RoundingMode.HALF_UP)
+                    .doubleValue());
         }
         String fileName = "课程老师成绩分析.xlsx";
         try {

+ 10 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/school/SchoolController.java

@@ -15,7 +15,9 @@ import cn.com.qmth.stmms.biz.school.query.SchoolSearchQuery;
 import cn.com.qmth.stmms.biz.school.service.SchoolService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.user.service.UserService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.controller.BaseController;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
 
@@ -29,6 +31,7 @@ public class SchoolController extends BaseController {
     @Autowired
     private UserService userService;
 
+    @Logging(menu = "学校查询", type = LogType.QUERY)
     @RequestMapping
     public ModelAndView list(HttpServletRequest request, SchoolSearchQuery query) {
         ModelAndView view = new ModelAndView("modules/sys/schoolList");
@@ -56,6 +59,7 @@ public class SchoolController extends BaseController {
         }
     }
 
+    @Logging(menu = "新增(修改)学校", type = LogType.UPDATE)
     @RequestMapping(value = "/save", method = RequestMethod.POST)
     public String save(HttpServletRequest request, School school) {
         School previous = null;
@@ -82,7 +86,8 @@ public class SchoolController extends BaseController {
     }
 
     @RequestMapping(value = "/admin", method = RequestMethod.GET)
-    public ModelAndView adminInit(HttpServletRequest request, @RequestParam Integer id, @RequestParam(required = false) String message) {
+    public ModelAndView adminInit(HttpServletRequest request, @RequestParam Integer id,
+            @RequestParam(required = false) String message) {
         School school = schoolService.findById(id);
         if (school != null) {
             User user = userService.findSchoolAdmin(id);
@@ -100,6 +105,7 @@ public class SchoolController extends BaseController {
         }
     }
 
+    @Logging(menu = "编辑学校管理员", type = LogType.UPDATE)
     @RequestMapping(value = "/admin/save", method = RequestMethod.POST)
     public ModelAndView adminSave(HttpServletRequest request, User user) {
         School school = schoolService.findById(user.getSchoolId());
@@ -135,7 +141,8 @@ public class SchoolController extends BaseController {
     }
 
     @RequestMapping(value = "/viewer", method = RequestMethod.GET)
-    public ModelAndView viewerInit(HttpServletRequest request, @RequestParam Integer id, @RequestParam(required = false) String message) {
+    public ModelAndView viewerInit(HttpServletRequest request, @RequestParam Integer id,
+            @RequestParam(required = false) String message) {
         School school = schoolService.findById(id);
         if (school != null) {
             User user = userService.findSchoolViewer(id);
@@ -153,6 +160,7 @@ public class SchoolController extends BaseController {
         }
     }
 
+    @Logging(menu = "编辑学校查询员", type = LogType.UPDATE)
     @RequestMapping(value = "/viewer/save", method = RequestMethod.POST)
     public ModelAndView viewerSave(HttpServletRequest request, User user) {
         School school = schoolService.findById(user.getSchoolId());

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

@@ -17,8 +17,10 @@ import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 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.annotation.Logging;
 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.utils.Md5EncryptUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
@@ -32,6 +34,7 @@ public class UserController extends BaseController {
     @Autowired
     private UserService userService;
 
+    @Logging(menu = "查询用户", type = LogType.QUERY)
     @RequestMapping("/list")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public ModelAndView list(HttpServletRequest request, UserSearchQuery query) {
@@ -45,6 +48,7 @@ public class UserController extends BaseController {
         return view;
     }
 
+    @Logging(menu = "删除用户", type = LogType.DELETE)
     @RequestMapping("/delete")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String delete(HttpServletRequest request, RedirectAttributes redirectAttributes, @RequestParam Integer id) {
@@ -60,6 +64,7 @@ public class UserController extends BaseController {
             message = "删除成功";
         }
         redirectAttributes.addFlashAttribute("message", message);
+        RequestUtils.setLog(request, message + "id:" + id);
         return "redirect:/admin/user/list";
     }
 
@@ -89,6 +94,7 @@ 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) {

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

@@ -1,19 +1,30 @@
 package cn.com.qmth.stmms.api.controller;
 
+import java.text.DecimalFormat;
+import java.util.Date;
+
 import javax.servlet.http.HttpServletRequest;
 
 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;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import cn.com.qmth.stmms.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.ExamSubjectService;
+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;
 
 @Controller("coreApiController")
 @RequestMapping("/api/core")
@@ -23,37 +34,173 @@ public class CoreController extends BaseApiController {
     private ExamService examService;
 
     @Autowired
-    private ExamSubjectService subjectService;
+    private ExamStudentService studentService;
 
     @RequestMapping(value = "/exam/save", method = RequestMethod.POST)
     @ResponseBody
-    public JSONObject save(HttpServletRequest request, Exam exam) {
+    public JSONObject save(HttpServletRequest request, @RequestParam(required = false) Integer id,
+            @RequestParam(required = false) String code, @RequestParam String name,
+            @RequestParam(required = false) String examTime) {
         JSONObject result = new JSONObject();
-        exam = examService.save(exam);
-        result.accumulate("id", exam.getId());
-        result.accumulate("updateTime", exam.getId());
-        return result;
+        ApiUser user = RequestUtils.getApiUser(request);
+        if (id == null && code == null) {
+            Exam exam = new Exam();
+            exam.setName(exam.getName());
+            exam.setExamTime(DateUtils.parseDate(examTime));
+            exam = examService.save(exam);
+            result.accumulate("id", exam.getId());
+            result.accumulate("updateTime", DateUtils.formatDateTime(exam.getUpdateTime()));
+            return result;
+        }
+        Exam exam = null;
+        if (id != null) {
+            exam = examService.findById(id);
+        } else if (code != null) {
+            exam = examService.findByCode(user.getSchoolId(), code);
+        }
+        if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
+            exam.setName(name);
+            exam.setExamTime(DateUtils.parseDate(examTime));
+            exam = examService.save(exam);
+            result.accumulate("id", exam.getId());
+            result.accumulate("updateTime", DateUtils.formatDateTime(exam.getUpdateTime()));
+            return result;
+        } else {
+            throw ApiException.EXAM_NOT_ACCESSIBLED;
+        }
     }
 
     @RequestMapping(value = "/exam/student/save", method = RequestMethod.POST)
     @ResponseBody
-    public JSONObject studentSave(HttpServletRequest request) {
+    public JSONObject studentSave(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String examNumber, @RequestParam String studentCode, @RequestParam String name,
+            @RequestParam String college, @RequestParam String className, @RequestParam String teacher,
+            @RequestParam String subjectCode, @RequestParam String subjectName,
+            @RequestParam(required = false) String packageCode, @RequestParam(required = false) String paperType,
+            @RequestParam(required = false) String examSite, @RequestParam(required = false) String examRoom) {
+        Exam exam = examService.findById(examId);
+        if (exam == null) {
+            throw ApiException.EXAM_NOT_ACCESSIBLED;
+        }
+        ExamStudent student = studentService.findByExamIdAndExamNumber(examId, examNumber);
+        if (student == null) {
+            student = new ExamStudent();
+            student.setExamId(examId);
+            student.setExamNumber(examNumber);
+            student.setPackageCode(packageCode);
+
+            student.setSchoolId(exam.getSchoolId());
+            student.setAbsent(false);
+            student.setUpload(false);
+            student.setException(false);
+            student.setSliceCount(0);
+            student.setSheetCount(0);
+            student.setObjectiveScore(0d);
+            student.setSubjectiveScore(0d);
+        }
+        student.setStudentCode(studentCode);
+        student.setName(name);
+        student.setSubjectCode(subjectCode);
+        student.setSubjectName(subjectName);
+        student.setCollege(college);
+        student.setClassName(className);
+        student.setTeacher(teacher);
+        student.setPaperType(paperType);
+        student.setExamSite(examSite);
+        student.setExamRoom(examRoom);
+        studentService.save(student);
         JSONObject result = new JSONObject();
+        result.accumulate("updateTime", DateUtils.formatDateTime(new Date()));
         return result;
     }
 
     @RequestMapping(value = "/student/query", method = RequestMethod.POST)
     @ResponseBody
-    public JSONArray studentQuery(HttpServletRequest request) {
-        JSONArray result = new JSONArray();
-        return result;
+    public JSONArray studentQuery(HttpServletRequest request, @RequestParam String studentCode,
+            @RequestParam(required = false) String subjectCode, @RequestParam(required = false) Date minExamTime) {
+        JSONArray array = new JSONArray();
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setStudentCode(studentCode);
+        query.setSubjectCode(subjectCode);
+        query = studentService.findByQuery(query);
+        for (ExamStudent student : query.getResult()) {
+            Exam exam = examService.findById(student.getExamId());
+            if (minExamTime != null && minExamTime.after(exam.getExamTime())) {
+                JSONObject obj = new JSONObject();
+                obj.accumulate("examId", student.getExamId());
+                obj.accumulate("examCode", StringUtils.trimToEmpty(exam.getCode()));
+                obj.accumulate("examTime", DateUtils.pastDays(exam.getExamTime()));
+                obj.accumulate("examNumber", student.getExamNumber());
+                obj.accumulate("name", student.getName());
+                obj.accumulate("subjectCode", student.getSubjectCode());
+                obj.accumulate("subjectName", student.getSubjectName());
+                obj.accumulate("examSite", StringUtils.trimToEmpty(student.getExamSite()));
+                obj.accumulate("examRoom", StringUtils.trimToEmpty(student.getExamRoom()));
+                array.add(obj);
+            }
+        }
+        return array;
     }
 
     @RequestMapping(value = "/exam/student/score", method = RequestMethod.POST)
     @ResponseBody
-    public JSONArray getScore(HttpServletRequest request) {
-        JSONArray result = new JSONArray();
-        return result;
+    public JSONArray getScore(HttpServletRequest request, @RequestParam(required = false) Integer examId,
+            @RequestParam(required = false) String examCode, @RequestParam(required = false) String examNumber,
+            @RequestParam(required = false) String studentCode, @RequestParam(required = false) String subjectCode,
+            @RequestParam(required = false) String college, @RequestParam(required = false) String className,
+            @RequestParam(required = false) String teacher,
+            @RequestParam(required = false, defaultValue = "1") Integer pageNumber,
+            @RequestParam(required = false, defaultValue = "100") Integer pageSize) {
+        if (examId == null && examCode == null) {
+            throw ApiException.EXAM_NOT_ACCESSIBLED;
+        }
+        Exam exam = examService.findById(examId);
+        if (exam == null) {
+            ApiUser user = RequestUtils.getApiUser(request);
+            exam = examService.findByCode(user.getSchoolId(), examCode);
+        }
+        if (exam == null) {
+            throw ApiException.EXAM_NOT_ACCESSIBLED;
+        }
+        JSONArray array = new JSONArray();
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(exam.getId());
+        query.setExamNumber(examNumber);
+        query.setStudentCode(studentCode);
+        query.setSubjectCode(subjectCode);
+        query.setCollege(college);
+        query.setClassName(className);
+        query.setTeacher(teacher);
+        query = studentService.findByQuery(query);
+        for (ExamStudent student : query.getResult()) {
+            JSONObject obj = new JSONObject();
+            obj.accumulate("examId", exam.getId());
+            obj.accumulate("examCode", exam.getCode());
+            obj.accumulate("examNumber", student.getExamNumber());
+            obj.accumulate("studentCode", student.getStudentCode());
+            obj.accumulate("name", student.getName());
+            obj.accumulate("subjectCode", student.getSubjectCode());
+            obj.accumulate("subjectName", student.getSubjectName());
+            obj.accumulate("paperType", StringUtils.trimToEmpty(student.getPaperType()));
+            obj.accumulate("status", getStatus(student));
+            DecimalFormat df = new DecimalFormat("####.###");
+            obj.accumulate("totalScore", df.format(student.getTotalScore()));
+            obj.accumulate("objectiveScore", df.format(student.getObjectiveScore()));
+            obj.accumulate("subjectiveScore", df.format(student.getSubjectiveScore()));
+            obj.accumulate("objectiveScoreDetail", StringUtils.trimToEmpty(student.getObjectiveScoreList()));
+            obj.accumulate("subjectiveScoreDetail", StringUtils.trimToEmpty(student.getSubjectiveScoreList()));
+            array.add(obj);
+        }
+        return array;
     }
 
+    private int getStatus(ExamStudent student) {
+        if (student.isBreach()) {
+            return 3;
+        }
+        if (!student.isUpload() || student.isAbsent() || student.isManualAbsent()) {
+            return 2;
+        }
+        return 1;
+    }
 }

+ 5 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamInfoController.java

@@ -26,9 +26,11 @@ import cn.com.qmth.stmms.biz.exam.query.ExamSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
@@ -105,6 +107,7 @@ public class ExamInfoController extends BaseApiController {
         return array;
     }
 
+    @Logging(menu = "扫描端-修改科目信息", type = LogType.UPDATE)
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCANNER })
     @RequestMapping(value = "/subject/update", method = RequestMethod.POST)
     @ResponseBody
@@ -133,6 +136,7 @@ public class ExamInfoController extends BaseApiController {
         return result;
     }
 
+    @Logging(menu = "扫描端-修改考试裁切图坐标", type = LogType.UPDATE)
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCANNER })
     @RequestMapping(value = "/sliceConfig/{examId}", method = RequestMethod.POST)
     @ResponseBody
@@ -154,6 +158,7 @@ public class ExamInfoController extends BaseApiController {
         return success;
     }
 
+    @Logging(menu = "扫描端-修改科目裁切图坐标", type = LogType.UPDATE)
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCANNER })
     @RequestMapping(value = "/sliceConfig/{examId}/{subjectCode}", method = RequestMethod.POST)
     @ResponseBody

+ 8 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamPackageController.java

@@ -6,9 +6,12 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import cn.com.qmth.stmms.api.exception.ApiException;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -64,10 +67,12 @@ public class ExamPackageController extends BaseApiController {
         return array;
     }
 
+    @Logging(menu = "扫描端-修改签到表数量", type = LogType.UPDATE)
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCANNER })
     @RequestMapping(value = "/package/{examId}", method = RequestMethod.POST)
     @ResponseBody
-    public int updatePackage(HttpServletRequest request, @PathVariable Integer examId, @RequestBody ExamPackage examPackage) {
+    public int updatePackage(HttpServletRequest request, @PathVariable Integer examId,
+            @RequestBody ExamPackage examPackage) {
         Exam exam = examService.findById(examId);
         if (exam != null) {
             ExamPackage obj = packageService.find(examId, examPackage.getCode());
@@ -85,8 +90,8 @@ public class ExamPackageController extends BaseApiController {
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCANNER })
     @RequestMapping(value = "/package/count/{examId}", method = RequestMethod.GET)
     @ResponseBody
-    public JSONArray getPackageCount(HttpServletRequest request, HttpServletResponse response, @PathVariable Integer examId,
-            @RequestParam(required = false) Boolean upload) {
+    public JSONArray getPackageCount(HttpServletRequest request, HttpServletResponse response,
+            @PathVariable Integer examId, @RequestParam(required = false) Boolean upload) {
         ApiUser user = RequestUtils.getApiUser(request);
         JSONArray array = new JSONArray();
         Exam exam = examService.findById(examId);

+ 4 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamStudentController.java

@@ -7,8 +7,10 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 
 import cn.com.qmth.stmms.api.exception.ApiException;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
@@ -74,6 +76,7 @@ public class ExamStudentController extends BaseApiController {
     @Autowired
     private UserService userService;
 
+    @Logging(menu = "扫描端-上传人工指定缺考", type = LogType.UPDATE)
     @RoleRequire({ Role.SCHOOL_ADMIN })
     @RequestMapping(value = "/student/manualAbsent/{examId}", method = RequestMethod.POST)
     @ResponseBody
@@ -91,6 +94,7 @@ public class ExamStudentController extends BaseApiController {
         }
     }
 
+    @Logging(menu = "扫描端-清除人工指定缺考", type = LogType.UPDATE)
     @RoleRequire({ Role.SCHOOL_ADMIN })
     @RequestMapping(value = "/student/manualAbsent/clear", method = RequestMethod.POST)
     @ResponseBody

+ 3 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ScanController.java

@@ -3,6 +3,7 @@ package cn.com.qmth.stmms.api.controller;
 import javax.servlet.http.HttpServletRequest;
 
 import cn.com.qmth.stmms.api.exception.ApiException;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.enums.Role;
@@ -29,6 +30,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.common.enums.CheckType;
 import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -55,6 +57,7 @@ public class ScanController extends BaseApiController {
      * @param scStudentParameter
      * @return
      */
+    @Logging(menu = "扫描端-考生识别上传", type = LogType.UPDATE)
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SCANNER })
     @RequestMapping(value = "/student/{examId}", method = RequestMethod.POST)
     @ResponseBody

+ 17 - 9
stmms-web/src/main/java/cn/com/qmth/stmms/api/interceptor/ApiInterceptor.java

@@ -13,11 +13,13 @@ import cn.com.qmth.stmms.common.authorization.AuthorizationService;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.signature.SignatureInfo;
 import cn.com.qmth.stmms.common.signature.SignatureType;
 import cn.com.qmth.stmms.common.utils.AccessControlUtils;
 import cn.com.qmth.stmms.common.utils.Md5EncryptUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
+
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.method.HandlerMethod;
@@ -39,11 +41,14 @@ public class ApiInterceptor extends HandlerInterceptorAdapter {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private SessionService sessionService;
+
     @Override
     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
         HandlerMethod method = (HandlerMethod) handler;
         try {
-            return validate(request, method.getMethodAnnotation(RoleRequire.class));
+            return validate(request, response, method.getMethodAnnotation(RoleRequire.class));
         } catch (ApiException e) {
             response.sendError(e.getCode(), StringUtils.trimToEmpty(e.getMessage()));
             return false;
@@ -53,7 +58,7 @@ public class ApiInterceptor extends HandlerInterceptorAdapter {
         }
     }
 
-    private boolean validate(HttpServletRequest request, RoleRequire authConfig) {
+    private boolean validate(HttpServletRequest request, HttpServletResponse response, RoleRequire authConfig) {
         if (authConfig != null && authConfig.value().length > 0) {
             AuthInfo simple;
             // 优先按签名模式解析
@@ -70,11 +75,12 @@ public class ApiInterceptor extends HandlerInterceptorAdapter {
                     if (!matchRole(authConfig, Role.SCHOOL_DEV)) {
                         throw ApiException.USER_ROLE_INVALID;
                     }
-                    return buildApiUser(request, school);
+                    return buildApiUser(request, response, school);
                 } else if (info.getType() == SignatureType.TOKEN) {
                     User user = userService.findByLoginName(info.getInvoker());
-                    if (user == null || user.getAccessTokenRefreshTime() == null || AccessControlUtils
-                            .expired(user.getAccessTokenRefreshTime()) || !info.validate(user.getAccessToken())) {
+                    if (user == null || user.getAccessTokenRefreshTime() == null
+                            || AccessControlUtils.expired(user.getAccessTokenRefreshTime())
+                            || !info.validate(user.getAccessToken())) {
                         throw ApiException.SIGNATURE_INVALID;
                     }
                     if (!user.isEnable()) {
@@ -83,7 +89,7 @@ public class ApiInterceptor extends HandlerInterceptorAdapter {
                     if (matchRole(authConfig, user.getRole())) {
                         throw ApiException.USER_ROLE_INVALID;
                     }
-                    return buildApiUser(request, user);
+                    return buildApiUser(request, response, user);
                 } else {
                     throw ApiException.SIGNATURE_INVALID;
                 }
@@ -100,7 +106,7 @@ public class ApiInterceptor extends HandlerInterceptorAdapter {
                 if (!matchRole(authConfig, user.getRole())) {
                     throw ApiException.USER_ROLE_INVALID;
                 }
-                return buildApiUser(request, user);
+                return buildApiUser(request, response, user);
             } else {
                 throw ApiException.AUTHORIZATION_UNEXIST;
             }
@@ -122,13 +128,15 @@ public class ApiInterceptor extends HandlerInterceptorAdapter {
         }
     }
 
-    private boolean buildApiUser(HttpServletRequest request, School school) {
+    private boolean buildApiUser(HttpServletRequest request, HttpServletResponse response, School school) {
         RequestUtils.setApiUser(request, new ApiUser(school));
+        sessionService.put(request, response, RequestUtils.getSession(request));
         return true;
     }
 
-    private boolean buildApiUser(HttpServletRequest request, User user) {
+    private boolean buildApiUser(HttpServletRequest request, HttpServletResponse response, User user) {
         RequestUtils.setApiUser(request, new ApiUser(user));
+        sessionService.put(request, response, RequestUtils.getSession(request));
         return true;
     }
 

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

@@ -25,6 +25,7 @@ import cn.com.qmth.stmms.common.enums.ExamSubjectStatus;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.HistoryStatus;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
+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.ObjectivePolicy;
@@ -194,7 +195,18 @@ public class BaseController {
                 }
             }
         });
+        // LogType 类型转换
+        binder.registerCustomEditor(LogType.class, new PropertyEditorSupport() {
 
+            @Override
+            public void setAsText(String text) {
+                try {
+                    setValue(LogType.findByValue(Integer.valueOf(text)));
+                } catch (Exception e) {
+                    setValue(null);
+                }
+            }
+        });
         binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor(true));
     }
 

+ 27 - 7
stmms-web/src/main/java/cn/com/qmth/stmms/common/interceptor/LogInterceptor.java

@@ -3,7 +3,6 @@ package cn.com.qmth.stmms.common.interceptor;
 import java.util.Date;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
@@ -23,6 +22,7 @@ import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
 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.domain.ApiUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
@@ -52,19 +52,39 @@ public class LogInterceptor extends HandlerInterceptorAdapter {
     @Override
     public void postHandle(HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler,
             ModelAndView modelAndView) throws java.lang.Exception {
-        WebUser wu = RequestUtils.getWebUser(request);
+        WebUser webUser = RequestUtils.getWebUser(request);
+        ApiUser apiUser = RequestUtils.getApiUser(request);
         HandlerMethod method = (HandlerMethod) handler;
         String uri = request.getRequestURI();
         if (uri.startsWith("/login")) {
-            wu = buildWebUser(request);
+            webUser = buildWebUser(request);
         }
         Logging logging = method.getMethodAnnotation(Logging.class);
-        if (wu != null && logging != null) {
-            saveLog(logging, wu, request, response);
+        if (webUser != null && logging != null) {
+            saveLog(logging, webUser, request);
         }
+        if (apiUser != null && logging != null) {
+            saveLog(logging, apiUser, request);
+        }
+    }
+
+    private void saveLog(Logging logging, ApiUser wu, HttpServletRequest request) {
+        OperationLog log = new OperationLog();
+        log.setCreateTime(new Date());
+        log.setMenu(logging.menu());
+        log.setType(logging.type());
+        log.setMarker(false);
+        log.setOperatorId(wu.getUserData().getId());
+        log.setIpAddress(wu.getUserData().getLastLoginIp());
+        log.setLoginName(wu.getUserData().getLoginName());
+        int examId = SessionExamUtils.getExamId(request);
+        log.setExamId(examId > 0 ? examId : null);
+        log.setSchoolId(wu.getSchoolId());
+        log.setDescription(RequestUtils.getLog(request));
+        logService.save(log);
     }
 
-    private void saveLog(Logging logging, WebUser wu, HttpServletRequest request, HttpServletResponse response) {
+    private void saveLog(Logging logging, WebUser wu, HttpServletRequest request) {
         OperationLog log = new OperationLog();
         log.setCreateTime(new Date());
         log.setMenu(logging.menu());
@@ -84,7 +104,7 @@ public class LogInterceptor extends HandlerInterceptorAdapter {
             log.setIpAddress(wu.getUser().getLastLoginIp());
             log.setLoginName(wu.getUser().getLoginName());
             int examId = SessionExamUtils.getExamId(request);
-            log.setExamId(examId > 0 ? null : examId);
+            log.setExamId(examId > 0 ? examId : null);
             log.setSchoolId(wu.getUser().getSchoolId());
         }
         log.setDescription(RequestUtils.getLog(request));

+ 4 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/utils/RequestUtils.java

@@ -169,4 +169,8 @@ public class RequestUtils {
             return "";
         }
     }
+
+    public static void setLog(HttpServletRequest request, String content) {
+        request.setAttribute(REQUEST_OPERATION_LOG_KEY, content);
+    }
 }

+ 27 - 19
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -47,10 +47,12 @@ import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.service.ProblemTypeService;
 import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.biz.mark.service.TrialService;
+import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.controller.BaseController;
 import cn.com.qmth.stmms.common.enums.ExamType;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
@@ -117,6 +119,7 @@ public class MarkController extends BaseController {
         return modelAndView;
     }
 
+    @Logging(menu = "修改姓名密码", type = LogType.UPDATE)
     @RequestMapping(value = "/reset", method = RequestMethod.POST)
     public ModelAndView reset(HttpServletRequest request, Marker marker) {
         Marker current = RequestUtils.getWebUser(request).getMarker();
@@ -291,7 +294,8 @@ public class MarkController extends BaseController {
             lockService.watch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
             lockService.watch(LockType.MARKER, marker.getId());
 
-            MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+            MarkGroup group = groupService
+                    .findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
             if (group == null) {
                 task = new Task();
                 task.setExist(false);
@@ -325,8 +329,8 @@ public class MarkController extends BaseController {
         while (task == null) {
             List<MarkLibrary> list = new ArrayList<MarkLibrary>();
             // 需要判断评卷员是否绑定了班级
-            list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(), marker.getId(),
-                    marker.getClassCount() != null && marker.getClassCount() > 0, retry, 20);
+            list = libraryService.findUnMarked(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(),
+                    marker.getId(), marker.getClassCount() != null && marker.getClassCount() > 0, retry, 20);
             if (list.isEmpty()) {
                 break;
             }
@@ -347,8 +351,8 @@ public class MarkController extends BaseController {
         int retry = 1;
         Task task = null;
         while (task == null) {
-            List<TrialLibrary> list = trialService
-                    .findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(), marker.getId(), retry, 10);
+            List<TrialLibrary> list = trialService.findUnMarkedLibrary(marker.getExamId(), marker.getSubjectCode(),
+                    marker.getGroupNumber(), marker.getId(), retry, 10);
             if (list.isEmpty()) {
                 break;
             }
@@ -363,6 +367,7 @@ public class MarkController extends BaseController {
         return task;
     }
 
+    @Logging(menu = "评卷", type = LogType.UPDATE)
     @RequestMapping(value = "/savetask", method = RequestMethod.POST)
     @ResponseBody
     public JSONObject saveTask(HttpServletRequest request, @RequestBody MarkResult markResult) {
@@ -373,15 +378,15 @@ public class MarkController extends BaseController {
             lockService.watch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
             lockService.watch(LockType.STUDENT, markResult.getStudentId());
             lockService.watch(LockType.MARKER, marker.getId());
-            lockService.waitlock(LockType.GROUP_LIBRARY, markResult.getStudentId(), marker.getExamId(), marker.getSubjectCode(),
-                    marker.getGroupNumber());
+            lockService.waitlock(LockType.GROUP_LIBRARY, markResult.getStudentId(), marker.getExamId(),
+                    marker.getSubjectCode(), marker.getGroupNumber());
             success = markService.submitTask(markResult, marker);
         } catch (Exception e) {
             success = false;
             log.error("save task error", e);
         } finally {
-            lockService.unlock(LockType.GROUP_LIBRARY, markResult.getStudentId(), marker.getExamId(), marker.getSubjectCode(),
-                    marker.getGroupNumber());
+            lockService.unlock(LockType.GROUP_LIBRARY, markResult.getStudentId(), marker.getExamId(),
+                    marker.getSubjectCode(), marker.getGroupNumber());
             lockService.unwatch(LockType.MARKER, marker.getId());
             lockService.unwatch(LockType.STUDENT, markResult.getStudentId());
             lockService.unwatch(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
@@ -394,10 +399,12 @@ public class MarkController extends BaseController {
         return result;
     }
 
+    @Logging(menu = "查询回评任务", type = LogType.QUERY)
     @RequestMapping("/gethistory")
     @ResponseBody
-    public Object history(HttpServletRequest request, @RequestParam int pageNumber, @RequestParam int pageSize, @RequestParam String order,
-            @RequestParam String sort, @RequestParam(required = false, defaultValue = "false") Boolean isTag,
+    public Object history(HttpServletRequest request, @RequestParam int pageNumber, @RequestParam int pageSize,
+            @RequestParam String order, @RequestParam String sort,
+            @RequestParam(required = false, defaultValue = "false") Boolean isTag,
             @RequestParam(required = false) Integer studentId) throws Exception {
         Marker marker = RequestUtils.getWebUser(request).getMarker();
         List<Task> list = new ArrayList<>();
@@ -441,13 +448,11 @@ public class MarkController extends BaseController {
             // 试评查找给分历史记录
             List<TrialHistory> historyList = new ArrayList<TrialHistory>();
             if (studentId != null) {
-                historyList = trialService
-                        .findHistory(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(), marker.getId(), studentId,
-                                pageNumber, pageSize, querySort);
+                historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
+                        marker.getGroupNumber(), marker.getId(), studentId, pageNumber, pageSize, querySort);
             } else {
-                historyList = trialService
-                        .findHistory(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber(), marker.getId(), pageNumber,
-                                pageSize, querySort, null);
+                historyList = trialService.findHistory(marker.getExamId(), marker.getSubjectCode(),
+                        marker.getGroupNumber(), marker.getId(), pageNumber, pageSize, querySort, null);
             }
             for (TrialHistory history : historyList) {
                 TrialLibrary library = trialService.findLibrary(history.getLibraryId());
@@ -461,9 +466,11 @@ public class MarkController extends BaseController {
         return list;
     }
 
+    @Logging(menu = "修改密码", type = LogType.UPDATE)
     @RequestMapping("/change-name")
     @ResponseBody
-    public JSONObject changeName(HttpServletRequest request, @RequestParam String name, @RequestParam(required = false) String password) {
+    public JSONObject changeName(HttpServletRequest request, @RequestParam String name,
+            @RequestParam(required = false) String password) {
         Marker marker = RequestUtils.getWebUser(request).getMarker();
         JSONObject result = new JSONObject();
         marker.setName(name);
@@ -483,7 +490,8 @@ public class MarkController extends BaseController {
     public JSONObject updateSetting(HttpServletRequest request, @RequestParam String setting) {
         Marker marker = RequestUtils.getWebUser(request).getMarker();
         JSONObject result = new JSONObject();
-        markerService.updateMarkSetting(marker.getId(), StringEscapeUtils.unescapeHtml(StringUtils.trimToNull(setting)));
+        markerService
+                .updateMarkSetting(marker.getId(), StringEscapeUtils.unescapeHtml(StringUtils.trimToNull(setting)));
         result.accumulate("success", true);
         return result;
     }

+ 5 - 3
stmms-web/src/main/java/cn/com/qmth/stmms/open/controller/OpenAccountController.java

@@ -75,6 +75,7 @@ public class OpenAccountController {
         }
         // 保存第三方账号到session
         RequestUtils.getSession(request).saveOpenUser(new OpenUser(oa, returnUrl));
+
         return "redirect:/open/marker/list";
     }
 
@@ -83,7 +84,8 @@ public class OpenAccountController {
         OpenAccount account = RequestUtils.getOpenUser(request).getOpenAccount();
         ModelAndView modelAndView = new ModelAndView("modules/open/marker-list");
         // TODO - 增加评卷员列表,构造考试、科目、分组联动数据集合
-        List<Marker> markerList = markerService.findByOpenAccountAndMarkStatus(account.getId(), MarkStatus.TRIAL, MarkStatus.FORMAL);
+        List<Marker> markerList = markerService.findByOpenAccountAndMarkStatus(account.getId(), MarkStatus.TRIAL,
+                MarkStatus.FORMAL);
         return modelAndView;
     }
 
@@ -92,8 +94,8 @@ public class OpenAccountController {
         // 评卷员与评卷分组校验
         OpenAccount account = RequestUtils.getOpenUser(request).getOpenAccount();
         Marker marker = markerService.findById(markerId);
-        if (marker == null || !marker.isEnable() || marker.getOpenAccountId() == null || !marker.getOpenAccountId()
-                .equals(account.getId())) {
+        if (marker == null || !marker.isEnable() || marker.getOpenAccountId() == null
+                || !marker.getOpenAccountId().equals(account.getId())) {
             return new ModelAndView("redirect:/open/marker/list");
         }
         MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());

+ 1 - 0
stmms-web/src/main/webapp/WEB-INF/spring-mvc.xml

@@ -47,6 +47,7 @@
         	<mvc:mapping path="/login"/>
             <mvc:mapping path="/admin/**"/>
             <mvc:mapping path="/mark/**"/>
+            <mvc:mapping path="/api/**"/>
             <bean id="logInterceptor" class="cn.com.qmth.stmms.common.interceptor.LogInterceptor"/>
         </mvc:interceptor>
         <mvc:interceptor>

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

@@ -98,6 +98,7 @@
 											<li><a href="${ctx}/admin/exam/reportSubjectRange" target="mainFrame" ><i class="icon-search"></i>成绩分析</a></li>
 											<li><a href="${ctx}/admin/exam/problem/history" target="mainFrame" ><i class="icon-tag"></i>问题试卷</a></li>	
 											<li><a href="${ctx}/admin/exam/check/answer" target="mainFrame" ><i class="icon-check"></i>数据检查</a></li>			
+											<li><a href="${ctx}/admin/operation/log" target="mainFrame" ><i class="icon-check"></i>操作日志</a></li>			
 											</c:if>
 											
 											<c:if test="${web_user.subjectHeader==true}">

+ 99 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/log/logList.jsp

@@ -0,0 +1,99 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>操作日志</title>
+	<meta name="decorator" content="default"/>
+	<%@include file="/WEB-INF/views/include/head.jsp" %>
+	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+</head>
+<body>
+    <ul class="nav nav-tabs">
+        <li class="active"><a href="##">日志列表</a></li>
+    </ul>
+	<form id="searchForm"  action="${ctx}/admin/operation/log" 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-medium" name="examId" id="enable-select">
+                <option value="0">不限</option>
+                <c:forEach items="${examList}" var="exam">
+                <option value="${exam.id}" <c:if test="${exam.id==query.examId}">selected</c:if>>${exam.name}</option>
+                </c:forEach>
+            </select>
+			&nbsp;
+			<label>登录名</label>
+			<input type="text" name="loginName" value="${query.loginName}"  maxlength="20" class="input-medium"/>
+			&nbsp;
+			<label>用户类型</label>
+            <select class="input-medium" name="marker" id="role-select">
+                <option value="">不限</option>
+                <option value="true" <c:if test="${query.marker!=null && query.marker==true}">selected</c:if>>评卷员</option>
+                <option value="false" <c:if test="${query.marker!=null && query.marker==false}">selected</c:if>>管理员</option>
+            </select>
+            &nbsp;
+            <label>操作类型</label>
+            <select class="input-medium" name="type" id="enable-select">
+                <option value="">不限</option>
+                <c:forEach items="${typeList}" var="type">
+                <option value="${type.value}" <c:if test="${type.value==query.type.value}">selected</c:if>>${type.name}</option>
+                </c:forEach>
+            </select>
+            &nbsp;
+			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+		</div>
+	</form>
+	<tags:message content="${message}"/>
+	<table id="contentTable" class="table table-striped table-bordered table-condensed">
+		<thead>
+			<tr>
+				<th>登录名</th>
+				<th>用户类型</th>
+				<th>类型</th>
+				<th>登录IP</th>
+				<th>功能</th>
+				<th>考试名称</th>
+				<th>操作时间</th>
+				<th>详情</th>
+			</tr>
+		</thead>
+		<tbody>
+		<c:forEach items="${query.result}" var="log">
+			<tr>
+			    <td>${log.loginName}</td>
+				<td>
+				    <c:if test="${log.marker==true}">
+				    评卷员
+				    </c:if>
+				    <c:if test="${log.marker==false}">
+				    管理员
+                    </c:if>
+				</td>
+				<td>${log.type.name}</td>
+				<td>${log.ipAddress}</td>
+				<td>${log.menu}</td>
+				<td>${log.examName}</td>
+				<td>${log.createTime }</td>
+				<td>${log.description }</td>
+			</tr>
+		</c:forEach>
+		</tbody>
+	</table>
+	<div class="pagination">${query}</div>
+<script type="text/javascript">
+function page(n,s){
+	$("#pageNumber").val(n);
+	$("#pageSize").val(s);
+	$("#searchForm").submit();
+	return false;
+}
+function goSearch(){
+	$("#pageNumber").val(1);
+	$("#pageSize").val('${query.pageSize}');
+	$("#searchForm").submit();
+	return false;
+}
+</script>	
+</body>
+</html>