Przeglądaj źródła

新增试评分析

yin 11 miesięcy temu
rodzic
commit
893e047101

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

@@ -216,4 +216,6 @@ public interface ExamStudentService {
 	public void updateInspectCount(Integer studentId, Integer inspectCount);
 
     ExamStudent findBySchoolIdAndExamIdAndSubjectCodeAndStudentCode( Integer schoolId,Integer examId, String subjectCode, String studentCode);
+
+    List<ExamStudent> findByExamIdAndSubjectCodeAndTrial(Integer examId, String subjectCode, boolean isTrial);
 }

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

@@ -1686,4 +1686,14 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         return studentDao.findBySchoolIdAndExamIdAndSubjectCodeAndStudentCode( schoolId,examId, subjectCode,
                 studentCode);
     }
+
+    @Override
+    public List<ExamStudent> findByExamIdAndSubjectCodeAndTrial(Integer examId, String subjectCode, boolean isTrial) {
+        ExamStudentSearchQuery query = new ExamStudentSearchQuery();
+        query.setExamId(examId);
+        query.setSubjectCode(subjectCode);
+        query.setTrial(isTrial);
+        query.setPageSize(Integer.MAX_VALUE);
+        return findByQuery(query).getResult();
+    }
 }

+ 4 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/TrialLibraryDao.java

@@ -76,12 +76,14 @@ public interface TrialLibraryDao extends JpaRepository<TrialLibrary, Integer>, J
             + "where m.id=?1")
     void resetById(Integer id);
 
-    @Query("select f from TrialLibrary f where f.markerId=?1")
+    @Query("select f from TrialLibrary f where f.markerId=?1 order by f.studentId")
     List<TrialLibrary> findByMarkerId(Integer markerId);
 
     @Modifying(clearAutomatically = true)
     @Query("update TrialLibrary m set m.markerId=null, m.markerTime=null, m.markerScore=null, m.markerScoreList=null "
             + " where m.examId=?1 and m.subjectCode=?2 and m.groupNumber=?3")
     void resetByExamIdAndSubjectCodeAndGroupNumber(Integer examId, String subjectCode, Integer number);
-
+    @Query("select l from TrialLibrary l where l.examId=?1 and l.subjectCode=?2 and l.groupNumber=?3 "
+            + " and l.studentId in (?4) ")
+    List<TrialLibrary> findByExamIdAndSubjectCodeAndGroupNumberAndStudentIdIn(Integer examId, String subjectCode, Integer number, List<Integer> studentIds);
 }

+ 32 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkCronService.java

@@ -7,8 +7,13 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
+import cn.com.qmth.stmms.biz.exam.bean.UserStudentVo;
+import cn.com.qmth.stmms.biz.utils.BatchGetDataUtil;
+import cn.com.qmth.stmms.biz.utils.BatchUpdateDataUtil;
 import cn.com.qmth.stmms.common.enums.*;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +41,8 @@ import cn.com.qmth.stmms.biz.mark.service.TrialService;
 import cn.com.qmth.stmms.biz.report.service.ReportService;
 import cn.com.qmth.stmms.biz.utils.TaskLockUtil;
 
+import javax.persistence.Query;
+
 /**
  * 与评卷相关的所有定时任务
  *
@@ -325,8 +332,14 @@ public class MarkCronService {
     }
 
     private void buildTrialLibrary(MarkGroup group) {
-        List<ExamStudent> studentList = studentService.findUnTrialStudent(group.getExamId(), group.getSubjectCode(),
-                group.getNumber());
+        List<ExamStudent> studentList = new ArrayList<>();
+        if (TrialMode.EXCLUSIVE.equals(systemCache.getTrialMode())) {
+            studentList = studentService.findByExamIdAndSubjectCodeAndTrial(group.getExamId(), group.getSubjectCode(),
+                    true);
+        } else {
+            studentList = studentService.findUnTrialStudent(group.getExamId(), group.getSubjectCode(),
+                    group.getNumber());
+        }
         if (studentList.isEmpty()) {
             return;
         }
@@ -340,10 +353,24 @@ public class MarkCronService {
             }
             List<TrialLibrary> trialList = new ArrayList<TrialLibrary>();
             if (TrialMode.EXCLUSIVE.equals(systemCache.getTrialMode())) {
-                List<Marker> markerList = markerService.findByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
+                List<Integer> studentIds = studentList.stream().map(ExamStudent::getId).collect(Collectors.toList());
+                List<TrialLibrary> libraryList = new BatchGetDataUtil<TrialLibrary, Integer>() {
+                    @Override
+                    protected List<TrialLibrary> getData(List<Integer> dataList) {
+                        return trialService.findLibraryByStudentId(group.getExamId(), group.getSubjectCode(),
+                                group.getNumber(), dataList);
+                    }
+                }.getDataForBatch(studentIds, 200);
+                Map<Integer, List<TrialLibrary>> map = libraryList.stream()
+                        .collect(Collectors.groupingBy(TrialLibrary::getMarkerId));
+                List<Marker> markerList = markerService.findByExamAndSubjectAndGroup(group.getExamId(),
+                        group.getSubjectCode(), group.getNumber());
                 for (ExamStudent student : studentList) {
                     if (studentService.validateStatus(student.getId())) {
-                        for (Marker marker:markerList) {
+                        for (Marker marker : markerList) {
+                            if (map.get(marker.getId()) != null && map.get(marker.getId()).isEmpty()) {
+                                continue;
+                            }
                             TrialLibrary library = new TrialLibrary();
                             library.setExamId(student.getExamId());
                             library.setSubjectCode(student.getSubjectCode());
@@ -356,7 +383,7 @@ public class MarkCronService {
                         }
                     }
                 }
-            }else{
+            } else {
                 for (ExamStudent student : studentList) {
                     if (studentService.validateStatus(student.getId())) {
                         TrialLibrary library = new TrialLibrary();

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

@@ -168,4 +168,14 @@ public class TrialServiceImpl extends BaseQueryService<TrialLibrary> implements
     public void save(List<TrialLibrary> trialList) {
         libraryDao.save(trialList);
     }
+
+    @Override
+    public List<TrialLibrary> findLibraryByMarkerId(Integer markerId) {
+        return libraryDao.findByMarkerId(markerId);
+    }
+
+    @Override
+    public List<TrialLibrary> findLibraryByStudentId(Integer examId, String subjectCode, Integer number, List<Integer> studentIds) {
+        return libraryDao.findByExamIdAndSubjectCodeAndGroupNumberAndStudentIdIn(examId,subjectCode,number,studentIds);
+    }
 }

+ 3 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/TrialService.java

@@ -40,4 +40,7 @@ public interface TrialService {
 
     void save(List<TrialLibrary> trialList);
 
+    List<TrialLibrary> findLibraryByMarkerId(Integer markerId);
+
+    List<TrialLibrary> findLibraryByStudentId(Integer examId, String subjectCode, Integer number, List<Integer> studentIds);
 }

+ 53 - 12
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TrialController.java

@@ -2,12 +2,17 @@ package cn.com.qmth.stmms.admin.exam;
 
 import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 
+import cn.com.qmth.stmms.admin.vo.TrialMarkerVO;
+import cn.com.qmth.stmms.admin.vo.TrialQuestionVO;
 import cn.com.qmth.stmms.biz.config.service.impl.SystemCache;
 import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.enums.*;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONObject;
@@ -120,7 +125,8 @@ public class TrialController extends BaseExamController {
         model.addAttribute("query", query);
         model.addAttribute("subjectList", getExamSubject(examId, wu));
         model.addAttribute("groupList", groupList);
-        model.addAttribute("trialMode", systemCache.getTrialMode()== null ? TrialMode.SHARE:systemCache.getTrialMode());
+        model.addAttribute("trialMode",
+                systemCache.getTrialMode() == null ? TrialMode.SHARE : systemCache.getTrialMode());
         return "modules/exam/trialList";
     }
 
@@ -196,10 +202,8 @@ public class TrialController extends BaseExamController {
                 } else {
                     // 裁切图配置
                     obj.accumulate("fileServer", fileService.getFileServer());
-                    obj.accumulate(
-                            "urls",
-                            fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
-                                    student.getSliceCount()));
+                    obj.accumulate("urls", fileService.getSliceUris(student.getExamId(), student.getSecretNumber(), 1,
+                            student.getSliceCount()));
                     obj.accumulate("pictureConfig", group.getPictureConfigList());
                 }
                 // 评卷记录集合
@@ -220,6 +224,7 @@ public class TrialController extends BaseExamController {
         }
         return obj;
     }
+
     @Logging(menu = "试评分析查询", type = LogType.QUERY)
     @RequestMapping(value = "/marker")
     public String marker(Model model, HttpServletRequest request, MarkerSearchQuery query) {
@@ -235,28 +240,64 @@ public class TrialController extends BaseExamController {
         }
         List<MarkGroup> groupList = groupService.findByExamAndSubjectAndStatus(examId, query.getSubjectCode(),
                 MarkStatus.TRIAL);
+        String groupTile = null;
+        List<ExamQuestion> questionList = new ArrayList<>();
         if (!groupList.isEmpty()) {
             for (MarkGroup group : groupList) {
-                group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                        group.getSubjectCode(), false, group.getNumber()));
+                List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
+                        group.getSubjectCode(), false, group.getNumber());
+                group.setQuestionList(questions);
+                if (query.getGroupNumber() == group.getNumber()) {
+                    groupTile = group.getTitle();
+                    questionList = questions;
+                }
             }
         }
-        List<Marker> markerList = new ArrayList<Marker>();
+        List<TrialMarkerVO> markerList = new ArrayList<TrialMarkerVO>();
         if (query.getGroupNumber() != null) {
             MarkerSearchQuery mQuery = new MarkerSearchQuery();
             mQuery.setExamId(examId);
             mQuery.setSubjectCode(query.getSubjectCode());
             mQuery.setGroupNumber(query.getGroupNumber());
             mQuery.setPageSize(Integer.MAX_VALUE);
-            markerList = markerService.findByQuery(mQuery).getResult();
-            for (Marker marker : markerList) {
-                marker.setLoginName(userService.findById(marker.getUserId()).getLoginName());
+            query = markerService.findByQuery(mQuery);
+            for (Marker marker : query.getResult()) {
+                TrialMarkerVO vo = new TrialMarkerVO();
+                vo.setId(marker.getId());
+                vo.setLoginName(userService.findById(marker.getUserId()).getLoginName());
+                vo.setGroupNumber(marker.getGroupNumber());
+                vo.setGroupTitle(groupTile);
+                List<TrialLibrary> libraryList = trialService.findLibraryByMarkerId(marker.getId());
+                Double avgScore = libraryList.stream().mapToDouble(TrialLibrary::getMarkerScore).average().getAsDouble();
+                vo.setAvgScore(avgScore);
+                Map<Integer,List<ScoreItem>> map = new HashMap<>();
+                for (TrialLibrary library: libraryList) {
+                    List<ScoreItem> sList = library.getScoreList();
+                    for (int i = 0; i < questionList.size(); i++) {
+                        ExamQuestion question = questionList.get(i);
+                        List<ScoreItem> qsList = map.get(question.getId());
+                        if(qsList==null){
+                            qsList =new ArrayList<>();
+                        }
+                        qsList.add(sList.get(i));
+                        map.put(question.getId(),qsList);
+                    }
+                }
+                List<TrialQuestionVO> list = new ArrayList<>();
+                for (ExamQuestion question : questionList) {
+                    List<ScoreItem> qsList = map.get(question.getId());
+                    TrialQuestionVO trialQuestionVO =new TrialQuestionVO();
+                    trialQuestionVO.setAvgScore(qsList.stream().mapToDouble(ScoreItem::getScore).average().getAsDouble());
+                    trialQuestionVO.setScoreList(StringUtils.join(qsList, ","));
+                }
+                vo.setQuestionList(list);
             }
         }
         model.addAttribute("markerList", markerList);
         model.addAttribute("query", query);
         model.addAttribute("subjectList", getExamSubject(examId, wu));
         model.addAttribute("groupList", groupList);
-        return "modules/exam/trialList";
+        model.addAttribute("questionList", questionList);
+        return "modules/exam/trialMarkerList";
     }
 }

+ 82 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/TrialMarkerVO.java

@@ -0,0 +1,82 @@
+package cn.com.qmth.stmms.admin.vo;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+
+import java.util.List;
+import java.util.Map;
+
+public class TrialMarkerVO {
+
+    private Integer id;
+
+    private String loginName;
+
+    private Integer groupNumber;
+    private String groupTitle;
+
+    private Integer trialCount;
+
+    private Double avgScore;
+
+    private List<TrialQuestionVO> questionList;
+
+
+    public TrialMarkerVO() {
+    }
+
+    public String getLoginName() {
+        return loginName;
+    }
+
+    public void setLoginName(String loginName) {
+        this.loginName = loginName;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getGroupNumber() {
+        return groupNumber;
+    }
+
+    public void setGroupNumber(Integer groupNumber) {
+        this.groupNumber = groupNumber;
+    }
+
+    public String getGroupTitle() {
+        return groupTitle;
+    }
+
+    public void setGroupTitle(String groupTitle) {
+        this.groupTitle = groupTitle;
+    }
+
+    public Integer getTrialCount() {
+        return trialCount;
+    }
+
+    public void setTrialCount(Integer trialCount) {
+        this.trialCount = trialCount;
+    }
+
+    public Double getAvgScore() {
+        return avgScore;
+    }
+
+    public void setAvgScore(Double avgScore) {
+        this.avgScore = avgScore;
+    }
+
+    public List<TrialQuestionVO> getQuestionList() {
+        return questionList;
+    }
+
+    public void setQuestionList(List<TrialQuestionVO> questionList) {
+        this.questionList = questionList;
+    }
+}

+ 24 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/vo/TrialQuestionVO.java

@@ -0,0 +1,24 @@
+package cn.com.qmth.stmms.admin.vo;
+
+public class TrialQuestionVO {
+
+    private Double avgScore;
+
+    private String scoreList;
+
+    public Double getAvgScore() {
+        return avgScore;
+    }
+
+    public void setAvgScore(Double avgScore) {
+        this.avgScore = avgScore;
+    }
+
+    public String getScoreList() {
+        return scoreList;
+    }
+
+    public void setScoreList(String scoreList) {
+        this.scoreList = scoreList;
+    }
+}

+ 22 - 64
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/trialMarkerList.jsp

@@ -67,71 +67,31 @@
 <table id="contentTable" class="table table-striped table-bordered table-condensed">
     <thead>
     <tr>
-        <th>科目代码</th>
-        <th>分组序号</th>
-        <th>准考证号</th>
-        <th>密号</th>
         <th>评卷员</th>
-        <th>评卷总分</th>
-        <th>给分明细</th>
-        <th>评卷时间</th>
-        <th>操作</th>
+        <th>分组</th>
+        <th>试评卷数</th>
+        <th>平均分</th>
+        <c:forEach items="${questionList}" var="question">
+        <th>${question.mainNumber}-${question.subNumber}明细</th>
+        <th>${question.mainNumber}-${question.subNumber}平均分</th>
+        </c:forEach>
     </tr>
     </thead>
     <tbody>
-    <c:forEach items="${query.result}" var="result">
+    <c:forEach items="${markerList}" var="marker">
         <tr>
-            <td>${result.subjectCode}</td>
-            <td>${result.groupNumber}</td>
-            <td>
-                <c:if test="${web_user.subjectHeader==true && forbiddenInfo==true}">
-                    ***
-                </c:if>
-                <c:if test="${web_user.schoolAdmin==true || forbiddenInfo==false}">
-                    ${result.examNumber}
-                </c:if>
-            </td>
-            <td>${result.secretNumber}</td>
-            <td>${result.markerLoginName}</td>
-            <td>
-                <c:if test="${result.markerScore!=null}">
-                    <c:if test="${result.markerScore==-1}">未选做</c:if>
-                    <c:if test="${result.markerScore!=-1}"><fmt:formatNumber pattern="###.###"
-                                                                             value="${result.markerScore}"/></c:if>
-                </c:if>
-                <c:if test="${result.markerScore==null}">
-                    &nbsp;
-                </c:if>
-            </td>
-            <td>
-                <c:if test="${result.markerScoreList!=null}">
-                    ${result.markerScoreList}
-                </c:if>
-                <c:if test="${result.markerScoreList==null}">
-                    &nbsp;
-                </c:if>
-            </td>
-            <td>
-                <c:if test="${result.markerTime!=null}">
-                    <fmt:formatDate value="${result.markerTime}" pattern="yyyy-MM-dd HH:mm:ss"/>
-                </c:if>
-                <c:if test="${result.markerTime==null}">
-                    &nbsp;
-                </c:if>
-            </td>
-            <td>
-                    <%--  <c:if test="${result.markerTime!=null}">
-                         <a href="##" class="reset-link" data-id="${result.id}">重置</a>
-                     </c:if>
-                             &nbsp; --%>
-                <a href="${ctx}/web/admin/exam/track/trialLibrary?libraryId=${result.id}&subjectCode=${result.subjectCode}"
-                   target="_blank">查看</a>
-            </td>
+            <td>${marker.loginName}</td>
+            <td>${marker.groupNumber}-${marker.groupTitle}</td>
+            <td>${marker.trialCount}</td>
+            <td>${marker.avgScore}</td>
+            <c:forEach items="${marker.questionList}" var="q">
+            <td>${q.scoreLsit}</td>
+            <td>${q.avgScore}</td>
+            </c:forEach>
         </tr>
     </c:forEach>
     </tbody>
 </table>
-<div class="pagination">${query}</div>
 <script type="text/javascript">
     $('#subject-select').change(function () {
         var code = $(this).val();
@@ -184,15 +144,13 @@
         });
     });
 
-    function page(n, s) {
-        $("#pageNumber").val(n);
-        $("#pageSize").val(s);
-        $("#searchForm").submit();
-        return false;
-    }
-
     function goSearch() {
-        $("#pageNumber").val(1);
+        var subjectCode = $('#subject-select').val();
+        var groupNumber = $('#group-select').val();
+        if(subjectCode==''||groupNumber=='') {
+            alert('请选择对应的科目及分组');
+            return false;
+        }
         $("#searchForm").submit();
         return false;
     }