xiaofei пре 1 година
родитељ
комит
dcd120c951
24 измењених фајлова са 160 додато и 35 уклоњено
  1. 7 7
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/importFile/BasicExamStudentImport.java
  2. 2 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncBasicExamStudentTeacherImportService.java
  3. 4 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/SyncBasicExamStudentImportService.java
  4. 0 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/ImportLogicService.java
  5. 10 11
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/ImportLogicServiceImpl.java
  6. 3 0
      distributed-print/install/mysql/upgrade/3.4.0.sql
  7. 4 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/BasicExamStudentController.java
  8. 2 1
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/ScanOmrTaskController.java
  9. 9 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/ScanStudentController.java
  10. 30 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/examRule/CodeNameEnableDisabledValue.java
  11. 0 3
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicCourseService.java
  12. 0 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java
  13. 9 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/AnswerQueryDomain.java
  14. 10 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scanexaminfo/CheckTask.java
  15. 9 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scanpackage/ScanPackageQuery.java
  16. 12 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java
  17. 1 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/ScanOmrTaskMapper.java
  18. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  19. 1 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanOmrTaskService.java
  20. 29 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  21. 2 3
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanOmrTaskServiceImpl.java
  22. 6 0
      teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml
  23. 3 0
      teachcloud-mark/src/main/resources/mapper/ScanOmrTaskMapper.xml
  24. 5 0
      teachcloud-mark/src/main/resources/mapper/ScanPackageMapper.xml

+ 7 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/dto/importFile/BasicExamStudentImport.java

@@ -1,6 +1,6 @@
 package com.qmth.distributed.print.business.bean.dto.importFile;
 
-import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableValue;
+import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableDisabledValue;
 import io.swagger.annotations.ApiModelProperty;
 
 import java.util.ArrayList;
@@ -43,9 +43,9 @@ public class BasicExamStudentImport {
     @ApiModelProperty("考场(考试教室)")
     private String examRoom;
     @ApiModelProperty("必填字段集合")
-    private List<CodeNameEnableValue> requiredFieldList = new ArrayList<>();
+    private List<CodeNameEnableDisabledValue> requiredFieldList = new ArrayList<>();
     @ApiModelProperty("扩展字段集合")
-    private List<CodeNameEnableValue> extendFieldList = new ArrayList<>();
+    private List<CodeNameEnableDisabledValue> extendFieldList = new ArrayList<>();
     @ApiModelProperty("错误信息")
     private String errorMsg;
 
@@ -185,19 +185,19 @@ public class BasicExamStudentImport {
         this.examRoom = examRoom;
     }
 
-    public List<CodeNameEnableValue> getRequiredFieldList() {
+    public List<CodeNameEnableDisabledValue> getRequiredFieldList() {
         return requiredFieldList;
     }
 
-    public void setRequiredFieldList(List<CodeNameEnableValue> requiredFieldList) {
+    public void setRequiredFieldList(List<CodeNameEnableDisabledValue> requiredFieldList) {
         this.requiredFieldList = requiredFieldList;
     }
 
-    public List<CodeNameEnableValue> getExtendFieldList() {
+    public List<CodeNameEnableDisabledValue> getExtendFieldList() {
         return extendFieldList;
     }
 
-    public void setExtendFieldList(List<CodeNameEnableValue> extendFieldList) {
+    public void setExtendFieldList(List<CodeNameEnableDisabledValue> extendFieldList) {
         this.extendFieldList = extendFieldList;
     }
 

+ 2 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncBasicExamStudentTeacherImportService.java

@@ -106,9 +106,10 @@ public class AsyncBasicExamStudentTeacherImportService extends AsyncImportTaskTe
                     SystemConstant.addSummary(stringJoinerSummary, "错误文件生成失败," + e.getMessage());
                 }
             } else {
+                SystemConstant.addSummary(stringJoinerSummary, "数据校验通过,开始更新数据库中考生任课老师");
                 List<BasicExamStudent> basicExamStudentList = JSON.parseArray(JSON.toJSONString(result.get(SystemConstant.DATASOURCE)), BasicExamStudent.class);
                 basicExamStudentService.updateTeacherIdById(basicExamStudentList);
-                //
+                SystemConstant.addSummary(stringJoinerSummary, "更新数据库中考生任课老师完成");
                 tbTask.setResult(TaskResultEnum.SUCCESS);
             }
         } catch (Exception e) {

+ 4 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/SyncBasicExamStudentImportService.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSON;
 import com.qmth.boot.tools.excel.ExcelWriter;
 import com.qmth.boot.tools.excel.enums.ExcelType;
 import com.qmth.distributed.print.business.bean.dto.importFile.BasicExamStudentImport;
+import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;
 import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableValue;
 import com.qmth.distributed.print.business.service.BasicExamService;
 import com.qmth.distributed.print.business.service.BasicExamStudentService;
@@ -40,7 +41,7 @@ import java.util.*;
  * @Date: 2024-02-26
  */
 @Service
-public class SyncBasicExamStudentImportService extends SyncImportTaskTemplate {
+public class SyncBasicExamStudentImportService extends AsyncImportTaskTemplete {
 
     private final static Logger log = LoggerFactory.getLogger(SyncBasicExamStudentImportService.class);
 
@@ -106,8 +107,10 @@ public class SyncBasicExamStudentImportService extends SyncImportTaskTemplate {
                     SystemConstant.addSummary(stringJoinerSummary, "错误文件生成失败," + e.getMessage());
                 }
             } else {
+                SystemConstant.addSummary(stringJoinerSummary, "数据校验通过,开始写入数据库");
                 List<BasicExamStudent> basicExamStudentList = JSON.parseArray(JSON.toJSONString(result.get(SystemConstant.DATASOURCE)), BasicExamStudent.class);
                 basicExamStudentService.saveOrUpdateBatch(basicExamStudentList);
+                SystemConstant.addSummary(stringJoinerSummary, "写入数据库完成");
                 // 模式4,直接进扫描阅卷库
                 BasicExam basicExam = basicExamService.getById(tbTask.getExamId());
                 if (ExamModelEnum.MODEL4.equals(basicExam.getExamModel())) {

+ 0 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/ImportLogicService.java

@@ -1,10 +1,7 @@
 package com.qmth.distributed.print.business.templete.service;
 
-import com.qmth.distributed.print.business.bean.dto.importFile.BasicExamStudentImport;
 import com.qmth.teachcloud.common.entity.BasicExamStudent;
 
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.List;
 import java.util.Map;
 import java.util.StringJoiner;

+ 10 - 11
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/ImportLogicServiceImpl.java

@@ -9,7 +9,6 @@ import com.qmth.distributed.print.business.bean.dto.ObjectiveStructDto;
 import com.qmth.distributed.print.business.bean.dto.SubjectiveStructDto;
 import com.qmth.distributed.print.business.bean.dto.importFile.BasicExamStudentImport;
 import com.qmth.distributed.print.business.bean.dto.importFile.BasicExamStudentParseDto;
-import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableValue;
 import com.qmth.distributed.print.business.entity.BasicExamRule;
 import com.qmth.distributed.print.business.enums.RequiredFieldsEnum;
 import com.qmth.distributed.print.business.service.BasicExamRuleService;
@@ -18,6 +17,7 @@ import com.qmth.distributed.print.business.service.BasicExamStudentService;
 import com.qmth.distributed.print.business.templete.service.ImportLogicService;
 import com.qmth.teachcloud.common.base.BaseEntity;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkUser;
+import com.qmth.teachcloud.common.bean.examRule.CodeNameEnableDisabledValue;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.bean.result.ExcelResult;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -139,7 +139,7 @@ public class ImportLogicServiceImpl implements ImportLogicService {
             StringJoiner stringJoiner = new StringJoiner(";");
             // 校验excel内容
             basicExamStudentImport.getRequiredFieldList().forEach(m -> {
-                if (m.getEnable() && StringUtils.isBlank(m.getValue())) {
+                if (m.getDisabled() && StringUtils.isBlank(m.getValue())) {
                     stringJoiner.add(m.getName() + "必填");
                 }
                 if (m.getCode().equals(RequiredFieldsEnum.PAPER_NUMBER.getCode()) && needPaperNumber) {
@@ -169,7 +169,7 @@ public class ImportLogicServiceImpl implements ImportLogicService {
                 List<SysOrg> sysOrgList = sysOrgService.getSecondOrg(schoolId, basicExamStudentImport.getTeachingRoomName());
                 if (CollectionUtils.isEmpty(sysOrgList)) {
                     stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]在学院层级不存在");
-                } else {
+                } else if (sysOrgList.size() == 1) {
                     SysOrg sysOrg = sysOrgList.get(0);
                     // 校验课程代码和开课学院
                     BasicCourse basicCourse = basicCourseService.getByTeachRoomIdAndCode(sysOrg.getId(), basicExamStudentImport.getCourseCode());
@@ -179,6 +179,8 @@ public class ImportLogicServiceImpl implements ImportLogicService {
                         basicExamStudent.setCourseId(basicCourse.getId());
                         basicCourseIdMap.put(key, basicCourse.getId());
                     }
+                } else {
+                    stringJoiner.add("开课学院[" + basicExamStudentImport.getTeachingRoomName() + "]存在多个");
                 }
             } else {
                 basicExamStudent.setCourseId(basicCourseIdMap.get(key));
@@ -275,12 +277,12 @@ public class ImportLogicServiceImpl implements ImportLogicService {
                         } catch (IllegalAccessException e) {
                             throw ExceptionResultEnum.ERROR.exception("表头为[" + entry.getKey() + "]的值赋值失败");
                         }
-                        basicExamStudentImport.getRequiredFieldList().add(new CodeNameEnableValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), entry.getValue()));
+                        basicExamStudentImport.getRequiredFieldList().add(new CodeNameEnableDisabledValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), enumResult.getDisabled(), entry.getValue()));
                     }
                     // 扩展字段
                     if (extendMap.containsKey(entry.getKey())) {
                         EnumResult enumResult = extendMap.get(entry.getKey());
-                        basicExamStudentImport.getExtendFieldList().add(new CodeNameEnableValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), entry.getValue()));
+                        basicExamStudentImport.getExtendFieldList().add(new CodeNameEnableDisabledValue(enumResult.getCode(), enumResult.getName(), enumResult.getEnable(), enumResult.getDisabled(), entry.getValue()));
                     }
                 }
                 list.add(basicExamStudentImport);
@@ -772,7 +774,6 @@ public class ImportLogicServiceImpl implements ImportLogicService {
         if (Objects.isNull(basicExam)) {
             throw ExceptionResultEnum.ERROR.exception("考试不存在");
         }
-        Long semesterId = SystemConstant.convertIdToLong(basicExam.getSemesterId());
 
         SystemConstant.addSummary(stringJoinerSummary, "开始解析文件内容");
         BasicExamStudentParseDto basicExamStudentParseDto;
@@ -794,9 +795,6 @@ public class ImportLogicServiceImpl implements ImportLogicService {
                 .eq(BasicExamStudent::getSchoolId, schoolId).eq(BasicExamStudent::getExamId, examId));
         Map<String, Long> courseIdStudentCodeMap = basicExamStudentList.stream().collect(Collectors.toMap(k -> k.getCourseId() + SystemConstant.HYPHEN + k.getStudentCode(), BaseEntity::getId));
 
-        BasicSchool basicSchool = commonCacheService.schoolCache(schoolId);
-        boolean needPaperNumber = (basicSchool.getHasPaperNumber() != null && basicSchool.getHasPaperNumber()) || ExamModelEnum.MODEL4.equals(basicExam.getExamModel());
-
         Map<String, Long> basicCourseIdMap = new HashMap<>();
         // 是否有错误提示
         boolean hasError = false;
@@ -852,8 +850,9 @@ public class ImportLogicServiceImpl implements ImportLogicService {
             }
 
             if (basicExamStudent.getCourseId() != null) {
-                if (courseIdStudentCodeMap.containsKey(basicExamStudent.getCourseId() + SystemConstant.HYPHEN + basicExamStudent.getStudentCode())) {
-                    basicExamStudent.setId(courseIdStudentCodeMap.get(basicExamStudent.getCourseId() + SystemConstant.HYPHEN + basicExamStudent.getStudentCode()));
+                String studentKey = basicExamStudent.getCourseId() + SystemConstant.HYPHEN + basicExamStudentImport.getStudentCode();
+                if (courseIdStudentCodeMap.containsKey(studentKey)) {
+                    basicExamStudent.setId(courseIdStudentCodeMap.get(studentKey));
                 } else {
                     stringJoiner.add(String.format("课程代码[%s],开课学院[%s],学号[%s]考生管理中不存在", basicExamStudentImport.getCourseCode(), basicExamStudentImport.getTeachingRoomName(), basicExamStudentImport.getStudentCode()));
                 }

+ 3 - 0
distributed-print/install/mysql/upgrade/3.4.0.sql

@@ -133,6 +133,9 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `related`, `enable`, `default_auth`, `front_display`) VALUES ('1146', '合并PDF生成', 'CreateWholePdf', 'BUTTON', '47', '5', 'AUTH', '1145,1147', '1', '0', '1');
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('1147', '合并PDF生成', '/api/admin/exam/print/create_whole_pdf', 'URL', '47', '6', 'AUTH', '1', '1', '1');
 
+
+ALTER TABLE `mark_student` ADD COLUMN `miss_scan` TINYINT(1) NULL DEFAULT 0 COMMENT '是否漏扫' AFTER `invalid`;
+
 -- drop table if exists exam_detail_course_paper_type;
 -- drop table if exists basic_template_org;
 -- drop table if exists cloud_user_push_status;

+ 4 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/BasicExamStudentController.java

@@ -107,7 +107,8 @@ public class BasicExamStudentController {
                                              @ApiParam(value = "考试id", required = true) @RequestParam String examId) throws Exception {
         Map<String, Object> map = printCommonService.saveTask(file, SystemConstant.convertIdToLong(examId), TaskTypeEnum.BASIC_EXAM_STUDENT_IMPORT);
         map.put("examId", SystemConstant.convertIdToLong(examId));
-        return syncBasicExamStudentImportService.importTask(map);
+        syncBasicExamStudentImportService.importTask(map);
+        return ResultUtil.success(true);
     }
 
     @ApiOperation(value = "任课老师导入")
@@ -118,7 +119,8 @@ public class BasicExamStudentController {
                                 @ApiParam(value = "考试id", required = true) @RequestParam String examId) throws Exception {
         Map<String, Object> map = printCommonService.saveTask(file, SystemConstant.convertIdToLong(examId), TaskTypeEnum.BASIC_EXAM_STUDENT_TEACHER_IMPORT);
         map.put("examId", SystemConstant.convertIdToLong(examId));
-        return asyncBasicExamStudentTeacherImportService.importTask(map);
+        asyncBasicExamStudentTeacherImportService.importTask(map);
+        return ResultUtil.success(true);
     }
 
     @ApiOperation(value = "导出")

+ 2 - 1
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/ScanOmrTaskController.java

@@ -81,8 +81,9 @@ public class ScanOmrTaskController extends BaseController {
                        @ApiParam(value = "课程ID") @RequestParam(required = false) Long courseId,
                        @ApiParam(value = "课程试卷编号") @RequestParam(required = false) String coursePaperId,
                        @ApiParam(value = "状态") @RequestParam OmrTaskStatus status,
+                       @ApiParam(value = "考场") @RequestParam(required = false) String examRoom,
                        @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
                        @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        return ResultUtil.ok(omrTaskService.list(examId, courseId, coursePaperId, status, pageNumber, pageSize));
+        return ResultUtil.ok(omrTaskService.list(examId, courseId, coursePaperId, status, examRoom, pageNumber, pageSize));
     }
 }

+ 9 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/ScanStudentController.java

@@ -52,6 +52,15 @@ public class ScanStudentController extends BaseController {
         validMarkPaperForScan(examId, coursePaperId);
         return markStudentService.absentManualUpdate(examId, coursePaperId, studentCode, status);
     }
+    @ApiOperation(value = "更新漏扫状态")
+    @PostMapping("missScan/update")
+    public Result missScanUpdate(@ApiParam(name = "考试ID", required = true) @RequestParam Long examId,
+                                                   @ApiParam(name = "课程试卷号", required = true) @RequestParam String coursePaperId,
+                                                   @ApiParam(name = "学号", required = true) @RequestParam String studentCode,
+                                                   @ApiParam(name = "状态", required = true) @RequestParam Boolean missScan) {
+        validMarkPaperForScan(examId, coursePaperId);
+        return ResultUtil.success(markStudentService.missScanUpdate(examId, coursePaperId, studentCode, missScan));
+    }
 
     @ApiOperation(value = "人工绑定-任务确认")
     @PostMapping("/assign/confirm")

+ 30 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/examRule/CodeNameEnableDisabledValue.java

@@ -0,0 +1,30 @@
+package com.qmth.teachcloud.common.bean.examRule;
+
+/**
+ * exam_student表中required_fields、extend_fields字段对应实体
+ */
+public class CodeNameEnableDisabledValue extends CodeNameEnableValue{
+
+    private Boolean disabled;
+
+    public CodeNameEnableDisabledValue()
+    {
+    }
+
+    public CodeNameEnableDisabledValue(Boolean disabled) {
+        this.disabled = disabled;
+    }
+
+    public CodeNameEnableDisabledValue(String code, String name, Boolean enable, Boolean disabled, String value) {
+        super(code, name, enable, value);
+        this.disabled = disabled;
+    }
+
+    public Boolean getDisabled() {
+        return disabled;
+    }
+
+    public void setDisabled(Boolean disabled) {
+        this.disabled = disabled;
+    }
+}

+ 0 - 3
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/BasicCourseService.java

@@ -7,13 +7,10 @@ import com.qmth.teachcloud.common.bean.result.BasicCourseResult;
 import com.qmth.teachcloud.common.bean.result.TeachCourseSelectResult;
 import com.qmth.teachcloud.common.entity.BasicCourse;
 import com.qmth.teachcloud.common.entity.SysUser;
-import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import java.util.List;
-import java.util.Map;
 
 /**
  * <p>

+ 0 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/BasicCourseServiceImpl.java

@@ -345,5 +345,4 @@ public class BasicCourseServiceImpl extends ServiceImpl<BasicCourseMapper, Basic
                 .eq(BasicCourse::getCode, courseCode);
         return this.getOne(queryWrapper);
     }
-
 }

+ 9 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/AnswerQueryDomain.java

@@ -51,6 +51,7 @@ public class AnswerQueryDomain extends PagerQuery {
     private Boolean withPaper;
     private Boolean withOmrDetail;
 	private String markPaperStatus;
+	private Boolean missScan;
 	public Long getExamId() {
 		return examId;
 	}
@@ -199,4 +200,12 @@ public class AnswerQueryDomain extends PagerQuery {
 	public void setInvalid(Boolean invalid) {
 		this.invalid = invalid;
 	}
+
+	public Boolean getMissScan() {
+		return missScan;
+	}
+
+	public void setMissScan(Boolean missScan) {
+		this.missScan = missScan;
+	}
 }

+ 10 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scanexaminfo/CheckTask.java

@@ -5,6 +5,7 @@ public class CheckTask {
 
 	private int unexistCount;//未扫描数量
 	private int unexistCheckedCount;//未扫描已处理数量
+	private int missScanCount;//漏扫数量
 	private int assignedCount;//人工绑定待检查数量
 	private int assignedCheckedCount;//人工绑定已检查数量
 	private int absentCheckCount;//缺考待检查数量
@@ -24,6 +25,15 @@ public class CheckTask {
 	public void setUnexistCheckedCount(int unexistCheckedCount) {
 		this.unexistCheckedCount = unexistCheckedCount;
 	}
+
+	public int getMissScanCount() {
+		return missScanCount;
+	}
+
+	public void setMissScanCount(int missScanCount) {
+		this.missScanCount = missScanCount;
+	}
+
 	public int getAssignedCount() {
 		return assignedCount;
 	}

+ 9 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scanpackage/ScanPackageQuery.java

@@ -10,7 +10,7 @@ public class ScanPackageQuery extends PagerQuery {
     private Long examId;
     private Long courseId;
     private String coursePaperId;
-
+    private String examRoom;
     private ScanStatus status;
 
     public Long getExamId() {
@@ -37,6 +37,14 @@ public class ScanPackageQuery extends PagerQuery {
         this.coursePaperId = coursePaperId;
     }
 
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
     public ScanStatus getStatus() {
         return status;
     }

+ 12 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java

@@ -207,6 +207,8 @@ public class MarkStudent implements Serializable {
     private Long examStartTime;
     private Long examEndTime;
     private Long createId;
+    //是否漏扫
+    private Boolean missScan;
 
     @TableField(exist = false)
     private String markPaperStatus;
@@ -242,6 +244,7 @@ public class MarkStudent implements Serializable {
         this.breach = false;
         this.absentSuspect = false;
         this.assignConfirmed = false;
+        this.missScan = false;
         this.subjectiveStatus = SubjectiveStatus.UNMARK;
         this.scanStatus = ScanStatus.UNEXIST;
         this.omrAbsent = false;
@@ -772,6 +775,15 @@ public class MarkStudent implements Serializable {
     public void setInvalid(Boolean invalid) {
         this.invalid = invalid;
     }
+
+    public Boolean getMissScan() {
+        return missScan;
+    }
+
+    public void setMissScan(Boolean missScan) {
+        this.missScan = missScan;
+    }
+
     @Override
     public String toString() {
         return "MarkStudent{" +

+ 1 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/ScanOmrTaskMapper.java

@@ -30,6 +30,7 @@ public interface ScanOmrTaskMapper extends BaseMapper<ScanOmrTask> {
                                                          @Param("courseId") Long courseId,
                                                          @Param("coursePaperId") String coursePaperId,
                                                          @Param(value = "status") OmrTaskStatus status,
+                                                         @Param("examRoom") String examRoom,
                                                          @Param("markPaperStatus") String markPaperStatus, @Param("dpr") DataPermissionRule dpr);
 
     int getStudentCountByExamAndStatusAndUserId(@Param(value = "examId") Long examId,

+ 2 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java

@@ -170,4 +170,6 @@ public interface MarkStudentService extends IService<MarkStudent> {
     Integer maxCardNumber(Long examId, String paperNumber, String paperType);
 
     void scoreDownload(ArchiveStudentQuery query, HttpServletResponse response);
+
+    Boolean missScanUpdate(Long examId, String coursePaperId, String studentCode, Boolean missScan);
 }

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanOmrTaskService.java

@@ -37,7 +37,7 @@ public interface ScanOmrTaskService extends IService<ScanOmrTask> {
 
 	int getCount(Long examId, OmrTaskStatus status, String courseCode, String coursePaperId, MarkPaperStatus markPaperStatus, DataPermissionRule dpr);
 
-	IPage<ScanStudentDto> list(Long examId, Long courseId, String coursePaperId, OmrTaskStatus status, Integer pageNumber, Integer pageSize);
+	IPage<ScanStudentDto> list(Long examId, Long courseId, String coursePaperId, OmrTaskStatus status, String examRoom, Integer pageNumber, Integer pageSize);
 
 	void saveTask(Long studentId);
 

+ 29 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -297,6 +297,17 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         return baseMapper.selectCountByQuery(markStudent, dpr);
     }
 
+    private int getMissScanCount(Long examId, Long courseId, String coursePaperId,
+                         MarkPaperStatus markPaperStatus, DataPermissionRule dpr) {
+        MarkStudent markStudent = new MarkStudent();
+        markStudent.setExamId(examId);
+        markStudent.setCourseId(courseId);
+        markStudent.setCoursePaperId(coursePaperId);
+        markStudent.setMissScan(true);
+        markStudent.setMarkPaperStatus(markPaperStatus.name());
+        return baseMapper.selectCountByQuery(markStudent, dpr);
+    }
+
     private int getOmrAbsentCount(Long examId, Boolean checked, Long courseId, String coursePaperId,
                                   MarkPaperStatus status, DataPermissionRule dpr) {
         MarkStudent markStudent = new MarkStudent();
@@ -334,6 +345,8 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                 getCount(examId, ScanStatus.UNEXIST, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
         ct.setUnexistCheckedCount(
                 getCount(examId, ScanStatus.MANUAL_ABSENT, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
+        ct.setMissScanCount(
+                getMissScanCount(examId, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
         ct.setAssignedCount(getAssignedCount(examId, false, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
         ct.setAssignedCheckedCount(
                 getAssignedCount(examId, true, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
@@ -413,6 +426,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             student.setScanStatus(ScanStatus.SCANNED);
             student.setAbsent(false);
             student.setManualAbsent(false);
+            student.setMissScan(false);
             // 更新图片数量和图片地址
             updateStudentSheetInfo(student, studentPaperList);
         } else {
@@ -1653,4 +1667,19 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             throw new RuntimeException(e);
         }
     }
+
+    @Override
+    public Boolean missScanUpdate(Long examId, String coursePaperId, String studentCode, Boolean missScan) {
+        MarkStudent student = findByExamIdAndCoursePaperIdAndStudentCode(examId, coursePaperId, studentCode);
+        if (student == null) {
+            throw new ParameterException("考生未找到");
+        }
+        if (!ScanStatus.UNEXIST.equals(student.getScanStatus())) {
+            throw new ParameterException("考生不是未扫描状态");
+        }
+        LambdaUpdateWrapper<MarkStudent> lw = new LambdaUpdateWrapper<>();
+        lw.set(MarkStudent::getMissScan, missScan);
+        lw.eq(MarkStudent::getId, student.getId());
+        return this.update(lw);
+    }
 }

+ 2 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanOmrTaskServiceImpl.java

@@ -8,7 +8,6 @@ import javax.validation.constraints.NotNull;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import io.swagger.models.auth.In;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -653,11 +652,11 @@ public class ScanOmrTaskServiceImpl extends ServiceImpl<ScanOmrTaskMapper, ScanO
     }
 
     @Override
-    public IPage<ScanStudentDto> list(Long examId, Long courseId, String coursePaperId, OmrTaskStatus status, Integer pageNumber, Integer pageSize) {
+    public IPage<ScanStudentDto> list(Long examId, Long courseId, String coursePaperId, OmrTaskStatus status, String examRoom, Integer pageNumber, Integer pageSize) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(),
                 sysUser.getId(), ServletUtil.getRequest().getServletPath());
-        return this.baseMapper.listByExamIdAndStatusAndUserId(new Page<>(pageNumber, pageSize), examId, courseId, coursePaperId, status,
+        return this.baseMapper.listByExamIdAndStatusAndUserId(new Page<>(pageNumber, pageSize), examId, courseId, coursePaperId, status, examRoom,
                 MarkPaperStatus.FORMAL.name(), dpr);
     }
 

+ 6 - 0
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -280,6 +280,9 @@
         <if test="query.questionFilled != null">
             and t.question_filled=#{query.questionFilled}
         </if>
+        <if test="query.missScan != null">
+            and t.miss_scan=#{query.missScan}
+        </if>
         <if test="dpr != null">
             <if test="dpr.requestUserId != null">
                 AND t.create_id = #{dpr.requestUserId}
@@ -609,6 +612,9 @@
             <if test="markStudent.incomplete != null">
                 and ms.incomplete = #{markStudent.incomplete}
             </if>
+            <if test="markStudent.missScan != null">
+                and ms.miss_scan = #{markStudent.missScan}
+            </if>
             <if test="dpr != null">
                 <if test="dpr.requestUserId != null">
                     AND ms.create_id = #{dpr.requestUserId}

+ 3 - 0
teachcloud-mark/src/main/resources/mapper/ScanOmrTaskMapper.xml

@@ -47,6 +47,9 @@
 				</if>
 				<if test="coursePaperId != null and coursePaperId != ''">
 					and s.course_paper_id = #{coursePaperId}
+				</if>
+				<if test="examRoom != null and examRoom != ''">
+					and s.exam_room = #{examRoom}
 				</if>
 					and exists (select 1 from mark_paper mp where s.exam_id = mp.exam_id and s.course_paper_id = mp.course_paper_id and s.paper_type = mp.paper_type and mp.status = #{markPaperStatus})
 					and exists(select 1

+ 5 - 0
teachcloud-mark/src/main/resources/mapper/ScanPackageMapper.xml

@@ -30,6 +30,11 @@
 		<if test="req.coursePaperId != null and req.coursePaperId != ''">
 			and t.course_paper_id= #{req.coursePaperId}
 		</if>
+		<if test="req.examRoom != null and req.examRoom != ''">
+			and exists (
+			select 1 from exam_detail ed where t.exam_id=ed.exam_id and t.package_code=ed.package_code and ed.exam_room = #{req.examRoom}
+			)
+		</if>
         <if test="req.status != null">
 			<if test="req.status ==@com.qmth.teachcloud.common.enums.ScanStatus@SCANNED">
 				and exists (