Browse Source

人工确认增加科目和考点查询,整体进度导出修改为按科目

ting.yin 3 years ago
parent
commit
2043e71c6a

+ 6 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/CheckStudentDao.java

@@ -23,4 +23,10 @@ public interface CheckStudentDao extends PagingAndSortingRepository<CheckStudent
 
     long countByExamIdAndSubjectCodeAndChecked(int examId, String subjectCode, boolean checked);
 
+    List<CheckStudent> findByExamIdAndSubjectCodeAndCheckedAndType(int examId, String subjectCode, boolean checked,
+            CheckType type);
+
+    @Query("select distinct c.subjectCode from CheckStudent c where c.examId=?1 and c.checked=?2 and c.type=?3")
+    List<String> findCheckSubjectCodeAndCheckedAndType(int examId, boolean checked, CheckType type);
+
 }

+ 10 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/CheckStudentSearchQuery.java

@@ -15,6 +15,8 @@ public class CheckStudentSearchQuery extends BaseQuery<CheckStudent> {
 
     private String subjectCode;
 
+    private String examSite;
+
     private Boolean checked;
 
     private CheckType type;
@@ -63,4 +65,12 @@ public class CheckStudentSearchQuery extends BaseQuery<CheckStudent> {
         this.type = type;
     }
 
+    public String getExamSite() {
+        return examSite;
+    }
+
+    public void setExamSite(String examSite) {
+        this.examSite = examSite;
+    }
+
 }

+ 6 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/CheckStudentService.java

@@ -10,7 +10,7 @@ public interface CheckStudentService {
 
     CheckStudent save(CheckStudent student);
 
-    List<CheckStudent> findByExamIdAndIsCheckedAndType(int examId, boolean checked, CheckType type);
+    List<CheckStudent> findByExamIdAndCheckedAndType(int examId, boolean checked, CheckType type);
 
     void deleteByStudentId(int examId);
 
@@ -22,4 +22,9 @@ public interface CheckStudentService {
 
     long countByExamIdAndSubjectCodeAndChecked(int examId, String subjectCode, boolean checked);
 
+    List<String> findCheckSubjectCode(int examId);
+
+    List<CheckStudent> findByExamIdAndSubjectCodeAndCheckedAndType(int examId, String subjectCode, boolean checked,
+            CheckType type);
+
 }

+ 12 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/CheckStudentServiceImpl.java

@@ -34,7 +34,7 @@ public class CheckStudentServiceImpl extends BaseQueryService<CheckStudent> impl
     }
 
     @Override
-    public List<CheckStudent> findByExamIdAndIsCheckedAndType(int examId, boolean checked, CheckType type) {
+    public List<CheckStudent> findByExamIdAndCheckedAndType(int examId, boolean checked, CheckType type) {
         return checkStudentDao.findByExamIdAndCheckedAndType(examId, checked, type);
     }
 
@@ -91,4 +91,15 @@ public class CheckStudentServiceImpl extends BaseQueryService<CheckStudent> impl
         return checkStudentDao.countByExamIdAndSubjectCodeAndChecked(examId, subjectCode, checked);
     }
 
+    @Override
+    public List<String> findCheckSubjectCode(int examId) {
+        return checkStudentDao.findCheckSubjectCodeAndCheckedAndType(examId, false, CheckType.MANUAL);
+    }
+
+    @Override
+    public List<CheckStudent> findByExamIdAndSubjectCodeAndCheckedAndType(int examId, String subjectCode,
+            boolean checked, CheckType type) {
+        return checkStudentDao.findByExamIdAndSubjectCodeAndCheckedAndType(examId, subjectCode, checked, type);
+    }
+
 }

+ 5 - 6
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/ProblemHistoryDao.java

@@ -1,16 +1,15 @@
 package cn.com.qmth.stmms.biz.mark.dao;
 
-import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
-import cn.com.qmth.stmms.common.enums.HistoryStatus;
-import org.springframework.data.domain.Pageable;
+import java.util.Date;
+import java.util.List;
+
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
+import cn.com.qmth.stmms.biz.mark.model.ProblemHistory;
+import cn.com.qmth.stmms.common.enums.HistoryStatus;
 
 public interface ProblemHistoryDao extends JpaRepository<ProblemHistory, Integer>,
         JpaSpecificationExecutor<ProblemHistory> {

+ 47 - 12
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/MarkInfoDTO.java

@@ -11,15 +11,26 @@ public class MarkInfoDTO {
     @ExcelField(title = "课程名称", align = 2, sort = 20)
     private String subjectName;
 
-    @ExcelField(title = "任务总量", align = 2, sort = 30)
-    private long totalCount;
+    @ExcelField(title = "上传人数", align = 2, sort = 30)
+    private long uploadCount;
 
-    @ExcelField(title = "剩余数量", align = 2, sort = 40)
-    private long leftCount;
+    @ExcelField(title = "总分", align = 2, sort = 40)
+    private double totalScore;
+
+    @ExcelField(title = "分组总数", align = 2, sort = 50)
+    private long groupCount;
+
+    @ExcelField(title = "评卷进度", align = 2, sort = 60)
+    private String percent;
+
+    @ExcelField(title = "待复核量", align = 2, sort = 70)
+    private long inspectedCount;
 
     public MarkInfoDTO(ExamSubject subject) {
         setSubjectCode(subject.getCode());
         setSubjectName(subject.getName());
+        setTotalScore(subject.getTotalScore());
+        setUploadCount(subject.getUploadCount());
     }
 
     public String getSubjectCode() {
@@ -38,20 +49,44 @@ public class MarkInfoDTO {
         this.subjectName = subjectName;
     }
 
-    public long getLeftCount() {
-        return leftCount;
+    public long getUploadCount() {
+        return uploadCount;
+    }
+
+    public void setUploadCount(long uploadCount) {
+        this.uploadCount = uploadCount;
+    }
+
+    public double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public long getGroupCount() {
+        return groupCount;
+    }
+
+    public void setGroupCount(long groupCount) {
+        this.groupCount = groupCount;
+    }
+
+    public String getPercent() {
+        return percent;
     }
 
-    public void setLeftCount(long leftCount) {
-        this.leftCount = leftCount;
+    public void setPercent(String percent) {
+        this.percent = percent;
     }
 
-    public long getTotalCount() {
-        return totalCount;
+    public long getInspectedCount() {
+        return inspectedCount;
     }
 
-    public void setTotalCount(long totalCount) {
-        this.totalCount = totalCount;
+    public void setInspectedCount(long inspectedCount) {
+        this.inspectedCount = inspectedCount;
     }
 
 }

+ 64 - 14
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/CheckStudentController.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.admin.exam;
 
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.LinkedList;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
@@ -19,13 +20,17 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import cn.com.qmth.stmms.biz.exam.model.CheckStudent;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.query.CheckStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.CheckStudentService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.CheckType;
 import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
 
 @Controller
 @RequestMapping("/admin/exam/check/student")
@@ -44,34 +49,79 @@ public class CheckStudentController extends BaseExamController {
     @RequestMapping
     public String index(Model model, HttpServletRequest request, CheckStudentSearchQuery query) {
         int examId = getSessionExamId(request);
-        List<ExamStudent> studentList = new ArrayList<ExamStudent>();
-        query.setExamId(examId);
-        query.setChecked(false);
-        if (query.getType() == null) {
-            query.setType(CheckType.MANUAL);
+        WebUser wu = RequestUtils.getWebUser(request);
+        List<CheckStudent> list = null;
+        if (StringUtils.isNotBlank(query.getSubjectCode())) {
+            list = checkStudentService.findByExamIdAndSubjectCodeAndCheckedAndType(examId, query.getSubjectCode(),
+                    false, CheckType.MANUAL);
+        } else {
+            list = checkStudentService.findByExamIdAndCheckedAndType(examId, false, CheckType.MANUAL);
         }
-        query = checkStudentService.findByQuery(query);
-        for (CheckStudent c : query.getResult()) {
-            studentList.add(studentService.findById(c.getStudentId()));
+        List<Integer> studentIds = new ArrayList<Integer>();
+        for (CheckStudent c : list) {
+            studentIds.add(c.getStudentId());
         }
+        ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+        sQuery.setExamId(examId);
+        sQuery.setPageNumber(query.getPageNumber());
+        sQuery.setPageSize(query.getPageSize());
+        sQuery.setSubjectCode(query.getSubjectCode());
+        sQuery.setExamSite(query.getExamSite());
+        sQuery.setStudentIds(studentIds);
+        List<ExamStudent> studentList = studentService.findByQuery(sQuery).getResult();
         model.addAttribute("typeList", CheckType.values());
         model.addAttribute("studentList", studentList);
+        model.addAttribute("subjectList", getCheckSubject(examId, wu));
+        query.setTotalCount(sQuery.getTotalCount());
+        query.setTotalPage(sQuery.getTotalPage());
         model.addAttribute("query", query);
         return "modules/exam/checkStudent";
     }
 
+    private List<ExamSubject> getCheckSubject(int examId, WebUser wu) {
+        List<ExamSubject> list = new LinkedList<ExamSubject>();
+        List<String> codes = checkStudentService.findCheckSubjectCode(examId);
+        List<ExamSubject> subjects = getExamSubject(examId, wu);
+        for (ExamSubject examSubject : subjects) {
+            if (codes.contains(examSubject.getCode())) {
+                list.add(examSubject);
+            }
+        }
+        return list;
+    }
+
     @RequestMapping("/getSetting")
     @ResponseBody
-    public JSONObject getSetting(HttpServletRequest request, @RequestParam CheckType checkType) {
+    public JSONObject getSetting(HttpServletRequest request, @RequestParam CheckType checkType,
+            @RequestParam(required = false) String subjectCode, @RequestParam(required = false) String examSite) {
         int examId = getSessionExamId(request);
         JSONObject setting = new JSONObject();
         setting.accumulate("fileServer", fileService.getFileServer());
-        List<Integer> ids = new ArrayList<Integer>();
-        List<CheckStudent> list = checkStudentService.findByExamIdAndIsCheckedAndType(examId, false, checkType);
-        for (CheckStudent student : list) {
-            ids.add(student.getStudentId());
+        List<CheckStudent> list = null;
+        if (StringUtils.isNotBlank(subjectCode)) {
+            list = checkStudentService.findByExamIdAndSubjectCodeAndCheckedAndType(examId, subjectCode, false,
+                    CheckType.MANUAL);
+        } else {
+            list = checkStudentService.findByExamIdAndCheckedAndType(examId, false, CheckType.MANUAL);
+        }
+        List<Integer> studentIds = new ArrayList<Integer>();
+        for (CheckStudent c : list) {
+            studentIds.add(c.getStudentId());
+        }
+        if (StringUtils.isNotBlank(examSite)) {
+            ExamStudentSearchQuery sQuery = new ExamStudentSearchQuery();
+            sQuery.setExamId(examId);
+            sQuery.setPageSize(Integer.MAX_VALUE);
+            sQuery.setSubjectCode(subjectCode);
+            sQuery.setExamSite(examSite);
+            sQuery.setStudentIds(studentIds);
+            List<ExamStudent> studentList = studentService.findByQuery(sQuery).getResult();
+            studentIds = new ArrayList<Integer>();
+            for (ExamStudent examStudent : studentList) {
+                studentIds.add(examStudent.getId());
+            }
         }
-        setting.accumulate("studentIds", ids);
+        setting.accumulate("studentIds", studentIds);
         return setting;
     }
 

+ 18 - 37
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java

@@ -1,11 +1,8 @@
 package cn.com.qmth.stmms.admin.exam;
 
 import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 
 import javax.servlet.http.HttpServletRequest;
@@ -22,7 +19,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 
-import cn.com.qmth.stmms.admin.dto.MarkGroupDTO;
+import cn.com.qmth.stmms.admin.dto.MarkInfoDTO;
 import cn.com.qmth.stmms.admin.dto.MarkerInfoDTO;
 import cn.com.qmth.stmms.admin.vo.SubjectLibraryVO;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
@@ -159,49 +156,33 @@ public class MarkController extends BaseExamController {
             RedirectAttributes redirectAttributes) {
         WebUser wu = RequestUtils.getWebUser(request);
         int examId = getSessionExamId(request);
-        List<MarkGroupDTO> result = new LinkedList<MarkGroupDTO>();
-        List<MarkGroup> list = new ArrayList<MarkGroup>();
+        List<MarkInfoDTO> result = new LinkedList<MarkInfoDTO>();
+        List<ExamSubject> list = subjectService.list(examId);
         if (wu.isSubjectHeader()) {
-            List<ExamSubject> examSubjects = getExamSubject(examId, wu);
-            for (ExamSubject examSubject : examSubjects) {
-                list.addAll(groupService.findByExamAndSubject(examId, examSubject.getCode()));
-            }
-        } else {
-            list.addAll(groupService.findByExam(examId));
+            list = getExamSubject(examId, wu);
         }
-        Map<String, String> subjectPercent = new HashMap<String, String>();
-        for (MarkGroup group : list) {
-            group.setMarkerCount(markerService.countByExamAndSubjectAndGroup(examId, group.getSubjectCode(),
-                    group.getNumber()));
-            group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
-                    group.getSubjectCode(), false, group.getNumber()));
-            MarkGroupDTO dto = new MarkGroupDTO(subjectService.find(examId, group.getSubjectCode()), group);
-            String percent = subjectPercent.get(group.getSubjectCode());
-            if (percent == null) {
-                MarkLibrarySearchQuery mQuery = new MarkLibrarySearchQuery();
-                mQuery.setExamId(examId);
-                mQuery.setSubjectCode(group.getSubjectCode());
-                long libraryCount = libraryService.countByQuery(mQuery);
-                mQuery.addStatus(LibraryStatus.MARKED);
-                mQuery.addStatus(LibraryStatus.ARBITRATED);
-                mQuery.addStatus(LibraryStatus.INSPECTED);
-                long totalMarkedCount = libraryService.countByQuery(mQuery);
-                percent = libraryCount > 0 ? (new DecimalFormat("####.###").format(totalMarkedCount * 100.0
-                        / libraryCount) + "%") : "0%";
-                subjectPercent.put(group.getSubjectCode(), percent);
-            }
-            dto.setPercent(percent);
+        for (ExamSubject subject : list) {
+            MarkInfoDTO dto = new MarkInfoDTO(subject);
             MarkLibrarySearchQuery mQuery = new MarkLibrarySearchQuery();
             mQuery.setExamId(examId);
-            mQuery.setSubjectCode(group.getSubjectCode());
+            mQuery.setSubjectCode(subject.getCode());
+            long libraryCount = libraryService.countByQuery(mQuery);
             mQuery.addStatus(LibraryStatus.MARKED);
-            dto.setInspectedCount(libraryService.countByQuery(mQuery));
+            long inspectedCount = libraryService.countByQuery(mQuery);
+            dto.setInspectedCount(inspectedCount);
+            mQuery.addStatus(LibraryStatus.ARBITRATED);
+            mQuery.addStatus(LibraryStatus.INSPECTED);
+            long totalMarkedCount = libraryService.countByQuery(mQuery);
+            String percent = libraryCount > 0 ? (new DecimalFormat("####.###").format(totalMarkedCount * 100.0
+                    / libraryCount) + "%") : "0%";
+            dto.setPercent(percent);
+            dto.setGroupCount(groupService.countByExamAndSubject(examId, subject.getCode()));
             result.add(dto);
         }
 
         try {
             String fileName = "整体评卷进度.xlsx";
-            new ExportExcel("整体评卷进度", MarkGroupDTO.class).setDataList(result).write(response, fileName).dispose();
+            new ExportExcel("整体评卷进度", MarkInfoDTO.class).setDataList(result).write(response, fileName).dispose();
             return null;
         } catch (Exception e) {
             addMessage(redirectAttributes, "导出整体评卷进度失败!" + e.getMessage());

+ 17 - 2
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/checkStudent.jsp

@@ -24,6 +24,17 @@
 				</c:forEach>
 			</select>
 			&nbsp;
+			<label>科目</label>
+	        <select class="input-large" name="subjectCode" id="subject-select">
+	            <option value="">请选择</option>
+	            <c:forEach items="${subjectList}" var="subject">
+	                <option value="${subject.code}" <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
+	            </c:forEach>
+	        </select>
+	        &nbsp;
+	        <label>考点</label>
+	        <input type="text" name="examSite" id="examSite" value="${query.examSite}" class="input-medium"/>
+	        &nbsp;
 			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
 			&nbsp;
 			<a href="${ctx}/web/admin/exam/check/student/start?type=${query.type.value}" target="_blank" class="btn btn-primary" id="start-button">开始处理</a>
@@ -37,6 +48,7 @@
 				<th>姓名</th>
 				<th>学号</th>
 				<th>科目</th>
+				<th>考点</th>
 				<th>扫描批次</th>
 				<th>上传时间</th>
 			</tr>
@@ -48,6 +60,7 @@
 				<td>${student.name}</td>
 				<td>${student.studentCode}</td>
 				<td>${student.subjectCode}-${student.subjectName}</td>
+				<td>${student.examSite}</td>
 				<td>${student.batchCode}</td>
 				<td><fmt:formatDate value="${student.uploadTime}" pattern="yyyy-MM-dd hh:MM:ss"/></td>
 			</tr>
@@ -58,8 +71,10 @@
 <script type="text/javascript">
 
 $('#start-button').click(function(){
-	var value = $('#type').val();
-	$('#start-button').attr('href','${ctx}/web/admin/exam/check/student/start?checkType='+value);
+	var checkType = $('#type').val();
+	var subjectCode = $('#subject-select').val();
+	var examSite = $('#examSite').val();
+	$('#start-button').attr('href','${ctx}/web/admin/exam/check/student/start?checkType='+checkType+'&subjectCode='+subjectCode+'&examSite='+examSite);
 });
 
 function page(n,s){