Browse Source

修复总题量计算中对无效题的统计;卷型改为用试卷结构中的卷型

ting.yin 6 years ago
parent
commit
7efabe5d5a

+ 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;
+    }
+
 }

+ 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);

+ 8 - 4
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);
+        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 {
@@ -168,9 +168,13 @@ public class ReportController {
                 // 纯主观题
                 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;