deason před 9 měsíci
rodič
revize
e9ff4fa9c5
19 změnil soubory, kde provedl 599 přidání a 635 odebrání
  1. 5 5
      src/main/java/cn/com/qmth/scancentral/controller/admin/ExamController.java
  2. 5 2
      src/main/java/cn/com/qmth/scancentral/dao/OmrTaskDao.java
  3. 23 0
      src/main/java/cn/com/qmth/scancentral/enums/OP.java
  4. 2 2
      src/main/java/cn/com/qmth/scancentral/service/ExamService.java
  5. 3 0
      src/main/java/cn/com/qmth/scancentral/service/OmrTaskService.java
  6. 15 41
      src/main/java/cn/com/qmth/scancentral/service/StudentService.java
  7. 60 78
      src/main/java/cn/com/qmth/scancentral/service/impl/ExamServiceImpl.java
  8. 22 16
      src/main/java/cn/com/qmth/scancentral/service/impl/OmrTaskServiceImpl.java
  9. 71 131
      src/main/java/cn/com/qmth/scancentral/service/impl/StudentServiceImpl.java
  10. 21 0
      src/main/java/cn/com/qmth/scancentral/util/MathUtil.java
  11. 40 0
      src/main/java/cn/com/qmth/scancentral/vo/examinfo/AbsentCheck.java
  12. 28 70
      src/main/java/cn/com/qmth/scancentral/vo/examinfo/AnswerScan.java
  13. 63 5
      src/main/java/cn/com/qmth/scancentral/vo/examinfo/AssignedCheck.java
  14. 14 59
      src/main/java/cn/com/qmth/scancentral/vo/examinfo/ExamData.java
  15. 0 195
      src/main/java/cn/com/qmth/scancentral/vo/examinfo/ExamInfoVo.java
  16. 83 0
      src/main/java/cn/com/qmth/scancentral/vo/examinfo/ExamOverview.java
  17. 53 15
      src/main/java/cn/com/qmth/scancentral/vo/examinfo/OmrTask.java
  18. 62 0
      src/main/java/cn/com/qmth/scancentral/vo/omr/OmrTaskOverview.java
  19. 29 16
      src/main/resources/mapper/OmrTaskMapper.xml

+ 5 - 5
src/main/java/cn/com/qmth/scancentral/controller/admin/ExamController.java

@@ -14,7 +14,7 @@ import cn.com.qmth.scancentral.vo.ExamUploadVo;
 import cn.com.qmth.scancentral.vo.ExamVo;
 import cn.com.qmth.scancentral.vo.SubjectConfigVo;
 import cn.com.qmth.scancentral.vo.examinfo.ExamEdit;
-import cn.com.qmth.scancentral.vo.examinfo.ExamInfoVo;
+import cn.com.qmth.scancentral.vo.examinfo.ExamOverview;
 import cn.com.qmth.scancentral.vo.examinfo.ExamQuery;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.constant.ApiConstant;
@@ -47,11 +47,11 @@ public class ExamController extends BaseController {
     @Autowired
     private SubjectService subjectService;
 
-    @ApiOperation(value = "获取考试详情")
-    @RequestMapping(value = "/info", method = RequestMethod.POST)
-    public ExamInfoVo info(@RequestParam Long id) {
+    @ApiOperation(value = "考试概览数据")
+    @RequestMapping(value = "/overview", method = RequestMethod.POST)
+    public ExamOverview overview(@RequestParam Long examId) {
         User user = getAccessUser();
-        return examService.getExamInfoVo(id, user);
+        return examService.getExamOverview(examId, user);
     }
 
     @ApiOperation(value = "获取考试列表")

+ 5 - 2
src/main/java/cn/com/qmth/scancentral/dao/OmrTaskDao.java

@@ -2,6 +2,7 @@ package cn.com.qmth.scancentral.dao;
 
 import cn.com.qmth.scancentral.entity.OmrTaskEntity;
 import cn.com.qmth.scancentral.enums.TaskStatus;
+import cn.com.qmth.scancentral.vo.omr.OmrTaskOverview;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -10,7 +11,9 @@ import java.util.List;
 public interface OmrTaskDao extends BaseMapper<OmrTaskEntity> {
 
     List<OmrTaskEntity> findUnMarked(@Param(value = "examId") Long examId,
-            @Param(value = "startNumber") int startNumber, @Param(value = "pageSize") int pageSize,
-            @Param(value = "status") TaskStatus status);
+                                     @Param(value = "startNumber") int startNumber, @Param(value = "pageSize") int pageSize,
+                                     @Param(value = "status") TaskStatus status);
+
+    OmrTaskOverview countByExamIdAndFixed(@Param(value = "examId") Long examId, @Param(value = "fixed") Boolean fixed);
 
 }

+ 23 - 0
src/main/java/cn/com/qmth/scancentral/enums/OP.java

@@ -0,0 +1,23 @@
+package cn.com.qmth.scancentral.enums;
+
+public enum OP {
+
+    /* = */
+    EQ,
+
+    /* != */
+    NE,
+
+    /* > */
+    GT,
+
+    /* >= */
+    GE,
+
+    /* < */
+    LT,
+
+    /* <= */
+    LE
+
+}

+ 2 - 2
src/main/java/cn/com/qmth/scancentral/service/ExamService.java

@@ -8,7 +8,7 @@ import cn.com.qmth.scancentral.vo.ExamConfigVo;
 import cn.com.qmth.scancentral.vo.ExamVo;
 import cn.com.qmth.scancentral.vo.checkimage.RatioVo;
 import cn.com.qmth.scancentral.vo.examinfo.ExamEdit;
-import cn.com.qmth.scancentral.vo.examinfo.ExamInfoVo;
+import cn.com.qmth.scancentral.vo.examinfo.ExamOverview;
 import cn.com.qmth.scancentral.vo.examinfo.ExamQuery;
 import cn.com.qmth.scancentral.vo.scanexaminfo.ScanExamInfoVo;
 import cn.com.qmth.scancentral.vo.scanexamlist.ScanExamListVo;
@@ -25,7 +25,7 @@ public interface ExamService extends IService<ExamEntity> {
 
     Long save(ExamEdit exam);
 
-    ExamInfoVo getExamInfoVo(Long id, User accessUser);
+    ExamOverview getExamOverview(Long id, User accessUser);
 
     List<ScanExamListVo> getScanExamList();
 

+ 3 - 0
src/main/java/cn/com/qmth/scancentral/service/OmrTaskService.java

@@ -4,6 +4,7 @@ import cn.com.qmth.scancentral.bean.User;
 import cn.com.qmth.scancentral.entity.OmrGroupEntity;
 import cn.com.qmth.scancentral.entity.OmrTaskEntity;
 import cn.com.qmth.scancentral.enums.TaskStatus;
+import cn.com.qmth.scancentral.vo.omr.OmrTaskOverview;
 import cn.com.qmth.scancentral.vo.task.TaskResultVo;
 import cn.com.qmth.scancentral.vo.task.TaskSaveVo;
 import cn.com.qmth.scancentral.vo.task.TaskStatusVo;
@@ -60,4 +61,6 @@ public interface OmrTaskService extends IService<OmrTaskEntity> {
 
     TaskVo getArbitrateHistory(Long examId, Long taskId, String account, Boolean next);
 
+    OmrTaskOverview countByExamIdAndFixed(Long examId, Boolean fixed);
+
 }

+ 15 - 41
src/main/java/cn/com/qmth/scancentral/service/StudentService.java

@@ -1,49 +1,12 @@
 package cn.com.qmth.scancentral.service;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collection;
-import java.util.List;
-
-import org.springframework.web.multipart.MultipartFile;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.boot.core.collection.PageResult;
-
-import cn.com.qmth.scancentral.bean.AbsentQueryDomain;
-import cn.com.qmth.scancentral.bean.AnswerDeleteDomain;
-import cn.com.qmth.scancentral.bean.AnswerQueryDomain;
-import cn.com.qmth.scancentral.bean.AssignedQueryDomain;
-import cn.com.qmth.scancentral.bean.ImportCetAbsentDomain;
-import cn.com.qmth.scancentral.bean.ImportStudentDomain;
-import cn.com.qmth.scancentral.bean.PageDeleteDomain;
-import cn.com.qmth.scancentral.bean.User;
+import cn.com.qmth.scancentral.bean.*;
 import cn.com.qmth.scancentral.bean.omredit.OmrEditDomain;
 import cn.com.qmth.scancentral.bean.refix.AnswerRefixDomain;
 import cn.com.qmth.scancentral.entity.StudentEntity;
 import cn.com.qmth.scancentral.entity.StudentPaperEntity;
-import cn.com.qmth.scancentral.enums.ExamStatusCheckMode;
-import cn.com.qmth.scancentral.enums.GroupType;
-import cn.com.qmth.scancentral.enums.ScanStatus;
-import cn.com.qmth.scancentral.enums.UploadStatus;
-import cn.com.qmth.scancentral.vo.AbsentInfoVo;
-import cn.com.qmth.scancentral.vo.AbsentManualImportVo;
-import cn.com.qmth.scancentral.vo.AbsentQueryVo;
-import cn.com.qmth.scancentral.vo.AnswerDeleteVo;
-import cn.com.qmth.scancentral.vo.AnswerExportK12Vo;
-import cn.com.qmth.scancentral.vo.AnswerExportVo;
-import cn.com.qmth.scancentral.vo.AnswerRefixVo;
-import cn.com.qmth.scancentral.vo.CampusVo;
-import cn.com.qmth.scancentral.vo.ExamSiteVo;
-import cn.com.qmth.scancentral.vo.ExportCetMarkingQueryVo;
-import cn.com.qmth.scancentral.vo.ExportCetVo;
-import cn.com.qmth.scancentral.vo.ImportResult;
-import cn.com.qmth.scancentral.vo.ImportStudentQueryVo;
-import cn.com.qmth.scancentral.vo.ImportStudentVo;
-import cn.com.qmth.scancentral.vo.PaperDeleteVo;
-import cn.com.qmth.scancentral.vo.ScanAnswerInfoVo;
-import cn.com.qmth.scancentral.vo.StudentUploadVo;
-import cn.com.qmth.scancentral.vo.UpdateTimeVo;
+import cn.com.qmth.scancentral.enums.*;
+import cn.com.qmth.scancentral.vo.*;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryVo;
 import cn.com.qmth.scancentral.vo.assginedcheck.AssginedTaskResult;
 import cn.com.qmth.scancentral.vo.assginedcheck.AssignedCheckExport;
@@ -52,6 +15,14 @@ import cn.com.qmth.scancentral.vo.student.StudentAnswerVo;
 import cn.com.qmth.scancentral.vo.student.StudentQuery;
 import cn.com.qmth.scancentral.vo.student.StudentVo;
 import cn.com.qmth.scancentral.vo.task.TaskStatusVo;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.boot.core.collection.PageResult;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.List;
 
 public interface StudentService extends IService<StudentEntity> {
 
@@ -165,7 +136,9 @@ public interface StudentService extends IService<StudentEntity> {
 
     ImportResult importExamStatus(Long examId, ExamStatusCheckMode mode, InputStream inputStream) throws IOException;
 
-    int getCountByExamAndAssignedCheckCount(Long examId, int assignedCheckCount);
+    int getCountByExamAndAssignedCheckCount(Long examId, int assignedCheckCount, OP op);
+
+    int countByExamIdAndExamStatus(Long examId, ExamStatus examStatus);
 
     void updateAssignedCheckCount(Long id, boolean deleteHistory);
 
@@ -188,4 +161,5 @@ public interface StudentService extends IService<StudentEntity> {
     AnswerQueryVo getAssignedCheckTask(Long examId, String account);
 
     StudentAnswerVo studentAnswer(Long batchId, Long studentId);
+
 }

+ 60 - 78
src/main/java/cn/com/qmth/scancentral/service/impl/ExamServiceImpl.java

@@ -6,17 +6,18 @@ import cn.com.qmth.scancentral.bean.User;
 import cn.com.qmth.scancentral.dao.ExamDao;
 import cn.com.qmth.scancentral.entity.ExamEntity;
 import cn.com.qmth.scancentral.entity.ExamSummaryEntity;
-import cn.com.qmth.scancentral.entity.SystemConfigEntity;
 import cn.com.qmth.scancentral.enums.*;
 import cn.com.qmth.scancentral.exception.ParameterExceptions;
 import cn.com.qmth.scancentral.service.*;
+import cn.com.qmth.scancentral.util.MathUtil;
 import cn.com.qmth.scancentral.util.PageUtil;
 import cn.com.qmth.scancentral.vo.ExamConfigVo;
 import cn.com.qmth.scancentral.vo.ExamVo;
 import cn.com.qmth.scancentral.vo.checkimage.RatioVo;
 import cn.com.qmth.scancentral.vo.examinfo.ExamEdit;
-import cn.com.qmth.scancentral.vo.examinfo.ExamInfoVo;
+import cn.com.qmth.scancentral.vo.examinfo.ExamOverview;
 import cn.com.qmth.scancentral.vo.examinfo.ExamQuery;
+import cn.com.qmth.scancentral.vo.omr.OmrTaskOverview;
 import cn.com.qmth.scancentral.vo.scanexaminfo.ScanExamInfoVo;
 import cn.com.qmth.scancentral.vo.scanexamlist.ScanExamListQuery;
 import cn.com.qmth.scancentral.vo.scanexamlist.ScanExamListVo;
@@ -145,91 +146,72 @@ public class ExamServiceImpl extends ServiceImpl<ExamDao, ExamEntity> implements
     }
 
     @Override
-    public ExamInfoVo getExamInfoVo(Long examId, User accessUser) {
+    public ExamOverview getExamOverview(Long examId, User accessUser) {
         ExamEntity exam = this.getById(examId);
         if (exam == null) {
             throw ParameterExceptions.EXAM_NOT_FOUND;
         }
 
-        // ScanAnswerInfoVo info = studentService.scanAnswerInfo(examId);
-        ExamInfoVo vo = new ExamInfoVo();
-        ExamSummaryEntity es = examSummaryService.find(examId);
+        ExamOverview vo = new ExamOverview();
         vo.setId(examId);
         vo.setName(exam.getName());
-        vo.getExamConfig().setAllowUnexistPaper(exam.getAllowUnexistPaper());
-        vo.getExamConfig().setAnswerFrontCardType(exam.getAnswerFrontCardType());
-        vo.getExamConfig().setImageTransferMode(exam.getImageTransferMode());
-        vo.getExamConfig().setEnableSinglePageAnswer(exam.getEnableSinglePageAnswer());
-        vo.getExamConfig().setMode(exam.getMode());
-        vo.getExamConfig().setScanByPackage(exam.getScanByPackage());
-        vo.getExamConfig().setEnableSyncVerify(exam.getEnableSyncVerify());
-        vo.getExamConfig().setPaperTypeBarcodeContent(exam.getPaperTypeBarcodeContent());
-        vo.getExamConfig().setAbsentBarcodeContent(exam.getAbsentBarcodeContent());
 
-        vo.setSubjectConfig(subjectService.listConfigByExamId(examId));
-        vo.getUpload().setEnable(exam.getEnableUpload());
-        vo.getUpload().setProgress(es.getUploadProgress());
-
-        vo.getExamData().setAnswerCard(answerCardService.getCountByExam(examId));
-        vo.getExamData().setPackageCard(packageCardService.getCountByExam(examId));
-        vo.getExamData().setProgress(0d);
-        vo.getExamData().setStudentCount(es.getStudentCount());
-        vo.getExamData().setSubjectCount(es.getSubjectCount());
-        vo.getExamData().setSynching(concurrentService.isLocked(LockType.EXAM_SYNC + "-" + examId));
-        vo.getExamData().setUpdateTime(exam.getDataSyncTime());
-
-        SystemConfigEntity config = systemConfigService.find();
-        boolean enableLogin = true;
-        if (config != null && config.getScannerEnableLogin() != null) {
-            enableLogin = config.getScannerEnableLogin();
-        }
-        vo.getScanner().setEnableLogin(enableLogin);
-        vo.getScanner().setOnlineCount(sessionService.getOnlineScannerCount());
-        vo.getScanner().setPassword(config == null ? null : config.getScannerPassword());
-
-        vo.getAnswerScan().setAbsentSuspectCount(es.getAnswerAbsentSuspectCount());
-        vo.getAnswerScan().setAssignedCount(es.getAnswerAssignedCount());
-        vo.getAnswerScan().setOmrAbsentCount(es.getAnswerOmrAbsentCount());
-        vo.getAnswerScan().setBatchCount(es.getAnswerBatchCount());
-        vo.getAnswerScan().setIncompleteCount(es.getAnswerIncompleteCount());
-        vo.getAnswerScan().setManualAbsentCount(es.getAnswerManualAbsentCount());
-        vo.getAnswerScan().setScannedCount(es.getAnswerScannedCount());
-        vo.getAnswerScan().setTotalCount(es.getStudentCount());
-        vo.getAnswerScan().setUnexistCount(es.getAnswerUnexistCount());
-        vo.getAnswerScan().setMismatchCount(es.getAnswerMismatchCount());
-        vo.getAnswerScan().setStudentAnswerCount(es.getStudentAnswerCount());
+        ExamSummaryEntity summary = examSummaryService.find(examId);
+        vo.getBasic().setStudentCount(summary.getStudentCount());
+        vo.getBasic().setSubjectCount(summary.getSubjectCount());
+        vo.getBasic().setCardCount(answerCardService.getCountByExam(examId));
+
+        int scannedTotalCount = summary.getAnswerScannedCount() + summary.getAnswerUnexistCount();
+        double scannedRate = MathUtil.percentage(summary.getAnswerScannedCount(), scannedTotalCount);
+        vo.getScan().setScannedRate(scannedRate);
+        vo.getScan().setScannedCount(summary.getAnswerScannedCount());
+        vo.getScan().setUnexistCount(summary.getAnswerUnexistCount());
+
+        int imageCheckCount = batchService.getCheckCountByExamId(examId, CheckStatus.FINISH, accessUser);
+        int imageCheckTodoCount = batchService.getCheckCountByExamId(examId, CheckStatus.WAITING, accessUser);
+        int imageCheckTotalCount = imageCheckCount + imageCheckTodoCount;
+        double imageCheckRate = MathUtil.percentage(imageCheckCount, imageCheckTotalCount);
+        vo.getScan().setImageCheckRate(imageCheckRate);
+        vo.getScan().setImageCheckCount(imageCheckCount);
+        vo.getScan().setImageCheckTodoCount(imageCheckTodoCount);
+
+        int auditorTodoCount = studentService.getCountByExamAndAssignedCheckCount(examId, 0, OP.EQ);
+        int auditorFinishCount = studentService.getCountByExamAndAssignedCheckCount(examId, 0, OP.GT);
+        int adminTodoCount = studentService.getCountByExamAndAssignedCheckCount(examId, 1, OP.EQ);
+        int adminFinishCount = studentService.getCountByExamAndAssignedCheckCount(examId, 2, OP.GE);
+        int auditorTotalCount = auditorTodoCount + auditorFinishCount;
+        double auditorFinishRate = MathUtil.percentage(auditorFinishCount, auditorTotalCount);
+        int adminTotalCount = adminTodoCount + adminFinishCount;
+        double adminFinishRate = MathUtil.percentage(adminFinishCount, adminTotalCount);
+        vo.getAssignedCheck().setAuditorTodoCount(auditorTodoCount);
+        vo.getAssignedCheck().setAuditorFinishCount(auditorFinishCount);
+        vo.getAssignedCheck().setAuditorFinishRate(auditorFinishRate);
+        vo.getAssignedCheck().setAdminTodoCount(adminTodoCount);
+        vo.getAssignedCheck().setAdminFinishCount(adminFinishCount);
+        vo.getAssignedCheck().setAdminFinishRate(adminFinishRate);
+
+        OmrTaskOverview suspectOverview = omrTaskService.countByExamIdAndFixed(examId, true);
+        OmrTaskOverview customizeOverview = omrTaskService.countByExamIdAndFixed(examId, false);
+        int suspectFinishCount = suspectOverview.getProcessedCount() + suspectOverview.getArbitrateCount();
+        int suspectTodoCount = suspectOverview.getWaitingCount() + suspectOverview.getWaitArbitrateCount();
+        double suspectFinishRate = MathUtil.percentage(suspectFinishCount, suspectOverview.getTotalCount());
+        int customizeFinishCount = customizeOverview.getProcessedCount() + customizeOverview.getArbitrateCount();
+        int customizeTodoCount = customizeOverview.getWaitingCount() + customizeOverview.getWaitArbitrateCount();
+        double customizeFinishRate = MathUtil.percentage(customizeFinishCount, customizeOverview.getTotalCount());
+        vo.getOmr().setSuspectFinishCount(suspectFinishCount);
+        vo.getOmr().setSuspectTodoCount(suspectTodoCount);
+        vo.getOmr().setSuspectFinishRate(suspectFinishRate);
+        vo.getOmr().setCustomizeFinishCount(customizeFinishCount);
+        vo.getOmr().setCustomizeTodoCount(customizeTodoCount);
+        vo.getOmr().setCustomizeFinishRate(customizeFinishRate);
+
+        int absentCount = studentService.countByExamIdAndExamStatus(examId, ExamStatus.ABSENT);
+        int okCount = studentService.countByExamIdAndExamStatus(examId, ExamStatus.OK);
+        int todoCount = studentService.countByExamIdAndExamStatus(examId, ExamStatus.UNCHECK);
+        vo.getAbsentCheck().setAbsentCount(absentCount);
+        vo.getAbsentCheck().setOkCount(okCount);
+        vo.getAbsentCheck().setTodoCount(todoCount);
 
-        vo.getPackageScan().setScannedCount(es.getPackageScannedCount());
-        vo.getPackageScan().setTotalCount(es.getPackageTotalCount());
-
-        vo.getVerifyTask().setTodoCount(batchService.getVerifyCount(examId));
-        int omrTaskCount = omrTaskService.getCountByExam(examId);
-        int omrTaskTodoCount = omrTaskService.getCountByExamAndStatus(examId, TaskStatus.WAITING);
-        vo.getOmrTask().setTotalCount(omrTaskCount);
-        vo.getOmrTask().setTodoCount(omrTaskTodoCount >= omrTaskCount ? omrTaskCount : omrTaskTodoCount);
-        vo.getOmrTask().setUnarbitrateCount(omrTaskService.getCountByExamAndStatus(examId, TaskStatus.WAIT_ARBITRATE));
-
-        vo.getPackageTask().setTodoCount(
-                packageTaskService.getCountByExamAndStatus(examId, TaskStatus.WAITING, TaskStatus.WAIT_ARBITRATE));
-        vo.getPackageTask().setTotalCount(packageTaskService.getCountByExam(examId));
-
-        vo.getImageCheckTask().setCheckRatio(exam.getImageCheckRatio());
-        vo.getImageCheckTask()
-                .setFinishCount(batchService.getCheckCountByExamId(examId, CheckStatus.FINISH, accessUser));
-        vo.getImageCheckTask()
-                .setTodoCount(batchService.getCheckCountByExamId(examId, CheckStatus.WAITING, accessUser));
-
-        vo.getAuditor().setOnlineCount(sessionService.getOnlineAuditorCount());
-        vo.getAuditor().setUserCount(userService.countByRole(Role.AUDITOR));
-
-        vo.getExamStatusCheck().setExamNumberFillCount(exam.getExamNumberFillCount());
-
-        if (accessUser.getRole().equals(Role.AUDITOR)) {
-            vo.getAssignedCheck().setTodoCount(studentService.getCountByExamAndAssignedCheckCount(examId, 0));
-        }
-        if (accessUser.getRole().equals(Role.SCHOOL_ADMIN) || accessUser.getRole().equals(Role.SCAN_ADMIN)) {
-            vo.getAssignedCheck().setTodoCount(studentService.getCountByExamAndAssignedCheckCount(examId, 1));
-        }
         return vo;
     }
 

+ 22 - 16
src/main/java/cn/com/qmth/scancentral/service/impl/OmrTaskServiceImpl.java

@@ -13,6 +13,7 @@ import cn.com.qmth.scancentral.model.OmrTaskPage;
 import cn.com.qmth.scancentral.service.*;
 import cn.com.qmth.scancentral.support.TaskLock;
 import cn.com.qmth.scancentral.support.TaskLockUtil;
+import cn.com.qmth.scancentral.vo.omr.OmrTaskOverview;
 import cn.com.qmth.scancentral.vo.paperstructureinfo.PaperStructure;
 import cn.com.qmth.scancentral.vo.task.*;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -321,7 +322,7 @@ public class OmrTaskServiceImpl extends ServiceImpl<OmrTaskDao, OmrTaskEntity> i
                         if ((!pageEntity.getPaperType().getResult().contains(OMR_SUSPECT)
                                 && pageEntity.getPaperType().getResult().length() > 2)
                                 || (pageEntity.getPaperType().getResult().contains(OMR_SUSPECT)
-                                        && pageEntity.getPaperType().getResult().length() > 1)) {
+                                && pageEntity.getPaperType().getResult().length() > 1)) {
                             OmrTaskItem item = new OmrTaskItem();
                             item.setField(OmrField.PAPER_TYPE);
                             item.setOmrResult(pageEntity.getPaperType().getResult());
@@ -608,21 +609,21 @@ public class OmrTaskServiceImpl extends ServiceImpl<OmrTaskDao, OmrTaskEntity> i
                 for (OmrTaskItem item : page.getItems()) {
                     Object content = null;
                     switch (item.getField()) {
-                    case ABSENT:
-                        content = pageVo.getAbsent();
-                        break;
-                    case BREACH:
-                        content = pageVo.getBreach();
-                        break;
-                    case PAPER_TYPE:
-                        content = pageVo.getPaperType();
-                        break;
-                    case QUESTION:
-                        content = pageVo.getQuestion() != null ? pageVo.getQuestion().get(item.getIndex()) : null;
-                        break;
-                    case SELECTIVE:
-                        content = pageVo.getSelective() != null ? pageVo.getSelective().get(item.getIndex()) : null;
-                        break;
+                        case ABSENT:
+                            content = pageVo.getAbsent();
+                            break;
+                        case BREACH:
+                            content = pageVo.getBreach();
+                            break;
+                        case PAPER_TYPE:
+                            content = pageVo.getPaperType();
+                            break;
+                        case QUESTION:
+                            content = pageVo.getQuestion() != null ? pageVo.getQuestion().get(item.getIndex()) : null;
+                            break;
+                        case SELECTIVE:
+                            content = pageVo.getSelective() != null ? pageVo.getSelective().get(item.getIndex()) : null;
+                            break;
                     }
                     if (content != null) {
                         item.setArbitrateResult(content.toString());
@@ -878,4 +879,9 @@ public class OmrTaskServiceImpl extends ServiceImpl<OmrTaskDao, OmrTaskEntity> i
         return getHistory(examId, taskId, account, next, true);
     }
 
+    @Override
+    public OmrTaskOverview countByExamIdAndFixed(Long examId, Boolean fixed) {
+        return baseMapper.countByExamIdAndFixed(examId, fixed);
+    }
+
 }

+ 71 - 131
src/main/java/cn/com/qmth/scancentral/service/impl/StudentServiceImpl.java

@@ -1,57 +1,6 @@
 package cn.com.qmth.scancentral.service.impl;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import javax.validation.constraints.NotNull;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.boot.core.collection.PageResult;
-import com.qmth.boot.core.concurrent.service.ConcurrentService;
-import com.qmth.boot.core.exception.ParameterException;
-import com.qmth.boot.core.exception.StatusException;
-import com.qmth.boot.core.retrofit.utils.SignatureInfo;
-import com.qmth.boot.tools.excel.ExcelReader;
-import com.qmth.boot.tools.excel.enums.ExcelType;
-import com.qmth.boot.tools.io.IOUtils;
-import com.qmth.boot.tools.signature.SignatureType;
-
-import cn.com.qmth.scancentral.bean.AbsentQueryDomain;
-import cn.com.qmth.scancentral.bean.AnswerDeleteDomain;
-import cn.com.qmth.scancentral.bean.AnswerQueryDomain;
-import cn.com.qmth.scancentral.bean.AssignedQueryDomain;
-import cn.com.qmth.scancentral.bean.ImportCetAbsentDomain;
-import cn.com.qmth.scancentral.bean.ImportStudentDomain;
-import cn.com.qmth.scancentral.bean.PageDeleteDomain;
-import cn.com.qmth.scancentral.bean.SchoolSession;
-import cn.com.qmth.scancentral.bean.User;
+import cn.com.qmth.scancentral.bean.*;
 import cn.com.qmth.scancentral.bean.answersave.ArrayResult;
 import cn.com.qmth.scancentral.bean.answersave.StringResult;
 import cn.com.qmth.scancentral.bean.omredit.OmrEditDomain;
@@ -61,67 +10,18 @@ import cn.com.qmth.scancentral.bean.refix.PageRefixDomain;
 import cn.com.qmth.scancentral.bean.refix.PaperRefixDomain;
 import cn.com.qmth.scancentral.config.SysProperty;
 import cn.com.qmth.scancentral.dao.StudentDao;
-import cn.com.qmth.scancentral.entity.AnswerCardEntity;
-import cn.com.qmth.scancentral.entity.ExamEntity;
-import cn.com.qmth.scancentral.entity.OmrGroupEntity;
-import cn.com.qmth.scancentral.entity.PaperEntity;
-import cn.com.qmth.scancentral.entity.PaperPageEntity;
-import cn.com.qmth.scancentral.entity.QuestionEntity;
-import cn.com.qmth.scancentral.entity.StudentEntity;
-import cn.com.qmth.scancentral.entity.StudentPaperEntity;
-import cn.com.qmth.scancentral.entity.SubjectEntity;
-import cn.com.qmth.scancentral.entity.UserEntity;
-import cn.com.qmth.scancentral.enums.ExamMode;
-import cn.com.qmth.scancentral.enums.ExamStatus;
-import cn.com.qmth.scancentral.enums.ExamStatusCheckMode;
-import cn.com.qmth.scancentral.enums.GroupType;
-import cn.com.qmth.scancentral.enums.LockType;
-import cn.com.qmth.scancentral.enums.OmrType;
-import cn.com.qmth.scancentral.enums.Role;
-import cn.com.qmth.scancentral.enums.ScanStatus;
-import cn.com.qmth.scancentral.enums.UploadStatus;
+import cn.com.qmth.scancentral.entity.*;
+import cn.com.qmth.scancentral.enums.*;
 import cn.com.qmth.scancentral.exception.NotFoundExceptions;
 import cn.com.qmth.scancentral.exception.ParameterExceptions;
 import cn.com.qmth.scancentral.model.ManualAbsentImportDTO;
-import cn.com.qmth.scancentral.service.AnswerCardService;
-import cn.com.qmth.scancentral.service.AnswerCardSubjectService;
-import cn.com.qmth.scancentral.service.AssignedCheckHistoryService;
-import cn.com.qmth.scancentral.service.BatchService;
-import cn.com.qmth.scancentral.service.ExamService;
-import cn.com.qmth.scancentral.service.OmrGroupService;
-import cn.com.qmth.scancentral.service.OmrTaskService;
-import cn.com.qmth.scancentral.service.PaperPageService;
-import cn.com.qmth.scancentral.service.PaperService;
-import cn.com.qmth.scancentral.service.QuestionService;
-import cn.com.qmth.scancentral.service.SessionService;
-import cn.com.qmth.scancentral.service.StudentPaperService;
-import cn.com.qmth.scancentral.service.StudentService;
-import cn.com.qmth.scancentral.service.SubjectService;
-import cn.com.qmth.scancentral.service.ToolExportService;
-import cn.com.qmth.scancentral.service.UserService;
+import cn.com.qmth.scancentral.service.*;
 import cn.com.qmth.scancentral.support.TaskLock;
 import cn.com.qmth.scancentral.support.TaskLockUtil;
 import cn.com.qmth.scancentral.util.BatchGetDataUtil;
 import cn.com.qmth.scancentral.util.BatchSetDataUtil;
 import cn.com.qmth.scancentral.util.PageUtil;
-import cn.com.qmth.scancentral.vo.AbsentInfoVo;
-import cn.com.qmth.scancentral.vo.AbsentManualImportVo;
-import cn.com.qmth.scancentral.vo.AbsentQueryVo;
-import cn.com.qmth.scancentral.vo.AnswerDeleteVo;
-import cn.com.qmth.scancentral.vo.AnswerExportK12Vo;
-import cn.com.qmth.scancentral.vo.AnswerExportVo;
-import cn.com.qmth.scancentral.vo.AnswerRefixVo;
-import cn.com.qmth.scancentral.vo.CampusVo;
-import cn.com.qmth.scancentral.vo.ExamSiteVo;
-import cn.com.qmth.scancentral.vo.ExportCetMarkingQueryVo;
-import cn.com.qmth.scancentral.vo.ExportCetVo;
-import cn.com.qmth.scancentral.vo.ImportResult;
-import cn.com.qmth.scancentral.vo.ImportStudentQueryVo;
-import cn.com.qmth.scancentral.vo.ImportStudentVo;
-import cn.com.qmth.scancentral.vo.PaperDeleteVo;
-import cn.com.qmth.scancentral.vo.ScanAnswerInfoVo;
-import cn.com.qmth.scancentral.vo.StudentUploadVo;
-import cn.com.qmth.scancentral.vo.UpdateTimeVo;
+import cn.com.qmth.scancentral.vo.*;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerPageVo;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerPaperVo;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryVo;
@@ -136,6 +36,36 @@ import cn.com.qmth.scancentral.vo.student.StudentAnswerVo;
 import cn.com.qmth.scancentral.vo.student.StudentQuery;
 import cn.com.qmth.scancentral.vo.student.StudentVo;
 import cn.com.qmth.scancentral.vo.task.TaskStatusVo;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.core.collection.PageResult;
+import com.qmth.boot.core.concurrent.service.ConcurrentService;
+import com.qmth.boot.core.exception.ParameterException;
+import com.qmth.boot.core.exception.StatusException;
+import com.qmth.boot.core.retrofit.utils.SignatureInfo;
+import com.qmth.boot.tools.excel.ExcelReader;
+import com.qmth.boot.tools.excel.enums.ExcelType;
+import com.qmth.boot.tools.io.IOUtils;
+import com.qmth.boot.tools.signature.SignatureType;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.constraints.NotNull;
+import java.io.*;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Service
 public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> implements StudentService {
@@ -203,7 +133,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     @Transactional
     // @Lockable(name = LockType.STUDENT, key = "#id")
     public void updateStudentAndPaper(@NotNull User user, @NotNull Long id,
-            @NotNull List<StudentPaperEntity> studentPaperList) {
+                                      @NotNull List<StudentPaperEntity> studentPaperList) {
         for (StudentPaperEntity studentPaper : studentPaperList) {
             studentPaper.setStudentId(id);
         }
@@ -741,7 +671,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     @Transactional
     @Override
     public void updateUploadStatus(@NotNull Long id, @NotNull UploadStatus fileUploadStatus,
-            @NotNull UploadStatus dataUploadStatus) {
+                                   @NotNull UploadStatus dataUploadStatus) {
         LambdaUpdateWrapper<StudentEntity> lw = new LambdaUpdateWrapper<>();
         lw.set(StudentEntity::getDataUploadStatus, dataUploadStatus);
         lw.set(StudentEntity::getFileUploadStatus, fileUploadStatus);
@@ -1212,8 +1142,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private void disposeStudent(ExportCetVo student, ExamEntity exam, List<PaperPageCetVo> pages,
-            List<PaperCetVo> papers, String imageTransferDir, Map<String, List<QuestionEntity>> structs,
-            Map<Integer, AnswerCardEntity> cardMap) {
+                                List<PaperCetVo> papers, String imageTransferDir, Map<String, List<QuestionEntity>> structs,
+                                Map<Integer, AnswerCardEntity> cardMap) {
         int subject = Integer.valueOf(student.getSubjectCode());
         if (subject > 2) {
             if (student.getExamStatus().equals(ExamStatus.ABSENT)) {
@@ -1294,7 +1224,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private void setCardStatus(ExportCetVo student, AnswerCardEntity card, List<PaperPageCetVo> pages,
-            Map<Long, PaperCetVo> pmap) {
+                               Map<Long, PaperCetVo> pmap) {
         int subject = Integer.valueOf(student.getSubjectCode());
         if (subject > 2) {
             setCardStatusSmall(student, card, pages, pmap);
@@ -1304,7 +1234,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private void setCardStatusSmall(ExportCetVo student, AnswerCardEntity card, List<PaperPageCetVo> pages,
-            Map<Long, PaperCetVo> pmap) {
+                                    Map<Long, PaperCetVo> pmap) {
         PaperPageCetVo p = pages.get(0);
         if (ExamStatus.ABSENT.equals(student.getExamStatus())) {
             if (pmap.get(p.getPaperId()).getQuestionFilled()) {
@@ -1319,7 +1249,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private void setCardStatusCet(ExportCetVo student, AnswerCardEntity card, List<PaperPageCetVo> pages,
-            Map<Long, PaperCetVo> pmap) {
+                                  Map<Long, PaperCetVo> pmap) {
         if (card.getPaperCount() == 1) {
             PaperPageCetVo p = pages.get(0);
             if (ExamStatus.ABSENT.equals(student.getExamStatus())) {
@@ -1412,7 +1342,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private String getCetAnswer(Map<String, List<QuestionEntity>> structs, List<PaperPageCetVo> pages, Long examId,
-            String subjectCode) {
+                                String subjectCode) {
         List<String> answers = new ArrayList<String>();
         List<QuestionEntity> struct = structs.get(examId + "-" + subjectCode);
         if (struct == null) {
@@ -1877,12 +1807,31 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     @Override
-    public int getCountByExamAndAssignedCheckCount(Long examId, int assignedCheckCount) {
-        QueryWrapper<StudentEntity> wrapper = new QueryWrapper<>();
-        LambdaQueryWrapper<StudentEntity> lw = wrapper.lambda();
-        lw.eq(StudentEntity::getExamId, examId);
-        lw.eq(StudentEntity::getAssigned, true);
-        lw.eq(StudentEntity::getAssignedCheckCount, assignedCheckCount);
+    public int getCountByExamAndAssignedCheckCount(Long examId, int assignedCheckCount, OP op) {
+        LambdaQueryWrapper<StudentEntity> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StudentEntity::getExamId, examId);
+        wrapper.eq(StudentEntity::getAssigned, true);
+
+        if (OP.EQ == op) {
+            wrapper.eq(StudentEntity::getAssignedCheckCount, assignedCheckCount);
+        } else if (OP.GT == op) {
+            wrapper.gt(StudentEntity::getAssignedCheckCount, assignedCheckCount);
+        } else if (OP.GE == op) {
+            wrapper.ge(StudentEntity::getAssignedCheckCount, assignedCheckCount);
+        } else if (OP.LE == op) {
+            wrapper.le(StudentEntity::getAssignedCheckCount, assignedCheckCount);
+        } else if (OP.LT == op) {
+            wrapper.lt(StudentEntity::getAssignedCheckCount, assignedCheckCount);
+        }
+
+        return this.count(wrapper);
+    }
+
+    @Override
+    public int countByExamIdAndExamStatus(Long examId, ExamStatus examStatus) {
+        LambdaQueryWrapper<StudentEntity> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StudentEntity::getExamId, examId);
+        wrapper.eq(StudentEntity::getExamStatus, examStatus);
         return this.count(wrapper);
     }
 
@@ -2020,23 +1969,14 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
         TaskStatusVo status = new TaskStatusVo();
         if (Role.AUDITOR.equals(user.getRole())) {
             status.setFinishCount(assignedCheckHistoryService.getCountByUserId(user.getId(), examId));
-            status.setTodoCount(this.getCountByExamAndAssignedCheckCount(examId, 0));
+            status.setTodoCount(this.getCountByExamAndAssignedCheckCount(examId, 0, OP.EQ));
         } else {
-            status.setFinishCount(this.getCountByExamAndAssignedCheckCountGe(examId, 2));
-            status.setTodoCount(this.getCountByExamAndAssignedCheckCount(examId, 1));
+            status.setFinishCount(this.getCountByExamAndAssignedCheckCount(examId, 2, OP.GE));
+            status.setTodoCount(this.getCountByExamAndAssignedCheckCount(examId, 1, OP.EQ));
         }
         return status;
     }
 
-    private Integer getCountByExamAndAssignedCheckCountGe(Long examId, int assignedCheckCount) {
-        QueryWrapper<StudentEntity> wrapper = new QueryWrapper<>();
-        LambdaQueryWrapper<StudentEntity> lw = wrapper.lambda();
-        lw.eq(StudentEntity::getExamId, examId);
-        lw.eq(StudentEntity::getAssigned, true);
-        lw.ge(StudentEntity::getAssignedCheckCount, assignedCheckCount);
-        return this.count(wrapper);
-    }
-
     @Override
     public void releaseAssignedCheckTaskByUser(Long examId, String account) {
         TaskLock taskLock = TaskLockUtil.getAssignedCheckTask(examId.toString());

+ 21 - 0
src/main/java/cn/com/qmth/scancentral/util/MathUtil.java

@@ -0,0 +1,21 @@
+package cn.com.qmth.scancentral.util;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+public class MathUtil {
+
+    /**
+     * 计算百分比 (默认保留2位小数,超出位数则截断不四舍五入)
+     */
+    public static double percentage(double value1, double value2) {
+        if (value2 == 0d) {
+            return 0d;
+        }
+        double x = value1 * 100d / value2;
+        BigDecimal _value = new BigDecimal(Double.toString(x));
+        BigDecimal one = new BigDecimal("1");
+        return _value.divide(one, 2, RoundingMode.DOWN).doubleValue();
+    }
+
+}

+ 40 - 0
src/main/java/cn/com/qmth/scancentral/vo/examinfo/AbsentCheck.java

@@ -0,0 +1,40 @@
+package cn.com.qmth.scancentral.vo.examinfo;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class AbsentCheck {
+
+    @ApiModelProperty(value = "正常数量")
+    private int okCount;
+
+    @ApiModelProperty(value = "缺考数量")
+    private int absentCount;
+
+    @ApiModelProperty(value = "缺考待确认数量")
+    private int todoCount;
+
+    public int getOkCount() {
+        return okCount;
+    }
+
+    public void setOkCount(int okCount) {
+        this.okCount = okCount;
+    }
+
+    public int getAbsentCount() {
+        return absentCount;
+    }
+
+    public void setAbsentCount(int absentCount) {
+        this.absentCount = absentCount;
+    }
+
+    public int getTodoCount() {
+        return todoCount;
+    }
+
+    public void setTodoCount(int todoCount) {
+        this.todoCount = todoCount;
+    }
+
+}

+ 28 - 70
src/main/java/cn/com/qmth/scancentral/vo/examinfo/AnswerScan.java

@@ -1,36 +1,26 @@
 package cn.com.qmth.scancentral.vo.examinfo;
 
-public class AnswerScan {
+import io.swagger.annotations.ApiModelProperty;
 
-    private int totalCount;
+public class AnswerScan {
 
+    @ApiModelProperty(value = "已扫描数")
     private int scannedCount;
 
+    @ApiModelProperty(value = "未扫描数")
     private int unexistCount;
 
-    private int manualAbsentCount;
-
-    private int absentSuspectCount;
-
-    private int omrAbsentCount;
+    @ApiModelProperty(value = "扫描完成比")
+    private double scannedRate;
 
-    private int batchCount;
+    @ApiModelProperty(value = "图片检查完成批次数")
+    private int imageCheckCount;
 
-    private int incompleteCount;
+    @ApiModelProperty(value = "图片检查未完成成数")
+    private int imageCheckTodoCount;
 
-    private int assignedCount;
-
-    private int mismatchCount;
-
-    private int studentAnswerCount;
-
-    public int getTotalCount() {
-        return totalCount;
-    }
-
-    public void setTotalCount(int totalCount) {
-        this.totalCount = totalCount;
-    }
+    @ApiModelProperty(value = "图片检查完成比")
+    private double imageCheckRate;
 
     public int getScannedCount() {
         return scannedCount;
@@ -48,68 +38,36 @@ public class AnswerScan {
         this.unexistCount = unexistCount;
     }
 
-    public int getManualAbsentCount() {
-        return manualAbsentCount;
-    }
-
-    public void setManualAbsentCount(int manualAbsentCount) {
-        this.manualAbsentCount = manualAbsentCount;
-    }
-
-    public int getAbsentSuspectCount() {
-        return absentSuspectCount;
-    }
-
-    public void setAbsentSuspectCount(int absentSuspectCount) {
-        this.absentSuspectCount = absentSuspectCount;
-    }
-
-    public int getBatchCount() {
-        return batchCount;
-    }
-
-    public void setBatchCount(int batchCount) {
-        this.batchCount = batchCount;
-    }
-
-    public int getIncompleteCount() {
-        return incompleteCount;
-    }
-
-    public void setIncompleteCount(int incompleteCount) {
-        this.incompleteCount = incompleteCount;
-    }
-
-    public int getAssignedCount() {
-        return assignedCount;
+    public double getScannedRate() {
+        return scannedRate;
     }
 
-    public void setAssignedCount(int assignedCount) {
-        this.assignedCount = assignedCount;
+    public void setScannedRate(double scannedRate) {
+        this.scannedRate = scannedRate;
     }
 
-    public int getMismatchCount() {
-        return mismatchCount;
+    public int getImageCheckCount() {
+        return imageCheckCount;
     }
 
-    public void setMismatchCount(int mismatchCount) {
-        this.mismatchCount = mismatchCount;
+    public void setImageCheckCount(int imageCheckCount) {
+        this.imageCheckCount = imageCheckCount;
     }
 
-    public int getOmrAbsentCount() {
-        return omrAbsentCount;
+    public int getImageCheckTodoCount() {
+        return imageCheckTodoCount;
     }
 
-    public void setOmrAbsentCount(int omrAbsentCount) {
-        this.omrAbsentCount = omrAbsentCount;
+    public void setImageCheckTodoCount(int imageCheckTodoCount) {
+        this.imageCheckTodoCount = imageCheckTodoCount;
     }
 
-    public int getStudentAnswerCount() {
-        return studentAnswerCount;
+    public double getImageCheckRate() {
+        return imageCheckRate;
     }
 
-    public void setStudentAnswerCount(int studentAnswerCount) {
-        this.studentAnswerCount = studentAnswerCount;
+    public void setImageCheckRate(double imageCheckRate) {
+        this.imageCheckRate = imageCheckRate;
     }
 
 }

+ 63 - 5
src/main/java/cn/com/qmth/scancentral/vo/examinfo/AssignedCheck.java

@@ -1,15 +1,73 @@
 package cn.com.qmth.scancentral.vo.examinfo;
 
+import io.swagger.annotations.ApiModelProperty;
+
 public class AssignedCheck {
 
-    private int todoCount;
+    @ApiModelProperty(value = "审核员完成数")
+    private int auditorFinishCount;
+
+    @ApiModelProperty(value = "审核员未完成数")
+    private int auditorTodoCount;
+
+    @ApiModelProperty(value = "审核员完成比")
+    private double auditorFinishRate;
+
+    @ApiModelProperty(value = "管理员完成数")
+    private int adminFinishCount;
+
+    @ApiModelProperty(value = "管理员未完成数")
+    private int adminTodoCount;
+
+    @ApiModelProperty(value = "管理员完成比")
+    private double adminFinishRate;
+
+    public int getAuditorFinishCount() {
+        return auditorFinishCount;
+    }
+
+    public void setAuditorFinishCount(int auditorFinishCount) {
+        this.auditorFinishCount = auditorFinishCount;
+    }
+
+    public int getAuditorTodoCount() {
+        return auditorTodoCount;
+    }
+
+    public void setAuditorTodoCount(int auditorTodoCount) {
+        this.auditorTodoCount = auditorTodoCount;
+    }
+
+    public double getAuditorFinishRate() {
+        return auditorFinishRate;
+    }
+
+    public void setAuditorFinishRate(double auditorFinishRate) {
+        this.auditorFinishRate = auditorFinishRate;
+    }
+
+    public int getAdminFinishCount() {
+        return adminFinishCount;
+    }
+
+    public void setAdminFinishCount(int adminFinishCount) {
+        this.adminFinishCount = adminFinishCount;
+    }
+
+    public int getAdminTodoCount() {
+        return adminTodoCount;
+    }
+
+    public void setAdminTodoCount(int adminTodoCount) {
+        this.adminTodoCount = adminTodoCount;
+    }
 
-    public int getTodoCount() {
-        return todoCount;
+    public double getAdminFinishRate() {
+        return adminFinishRate;
     }
 
-    public void setTodoCount(int todoCount) {
-        this.todoCount = todoCount;
+    public void setAdminFinishRate(double adminFinishRate) {
+        this.adminFinishRate = adminFinishRate;
     }
 
 }

+ 14 - 59
src/main/java/cn/com/qmth/scancentral/vo/examinfo/ExamData.java

@@ -1,38 +1,17 @@
 package cn.com.qmth.scancentral.vo.examinfo;
 
-public class ExamData {
-
-    private Boolean synching;
+import io.swagger.annotations.ApiModelProperty;
 
-    private Double progress;
+public class ExamData {
 
+    @ApiModelProperty(value = "考生数量")
     private int studentCount;
 
+    @ApiModelProperty(value = "科目数量")
     private int subjectCount;
 
-    private int answerCard;
-
-    private int packageCard;
-
-    private Long updateTime;
-
-    private String message;
-
-    public Double getProgress() {
-        return progress;
-    }
-
-    public void setProgress(Double progress) {
-        this.progress = progress;
-    }
-
-    public Boolean getSynching() {
-        return synching;
-    }
-
-    public void setSynching(Boolean synching) {
-        this.synching = synching;
-    }
+    @ApiModelProperty(value = "卡格式数量")
+    private int cardCount;
 
     public int getStudentCount() {
         return studentCount;
@@ -42,44 +21,20 @@ public class ExamData {
         this.studentCount = studentCount;
     }
 
-    public int getSubjectCount() {
-        return subjectCount;
-    }
-
-    public void setSubjectCount(int subjectCount) {
-        this.subjectCount = subjectCount;
-    }
-
-    public int getAnswerCard() {
-        return answerCard;
-    }
-
-    public void setAnswerCard(int answerCard) {
-        this.answerCard = answerCard;
-    }
-
-    public int getPackageCard() {
-        return packageCard;
+    public int getCardCount() {
+        return cardCount;
     }
 
-    public void setPackageCard(int packageCard) {
-        this.packageCard = packageCard;
+    public void setCardCount(int cardCount) {
+        this.cardCount = cardCount;
     }
 
-    public Long getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Long updateTime) {
-        this.updateTime = updateTime;
-    }
-
-    public String getMessage() {
-        return message;
+    public int getSubjectCount() {
+        return subjectCount;
     }
 
-    public void setMessage(String message) {
-        this.message = message;
+    public void setSubjectCount(int subjectCount) {
+        this.subjectCount = subjectCount;
     }
 
 }

+ 0 - 195
src/main/java/cn/com/qmth/scancentral/vo/examinfo/ExamInfoVo.java

@@ -1,195 +0,0 @@
-package cn.com.qmth.scancentral.vo.examinfo;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class ExamInfoVo {
-
-    private Long id;
-
-    private String name;
-
-    private ExamConfig examConfig;
-
-    private List<SubjectConfig> subjectConfig;
-
-    private UploadInfo upload;
-
-    private ExamData examData;
-
-    private Scanner scanner;
-
-    private Auditor auditor;
-
-    private AnswerScan answerScan;
-
-    private PackageScan packageScan;
-
-    private ImageCheckTask imageCheckTask;
-
-    private VerifyTask verifyTask;
-
-    private OmrTask omrTask;
-
-    private PackageTask packageTask;
-
-    private StudentAnswerTask studentAnswerTask;
-
-    private AssignedCheck assignedCheck;
-
-    private ExamStatusCheck examStatusCheck;
-
-    public ExamInfoVo() {
-        examConfig = new ExamConfig();
-        subjectConfig = new ArrayList<>();
-        upload = new UploadInfo();
-        examData = new ExamData();
-        scanner = new Scanner();
-        auditor = new Auditor();
-        answerScan = new AnswerScan();
-        packageScan = new PackageScan();
-        omrTask = new OmrTask();
-        imageCheckTask = new ImageCheckTask();
-        verifyTask = new VerifyTask();
-        packageTask = new PackageTask();
-        studentAnswerTask = new StudentAnswerTask();
-        assignedCheck = new AssignedCheck();
-        examStatusCheck = new ExamStatusCheck();
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public UploadInfo getUpload() {
-        return upload;
-    }
-
-    public void setUpload(UploadInfo upload) {
-        this.upload = upload;
-    }
-
-    public ExamData getExamData() {
-        return examData;
-    }
-
-    public void setExamData(ExamData examData) {
-        this.examData = examData;
-    }
-
-    public Scanner getScanner() {
-        return scanner;
-    }
-
-    public void setScanner(Scanner scanner) {
-        this.scanner = scanner;
-    }
-
-    public Auditor getAuditor() {
-        return auditor;
-    }
-
-    public void setAuditor(Auditor auditor) {
-        this.auditor = auditor;
-    }
-
-    public AnswerScan getAnswerScan() {
-        return answerScan;
-    }
-
-    public void setAnswerScan(AnswerScan answerScan) {
-        this.answerScan = answerScan;
-    }
-
-    public PackageScan getPackageScan() {
-        return packageScan;
-    }
-
-    public void setPackageScan(PackageScan packageScan) {
-        this.packageScan = packageScan;
-    }
-
-    public VerifyTask getVerifyTask() {
-        return verifyTask;
-    }
-
-    public void setVerifyTask(VerifyTask verifyTask) {
-        this.verifyTask = verifyTask;
-    }
-
-    public OmrTask getOmrTask() {
-        return omrTask;
-    }
-
-    public void setOmrTask(OmrTask omrTask) {
-        this.omrTask = omrTask;
-    }
-
-    public PackageTask getPackageTask() {
-        return packageTask;
-    }
-
-    public void setPackageTask(PackageTask packageTask) {
-        this.packageTask = packageTask;
-    }
-
-    public ExamConfig getExamConfig() {
-        return examConfig;
-    }
-
-    public void setExamConfig(ExamConfig examConfig) {
-        this.examConfig = examConfig;
-    }
-
-    public List<SubjectConfig> getSubjectConfig() {
-        return subjectConfig;
-    }
-
-    public void setSubjectConfig(List<SubjectConfig> subjectConfig) {
-        this.subjectConfig = subjectConfig;
-    }
-
-    public ImageCheckTask getImageCheckTask() {
-        return imageCheckTask;
-    }
-
-    public void setImageCheckTask(ImageCheckTask imageCheckTask) {
-        this.imageCheckTask = imageCheckTask;
-    }
-
-    public StudentAnswerTask getStudentAnswerTask() {
-        return studentAnswerTask;
-    }
-
-    public void setStudentAnswerTask(StudentAnswerTask studentAnswerTask) {
-        this.studentAnswerTask = studentAnswerTask;
-    }
-
-    public AssignedCheck getAssignedCheck() {
-        return assignedCheck;
-    }
-
-    public void setAssignedCheck(AssignedCheck assignedCheck) {
-        this.assignedCheck = assignedCheck;
-    }
-
-    public ExamStatusCheck getExamStatusCheck() {
-        return examStatusCheck;
-    }
-
-    public void setExamStatusCheck(ExamStatusCheck examStatusCheck) {
-        this.examStatusCheck = examStatusCheck;
-    }
-}

+ 83 - 0
src/main/java/cn/com/qmth/scancentral/vo/examinfo/ExamOverview.java

@@ -0,0 +1,83 @@
+package cn.com.qmth.scancentral.vo.examinfo;
+
+public class ExamOverview {
+
+    private Long id;
+
+    private String name;
+
+    private ExamData basic;
+
+    private AnswerScan scan;
+
+    private AssignedCheck assignedCheck;
+
+    private OmrTask omr;
+
+    private AbsentCheck absentCheck;
+
+    public ExamOverview() {
+        basic = new ExamData();
+        scan = new AnswerScan();
+        assignedCheck = new AssignedCheck();
+        omr = new OmrTask();
+        absentCheck = new AbsentCheck();
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public ExamData getBasic() {
+        return basic;
+    }
+
+    public void setBasic(ExamData basic) {
+        this.basic = basic;
+    }
+
+    public AnswerScan getScan() {
+        return scan;
+    }
+
+    public void setScan(AnswerScan scan) {
+        this.scan = scan;
+    }
+
+    public AssignedCheck getAssignedCheck() {
+        return assignedCheck;
+    }
+
+    public void setAssignedCheck(AssignedCheck assignedCheck) {
+        this.assignedCheck = assignedCheck;
+    }
+
+    public OmrTask getOmr() {
+        return omr;
+    }
+
+    public void setOmr(OmrTask omr) {
+        this.omr = omr;
+    }
+
+    public AbsentCheck getAbsentCheck() {
+        return absentCheck;
+    }
+
+    public void setAbsentCheck(AbsentCheck absentCheck) {
+        this.absentCheck = absentCheck;
+    }
+
+}

+ 53 - 15
src/main/java/cn/com/qmth/scancentral/vo/examinfo/OmrTask.java

@@ -1,35 +1,73 @@
 package cn.com.qmth.scancentral.vo.examinfo;
 
+import io.swagger.annotations.ApiModelProperty;
+
 public class OmrTask {
 
-    private int totalCount;
+    @ApiModelProperty(value = "识别嫌疑完成数")
+    private int suspectFinishCount;
+
+    @ApiModelProperty(value = "识别嫌疑未完成数")
+    private int suspectTodoCount;
+
+    @ApiModelProperty(value = "识别嫌疑完成比")
+    private double suspectFinishRate;
+
+    @ApiModelProperty(value = "自定义完成数")
+    private int customizeFinishCount;
+
+    @ApiModelProperty(value = "自定义未完成数")
+    private int customizeTodoCount;
+
+    @ApiModelProperty(value = "自定义完成比")
+    private double customizeFinishRate;
+
+    public int getSuspectFinishCount() {
+        return suspectFinishCount;
+    }
+
+    public void setSuspectFinishCount(int suspectFinishCount) {
+        this.suspectFinishCount = suspectFinishCount;
+    }
+
+    public int getSuspectTodoCount() {
+        return suspectTodoCount;
+    }
+
+    public void setSuspectTodoCount(int suspectTodoCount) {
+        this.suspectTodoCount = suspectTodoCount;
+    }
 
-    private int todoCount;
+    public double getSuspectFinishRate() {
+        return suspectFinishRate;
+    }
 
-    private int unarbitrateCount;
+    public void setSuspectFinishRate(double suspectFinishRate) {
+        this.suspectFinishRate = suspectFinishRate;
+    }
 
-    public int getTodoCount() {
-        return todoCount;
+    public int getCustomizeFinishCount() {
+        return customizeFinishCount;
     }
 
-    public void setTodoCount(int todoCount) {
-        this.todoCount = todoCount;
+    public void setCustomizeFinishCount(int customizeFinishCount) {
+        this.customizeFinishCount = customizeFinishCount;
     }
 
-    public int getTotalCount() {
-        return totalCount;
+    public int getCustomizeTodoCount() {
+        return customizeTodoCount;
     }
 
-    public void setTotalCount(int totalCount) {
-        this.totalCount = totalCount;
+    public void setCustomizeTodoCount(int customizeTodoCount) {
+        this.customizeTodoCount = customizeTodoCount;
     }
 
-    public int getUnarbitrateCount() {
-        return unarbitrateCount;
+    public double getCustomizeFinishRate() {
+        return customizeFinishRate;
     }
 
-    public void setUnarbitrateCount(int unarbitrateCount) {
-        this.unarbitrateCount = unarbitrateCount;
+    public void setCustomizeFinishRate(double customizeFinishRate) {
+        this.customizeFinishRate = customizeFinishRate;
     }
 
 }

+ 62 - 0
src/main/java/cn/com/qmth/scancentral/vo/omr/OmrTaskOverview.java

@@ -0,0 +1,62 @@
+package cn.com.qmth.scancentral.vo.omr;
+
+import io.swagger.annotations.ApiModelProperty;
+
+public class OmrTaskOverview {
+
+    @ApiModelProperty(value = "总数")
+    private int totalCount;
+
+    @ApiModelProperty(value = "未处理数")
+    private int waitingCount;
+
+    @ApiModelProperty(value = "已处理数")
+    private int processedCount;
+
+    @ApiModelProperty(value = "等待仲裁数")
+    private int waitArbitrateCount;
+
+    @ApiModelProperty(value = "已仲裁数")
+    private int arbitrateCount;
+
+    public int getTotalCount() {
+        return totalCount;
+    }
+
+    public void setTotalCount(int totalCount) {
+        this.totalCount = totalCount;
+    }
+
+    public int getWaitingCount() {
+        return waitingCount;
+    }
+
+    public void setWaitingCount(int waitingCount) {
+        this.waitingCount = waitingCount;
+    }
+
+    public int getProcessedCount() {
+        return processedCount;
+    }
+
+    public void setProcessedCount(int processedCount) {
+        this.processedCount = processedCount;
+    }
+
+    public int getWaitArbitrateCount() {
+        return waitArbitrateCount;
+    }
+
+    public void setWaitArbitrateCount(int waitArbitrateCount) {
+        this.waitArbitrateCount = waitArbitrateCount;
+    }
+
+    public int getArbitrateCount() {
+        return arbitrateCount;
+    }
+
+    public void setArbitrateCount(int arbitrateCount) {
+        this.arbitrateCount = arbitrateCount;
+    }
+
+}

+ 29 - 16
src/main/resources/mapper/OmrTaskMapper.xml

@@ -1,21 +1,34 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.com.qmth.scancentral.dao.OmrTaskDao">
-	<resultMap id="custMap"
-		type="cn.com.qmth.scancentral.entity.OmrTaskEntity">
-		<id column="id" property="id" />
-		<result column="pages" property="pages"
-			typeHandler="cn.com.qmth.scancentral.handle.OmrTaskPageListTypeHandler" />
-	</resultMap>
-	<select id="findUnMarked" resultMap="custMap">
-		select *
-		from sc_omr_task t
-		where t.exam_id=#{examId}
-		and
-		t.status=#{status}
-		order by t.id
-		limit
-		#{startNumber},#{pageSize}
-	</select>
+    <resultMap id="custMap"
+               type="cn.com.qmth.scancentral.entity.OmrTaskEntity">
+        <id column="id" property="id"/>
+        <result column="pages" property="pages"
+                typeHandler="cn.com.qmth.scancentral.handle.OmrTaskPageListTypeHandler"/>
+    </resultMap>
+
+    <select id="findUnMarked" resultMap="custMap">
+        select *
+        from sc_omr_task t
+        where t.exam_id = #{examId}
+          and t.status = #{status}
+        order by t.id
+        limit #{startNumber},#{pageSize}
+    </select>
+
+    <select id="countByExamIdAndFixed" resultType="cn.com.qmth.scancentral.vo.omr.OmrTaskOverview">
+        select count(t.id) totalCount,
+        sum(case t.status when 'WAITING' then 1 else 0 end) as waitingCount,
+        sum(case t.status when 'PROCESSED' then 1 else 0 end) as processedCount,
+        sum(case t.status when 'WAIT_ARBITRATE' then 1 else 0 end) as waitArbitrateCount,
+        sum(case t.status when 'ARBITRATED' then 1 else 0 end) as arbitrateCount
+        from sc_omr_task t
+        inner join sc_omr_group g on g.id = t.group_id
+        where g.exam_id = #{examId}
+        <if test="fixed != null">
+            and g.fixed = #{fixed}
+        </if>
+    </select>
 
 </mapper>