Procházet zdrojové kódy

修复选项分析中多选问题;增加报告访问的验证

ting.yin před 6 roky
rodič
revize
98c01c4d1c

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

@@ -154,4 +154,7 @@ public interface ExamStudentDao
     @Query(value = "select s.objective_score+s.subjective_score from eb_exam_student s where s.exam_id=?1 and s.subject_code=?2 and s.class_name=?3 and s.is_upload =true and s.is_absent=false and s.is_breach=false order by s.objective_score+s.subjective_score asc limit ?4 ",nativeQuery = true)
     public List<Double> findLowCountTotalSocreByExamIdAndSubjectCodeAndClass(Integer examId, String subjectCode,String className, int lowCount);
 
+    @Query("select s.paperType from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true group by s.paperType")
+    public List<String> findDistinctPaperType(Integer examId, String subjectCode);
+
 }

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

@@ -124,4 +124,6 @@ public interface ExamStudentService {
 
     public List<String> findDistinctClassName(Integer examId, String subjectCode);
 
+    public List<String> findDistinctPaperType(Integer examId,String subjectCode);
+
 }

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

@@ -932,4 +932,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     public List<String> findDistinctClassName(Integer examId, String subjectCode) {
         return studentDao.findDistinctClassName(examId, subjectCode);
     }
+
+    @Override
+    public List<String> findDistinctPaperType(Integer examId, String subjectCode) {
+        return studentDao.findDistinctPaperType(examId, subjectCode);
+    }
 }

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectClassGroupServiceImpl.java

@@ -80,7 +80,7 @@ public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportS
                         if (query.getObjective() != null) {
                             predicates.add(cb.equal(root.get("objective"), query.getObjective()));
                         }
-                        if (query.getObjective() != null && query.getObjective()&& StringUtils.isNotBlank(query.getPaperType())) {
+                        if (query.getObjective() != null && query.getObjective()) {
                             predicates.add(cb.equal(root.get("paperType"), query.getPaperType()));
                         }
                         return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectGroupServiceImpl.java

@@ -63,7 +63,7 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
                 if (query.getGroupNumber() > 0) {
                     predicates.add(cb.equal(root.get("groupNumber"), query.getGroupNumber()));
                 }
-                if (query.getObjective() != null && query.getObjective() && StringUtils.isNotBlank(query.getPaperType())) {
+                if (query.getObjective() != null && query.getObjective()) {
                     predicates.add(cb.equal(root.get("paperType"), query.getPaperType()));
                 }
                 return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates

+ 4 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectQuestionServiceImpl.java

@@ -61,7 +61,7 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
                         if (query.getExamId() != null) {
                             predicates.add(cb.equal(root.get("examId"), query.getExamId()));
                         }
-                        if (query.getObjective() && StringUtils.isNotBlank(query.getPaperType())) {
+                        if (query.getObjective() != null && query.getObjective()) {
                             predicates.add(cb.equal(root.get("paperType"), query.getPaperType()));
                         }
                         if (StringUtils.isNotBlank(query.getSubjectCode())) {
@@ -73,7 +73,9 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
                         if (query.getSubNumber() != null) {
                             predicates.add(cb.equal(root.get("subNumber"), query.getSubNumber()));
                         }
-                        predicates.add(cb.equal(root.get("objective"), query.getObjective()));
+                        if (query.getObjective() != null) {
+                            predicates.add(cb.equal(root.get("objective"), query.getObjective()));
+                        }
                         return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates
                                 .toArray(new Predicate[predicates.size()]));
                     }

+ 5 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectQuestionOptionModule.java

@@ -36,7 +36,7 @@ public class SubjectQuestionOptionModule implements Module {
     private Map<String, Set<String>> optionMap;
 
     public static final String ANSWER_SPLIT = ",";
-    
+
     public static final String ANSWER = "#";
 
     public SubjectQuestionOptionModule(ReportContext context) {
@@ -106,6 +106,7 @@ public class SubjectQuestionOptionModule implements Module {
         for (String subjectCode : optionMap.keySet()) {
             ReportSubject r = subjectService.findOne(this.context.getExamId(), subjectCode);
             Set<String> options = optionMap.get(subjectCode);
+            
             options.remove(ANSWER);
             r.setOptions(StringUtils.join(options, ANSWER_SPLIT));
             subjectService.save(r);
@@ -115,7 +116,9 @@ public class SubjectQuestionOptionModule implements Module {
     private OptionCounter findCounter(String key, ExamQuestion question) {
         OptionCounter counter = counters.get(key);
         if (counter == null) {
-            counter = new OptionCounter(question.getAnswer().length() > 1);
+            boolean muti = question.getMainTitle().indexOf("多项选择") >= 0 && question.getMainTitle().indexOf("多选") >= 0
+                    && question.getMainTitle().indexOf("不定项选择") >= 0;
+            counter = new OptionCounter(muti);
             counters.put(key, counter);
         }
         return counter;

+ 2 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/unit/OptionCounter.java

@@ -22,7 +22,7 @@ public class OptionCounter {
     public void process(String answer) {
         answer = formatAnswer(answer);
         int length = answer.length();
-        if (multi && length > 1) {
+        if (multi) {
             // 支持多选题的选项拆分组合
             for (int i = 0; i < length; i++) {
                 incr(String.valueOf(answer.charAt(i)));
@@ -56,6 +56,7 @@ public class OptionCounter {
         Arrays.fill(chars, 0);
         for (int i = 0; i < answer.length(); i++) {
             int index = (int) Character.toUpperCase(answer.charAt(i)) - start;
+            Character.toUpperCase(answer.charAt(i));
             if (index >= 0 && index < 26) {
                 chars[index] = 1;
             }

+ 84 - 65
stmms-web/src/main/java/cn/com/qmth/stmms/report/ReportController.java

@@ -8,6 +8,8 @@ import javax.servlet.http.HttpServletRequest;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
 
+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;
@@ -18,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 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.report.model.ReportSubject;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
@@ -43,6 +46,8 @@ import cn.com.qmth.stmms.biz.school.service.SchoolService;
 @RequestMapping("/report")
 public class ReportController {
 
+    protected static Logger log = LoggerFactory.getLogger(ReportController.class);
+
     @Autowired
     private ExamService examService;
 
@@ -76,6 +81,9 @@ public class ReportController {
     @Autowired
     private ReportSubjectService reportSubjectService;
 
+    @Autowired
+    private ExamStudentService studentService;
+
     public static final String ANSWER_SPLIT = ",";
 
     @RequestMapping(value = "/teachAndResearch/{examId}/{subjectCode}", method = RequestMethod.GET)
@@ -95,44 +103,65 @@ public class ReportController {
     }
 
     private JSONObject getJson(Integer examId, String subjectCode, String paperType) {
-        Exam exam = examService.findById(examId);
-        School school = schoolService.findById(exam.getSchoolId());
-        ExamSubject subject = subjectService.find(examId, subjectCode);
         JSONObject result = new JSONObject();
-        result.accumulate("examName", exam.getName());
-        result.accumulate("schoolName", school.getName());
-        result.accumulate("subjectName", paperType == null ? subject.getName() : subject.getName() + "_" + paperType);
-        ReportSubjectQuery query = new ReportSubjectQuery();
-        query.setExamId(examId);
-        query.setSubjectCode(subjectCode);
-        query.setPaperType(paperType);
-        query.setPageSize(Integer.MAX_VALUE);
-        ReportSubject reportSubject = reportSubjectService.findOne(query.getExamId(), query.getSubjectCode());
-        List<ReportSubjectClass> subjectClasses = classService.findByQuery(query);
-        List<ReportSubjectGroup> subjectGroups = new ArrayList<ReportSubjectGroup>();
-        query.setObjective(true);
-        List<ReportSubjectGroup> subjectGroupO = groupService.findByQuery(query);
-        query.setObjective(false);
-        List<ReportSubjectGroup> subjectGroupsS = groupService.findByQuery(query);
-        subjectGroups.addAll(subjectGroupO);
-        subjectGroups.addAll(subjectGroupsS);
-        result.accumulate("basic_paper", getPaperJson(reportSubject));
-        result.accumulate("basic_question_subjective", getQuestionJson(query, false, paperType));
-        result.accumulate("basic_question_objective", getQuestionJson(query, true, paperType));
-        result.accumulate("basic_class", getClassJson(subjectClasses));
-        result.accumulate("basic_teacher", getTeacerJson(query));
-        result.accumulate("basic_college", getCollegeJson(query));
-        result.accumulate("basic_main_question", getGroupJson(subjectGroups));
-        result.accumulate("basic_question_option", getOptionJson(query, reportSubject, paperType));
-        result.accumulate("discrimination_level",
-                getDiscrimination(query, paperType, reportSubject, subjectClasses, subjectGroups));
-        result.accumulate("difficulty_level",
-                getDifficulty(query, paperType, reportSubject, subjectClasses, subjectGroups));
-        result.accumulate("range_level", getRangeLevel(query, reportSubject, subjectClasses));
-        result.accumulate("range_10_totalScore", getRange10(reportSubject, subjectClasses));
-        result.accumulate("range_1_totalScore", getRange1(reportSubject, subjectClasses));
-        result.accumulate("range_segment_6", getRange6(reportSubject, subjectClasses));
-        return result;
+        ExamSubject subject = subjectService.find(examId, subjectCode);
+        if (subject == null) {
+            result.accumulate("code", "500");
+            result.accumulate("message", "找不到对应科目");
+            return result;
+        }
+        List<String> paperTypes = studentService.findDistinctPaperType(examId, subjectCode);
+        if (subject.getObjectiveScore() > 0 && !paperTypes.contains(paperType)) {
+            result.accumulate("code", "500");
+            result.accumulate("message", "没有对应的卷型");
+            return result;
+        }
+        try {
+            Exam exam = examService.findById(examId);
+            School school = schoolService.findById(exam.getSchoolId());
+            result.accumulate("examName", exam.getName());
+            result.accumulate("schoolName", school.getName());
+            result.accumulate("subjectName", paperType == null ? subject.getName() : subject.getName() + "_"
+                    + paperType);
+            ReportSubjectQuery query = new ReportSubjectQuery();
+            query.setExamId(examId);
+            query.setSubjectCode(subjectCode);
+            query.setPaperType(paperType);
+            query.setPageSize(Integer.MAX_VALUE);
+            ReportSubject reportSubject = reportSubjectService.findOne(query.getExamId(), query.getSubjectCode());
+            List<ReportSubjectClass> subjectClasses = classService.findByQuery(query);
+            List<ReportSubjectGroup> subjectGroups = new ArrayList<ReportSubjectGroup>();
+            query.setObjective(true);
+            List<ReportSubjectGroup> subjectGroupO = groupService.findByQuery(query);
+            query.setObjective(false);
+            List<ReportSubjectGroup> subjectGroupsS = groupService.findByQuery(query);
+            subjectGroups.addAll(subjectGroupO);
+            subjectGroups.addAll(subjectGroupsS);
+            result.accumulate("basic_paper", getPaperJson(reportSubject));
+            result.accumulate("basic_question_subjective", getQuestionJson(query, false, null));
+            result.accumulate("basic_question_objective", getQuestionJson(query, true, paperType));
+            result.accumulate("basic_class", getClassJson(subjectClasses));
+            result.accumulate("basic_teacher", getTeacerJson(query));
+            result.accumulate("basic_college", getCollegeJson(query));
+            result.accumulate("basic_main_question", getGroupJson(subjectGroups));
+            if (subject.getObjectiveScore() > 0) {
+                result.accumulate("basic_question_option", getOptionJson(query, reportSubject, paperType));
+            }
+            result.accumulate("discrimination_level",
+                    getDiscrimination(query, paperType, reportSubject, subjectClasses, subjectGroups));
+            result.accumulate("difficulty_level",
+                    getDifficulty(query, paperType, reportSubject, subjectClasses, subjectGroups));
+            result.accumulate("range_level", getRangeLevel(query, reportSubject, subjectClasses));
+            result.accumulate("range_10_totalScore", getRange10(reportSubject, subjectClasses));
+            result.accumulate("range_1_totalScore", getRange1(reportSubject, subjectClasses));
+            result.accumulate("range_segment_6", getRange6(reportSubject, subjectClasses));
+            return result;
+        } catch (Exception e) {
+            log.error("report for examId=" + examId + "&subjectCode=" + subjectCode + "&paperType=" + paperType, e);
+            result.accumulate("code", "500");
+            result.accumulate("message", "系统异常");
+            return result;
+        }
     }
 
     private String getPaperJson(ReportSubject r) {
@@ -176,13 +205,13 @@ public class ReportController {
     private String getRange1(ReportSubject subject, List<ReportSubjectClass> list) {
         JSONObject result = new JSONObject();
         result.accumulate("total",
-                getScoreRange(subject.getScoreRange(), subject.getTotalScore(), 1, subject.getRealityCount()));
+                getScoreRange1(subject.getScoreRange(), subject.getTotalScore(), subject.getRealityCount()));
         JSONArray classes = new JSONArray();
         for (ReportSubjectClass c : list) {
             JSONObject classValue = new JSONObject();
             classValue.accumulate("name", c.getClassName());
             classValue.accumulate("ranges",
-                    getScoreRange(c.getScoreRange(), subject.getTotalScore(), 1, c.getRealityCount()));
+                    getScoreRange1(c.getScoreRange(), subject.getTotalScore(), c.getRealityCount()));
             classes.add(classValue);
         }
         result.accumulate("classes", classes);
@@ -205,28 +234,16 @@ public class ReportController {
         return result.toString();
     }
 
-    private JSONArray getScoreRange(String scoreRange, double totalScore, int range, Integer totalCount) {
+    private JSONArray getScoreRange1(String scoreRange, double totalScore, Integer totalCount) {
         JSONArray result = new JSONArray();
         JSONObject jsonObject = JSONObject.fromObject(scoreRange);
         int rangeCount = 0;
         int sumCount = 0;
         int total = (int) Math.ceil(totalScore);
         for (int i = total; i >= 0; i--) {
-            if (i % range == 0) {
-                if (i == 0) {
-                    rangeCount = jsonObject.getInt(String.valueOf(i));
-                } else {
-                    rangeCount = getSumCount(jsonObject, i, i - range + 1);
-                }
-                sumCount = sumCount + rangeCount;
-                JSONObject value = new JSONObject();
-                value.accumulate("score", i);
-                value.accumulate("rangeCount", rangeCount);
-                value.accumulate("rangeRate", rangeCount * 100.0 / totalCount);
-                value.accumulate("sumCount", sumCount);
-                value.accumulate("sumRate", sumCount * 100.0 / totalCount);
-                result.add(value);
-            }
+            rangeCount = jsonObject.getInt(String.valueOf(i));
+            sumCount = sumCount + rangeCount;
+            result.add(getRangeJson(totalCount, rangeCount, sumCount, i));
         }
         return result;
     }
@@ -249,13 +266,7 @@ public class ReportController {
             }
             rangeCount = getSumCount(jsonObject, start, end);
             sumCount = sumCount + rangeCount;
-            JSONObject value = new JSONObject();
-            value.accumulate("score", i * range);
-            value.accumulate("rangeCount", rangeCount);
-            value.accumulate("rangeRate", rangeCount * 100.0 / totalCount);
-            value.accumulate("sumCount", sumCount);
-            value.accumulate("sumRate", sumCount * 100.0 / totalCount);
-            result.add(value);
+            result.add(getRangeJson(totalCount, rangeCount, sumCount, i * range));
         }
         return result;
     }
@@ -280,6 +291,16 @@ public class ReportController {
         return result;
     }
 
+    private JSONObject getRangeJson(Integer totalCount, int rangeCount, int sumCount, int score) {
+        JSONObject value = new JSONObject();
+        value.accumulate("score", score);
+        value.accumulate("rangeCount", rangeCount);
+        value.accumulate("rangeRate", rangeCount * 100.0 / totalCount);
+        value.accumulate("sumCount", sumCount);
+        value.accumulate("sumRate", sumCount * 100.0 / totalCount);
+        return value;
+    }
+
     private JSONObject getRangeJson(Integer totalCount, int rangeCount, int sumCount, int start, int end) {
         JSONObject value = new JSONObject();
         if (start == 0 && end == 0) {
@@ -479,9 +500,7 @@ public class ReportController {
 
     private String getOptionJson(ReportSubjectQuery query, ReportSubject reportSubject, String paperType) {
         JSONObject value = new JSONObject();
-        if (reportSubject.getOptions() != null) {
-            value.accumulate("options", reportSubject.getOptions().split(ANSWER_SPLIT));
-        }
+        value.accumulate("options", reportSubject.getOptions().split(ANSWER_SPLIT));
         JSONArray array = new JSONArray();
         query.setObjective(true);
         query.setPaperType(paperType);