Przeglądaj źródła

新增客观题分段统计

yin 1 rok temu
rodzic
commit
f9210fa83e

+ 38 - 234
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectRange.java

@@ -1,19 +1,16 @@
 package cn.com.qmth.stmms.biz.report.model;
 
+import java.io.Serializable;
+
 import javax.persistence.*;
 
 import cn.com.qmth.stmms.common.annotation.ExcelField;
 
-import java.io.Serializable;
-
 /**
- * 分段统计
- *
- * @author xuwenjin
- * @date 2019-04-19
+ * 客观题分段统计
  */
 @Entity
-@Table(name = "s_range_subject", indexes = {@Index(columnList = "exam_id,subject_code")})
+@Table(name = "s_basic_subject_range", indexes = { @Index(columnList = "exam_id,subject_code") })
 public class ReportSubjectRange implements Serializable {
 
     private static final long serialVersionUID = -6460526419770818333L;
@@ -45,261 +42,68 @@ public class ReportSubjectRange implements Serializable {
     @Column(name = "subject_name")
     private String subjectName;
 
-    /**
-     * 层次
-     */
-    @ExcelField(title = "课程层次", align = 2, sort = 30)
-    @Column(name = "subject_level")
-    private String level;
-
-    /**
-     * 0-49数量
-     */
-    @ExcelField(title = "0-", align = 2, sort = 40)
-    private Integer count0_49;
-
-    /**
-     * 0-49占比
-     */
-    @ExcelField(title = "0-占比(%)", align = 2, sort = 50)
-    private double percent0_49;
-
-    @ExcelField(title = "50-", align = 2, sort = 60)
-    private Integer count50_59;
-
-    @ExcelField(title = "50-占比(%)", align = 2, sort = 70)
-    private double percent50_59;
-
-    @ExcelField(title = "60-", align = 2, sort = 80)
-    private Integer count60_69;
-
-    @ExcelField(title = "60-占比(%)", align = 2, sort = 90)
-    private double percent60_69;
-
-    @ExcelField(title = "70-", align = 2, sort = 100)
-    private Integer count70_79;
-    
-    @ExcelField(title = "70-占比(%)", align = 2, sort = 110)
-    private double percent70_79;
+    @Column(name = "reality_count")
+    private Integer realityCount;
 
-    @ExcelField(title = "80-", align = 2, sort = 120)
-    private Integer count80_89;
+    @Column(name = "objective_score")
+    private Double objectiveScore;
 
-    @ExcelField(title = "80-占比(%)", align = 2, sort = 130)
-    private double percent80_89;
-
-    @ExcelField(title = "90-", align = 2, sort = 140)
-    private Integer count90_100;
-
-    @ExcelField(title = "90-占比(%)", align = 2, sort = 150)
-    private double percent90_100;
-
-    /**
-     * 小于60数量
-     */
-    @ExcelField(title = "<60", align = 2, sort = 160)
-    private Integer lt60;
-
-    /**
-     * 小于60占比
-     */
-    @ExcelField(title = "<60占比(%)", align = 2, sort = 170)
-    private double percent_lt60;
-
-    /**
-     * 大于等于60数量
-     */
-    @ExcelField(title = ">=60", align = 2, sort = 180)
-    private Integer mte60;
-
-    /**
-     * 大于等于60占比
-     */
-    @ExcelField(title = ">=60占比(%)", align = 2, sort = 190)
-    private double percent_mte60;
-
-    /**
-     * 总数
-     */
-    @ExcelField(title = "总数", align = 2, sort = 200)
-    private Integer totalCount;
-
-
-    public String getSubjectName() {
-        return subjectName;
-    }
-
-    public void setSubjectName(String subjectName) {
-        this.subjectName = subjectName;
-    }
-
-    public String getLevel() {
-        return level;
-    }
-
-    public void setLevel(String level) {
-        this.level = level;
-    }
-
-    public Integer getCount0_49() {
-        return count0_49;
-    }
-
-    public void setCount0_49(Integer count0_49) {
-        this.count0_49 = count0_49;
-    }
-
-    public double getPercent0_49() {
-        return percent0_49;
-    }
-
-    public void setPercent0_49(double percent0_49) {
-        this.percent0_49 = percent0_49;
-    }
-
-    public Integer getCount50_59() {
-        return count50_59;
-    }
-
-    public void setCount50_59(Integer count50_59) {
-        this.count50_59 = count50_59;
-    }
-
-    public double getPercent50_59() {
-        return percent50_59;
-    }
-
-    public void setPercent50_59(double percent50_59) {
-        this.percent50_59 = percent50_59;
-    }
-
-    public Integer getCount60_69() {
-        return count60_69;
-    }
+    @Column(name = "objective_score_range", nullable = true, columnDefinition = "text")
+    private String objectiveScoreRange;
 
-    public void setCount60_69(Integer count60_69) {
-        this.count60_69 = count60_69;
-    }
-
-    public double getPercent60_69() {
-        return percent60_69;
-    }
-
-    public void setPercent60_69(double percent60_69) {
-        this.percent60_69 = percent60_69;
-    }
-
-    public Integer getCount70_79() {
-        return count70_79;
-    }
-
-    public void setCount70_79(Integer count70_79) {
-        this.count70_79 = count70_79;
-    }
-
-    public double getPercent70_79() {
-        return percent70_79;
-    }
-
-    public void setPercent70_79(double percent70_79) {
-        this.percent70_79 = percent70_79;
-    }
-
-    public Integer getCount80_89() {
-        return count80_89;
-    }
-
-    public void setCount80_89(Integer count80_89) {
-        this.count80_89 = count80_89;
-    }
-
-    public double getPercent80_89() {
-        return percent80_89;
-    }
-
-    public void setPercent80_89(double percent80_89) {
-        this.percent80_89 = percent80_89;
-    }
-
-    public Integer getCount90_100() {
-        return count90_100;
-    }
-
-    public void setCount90_100(Integer count90_100) {
-        this.count90_100 = count90_100;
-    }
-
-    public double getPercent90_100() {
-        return percent90_100;
-    }
-
-    public void setPercent90_100(double percent90_100) {
-        this.percent90_100 = percent90_100;
-    }
-
-    public Integer getLt60() {
-        return lt60;
-    }
-
-    public void setLt60(Integer lt60) {
-        this.lt60 = lt60;
-    }
-
-
-    public Integer getMte60() {
-        return mte60;
+    public Integer getId() {
+        return id;
     }
 
-    public void setMte60(Integer mte60) {
-        this.mte60 = mte60;
+    public void setId(Integer id) {
+        this.id = id;
     }
 
-    public double getPercent_lt60() {
-        return percent_lt60;
+    public Integer getExamId() {
+        return examId;
     }
 
-    public void setPercent_lt60(double percent_lt60) {
-        this.percent_lt60 = percent_lt60;
+    public void setExamId(Integer examId) {
+        this.examId = examId;
     }
 
-    public double getPercent_mte60() {
-        return percent_mte60;
+    public String getSubjectCode() {
+        return subjectCode;
     }
 
-    public void setPercent_mte60(double percent_mte60) {
-        this.percent_mte60 = percent_mte60;
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
     }
 
-    public Integer getTotalCount() {
-        return totalCount;
+    public String getSubjectName() {
+        return subjectName;
     }
 
-    public void setTotalCount(Integer totalCount) {
-        this.totalCount = totalCount;
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
     }
 
-
-    public Integer getId() {
-        return id;
+    public String getObjectiveScoreRange() {
+        return objectiveScoreRange;
     }
 
-    public void setId(Integer id) {
-        this.id = id;
+    public void setObjectiveScoreRange(String objectiveScoreRange) {
+        this.objectiveScoreRange = objectiveScoreRange;
     }
 
-    public Integer getExamId() {
-        return examId;
+    public Integer getRealityCount() {
+        return realityCount;
     }
 
-    public void setExamId(Integer examId) {
-        this.examId = examId;
+    public void setRealityCount(Integer realityCount) {
+        this.realityCount = realityCount;
     }
 
-    public String getSubjectCode() {
-        return subjectCode;
+    public Double getObjectiveScore() {
+        return objectiveScore;
     }
 
-    public void setSubjectCode(String subjectCode) {
-        this.subjectCode = subjectCode;
+    public void setObjectiveScore(Double objectiveScore) {
+        this.objectiveScore = objectiveScore;
     }
 }

+ 1 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportService.java

@@ -18,4 +18,5 @@ public interface ReportService {
 
     void reportExamObjective(Integer examId, Set<String> subjectCodeSet);
 
+    void deleteObjectiveData(Integer examId, String subjectCode);
 }

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

@@ -18,4 +18,6 @@ public interface ReportSubjectRangeService {
     ReportSubjectRange save(ReportSubjectRange r);
 
     void deleteByExamIdAndSubjectCode(Integer examId, String subjectCode);
+
+    ReportSubjectRange findOne(int examId, String subjectCode);
 }

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

@@ -133,7 +133,6 @@ public class ReportServiceImpl implements ReportService {
     @Override
     public void deleteData(Integer examId, String subjectCode) {
         reportSubjectService.deleteByExamIdAndSubjectCode(examId, subjectCode);
-        reportSubjectRangeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectCollegeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectTeacherService.deleteByExamIdAndSubjectCode(examId, subjectCode);
         reportSubjectTeacherClassService.deleteByExamIdAndSubjectCode(examId, subjectCode);
@@ -143,6 +142,11 @@ public class ReportServiceImpl implements ReportService {
         reportSubjectClassGroupService.deleteByExamIdAndSubjectCode(examId, subjectCode);
     }
 
+    @Override
+    public void deleteObjectiveData(Integer examId, String subjectCode) {
+        reportSubjectRangeService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+    }
+
     @Override
     public void reportExam(Integer examId, Set<String> subjectCodeSet) {
 
@@ -239,7 +243,7 @@ public class ReportServiceImpl implements ReportService {
             try {
                 log.info("start report for examId=" + examId + ", subjectCode=" + subjectCode);
                 // 删除原有统计数据
-                // this.deleteObjectiveData(examId, subjectCode);
+                this.deleteObjectiveData(examId, subjectCode);
                 context = new ReportContext(exam);
                 int pageNumber = 1;
                 int pageSize = 1000;
@@ -248,15 +252,15 @@ public class ReportServiceImpl implements ReportService {
                 while (list != null && list.size() > 0) {
                     for (ExamStudent student : list) {
                         // 统计
-                        statistic(student);
+                        statisticObjective(student);
                     }
                     pageNumber++;
                     list = studentService.findByExamIdAndSubjectCode(examId, subjectCode, pageNumber, pageSize);
                 }
                 // 结束统计
-                context.save();
+                context.saveObjective();
                 // 生成文件
-                reoprtExcel(examId, subjectCode);
+                // reoprtExcel(examId, subjectCode);
             } catch (Exception e) {
                 log.error("report exception for examId=" + examId + ", subjectCode=" + subjectCode, e);
             } finally {
@@ -280,6 +284,16 @@ public class ReportServiceImpl implements ReportService {
         }
     }
 
+    private void statisticObjective(ExamStudent student) {
+        ExamSubject subject = findExamSubject(student.getExamId(), student.getSubjectCode());
+        if (subject.getObjectiveScore() > 0) {
+            student.setSubject(subject);
+            student.setObjectiveQuestionList(
+                    findQuestionList(student.getExamId(), student.getSubjectCode(), student.getPaperType(), true));
+            context.processObjective(student);
+        }
+    }
+
     private List<ExamQuestion> findQuestionList(int examId, String subjectCode, String paperType, boolean objective) {
         if (objective) {
             String key = subjectCode + "_" + StringUtils.trimToEmpty(paperType);

+ 24 - 14
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectRangeServiceImpl.java

@@ -1,10 +1,13 @@
 package cn.com.qmth.stmms.biz.report.service.impl;
 
-import cn.com.qmth.stmms.biz.common.BaseQueryService;
-import cn.com.qmth.stmms.biz.report.dao.ReportSubjectRangeDao;
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
-import cn.com.qmth.stmms.biz.report.query.ReportSubjectRangeQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -12,12 +15,11 @@ import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.persistence.criteria.CriteriaBuilder;
-import javax.persistence.criteria.CriteriaQuery;
-import javax.persistence.criteria.Predicate;
-import javax.persistence.criteria.Root;
-import java.util.LinkedList;
-import java.util.List;
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectRangeDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
+import cn.com.qmth.stmms.biz.report.query.ReportSubjectRangeQuery;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
 
 /**
  * 课程分段统计 service 实现
@@ -44,6 +46,15 @@ public class ReportSubjectRangeServiceImpl extends BaseQueryService<ReportSubjec
         reportSubjectRangetDao.deleteByExamIdAndSubjectCode(examId, subjectCode);
     }
 
+    @Override
+    public ReportSubjectRange findOne(int examId, String subjectCode) {
+        ReportSubjectRangeQuery query = new ReportSubjectRangeQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        List<ReportSubjectRange> list = findByQuery(query).getResult();
+        return list.isEmpty() ? null : list.get(0);
+    }
+
     @Override
     public ReportSubjectRangeQuery findByQuery(final ReportSubjectRangeQuery query) {
         checkQuery(query);
@@ -59,9 +70,8 @@ public class ReportSubjectRangeServiceImpl extends BaseQueryService<ReportSubjec
                 if (StringUtils.isNotBlank(query.getSubjectCode())) {
                     predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
                 }
-                return predicates.isEmpty() ?
-                        cb.conjunction() :
-                        cb.and(predicates.toArray(new Predicate[predicates.size()]));
+                return predicates.isEmpty() ? cb.conjunction()
+                        : cb.and(predicates.toArray(new Predicate[predicates.size()]));
             }
         }, query);
         fillResult(result, query);

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

@@ -14,20 +14,7 @@ import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.report.model.SasConfigItem;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherClassService;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectClassGroupModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectClassModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectClassQuestionLevelModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectClassQuestionModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectClassRangeModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectCollegeModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectGroupModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectQuestionLevelModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectQuestionModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectQuestionOptionModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectRangeModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectTeacherClassModule;
-import cn.com.qmth.stmms.biz.report.utils.module.SubjectTeacherModule;
+import cn.com.qmth.stmms.biz.report.utils.module.*;
 import cn.com.qmth.stmms.biz.report.utils.unit.LevelRange;
 import cn.com.qmth.stmms.biz.utils.SpringContextHolder;
 
@@ -37,6 +24,8 @@ public class ReportContext {
 
     private List<Module> modules;
 
+    private Module objectiveModule;
+
     private Map<String, ExamSubject> subjectMap;
 
     private Map<String, ExamQuestion> questionMap;
@@ -75,6 +64,8 @@ public class ReportContext {
 
         this.modules.add(new SubjectQuestionOptionModule(this));
 
+        this.objectiveModule = new SubjectObjectiveRangeModule(this);
+
     }
 
     public void process(ExamStudent student) {
@@ -84,6 +75,11 @@ public class ReportContext {
         }
     }
 
+    public void processObjective(ExamStudent student) {
+        putMap(student);
+        this.objectiveModule.process(student);
+    }
+
     private void putMap(ExamStudent student) {
         subjectMap.put(student.getSubjectCode(), student.getSubject());
         for (ExamQuestion question : student.getObjectiveQuestionList()) {
@@ -130,6 +126,10 @@ public class ReportContext {
         teacherClassService.updateRelativeAvgScore(this.getExamId());
     }
 
+    public void saveObjective() {
+        this.objectiveModule.save();
+    }
+
     public Double getPassScore() {
         if (exam.getPassScore() != null) {
             return exam.getPassScore();

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

@@ -0,0 +1,68 @@
+package cn.com.qmth.stmms.biz.report.utils.module;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
+import cn.com.qmth.stmms.biz.report.utils.Module;
+import cn.com.qmth.stmms.biz.report.utils.ReportContext;
+import cn.com.qmth.stmms.biz.report.utils.unit.RangeCounter;
+import cn.com.qmth.stmms.biz.utils.SpringContextHolder;
+import net.sf.json.JSONObject;
+
+public class SubjectObjectiveRangeModule implements Module {
+
+    private Map<String, RangeCounter> counters;
+
+    private ReportContext context;
+
+    public SubjectObjectiveRangeModule(ReportContext context) {
+        this.counters = new HashMap<String, RangeCounter>();
+        this.context = context;
+    }
+
+    @Override
+    public void process(ExamStudent student) {
+        if (student.isUpload() && !student.isAbsent() && !student.isBreach() && student.getSubject() != null) {
+            findCounter(getKey(student)).process(student.getObjectiveScore());
+        }
+    }
+
+    public String getKey(ExamStudent student) {
+        return student.getSubjectCode();
+    }
+
+    @Override
+    public void save() {
+        ReportSubjectRangeService service = SpringContextHolder.getBean(ReportSubjectRangeService.class);
+        for (String subjectCode : this.counters.keySet()) {
+            RangeCounter counter = counters.get(subjectCode);
+            ReportSubjectRange subjectRange = new ReportSubjectRange();
+            subjectRange.setExamId(this.context.getExamId());
+            subjectRange.setSubjectCode(subjectCode);
+            subjectRange.setSubjectName(context.getSubject(subjectCode).getName());
+            subjectRange.setObjectiveScore(context.getSubject(subjectCode).getObjectiveScore());
+            subjectRange.setRealityCount(counter.totalCount);
+            JSONObject scoreRange = new JSONObject();
+            for (int i = 0; i < subjectRange.getObjectiveScore() + 1; i++) {
+                scoreRange.accumulate(String.valueOf(i), counter.countGeAndLt((double) i, (double) (i + 1)));
+            }
+            subjectRange.setObjectiveScoreRange(scoreRange.toString());
+            service.save(subjectRange);
+        }
+
+    }
+
+    private RangeCounter findCounter(String key) {
+        RangeCounter counter = counters.get(key);
+        if (counter == null) {
+            counter = new RangeCounter();
+            counter.interval = context.getRangeInterval();
+            counters.put(key, counter);
+        }
+        return counter;
+    }
+
+}

+ 10 - 28
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectRangeModule.java

@@ -5,17 +5,16 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import net.sf.json.JSONObject;
 import cn.com.qmth.stmms.biz.exam.dao.ExamStudentDao;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.report.model.ReportSubject;
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectRangeService;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
 import cn.com.qmth.stmms.biz.report.utils.Module;
 import cn.com.qmth.stmms.biz.report.utils.ReportContext;
 import cn.com.qmth.stmms.biz.report.utils.unit.RangeCounter;
 import cn.com.qmth.stmms.biz.utils.SpringContextHolder;
+import net.sf.json.JSONObject;
 
 public class SubjectRangeModule implements Module {
 
@@ -28,6 +27,7 @@ public class SubjectRangeModule implements Module {
         this.context = context;
     }
 
+    @Override
     public void process(ExamStudent student) {
         if (student.isUpload() && !student.isAbsent() && !student.isBreach() && student.getSubject() != null) {
             findCounter(getKey(student)).process(student.getTotalScore());
@@ -38,34 +38,16 @@ public class SubjectRangeModule implements Module {
         return student.getSubjectCode();
     }
 
+    @Override
     public void save() {
         ReportSubjectRangeService service = SpringContextHolder.getBean(ReportSubjectRangeService.class);
         for (String subjectCode : this.counters.keySet()) {
             RangeCounter counter = counters.get(subjectCode);
-            ReportSubjectRange subjectRange = new ReportSubjectRange();
-            subjectRange.setExamId(this.context.getExamId());
-            subjectRange.setSubjectCode(subjectCode);
-            subjectRange.setSubjectName(context.getSubject(subjectCode).getName());
-            subjectRange.setLevel(context.getSubject(subjectCode).getLevel());
-            subjectRange.setCount0_49(counter.countGeAndLt(0d, 50d));
-            subjectRange.setCount50_59(counter.countGeAndLt(50d, 60d));
-            subjectRange.setCount60_69(counter.countGeAndLt(60d, 70d));
-            subjectRange.setCount70_79(counter.countGeAndLt(70d, 80d));
-            subjectRange.setCount80_89(counter.countGeAndLt(80d, 90d));
-            subjectRange.setCount90_100(counter.countGeAndLt(90d, null));
-            subjectRange.setLt60(counter.countGeAndLt(0d, 60d));
-            subjectRange.setMte60(counter.countGeAndLt(60d, null));
-            subjectRange.setTotalCount(counter.totalCount);
-            subjectRange.setPercent0_49(counter.countGeAndLt(0d, 50d) * 1.0 / counter.totalCount);
-            subjectRange.setPercent50_59(counter.countGeAndLt(50d, 60d) * 1.0 / counter.totalCount);
-            subjectRange.setPercent60_69(counter.countGeAndLt(60d, 70d) * 1.0 / counter.totalCount);
-            subjectRange.setPercent70_79(counter.countGeAndLt(70d, 80d) * 1.0 / counter.totalCount);
-            subjectRange.setPercent80_89(counter.countGeAndLt(80d, 90d) * 1.0 / counter.totalCount);
-            subjectRange.setPercent90_100(counter.countGeAndLt(90d, null) * 1.0 / counter.totalCount);
-            subjectRange.setPercent_lt60(counter.countGeAndLt(0d, 60d) * 1.0 / counter.totalCount);
-            subjectRange.setPercent_mte60(counter.countGeAndLt(60d, null) * 1.0 / counter.totalCount);
-            service.save(subjectRange);
-
+            // ReportSubjectRange subjectRange = new ReportSubjectRange();
+            // subjectRange.setExamId(this.context.getExamId());
+            // subjectRange.setSubjectCode(subjectCode);
+            // subjectRange.setSubjectName(context.getSubject(subjectCode).getName());
+            // service.save(subjectRange);
             ReportSubjectService subjectService = SpringContextHolder.getBean(ReportSubjectService.class);
             ExamStudentDao studentDao = SpringContextHolder.getBean(ExamStudentDao.class);
             ReportSubject subject = subjectService.findOne(this.context.getExamId(), subjectCode);
@@ -76,8 +58,8 @@ public class SubjectRangeModule implements Module {
                     subjectCode, (int) highCount);
             List<BigDecimal> lowScore = studentDao.findLowCountTotalSocreByExamIdAndSubjectCode(context.getExamId(),
                     subjectCode, (int) lowCount);
-            rangeLevel.accumulate("highScore", highScore.isEmpty() ? 0 : highScore.get(highScore.size() - 1)
-                    .doubleValue());
+            rangeLevel.accumulate("highScore",
+                    highScore.isEmpty() ? 0 : highScore.get(highScore.size() - 1).doubleValue());
             rangeLevel.accumulate("lowScore", lowScore.isEmpty() ? 0 : lowScore.get(lowScore.size() - 1).doubleValue());
             subject.setRangeLevel(rangeLevel.toString());
 

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

@@ -2,18 +2,11 @@ package cn.com.qmth.stmms.admin.report;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
-
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -26,27 +19,21 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
+import com.qmth.boot.tools.io.ZipWriter;
+
 import cn.com.qmth.stmms.admin.exam.BaseExamController;
+import cn.com.qmth.stmms.admin.thread.ScoreReportObjectiveThread;
 import cn.com.qmth.stmms.admin.thread.ScoreReportThread;
 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.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.MarkGroupService;
+import cn.com.qmth.stmms.biz.exam.service.*;
 import cn.com.qmth.stmms.biz.file.enums.FormatType;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.report.model.ReportSubject;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectRange;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
-import cn.com.qmth.stmms.biz.report.service.ReportService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectCollegeService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
-import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
+import cn.com.qmth.stmms.biz.report.service.*;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
@@ -55,8 +42,8 @@ import cn.com.qmth.stmms.common.enums.LogType;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.Encodes;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-
-import com.qmth.boot.tools.io.ZipWriter;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
 
 /**
  * 课程分段统计
@@ -116,6 +103,9 @@ public class ReportSubjectRangeController extends BaseExamController {
     @Autowired
     private ReportSubjectGroupService reportSubjectGroupService;
 
+    @Autowired
+    private ReportSubjectRangeService reportSubjectRangeService;
+
     @Logging(menu = "课程分段统计", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ReportSubjectQuery query) {
@@ -123,15 +113,23 @@ public class ReportSubjectRangeController extends BaseExamController {
         int examId = getSessionExamId(request);
         List<ExamSubject> sList = getExamSubject(examId, wu);
         if (StringUtils.isNotBlank(query.getSubjectCode()) && query.getRange() != null) {
-            ReportSubject subject = reportSubjectService.findOne(examId, query.getSubjectCode());
-            if (subject != null && subject.getScoreRange() != null && subject.getTotalScore() != null
-                    && subject.getRealityCount() != null) {
-                model.addAttribute(
-                        "total",
-                        getScoreRange(subject.getScoreRange(), subject.getTotalScore(), subject.getRealityCount(),
-                                query.getRange()));
+            if (query.getObjective()) {
+                ReportSubjectRange subjectRange = reportSubjectRangeService.findOne(examId, query.getSubjectCode());
+                if (subjectRange != null && subjectRange.getObjectiveScoreRange() != null
+                        && subjectRange.getObjectiveScore() != null && subjectRange.getRealityCount() != null) {
+                    model.addAttribute("total", getScoreRange(subjectRange.getObjectiveScoreRange(),
+                            subjectRange.getObjectiveScore(), subjectRange.getRealityCount(), query.getRange()));
+                }
+            } else {
+                ReportSubject subject = reportSubjectService.findOne(examId, query.getSubjectCode());
+                if (subject != null && subject.getScoreRange() != null && subject.getTotalScore() != null
+                        && subject.getRealityCount() != null) {
+                    model.addAttribute("total", getScoreRange(subject.getScoreRange(), subject.getTotalScore(),
+                            subject.getRealityCount(), query.getRange()));
+                }
             }
-            model.addAttribute("locked", lockService.isLocked(LockType.SCORE_CALCULATE, examId, query.getSubjectCode()));
+            model.addAttribute("locked",
+                    lockService.isLocked(LockType.SCORE_CALCULATE, examId, query.getSubjectCode()));
         }
         model.addAttribute("oldSubjectCode", query.getSubjectCode());
         model.addAttribute("subjectList", sList);
@@ -200,7 +198,7 @@ public class ReportSubjectRangeController extends BaseExamController {
     @RequestMapping("/report")
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN })
     public String calculate(HttpServletRequest request, RedirectAttributes redirectAttributes,
-            @RequestParam String subjectCode) {
+            @RequestParam String subjectCode, @RequestParam boolean objective) {
         int examId = getSessionExamId(request);
         Set<String> subjectSet = new HashSet<String>();
         if (!lockService.isLocked(LockType.SCORE_CALCULATE, examId, subjectCode)) {
@@ -209,8 +207,13 @@ public class ReportSubjectRangeController extends BaseExamController {
         if (!subjectSet.isEmpty()) {
             Map<Integer, Set<String>> map = new HashMap<Integer, Set<String>>();
             map.put(examId, subjectSet);
-            ScoreReportThread thread = new ScoreReportThread(map, reportService, false);
-            taskExecutor.submit(thread);
+            if (objective) {
+                ScoreReportThread thread = new ScoreReportThread(map, reportService, false);
+                taskExecutor.submit(thread);
+            } else {
+                ScoreReportObjectiveThread thread = new ScoreReportObjectiveThread(map, reportService, false);
+                taskExecutor.submit(thread);
+            }
         }
         return "redirect:/admin/exam/reportSubjectRange?subjectCode=" + subjectCode + "&range=" + 10;
     }