Bladeren bron

增加给分曲线

ting.yin 6 jaren geleden
bovenliggende
commit
07f4a9cecc

+ 4 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java

@@ -113,4 +113,8 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     int updateMarkerResult(Integer id, LibraryStatus newStatus, Integer markerId, Double markerScore,
             String markerScoreList, Date markerTime, Integer spent, String tags, LibraryStatus... previousStatus);
 
+    @Query("select m.markerScore ,count(*) from MarkLibrary m where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3 and m.markerId=?4 and m.status=?5 group by m.markerScore ")
+	List<Object[]> findScoreCount(int examId, String subjectCode,
+			Integer groupNumber, Integer markerId, LibraryStatus status);
+
 }

+ 6 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLibraryServiceImpl.java

@@ -150,4 +150,10 @@ public class MarkLibraryServiceImpl extends BaseQueryService<MarkLibrary> implem
         return libraryDao.findByStudentIdAndStatus(studentId, status);
     }
 
+	@Override
+	public List<Object[]> findScoreCount(int examId, String subjectCode,
+			Integer groupNumber, Integer id, LibraryStatus status) {
+		return libraryDao.findScoreCount(examId, subjectCode, groupNumber, id, status);
+	}
+
 }

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkLibraryService.java

@@ -31,4 +31,6 @@ public interface MarkLibraryService {
 
     List<MarkLibrary> findByStudentIdAndStatus(int studentId, LibraryStatus status);
 
+	List<Object[]> findScoreCount(int examId, String subjectCode,Integer groupNumber, Integer id,LibraryStatus status);
+
 }

+ 90 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkQualityController.java

@@ -1,6 +1,9 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -12,17 +15,24 @@ import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
+import cn.com.qmth.stmms.admin.vo.MarkerVO;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
+import cn.com.qmth.stmms.biz.exam.model.Marker;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.biz.mark.thread.MarkQualityThread;
 import cn.com.qmth.stmms.common.domain.WebUser;
+import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.enums.LockType;
 import cn.com.qmth.stmms.common.utils.Callback;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
@@ -47,6 +57,15 @@ public class MarkQualityController extends BaseExamController {
 
     @Autowired
     private AsyncTaskExecutor taskExecutor;
+    
+    @Autowired
+    private ExamQuestionService questionService;
+    
+    @Autowired
+    private ExamSubjectService subjectService;
+    
+    @Autowired
+    private MarkLibraryService libraryService;
 
     @RequestMapping
     public String list(Model model, HttpServletRequest request, MarkerSearchQuery query) {
@@ -104,5 +123,76 @@ public class MarkQualityController extends BaseExamController {
     private String getLockKey(Integer examId, String subjectCode, Integer groupNumber) {
         return examId + "_" + subjectCode + "_" + groupNumber;
     }
+    
+    @RequestMapping("/chart")
+    public String chart(HttpServletRequest request, Model model, 
+            @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
+    	int examId = getSessionExamId(request);
+        MarkGroup group = groupService.findOne(examId, subjectCode, groupNumber);
+        if (group != null) {
+        	List<MarkerVO> list  = new ArrayList<MarkerVO>();
+            List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subjectCode, groupNumber);
+            Double minScore = null;
+            Double maxScore = null; 
+            for (Marker marker : markers) {
+            	List<Object[]> libraries = libraryService.findScoreCount(examId,subjectCode,groupNumber,marker.getId(),LibraryStatus.MARKED);
+        		Map<Double,Long> scoreCount = new HashMap<Double, Long>();
+        		for (Object[] array : libraries) {
+        			Double score = (Double)array[0];
+        			Long count = (Long)array[1];
+        			scoreCount.put(score, count);
+        			if(minScore == null || maxScore ==null){
+        				minScore=score;
+        				maxScore=score;
+        			}else{
+        				if(minScore > score){
+        					minScore=score;
+        				}
+        				if(maxScore < score){
+        					maxScore=score;
+        				}
+        			}
+    			}
+        		MarkerVO vo =new MarkerVO();
+    			vo.setLoginName(marker.getLoginName());
+    			vo.setName(marker.getName());
+    			vo.setScoreCount(scoreCount);
+    			list.add(vo);
+			}
+            model.addAttribute("minScore", minScore);
+            model.addAttribute("maxScore", maxScore);
+            model.addAttribute("markers", list);
+            model.addAttribute("group", group);
+        }
+        model.addAttribute("subject", subjectService.find(examId, subjectCode));
+        model.addAttribute("subjectCode", subjectCode);
+        model.addAttribute("groupNumber", groupNumber);
+        return "modules/exam/qualityChart";
+    }
+    
+    @RequestMapping("/getChart")
+    @ResponseBody
+    public List<MarkerVO> getChart(HttpServletRequest request, @RequestParam String subjectCode, @RequestParam Integer groupNumber) {
+    	int examId = getSessionExamId(request);
+    	List<MarkerVO> list  = new ArrayList<MarkerVO>();
+    	List<Marker> markers = markerService.findByExamAndSubjectAndGroup(examId, subjectCode, groupNumber);
+    	for (Marker marker : markers) {
+    		List<Object[]> libraries = libraryService.findScoreCount(examId,subjectCode,groupNumber,marker.getId(),LibraryStatus.MARKED);
+    		long totalCount = libraryService.countByMarker(marker.getId());
+    		Map<Double,Double> scorePercent = new HashMap<Double, Double>();
+    		for (Object[] array : libraries) {
+    			Double score = (Double)array[0];
+    			Long count = (Long)array[1];
+    			double percent = count*100/totalCount;
+    			scorePercent.put(score, percent);
+			}
+    		MarkerVO vo =new MarkerVO();
+			vo.setLoginName(marker.getLoginName());
+			vo.setName(marker.getName());
+			vo.setScorePercent(scorePercent);
+			list.add(vo);
+		}
+        return list;
+    }
 
 }

+ 51 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/MarkerVO.java

@@ -0,0 +1,51 @@
+package cn.com.qmth.stmms.admin.vo;
+
+import java.util.Map;
+
+
+public class MarkerVO {
+
+    private String loginName;
+
+    private String name;
+
+    private Map<Double,Double> scorePercent;
+    
+    private Map<Double,Long> scoreCount;
+    
+    public MarkerVO() {
+    }
+
+	public String getLoginName() {
+		return loginName;
+	}
+
+	public void setLoginName(String loginName) {
+		this.loginName = loginName;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Map<Double, Double> getScorePercent() {
+		return scorePercent;
+	}
+
+	public void setScorePercent(Map<Double, Double> scorePercent) {
+		this.scorePercent = scorePercent;
+	}
+
+	public Map<Double, Long> getScoreCount() {
+		return scoreCount;
+	}
+
+	public void setScoreCount(Map<Double, Long> scoreCount) {
+		this.scoreCount = scoreCount;
+	}
+
+}

+ 111 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityChart.jsp

@@ -0,0 +1,111 @@
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>评卷质量监控</title>
+	<meta name="decorator" content="default"/>
+	<%@include file="/WEB-INF/views/include/head.jsp" %>
+	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+	<script src="${ctxStatic}/echarts/echarts.min.js" type="text/javascript"></script>
+</head>
+<body>
+    <ul class="nav nav-tabs">
+        <li class="active"><a href="#">${subject.code}-${subject.name}&nbsp;&nbsp;${group.number}-${group.title}</a></li>
+        <li><a href="${ctx}/admin/exam/quality?subjectCode=${subject.code}">返回</a></li>
+    </ul>
+	<tags:message content="${message}"/>
+	<div id="main" style="width: 800px;height:300px;"></div>
+	<table id="contentTable" class="table table-striped table-bordered table-condensed">
+		<thead>
+			<tr>
+				<th>评卷员</th>
+				<th>姓名</th>
+				<c:forEach var="i" begin="${minScore}" end="${maxScore}">
+					<th><c:out value="${i}"/>分</th>
+				</c:forEach>
+			</tr>
+		</thead>
+		<tbody>
+		<c:forEach items="${markers}" var="marker">
+			<tr>
+				<td>${marker.loginName}</td>
+				<td>${marker.name}</td>
+				<c:forEach var="i" begin="${minScore}" end="${maxScore}">
+					<td>
+					<c:if test="${marker.scoreCount[i*1.0]!=null}">${marker.scoreCount[i*1.0] }</c:if>
+					<c:if test="${marker.scoreCount[i*1.0]==null }">0</c:if>
+					</td>
+				</c:forEach>
+			</tr>
+		</c:forEach>
+		</tbody>
+	</table>
+<script type="text/javascript">
+var groupNumber='${groupNumber}';
+var subjectCode='${subjectCode}';
+var markerArray= [] ;
+var nameList = [];
+var maxScore = ${maxScore};
+var minScore = ${minScore};
+var scoreArray = new Array();
+for(var i=minScore;i<= maxScore;i++){
+	scoreArray.push(i);
+}
+$.post('${ctx}/admin/exam/quality/getChart', {subjectCode: subjectCode,groupNumber:groupNumber}, function(result){
+	for(var i=0;i<result.length;i++){
+        var marker = result[i];
+        var scorePercents= [];
+		var percent = marker.scorePercent;
+		console.log(percent);
+		for(var j=minScore;j<= maxScore;j++){
+        	if(percent==null){
+        		scorePercents.push(0);
+        	}else{
+        		scorePercents.push(percent);
+        	}
+        }
+        var option  = {
+            name:marker.loginName,
+            type:'line',
+            stack: '总量',
+            data:scorePercents
+        }
+        markerArray.push(option);
+        nameList.push(marker.loginName);
+    }
+});
+
+console.log(markerArray);
+console.log(nameList);
+console.log(scoreArray);
+var myChart = echarts.init(document.getElementById('main'));
+option = {
+	    tooltip : {
+	        trigger: 'axis'
+	    },
+	    legend: {
+	        data:nameList
+	    },
+	    toolbox: {
+	        show : true
+	    },
+	    calculable : true,
+	    xAxis : [
+	        {
+	            type : 'category',
+	            boundaryGap : false,
+	            data : scoreArray
+	        }
+	    ],
+	    yAxis : [
+	        {
+	            type : 'value'
+	        }
+	    ],
+	    series : markerArray
+	    
+	};
+myChart.setOption(option);
+</script>	
+</body>
+</html>

+ 15 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/qualityList.jsp

@@ -39,6 +39,7 @@
             </c:if>
             <c:if test="${running==false}">
             <a href="##" class="btn" id="update-button">重新计算</a>
+            <a href="##" class="btn" id="chart-button">给分曲线</a>
             </c:if>
             </c:if>
 		</div>
@@ -112,6 +113,20 @@ $('#update-button').click(function(){
     $(this).attr('href','${ctx}/admin/exam/quality/update?subjectCode='+subjectCode+'&groupNumber='+groupNumber);
     return true;
 });
+$('#chart-button').click(function(){
+    var subjectCode = $('#subject-select').val();
+    var groupNumber = $('#group-select').val();
+    if(subjectCode=='') {
+        alert('请选择科目');
+        return false;
+    }
+    if(groupNumber=='') {
+        alert('请选择大题');
+        return false;
+    }
+    $(this).attr('href','${ctx}/admin/exam/quality/chart?subjectCode='+subjectCode+'&groupNumber='+groupNumber);
+    return true;
+});
 function page(n,s){
 	$("#pageNumber").val(n);
 	$("#pageSize").val(s);