Преглед изворни кода

成绩查询页面与成绩分析页面列表查询逻辑优化

nikang пре 6 година
родитељ
комит
7a4d8e1a74

+ 5 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -50,6 +50,10 @@ public interface ExamStudentService {
 
     long countByExamIdAndSubjectCode(int examId, String subjectCode, boolean upload, boolean absent);
 
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,boolean breach);
+
+    public long countByAbsentAndBreach(int examId, String subjectCode, Boolean absent, Boolean breach);
+
     long countCampusByExam(int examId);
 
     long countByExamIdAndUpload(int examId, boolean upload);
@@ -85,4 +89,5 @@ public interface ExamStudentService {
 
     List<ExamStudent> findByExamId(int examId,int pageNumber,int pageSize);
 
+    List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload,boolean absent,boolean breach);
 }

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

@@ -327,6 +327,27 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         query.setAbsent(absent);
         return countByQuery(query);
     }
+    public long countByNoAbsentAndBreach(int examId, String subjectCode, boolean upload, boolean absent,boolean breach) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        query.setUpload(upload);
+        query.setAbsent(absent);
+        query.setBreach(breach);
+        return countByQuery(query);
+    }
+    public long countByAbsentAndBreach(int examId, String subjectCode, Boolean absent, Boolean breach) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        if(breach != null){
+            query.setBreach(breach);
+        }
+        if(absent != null){
+            query.setAbsent(absent);
+        }
+        return countByQuery(query);
+    }
 
     @Override
     public long countByExamIdAndCampusName(int examId, String campusName) {
@@ -388,14 +409,21 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 List<Predicate> predicates = new LinkedList<Predicate>();
                 Expression<Double> evaluationItemSum = cb.sum(root.get("objectiveScore").as(Double.class),root.get("subjectiveScore").as(Double.class));
                 if (query.getStartScroe()!=null ) {
-                    predicates.add(cb.ge(evaluationItemSum,  query.getStartScroe()));
-                }
-                if (query.getEndScroe()!=null  ) {
-                    predicates.add(cb.le(evaluationItemSum,  query.getEndScroe()));
-                }
-                if (query.getStartScroe()!=null && query.getEndScroe()!=null ) {
-                    predicates.add(cb.between(evaluationItemSum, query.getStartScroe(), query.getEndScroe()));
+                    Predicate predicate1 = cb.ge(evaluationItemSum,query.getStartScroe());
+                    Predicate predicate2  = cb.le(evaluationItemSum,query.getEndScroe());
+                    if(query.getStartScroe() == 0){
+                        Predicate predicate = cb.or(cb.equal(root.get("absent"),true),cb.equal(root.get("breach"),true));
+                        Predicate predicate3 = cb.and(predicate1,predicate2);
+                        predicates.add(cb.or(predicate,predicate3));
+                    }else {
+                        predicates.add(cb.equal(root.get("absent"),  false));
+                        predicates.add(cb.equal(root.get("breach"),  false));
+                        predicates.add(cb.and(predicate1,predicate2));
+                    }
                 }
+//                if (query.getStartScroe()!=null && query.getEndScroe()!=null ) {
+//                    predicates.add(cb.between(evaluationItemSum, query.getStartScroe(), query.getEndScroe()));
+//                }
                 if (query.getExamId() > 0) {
                     predicates.add(cb.equal(root.get("examId"), query.getExamId()));
                 }
@@ -588,4 +616,11 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         List<String[]> o = studentDao.findIdsByMarkName(MarkName);
         return StringUtils.join(o, ",");
     }
+    @Override
+    /**
+     * 根据缺考和违纪字段联合查询
+     */
+    public List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload,boolean absent,boolean breach){
+        return  studentDao.statisticsByAbsentAndBreach(examId,code,upload,absent,breach);
+    }
 }

+ 47 - 14
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/StatisticsController.java

@@ -42,7 +42,7 @@ public class StatisticsController extends BaseParameterController {
 
     @RequestMapping
     public String list(Model model, HttpServletRequest request, ExamSubjectSearchQuery query,
-    		@RequestParam(required = false) Boolean upload) {
+    		@RequestParam(required = false) Boolean upload,@RequestParam(required = false) Boolean breach) {
         int examId = getSessionExamId(request);
         if (examId > 0) {
             query.setExamId(examId);
@@ -50,12 +50,13 @@ public class StatisticsController extends BaseParameterController {
             List<StatisticsVO> statisticsVOs = new ArrayList<StatisticsVO>(); 
             for (ExamSubject subject : query.getResult()) {
             	StatisticsVO vo = new StatisticsVO(subject);
-            	vo = getStatisticsInfo(vo,upload);
+            	vo = getStatisticsInfo(vo,upload,breach);
             	statisticsVOs.add(vo);
 			}
             model.addAttribute("statisticsVOs", statisticsVOs);
             model.addAttribute("query", query);
             model.addAttribute("upload", upload);
+            model.addAttribute("breach", breach);
             model.addAttribute("subjectList", getExamSubject(examId));
             model.addAttribute("levelList", subjectService.listLevel(examId));
             model.addAttribute("categoryList", subjectService.listCategory(examId));
@@ -65,22 +66,54 @@ public class StatisticsController extends BaseParameterController {
         }
     }
 
-	private StatisticsVO getStatisticsInfo(StatisticsVO vo,Boolean upload) {
+	private StatisticsVO getStatisticsInfo(StatisticsVO vo,Boolean upload,Boolean breach) {
 		List<Object[]> list = null;
-		if(upload!=null){
-			vo.setStudentCount(examStudentService.countByExamIdAndSubjectCode(vo.getExamId(), vo.getCode(), upload,false));
-			list = examStudentService.statisticsByExamIdAndSubjectCode(vo.getExamId(), vo.getCode(),upload,false);
-		}else{
-			vo.setStudentCount(examStudentService.countByExamIdAndSubjectCode(vo.getExamId(), vo.getCode()));
-			list = examStudentService.statisticsByExamIdAndSubjectCode(vo.getExamId(), vo.getCode());
-		}
-		vo.setCount0_49((long) (list.get(0)[0]==null?0L:list.get(0)[0]));
+        /**
+         *   没有违纪或者缺考的查询条件
+         * 1.先查询不违纪和不缺考的情况下每个阶段分数个数
+         * 2.然后分别查询违纪和缺考的记录个数之和减去同时是违纪和缺考的记录个数,并其个数归属到0-49分数段中
+         *   查询条件:不缺考(上传 不缺考)
+         * 1.先查询不缺考和不违纪的情况下每个阶段分数个数
+         * 2.然后查询不缺考和违纪的记录个数,并其个数归属到0-49分数段中
+         *   查询条件:不违纪
+         * 1.先查询不违纪和不缺考的情况下每个阶段分数个数
+         * 2.然后查询不违纪和缺考的记录个数,并将其个数归属到0-49分数段中
+         *   查询条件:不违纪和不缺考
+         * 1.直接查出不违纪和不缺考的情况下每个阶段分数个数
+         */
+        list = examStudentService.statisticsByAbsentAndBreach(vo.getExamId(),vo.getCode(),true,false,false);
+        if(upload == null && breach == null){
+            vo.setStudentCount(examStudentService.countByExamIdAndSubjectCode(vo.getExamId(), vo.getCode()));
+            //缺考的个数
+            long absentCount = examStudentService.countByAbsentAndBreach(vo.getExamId(),vo.getCode(),true,null);
+            //违纪的个数
+            long breachCount = examStudentService.countByAbsentAndBreach(vo.getExamId(),vo.getCode(),null,true);
+            //即使违纪也是缺考的个数
+            long absentAndBreachCount = examStudentService.countByAbsentAndBreach(vo.getExamId(),vo.getCode(),true,true);
+            vo.setCount0_49((long) (list.get(0)[0]==null?0L:list.get(0)[0])+absentCount+breachCount-absentAndBreachCount);
+            vo.setCount0_60((long) (list.get(0)[6]==null?0L:list.get(0)[6])+absentCount+breachCount-absentAndBreachCount);
+        }else if(upload != null && breach == null){
+            vo.setStudentCount(examStudentService.countByExamIdAndSubjectCode(vo.getExamId(), vo.getCode(), upload,false));
+            //不缺考和违纪的记录个数
+            long noAbsentAndBreachCount = examStudentService.countByNoAbsentAndBreach(vo.getExamId(),vo.getCode(),upload,false,true);
+            vo.setCount0_49((long) (list.get(0)[0]==null?0L:list.get(0)[0])+noAbsentAndBreachCount);
+            vo.setCount0_60((long) (list.get(0)[6]==null?0L:list.get(0)[6])+noAbsentAndBreachCount);
+        }else if(upload == null && breach != null){
+            vo.setStudentCount(examStudentService.countByAbsentAndBreach(vo.getExamId(),vo.getCode(),null,false));
+            //不违纪和缺考的记录个数
+            long noBreachAndAbsent = examStudentService.countByAbsentAndBreach(vo.getExamId(),vo.getCode(),true,false);
+            vo.setCount0_49((long) (list.get(0)[0]==null?0L:list.get(0)[0])+noBreachAndAbsent);
+            vo.setCount0_60((long) (list.get(0)[6]==null?0L:list.get(0)[6])+noBreachAndAbsent);
+        }else {
+            vo.setStudentCount(examStudentService.countByNoAbsentAndBreach(vo.getExamId(),vo.getCode(),true,false,false));
+            vo.setCount0_49((long) (list.get(0)[0]==null?0L:list.get(0)[0]));
+            vo.setCount0_60((long) (list.get(0)[6]==null?0L:list.get(0)[6]));
+        }
 		vo.setCount50_59((long) (list.get(0)[1]==null?0L:list.get(0)[1]));
 		vo.setCount60_69((long) (list.get(0)[2]==null?0L:list.get(0)[2]));
 		vo.setCount70_79((long) (list.get(0)[3]==null?0L:list.get(0)[3]));
 		vo.setCount80_89((long) (list.get(0)[4]==null?0L:list.get(0)[4]));
 		vo.setCount90_100((long) (list.get(0)[5]==null?0L:list.get(0)[5]));
-		vo.setCount0_60((long) (list.get(0)[6]==null?0L:list.get(0)[6]));
 		vo.setCount60_100((long) (list.get(0)[7]==null?0L:list.get(0)[7]));
 		if(vo.getStudentCount()!=0){
 			vo.setPercent0_49(new BigDecimal(vo.getCount0_49()*100.0/vo.getStudentCount()).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
@@ -97,7 +130,7 @@ public class StatisticsController extends BaseParameterController {
 
 	@RequestMapping(value = "/export", method = RequestMethod.POST)
 	public String exportFile(ExamSubjectSearchQuery query,
-			@RequestParam(required = false) Boolean upload,
+			@RequestParam(required = false) Boolean upload,@RequestParam(required = false) Boolean breach,
 			HttpServletRequest request, HttpServletResponse response,
 			RedirectAttributes redirectAttributes) {
 		int examId = getSessionExamId(request);
@@ -110,7 +143,7 @@ public class StatisticsController extends BaseParameterController {
 			List<StatisticsVO> statisticsVOs = new ArrayList<StatisticsVO>();
 			for (ExamSubject subject : query.getResult()) {
 				StatisticsVO vo = new StatisticsVO(subject);
-				vo = getStatisticsInfo(vo, upload);
+				vo = getStatisticsInfo(vo, upload,breach);
 				statisticsVOs.add(vo);
 			}
 			new ExportExcel("分段统计", StatisticsVO.class)

+ 10 - 4
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/statisticsInfo.jsp

@@ -40,11 +40,17 @@
 				</c:forEach>
 			</select>
 			&nbsp;
-			<label>是否缺考</label>
-			<select class="input-small" name="upload">
-				<option value="">不限</option>
-				<option value="1" <c:if test="${upload!=null && upload==true}">selected</c:if>>不缺考</option>
+			<label>是否包含缺考</label>
+			<select class="input-mini" name="upload">
+				<option value=""></option>
+				<option value="1" <c:if test="${upload!=null && upload==true}">selected</c:if>></option>
 			</select>
+            &nbsp;
+            <label>是否包含违纪</label>
+            <select class="input-mini" name="breach">
+                <option value="">是</option>
+                <option value="1" <c:if test="${breach!=null && breach==true}">selected</c:if>>否</option>
+            </select>
 			&nbsp;
 			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
 			&nbsp;