Procházet zdrojové kódy

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

zhangjie před 6 roky
rodič
revize
a39bdeacb5
21 změnil soubory, kde provedl 203 přidání a 109 odebrání
  1. 4 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamQuestionDao.java
  2. 13 15
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java
  3. 2 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamQuestionService.java
  4. 1 4
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java
  5. 8 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamQuestionServiceImpl.java
  6. 18 24
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java
  7. 11 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/query/ExamQuestionSearchQuery.java
  8. 6 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectClassGroupDao.java
  9. 6 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectGroupDao.java
  10. 8 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/dao/ReportSubjectQuestionDao.java
  11. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectClassGroupService.java
  12. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectGroupService.java
  13. 3 0
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/ReportSubjectQuestionService.java
  14. 8 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectClassGroupServiceImpl.java
  15. 8 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectGroupServiceImpl.java
  16. 11 3
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/service/impl/ReportSubjectQuestionServiceImpl.java
  17. 11 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectClassGroupModule.java
  18. 12 6
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectGroupModule.java
  19. 6 1
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectModule.java
  20. 2 2
      stmms-biz/src/main/java/cn/com/qmth/stmms/biz/report/utils/module/SubjectQuestionOptionModule.java
  21. 59 42
      stmms-web/src/main/java/cn/com/qmth/stmms/report/ReportController.java

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

@@ -70,4 +70,8 @@ public interface ExamQuestionDao extends JpaRepository<ExamQuestion, Integer>, J
     public long countByExamIdAndSubjectCodeAndObjectiveAndMainNumber(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber, String paperType);
 
+    @Query("select DISTINCT q.paperType from ExamQuestion q where q.examId=?1 and  q.subjectCode=?2 and q.objective=?3 "
+            + "order by q.paperType")
+    public List<String> getPaperTypeWitnNull(Integer examId, String subjectCode, boolean objective);
+
 }

+ 13 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/ExamStudentDao.java

@@ -11,8 +11,8 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 
-public interface ExamStudentDao
-        extends PagingAndSortingRepository<ExamStudent, Integer>, JpaSpecificationExecutor<ExamStudent> {
+public interface ExamStudentDao extends PagingAndSortingRepository<ExamStudent, Integer>,
+        JpaSpecificationExecutor<ExamStudent> {
 
     public List<ExamStudent> findByExamId(int examId, Pageable pageable);
 
@@ -115,8 +115,7 @@ public interface ExamStudentDao
 
     @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false and s.uploadTime!=null "
             + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
-    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber,
-            Pageable page);
+    public List<ExamStudent> findUnLibraryStudent(Integer examId, String subjectCode, Integer groupNumber, Pageable page);
 
     @Query("select s from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true and s.absent=false and s.breach=false and s.uploadTime!=null and s.uploadTime>=?4 "
             + "and not exists (select l.id from MarkLibrary l where l.studentId=s.id and l.groupNumber=?3)")
@@ -141,20 +140,19 @@ 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)
+    @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);
+    @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("select s.paperType from ExamStudent s where s.examId=?1 and s.subjectCode=?2 and s.upload=true group by s.paperType")
-    public List<String> findDistinctPaperType(Integer examId, String subjectCode);
+    @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);
 
 }

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

@@ -44,4 +44,6 @@ public interface ExamQuestionService {
     long countByExamAndSubjectAndObjectiveAndMainNumberAndPaperType(Integer examId, String subjectCode,
             boolean objective, Integer mainNumber, String paperType);
 
+    List<String> getPaperTypeWitnNull(Integer examId, String subjectCode);
+
 }

+ 1 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -93,8 +93,7 @@ public interface ExamStudentService {
     public Long countByExamIdAndSubjectCodeAndCampus(Integer examId, String code, String campusName, boolean upload,
             boolean absent);
 
-    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,
-            boolean breach);
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent, boolean breach);
 
     public long countByAbsentAndBreach(int examId, String subjectCode, Boolean absent, Boolean breach);
 
@@ -124,6 +123,4 @@ public interface ExamStudentService {
 
     public List<String> findDistinctClassName(Integer examId, String subjectCode);
 
-    public List<String> findDistinctPaperType(Integer examId,String subjectCode);
-
 }

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

@@ -137,6 +137,9 @@ 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())));
                 }
+                if (query.getMainNumber() != null) {
+                    predicates.add(cb.equal(root.get("mainNumber"), query.getMainNumber()));
+                }
                 return predicates.isEmpty() ? cb.conjunction() : cb.and(predicates.toArray(new Predicate[predicates
                         .size()]));
             }
@@ -161,4 +164,9 @@ public class ExamQuestionServiceImpl extends BaseQueryService<ExamQuestion> impl
                 mainNumber, paperType);
     }
 
+    @Override
+    public List<String> getPaperTypeWitnNull(Integer examId, String subjectCode) {
+        return questionDao.getPaperTypeWitnNull(examId, subjectCode, true);
+    }
+
 }

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

@@ -518,8 +518,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 if (query.getObjectiveScore() != null) {
                     predicates.add(cb.equal(root.get("objectiveScore"), query.getObjectiveScore()));
                 } else if (query.getObjectiveScoreGt() != null) {
-                    predicates.add(
-                            cb.greaterThan(root.get("objectiveScore").as(Double.class), query.getObjectiveScoreGt()));
+                    predicates.add(cb.greaterThan(root.get("objectiveScore").as(Double.class),
+                            query.getObjectiveScoreGt()));
                 } else if (query.getObjectiveScoreLt() != null) {
                     predicates
                             .add(cb.lessThan(root.get("objectiveScore").as(Double.class), query.getObjectiveScoreLt()));
@@ -527,11 +527,11 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 if (query.getSubjectiveScore() != null) {
                     predicates.add(cb.equal(root.get("subjectiveScore"), query.getSubjectiveScore()));
                 } else if (query.getSubjectiveScoreGt() != null) {
-                    predicates.add(
-                            cb.greaterThan(root.get("subjectiveScore").as(Double.class), query.getSubjectiveScoreGt()));
+                    predicates.add(cb.greaterThan(root.get("subjectiveScore").as(Double.class),
+                            query.getSubjectiveScoreGt()));
                 } else if (query.getSubjectiveScoreLt() != null) {
-                    predicates.add(
-                            cb.lessThan(root.get("subjectiveScore").as(Double.class), query.getSubjectiveScoreLt()));
+                    predicates.add(cb.lessThan(root.get("subjectiveScore").as(Double.class),
+                            query.getSubjectiveScoreLt()));
                 }
                 if (query.getUpload() != null) {
                     predicates.add(cb.equal(root.get("upload"), query.getUpload()));
@@ -602,8 +602,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                         predicates.add(cb.and(sub));
                     }
                 }
-                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()]));
             }
         };
     }
@@ -656,9 +656,9 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         query.setPageNumber(1);
         query.setPageSize(1);
         query.setSort(new Sort(Direction.ASC, "uploadTime", "id"));
-        List<ExamStudent> list = minUploadTime != null
-                ? studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, minUploadTime, query)
-                : studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber, query);
+        List<ExamStudent> list = minUploadTime != null ? studentDao.findUnLibraryStudent(examId, subjectCode,
+                groupNumber, minUploadTime, query) : studentDao.findUnLibraryStudent(examId, subjectCode, groupNumber,
+                query);
         return list.isEmpty() ? null : list.get(0);
     }
 
@@ -697,8 +697,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         return countByQuery(query);
     }
 
-    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,
-            boolean breach) {
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent, boolean breach) {
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
         query.setExamId(examId);
         query.setSubjectCode(subjectCode);
@@ -811,8 +810,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 + format.format(student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0));
         // 客观题得分明细
         List<String> objectives = new LinkedList<>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(student.getExamId(),
-                student.getSubjectCode(), true, student.getPaperType());
+        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndPaperType(
+                student.getExamId(), student.getSubjectCode(), true, student.getPaperType());
         List<ScoreItem> scoreList = student.getScoreList(true);
         List<String> details = new ArrayList<>();
         int i = 0;
@@ -892,14 +891,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             // 添加轨迹分
             List<MarkTrack> tracks = trackService.findByLibraryId(selected.getId());
             for (MarkTrack markTrack : tracks) {
-                originTags.add(new OriginTag(format.format(markTrack.getScore()), markTrack.getPositionX(),
-                        markTrack.getPositionY()));
+                originTags.add(new OriginTag(format.format(markTrack.getScore()), markTrack.getPositionX(), markTrack
+                        .getPositionY()));
             }
             // 添加特殊标记
             List<MarkSpecialTag> specialTags = specialTagService.findByLibraryId(selected.getId());
             for (MarkSpecialTag markSpecialTag : specialTags) {
-                originTags.add(new OriginTag(markSpecialTag.getTagName(), markSpecialTag.getPositionX(),
-                        markSpecialTag.getPositionY()));
+                originTags.add(new OriginTag(markSpecialTag.getTagName(), markSpecialTag.getPositionX(), markSpecialTag
+                        .getPositionY()));
             }
         }
         return originTags;
@@ -932,9 +931,4 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     public List<String> findDistinctClassName(Integer examId, String subjectCode) {
         return studentDao.findDistinctClassName(examId, subjectCode);
     }
-
-    @Override
-    public List<String> findDistinctPaperType(Integer examId, String subjectCode) {
-        return studentDao.findDistinctPaperType(examId, subjectCode);
-    }
 }

+ 11 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/query/ExamQuestionSearchQuery.java

@@ -24,8 +24,10 @@ public class ExamQuestionSearchQuery extends BaseQuery<ExamQuestion> {
 
     private Double zeroRateGt;
 
+    private Integer mainNumber;
+
     public void orderBySubjectAndNumber() {
-        setSort(new Sort(Direction.ASC, "subjectCode","paperType", "mainNumber", "subNumber"));
+        setSort(new Sort(Direction.ASC, "subjectCode", "paperType", "mainNumber", "subNumber"));
     }
 
     public Integer getExamId() {
@@ -92,4 +94,12 @@ public class ExamQuestionSearchQuery extends BaseQuery<ExamQuestion> {
         this.zeroRateGt = zeroRateGt;
     }
 
+    public Integer getMainNumber() {
+        return mainNumber;
+    }
+
+    public void setMainNumber(Integer mainNumber) {
+        this.mainNumber = mainNumber;
+    }
+
 }

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

@@ -1,5 +1,8 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
@@ -14,4 +17,7 @@ public interface ReportSubjectClassGroupDao extends PagingAndSortingRepository<R
     @Query("delete from ReportSubjectClassGroup r where r.examId=?1 ")
     void deleteByExamId(Integer exmaId);
 
+    List<ReportSubjectClassGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperTypeAndClassName(Integer examId,
+            String subjectCode, boolean objective, String paperType, String className, Sort sort);
+
 }

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

@@ -1,5 +1,8 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
+import java.util.List;
+
+import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
@@ -20,4 +23,7 @@ public interface ReportSubjectGroupDao extends PagingAndSortingRepository<Report
     @Query("delete from ReportSubjectGroup r where r.examId=?1 ")
     void deleteByExamId(Integer exmaId);
 
+    List<ReportSubjectGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId, String subjectCode,
+            boolean objective, String paperType, Sort sort);
+
 }

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

@@ -1,24 +1,29 @@
 package cn.com.qmth.stmms.biz.report.dao;
 
-import cn.com.qmth.stmms.biz.report.model.ReportSubjectQuestion;
+import java.util.List;
 
+import org.springframework.data.domain.Sort;
 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.ReportSubjectQuestion;
+
 /**
  * 客、主观题分析 Dao
  *
  * @author xuwenjin
  * @date 2019-04-17
  */
-public interface ReportSubjectQuestionDao
-        extends PagingAndSortingRepository<ReportSubjectQuestion, Integer>, JpaSpecificationExecutor<ReportSubjectQuestion> {
+public interface ReportSubjectQuestionDao extends PagingAndSortingRepository<ReportSubjectQuestion, Integer>,
+        JpaSpecificationExecutor<ReportSubjectQuestion> {
 
     @Modifying
     @Query("delete from ReportSubjectQuestion r where r.examId=?1 ")
     void deleteByExamId(Integer exmaId);
 
+    List<ReportSubjectQuestion> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId, String subjectCode,
+            boolean objective, String paperType, Sort sort);
 
 }

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

@@ -16,4 +16,7 @@ public interface ReportSubjectClassGroupService {
 
     List<ReportSubjectClassGroup> findByQuery(ReportSubjectQuery query);
 
+    List<ReportSubjectClassGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId,
+            String subjectCode, boolean objective, String paperType, String className);
+
 }

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

@@ -22,4 +22,7 @@ public interface ReportSubjectGroupService {
     ReportSubjectGroup findOne(Integer examId, String subjectCode, boolean objective, String paperType,
             Integer mainNumber);
 
+    List<ReportSubjectGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId, String subjectCode,
+            boolean objective, String paperType);
+
 }

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

@@ -22,4 +22,7 @@ public interface ReportSubjectQuestionService {
     ReportSubjectQuestion findOne(Integer examId, String subjectCode, boolean isObjective, String paperType,
             Integer mainNumber, Integer subNumber);
 
+    List<ReportSubjectQuestion> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId, String subjectCode,
+            boolean isObjective, String paperType);
+
 }

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

@@ -80,7 +80,8 @@ public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportS
                         if (query.getObjective() != null) {
                             predicates.add(cb.equal(root.get("objective"), query.getObjective()));
                         }
-                        if (query.getObjective() != null && query.getObjective()) {
+                        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
@@ -90,4 +91,10 @@ public class ReportSubjectClassGroupServiceImpl extends BaseQueryService<ReportS
         return result.getContent();
     }
 
+    @Override
+    public List<ReportSubjectClassGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId,
+            String subjectCode, boolean objective, String paperType, String className) {
+        return reportSubjectClassGroupDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperTypeAndClassName(examId,
+                subjectCode, objective, paperType, className, new Sort(Direction.ASC, "groupNumber"));
+    }
 }

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

@@ -63,7 +63,8 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
                 if (query.getGroupNumber() > 0) {
                     predicates.add(cb.equal(root.get("groupNumber"), query.getGroupNumber()));
                 }
-                if (query.getObjective() != null && query.getObjective()) {
+                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
@@ -91,4 +92,10 @@ public class ReportSubjectGroupServiceImpl extends BaseQueryService<ReportSubjec
         return list.isEmpty() ? null : list.get(0);
     }
 
+    @Override
+    public List<ReportSubjectGroup> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId,
+            String subjectCode, boolean objective, String paperType) {
+        return reportSubjectGroupDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, objective,
+                paperType, new Sort(Direction.ASC, "groupNumber"));
+    }
 }

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

@@ -61,9 +61,6 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
                         if (query.getExamId() != null) {
                             predicates.add(cb.equal(root.get("examId"), query.getExamId()));
                         }
-                        if (query.getObjective() != null && query.getObjective()) {
-                            predicates.add(cb.equal(root.get("paperType"), query.getPaperType()));
-                        }
                         if (StringUtils.isNotBlank(query.getSubjectCode())) {
                             predicates.add(cb.equal(root.get("subjectCode"), query.getSubjectCode()));
                         }
@@ -76,6 +73,10 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
                         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()]));
                     }
@@ -97,4 +98,11 @@ public class ReportSubjectQuestionServiceImpl extends BaseQueryService<ReportSub
         return list.isEmpty() ? null : list.get(0);
     }
 
+    @Override
+    public List<ReportSubjectQuestion> findByExamIdAndSubjectCodeAndObjectiveAndPaperType(Integer examId,
+            String subjectCode, boolean objective, String paperType) {
+        return reportSubjectQuestionDao.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode,
+                objective, paperType, new Sort(Direction.ASC, "mainNumber", "subNumber"));
+    }
+
 }

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

@@ -4,6 +4,7 @@ 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.exam.service.query.ExamQuestionSearchQuery;
 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;
@@ -49,15 +50,19 @@ public class SubjectClassGroupModule extends SubjectGroupModule implements Modul
                 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);
+                ExamQuestionSearchQuery query = new ExamQuestionSearchQuery();
+                query.setExamId(context.getExamId());
+                query.setSubjectCode(subjectCode);
+                query.setObjective(objective);
+                query.setTotalScoreGt(0d);
+                if (paperType == null) {
+                    query.setNullPaperType(true);
                 } else {
-                    questionCount = (int) questionService.countByExamAndSubjectAndObjectiveAndMainNumber(
-                            context.getExamId(), subjectCode, objective, mainNumber);
+                    query.setPaperType(paperType);
                 }
+                query.setMainNumber(mainNumber);
+                int questionCount = (int) questionService.countByQuery(query);
                 r.setQuestionCount(questionCount);
                 r.setPaperType(paperType);
                 service.save(r);

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

@@ -10,6 +10,7 @@ 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.exam.service.query.ExamQuestionSearchQuery;
 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;
@@ -106,15 +107,20 @@ 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);
+                ExamQuestionSearchQuery query = new ExamQuestionSearchQuery();
+                query.setExamId(context.getExamId());
+                query.setSubjectCode(subjectCode);
+                query.setObjective(objective);
+                query.setTotalScoreGt(0d);
+                if (paperType == null) {
+                    query.setNullPaperType(true);
                 } else {
-                    questionCount = (int) questionService.countByExamAndSubjectAndObjectiveAndMainNumber(
-                            context.getExamId(), subjectCode, objective, mainNumber);
+                    query.setPaperType(paperType);
                 }
+                query.setMainNumber(mainNumber);
+                int questionCount = (int) questionService.countByQuery(query);
                 r.setQuestionCount(questionCount);
                 r.setPaperType(paperType);
                 service.save(r);

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

@@ -88,9 +88,14 @@ public class SubjectModule implements Module {
             query.setExamId(context.getExamId());
             query.setSubjectCode(subjectCode);
             query.setObjective(false);
+            query.setTotalScoreGt(0d);
             long subjectiveCcount = questionService.countByQuery(query);
             query.setObjective(true);
-            query.setPaperType(paperType);
+            if(paperType==null){
+                query.setNullPaperType(true);
+            }else{
+                query.setPaperType(paperType);
+            }
             long ObjectiveCcount = questionService.countByQuery(query);
             subject.setQuestionCount((int) (subjectiveCcount + ObjectiveCcount));
             service.save(subject);

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

@@ -116,8 +116,8 @@ public class SubjectQuestionOptionModule implements Module {
     private OptionCounter findCounter(String key, ExamQuestion question) {
         OptionCounter counter = counters.get(key);
         if (counter == null) {
-            boolean muti = question.getMainTitle().indexOf("多项选择") >= 0 && question.getMainTitle().indexOf("多选") >= 0
-                    && question.getMainTitle().indexOf("不定项选择") >= 0;
+            boolean muti = question.getMainTitle().indexOf("多项选择") >= 0 || question.getMainTitle().indexOf("多选") >= 0
+                    || question.getMainTitle().indexOf("不定项选择") >= 0;
             counter = new OptionCounter(muti);
             counters.put(key, counter);
         }

+ 59 - 42
stmms-web/src/main/java/cn/com/qmth/stmms/report/ReportController.java

@@ -19,8 +19,8 @@ import org.springframework.web.bind.annotation.RequestMethod;
 
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamService;
-import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.report.model.ReportSubject;
 import cn.com.qmth.stmms.biz.report.model.ReportSubjectClass;
@@ -82,7 +82,7 @@ public class ReportController {
     private ReportSubjectService reportSubjectService;
 
     @Autowired
-    private ExamStudentService studentService;
+    private ExamQuestionService examQuestionService;
 
     public static final String ANSWER_SPLIT = ",";
 
@@ -110,10 +110,10 @@ public class ReportController {
             result.accumulate("message", "找不到对应科目");
             return result;
         }
-        List<String> paperTypes = studentService.findDistinctPaperType(examId, subjectCode);
-        if (!paperTypes.contains(paperType)) {
+        List<String> paperTypes = examQuestionService.getPaperTypeWitnNull(examId, subjectCode);
+        if (!contains(subject.getObjectiveScore() > 0, paperTypes, paperType)) {
             result.accumulate("code", "500");
-            result.accumulate("message", "没有对应的卷型");
+            result.accumulate("message", "试卷结构中没有对应的卷型");
             return result;
         }
         try {
@@ -131,24 +131,24 @@ public class ReportController {
             ReportSubject reportSubject = reportSubjectService.findOne(query.getExamId(), query.getSubjectCode());
             List<ReportSubjectClass> subjectClasses = classService.findByQuery(query);
             List<ReportSubjectGroup> subjectGroups = new ArrayList<ReportSubjectGroup>();
-            query.setObjective(true);
-            List<ReportSubjectGroup> subjectGroupO = groupService.findByQuery(query);
-            query.setObjective(false);
-            List<ReportSubjectGroup> subjectGroupsS = groupService.findByQuery(query);
-            subjectGroups.addAll(subjectGroupO);
-            subjectGroups.addAll(subjectGroupsS);
+            List<ReportSubjectGroup> objectiveGroup = groupService.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(
+                    examId, subjectCode, true, paperType);
+            List<ReportSubjectGroup> subjectiveGroup = groupService.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(
+                    examId, subjectCode, false, paperType);
+            subjectGroups.addAll(objectiveGroup);
+            subjectGroups.addAll(subjectiveGroup);
             result.accumulate("basic_paper", getPaperJson(reportSubject));
-            result.accumulate("basic_question_subjective", getQuestionJson(query, false, null));
-            result.accumulate("basic_question_objective", getQuestionJson(query, true, paperType));
+            result.accumulate("basic_question_subjective", getQuestionJson(examId, subjectCode, false, null));
+            result.accumulate("basic_question_objective", getQuestionJson(examId, subjectCode, true, paperType));
             result.accumulate("basic_class", getClassJson(subjectClasses));
             result.accumulate("basic_teacher", getTeacerJson(query));
             result.accumulate("basic_college", getCollegeJson(query));
             result.accumulate("basic_main_question", getGroupJson(subjectGroups));
-            result.accumulate("basic_question_option", getOptionJson(query, reportSubject, paperType));
+            result.accumulate("basic_question_option", getOptionJson(reportSubject, paperType));
             result.accumulate("discrimination_level",
-                    getDiscrimination(query, paperType, reportSubject, subjectClasses, subjectGroups));
+                    getDiscrimination(examId, subjectCode, paperType, reportSubject, subjectClasses, subjectGroups));
             result.accumulate("difficulty_level",
-                    getDifficulty(query, paperType, reportSubject, subjectClasses, subjectGroups));
+                    getDifficulty(examId, subjectCode, 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));
@@ -162,6 +162,27 @@ public class ReportController {
         }
     }
 
+    private boolean contains(boolean objective, List<String> paperTypes, String paperType) {
+        if (paperType == null) {
+            if (!objective) {
+                // 纯主观题
+                return true;
+            } else if (paperTypes.contains(paperType)) {
+                // null卷型
+                return true;
+            } else {
+                return false;
+            }
+        }
+        paperTypes.remove(null);
+        for (String s : paperTypes) {
+            if (paperType.equalsIgnoreCase(s)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private String getPaperJson(ReportSubject r) {
         JSONObject jsonObject = new JSONObject();
         jsonObject.accumulate("fullScore", r.getTotalScore());
@@ -349,7 +370,7 @@ public class ReportController {
         return array.toString();
     }
 
-    private String getDifficulty(ReportSubjectQuery query, String paperType, ReportSubject reportSubject,
+    private String getDifficulty(Integer examId, String subjectCode, String paperType, ReportSubject reportSubject,
             List<ReportSubjectClass> subjectClasses, List<ReportSubjectGroup> subjectGroups) {
         JSONObject defaultLevels = new JSONObject();
         JSONObject content = new JSONObject();
@@ -397,13 +418,13 @@ public class ReportController {
             group.accumulate("levels", reportSubjectClass.getDifficulityLevel() == null ? defaultLevels.toString()
                     : reportSubjectClass.getDifficulityLevel());
             classGroups.add(group);
-            query.setClassName(reportSubjectClass.getClassName());
             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);
+            List<ReportSubjectClassGroup> classGroupsListO = classGroupService
+                    .findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, true, paperType,
+                            reportSubjectClass.getClassName());
+            List<ReportSubjectClassGroup> classGroupsListS = classGroupService
+                    .findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, false, paperType,
+                            reportSubjectClass.getClassName());
             classGroupsList.addAll(classGroupsListO);
             classGroupsList.addAll(classGroupsListS);
             for (ReportSubjectClassGroup r : classGroupsList) {
@@ -422,7 +443,7 @@ public class ReportController {
         return result.toString();
     }
 
-    private String getDiscrimination(ReportSubjectQuery query, String paperType, ReportSubject reportSubject,
+    private String getDiscrimination(Integer examId, String subjectCode, String paperType, ReportSubject reportSubject,
             List<ReportSubjectClass> subjectClasses, List<ReportSubjectGroup> subjectGroups) {
         JSONObject defaultLevels = new JSONObject();
         JSONObject content = new JSONObject();
@@ -471,13 +492,13 @@ public class ReportController {
             group.accumulate("levels", reportSubjectClass.getDiscriminationLevel() == null ? defaultLevels.toString()
                     : reportSubjectClass.getDiscriminationLevel());
             classGroups.add(group);
-            query.setClassName(reportSubjectClass.getClassName());
             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);
+            List<ReportSubjectClassGroup> classGroupsListO = classGroupService
+                    .findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, true, paperType,
+                            reportSubjectClass.getClassName());
+            List<ReportSubjectClassGroup> classGroupsListS = classGroupService
+                    .findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId, subjectCode, false, paperType,
+                            reportSubjectClass.getClassName());
             classGroupsList.addAll(classGroupsListO);
             classGroupsList.addAll(classGroupsListS);
             for (ReportSubjectClassGroup r : classGroupsList) {
@@ -496,12 +517,12 @@ public class ReportController {
         return result.toString();
     }
 
-    private String getOptionJson(ReportSubjectQuery query, ReportSubject reportSubject, String paperType) {
+    private String getOptionJson(ReportSubject reportSubject, String paperType) {
         JSONObject value = new JSONObject();
-        value.accumulate("options", reportSubject.getOptions() == null?new JSONArray().toString():reportSubject.getOptions().split(ANSWER_SPLIT));
-        query.setObjective(true);
-        query.setPaperType(paperType);
-        List<ReportSubjectQuestion> list = questionService.findByQuery(query);
+        value.accumulate("options", reportSubject.getOptions() == null ? new JSONArray().toString() : reportSubject
+                .getOptions().split(ANSWER_SPLIT));
+        List<ReportSubjectQuestion> list = questionService.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(
+                reportSubject.getExamId(), reportSubject.getSubjectCode(), true, paperType);
         JSONArray array = new JSONArray();
         for (ReportSubjectQuestion r : list) {
             JSONObject jsonObject = new JSONObject();
@@ -614,13 +635,10 @@ public class ReportController {
         return array.toString();
     }
 
-    private String getQuestionJson(ReportSubjectQuery query, boolean isObjective, String paperType) {
-        query.setObjective(isObjective);
-        if (isObjective) {
-            query.setPaperType(paperType);
-        }
+    private String getQuestionJson(Integer examId, String subjectCode, boolean isObjective, String paperType) {
         JSONArray array = new JSONArray();
-        List<ReportSubjectQuestion> list = questionService.findByQuery(query);
+        List<ReportSubjectQuestion> list = questionService.findByExamIdAndSubjectCodeAndObjectiveAndPaperType(examId,
+                subjectCode, isObjective, paperType);
         for (ReportSubjectQuestion r : list) {
             JSONObject jsonObject = new JSONObject();
             jsonObject.accumulate("name", r.getQuestionName());
@@ -642,5 +660,4 @@ public class ReportController {
         }
         return array.toString();
     }
-
 }