浏览代码

修复ip问题,新增多选做条件

ting.yin 3 年之前
父节点
当前提交
5ac33d04b1

+ 5 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/InspectedService.java

@@ -1,18 +1,19 @@
 package cn.com.qmth.stmms.biz.exam.service;
 package cn.com.qmth.stmms.biz.exam.service;
 
 
+import java.util.List;
+
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.common.enums.SelectiveStatus;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 
 
-import java.util.List;
-
 public interface InspectedService {
 public interface InspectedService {
 
 
     List<ExamStudent> findByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
     List<ExamStudent> findByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
-            Double mainStartScore, Double mainEndScore, Double questionScore, boolean unselective);
+            Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus);
 
 
     Integer countByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
     Integer countByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
-            Double mainStartScore, Double mainEndScore, Double questionScore, boolean unselective);
+            Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus);
 
 
     void releaseByUserId(Integer examId, String subjectCode, Integer userId);
     void releaseByUserId(Integer examId, String subjectCode, Integer userId);
 
 

+ 23 - 8
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/InspectedServiceImpl.java

@@ -14,13 +14,16 @@ import org.springframework.stereotype.Service;
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
+import cn.com.qmth.stmms.biz.exam.model.SelectiveGroup;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.InspectedService;
 import cn.com.qmth.stmms.biz.exam.service.InspectedService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.utils.TaskLock;
 import cn.com.qmth.stmms.biz.utils.TaskLock;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
+import cn.com.qmth.stmms.common.enums.SelectiveStatus;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 
 
 @Service
 @Service
@@ -38,14 +41,17 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
     @Autowired
     @Autowired
     private MarkGroupService groupService;
     private MarkGroupService groupService;
 
 
+    @Autowired
+    private SelectiveGroupService selectiveGroupService;
+
     @SuppressWarnings("unchecked")
     @SuppressWarnings("unchecked")
     @Override
     @Override
     public List<ExamStudent> findByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
     public List<ExamStudent> findByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
-            Double mainStartScore, Double mainEndScore, Double questionScore, boolean unselective) {
+            Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus) {
         StringBuilder dataSql = new StringBuilder("select s.id from eb_exam_student s ");
         StringBuilder dataSql = new StringBuilder("select s.id from eb_exam_student s ");
         StringBuilder limitSql = new StringBuilder(" limit :offset,:pageSize");
         StringBuilder limitSql = new StringBuilder(" limit :offset,:pageSize");
-        Query dataQuery = getQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore, unselective,
-                dataSql, limitSql);
+        Query dataQuery = getQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore,
+                selectiveStatus, dataSql, limitSql);
         dataQuery.setParameter("offset", (query.getPageNumber() - 1) * query.getPageSize());
         dataQuery.setParameter("offset", (query.getPageNumber() - 1) * query.getPageSize());
         dataQuery.setParameter("pageSize", query.getPageSize());
         dataQuery.setParameter("pageSize", query.getPageSize());
         List<Integer> list = dataQuery.getResultList();
         List<Integer> list = dataQuery.getResultList();
@@ -64,7 +70,7 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
     }
     }
 
 
     private Query getQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
     private Query getQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
-            Double mainStartScore, Double mainEndScore, Double questionScore, boolean unselective,
+            Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus,
             StringBuilder dataSql, StringBuilder limitSql) {
             StringBuilder dataSql, StringBuilder limitSql) {
         StringBuilder whereSql = new StringBuilder(" WHERE s.is_upload = 1 and s.is_absent = 0 and s.is_breach = 0 ");
         StringBuilder whereSql = new StringBuilder(" WHERE s.is_upload = 1 and s.is_absent = 0 and s.is_breach = 0 ");
         if (query.getExamId() != null) {
         if (query.getExamId() != null) {
@@ -106,9 +112,17 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
         // 全部选做题为未选做
         // 全部选做题为未选做
         List<MarkGroup> groups = groupService.findByExamAndSubjectAndSelective(query.getExamId(),
         List<MarkGroup> groups = groupService.findByExamAndSubjectAndSelective(query.getExamId(),
                 query.getSubjectCode(), true);
                 query.getSubjectCode(), true);
-        if (unselective && !groups.isEmpty()) {
+        List<SelectiveGroup> selectiveGroups = selectiveGroupService.findByExamIdAndSubjectCode(query.getExamId(),
+                query.getSubjectCode());
+        if (selectiveStatus != null && SelectiveStatus.UN_SELECTIVE.equals(selectiveStatus) && !groups.isEmpty()
+                && !selectiveGroups.isEmpty()) {
             whereSql.append(" and not exists (select e.student_id from eb_subjective_score e where e.student_id = s.id and e.group_number in (:groupNumbers) and e.group_score != -1 )");
             whereSql.append(" and not exists (select e.student_id from eb_subjective_score e where e.student_id = s.id and e.group_number in (:groupNumbers) and e.group_score != -1 )");
         }
         }
+        // 选做题多选做
+        if (selectiveStatus != null && SelectiveStatus.MUTI_SELECTIVE.equals(selectiveStatus) && !groups.isEmpty()
+                && !selectiveGroups.isEmpty()) {
+            whereSql.append(" and exists (select count(e.student_id)>:selectiveCount from eb_subjective_score e where e.student_id = s.id and e.group_number in (:groupNumbers) and e.group_score != -1 )");
+        }
         dataSql.append(whereSql);
         dataSql.append(whereSql);
         StringBuilder orderSql = new StringBuilder(" order by s.inspect_time desc ");
         StringBuilder orderSql = new StringBuilder(" order by s.inspect_time desc ");
         dataSql.append(orderSql);
         dataSql.append(orderSql);
@@ -147,22 +161,23 @@ public class InspectedServiceImpl extends BaseQueryService<ExamStudent> implemen
         if (StringUtils.isNotBlank(query.getSecretNumber())) {
         if (StringUtils.isNotBlank(query.getSecretNumber())) {
             dataQuery.setParameter("secretNumber", query.getSecretNumber());
             dataQuery.setParameter("secretNumber", query.getSecretNumber());
         }
         }
-        if (unselective && !groups.isEmpty()) {
+        if (selectiveStatus != null && !groups.isEmpty() && !selectiveGroups.isEmpty()) {
             List<Integer> groupNumbers = new ArrayList<Integer>();
             List<Integer> groupNumbers = new ArrayList<Integer>();
             for (int i = 0; i < groups.size(); i++) {
             for (int i = 0; i < groups.size(); i++) {
                 groupNumbers.add(groups.get(i).getNumber());
                 groupNumbers.add(groups.get(i).getNumber());
             }
             }
             dataQuery.setParameter("groupNumbers", groupNumbers);
             dataQuery.setParameter("groupNumbers", groupNumbers);
+            dataQuery.setParameter("selectiveCount", selectiveGroups.get(0).getSelectiveCount());
         }
         }
         return dataQuery;
         return dataQuery;
     }
     }
 
 
     @Override
     @Override
     public Integer countByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
     public Integer countByQuery(ExamStudentSearchQuery query, SubjectiveStatus status, Integer mainNumber,
-            Double mainStartScore, Double mainEndScore, Double questionScore, boolean unselective) {
+            Double mainStartScore, Double mainEndScore, Double questionScore, SelectiveStatus selectiveStatus) {
         StringBuilder countSql = new StringBuilder("select count(s.id) from eb_exam_student s ");
         StringBuilder countSql = new StringBuilder("select count(s.id) from eb_exam_student s ");
         Query countQuery = getQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore,
         Query countQuery = getQuery(query, status, mainNumber, mainStartScore, mainEndScore, questionScore,
-                unselective, countSql, null);
+                selectiveStatus, countSql, null);
         Object singleResult = countQuery.getResultList().get(0);
         Object singleResult = countQuery.getResultList().get(0);
         Integer count = singleResult == null ? 0 : Integer.valueOf(singleResult.toString());
         Integer count = singleResult == null ? 0 : Integer.valueOf(singleResult.toString());
         return count;
         return count;

+ 47 - 0
stmms-common/src/main/java/cn/com/qmth/stmms/common/enums/SelectiveStatus.java

@@ -0,0 +1,47 @@
+package cn.com.qmth.stmms.common.enums;
+
+import java.util.LinkedList;
+import java.util.List;
+
+public enum SelectiveStatus {
+    UN_SELECTIVE("未选做", 0), MUTI_SELECTIVE("多选做", 1);
+
+    private String name;
+
+    private int value;
+
+    private static List<SelectiveStatus> options;
+
+    private SelectiveStatus(String name, int value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public int getValue() {
+        return value;
+    }
+
+    public static SelectiveStatus findByValue(Integer value) {
+        for (SelectiveStatus c : SelectiveStatus.values()) {
+            if (c.getValue() == value) {
+                return c;
+            }
+        }
+        return null;
+    }
+
+    public static List<SelectiveStatus> getOptionList() {
+        if (options == null) {
+            options = new LinkedList<>();
+            for (SelectiveStatus status : SelectiveStatus.values()) {
+                options.add(status);
+            }
+        }
+        return options;
+    }
+
+}

+ 44 - 26
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -1,11 +1,37 @@
 package cn.com.qmth.stmms.admin.exam;
 package cn.com.qmth.stmms.admin.exam;
 
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
 import cn.com.qmth.stmms.admin.dto.RejectResult;
 import cn.com.qmth.stmms.admin.dto.RejectResult;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.*;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exam.service.InspectedService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.Task;
 import cn.com.qmth.stmms.biz.mark.model.Task;
@@ -14,23 +40,13 @@ import cn.com.qmth.stmms.biz.mark.service.TaskService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.*;
+import cn.com.qmth.stmms.common.enums.ExamType;
+import cn.com.qmth.stmms.common.enums.LockType;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.enums.Role;
+import cn.com.qmth.stmms.common.enums.SelectiveStatus;
+import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONObject;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
 
 
 @Controller("inspectedController")
 @Controller("inspectedController")
 @RequestMapping("/admin/exam/inspected")
 @RequestMapping("/admin/exam/inspected")
@@ -73,7 +89,7 @@ public class InspectedController extends BaseExamController {
     @RequestMapping
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query,
     public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query,
             @RequestParam(required = false) SubjectiveStatus status,
             @RequestParam(required = false) SubjectiveStatus status,
-            @RequestParam(required = false, defaultValue = "false") boolean unselective,
+            @RequestParam(required = false) SelectiveStatus selectiveStatus,
             @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
             @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
             @RequestParam(required = false) Double mainEndScore, @RequestParam(required = false) Double questionScore) {
             @RequestParam(required = false) Double mainEndScore, @RequestParam(required = false) Double questionScore) {
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
@@ -88,14 +104,14 @@ public class InspectedController extends BaseExamController {
             query.setSubjectCode(subjectList.get(0).getCode());
             query.setSubjectCode(subjectList.get(0).getCode());
         }
         }
         List<ExamStudent> list = inspectedService.findByQuery(query, status, mainNumber, mainStartScore, mainEndScore,
         List<ExamStudent> list = inspectedService.findByQuery(query, status, mainNumber, mainStartScore, mainEndScore,
-                questionScore, unselective);
+                questionScore, selectiveStatus);
         for (ExamStudent e : list) {
         for (ExamStudent e : list) {
             e.setSubjectiveScoreList(e.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
             e.setSubjectiveScoreList(e.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
         }
         }
         Integer totalCount = inspectedService.countByQuery(query, null, mainNumber, mainStartScore, mainEndScore,
         Integer totalCount = inspectedService.countByQuery(query, null, mainNumber, mainStartScore, mainEndScore,
-                questionScore, unselective);
+                questionScore, selectiveStatus);
         Integer inspectCount = inspectedService.countByQuery(query, SubjectiveStatus.MARKED, mainNumber,
         Integer inspectCount = inspectedService.countByQuery(query, SubjectiveStatus.MARKED, mainNumber,
-                mainStartScore, mainEndScore, questionScore, unselective);
+                mainStartScore, mainEndScore, questionScore, selectiveStatus);
         query.setResult(list);
         query.setResult(list);
         query.setTotalCount(totalCount);
         query.setTotalCount(totalCount);
         model.addAttribute("query", query);
         model.addAttribute("query", query);
@@ -108,8 +124,9 @@ public class InspectedController extends BaseExamController {
         model.addAttribute("questionScore", questionScore);
         model.addAttribute("questionScore", questionScore);
         model.addAttribute("subjectList", subjectList);
         model.addAttribute("subjectList", subjectList);
         model.addAttribute("statusList", SubjectiveStatus.getOptionList());
         model.addAttribute("statusList", SubjectiveStatus.getOptionList());
+        model.addAttribute("selectiveStatusList", SelectiveStatus.getOptionList());
         model.addAttribute("status", status);
         model.addAttribute("status", status);
-        model.addAttribute("unselective", unselective);
+        model.addAttribute("selectiveStatus", selectiveStatus);
         model.addAttribute("exam", exam);
         model.addAttribute("exam", exam);
         return "modules/exam/inspectedList";
         return "modules/exam/inspectedList";
     }
     }
@@ -118,7 +135,8 @@ public class InspectedController extends BaseExamController {
     @RequestMapping(value = "/getTask", method = RequestMethod.POST)
     @RequestMapping(value = "/getTask", method = RequestMethod.POST)
     @ResponseBody
     @ResponseBody
     public Task getTask(HttpServletRequest request, RedirectAttributes redirectAttributes,
     public Task getTask(HttpServletRequest request, RedirectAttributes redirectAttributes,
-            ExamStudentSearchQuery query, @RequestParam(required = false, defaultValue = "false") boolean unselective,
+            ExamStudentSearchQuery query,
+            @RequestParam(required = false, defaultValue = "false") SelectiveStatus selectiveStatus,
             @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
             @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
             @RequestParam(required = false) Double mainEndScore, @RequestParam(required = false) Double questionScore,
             @RequestParam(required = false) Double mainEndScore, @RequestParam(required = false) Double questionScore,
             @RequestParam(required = false) Integer studentId) {
             @RequestParam(required = false) Integer studentId) {
@@ -144,7 +162,7 @@ public class InspectedController extends BaseExamController {
                 query.setSubjectCode(subjectList.get(0).getCode());
                 query.setSubjectCode(subjectList.get(0).getCode());
             }
             }
             list = inspectedService.findByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore,
             list = inspectedService.findByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore,
-                    mainEndScore, questionScore, unselective);
+                    mainEndScore, questionScore, selectiveStatus);
             if (list.isEmpty()) {
             if (list.isEmpty()) {
                 break;
                 break;
             }
             }
@@ -314,14 +332,14 @@ public class InspectedController extends BaseExamController {
     @RequestMapping(value = "/getStatus", method = RequestMethod.POST)
     @RequestMapping(value = "/getStatus", method = RequestMethod.POST)
     @ResponseBody
     @ResponseBody
     public JSONObject status(HttpServletRequest request, ExamStudentSearchQuery query,
     public JSONObject status(HttpServletRequest request, ExamStudentSearchQuery query,
-            @RequestParam(required = false, defaultValue = "false") boolean unselective,
+            @RequestParam(required = false) SelectiveStatus selectiveStatus,
             @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
             @RequestParam(required = false) Integer mainNumber, @RequestParam(required = false) Double mainStartScore,
             @RequestParam(required = false) Double mainEndScore, @RequestParam(required = false) Double questionScore) {
             @RequestParam(required = false) Double mainEndScore, @RequestParam(required = false) Double questionScore) {
         JSONObject status = new JSONObject();
         JSONObject status = new JSONObject();
         int examId = getSessionExamId(request);
         int examId = getSessionExamId(request);
         query.setExamId(examId);
         query.setExamId(examId);
         Integer totalCount = inspectedService.countByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore,
         Integer totalCount = inspectedService.countByQuery(query, SubjectiveStatus.MARKED, mainNumber, mainStartScore,
-                mainEndScore, questionScore, unselective);
+                mainEndScore, questionScore, selectiveStatus);
         status.accumulate("totalCount", totalCount);
         status.accumulate("totalCount", totalCount);
         status.accumulate("valid", true);
         status.accumulate("valid", true);
         return status;
         return status;

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

@@ -271,6 +271,18 @@ public class BaseController {
                 }
                 }
             }
             }
         });
         });
+        // SelectiveStatus 类型转换
+        binder.registerCustomEditor(SelectiveStatus.class, new PropertyEditorSupport() {
+
+            @Override
+            public void setAsText(String text) {
+                try {
+                    setValue(SelectiveStatus.findByValue(Integer.valueOf(text)));
+                } catch (Exception e) {
+                    setValue(null);
+                }
+            }
+        });
         binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor(true));
         binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor(true));
     }
     }
 
 

+ 4 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/LoginController.java

@@ -9,6 +9,7 @@ import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.utils.EncryptUtils;
 import cn.com.qmth.stmms.common.utils.EncryptUtils;
+import cn.com.qmth.stmms.common.utils.RequestIPUtil;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.StringUtils;
@@ -22,6 +23,7 @@ import org.springframework.web.servlet.ModelAndView;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
+
 import java.util.Date;
 import java.util.Date;
 
 
 @Controller
 @Controller
@@ -81,7 +83,7 @@ public class LoginController {
             if (u.getRole() == Role.SYS_ADMIN || u.getRole() == Role.SCHOOL_ADMIN || u.getRole() == Role.SUBJECT_HEADER
             if (u.getRole() == Role.SYS_ADMIN || u.getRole() == Role.SCHOOL_ADMIN || u.getRole() == Role.SUBJECT_HEADER
                     || u.getRole() == Role.SCHOOL_VIEWER || u.getRole() == Role.INSPECTOR) {
                     || u.getRole() == Role.SCHOOL_VIEWER || u.getRole() == Role.INSPECTOR) {
                 u.setLastLoginTime(new Date());
                 u.setLastLoginTime(new Date());
-                u.setLastLoginIp(request.getRemoteAddr());
+                u.setLastLoginIp(RequestIPUtil.getIpAddress(request));
                 u.refreshAccessToken();
                 u.refreshAccessToken();
                 u = userService.save(u);
                 u = userService.save(u);
 
 
@@ -162,7 +164,7 @@ public class LoginController {
             return new ModelAndView("redirect:/mark/reset");
             return new ModelAndView("redirect:/mark/reset");
         }
         }
         u.setLastLoginTime(new Date());
         u.setLastLoginTime(new Date());
-        u.setLastLoginIp(request.getRemoteAddr());
+        u.setLastLoginIp(RequestIPUtil.getIpAddress(request));
         u.refreshAccessToken();
         u.refreshAccessToken();
         u = userService.save(u);
         u = userService.save(u);
         WebUser wu = new WebUser(u);
         WebUser wu = new WebUser(u);

+ 9 - 11
stmms-web/src/main/java/cn/com/qmth/stmms/common/interceptor/LogInterceptor.java

@@ -1,5 +1,14 @@
 package cn.com.qmth.stmms.common.interceptor;
 package cn.com.qmth.stmms.common.interceptor;
 
 
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
+
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.admin.utils.SessionExamUtils;
 import cn.com.qmth.stmms.biz.exam.model.OperationLog;
 import cn.com.qmth.stmms.biz.exam.model.OperationLog;
 import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
 import cn.com.qmth.stmms.biz.exam.service.OperationLogService;
@@ -8,15 +17,6 @@ import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.domain.ApiUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.method.HandlerMethod;
-import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.Date;
 
 
 /**
 /**
  * @author ting.yin
  * @author ting.yin
@@ -24,8 +24,6 @@ import java.util.Date;
  */
  */
 public class LogInterceptor extends HandlerInterceptorAdapter {
 public class LogInterceptor extends HandlerInterceptorAdapter {
 
 
-    private static Logger log = LoggerFactory.getLogger(LogInterceptor.class);
-
     @Autowired
     @Autowired
     private OperationLogService logService;
     private OperationLogService logService;
 
 

+ 37 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/utils/ApiConstant.java

@@ -0,0 +1,37 @@
+package cn.com.qmth.stmms.common.utils;
+
+public interface ApiConstant {
+
+    String DEFAULT_URI_PREFIX = "/api";
+
+    String DEFAULT_ERROR_URI = "/error";
+
+    String CONFIG_METRICS_ENDPOINT = "metrics-endpoint";
+
+    String IP_UNKNOWN = "unknown";
+
+    String IP_LOCAL_MACHINE = "0:0:0:0:0:0:0:1";
+
+    String IP_LOCALHOST = "127.0.0.1";
+
+    String HEADER_PLATFORM = "platform";
+
+    String HEADER_DEVICE_ID = "deviceId";
+
+    String HEADER_TIME = "time";
+
+    String HEADER_AUTHORIZATION = "authorization";
+
+    String HEADER_TRACE_ID = "traceId";
+
+    String ATTRIBUTE_AAC_CONFIG = "aacConfig";
+
+    String ATTRIBUTE_ACCESS_ENTITY = "accessEntity";
+
+    String ATTRIBUTE_START_TIME = "startTime";
+
+    String ATTRIBUTE_TRACE_ID = "traceId";
+
+    String ATTRIBUTE_CALLER = "caller";
+
+}

+ 42 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/common/utils/RequestIPUtil.java

@@ -0,0 +1,42 @@
+package cn.com.qmth.stmms.common.utils;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class RequestIPUtil implements ApiConstant {
+
+    private static final String FIELD_IP = "_IP_";
+
+    public static String getIpAddress(HttpServletRequest request) {
+        Object obj = request.getAttribute(FIELD_IP);
+        if (obj instanceof String) {
+            return (String) obj;
+        } else {
+            String ip = request.getHeader("X-FORWARDED-FOR");
+            if (StringUtils.isEmpty(ip) || IP_UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader("X-Real-IP");
+            }
+            if (StringUtils.isEmpty(ip) || IP_UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader("Proxy-Client-IP");
+            }
+            if (StringUtils.isEmpty(ip) || IP_UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (StringUtils.isEmpty(ip) || IP_UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTPCLIENTIP");
+            }
+            if (StringUtils.isEmpty(ip) || IP_UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getRemoteAddr();
+            }
+            if (StringUtils.isEmpty(ip)) {
+                ip = IP_UNKNOWN;
+            } else if (ip.contains(",")) {
+                ip = ip.split(",")[0];
+            }
+            request.setAttribute(FIELD_IP, ip);
+            return ip;
+        }
+    }
+
+}

+ 2 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -71,6 +71,7 @@ import cn.com.qmth.stmms.common.enums.MarkStatus;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.session.model.StmmsSession;
 import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.session.service.SessionService;
 import cn.com.qmth.stmms.common.utils.EncryptUtils;
 import cn.com.qmth.stmms.common.utils.EncryptUtils;
+import cn.com.qmth.stmms.common.utils.RequestIPUtil;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.JsonProcessingException;
@@ -154,7 +155,7 @@ public class MarkController extends BaseController {
         User current = RequestUtils.getWebUser(request).getUser();
         User current = RequestUtils.getWebUser(request).getUser();
         current.setName(user.getName());
         current.setName(user.getName());
         current.setPassword(EncryptUtils.md5(user.getPassword()));
         current.setPassword(EncryptUtils.md5(user.getPassword()));
-        current.setLastLoginIp(request.getRemoteAddr());
+        current.setLastLoginIp(RequestIPUtil.getIpAddress(request));
         current.setLastLoginTime(new Date());
         current.setLastLoginTime(new Date());
         userService.save(current);
         userService.save(current);
         return new ModelAndView("redirect:/mark/subject-select");
         return new ModelAndView("redirect:/mark/subject-select");

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

@@ -45,9 +45,11 @@
         <input type="text" number="true" id="endScore" name="endScore" value="${query.endScore}" class="input-mini"/>
         <input type="text" number="true" id="endScore" name="endScore" value="${query.endScore}" class="input-mini"/>
         &nbsp;
         &nbsp;
         <label>选做题</label>
         <label>选做题</label>
-            <select class="input-small"  name="unselective" id="unselective">
-                <option value="false"<c:if test="${!unselective}">selected</c:if>>不限</option>
-	            <option value="true" <c:if test="${unselective}">selected</c:if>>全卷未选做</option>
+            <select class="input-small"  name="selectiveStatus" id="selectiveStatus">
+	            <option value="">请选择</option>
+	            <c:forEach items="${selectiveStatusList}" var="result">
+                <option value="${result.value}" <c:if test="${result==selectiveStatus}">selected</c:if>>${result.name}</option>
+            	</c:forEach>
             </select>
             </select>
         <br/><br/>
         <br/><br/>
 		<label>大题</label>
 		<label>大题</label>
@@ -227,9 +229,9 @@
     	if(questionScore!=undefined && questionScore!=""){
     	if(questionScore!=undefined && questionScore!=""){
     		url = url+'&questionScore='+questionScore;
     		url = url+'&questionScore='+questionScore;
     	}
     	}
-    	var unselective =  $("#unselective").val();
-    	if(unselective!=undefined && unselective!=""){
-    		url = url+'&unselective='+unselective;
+    	var selectiveStatus =  $("#selectiveStatus").val();
+    	if(selectiveStatus!=undefined && selectiveStatus!=""){
+    		url = url+'&selectiveStatus='+selectiveStatus;
     	}
     	}
     	window.open(url, '_blank');
     	window.open(url, '_blank');
         return false;
         return false;