瀏覽代碼

Merge branch 'dev_190618' of http://git.qmth.com.cn/luoshi/stmms-ft.git into dev_190618

zhangjie 6 年之前
父節點
當前提交
aee4bf49f5
共有 28 個文件被更改,包括 469 次插入144 次删除
  1. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamQuestionDao.java
  2. 12 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  3. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamQuestionService.java
  4. 12 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamQuestionServiceImpl.java
  5. 0 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectClassGroupDao.java
  6. 0 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectDao.java
  7. 0 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectGroupDao.java
  8. 14 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectClassGroup.java
  9. 15 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/model/ReportSubjectGroup.java
  10. 1 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectClassGroupService.java
  11. 2 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectGroupService.java
  12. 0 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectService.java
  13. 9 8
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectClassGroupServiceImpl.java
  14. 9 7
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectGroupServiceImpl.java
  15. 0 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectServiceImpl.java
  16. 13 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/QuestionGroup.java
  17. 23 14
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/ReportContext.java
  18. 22 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectClassGroupModule.java
  19. 61 7
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectClassQuestionLevelModule.java
  20. 12 5
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectClassRangeModule.java
  21. 26 8
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectGroupModule.java
  22. 18 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectModule.java
  23. 68 14
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectQuestionLevelModule.java
  24. 10 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectQuestionOptionModule.java
  25. 10 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectRangeModule.java
  26. 45 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/unit/RangeCounter.java
  27. 73 27
      stmms-web/src/main/java/cn/com/qmth/stmms/report/ReportController.java
  28. 7 7
      stmms-web/src/main/webapp/WEB-INF/sas.properties

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamQuestionDao.java

@@ -66,4 +66,8 @@ public interface ExamQuestionDao extends JpaRepository<ExamQuestion, Integer>, J
     public long countByExamAndSubjectAndObjectiveAndGroupNumber(int examId, String subjectCode, boolean objective,
             Integer groupNumber);
 
+    @Query("select count(q) from ExamQuestion q where q.examId=?1 and q.subjectCode=?2 and q.objective=?3 and q.mainNumber=?4 and q.paperType=?5")
+    public long countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(Integer examId, String subjectCode,
+            boolean objective, Integer mainNumber, String paperType);
+
 }

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

@@ -141,5 +141,17 @@ public interface ExamStudentDao
 
     @Query("select s.className from ExamStudent s where s.examId=?1 and s.subjectCode=?2 group by s.className")
     public List<String> findDistinctClassName(Integer examId, String subjectCode);
+    
+    @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.is_upload =true and s.is_absent=false and s.is_breach=false order by s.objective_score+s.subjective_score desc limit ?3 ",nativeQuery = true)
+    public List<Double> findHighCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode,int highCount);
+
+    @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.is_upload =true and s.is_absent=false and s.is_breach=false order by s.objective_score+s.subjective_score asc limit ?3 ",nativeQuery = true)
+    public List<Double> findLowCountTotalSocreByExamIdAndSubjectCode(Integer examId, String subjectCode, int lowCount);
+    
+    @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 desc limit ?4 ",nativeQuery = true)
+    public List<Double> findHighCountTotalSocreByExamIdAndSubjectCodeAndClass(Integer examId, String subjectCode,String className,int highCount);
+
+    @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);
 
 }

+ 3 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamQuestionService.java

@@ -41,4 +41,7 @@ public interface ExamQuestionService {
     long countByExamAndSubjectAndObjectiveAndGroupNumber(int examId, String subjectCode, boolean objective,
             Integer groupNumber);
 
+    long countByExamAndSubjectAndObjectiveAndMainNumberAndPaperType(Integer examId, String subjectCode,
+            boolean objective, Integer mainNumber, String paperType);
+
 }

+ 12 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamQuestionServiceImpl.java

@@ -68,8 +68,8 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     @Override
     public List<ExamQuestion> findByExamAndSubjectAndObjectiveAndPaperType(Integer examId, String subjectCode,
             boolean objective, String paperType) {
-        return questionDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, objective, paperType,
-                new Sort(Direction.ASC, "mainNumber", "subNumber"));
+        return questionDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, objective,
+                paperType, new Sort(Direction.ASC, "mainNumber", "subNumber"));
     }
 
     @Override
@@ -137,8 +137,8 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
                     predicates.add(cb.ge(root.get("zeroCount").as(Integer.class),
                             cb.prod(root.get("totalCount").as(Integer.class), query.getZeroRateGt())));
                 }
-                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()]));
             }
         };
     }
@@ -151,8 +151,14 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
     @Override
     public long countByExamAndSubjectAndObjectiveAndGroupNumber(int examId, String subjectCode, boolean objective,
             Integer groupNumber) {
-        return questionDao.countByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, objective,
-                groupNumber);
+        return questionDao.countByExamAndSubjectAndObjectiveAndGroupNumber(examId, subjectCode, objective, groupNumber);
+    }
+
+    @Override
+    public long countByExamAndSubjectAndObjectiveAndMainNumberAndPaperType(Integer examId, String subjectCode,
+            boolean objective, Integer mainNumber, String paperType) {
+        return questionDao.countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(examId, subjectCode, objective,
+                mainNumber, paperType);
     }
 
 }

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

@@ -14,8 +14,4 @@ public interface ReportSubjectClassGroupDao extends PagingAndSortingRepository<R
     @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);
-
 }

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

@@ -19,9 +19,5 @@ public interface ReportSubjectDao extends PagingAndSortingRepository<ReportSubje
     @Modifying
     @Query("delete from ReportSubject r where r.examId=?1 ")
     void deleteByExamId(Integer exmaId);
-    
-    @Modifying
-    @Query("update ReportSubject r set r.questionCount = (select count(*) from ExamQuestion q where q.examId=?1 and q.subjectCode = r.subjectCode and q.examId = r.examId ) where r.examId=?1  ")
-    void updateQuestionCount(Integer examId);
 
 }

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

@@ -20,8 +20,4 @@ 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);
-
 }

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

@@ -120,6 +120,12 @@ public class ReportSubjectClassGroup implements Serializable {
     @Column(name = "discrimination_level", nullable = true)
     private String discriminationLevel;
 
+    /**
+     * 卷型
+     */
+    @Column(name = "paper_type", nullable = true, length = 32)
+    private String paperType;
+
     public Integer getId() {
         return id;
     }
@@ -240,4 +246,12 @@ public class ReportSubjectClassGroup implements Serializable {
         this.coefficient = coefficient;
     }
 
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
 }

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

@@ -169,6 +169,13 @@ public class ReportSubjectGroup implements Serializable {
     @Column(name = "discrimination_level", nullable = true)
     private String discriminationLevel;
 
+    /**
+     * 卷型
+     */
+    @ExcelField(title = "卷型", align = 2, sort = 110)
+    @Column(name = "paper_type", nullable = true, length = 32)
+    private String paperType;
+
     public Integer getId() {
         return id;
     }
@@ -345,4 +352,12 @@ public class ReportSubjectGroup implements Serializable {
         this.discriminationLevel = discriminationLevel;
     }
 
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
 }

+ 1 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectClassGroupService.java

@@ -11,10 +11,8 @@ public interface ReportSubjectClassGroupService {
 
     ReportSubjectClassGroup save(ReportSubjectClassGroup r);
 
-    void updateQuestionCount(Integer examId);
-
     ReportSubjectClassGroup findOne(Integer examId, String subjectCode, String className, boolean objective,
-            Integer groupNumber);
+            String paperType, Integer groupNumber);
 
     List<ReportSubjectClassGroup> findByQuery(ReportSubjectQuery query);
 

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

@@ -19,8 +19,7 @@ public interface ReportSubjectGroupService {
 
     ReportSubjectGroup save(ReportSubjectGroup r);
 
-    void updateQuestionCount(Integer examId);
-
-    ReportSubjectGroup findOne(Integer examId, String subjectCode, boolean objective, Integer mainNumber);
+    ReportSubjectGroup findOne(Integer examId, String subjectCode, boolean objective, String paperType,
+            Integer mainNumber);
 
 }

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

@@ -19,6 +19,4 @@ public interface ReportSubjectService {
 
     ReportSubject findOne(Integer examId, String subjectCode);
 
-    void updateQuestionCount(Integer examId);
-
 }

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

@@ -41,25 +41,20 @@ public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportS
         return reportSubjectClassGroupDao.save(r);
     }
 
-    @Transactional
-    @Override
-    public void updateQuestionCount(Integer examId) {
-        reportSubjectClassGroupDao.updateQuestionCount(examId);
-    }
-
     @Override
     public ReportSubjectClassGroup findOne(Integer examId, String subjectCode, String className, boolean objective,
-            Integer groupNumber) {
+            String paperType, Integer groupNumber) {
         ReportSubjectQuery query = new ReportSubjectQuery();
         query.setExamId(examId);
         query.setSubjectCode(subjectCode);
         query.setClassName(className);
         query.setObjective(objective);
         query.setGroupNumber(groupNumber);
+        query.setPaperType(paperType);
         List<ReportSubjectClassGroup> list = findByQuery(query);
         return list.isEmpty() ? null : list.get(0);
     }
-    
+
     @Override
     public List<ReportSubjectClassGroup> findByQuery(final ReportSubjectQuery query) {
         query.setSort(new Sort(Direction.ASC, "groupNumber"));
@@ -82,6 +77,12 @@ public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportS
                         if (query.getGroupNumber() > 0) {
                             predicates.add(cb.equal(root.get("groupNumber"), query.getGroupNumber()));
                         }
+                        if (query.getObjective() != null) {
+                            predicates.add(cb.equal(root.get("objective"), query.getObjective()));
+                        }
+                        if (query.getObjective() != null && query.getObjective()&& StringUtils.isNotBlank(query.getPaperType())) {
+                            predicates.add(cb.equal(root.get("paperType"), query.getPaperType()));
+                        }
                         return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates
                                 .toArray(new Predicate[predicates.size()]));
                     }

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

@@ -57,9 +57,15 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
                 if (StringUtils.isNotBlank(query.getSubjectCode())) {
                     predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
                 }
+                if (query.getObjective() != null) {
+                    predicates.add(cb.equal(root.get("objective"), query.getObjective()));
+                }
                 if (query.getGroupNumber() > 0) {
                     predicates.add(cb.equal(root.get("groupNumber"), query.getGroupNumber()));
                 }
+                if (query.getObjective() != null && query.getObjective() && StringUtils.isNotBlank(query.getPaperType())) {
+                    predicates.add(cb.equal(root.get("paperType"), query.getPaperType()));
+                }
                 return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
                         .size()]));
             }
@@ -72,19 +78,15 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
         return reportSubjectGroupDao.save(r);
     }
 
-    @Transactional
-    @Override
-    public void updateQuestionCount(Integer examId) {
-        reportSubjectGroupDao.updateQuestionCount(examId);
-    }
-
     @Override
-    public ReportSubjectGroup findOne(Integer examId, String subjectCode, boolean objective, Integer mainNumber) {
+    public ReportSubjectGroup findOne(Integer examId, String subjectCode, boolean objective, String paperType,
+            Integer mainNumber) {
         ReportSubjectQuery query = new ReportSubjectQuery();
         query.setExamId(examId);
         query.setSubjectCode(subjectCode);
         query.setObjective(objective);
         query.setGroupNumber(mainNumber);
+        query.setPaperType(paperType);
         List<ReportSubjectGroup> list = findByQuery(query);
         return list.isEmpty() ? null : list.get(0);
     }

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

@@ -77,10 +77,4 @@ public class ReportSubjectServiceImpl extends BaseQueryService<ReportSubject> im
         return list.isEmpty() ? null : list.get(0);
     }
 
-    @Transactional
-    @Override
-    public void updateQuestionCount(Integer examId) {
-        reportSubjectDao.updateQuestionCount(examId);
-    }
-
 }

+ 13 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/QuestionGroup.java

@@ -9,10 +9,13 @@ public class QuestionGroup {
     private double totalScore;
 
     private double fullScore;
+    
+    private String paperType;
 
-    public QuestionGroup(boolean objective, int number) {
+    public QuestionGroup(boolean objective, int number,String paperType) {
         this.objective = objective;
         this.number = number;
+        this.paperType = paperType;
     }
 
     public void incrTotalScore(double score) {
@@ -47,4 +50,13 @@ public class QuestionGroup {
         return objective;
     }
 
+    
+    public String getPaperType() {
+        return paperType;
+    }
+    
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
 }

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

@@ -1,9 +1,11 @@
 package cn.com.qmth.stmms.biz.report.utils;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
 
@@ -12,9 +14,6 @@ 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.ReportSubjectService;
 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;
@@ -46,6 +45,8 @@ public class ReportContext {
 
     private Map<String, ExamQuestion> groupMap;
 
+    private Map<String, Set<String>> paperTypeMap;
+
     private SasConfigItem sasConfigItem;
 
     public ReportContext(Exam exam) {
@@ -54,6 +55,7 @@ public class ReportContext {
         this.subjectMap = new HashMap<String, ExamSubject>();
         this.questionMap = new HashMap<String, ExamQuestion>();
         this.groupMap = new HashMap<String, ExamQuestion>();
+        this.paperTypeMap = new HashMap<String, Set<String>>();
         // 以下modules创建有顺序
         this.sasConfigItem = SpringContextHolder.getBean(SasConfigItem.class);
         this.modules.add(new SubjectModule(this));
@@ -109,6 +111,15 @@ public class ReportContext {
                 groupMap.put(groupKey, question);
             }
         }
+        Set<String> paparTypeSet = paperTypeMap.get(student.getSubjectCode());
+        if (paparTypeSet == null) {
+            paparTypeSet = new HashSet<String>();
+        }
+        String paperType = StringUtils.trimToNull(student.getPaperType());
+        if (paperType != null) {
+            paparTypeSet.add(paperType);
+        }
+        paperTypeMap.put(student.getSubjectCode(), paparTypeSet);
     }
 
     private String getQuestionKey(ExamQuestion question) {
@@ -118,7 +129,8 @@ public class ReportContext {
     }
 
     private String getGroupKey(ExamQuestion question) {
-        return question.getSubjectCode() + "\t" + question.isObjective() + "\t" + question.getMainNumber();
+        return question.getSubjectCode() + "\t" + question.isObjective() + "\t"
+                + StringUtils.trimToEmpty(question.getPaperType()) + "\t" + question.getMainNumber();
     }
 
     public void save() {
@@ -130,13 +142,6 @@ 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());
-        ReportSubjectService subjectService = SpringContextHolder.getBean(ReportSubjectService.class);
-        subjectService.updateQuestionCount(this.getExamId());
     }
 
     public Double getPassScore() {
@@ -175,8 +180,8 @@ public class ReportContext {
     public LevelRange[] getDifficulityLevelConfig() {
         LevelRange[] levels = new LevelRange[3];
         levels[0] = new LevelRange(null, null, sasConfigItem.getDifficultyHighValue(), null);
-        levels[1] = new LevelRange(null, sasConfigItem.getDifficultyMiddleValue(), null,
-                sasConfigItem.getDifficultyHighValue());
+        levels[1] = new LevelRange(null, sasConfigItem.getDifficultyHighValue(), null,
+                sasConfigItem.getDifficultyMiddleValue());
         levels[2] = new LevelRange(sasConfigItem.getDifficultyLowValue(), null, null, null);
         return levels;
     }
@@ -186,7 +191,7 @@ public class ReportContext {
         levels[0] = new LevelRange(null, sasConfigItem.getDiscriminationExcellentValue(), null, null);
         levels[1] = new LevelRange(null, sasConfigItem.getDiscriminationGoodValue(),
                 sasConfigItem.getDiscriminationExcellentValue(), null);
-        levels[2] = new LevelRange(null, sasConfigItem.getDiscriminationGeneralValue(),
+        levels[2] = new LevelRange(null, sasConfigItem.getDiscriminationBadValue(),
                 sasConfigItem.getDiscriminationGoodValue(), null);
         levels[3] = new LevelRange(null, null, sasConfigItem.getDiscriminationBadValue(), null);
         return levels;
@@ -199,4 +204,8 @@ public class ReportContext {
     public Double getLowValueConfig() {
         return sasConfigItem.getHighValue();
     }
+
+    public Set<String> getPaperType(String subjectCode) {
+        return paperTypeMap.get(subjectCode);
+    }
 }

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

@@ -1,6 +1,9 @@
 package cn.com.qmth.stmms.biz.report.utils.module;
 
+import org.apache.commons.lang.StringUtils;
+
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 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;
@@ -17,31 +20,46 @@ public class SubjectClassGroupModule extends SubjectGroupModule implements Modul
 
     public String getKey(ExamStudent student, QuestionGroup group) {
         return student.getSubjectCode() + "\t" + student.getClassName() + "\t" + group.isObjective() + "\t"
-                + group.getNumber();
+                + StringUtils.trimToEmpty(group.getPaperType()) + "\t" + +group.getNumber();
     }
 
     public void save() {
         ReportSubjectClassGroupService service = SpringContextHolder.getBean(ReportSubjectClassGroupService.class);
+        ExamQuestionService questionService = SpringContextHolder.getBean(ExamQuestionService.class);
         for (String key : this.calculators.keySet()) {
             String s[] = key.split("\t");
-            if (s.length > 3) {
+            if (s.length > 4) {
                 String subjectCode = s[0];
                 String className = s[1];
                 Boolean objective = Boolean.parseBoolean(s[2]);
-                Integer mainNumber = Integer.parseInt(s[3]);
+                String paperType = s[3];
+                Integer mainNumber = Integer.parseInt(s[4]);
                 BaseCalculatorUnit unit = calculators.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());
+                String groupKey = subjectCode + "\t" + objective + "\t" + paperType + "\t" + mainNumber;
+                r.setGroupName(context.getGroup(groupKey).getMainTitle());
                 r.setGroupNumber(mainNumber);
                 r.setTotalScore(unit.fullScore);
                 r.setObjective(objective);
                 r.setDiscrimination(unit.discrimination);
                 r.setDifficulty(unit.difficulty);
                 r.setCoefficient(unit.coefficient);
+
+                int questionCount = 0;
+                paperType = StringUtils.trimToNull(paperType);
+                if (objective && paperType != null) {
+                    questionCount = (int) questionService.countByExamAndSubjectAndObjectiveAndMainNumberAndPaperType(
+                            context.getExamId(), subjectCode, objective, mainNumber, paperType);
+                } else {
+                    questionCount = (int) questionService.countByExamAndSubjectAndObjectiveAndMainNumber(
+                            context.getExamId(), subjectCode, objective, mainNumber);
+                }
+                r.setQuestionCount(questionCount);
+                r.setPaperType(paperType);
                 service.save(r);
             }
         }

+ 61 - 7
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectClassQuestionLevelModule.java

@@ -53,10 +53,23 @@ public class SubjectClassQuestionLevelModule extends SubjectQuestionLevelModule
 
     @Override
     protected void beforeSave() {
-        for (Entry<String, List<ExamQuestion>> entry : questions.entrySet()) {
-            String[] s = entry.getKey().split("\t");
-            Set<String> classSet = classMap.get(s[0]);
-            if (null==classSet || classSet.isEmpty()) {
+        // paperType集合
+        Map<String, Set<String>> paperTypes = new HashMap<String, Set<String>>();
+        // 遍历客观题
+        for (Entry<String, List<ExamQuestion>> entry : objectiveQuestions.entrySet()) {
+            String[] keys = entry.getKey().split("\t");
+            String subjectCode = keys[0];
+            String paperType = keys.length > 1 ? StringUtils.trimToNull(keys[1]) : null;
+            if (paperType != null) {
+                Set<String> set = paperTypes.get(subjectCode);
+                if (set == null) {
+                    set = new HashSet<String>();
+                    paperTypes.put(subjectCode, set);
+                }
+                set.add(paperType);
+            }
+            Set<String> classSet = classMap.get(subjectCode);
+            if (null == classSet || classSet.isEmpty()) {
                 continue;
             }
             for (String className : classSet) {
@@ -80,6 +93,45 @@ public class SubjectClassQuestionLevelModule extends SubjectQuestionLevelModule
                 }
             }
         }
+        // 遍历主观题
+        for (Entry<String, List<ExamQuestion>> entry : subjectiveQuestions.entrySet()) {
+            String subjectCode = entry.getKey();
+            Set<String> classSet = classMap.get(subjectCode);
+            if (null == classSet || classSet.isEmpty()) {
+                continue;
+            }
+            for (String className : classSet) {
+                for (ExamQuestion question : entry.getValue()) {
+                    if (question.getTotalScore() == null || question.getTotalScore() == 0) {
+                        continue;
+                    }
+                    BaseCalculatorUnit calculator = provider.getCalculator(question, className);
+                    if (calculator == null) {
+                        continue;
+                    }
+                    // 按全卷维度统计
+                    Set<String> paperTypeSet = paperTypes.get(subjectCode);
+                    if (paperTypeSet == null || paperTypeSet.isEmpty()) {
+                        // 不区分paperType
+                        String key = subjectCode + "\t\t" + className;
+                        findDifficulityLevelCounter(key).process(question, calculator.difficulty);
+                        findDiscriminationLevelCounter(key).process(question, calculator.discrimination);
+                    } else {
+                        // 遍历已存在的paperType
+                        for (String paperType : paperTypeSet) {
+                            String key = subjectCode + "\t" + paperType + "\t" + className;
+                            findDifficulityLevelCounter(key).process(question, calculator.difficulty);
+                            findDiscriminationLevelCounter(key).process(question, calculator.discrimination);
+                        }
+                    }
+                    // 按大题维度统计
+                    findDifficulityLevelCounter(getGroupKey(question, className)).process(question,
+                            calculator.difficulty);
+                    findDiscriminationLevelCounter(getGroupKey(question, className)).process(question,
+                            calculator.discrimination);
+                }
+            }
+        }
     }
 
     protected String getGroupKey(ExamQuestion question, String className) {
@@ -143,16 +195,18 @@ public class SubjectClassQuestionLevelModule extends SubjectQuestionLevelModule
             }
             if (s.length == 3) {
                 String className = s[2];
-                ReportSubjectClass r = classService.findOne(context.getExamId(),subjectCode,className);
+                ReportSubjectClass r = classService.findOne(context.getExamId(), subjectCode, className);
                 r.setDifficulityLevel(difficulityLevel.toString());
                 r.setDiscriminationLevel(discriminationLevel.toString());
                 classService.save(r);
             }
-            if (s.length == 5) {
+            if (s.length >= 5) {
                 String className = s[1];
                 Boolean objective = Boolean.parseBoolean(s[2]);
+                String paperType = StringUtils.trimToNull(s[3]);
                 Integer mainNumber = Integer.parseInt(s[4]);
-                ReportSubjectClassGroup r = groupService.findOne(context.getExamId(),subjectCode,className,objective,mainNumber);
+                ReportSubjectClassGroup r = groupService.findOne(context.getExamId(), subjectCode, className,
+                        objective, paperType, mainNumber);
                 r.setDifficulityLevel(difficulityLevel.toString());
                 r.setDiscriminationLevel(discriminationLevel.toString());
                 groupService.save(r);

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

@@ -1,12 +1,14 @@
 package cn.com.qmth.stmms.biz.report.utils.module;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import net.sf.json.JSONObject;
 
 import org.apache.commons.lang.StringUtils;
 
+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.ReportSubjectClass;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectClassService;
@@ -41,18 +43,23 @@ public class SubjectClassRangeModule implements Module {
         for (String key : this.counters.keySet()) {
             RangeCounter counter = counters.get(key);
             String s[] = key.split("\t");
-            if(s.length > 1){
+            if (s.length > 1) {
                 String subjectCode = s[0];
                 String className = s[1];
                 ReportSubjectClass r = service.findOne(this.context.getExamId(), subjectCode, className);
+                ExamStudentDao studentDao = SpringContextHolder.getBean(ExamStudentDao.class);
                 JSONObject rangeLevel = new JSONObject();
-                rangeLevel.accumulate("highScore", counter.countGeAndLt(100 - context.getHighValueConfig(), null));
-                rangeLevel.accumulate("lowScore", counter.countGeAndLt(null, context.getLowValueConfig()));
+                double highCount = Math.ceil(context.getHighValueConfig() * r.getRealityCount() * 0.01);
+                double lowCount = Math.ceil(context.getLowValueConfig() * r.getRealityCount() * 0.01);
+                List<Double> highScore = studentDao.findHighCountTotalSocreByExamIdAndSubjectCodeAndClass(context.getExamId(), subjectCode,className, (int)highCount);
+                List<Double> lowScore = studentDao.findLowCountTotalSocreByExamIdAndSubjectCodeAndClass(context.getExamId(), subjectCode,className, (int)lowCount);
+                rangeLevel.accumulate("highScore", highScore.isEmpty()?0:highScore.get(highScore.size()-1));
+                rangeLevel.accumulate("lowScore", lowScore.isEmpty()?0:lowScore.get(lowScore.size()-1));
                 r.setRangeLevel(rangeLevel.toString());
-                
+
                 JSONObject scoreRange = new JSONObject();
                 for (int i = 0; i <= context.getSubject(subjectCode).getTotalScore(); i++) {
-                    scoreRange.accumulate(String.valueOf(i), counter.countGeAndLt((double) i, (double) (i + 1)));
+                    scoreRange.accumulate(String.valueOf(i), counter.countGtAndLe((double) (i - 1), (double) i));
                 }
                 r.setScoreRange(scoreRange.toString());
                 service.save(r);

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

@@ -5,8 +5,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
+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.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectGroup;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectGroupService;
 import cn.com.qmth.stmms.biz.report.utils.Module;
@@ -42,23 +45,24 @@ public class SubjectGroupModule implements Module {
         if (scoreList == null || questionList == null) {
             return;
         }
-        Map<Integer, QuestionGroup> map = new HashMap<Integer, QuestionGroup>();
+        Map<String, QuestionGroup> map = new HashMap<String, QuestionGroup>();
         int scoreCount = scoreList.size();
         for (int i = 0; i < questionList.size(); i++) {
             ExamQuestion question = questionList.get(i);
+            String groupKey = question.getMainNumber() + "/t" + objective;
             if (question.getTotalScore() == null || question.getTotalScore() == 0) {
                 continue;
             }
             ScoreItem item = scoreCount > i ? scoreList.get(i) : null;
-            QuestionGroup group = map.get(question.getMainNumber());
+            QuestionGroup group = map.get(groupKey);
             if (group == null) {
-                group = new QuestionGroup(objective, question.getMainNumber());
-                map.put(question.getMainNumber(), group);
+                group = new QuestionGroup(objective, question.getMainNumber(), question.getPaperType());
+                map.put(groupKey, group);
             }
             group.incrTotalScore(item != null ? item.getScore() : 0);
             group.incrFullScore(question.getTotalScore());
         }
-        for (Entry<Integer, QuestionGroup> entry : map.entrySet()) {
+        for (Entry<String, QuestionGroup> entry : map.entrySet()) {
             QuestionGroup group = entry.getValue();
             if (group.getFullScore() == 0) {
                 continue;
@@ -68,17 +72,20 @@ public class SubjectGroupModule implements Module {
     }
 
     public String getKey(ExamStudent student, QuestionGroup group) {
-        return student.getSubjectCode() + "\t" + group.isObjective() + "\t" + group.getNumber();
+        return student.getSubjectCode() + "\t" + group.isObjective() + "\t"
+                + StringUtils.trimToEmpty(group.getPaperType()) + "\t" + group.getNumber();
     }
 
     public void save() {
         ReportSubjectGroupService service = SpringContextHolder.getBean(ReportSubjectGroupService.class);
+        ExamQuestionService questionService = SpringContextHolder.getBean(ExamQuestionService.class);
         for (String key : this.calculators.keySet()) {
             String s[] = key.split("\t");
-            if (s.length > 2) {
+            if (s.length > 3) {
                 String subjectCode = s[0];
                 Boolean objective = Boolean.parseBoolean(s[1]);
-                Integer mainNumber = Integer.parseInt(s[2]);
+                String paperType = s[2];
+                Integer mainNumber = Integer.parseInt(s[3]);
                 BaseCalculatorUnit unit = calculators.get(key);
                 ReportSubjectGroup r = new ReportSubjectGroup();
                 r.setExamId(this.context.getExamId());
@@ -99,6 +106,17 @@ public class SubjectGroupModule implements Module {
                 r.setDifficulty(unit.difficulty);
                 r.setDiscrimination(unit.discrimination);
                 r.setRealityCount(unit.count);
+                int questionCount = 0;
+                paperType = StringUtils.trimToNull(paperType);
+                if (objective && paperType != null) {
+                    questionCount = (int) questionService.countByExamAndSubjectAndObjectiveAndMainNumberAndPaperType(
+                            context.getExamId(), subjectCode, objective, mainNumber, paperType);
+                } else {
+                    questionCount = (int) questionService.countByExamAndSubjectAndObjectiveAndMainNumber(
+                            context.getExamId(), subjectCode, objective, mainNumber);
+                }
+                r.setQuestionCount(questionCount);
+                r.setPaperType(paperType);
                 service.save(r);
             }
         }

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

@@ -2,9 +2,12 @@ package cn.com.qmth.stmms.biz.report.utils.module;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
+import cn.com.qmth.stmms.biz.exam.service.query.ExamQuestionSearchQuery;
 import cn.com.qmth.stmms.biz.report.model.ReportSubject;
 import cn.com.qmth.stmms.biz.report.service.ReportSubjectService;
 import cn.com.qmth.stmms.biz.report.utils.Module;
@@ -44,6 +47,7 @@ public class SubjectModule implements Module {
 
     public void save() {
         ReportSubjectService service = SpringContextHolder.getBean(ReportSubjectService.class);
+        ExamQuestionService questionService = SpringContextHolder.getBean(ExamQuestionService.class);
         for (String subjectCode : this.counters.keySet()) {
             BaseCounter counter = counters.get(subjectCode);
             BaseCalculatorUnit unit = units.get(subjectCode);
@@ -75,6 +79,20 @@ public class SubjectModule implements Module {
                 subject.setPassCount(0);
                 subject.setPassRate(0d);
             }
+            Set<String> paperTypeSet = context.getPaperType(subjectCode);
+            String paperType = null;
+            if (paperTypeSet != null && paperTypeSet.size() > 0) {
+                paperType = paperTypeSet.iterator().next();
+            }
+            ExamQuestionSearchQuery query = new ExamQuestionSearchQuery();
+            query.setExamId(context.getExamId());
+            query.setSubjectCode(subjectCode);
+            query.setObjective(false);
+            long subjectiveCcount = questionService.countByQuery(query);
+            query.setObjective(true);
+            query.setPaperType(paperType);
+            long ObjectiveCcount = questionService.countByQuery(query);
+            subject.setQuestionCount((int) (subjectiveCcount + ObjectiveCcount));
             service.save(subject);
         }
     }

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

@@ -2,9 +2,11 @@ package cn.com.qmth.stmms.biz.report.utils.module;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 
 import net.sf.json.JSONObject;
 
@@ -36,7 +38,7 @@ public class SubjectQuestionLevelModule implements Module {
 
     protected QuestionCalculatorProvider provider;
 
-    protected Map<String, List<ExamQuestion>> questions;
+    protected Map<String, List<ExamQuestion>> objectiveQuestions, subjectiveQuestions;
 
     protected Map<String, QuestionCounter> difficulityLevels, discriminationLevels;
 
@@ -45,7 +47,8 @@ public class SubjectQuestionLevelModule implements Module {
     public SubjectQuestionLevelModule(ReportContext context, QuestionCalculatorProvider provider) {
         this.context = context;
         this.provider = provider;
-        this.questions = new HashMap<String, List<ExamQuestion>>();
+        this.objectiveQuestions = new HashMap<String, List<ExamQuestion>>();
+        this.subjectiveQuestions = new HashMap<String, List<ExamQuestion>>();
         this.difficulityLevels = new HashMap<String, QuestionCounter>();
         this.discriminationLevels = new HashMap<String, QuestionCounter>();
         this.difficulityLevelConfig = context.getDifficulityLevelConfig();
@@ -55,12 +58,17 @@ public class SubjectQuestionLevelModule implements Module {
     @Override
     public void process(ExamStudent student) {
         String key = student.getSubjectCode() + "\t" + StringUtils.trimToEmpty(student.getPaperType());
-        List<ExamQuestion> list = questions.get(key);
-        if (list == null) {
-            list = new ArrayList<ExamQuestion>();
-            questions.put(key, list);
-            list.addAll(student.getObjectiveQuestionList());
-            list.addAll(student.getSubjectiveQuestionList());
+        List<ExamQuestion> olist = objectiveQuestions.get(key);
+        if (olist == null) {
+            olist = new ArrayList<ExamQuestion>();
+            objectiveQuestions.put(key, olist);
+            olist.addAll(student.getObjectiveQuestionList());
+        }
+        List<ExamQuestion> slist = subjectiveQuestions.get(student.getSubjectCode());
+        if (slist == null) {
+            slist = new ArrayList<ExamQuestion>();
+            subjectiveQuestions.put(student.getSubjectCode(), slist);
+            slist.addAll(student.getSubjectiveQuestionList());
         }
     }
 
@@ -125,10 +133,12 @@ public class SubjectQuestionLevelModule implements Module {
                 r.setDiscriminationLevel(discriminationLevel.toString());
                 subjectService.save(r);
             }
-            if (s.length == 4) {
+            if (s.length >= 4 ) {
                 Boolean objective = Boolean.parseBoolean(s[1]);
+                String paperType = StringUtils.trimToNull(s[2]);
                 Integer mainNumber = Integer.parseInt(s[3]);
-                ReportSubjectGroup r = groupService.findOne(context.getExamId(), subjectCode, objective, mainNumber);
+                ReportSubjectGroup r = groupService.findOne(context.getExamId(), subjectCode, objective, paperType,
+                        mainNumber);
                 r.setDifficulityLevel(difficulityLevel.toString());
                 r.setDiscriminationLevel(discriminationLevel.toString());
                 groupService.save(r);
@@ -137,8 +147,40 @@ public class SubjectQuestionLevelModule implements Module {
     }
 
     protected void beforeSave() {
-        for (Entry<String, List<ExamQuestion>> entry : questions.entrySet()) {
-            String key = entry.getKey();
+        // paperType集合
+        Map<String, Set<String>> paperTypes = new HashMap<String, Set<String>>();
+        // 遍历客观题
+        for (Entry<String, List<ExamQuestion>> entry : objectiveQuestions.entrySet()) {
+            String[] keys = entry.getKey().split("\t");
+            String subjectCode = keys[0];
+            String paperType = keys.length > 1 ? StringUtils.trimToNull(keys[1]) : null;
+            if (paperType != null) {
+                Set<String> set = paperTypes.get(subjectCode);
+                if (set == null) {
+                    set = new HashSet<String>();
+                    paperTypes.put(subjectCode, set);
+                }
+                set.add(paperType);
+            }
+            for (ExamQuestion question : entry.getValue()) {
+                if (question.getTotalScore() == null || question.getTotalScore() == 0) {
+                    continue;
+                }
+                BaseCalculatorUnit calculator = provider.getCalculator(question);
+                if (calculator == null) {
+                    continue;
+                }
+                // 按全卷维度统计
+                findDifficulityLevelCounter(entry.getKey()).process(question, calculator.difficulty);
+                findDiscriminationLevelCounter(entry.getKey()).process(question, calculator.discrimination);
+                // 按大题维度统计
+                findDifficulityLevelCounter(getGroupKey(question)).process(question, calculator.difficulty);
+                findDiscriminationLevelCounter(getGroupKey(question)).process(question, calculator.discrimination);
+            }
+        }
+        // 遍历主观题
+        for (Entry<String, List<ExamQuestion>> entry : subjectiveQuestions.entrySet()) {
+            String subjectCode = entry.getKey();
             for (ExamQuestion question : entry.getValue()) {
                 if (question.getTotalScore() == null || question.getTotalScore() == 0) {
                     continue;
@@ -148,8 +190,20 @@ public class SubjectQuestionLevelModule implements Module {
                     continue;
                 }
                 // 按全卷维度统计
-                findDifficulityLevelCounter(key).process(question, calculator.difficulty);
-                findDiscriminationLevelCounter(key).process(question, calculator.discrimination);
+                Set<String> paperTypeSet = paperTypes.get(subjectCode);
+                if (paperTypeSet == null || paperTypeSet.isEmpty()) {
+                    // 不区分paperType
+                    String key = subjectCode + "\t";
+                    findDifficulityLevelCounter(key).process(question, calculator.difficulty);
+                    findDiscriminationLevelCounter(key).process(question, calculator.discrimination);
+                } else {
+                    // 遍历已存在的paperType
+                    for (String paperType : paperTypeSet) {
+                        String key = subjectCode + "\t" + paperType;
+                        findDifficulityLevelCounter(key).process(question, calculator.difficulty);
+                        findDiscriminationLevelCounter(key).process(question, calculator.discrimination);
+                    }
+                }
                 // 按大题维度统计
                 findDifficulityLevelCounter(getGroupKey(question)).process(question, calculator.difficulty);
                 findDiscriminationLevelCounter(getGroupKey(question)).process(question, calculator.discrimination);

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

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.biz.report.utils.module;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -35,6 +36,8 @@ 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) {
         this.counters = new HashMap<String, OptionCounter>();
@@ -84,20 +87,26 @@ public class SubjectQuestionOptionModule implements Module {
                 Integer mainNumber = Integer.parseInt(s[3]);
                 Integer subNumber = Integer.parseInt(s[4]);
                 OptionCounter optionCounter = this.counters.get(key);
+                Set<String> optionSet = optionMap.get(subjectCode);
+                if (optionSet == null) {
+                    optionSet = new HashSet<String>();
+                }
                 JSONObject options = new JSONObject();
                 for (String option : optionCounter.getCounter().keySet()) {
                     options.accumulate(option, optionCounter.getCounter().get(option));
+                    optionSet.add(option);
                 }
                 ReportSubjectQuestion r = questionService.findOne(this.context.getExamId(), subjectCode, true,
                         paperType, mainNumber, subNumber);
                 r.setOptions(options.toString());
                 questionService.save(r);
-                optionMap.put(subjectCode, optionCounter.getCounter().keySet());
+                optionMap.put(subjectCode, optionSet);
             }
         }
         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);
         }

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

@@ -1,9 +1,11 @@
 package cn.com.qmth.stmms.biz.report.utils.module;
 
 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;
@@ -64,15 +66,20 @@ public class SubjectRangeModule implements Module {
             service.save(subjectRange);
 
             ReportSubjectService subjectService = SpringContextHolder.getBean(ReportSubjectService.class);
+            ExamStudentDao studentDao = SpringContextHolder.getBean(ExamStudentDao.class);
             ReportSubject subject = subjectService.findOne(this.context.getExamId(), subjectCode);
             JSONObject rangeLevel = new JSONObject();
-            rangeLevel.accumulate("highScore", counter.countGeAndLt(100 - context.getHighValueConfig(), null));
-            rangeLevel.accumulate("lowScore", counter.countGeAndLt(null, context.getLowValueConfig()));
+            double highCount = Math.ceil(context.getHighValueConfig() * subject.getRealityCount() * 0.01);
+            double lowCount = Math.ceil(context.getLowValueConfig() * subject.getRealityCount() * 0.01);
+            List<Double> highScore = studentDao.findHighCountTotalSocreByExamIdAndSubjectCode(context.getExamId(), subjectCode, (int)highCount);
+            List<Double> lowScore = studentDao.findLowCountTotalSocreByExamIdAndSubjectCode(context.getExamId(), subjectCode, (int)lowCount);
+            rangeLevel.accumulate("highScore", highScore.isEmpty()?0:highScore.get(highScore.size()-1));
+            rangeLevel.accumulate("lowScore", lowScore.isEmpty()?0:lowScore.get(lowScore.size()-1));
             subject.setRangeLevel(rangeLevel.toString());
 
             JSONObject scoreRange = new JSONObject();
             for (int i = 0; i <= subject.getTotalScore(); i++) {
-                scoreRange.accumulate(String.valueOf(i), counter.countGeAndLt((double) i, (double) (i + 1)));
+                scoreRange.accumulate(String.valueOf(i), counter.countGtAndLe((double) (i - 1), (double) i));
             }
             subject.setScoreRange(scoreRange.toString());
             subjectService.save(subject);

+ 45 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/unit/RangeCounter.java

@@ -10,27 +10,42 @@ public class RangeCounter {
 
     public double interval;
 
-    public Map<Double, Integer> map;
+    public Map<Double, Integer> GeAndLtMap;
+
+    public Map<Double, Integer> GtAndLeMap;
 
     public RangeCounter() {
         this.interval = 1;
-        this.map = new HashMap<Double, Integer>();
+        this.GeAndLtMap = new HashMap<Double, Integer>();
+        this.GtAndLeMap = new HashMap<Double, Integer>();
     }
 
     public void process(double score) {
         totalCount++;
         // 取最接近的分段起始分数
-        double min = Math.floor(score);
+        double min = score;
         while ((min + interval) < score) {
             min += interval;
         }
         // 以起始分数为key,累加计数结果
-        Integer count = map.get(min);
+        Integer count = GeAndLtMap.get(min);
         if (count == null) {
             count = 0;
         }
         count++;
-        map.put(min, count);
+        GeAndLtMap.put(min, count);
+
+        // 计算(s1, s2]
+        double max = score;
+        while ((max - interval) > score) {
+            max -= interval;
+        }
+        Integer count1 = GtAndLeMap.get(max);
+        if (count1 == null) {
+            count1 = 0;
+        }
+        count1++;
+        GtAndLeMap.put(max, count1);
     }
 
     /**
@@ -44,7 +59,7 @@ public class RangeCounter {
     public int countGeAndLt(Double s1, Double s2) {
         int count = 0;
         if (s1 != null || s2 != null) {
-            for (Entry<Double, Integer> entry : map.entrySet()) {
+            for (Entry<Double, Integer> entry : GeAndLtMap.entrySet()) {
                 Double key = entry.getKey();
                 if (s1 != null && key < s1) {
                     continue;
@@ -58,4 +73,28 @@ public class RangeCounter {
         return count;
     }
 
+    /**
+     * 获取在(s1, s2]分数范围内的数量<br>
+     * s1和s2可以有一个为null,不能全部为null
+     * 
+     * @param s1
+     * @param s2
+     * @return
+     */
+    public int countGtAndLe(Double s1, Double s2) {
+        int count = 0;
+        if (s1 != null || s2 != null) {
+            for (Entry<Double, Integer> entry : GtAndLeMap.entrySet()) {
+                Double key = entry.getKey();
+                if (s1 != null && key <= s1) {
+                    continue;
+                }
+                if (s2 != null && key > s2) {
+                    continue;
+                }
+                count += entry.getValue();
+            }
+        }
+        return count;
+    }
 }

+ 73 - 27
stmms-web/src/main/java/cn/com/qmth/stmms/report/ReportController.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.report;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
@@ -108,18 +109,25 @@ public class ReportController {
         query.setPageSize(Integer.MAX_VALUE);
         ReportSubject reportSubject = reportSubjectService.findOne(query.getExamId(), query.getSubjectCode());
         List<ReportSubjectClass> subjectClasses = classService.findByQuery(query);
-        List<ReportSubjectGroup> subjectGroups = groupService.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_objective", getQuestionJson(query, true));
-        result.accumulate("basic_question_subjective", getQuestionJson(query, false));
+        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));
+        result.accumulate("basic_question_option", getOptionJson(query, reportSubject, paperType));
         result.accumulate("discrimination_level",
-                getDiscrimination(query, reportSubject, subjectClasses, subjectGroups));
-        result.accumulate("difficulty_level", getDifficulty(query, reportSubject, subjectClasses, subjectGroups));
+                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));
@@ -204,13 +212,13 @@ public class ReportController {
         int sumCount = 0;
         int total = (int) totalScore;
         for (int i = total; i >= 0; i--) {
-            rangeCount = jsonObject.getInt(String.valueOf(i));
-            if (i == totalScore) {
-                sumCount = rangeCount;
-            } else {
-                sumCount = sumCount + rangeCount;
-            }
             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);
@@ -230,13 +238,14 @@ public class ReportController {
         int sumCount = 0;
         int total = (int) totalScore;
         for (int i = 0; i <= total; i++) {
-            rangeCount = jsonObject.getInt(String.valueOf(i));
-            if (i == 0) {
-                sumCount = rangeCount;
-            } else {
-                sumCount = sumCount + rangeCount;
-            }
             if (i % range == 0) {
+                if (i == 0) {
+                    rangeCount = jsonObject.getInt(String.valueOf(i));
+                    sumCount = rangeCount;
+                } else {
+                    rangeCount = getSumCount(jsonObject, i - range + 1, i);
+                    sumCount = sumCount + rangeCount;
+                }
                 JSONObject value = new JSONObject();
                 value.accumulate("score", i == 0 ? 0 : (i - range + 0.5) + "~" + i);
                 value.accumulate("rangeCount", rangeCount);
@@ -249,6 +258,25 @@ public class ReportController {
         return result;
     }
 
+    private int getSumCount(JSONObject jsonObject, int start, int end) {
+        int sumCount = 0;
+        int currentCount = 0;
+        if (start < end) {
+            for (int i = start; i <= end; i++) {
+                currentCount = jsonObject.getInt(String.valueOf(i));
+                sumCount = sumCount + currentCount;
+            }
+        } else if (start >= end) {
+            for (int i = end; i <= start; i++) {
+                currentCount = jsonObject.getInt(String.valueOf(i));
+                sumCount = sumCount + currentCount;
+            }
+        } else {
+            sumCount = jsonObject.getInt(String.valueOf(start));
+        }
+        return sumCount;
+    }
+
     private String getRangeLevel(ReportSubjectQuery query, ReportSubject reportSubject, List<ReportSubjectClass> classes) {
         JSONArray array = new JSONArray();
         JSONObject value = JSONObject.fromObject(reportSubject.getRangeLevel());
@@ -264,7 +292,7 @@ public class ReportController {
         return array.toString();
     }
 
-    private String getDifficulty(ReportSubjectQuery query, ReportSubject reportSubject,
+    private String getDifficulty(ReportSubjectQuery query, String paperType, ReportSubject reportSubject,
             List<ReportSubjectClass> subjectClasses, List<ReportSubjectGroup> subjectGroups) {
         JSONObject defaultLevels = new JSONObject();
         JSONObject content = new JSONObject();
@@ -313,8 +341,14 @@ public class ReportController {
                     : reportSubjectClass.getDifficulityLevel());
             classGroups.add(group);
             query.setClassName(reportSubjectClass.getClassName());
-            query.setObjective(null);
-            List<ReportSubjectClassGroup> classGroupsList = classGroupService.findByQuery(query);
+            List<ReportSubjectClassGroup> classGroupsList = new ArrayList<ReportSubjectClassGroup>();
+            query.setObjective(true);
+            query.setPaperType(paperType);
+            List<ReportSubjectClassGroup> classGroupsListO = classGroupService.findByQuery(query);
+            query.setObjective(false);
+            List<ReportSubjectClassGroup> classGroupsListS = classGroupService.findByQuery(query);
+            classGroupsList.addAll(classGroupsListO);
+            classGroupsList.addAll(classGroupsListS);
             for (ReportSubjectClassGroup r : classGroupsList) {
                 JSONObject jsonObject = new JSONObject();
                 jsonObject.accumulate("name", r.getGroupName());
@@ -331,7 +365,7 @@ public class ReportController {
         return result.toString();
     }
 
-    private String getDiscrimination(ReportSubjectQuery query, ReportSubject reportSubject,
+    private String getDiscrimination(ReportSubjectQuery query, String paperType, ReportSubject reportSubject,
             List<ReportSubjectClass> subjectClasses, List<ReportSubjectGroup> subjectGroups) {
         JSONObject defaultLevels = new JSONObject();
         JSONObject content = new JSONObject();
@@ -381,8 +415,14 @@ public class ReportController {
                     : reportSubjectClass.getDiscriminationLevel());
             classGroups.add(group);
             query.setClassName(reportSubjectClass.getClassName());
-            query.setObjective(null);
-            List<ReportSubjectClassGroup> classGroupsList = classGroupService.findByQuery(query);
+            List<ReportSubjectClassGroup> classGroupsList = new ArrayList<ReportSubjectClassGroup>();
+            query.setObjective(true);
+            query.setPaperType(paperType);
+            List<ReportSubjectClassGroup> classGroupsListO = classGroupService.findByQuery(query);
+            query.setObjective(false);
+            List<ReportSubjectClassGroup> classGroupsListS = classGroupService.findByQuery(query);
+            classGroupsList.addAll(classGroupsListO);
+            classGroupsList.addAll(classGroupsListS);
             for (ReportSubjectClassGroup r : classGroupsList) {
                 JSONObject jsonObject = new JSONObject();
                 jsonObject.accumulate("name", r.getGroupName());
@@ -399,11 +439,14 @@ public class ReportController {
         return result.toString();
     }
 
-    private String getOptionJson(ReportSubjectQuery query, ReportSubject reportSubject) {
+    private String getOptionJson(ReportSubjectQuery query, ReportSubject reportSubject, String paperType) {
         JSONObject value = new JSONObject();
-        value.accumulate("options", reportSubject.getOptions().split(ANSWER_SPLIT));
+        if (reportSubject.getOptions() != null) {
+            value.accumulate("options", reportSubject.getOptions().split(ANSWER_SPLIT));
+        }
         JSONArray array = new JSONArray();
         query.setObjective(true);
+        query.setPaperType(paperType);
         List<ReportSubjectQuestion> list = questionService.findByQuery(query);
         for (ReportSubjectQuestion r : list) {
             JSONObject jsonObject = new JSONObject();
@@ -516,8 +559,11 @@ public class ReportController {
         return array.toString();
     }
 
-    private String getQuestionJson(ReportSubjectQuery query, boolean isObjective) {
+    private String getQuestionJson(ReportSubjectQuery query, boolean isObjective, String paperType) {
         query.setObjective(isObjective);
+        if (isObjective) {
+            query.setPaperType(paperType);
+        }
         JSONArray array = new JSONArray();
         List<ReportSubjectQuestion> list = questionService.findByQuery(query);
         for (ReportSubjectQuestion r : list) {

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

@@ -1,12 +1,12 @@
 #sas config
 sas.passScore=60
 sas.excellentScore=85
-sas.discriminationExcellentValue=40
-sas.discriminationGoodValue=30
-sas.discriminationGeneralValue=20
-sas.discriminationBadValue=10
-sas.difficultyHighValue=40
-sas.difficultyMiddleValue=70
-sas.difficultyLowValue=70
+sas.discriminationExcellentValue=0.4
+sas.discriminationGoodValue=0.3
+sas.discriminationGeneralValue=0.2
+sas.discriminationBadValue=0.2
+sas.difficultyHighValue=0.4
+sas.difficultyMiddleValue=0.7
+sas.difficultyLowValue=0.7
 sas.highValue=27
 sas.lowValue=27