Преглед на файлове

增加班级大题维度统计;统计配置项;

ting.yin преди 6 години
родител
ревизия
5908b22940
променени са 23 файла, в които са добавени 874 реда и са изтрити 55 реда
  1. 14 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java
  2. 21 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectClassGroupDao.java
  3. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectGroupDao.java
  4. 63 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubject.java
  5. 56 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectClass.java
  6. 187 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectClassGroup.java
  7. 56 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectGroup.java
  8. 15 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectQuestion.java
  9. 202 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/SasConfigItem.java
  10. 13 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectClassGroupService.java
  11. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectGroupService.java
  12. 2 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectQuestionService.java
  13. 6 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportServiceImpl.java
  14. 36 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectClassGroupServiceImpl.java
  15. 6 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectGroupServiceImpl.java
  16. 6 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectQuestionServiceImpl.java
  17. 20 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/ReportContext.java
  18. 107 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectClassGroupModule.java
  19. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectClassModule.java
  20. 20 18
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectGroupModule.java
  21. 22 16
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectQuestionModule.java
  22. 1 0
      stmms-web/src/main/webapp/WEB-INF/applicationContext.xml
  23. 12 0
      stmms-web/src/main/webapp/WEB-INF/sas.properties

+ 14 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -92,6 +92,12 @@ public class Exam implements Serializable {
     @Column(name = "process")
     private Double process;
 
+    /**
+     * 统计配置
+     */
+    @Column(name = "sas_config", nullable = true)
+    private String sasConfig;
+
     public Integer getId() {
         return id;
     }
@@ -216,4 +222,12 @@ public class Exam implements Serializable {
         this.process = process;
     }
 
+    public String getSasConfig() {
+        return sasConfig;
+    }
+
+    public void setSasConfig(String sasConfig) {
+        this.sasConfig = sasConfig;
+    }
+
 }

+ 21 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectClassGroupDao.java

@@ -0,0 +1,21 @@
+package cn.com.qmth.stmms.biz.report.dao;
+
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectClassGroup;
+
+public interface ReportSubjectClassGroupDao extends PagingAndSortingRepository<ReportSubjectClassGroup, Integer>,
+        JpaSpecificationExecutor<ReportSubjectClassGroup> {
+
+    @Modifying
+    @Query("delete from ReportSubjectClassGroup r where r.examId=?1 ")
+    void deleteByExamId(Integer exmaId);
+
+    @Modifying
+    @Query("update ReportSubjectClassGroup r set r.questionCount = (select count(*) from ExamQuestion q where q.examId=?1 and q.groupNumber = r.groupNumber and q.subjectCode = r.subjectCode and q.examId = r.examId ) where r.examId=?1  ")
+    void updateQuestionCount(Integer examId);
+
+}

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectGroupDao.java

@@ -20,4 +20,8 @@ public interface ReportSubjectGroupDao extends PagingAndSortingRepository<Report
     @Query("delete from ReportSubjectGroup r where r.examId=?1 ")
     void deleteByExamId(Integer exmaId);
 
+    @Modifying
+    @Query("update ReportSubjectGroup r set r.questionCount = (select count(*) from ExamQuestion q where q.examId=?1 and q.groupNumber = r.groupNumber and q.subjectCode = r.subjectCode and q.examId = r.examId ) where r.examId=?1  ")
+    void updateQuestionCount(Integer examId);
+
 }

+ 63 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubject.java

@@ -1,10 +1,19 @@
 package cn.com.qmth.stmms.biz.report.model;
 
-import javax.persistence.*;
+import java.io.Serializable;
+import java.util.LinkedList;
+import java.util.List;
 
-import cn.com.qmth.stmms.common.annotation.ExcelField;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.Table;
 
-import java.io.Serializable;
+import org.apache.commons.lang3.StringUtils;
+
+import cn.com.qmth.stmms.common.annotation.ExcelField;
 
 /**
  * 课程总量分析
@@ -13,11 +22,14 @@ import java.io.Serializable;
  * @date 2019-04-11
  */
 @Entity
-@Table(name = "s_basic_subject", indexes = {@Index(name = "subject_index",columnList = "exam_id,subject_code")})
+@Table(name = "s_basic_subject", indexes = { @Index(name = "subject_index", columnList = "exam_id,subject_code") })
 public class ReportSubject implements Serializable {
 
     private static final long serialVersionUID = -1596478079357284914L;
 
+    // 数据库中多个单元紧凑保存的拼接符
+    public static final String DB_ITEM_JOINER = ",";
+
     /**
      * 主键
      */
@@ -108,6 +120,18 @@ public class ReportSubject implements Serializable {
     @Column(name = "reality_count")
     private Integer realityCount;
 
+    /**
+     * 分段统计
+     */
+    @Column(name = "score_range", nullable = true)
+    private String scoreRange;
+
+    /**
+     * 所有选项
+     */
+    @Column(name = "options", nullable = true)
+    private String options;
+
     public Integer getId() {
         return id;
     }
@@ -212,4 +236,39 @@ public class ReportSubject implements Serializable {
         this.realityCount = realityCount;
     }
 
+    public String getScoreRange() {
+        return scoreRange;
+    }
+
+    public void setScoreRange(String scoreRange) {
+        this.scoreRange = scoreRange;
+    }
+
+    public String getOptions() {
+        return options;
+    }
+
+    public void setOptions(String options) {
+        this.options = options;
+    }
+
+    public void addOptions(String option) {
+        options = StringUtils.trimToNull(options);
+        StringBuilder sb = new StringBuilder(options);
+        if (options != null) {
+            sb.append(DB_ITEM_JOINER);
+        }
+        sb.append(option);
+        this.options = sb.toString();
+    }
+
+    public List<String> getOptionList() {
+        List<String> list = new LinkedList<String>();
+        options = StringUtils.trimToEmpty(options);
+        String[] values = StringUtils.split(options, DB_ITEM_JOINER);
+        for (String value : values) {
+            list.add(value);
+        }
+        return list;
+    }
 }

+ 56 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectClass.java

@@ -106,6 +106,30 @@ public class ReportSubjectClass implements Serializable {
     @Column(name = "avg_score")
     private Double avgScore;
 
+    /**
+     * 差异系数
+     */
+    @Column(name = "coefficient", nullable = true, length = 32)
+    private Double coefficient;
+
+    /**
+     * 难度
+     */
+    @Column(name = "difficulty", nullable = true, length = 32)
+    private Double difficulty;
+
+    /**
+     * 标准差
+     */
+    @Column(name = "stdev")
+    private Double stdev;
+
+    /**
+     * 分段统计
+     */
+    @Column(name = "score_range", nullable = true)
+    private String scoreRange;
+
     public Integer getId() {
         return id;
     }
@@ -202,4 +226,36 @@ public class ReportSubjectClass implements Serializable {
         this.avgScore = avgScore;
     }
 
+    public Double getCoefficient() {
+        return coefficient;
+    }
+
+    public void setCoefficient(Double coefficient) {
+        this.coefficient = coefficient;
+    }
+
+    public Double getDifficulty() {
+        return difficulty;
+    }
+
+    public void setDifficulty(Double difficulty) {
+        this.difficulty = difficulty;
+    }
+
+    public Double getStdev() {
+        return stdev;
+    }
+
+    public void setStdev(Double stdev) {
+        this.stdev = stdev;
+    }
+
+    public String getScoreRange() {
+        return scoreRange;
+    }
+
+    public void setScoreRange(String scoreRange) {
+        this.scoreRange = scoreRange;
+    }
+
 }

+ 187 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectClassGroup.java

@@ -0,0 +1,187 @@
+package cn.com.qmth.stmms.biz.report.model;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.Table;
+
+import cn.com.qmth.stmms.common.annotation.ExcelField;
+
+/**
+ * 
+ * @Description: 班级大题分析
+ * @author ting.yin
+ * @date 2019年6月19日
+ */
+@Entity
+@Table(name = "s_basic_subject_class_group", indexes = { @Index(columnList = "exam_id,subject_code") })
+public class ReportSubjectClassGroup implements Serializable {
+
+    private static final long serialVersionUID = 9150848313841148117L;
+
+    /**
+     * 主键
+     */
+    @Id
+    @GeneratedValue
+    private Integer id;
+
+    /**
+     * 考试id
+     */
+    @Column(name = "exam_id")
+    private Integer examId;
+
+    /**
+     * 课程编号
+     */
+    @ExcelField(title = "课程代码", align = 2, sort = 10)
+    @Column(name = "subject_code")
+    private String subjectCode;
+
+    /**
+     * 课程名称
+     */
+    @ExcelField(title = "课程名称", align = 2, sort = 20)
+    @Column(name = "subject_name")
+    private String subjectName;
+
+    /**
+     * 班级
+     */
+    @ExcelField(title = "班级", align = 2, sort = 30)
+    @Column(name = "class_name")
+    private String className;
+
+    /**
+     * 大题
+     */
+    @ExcelField(title = "大题名称", align = 2, sort = 40)
+    @Column(name = "group_name")
+    private String groupName;
+
+    /**
+     * 大题号
+     */
+    @ExcelField(title = "大题号", align = 2, sort = 50)
+    @Column(name = "group_number")
+    private Integer groupNumber;
+
+    /**
+     * 满分
+     */
+    @ExcelField(title = "满分", align = 2, sort = 60)
+    @Column(name = "total_score")
+    private Double totalScore;
+
+    /**
+     * 是否客观
+     */
+    @Column(name = "objective")
+    private Boolean objective;
+
+    /**
+     * 区分度
+     */
+    @Column(name = "discrimination", nullable = true, length = 32)
+    private Double discrimination;
+
+    /**
+     * 题目数量
+     */
+    @Column(name = "question_count")
+    private Integer questionCount;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public String getGroupName() {
+        return groupName;
+    }
+
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public Integer getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public Boolean getObjective() {
+        return objective;
+    }
+
+    public void setObjective(Boolean objective) {
+        this.objective = objective;
+    }
+
+    public Double getDiscrimination() {
+        return discrimination;
+    }
+
+    public void setDiscrimination(Double discrimination) {
+        this.discrimination = discrimination;
+    }
+
+    public Integer getQuestionCount() {
+        return questionCount;
+    }
+
+    public void setQuestionCount(Integer questionCount) {
+        this.questionCount = questionCount;
+    }
+
+}

+ 56 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectGroup.java

@@ -133,6 +133,30 @@ public class ReportSubjectGroup implements Serializable {
     @Column(name = "objective")
     private Boolean objective;
 
+    /**
+     * 难度
+     */
+    @Column(name = "difficulty", nullable = true, length = 32)
+    private Double difficulty;
+
+    /**
+     * 区分度
+     */
+    @Column(name = "discrimination", nullable = true, length = 32)
+    private Double discrimination;
+
+    /**
+     * 实考人数
+     */
+    @Column(name = "reality_count")
+    private Integer realityCount;
+
+    /**
+     * 题目数量
+     */
+    @Column(name = "question_count")
+    private Integer questionCount;
+
     public Integer getId() {
         return id;
     }
@@ -261,4 +285,36 @@ public class ReportSubjectGroup implements Serializable {
         this.objective = objective;
     }
 
+    public Double getDifficulty() {
+        return difficulty;
+    }
+
+    public void setDifficulty(Double difficulty) {
+        this.difficulty = difficulty;
+    }
+
+    public Double getDiscrimination() {
+        return discrimination;
+    }
+
+    public void setDiscrimination(Double discrimination) {
+        this.discrimination = discrimination;
+    }
+
+    public Integer getRealityCount() {
+        return realityCount;
+    }
+
+    public void setRealityCount(Integer realityCount) {
+        this.realityCount = realityCount;
+    }
+
+    public Integer getQuestionCount() {
+        return questionCount;
+    }
+
+    public void setQuestionCount(Integer questionCount) {
+        this.questionCount = questionCount;
+    }
+
 }

+ 15 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectQuestion.java

@@ -156,11 +156,17 @@ public class ReportSubjectQuestion implements Serializable {
     private Integer zeroCount;
 
     /**
-     * 实考人
+     * 有效卷
      */
     @Column(name = "reality_count")
     private Integer realityCount;
 
+    /**
+     * 选项分析
+     */
+    @Column(name = "options", nullable = true)
+    private String options;
+
     public Integer getId() {
         return id;
     }
@@ -329,4 +335,12 @@ public class ReportSubjectQuestion implements Serializable {
         this.realityCount = realityCount;
     }
 
+    public String getOptions() {
+        return options;
+    }
+
+    public void setOption(String options) {
+        this.options = options;
+    }
+    
 }

+ 202 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/SasConfigItem.java

@@ -0,0 +1,202 @@
+package cn.com.qmth.stmms.biz.report.model;
+
+import net.sf.json.JSONObject;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * 
+ * @Description: 统计配置项
+ * @author ting.yin
+ * @date 2019年6月18日
+ */
+@Component
+public class SasConfigItem {
+
+    // 及格分数
+    @Value("${sas.passScore}")
+    private Double passScore;
+
+    // 优秀分数
+    @Value("${sas.excellentScore}")
+    private Double excellentScore;
+
+    // 区分度优
+    @Value("${sas.discriminationExcellentScore}")
+    private Double discriminationExcellentScore;
+
+    // 区分度良
+    @Value("${sas.discriminationGoodScore}")
+    private Double discriminationGoodScore;
+
+    // 区分度可
+    @Value("${sas.discriminationGeneralScore}")
+    private Double discriminationGeneralScore;
+
+    // 区分度差
+    @Value("${sas.discriminationBadScore}")
+    private Double discriminationBadScore;
+
+    // 难度高
+    @Value("${sas.difficultyHighScore}")
+    private Double difficultyHighScore;
+
+    // 难度中
+    @Value("${sas.difficultyMiddleScore}")
+    private Double difficultyMiddleScore;
+
+    // 难度低
+    @Value("${sas.difficultyLowScore}")
+    private Double difficultyLowScore;
+
+    // 高分段
+    @Value("${sas.highScore}")
+    private Double highScore;
+
+    // 低分段
+    @Value("${sas.lowScore}")
+    private Double lowScore;
+
+    public SasConfigItem() {
+
+    }
+
+    public SasConfigItem(String text) {
+        text = StringUtils.trimToEmpty(text);
+        try {
+            JSONObject jsonObject = JSONObject.fromObject(text);
+            lowScore = jsonObject.getDouble("lowScore");
+        } catch (Exception e) {
+            throw new IllegalArgumentException("Invalid SasConfigItem init text:" + text);
+        }
+    }
+
+    public static SasConfigItem parse(SasConfigItem configItem, String text) {
+        SasConfigItem item = new SasConfigItem(text);
+        if (item.getDifficultyHighScore() != null) {
+            configItem.setDifficultyHighScore(item.getDifficultyHighScore());
+        }
+        if (item.getDifficultyLowScore() != null) {
+            configItem.setDifficultyLowScore(item.getDifficultyLowScore());
+        }
+        if (item.getDifficultyMiddleScore() != null) {
+            configItem.setDifficultyMiddleScore(item.getDifficultyMiddleScore());
+        }
+        if (item.getDiscriminationBadScore() != null) {
+            configItem.setDiscriminationBadScore(item.getDiscriminationBadScore());
+        }
+        if (item.getDiscriminationExcellentScore() != null) {
+            configItem.setDiscriminationExcellentScore(item.getDiscriminationExcellentScore());
+        }
+        if (item.getDiscriminationGoodScore() != null) {
+            configItem.setDiscriminationGoodScore(item.getDiscriminationGoodScore());
+        }
+        if (item.getDiscriminationGeneralScore() != null) {
+            configItem.setDiscriminationGeneralScore(item.getDiscriminationGeneralScore());
+        }
+        if (item.getHighScore() != null) {
+            configItem.setHighScore(item.getHighScore());
+        }
+        if (item.getLowScore() != null) {
+            configItem.setLowScore(item.getLowScore());
+        }
+        if (item.getExcellentScore() != null) {
+            configItem.setExcellentScore(item.getExcellentScore());
+        }
+        if (item.getPassScore() != null) {
+            configItem.setPassScore(item.getPassScore());
+        }
+        return configItem;
+    }
+
+    public Double getPassScore() {
+        return passScore;
+    }
+
+    public void setPassScore(Double passScore) {
+        this.passScore = passScore;
+    }
+
+    public Double getExcellentScore() {
+        return excellentScore;
+    }
+
+    public void setExcellentScore(Double excellentScore) {
+        this.excellentScore = excellentScore;
+    }
+
+    public Double getDiscriminationExcellentScore() {
+        return discriminationExcellentScore;
+    }
+
+    public void setDiscriminationExcellentScore(Double discriminationExcellentScore) {
+        this.discriminationExcellentScore = discriminationExcellentScore;
+    }
+
+    public Double getDiscriminationGoodScore() {
+        return discriminationGoodScore;
+    }
+
+    public void setDiscriminationGoodScore(Double discriminationGoodScore) {
+        this.discriminationGoodScore = discriminationGoodScore;
+    }
+
+    public Double getDiscriminationGeneralScore() {
+        return discriminationGeneralScore;
+    }
+
+    public void setDiscriminationGeneralScore(Double discriminationGeneralScore) {
+        this.discriminationGeneralScore = discriminationGeneralScore;
+    }
+
+    public Double getDiscriminationBadScore() {
+        return discriminationBadScore;
+    }
+
+    public void setDiscriminationBadScore(Double discriminationBadScore) {
+        this.discriminationBadScore = discriminationBadScore;
+    }
+
+    public Double getDifficultyHighScore() {
+        return difficultyHighScore;
+    }
+
+    public void setDifficultyHighScore(Double difficultyHighScore) {
+        this.difficultyHighScore = difficultyHighScore;
+    }
+
+    public Double getDifficultyMiddleScore() {
+        return difficultyMiddleScore;
+    }
+
+    public void setDifficultyMiddleScore(Double difficultyMiddleScore) {
+        this.difficultyMiddleScore = difficultyMiddleScore;
+    }
+
+    public Double getDifficultyLowScore() {
+        return difficultyLowScore;
+    }
+
+    public void setDifficultyLowScore(Double difficultyLowScore) {
+        this.difficultyLowScore = difficultyLowScore;
+    }
+
+    public Double getHighScore() {
+        return highScore;
+    }
+
+    public void setHighScore(Double highScore) {
+        this.highScore = highScore;
+    }
+
+    public Double getLowScore() {
+        return lowScore;
+    }
+
+    public void setLowScore(Double lowScore) {
+        this.lowScore = lowScore;
+    }
+
+}

+ 13 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectClassGroupService.java

@@ -0,0 +1,13 @@
+package cn.com.qmth.stmms.biz.report.service;
+
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectClassGroup;
+
+public interface ReportSubjectClassGroupService {
+
+    void deleteByExamId(Integer examId);
+
+    ReportSubjectClassGroup save(ReportSubjectClassGroup r);
+
+    void updateQuestionCount(Integer examId);
+
+}

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

@@ -19,4 +19,6 @@ public interface ReportSubjectGroupService {
 
     ReportSubjectGroup save(ReportSubjectGroup r);
 
+    void updateQuestionCount(Integer examId);
+
 }

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

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.biz.report.service;
 
+import java.util.List;
+
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
 import cn.com.qmth.stmms.biz.report.query.ReportSubjectQuery;
 
-import java.util.List;
-
 /**
  * 客、主观题分析 service 接口
  *

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

@@ -4,6 +4,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import cn.com.qmth.stmms.biz.report.service.ReportService;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassGroupService;
 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;
@@ -13,12 +14,6 @@ import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherClassService;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectTeacherService;
 
-/**
- * 报表服务 service 实现
- *
- * @author xuwenjin
- * @Date 2019-04-22
- */
 @Component
 public class ReportServiceImpl implements ReportService {
 
@@ -45,6 +40,9 @@ public class ReportServiceImpl implements ReportService {
 
     @Autowired
     private ReportSubjectGroupService reportSubjectGroupService;
+    
+    @Autowired
+    private ReportSubjectClassGroupService reportSubjectClassGroupService;
 
     /**
      * 删除数据
@@ -69,6 +67,8 @@ public class ReportServiceImpl implements ReportService {
         reportSubjectQuestionService.deleteByExamId(examId);
 
         reportSubjectGroupService.deleteByExamId(examId);
+        
+        reportSubjectClassGroupService.deleteByExamId(examId);
 
     }
 

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

@@ -0,0 +1,36 @@
+package cn.com.qmth.stmms.biz.report.service.impl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import cn.com.qmth.stmms.biz.common.BaseQueryService;
+import cn.com.qmth.stmms.biz.report.dao.ReportSubjectClassGroupDao;
+import cn.com.qmth.stmms.biz.report.model.ReportSubjectClassGroup;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassGroupService;
+
+@Service
+public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportSubjectClassGroup> implements
+        ReportSubjectClassGroupService {
+
+    @Autowired
+    private ReportSubjectClassGroupDao reportSubjectClassGroupDao;
+
+    @Transactional
+    @Override
+    public void deleteByExamId(Integer examId) {
+        reportSubjectClassGroupDao.deleteByExamId(examId);
+    }
+
+    @Override
+    public ReportSubjectClassGroup save(ReportSubjectClassGroup r) {
+        return reportSubjectClassGroupDao.save(r);
+    }
+
+    @Transactional
+    @Override
+    public void updateQuestionCount(Integer examId) {
+        reportSubjectClassGroupDao.updateQuestionCount(examId);
+    }
+
+}

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

@@ -72,4 +72,10 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
         return reportSubjectGroupDao.save(r);
     }
 
+    @Transactional
+    @Override
+    public void updateQuestionCount(Integer examId) {
+        reportSubjectGroupDao.updateQuestionCount(examId);
+    }
+
 }

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

@@ -30,8 +30,8 @@ import cn.com.qmth.stmms.biz.report.service.ReportSubjectQuestionService;
  * @Date 2019-04-17
  */
 @Service
-public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSubjectQuestion>
-        implements ReportSubjectQuestionService {
+public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSubjectQuestion> implements
+        ReportSubjectQuestionService {
 
     @Autowired
     private ReportSubjectQuestionDao reportSubjectQuestionDao;
@@ -51,8 +51,8 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
     @Override
     public List<ReportSubjectQuestion> findByQuery(final ReportSubjectQuery query) {
         query.setSort(new Sort(Direction.ASC, "paperType", "mainNumber", "subNumber"));
-        Page<ReportSubjectQuestion> result = reportSubjectQuestionDao
-                .findAll(new Specification<ReportSubjectQuestion>() {
+        Page<ReportSubjectQuestion> result = reportSubjectQuestionDao.findAll(
+                new Specification<ReportSubjectQuestion>() {
 
                     @Override
                     public Predicate toPredicate(Root<ReportSubjectQuestion> root, CriteriaQuery<?> cQuery,
@@ -68,8 +68,8 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
                             predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
                         }
                         predicates.add(cb.equal(root.get("objective"), query.getObjective()));
-                        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);
         return result.getContent();

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

@@ -11,8 +11,12 @@ 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.report.model.SasConfigItem;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassGroupService;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
 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.SubjectCollegeModule;
 import cn.com.qmth.stmms.biz.report.utils.module.SubjectGroupModule;
@@ -34,6 +38,8 @@ public class ReportContext {
     private Map<String, ExamQuestion> questionMap;
 
     private Map<String, ExamQuestion> groupMap;
+    
+    private SasConfigItem sasConfigItem;
 
     public ReportContext(Exam exam) {
         this.exam = exam;
@@ -47,10 +53,11 @@ public class ReportContext {
         this.modules.add(new SubjectTeacherClassModule(this));
         this.modules.add(new SubjectQuestionModule(this));
         this.modules.add(new SubjectGroupModule(this));
-
+        this.modules.add(new SubjectClassGroupModule(this));
         this.subjectMap = new HashMap<String, ExamSubject>();
         this.questionMap = new HashMap<String, ExamQuestion>();
         this.groupMap = new HashMap<String, ExamQuestion>();
+        this.sasConfigItem= SpringContextHolder.getBean(SasConfigItem.class);
     }
 
     public void process(ExamStudent student) {
@@ -103,6 +110,12 @@ public class ReportContext {
         ReportSubjectTeacherClassService teacherClassService = SpringContextHolder
                 .getBean(ReportSubjectTeacherClassService.class);
         teacherClassService.updateRelativeAvgScore(this.getExamId());
+        ReportSubjectGroupService subjectGroupService = SpringContextHolder.getBean(ReportSubjectGroupService.class);
+        subjectGroupService.updateQuestionCount(this.getExamId());
+        ReportSubjectClassGroupService subjectClassGroupService = SpringContextHolder
+                .getBean(ReportSubjectClassGroupService.class);
+        subjectClassGroupService.updateQuestionCount(this.getExamId());
+
     }
 
     public Double getPassScore() {
@@ -128,8 +141,13 @@ public class ReportContext {
     public ExamQuestion getExamQuestion(String key) {
         return questionMap.get(key);
     }
-    
+
     public ExamQuestion getGroup(String key) {
         return groupMap.get(key);
     }
+
+    public SasConfigItem getSasConfigItem() {
+        sasConfigItem = SasConfigItem.parse(sasConfigItem,exam.getSasConfig());
+        return sasConfigItem;
+    }
 }

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

@@ -0,0 +1,107 @@
+package cn.com.qmth.stmms.biz.report.utils.module;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+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.ReportSubjectClassGroup;
+import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassGroupService;
+import cn.com.qmth.stmms.biz.report.utils.Module;
+import cn.com.qmth.stmms.biz.report.utils.QuestionGroup;
+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;
+
+public class SubjectClassGroupModule implements Module {
+
+    private Map<String, BaseCalculatorUnit> units;
+
+    private ReportContext context;
+
+    public SubjectClassGroupModule(ReportContext context) {
+        this.units = 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.getScoreList(true), student.getObjectiveQuestionList(), student.getSubjectCode(),
+                    student.getClassName(), totalScore, true);
+            // 遍历主观题
+            process(student.getScoreList(false), student.getSubjectiveQuestionList(), student.getSubjectCode(),
+                    student.getClassName(), totalScore, false);
+        }
+    }
+
+    private void process(List<ScoreItem> scoreList, List<ExamQuestion> questionList, String subjectCode,
+            String className, double totalScore, boolean objective) {
+        if (scoreList == null || questionList == null) {
+            return;
+        }
+        Map<Integer, QuestionGroup> map = new HashMap<Integer, QuestionGroup>();
+        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;
+            QuestionGroup group = map.get(question.getMainNumber());
+            if (group == null) {
+                group = new QuestionGroup(question.getMainNumber());
+                map.put(question.getMainNumber(), group);
+            }
+            group.incrTotalScore(item != null ? item.getScore() : 0);
+            group.incrFullScore(question.getTotalScore());
+        }
+        for (Entry<Integer, QuestionGroup> entry : map.entrySet()) {
+            QuestionGroup group = entry.getValue();
+            if (group.getFullScore() == 0) {
+                continue;
+            }
+            findUnit(subjectCode + "\t" + className + "\t" + objective + "\t" + entry.getKey()).process(
+                    group.getTotalScore(), group.getFullScore(), totalScore);
+        }
+    }
+
+    public void save() {
+        ReportSubjectClassGroupService service = SpringContextHolder.getBean(ReportSubjectClassGroupService.class);
+        for (String key : this.units.keySet()) {
+            String s[] = key.split("\t");
+            if (s.length > 3) {
+                String subjectCode = s[0];
+                String className = s[1];
+                Boolean objective = Boolean.parseBoolean(s[2]);
+                Integer mainNumber = Integer.parseInt(s[3]);
+                BaseCalculatorUnit unit = units.get(key);
+                ReportSubjectClassGroup r = new ReportSubjectClassGroup();
+                r.setExamId(this.context.getExamId());
+                r.setSubjectCode(subjectCode);
+                r.setClassName(className);
+                r.setSubjectName(context.getSubject(subjectCode).getName());
+                r.setGroupName(context.getGroup(subjectCode + "\t" + objective + "\t" + mainNumber).getMainTitle());
+                r.setGroupNumber(mainNumber);
+                r.setTotalScore(unit.fullScore);
+                r.setObjective(objective);
+                r.setDiscrimination(unit.discrimination);
+                service.save(r);
+            }
+        }
+    }
+
+    private BaseCalculatorUnit findUnit(String key) {
+        BaseCalculatorUnit unit = units.get(key);
+        if (unit == null) {
+            unit = new BaseCalculatorUnit();
+            units.put(key, unit);
+        }
+        return unit;
+    }
+
+}

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

@@ -40,6 +40,9 @@ public class SubjectClassModule extends SubjectModule implements Module {
                 r.setPassRate(unit.passRate);
                 r.setExcellentCount(unit.excellentCount);
                 r.setExcellentRate(unit.excellentRate);
+                r.setCoefficient(unit.coefficient);
+                r.setDifficulty(unit.difficulty);
+                r.setStdev(unit.stdev);
                 service.save(r);
             }
         }

+ 20 - 18
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectGroupModule.java

@@ -79,24 +79,26 @@ public class SubjectGroupModule implements Module {
                 Boolean objective = Boolean.parseBoolean(s[1]);
                 Integer mainNumber = Integer.parseInt(s[2]);
                 BaseCalculatorUnit unit = units.get(key);
-                ReportSubjectGroup reportSubjectGroup = new ReportSubjectGroup();
-                reportSubjectGroup.setExamId(this.context.getExamId());
-                reportSubjectGroup.setSubjectCode(subjectCode);
-                reportSubjectGroup.setSubjectName(context.getSubject(subjectCode).getName());
-                reportSubjectGroup.setGroupName(context.getGroup(key).getMainTitle());
-                reportSubjectGroup.setGroupNumber(mainNumber);
-                reportSubjectGroup.setMaxScore(unit.maxScore);
-                reportSubjectGroup.setMinScore(unit.minScore);
-                reportSubjectGroup.setAvgScore(unit.avgScore);
-                reportSubjectGroup.setTotalScore(unit.fullScore);
-                reportSubjectGroup.setStdev(unit.stdev);
-                reportSubjectGroup.setCoefficient(unit.coefficient);
-                reportSubjectGroup.setScoreRate(unit.difficulty);
-                reportSubjectGroup.setZeroCount(unit.zeroCount);
-                reportSubjectGroup.setFullCount(unit.fullCount);
-                reportSubjectGroup.setObjective(objective);
-                service.save(reportSubjectGroup);
-
+                ReportSubjectGroup r = new ReportSubjectGroup();
+                r.setExamId(this.context.getExamId());
+                r.setSubjectCode(subjectCode);
+                r.setSubjectName(context.getSubject(subjectCode).getName());
+                r.setGroupName(context.getGroup(key).getMainTitle());
+                r.setGroupNumber(mainNumber);
+                r.setMaxScore(unit.maxScore);
+                r.setMinScore(unit.minScore);
+                r.setAvgScore(unit.avgScore);
+                r.setTotalScore(unit.fullScore);
+                r.setStdev(unit.stdev);
+                r.setCoefficient(unit.coefficient);
+                r.setScoreRate(unit.difficulty);
+                r.setZeroCount(unit.zeroCount);
+                r.setFullCount(unit.fullCount);
+                r.setObjective(objective);
+                r.setDifficulty(unit.difficulty);
+                r.setDiscrimination(unit.discrimination);
+                r.setRealityCount(unit.count);
+                service.save(r);
             }
         }
     }

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

@@ -70,22 +70,28 @@ public class SubjectQuestionModule implements Module {
                 Integer mainNumber = Integer.parseInt(s[3]);
                 Integer subNumber = Integer.parseInt(s[4]);
                 BaseCalculatorUnit unit = units.get(key);
-                ReportSubjectQuestion reportSubjectQuestion = new ReportSubjectQuestion();
-                reportSubjectQuestion.setExamId(this.context.getExamId());
-                reportSubjectQuestion.setSubjectCode(subjectCode);
-                reportSubjectQuestion.setSubjectName(context.getSubject(subjectCode).getName());
-                reportSubjectQuestion.setObjective(objective);
-                reportSubjectQuestion.setQuestionName(context.getExamQuestion(key).getMainTitle());
-                reportSubjectQuestion.setMainNumber(mainNumber);
-                reportSubjectQuestion.setSubNumber(subNumber);
-                reportSubjectQuestion.setTotalScore(unit.fullScore);
-                reportSubjectQuestion.setAvgScore(unit.avgScore);
-                reportSubjectQuestion.setScoreRate(unit.difficulty);
-                reportSubjectQuestion.setStdev(unit.stdev);
-                reportSubjectQuestion.setFullScoreRate(unit.fullScoreRate);
-                reportSubjectQuestion.setPaperType(paperType);
-                service.save(reportSubjectQuestion);
-                
+                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);
+                service.save(r);
             }
         }
     }

+ 1 - 0
stmms-web/src/main/webapp/WEB-INF/applicationContext.xml

@@ -12,6 +12,7 @@ http://www.springframework.org/schema/context/spring-context-3.2.xsd
 		<property name="locations">
 			<list>
 				<value>/WEB-INF/application.properties</value>
+				<value>/WEB-INF/sas.properties</value>
 			</list>
 		</property>
 	</bean>

+ 12 - 0
stmms-web/src/main/webapp/WEB-INF/sas.properties

@@ -0,0 +1,12 @@
+#sas config
+sas.passScore=60
+sas.excellentScore=85
+sas.discriminationExcellentScore=40
+sas.discriminationGoodScore=30
+sas.discriminationGeneralScore=20
+sas.discriminationBadScore=10
+sas.difficultyHighScore=40
+sas.difficultyMiddleScore=70
+sas.difficultyLowScore=70
+sas.highScore=27
+sas.lowScore=27