Parcourir la source

增加客观题导入验证;正考转缺考处理;及格分优秀分大于0;单科目成绩导出验证;

ting.yin il y a 6 ans
Parent
commit
8b6c3c4f47

+ 60 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectQuestionDTO.java

@@ -143,6 +143,7 @@ public class SubjectQuestionDTO {
                 // 客观题时额外校验不同试卷类型的总分需要一致
                 if (objective) {
                     totalScore = -1;
+                    List<ExamQuestion> questions = null;
                     for (Entry<String, List<ExamQuestion>> entry : paperTypeList.entrySet()) {
                         double score = 0;
                         for (ExamQuestion question : entry.getValue()) {
@@ -154,6 +155,15 @@ public class SubjectQuestionDTO {
                             error.add("[" + subjectCode + "] 多个试卷类型总分不一致");
                             return false;
                         }
+                        if(questions!=null){
+                            String message = check(questions,entry.getValue());
+                            if(message!=null){
+                                error.add("[" + subjectCode + "] 多个试卷类型"+ message);
+                                return false;
+                            }
+                        }else{
+                            questions = entry.getValue();
+                        }
                     }
                 }
                 return true;
@@ -165,4 +175,54 @@ public class SubjectQuestionDTO {
             return false;
         }
     }
+
+    private String check(List<ExamQuestion> questions, List<ExamQuestion> value) {
+        if(questions.size()!=value.size()){
+            return "题目总数不一致";
+        }
+        Map<Integer,Integer> subCountMap = new HashMap<Integer, Integer>();
+        Map<Integer,Double> mainScoreMap = new HashMap<Integer, Double>();
+        int maniCount = 0;
+        for (ExamQuestion question : questions) {
+            Integer subCount = subCountMap.get(question.getMainNumber());
+            if (subCount != null ) {
+                subCountMap.put(question.getMainNumber(), subCount+1);
+                Double mainScore = mainScoreMap.get(question.getMainNumber());
+                mainScoreMap.put(question.getMainNumber(), mainScore+question.getTotalScore());
+            } else {
+                subCountMap.put(question.getMainNumber(), 1);
+                mainScoreMap.put(question.getMainNumber(), question.getTotalScore());
+                maniCount++;
+            }
+        }
+        
+        Map<Integer,Integer> subCountMap1 = new HashMap<Integer, Integer>();
+        Map<Integer,Double> mainScoreMap1 = new HashMap<Integer, Double>();
+        int maniCount1 = 0;
+        for (ExamQuestion question : value) {
+            Integer subCount = subCountMap1.get(question.getMainNumber());
+            if (subCount != null ) {
+                subCountMap1.put(question.getMainNumber(), subCount+1);
+                Double mainScore = mainScoreMap1.get(question.getMainNumber());
+                mainScoreMap1.put(question.getMainNumber(), mainScore+question.getTotalScore());
+            } else {
+                subCountMap1.put(question.getMainNumber(), 1);
+                mainScoreMap1.put(question.getMainNumber(), question.getTotalScore());
+                maniCount1++;
+            }
+        }
+        if(maniCount!=maniCount1){
+            return "大题数量不一致";
+        }
+        for(Integer mainNumber : subCountMap.keySet()) {
+            if(subCountMap.get(mainNumber)!=subCountMap1.get(mainNumber)){
+                return "小题数量不一致";
+            }
+            //大题总分不一致
+            if(mainScoreMap.get(mainNumber)!=mainScoreMap1.get(mainNumber)){
+                return "小题数量不一致";
+            }
+        }
+        return null;
+    }
 }

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

@@ -216,7 +216,7 @@ public class PaperController extends BaseExamController {
             }
         }
         if (error.size() > 0) {
-            error.add("<br\\>导入完毕后请重新统分!");
+            error.add("<br\\> 导入完毕后请重新统分!");
             addMessage(redirectAttributes, StringUtils.join(error, "<br\\>"));
         }
         return "redirect:/admin/exam/paper";

+ 49 - 8
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ScoreController.java

@@ -28,6 +28,7 @@ import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
@@ -204,7 +205,7 @@ public class ScoreController extends BaseExamController {
         if (lockService.trylock(LockType.EXAM, examId)) {
             ScoreCalculateThread thread = new ScoreCalculateThread(examId, lockService, studentService,
                     questionService, markService, checkStudentService,
-                    reportService,examService);
+                    reportService,examService,subjectService);
             taskExecutor.submit(thread);
         }
         return new ModelAndView("redirect:/admin/exam/score");
@@ -216,6 +217,9 @@ public class ScoreController extends BaseExamController {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
         String exporMmessage = enableExport(examId);
+        if(exporMmessage ==null && StringUtils.isNotBlank(query.getStudentCode())){
+            exporMmessage = enableExport(examId, query.getStudentCode());
+        }
         if (exporMmessage != null) {
             addMessage(redirectAttributes, "评卷未结束不能导出成绩 " + exporMmessage);
             return "redirect:/admin/exam/score";
@@ -257,6 +261,20 @@ public class ScoreController extends BaseExamController {
             return "redirect:/admin/exam/score";
         }
     }
+    
+    @RequestMapping("/enableExport")
+    @ResponseBody
+    public JSONObject query(HttpServletRequest request, @RequestParam(required = false) String subjectCode) {
+        int examId = getSessionExamId(request);
+        JSONObject obj = new JSONObject();
+        String exporMmessage = isChecked(examId);
+        if(exporMmessage ==null && StringUtils.isNotBlank(subjectCode)){
+            exporMmessage = enableExport(examId, subjectCode);
+        }
+        obj.accumulate("enableExport", exporMmessage==null);
+        obj.accumulate("exporMmessage", exporMmessage);
+        return obj;
+    }
 
     private List<ScoreItem> buildScoreList(ExamStudent student) {
         List<ScoreItem> scoreList = new LinkedList<ScoreItem>();
@@ -323,19 +341,42 @@ public class ScoreController extends BaseExamController {
     }
 
     private String enableExport(int examId) {
+        String message = isChecked(examId);
+        if(message==null){
+            List<ExamSubject> subjects = subjectService.list(examId);
+            for (ExamSubject subject : subjects) {
+                message = enableExport(examId,subject.getCode());
+                if(message!=null){
+                    return message;
+                }
+            }
+        }
+        return message;
+    }
+    
+    private String isChecked(int examId) {
         String message = null;
         Exam exam = examService.findById(examId);
-        long totalCount = studentService.countByExamId(examId);
-        long uploadCount = studentService.countByExamIdAndUpload(examId, true);
-        long manualAbsentCount = studentService.countByExamIdAndManualAbsent(examId, true);
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setUpload(false);
+        query.setManualAbsent(false);
+        long unUploadManualAbsentCount = studentService.countByQuery(query);
         if (exam.isNeedCalculate()) {
             message = "该考试需要统分";
-        } else if (uploadCount + manualAbsentCount != totalCount) {
-            message = "已上传和人工指定缺考总数不等于总人数";
-        } else if (groupService.countByExamAndStatus(examId, MarkStatus.TRIAL, MarkStatus.FORMAL) != 0) {
-            message = "有科目未评卷完成";
+        } else if (unUploadManualAbsentCount > 0) {
+            message = "未上传考生必须人工指定缺考";
         } else if (checkStudentService.countByExamIdAndChecked(examId, false) != 0) {
             message = "人工确认未完成";
+        } 
+        return message;
+    }
+    
+    private String enableExport(int examId,String subjectCode) {
+        String message = null;
+        List<MarkGroup> groups = groupService.findByExamAndSubjectAndStatus(examId, subjectCode, MarkStatus.FORMAL,MarkStatus.TRIAL);
+        if(groups!=null){
+            message = subjectCode+" 科目未评卷完成";
         }
         return message;
     }

+ 21 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/ScoreCalculateThread.java

@@ -12,10 +12,12 @@ import cn.com.qmth.stmms.biz.exam.model.CheckStudent;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
 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.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.report.service.ReportService;
@@ -43,15 +45,19 @@ public class ScoreCalculateThread implements Runnable {
     private Map<String, List<ExamQuestion>> objectiveMap;
 
     private Map<String, List<ExamQuestion>> subjectiveMap;
+    
+    private Map<String, ExamSubject> subjectMap;
 
     private CheckStudentService checkStudentService;
     
+    private ExamSubjectService subjectService;
+    
     private ExamService examService;
 
     public ScoreCalculateThread(int examId, LockService lockService, ExamStudentService studentService,
             ExamQuestionService questionService, 
             MarkService markService, CheckStudentService checkStudentService,
-            ReportService reportService,ExamService examService) {
+            ReportService reportService,ExamService examService,ExamSubjectService subjectService) {
         this.examId = examId;
         this.lockService = lockService;
         this.studentService = studentService;
@@ -60,8 +66,10 @@ public class ScoreCalculateThread implements Runnable {
         this.checkStudentService = checkStudentService;
         this.reportService = reportService;
         this.examService = examService;
+        this.subjectService = subjectService;
         this.objectiveMap = new HashMap<String, List<ExamQuestion>>();
         this.subjectiveMap = new HashMap<String, List<ExamQuestion>>();
+        this.subjectMap = new HashMap<String, ExamSubject>();
     }
 
     @Override
@@ -108,8 +116,7 @@ public class ScoreCalculateThread implements Runnable {
     private void calculate(ExamStudent student) {
         try {
             ScoreCalculateUtil util = ScoreCalculateUtil.instance(student);
-            ScoreInfo info = util.calculate(findQuestionList(student.getSubjectCode(), student.getPaperType(), true),
-                    null);
+            ScoreInfo info = util.calculate(findQuestionList(student.getSubjectCode(), student.getPaperType(), true),null);
 
             student.setObjectiveScore(info.getObjectiveScore());
             student.setScoreList(info.getScoreList(), true);
@@ -120,7 +127,8 @@ public class ScoreCalculateThread implements Runnable {
             markService.scoreCalculate(student.getExamId(), student.getSubjectCode(), student.getId());
 
             // 客观题0分主观题有分的考生
-            if (student.getObjectiveScore() == 0 && student.getSubjectiveScore() != 0) {
+            ExamSubject subject = findExamSubject(student.getSubjectCode()) ;
+            if (subject.getObjectiveScore()>0 && student.getObjectiveScore() == 0 && student.getSubjectiveScore() != 0) {
                 CheckStudent cs = new CheckStudent(student.getId(), examId, student.getSubjectCode(),
                         CheckType.EXCEPTION);
                 checkStudentService.save(cs);
@@ -149,4 +157,13 @@ public class ScoreCalculateThread implements Runnable {
             return list;
         }
     }
+    
+    private ExamSubject findExamSubject(String subjectCode){
+        ExamSubject subject = subjectMap.get(subjectCode);
+        if(subject==null){
+            subject = subjectService.find(examId, subjectCode);
+            subjectMap.put(subjectCode, subject);
+        }
+        return subject;
+    }
 }

+ 7 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/common/controller/BaseController.java

@@ -174,13 +174,19 @@ public class BaseController {
 
     protected boolean saveUploadStudent(ExamStudent student) {
         ExamStudent old = studentService.findById(student.getId());
-        if(old.isAbsent() && !student.isAbsent()){
+        if(old.isAbsent() && !student.isAbsent()){//缺考转正考
             List<MarkGroup> groupList = groupService.findByExamAndSubjectAndStatus(student.getExamId(), student.getSubjectCode(), MarkStatus.FINISH);
             for (MarkGroup markGroup : groupList) {
                 groupService.updateStatus(student.getExamId(), student.getSubjectCode(), markGroup.getNumber(), MarkStatus.FORMAL, MarkStatus.FINISH);
             }
         }
         calculateObjectiveScore(student);
+        if(!old.isAbsent() && student.isAbsent()){//正考转缺考
+            student.setObjectiveScore(0d);
+            student.setSubjectiveScore(0d);
+            student.setSubjectiveScoreList(null);
+            studentService.save(student);
+        }
         boolean success = studentService.updateScanInfo(student);
         if(success){
         	subjectService.updateUploadCount(student.getExamId(), student.getSubjectCode(), (int) studentService

+ 2 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examEdit.jsp

@@ -57,13 +57,13 @@
 		<div class="control-group">
 			<label class="control-label">及格分</label>
 			<div class="controls">
-				<input name="passScore" type="number" value="${exam.passScore }"class="required"/>
+				<input name="passScore" type="number" value="${exam.passScore }"class="required" oninput="if(value<0)value=0"/>
 			</div>
 		</div>
 		<div class="control-group">
 			<label class="control-label">优秀分</label>
 			<div class="controls">
-				<input name="excellentScore" type="number" value="${exam.excellentScore }" class="required"/>
+				<input name="excellentScore" type="number" value="${exam.excellentScore }" class="required" oninput="if(value<0)value=0"/>
 			</div>
 		</div>
 		<c:if test="${exam.id!=null }">

+ 2 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/examForm.jsp

@@ -56,13 +56,13 @@
 		<div class="control-group">
 			<label class="control-label">及格分</label>
 			<div class="controls">
-				<input name="passScore" type="number" value="60" class="required"/>
+				<input name="passScore" type="number" value="60" class="required"oninput="if(value<0)value=0"/>
 			</div>
 		</div>
 		<div class="control-group">
 			<label class="control-label">优秀分</label>
 			<div class="controls">
-				<input name="excellentScore" type="number" value="85" class="required"/>
+				<input name="excellentScore" type="number" value="85" class="required"oninput="if(value<0)value=0"/>
 			</div>
 		</div>
 		<c:if test="${exam.id!=null }">

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

@@ -19,7 +19,7 @@
 			<label>学号</label>
 			<input type="text" name="studentCode" value="${query.studentCode}" maxlength="30" class="input-small"/>
 			<label>科目</label>
-			<select class="input-large" name="subjectCode">
+			<select class="input-large" name="subjectCode" id="subject-select">
 				<option value="">请选择</option>
 				<c:forEach items="${subjectList}" var="subject">
 				<option value="${subject.code}" <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
@@ -232,6 +232,17 @@ function goExportScore(){
 	$("#searchForm").attr('action','${ctx}/admin/exam/score/exportScore');
 	$("#searchForm").submit();
 }
+$('#subject-select').change(function(){
+    var code = $(this).val();
+    $.post('${ctx}/admin/exam/score/enableExport', {subjectCode: code}, function(result){
+        if(result.enableExport){
+        	$("#export-button").removeAttr("disabled");
+        }else{
+	        $("#export-button").attr("disabled","disabled");
+        	$("#export-button").attr("title",result.exporMmessage);
+        }
+    });
+});
 </script>	
 </body>
 </html>

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectCollege.jsp

@@ -171,7 +171,7 @@ $("#export-button").click(function(){
                 data: minScores
             },{
                 name: '优秀率',
-                type: 'bar',
+                type: 'line',
                 data: excellentRates
             },{
                 name: '及格率',

+ 1 - 1
stmms-web/src/main/webapp/WEB-INF/views/modules/report/reportSubjectTeacher.jsp

@@ -183,7 +183,7 @@ $("#export-button").click(function(){
                 type: 'bar',
                 data: avgScores
             },{
-                name: '相对平均分',
+                name: '平均相对分',
                 type: 'line',
                 yAxisIndex : 1,
                 data: relativeAvgScore