浏览代码

修改统计客观题

yin 1 年之前
父节点
当前提交
ba79e8ee2e

+ 3 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectQuestionDao.java

@@ -28,4 +28,7 @@ public interface ReportSubjectQuestionDao extends PagingAndSortingRepository<Rep
     @Modifying
     @Modifying
     @Query("delete from ReportSubjectQuestion r where r.examId=?1 and r.subjectCode=?2")
     @Query("delete from ReportSubjectQuestion r where r.examId=?1 and r.subjectCode=?2")
     void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
     void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
+    @Modifying
+    @Query("delete from ReportSubjectQuestion r where r.examId=?1 and r.subjectCode=?2 and r.objective=?3 ")
+    void deleteByExamIdAndSubjectCodeAndObjective(Integer examId, String subjectCode, boolean objective);
 }
 }

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectQuestionService.java

@@ -26,4 +26,6 @@ public interface ReportSubjectQuestionService {
             boolean isObjective, String paperType);
             boolean isObjective, String paperType);
 
 
     void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
     void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
+
+    void deleteByExamIdAndSubjectCodeAndObjective(Integer examId, String subjectCode, boolean objective);
 }
 }

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

@@ -137,7 +137,7 @@ public class ReportServiceImpl implements ReportService {
         reportSubjectTeacherService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectTeacherService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectTeacherClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectTeacherClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
-        reportSubjectQuestionService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+        reportSubjectQuestionService.deleteByExamIdAndSubjectCodeAndObjective(examId, subjectCode,false);
         reportSubjectGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectClassGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectClassGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
     }
     }
@@ -145,6 +145,7 @@ public class ReportServiceImpl implements ReportService {
     @Override
     @Override
     public void deleteObjectiveData(Integer examId, String subjectCode) {
     public void deleteObjectiveData(Integer examId, String subjectCode) {
         reportSubjectRangeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectRangeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+        reportSubjectQuestionService.deleteByExamIdAndSubjectCodeAndObjective(examId, subjectCode,true);
     }
     }
 
 
     @Override
     @Override

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

@@ -56,6 +56,12 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
         reportSubjectQuestionDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectQuestionDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
     }
     }
 
 
+    @Override
+    @Transactional
+    public void deleteByExamIdAndSubjectCodeAndObjective(Integer examId, String subjectCode, boolean objective) {
+        reportSubjectQuestionDao.deleteByExamIdAndSubjectCodeAndObjective(examId, subjectCode,objective);
+    }
+
     @Override
     @Override
     public List<ReportSubjectQuestion> findByQuery(final ReportSubjectQuery query) {
     public List<ReportSubjectQuestion> findByQuery(final ReportSubjectQuery query) {
         query.setSort(new Sort(Direction.ASC, "paperType", "mainNumber", "subNumber"));
         query.setSort(new Sort(Direction.ASC, "paperType", "mainNumber", "subNumber"));

+ 14 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/ReportContext.java

@@ -24,7 +24,7 @@ public class ReportContext {
 
 
     private List<Module> modules;
     private List<Module> modules;
 
 
-    private Module objectiveModule;
+    private List<Module> objectiveModule;
 
 
     private Map<String, ExamSubject> subjectMap;
     private Map<String, ExamSubject> subjectMap;
 
 
@@ -37,6 +37,7 @@ public class ReportContext {
     public ReportContext(Exam exam) {
     public ReportContext(Exam exam) {
         this.exam = exam;
         this.exam = exam;
         this.modules = new LinkedList<Module>();
         this.modules = new LinkedList<Module>();
+        this.objectiveModule = new LinkedList<>();
         this.subjectMap = new HashMap<String, ExamSubject>();
         this.subjectMap = new HashMap<String, ExamSubject>();
         this.questionMap = new HashMap<String, ExamQuestion>();
         this.questionMap = new HashMap<String, ExamQuestion>();
         this.groupMap = new HashMap<String, ExamQuestion>();
         this.groupMap = new HashMap<String, ExamQuestion>();
@@ -64,7 +65,8 @@ public class ReportContext {
 
 
         this.modules.add(new SubjectQuestionOptionModule(this));
         this.modules.add(new SubjectQuestionOptionModule(this));
 
 
-        this.objectiveModule = new SubjectObjectiveRangeModule(this);
+        this.objectiveModule.add( new SubjectObjectiveRangeModule(this));
+        this.objectiveModule.add( new SubjectObjectiveQuestionModule(this));
 
 
     }
     }
 
 
@@ -76,6 +78,13 @@ public class ReportContext {
     }
     }
 
 
     public void processObjective(ExamStudent student) {
     public void processObjective(ExamStudent student) {
+        for (Module module : objectiveModule) {
+            putObjectiveMap(student);
+            module.process(student);
+        }
+    }
+
+    private void putObjectiveMap(ExamStudent student) {
         subjectMap.put(student.getSubjectCode(), student.getSubject());
         subjectMap.put(student.getSubjectCode(), student.getSubject());
         for (ExamQuestion question : student.getObjectiveQuestionList()) {
         for (ExamQuestion question : student.getObjectiveQuestionList()) {
             String key = getQuestionKey(question);
             String key = getQuestionKey(question);
@@ -87,7 +96,6 @@ public class ReportContext {
                 groupMap.put(groupKey, question);
                 groupMap.put(groupKey, question);
             }
             }
         }
         }
-        this.objectiveModule.process(student);
     }
     }
 
 
     private void putMap(ExamStudent student) {
     private void putMap(ExamStudent student) {
@@ -137,7 +145,9 @@ public class ReportContext {
     }
     }
 
 
     public void saveObjective() {
     public void saveObjective() {
-        this.objectiveModule.save();
+        for (Module module : objectiveModule) {
+            module.save();
+        }
     }
     }
 
 
     public Double getPassScore() {
     public Double getPassScore() {

+ 129 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectObjectiveQuestionModule.java

@@ -0,0 +1,129 @@
+package cn.com.qmth.stmms.biz.report.utils.module;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.StringUtils;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
+import cn.com.qmth.stmms.biz.report.utils.Module;
+import cn.com.qmth.stmms.biz.report.utils.QuestionCalculatorProvider;
+import cn.com.qmth.stmms.biz.report.utils.ReportContext;
+import cn.com.qmth.stmms.biz.report.utils.unit.BaseCalculatorUnit;
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.biz.utils.SpringContextHolder;
+
+/**
+ * 按科目统计全样本小题指标
+ * 
+ * @author luoshi
+ *
+ */
+public class SubjectObjectiveQuestionModule implements Module, QuestionCalculatorProvider {
+
+    protected Map<String, BaseCalculatorUnit> calculators;
+
+    protected ReportContext context;
+
+    public static final int UN_SELECTIVE_SCORE = -1;
+
+    public SubjectObjectiveQuestionModule(ReportContext context) {
+        this.calculators = new HashMap<String, BaseCalculatorUnit>();
+        this.context = context;
+    }
+
+    public void process(ExamStudent student) {
+        if (student.isUpload() && !student.isAbsent() && !student.isBreach() && student.getSubject() != null) {
+            double totalScore = student.getTotalScore();
+            // 遍历客观题
+            process(student, student.getScoreList(true), student.getObjectiveQuestionList(), totalScore);
+            // 遍历主观题
+//            process(student, student.getScoreList(false), student.getSubjectiveQuestionList(), totalScore);
+        }
+    }
+
+    private void process(ExamStudent student, List<ScoreItem> scoreList, List<ExamQuestion> questionList,
+            double totalScore) {
+        if (scoreList == null || questionList == null) {
+            return;
+        }
+        int scoreCount = scoreList.size();
+        for (int i = 0; i < questionList.size(); i++) {
+            ExamQuestion question = questionList.get(i);
+            if (question.getTotalScore() == null || question.getTotalScore() == 0) {
+                continue;
+            }
+            ScoreItem item = scoreCount > i ? scoreList.get(i) : null;
+            double score = item != null && item.getScore() != UN_SELECTIVE_SCORE ? item.getScore() : 0;
+            process(student, question, score, totalScore);
+        }
+    }
+
+    protected void process(ExamStudent student, ExamQuestion question, double score, double totalScore) {
+        findCalculator(getKey(question)).process(score, question.getTotalScore(), totalScore);
+    }
+
+    protected String getKey(ExamQuestion question, Object... parameter) {
+        return question.getSubjectCode() + "\t" + question.isObjective() + "\t"
+                + StringUtils.trimToEmpty(question.getPaperType()) + "\t" + question.getMainNumber() + "\t"
+                + question.getSubNumber();
+    }
+
+    public void save() {
+        ReportSubjectQuestionService service = SpringContextHolder.getBean(ReportSubjectQuestionService.class);
+        for (String key : this.calculators.keySet()) {
+            String s[] = key.split("\t");
+            if (s.length > 4) {
+                String subjectCode = s[0];
+                Boolean objective = Boolean.parseBoolean(s[1]);
+                String paperType = StringUtils.trimToNull(s[2]);
+                Integer mainNumber = Integer.parseInt(s[3]);
+                String subNumber = StringUtils.trimToEmpty(s[4]);
+                BaseCalculatorUnit unit = calculators.get(key);
+                ReportSubjectQuestion r = new ReportSubjectQuestion();
+                r.setExamId(this.context.getExamId());
+                r.setSubjectCode(subjectCode);
+                r.setSubjectName(context.getSubject(subjectCode).getName());
+                r.setObjective(objective);
+                r.setQuestionName(context.getExamQuestion(key).getMainTitle());
+                r.setMainNumber(mainNumber);
+                r.setSubNumber(subNumber);
+                r.setTotalScore(unit.fullScore);
+                r.setAvgScore(unit.avgScore);
+                r.setScoreRate(unit.difficulty);
+                r.setStdev(unit.stdev);
+                r.setFullScoreRate(unit.fullScoreRate);
+                r.setPaperType(paperType);
+                r.setCoefficient(unit.coefficient);
+                r.setDifficulty(unit.difficulty);
+                r.setDiscrimination(unit.discrimination);
+                r.setMaxScore(unit.maxScore);
+                r.setMinScore(unit.minScore);
+                r.setRealityCount(unit.count);
+                r.setZeroCount(unit.zeroCount);
+                r.setFullCount(unit.fullCount);
+                r.setAnswer(context.getExamQuestion(key).getAnswer());
+                service.save(r);
+            }
+        }
+    }
+
+    protected BaseCalculatorUnit findCalculator(String key) {
+        BaseCalculatorUnit unit = calculators.get(key);
+        if (unit == null) {
+            unit = new BaseCalculatorUnit();
+            calculators.put(key, unit);
+        }
+        return unit;
+    }
+
+    @Override
+    public BaseCalculatorUnit getCalculator(ExamQuestion question, Object... parameter) {
+        return calculators.get(getKey(question, parameter));
+    }
+
+}

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectQuestionModule.java

@@ -40,7 +40,7 @@ public class SubjectQuestionModule implements Module, QuestionCalculatorProvider
         if (student.isUpload() && !student.isAbsent() && !student.isBreach() && student.getSubject() != null) {
         if (student.isUpload() && !student.isAbsent() && !student.isBreach() && student.getSubject() != null) {
             double totalScore = student.getTotalScore();
             double totalScore = student.getTotalScore();
             // 遍历客观题
             // 遍历客观题
-            process(student, student.getScoreList(true), student.getObjectiveQuestionList(), totalScore);
+//            process(student, student.getScoreList(true), student.getObjectiveQuestionList(), totalScore);
             // 遍历主观题
             // 遍历主观题
             process(student, student.getScoreList(false), student.getSubjectiveQuestionList(), totalScore);
             process(student, student.getScoreList(false), student.getSubjectiveQuestionList(), totalScore);
         }
         }

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

@@ -222,7 +222,7 @@ public class ReportSubjectRangeController extends BaseExamController {
                 taskExecutor.submit(thread);
                 taskExecutor.submit(thread);
             }
             }
         }
         }
-        return "redirect:/admin/exam/reportSubjectRange?subjectCode=" + subjectCode + "&range=" + 10;
+        return "redirect:/admin/exam/reportSubjectRange?subjectCode=" + subjectCode + "&range=" + 10 +"&objective="+objective;
     }
     }
 
 
     private JSONArray getScoreRange(String scoreRange, double totalScore, Integer totalCount, int range) {
     private JSONArray getScoreRange(String scoreRange, double totalScore, Integer totalCount, int range) {