Sfoglia il codice sorgente

考生库删除finished字段,增加is_manual_absent字段,表示是否人工指定缺考;
增加人工指定缺考考生更新接口(/api/student/manualAbsent)与批量清除人工指定缺考标记接口(/api/student/manualAbsent/clear);
考生查询接口(/api/exam/students)返回字段增加人工指定缺考标识;
后台管理考生列表,增加人工指定缺考的提示;

luoshi 6 anni fa
parent
commit
97636502ba

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

@@ -54,6 +54,14 @@ public interface ExamStudentDao
     @Query("update ExamStudent s set s.exception=?2 where s.id=?1")
     public void updateException(int id, boolean exception);
 
+    @Modifying
+    @Query("update ExamStudent s set s.manualAbsent=?2 where s.id=?1")
+    public void updateManualAbsent(int id, boolean manualAbsent);
+
+    @Modifying
+    @Query("update ExamStudent s set s.manualAbsent=0 where s.examId=?1")
+    public void clearManualAbsent(int examId);
+
     @Modifying
     @Query("delete from ExamStudent s where s.examId=?1")
     public void deleteByExamId(int examId);

+ 18 - 17
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamStudent.java

@@ -158,6 +158,12 @@ public class ExamStudent implements Serializable {
     @Column(name = "is_absent")
     private boolean absent;
 
+    /**
+     * 是否人工指定缺考
+     */
+    @Column(name = "is_manual_absent")
+    private boolean manualAbsent;
+
     /**
      * 是否违纪
      */
@@ -170,12 +176,6 @@ public class ExamStudent implements Serializable {
     @Column(name = "is_exception")
     private boolean exception;
 
-    /**
-     * 是否完成评卷
-     */
-    @Column(name = "finished")
-    private boolean finished;
-
     /**
      * 上传时间
      */
@@ -451,12 +451,20 @@ public class ExamStudent implements Serializable {
         this.absent = absent;
     }
 
-    public boolean isFinished() {
-        return finished;
+    public boolean isBreach() {
+        return breach;
     }
 
-    public void setFinished(boolean finished) {
-        this.finished = finished;
+    public void setBreach(boolean breach) {
+        this.breach = breach;
+    }
+
+    public boolean isManualAbsent() {
+        return manualAbsent;
+    }
+
+    public void setManualAbsent(boolean manualAbsent) {
+        this.manualAbsent = manualAbsent;
     }
 
     public Integer getSheetCount() {
@@ -686,11 +694,4 @@ public class ExamStudent implements Serializable {
         this.tagValue = tagValue;
     }
 
-    public boolean isBreach() {
-        return breach;
-    }
-
-    public void setBreach(boolean breach) {
-        this.breach = breach;
-    }
 }

+ 46 - 36
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamStudentSearchQuery.java

@@ -46,6 +46,8 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
 
     private Boolean absent;
 
+    private Boolean manualAbsent;
+
     private Boolean exception;
 
     private String campusNameIn;
@@ -55,15 +57,15 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
     private String campusNameNotIn;
 
     private String subjectCodeNotIn;
-    
+
     private String markLogin;
-    
+
     private String markName;
-    
+
     private String ids;
-    
-    private Double startScroe; 
-    
+
+    private Double startScroe;
+
     private Double endScroe;
 
     private Boolean breach;
@@ -264,45 +266,45 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
         this.examNumberIn = examNumberIn;
     }
 
-	public String getMarkLogin() {
-		return markLogin;
-	}
+    public String getMarkLogin() {
+        return markLogin;
+    }
 
-	public void setMarkLogin(String markLogin) {
-		this.markLogin = markLogin;
-	}
+    public void setMarkLogin(String markLogin) {
+        this.markLogin = markLogin;
+    }
 
-	public String getMarkName() {
-		return markName;
-	}
+    public String getMarkName() {
+        return markName;
+    }
 
-	public void setMarkName(String markName) {
-		this.markName = markName;
-	}
+    public void setMarkName(String markName) {
+        this.markName = markName;
+    }
 
-	public String getIds() {
-		return ids;
-	}
+    public String getIds() {
+        return ids;
+    }
 
-	public void setIds(String ids) {
-		this.ids = ids;
-	}
+    public void setIds(String ids) {
+        this.ids = ids;
+    }
 
-	public Double getStartScroe() {
-		return startScroe;
-	}
+    public Double getStartScroe() {
+        return startScroe;
+    }
 
-	public void setStartScroe(Double startScroe) {
-		this.startScroe = startScroe;
-	}
+    public void setStartScroe(Double startScroe) {
+        this.startScroe = startScroe;
+    }
 
-	public Double getEndScroe() {
-		return endScroe;
-	}
+    public Double getEndScroe() {
+        return endScroe;
+    }
 
-	public void setEndScroe(Double endScroe) {
-		this.endScroe = endScroe;
-	}
+    public void setEndScroe(Double endScroe) {
+        this.endScroe = endScroe;
+    }
 
     public Boolean getBreach() {
         return breach;
@@ -311,4 +313,12 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
     public void setBreach(Boolean breach) {
         this.breach = breach;
     }
+
+    public Boolean getManualAbsent() {
+        return manualAbsent;
+    }
+
+    public void setManualAbsent(Boolean manualAbsent) {
+        this.manualAbsent = manualAbsent;
+    }
 }

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

@@ -63,6 +63,10 @@ public interface ExamStudentService {
 
     void updateSubjectiveScore(int id, double score, String scoreList);
 
+    void updateManualAbsent(int id, boolean manualAbsent);
+
+    void clearManualAbsent(int examId);
+
     void updateException(int id, boolean exception);
 
     public ExamStudent findBySchoolIdAndSubjectCodeAndStudentCode(Integer schoolId, String subjectCode,

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

@@ -404,6 +404,18 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         studentDao.updateSubjectiveScore(id, score, scoreList);
     }
 
+    @Override
+    @Transactional
+    public void updateManualAbsent(int id, boolean manualAbsent) {
+        studentDao.updateManualAbsent(id, manualAbsent);
+    }
+
+    @Override
+    @Transactional
+    public void clearManualAbsent(int examId) {
+        studentDao.clearManualAbsent(examId);
+    }
+
     @Override
     @Transactional
     public void updateException(int id, boolean exception) {
@@ -513,6 +525,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                         predicates.add(cb.equal(root.get("upload"), true));
                     }
                 }
+                if (query.getManualAbsent() != null) {
+                    predicates.add(cb.equal(root.get("manualAbsent"), query.getManualAbsent()));
+                }
                 if (query.getBreach() != null) {
                     predicates.add(cb.equal(root.get("breach"), query.getBreach()));
                 }

+ 111 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamPackageController.java

@@ -0,0 +1,111 @@
+package cn.com.qmth.stmms.api.controller;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+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 cn.com.qmth.stmms.biz.api.auth.annotation.AuthValidate;
+import cn.com.qmth.stmms.biz.api.auth.exception.ApiException;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
+import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
+@Controller("examPackageApiController")
+@RequestMapping("/api")
+public class ExamPackageController extends BaseApiController {
+
+    protected static Logger logger = LoggerFactory.getLogger(ExamPackageController.class);
+
+    @Autowired
+    private ExamStudentService examStudentService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private ExamPackageService packageService;
+
+    @AuthValidate("adminUser")
+    @RequestMapping(value = "/package/{examId}", method = RequestMethod.GET)
+    @ResponseBody
+    public JSONArray getPackageCode(HttpServletRequest request, HttpServletResponse response,
+            @PathVariable Integer examId) {
+        User user = RequestUtils.getApiUser(request);
+        JSONArray array = new JSONArray();
+        Exam exam = examService.findById(examId);
+        if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
+            List<String> list = examStudentService.findDistinctPackageCode(examId);
+            if (list != null) {
+                for (String code : list) {
+                    array.add(code);
+                }
+            }
+        } else {
+            throw ApiException.EXAM_NOT_ACCESSIBLED;
+        }
+        return array;
+    }
+
+    @AuthValidate("adminUser")
+    @RequestMapping(value = "/package/count/{examId}", method = RequestMethod.GET)
+    @ResponseBody
+    public JSONArray getPackageCount(HttpServletRequest request, HttpServletResponse response,
+            @PathVariable Integer examId, @RequestParam(required = false) Boolean upload) {
+        User user = RequestUtils.getApiUser(request);
+        JSONArray array = new JSONArray();
+        Exam exam = examService.findById(examId);
+        if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
+            List<ExamPackage> list = upload != null ? packageService.list(examId, upload) : packageService.list(examId);
+            if (list != null) {
+                for (ExamPackage ep : list) {
+                    JSONObject obj = new JSONObject();
+                    obj.accumulate("code", ep.getCode());
+                    obj.accumulate("picCount", ep.getPicCount());
+                    array.add(obj);
+                }
+            }
+        } else {
+            throw ApiException.EXAM_NOT_ACCESSIBLED;
+        }
+        return array;
+    }
+
+    @AuthValidate("adminUser")
+    @RequestMapping(value = "/package/{examId}", method = RequestMethod.POST)
+    @ResponseBody
+    public int updatePackage(HttpServletRequest request, HttpServletResponse response, @PathVariable Integer examId,
+            @RequestBody ExamPackage examPackage) {
+        User user = RequestUtils.getApiUser(request);
+        Exam exam = examService.findById(examId);
+        if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
+            ExamPackage obj = packageService.find(examId, examPackage.getCode());
+            if (obj != null && examPackage.getPicCount() != null) {
+                obj.setPicCount(examPackage.getPicCount());
+                obj = packageService.save(obj);
+                return obj.getPicCount();
+            }
+        } else {
+            throw ApiException.EXAM_NOT_ACCESSIBLED;
+        }
+        return -1;
+    }
+
+}

+ 23 - 60
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamStudentController.java

@@ -5,7 +5,6 @@ import java.util.LinkedList;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -25,14 +24,12 @@ import cn.com.qmth.stmms.biz.api.auth.exception.ApiException;
 import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
-import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudentPaper;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.QuestionDetail;
 import cn.com.qmth.stmms.biz.exam.model.QuestionUnit;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
-import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentPaperService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
@@ -60,9 +57,6 @@ public class ExamStudentController extends BaseApiController {
     @Autowired
     private CampusService campusService;
 
-    @Autowired
-    private ExamPackageService packageService;
-
     @Autowired
     private ExamSubjectService examSubjectService;
 
@@ -73,68 +67,35 @@ public class ExamStudentController extends BaseApiController {
     private ExamStudentPaperService studentPaperService;
 
     @AuthValidate("adminUser")
-    @RequestMapping(value = "/package/{examId}", method = RequestMethod.GET)
+    @RequestMapping(value = "/student/manualAbsent", method = RequestMethod.POST)
     @ResponseBody
-    public JSONArray getPackageCode(HttpServletRequest request, HttpServletResponse response,
-            @PathVariable Integer examId) {
+    public boolean updateManualAbsent(HttpServletRequest request, @RequestParam Integer examId,
+            @RequestParam String examNumber, @RequestParam Boolean manualAbsent) {
+        boolean success = false;
         User user = RequestUtils.getApiUser(request);
-        JSONArray array = new JSONArray();
         Exam exam = examService.findById(examId);
         if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
-            List<String> list = examStudentService.findDistinctPackageCode(examId);
-            if (list != null) {
-                for (String code : list) {
-                    array.add(code);
-                }
-            }
-        } else {
-            throw ApiException.EXAM_NOT_ACCESSIBLED;
-        }
-        return array;
-    }
-
-    @AuthValidate("adminUser")
-    @RequestMapping(value = "/package/count/{examId}", method = RequestMethod.GET)
-    @ResponseBody
-    public JSONArray getPackageCount(HttpServletRequest request, HttpServletResponse response,
-            @PathVariable Integer examId, @RequestParam(required = false) Boolean upload) {
-        User user = RequestUtils.getApiUser(request);
-        JSONArray array = new JSONArray();
-        Exam exam = examService.findById(examId);
-        if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
-            List<ExamPackage> list = upload != null ? packageService.list(examId, upload) : packageService.list(examId);
-            if (list != null) {
-                for (ExamPackage ep : list) {
-                    JSONObject obj = new JSONObject();
-                    obj.accumulate("code", ep.getCode());
-                    obj.accumulate("picCount", ep.getPicCount());
-                    array.add(obj);
-                }
+            ExamStudent student = examStudentService.findByExamIdAndExamNumber(examId, examNumber);
+            if (student != null) {
+                examStudentService.updateManualAbsent(student.getId(), manualAbsent);
+                success = true;
             }
-        } else {
-            throw ApiException.EXAM_NOT_ACCESSIBLED;
         }
-        return array;
+        return success;
     }
 
     @AuthValidate("adminUser")
-    @RequestMapping(value = "/package/{examId}", method = RequestMethod.POST)
+    @RequestMapping(value = "/student/manualAbsent/clear", method = RequestMethod.POST)
     @ResponseBody
-    public int updatePackage(HttpServletRequest request, HttpServletResponse response, @PathVariable Integer examId,
-            @RequestBody ExamPackage examPackage) {
+    public boolean clearManualAbsent(HttpServletRequest request, @RequestParam Integer examId) {
+        boolean success = false;
         User user = RequestUtils.getApiUser(request);
         Exam exam = examService.findById(examId);
         if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
-            ExamPackage obj = packageService.find(examId, examPackage.getCode());
-            if (obj != null && examPackage.getPicCount() != null) {
-                obj.setPicCount(examPackage.getPicCount());
-                obj = packageService.save(obj);
-                return obj.getPicCount();
-            }
-        } else {
-            throw ApiException.EXAM_NOT_ACCESSIBLED;
+            examStudentService.clearManualAbsent(examId);
+            success = true;
         }
-        return -1;
+        return success;
     }
 
     @AuthValidate("adminUser")
@@ -229,7 +190,7 @@ public class ExamStudentController extends BaseApiController {
     }
 
     @AuthValidate("adminUser")
-    @RequestMapping(value = "/exam/students")
+    @RequestMapping("/exam/students")
     @ResponseBody
     public JSONArray getStudent(HttpServletRequest request, ExamStudentSearchQuery query) {
         User user = RequestUtils.getApiUser(request);
@@ -239,6 +200,7 @@ public class ExamStudentController extends BaseApiController {
         }
         Exam exam = examService.findById(query.getExamId());
         if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
+            DecimalFormat format = new DecimalFormat("####.##");
             examStudentService.findByQuery(query);
             for (ExamStudent student : query.getResult()) {
                 JSONObject obj = new JSONObject();
@@ -252,16 +214,17 @@ public class ExamStudentController extends BaseApiController {
                 obj.accumulate("studentCode", student.getStudentCode());
                 obj.accumulate("packageCode", student.getPackageCode());
                 obj.accumulate("batchCode", student.getBatchCode() == null ? "" : student.getBatchCode());
-                obj.accumulate("sheetCount", student.getSheetCount() != null ? student.getSheetCount() : "");
-                obj.accumulate("sliceCount", student.getSliceCount() != null ? student.getSliceCount() : "");
-                obj.accumulate("answers", student.getAnswers() == null ? "" : student.getAnswers());
+                obj.accumulate("sheetCount", student.getSheetCount() != null ? student.getSheetCount() : 0);
+                obj.accumulate("sliceCount", student.getSliceCount() != null ? student.getSliceCount() : 0);
+                obj.accumulate("answers", StringUtils.trimToEmpty(student.getAnswers()));
                 obj.accumulate("upload", student.isUpload());
                 obj.accumulate("absent", student.isAbsent());
+                obj.accumulate("manualAbsent", student.isManualAbsent());
                 obj.accumulate("breach", student.isBreach());
                 obj.accumulate("objectiveScore",
-                        student.getObjectiveScore() == null ? "" : student.getObjectiveScore());
+                        student.getObjectiveScore() == null ? "" : format.format(student.getObjectiveScore()));
                 obj.accumulate("subjectiveScore",
-                        student.getSubjectiveScore() == null ? "" : student.getSubjectiveScore());
+                        student.getSubjectiveScore() == null ? "" : format.format(student.getSubjectiveScore()));
                 Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
                 obj.accumulate("campusCode", campus != null ? campus.getId().toString() : "");
                 array.add(obj);

+ 12 - 9
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/param/studentList.jsp

@@ -127,18 +127,21 @@
 				<td>${student.campusName}</td>
 				<td>
 				<c:if test="${student.upload==true}">
-				<a class="sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>" data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">已上传</a>
-				&nbsp;
-				<c:if test="${student.absent==true}">
-				缺考
-				</c:if>
-				<c:if test="${student.absent==false}">
-				正常
-				</c:if>
+				    <a class="sheet-link" href="##" data-sheet-url="${student.sheetUrlString}" data-answer-url="<c:if test="${student.answerUrl!=null}">${cardServer}${student.answerUrl}</c:if>" data-title="${student.examNumber}&nbsp;&nbsp;${student.name}&nbsp;&nbsp;客观总分${student.objectiveScoreString}&nbsp;&nbsp;主观总分${student.subjectiveScoreString}&nbsp;&nbsp;全卷总分${student.totalScoreString}">已上传</a>
+				    &nbsp;
+				    <c:if test="${student.manualAbsent==true}">
+				    人工指定
+				    </c:if>
+				    <c:if test="${student.absent==true}">
+				    缺考
+				    </c:if>
+				    <c:if test="${student.absent==false}">
+				    正常
+				    </c:if>
 				</c:if>
 				
 				<c:if test="${student.upload==false}">
-				未上传
+				    未上传
 				</c:if>
 
 				</td>

+ 1 - 1
stmms-web/src/main/webapp/script/stmms_gx.sql

@@ -242,9 +242,9 @@ CREATE TABLE `eb_exam_student` (
   `answers` text COMMENT '客观题答案',
   `is_upload` tinyint(1) NOT NULL COMMENT '是否已上传',
   `is_absent` tinyint(1) NOT NULL COMMENT '是否缺考',
+  `is_manual_absent` tinyint(1) NOT NULL COMMENT '是否人工指定缺考',
   `is_breach` tinyint(1) NOT NULL COMMENT '是否违纪',
   `is_exception` tinyint(1) NOT NULL COMMENT '数据检查是否有异常',
-  `finished` tinyint(1) NOT NULL COMMENT '是否完成评卷',
   `upload_time` datetime DEFAULT NULL COMMENT '上传时间',
   `objective_score` double DEFAULT NULL COMMENT '客观总分',
   `objective_score_list` text COMMENT '客观题得分明细',