瀏覽代碼

add. 卷型检查

caozixuan 8 月之前
父節點
當前提交
4ba6a21bb1

+ 26 - 1
distributed-print-business/src/main/resources/db/log/czx.sql

@@ -28,4 +28,29 @@ INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, e
 
 INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3072', '查询学号字母映射关系', '/api/scan/config/student_number_letter_relation', 'URL', '970', '40', 'AUTH', '1', '1', '1');
 UPDATE sys_privilege SET related = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1148,3072' WHERE (id = '970');
-UPDATE sys_privilege SET related = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1148,3072' WHERE (id = '1006');
+UPDATE sys_privilege SET related = '971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1007,1009,1010,1148,3072' WHERE (id = '1006');
+
+-- 2024-10-12
+CREATE TABLE scan_paper_type_check (
+  id BIGINT NOT NULL,
+  exam_id BIGINT NOT NULL COMMENT '考试ID',
+  exception_paper_type VARCHAR(32) NOT NULL COMMENT '异常卷型类型',
+  paper_type VARCHAR(10) NOT NULL COMMENT '识别卷型',
+  student_id BIGINT NOT NULL COMMENT '考生ID',
+  paper_index INT NOT NULL COMMENT '试卷页数',
+  paper_id BIGINT NOT NULL COMMENT '试卷ID',
+  card_number INT NOT NULL COMMENT '题卡编号',
+  status VARCHAR(16) NOT NULL COMMENT '状态',
+  user_id BIGINT NULL,
+  creator_id BIGINT NULL COMMENT '创建人',
+  updater_id BIGINT NULL COMMENT '更新人',
+  create_time BIGINT NULL COMMENT '创建时间',
+  update_time BIGINT NULL COMMENT '更新时间',
+  PRIMARY KEY (id))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = utf8mb4
+COLLATE=utf8mb4_general_ci
+COMMENT = '卷型检查记录表';
+
+ ALTER TABLE scan_paper_page 
+ ADD COLUMN paper_type VARCHAR(10) NULL COMMENT '卷型' AFTER recog_data

+ 11 - 9
distributed-print/src/main/java/com/qmth/distributed/print/api/TeachClazzController.java

@@ -33,22 +33,24 @@ import java.util.List;
 @Validated
 //@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class TeachClazzController {
+
     @Resource
     private TeachClazzService teachClazzService;
 
     @ApiOperation(value = "教学班级-查询")
     @RequestMapping(value = "/page", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
-    public Result findTeachClazzPage(@ApiParam(value = "教学课程id", required = true) @RequestParam String teachCourseId,
-                                     @ApiParam(value = "班级名称(模糊查询)") @RequestParam(required = false) String teachClazzName,
-                                     @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
-                                     @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
-        return ResultUtil.ok(teachClazzService.teachClazzPage(SystemConstant.convertIdToLong(teachCourseId), teachClazzName, pageNumber, pageSize));
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Result.class) })
+    public Result findTeachClazzPage(@ApiParam(value = "教学课程id", required = true) @RequestParam String teachCourseId, @ApiParam(value = "班级名称(模糊查询)") @RequestParam(required = false) String teachClazzName,
+            @ApiParam(value = "分页页码", required = true) @RequestParam @Min(SystemConstant.PAGE_NUMBER_MIN) Integer pageNumber,
+            @ApiParam(value = "分页数", required = true) @RequestParam @Min(SystemConstant.PAGE_SIZE_MIN) @Max(SystemConstant.PAGE_SIZE_MAX) Integer pageSize) {
+        return ResultUtil.ok(
+                teachClazzService.teachClazzPage(SystemConstant.convertIdToLong(teachCourseId), teachClazzName,
+                        pageNumber, pageSize));
     }
 
     @ApiOperation(value = "教学班级-选择教学班")
     @RequestMapping(value = "/edit", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "创建成功", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "创建成功", response = EditResult.class) })
     @OperationLogDetail(operationType = OperationTypeEnum.SAVE)
     public Result selectTeachClazz(@Valid @RequestBody TeachClazzParams teachClazzParams, BindingResult bindingResult) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
@@ -61,7 +63,7 @@ public class TeachClazzController {
 
     @ApiOperation(value = "教学班级-批量删除")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "删除成功", response = EditResult.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "删除成功", response = EditResult.class) })
     @OperationLogDetail(operationType = OperationTypeEnum.DELETE)
     public Result deleteTeachClazz(@ApiParam(value = "选择的要删除的班级id集合", required = true) @RequestParam List<Long> idList) {
         return ResultUtil.ok(teachClazzService.deleteTeachClazzBatch(idList));
@@ -69,7 +71,7 @@ public class TeachClazzController {
 
     @ApiOperation(value = "教学班级-查找教学课程")
     @RequestMapping(value = "/find_teach_course", method = RequestMethod.POST)
-    @ApiResponses({@ApiResponse(code = 200, message = "查询成功", response = Result.class)})
+    @ApiResponses({ @ApiResponse(code = 200, message = "查询成功", response = Result.class) })
     public Result findTeachCourse() {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
         return ResultUtil.ok(teachClazzService.findTeachCourseByUserId(requestUser.getId()));

+ 20 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/scan/ExceptionPaperType.java

@@ -0,0 +1,20 @@
+package com.qmth.teachcloud.common.enums.scan;
+
+/**
+ * @Description: 异常卷型类型
+ * @Author: CaoZixuan
+ * @Date: 2024-10-12
+ */
+public enum ExceptionPaperType {
+    NONE("没有识别到卷型"), MULTIPLE("多卷型");;
+
+    private final String name;
+
+    ExceptionPaperType(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 14 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answerbatch/AnswerPage.java

@@ -1,12 +1,13 @@
 package com.qmth.teachcloud.mark.bean.answerbatch;
 
+import com.qmth.teachcloud.mark.bean.ArrayResult;
+import com.qmth.teachcloud.mark.bean.BoolResult;
+import io.swagger.annotations.ApiModelProperty;
+
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 
-import com.qmth.teachcloud.mark.bean.ArrayResult;
-import com.qmth.teachcloud.mark.bean.BoolResult;
-
 public class AnswerPage {
 
     @NotNull(message = "paper.page.index不能为空")
@@ -24,6 +25,9 @@ public class AnswerPage {
 
     private String recogData;
 
+    @ApiModelProperty(value = "卷型(没有识别到为'#',多识别为'AB')")
+    private String paperType;
+
     public Integer getIndex() {
         return index;
     }
@@ -48,7 +52,6 @@ public class AnswerPage {
         this.breach = breach;
     }
 
-
     public ArrayResult getQuestion() {
         return question;
     }
@@ -57,7 +60,6 @@ public class AnswerPage {
         this.question = question;
     }
 
-
     public String getSheetUri() {
         return sheetUri;
     }
@@ -74,4 +76,11 @@ public class AnswerPage {
         this.recogData = recogData;
     }
 
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
 }

+ 1 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/answerbatch/AnswerPaper.java

@@ -77,6 +77,7 @@ public class AnswerPaper {
             page.setBreach(answerPage.getBreach());
             page.setQuestion(answerPage.getQuestion());
             page.setRecogData(answerPage.getRecogData());
+            page.setPaperType(answerPage.getPaperType());
             list.add(page);
         }
         return list;

+ 46 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scanexaminfo/CheckTask.java

@@ -4,24 +4,41 @@ package com.qmth.teachcloud.mark.bean.scanexaminfo;
 public class CheckTask {
 
 	private int unexistCount;//未扫描数量
+
 	private int unexistCheckedCount;//未扫描已处理数量
+
 	private int missScanCount;//漏扫数量
+
 	private int assignedCount;//人工绑定待检查数量
+
 	private int assignedCheckedCount;//人工绑定已检查数量
+
 	private int absentCheckCount;//缺考待检查数量
+
 	private int absentCheckedCount;//缺考已检查数量
+
 	private int objectiveCheckCount;//客观题待检查数量
+
 	private int objectiveCheckedCount;//客观题已检查数量
+
 	private int incompleteCount;//缺页数量
+
+	private int paperTypeCheckCount;//卷型待检查
+
+	private int paperTypeCheckedCount;//卷型已检查数量
+
 	public int getUnexistCount() {
 		return unexistCount;
 	}
+
 	public void setUnexistCount(int unexistCount) {
 		this.unexistCount = unexistCount;
 	}
+
 	public int getUnexistCheckedCount() {
 		return unexistCheckedCount;
 	}
+
 	public void setUnexistCheckedCount(int unexistCheckedCount) {
 		this.unexistCheckedCount = unexistCheckedCount;
 	}
@@ -37,44 +54,72 @@ public class CheckTask {
 	public int getAssignedCount() {
 		return assignedCount;
 	}
+
 	public void setAssignedCount(int assignedCount) {
 		this.assignedCount = assignedCount;
 	}
+
 	public int getAssignedCheckedCount() {
 		return assignedCheckedCount;
 	}
+
 	public void setAssignedCheckedCount(int assignedCheckedCount) {
 		this.assignedCheckedCount = assignedCheckedCount;
 	}
+
 	public int getAbsentCheckCount() {
 		return absentCheckCount;
 	}
+
 	public void setAbsentCheckCount(int absentCheckCount) {
 		this.absentCheckCount = absentCheckCount;
 	}
+
 	public int getAbsentCheckedCount() {
 		return absentCheckedCount;
 	}
+
 	public void setAbsentCheckedCount(int absentCheckedCount) {
 		this.absentCheckedCount = absentCheckedCount;
 	}
+
 	public int getObjectiveCheckCount() {
 		return objectiveCheckCount;
 	}
+
 	public void setObjectiveCheckCount(int objectiveCheckCount) {
 		this.objectiveCheckCount = objectiveCheckCount;
 	}
+
 	public int getObjectiveCheckedCount() {
 		return objectiveCheckedCount;
 	}
+
 	public void setObjectiveCheckedCount(int objectiveCheckedCount) {
 		this.objectiveCheckedCount = objectiveCheckedCount;
 	}
+
 	public int getIncompleteCount() {
 		return incompleteCount;
 	}
+
 	public void setIncompleteCount(int incompleteCount) {
 		this.incompleteCount = incompleteCount;
 	}
-	
+
+	public int getPaperTypeCheckCount() {
+		return paperTypeCheckCount;
+	}
+
+	public void setPaperTypeCheckCount(int paperTypeCheckCount) {
+		this.paperTypeCheckCount = paperTypeCheckCount;
+	}
+
+	public int getPaperTypeCheckedCount() {
+		return paperTypeCheckedCount;
+	}
+
+	public void setPaperTypeCheckedCount(int paperTypeCheckedCount) {
+		this.paperTypeCheckedCount = paperTypeCheckedCount;
+	}
 }

+ 15 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/ScanPaperPage.java

@@ -1,9 +1,5 @@
 package com.qmth.teachcloud.mark.entity;
 
-import java.io.Serializable;
-
-import org.apache.commons.collections4.CollectionUtils;
-
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
@@ -12,8 +8,11 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
 import com.qmth.teachcloud.mark.bean.ArrayResult;
 import com.qmth.teachcloud.mark.bean.BoolResult;
-
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.collections4.CollectionUtils;
+
+import java.io.Serializable;
 
 /**
  * <p>
@@ -41,6 +40,9 @@ public class ScanPaperPage implements Serializable {
 	@TableField(value = "breach", typeHandler = JacksonTypeHandler.class)
 	private BoolResult breach;
 
+	@ApiModelProperty("识别卷型")
+	private String paperType;
+
 	@TableField(value = "question", typeHandler = JacksonTypeHandler.class)
 	private ArrayResult question;
 
@@ -93,6 +95,14 @@ public class ScanPaperPage implements Serializable {
 		this.breach = breach;
 	}
 
+	public String getPaperType() {
+		return paperType;
+	}
+
+	public void setPaperType(String paperType) {
+		this.paperType = paperType;
+	}
+
 	public ArrayResult getQuestion() {
 		return question;
 	}

+ 160 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/ScanPaperTypeCheck.java

@@ -0,0 +1,160 @@
+package com.qmth.teachcloud.mark.entity;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.enums.scan.ExceptionPaperType;
+import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 卷型检查记录表
+ * </p>
+ *
+ * @author CaoZixuan
+ * @since 2024-10-12
+ */
+@ApiModel(value="ScanPaperTypeCheck对象", description="卷型检查记录表")
+public class ScanPaperTypeCheck {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    @ApiModelProperty(value = "考试ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long examId;
+
+    @ApiModelProperty(value = "异常卷型类型")
+    private ExceptionPaperType exceptionPaperType;
+
+    @ApiModelProperty(value = "识别卷型")
+    private String paperType;
+
+    @ApiModelProperty(value = "考生ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long studentId;
+
+    @ApiModelProperty(value = "试卷页数")
+    private Integer paperIndex;
+
+    @ApiModelProperty(value = "试卷ID")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long paperId;
+
+    @ApiModelProperty(value = "题卡编号")
+    private Integer cardNumber;
+
+    @ApiModelProperty(value = "状态")
+    private OmrTaskStatus status;
+
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long userId;
+
+    @ApiModelProperty(value = "创建人")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long creatorId;
+
+    @ApiModelProperty(value = "更新人")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long updaterId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public ExceptionPaperType getExceptionPaperType() {
+        return exceptionPaperType;
+    }
+
+    public void setExceptionPaperType(ExceptionPaperType exceptionPaperType) {
+        this.exceptionPaperType = exceptionPaperType;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public Integer getPaperIndex() {
+        return paperIndex;
+    }
+
+    public void setPaperIndex(Integer paperIndex) {
+        this.paperIndex = paperIndex;
+    }
+
+    public Long getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
+    public Integer getCardNumber() {
+        return cardNumber;
+    }
+
+    public void setCardNumber(Integer cardNumber) {
+        this.cardNumber = cardNumber;
+    }
+
+    public OmrTaskStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(OmrTaskStatus status) {
+        this.status = status;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getCreatorId() {
+        return creatorId;
+    }
+
+    public void setCreatorId(Long creatorId) {
+        this.creatorId = creatorId;
+    }
+
+    public Long getUpdaterId() {
+        return updaterId;
+    }
+
+    public void setUpdaterId(Long updaterId) {
+        this.updaterId = updaterId;
+    }
+}

+ 31 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/ScanPaperTypeCheckMapper.java

@@ -0,0 +1,31 @@
+package com.qmth.teachcloud.mark.mapper;
+
+import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.mark.entity.ScanPaperTypeCheck;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 卷型检查记录表 Mapper 接口
+ * </p>
+ *
+ * @author CaoZixuan
+ * @since 2024-10-12
+ */
+public interface ScanPaperTypeCheckMapper extends BaseMapper<ScanPaperTypeCheck> {
+
+    /**
+     * 卷型检查数量
+     *
+     * @param examId        考试id
+     * @param courseId      课程id
+     * @param coursePaperId 试卷id
+     * @param status        处理状态
+     * @param dpr           数据权限
+     * @return 数量
+     */
+    int getPaperTypeCheckCount(@Param("examId") Long examId, @Param("courseId") Long courseId, @Param("coursePaperId") String coursePaperId, @Param("status") OmrTaskStatus status,
+            @Param("dpr") DataPermissionRule dpr);
+}

+ 30 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanPaperTypeCheckService.java

@@ -0,0 +1,30 @@
+package com.qmth.teachcloud.mark.service;
+
+import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.mark.entity.ScanPaperTypeCheck;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
+
+/**
+ * <p>
+ * 卷型检查记录表 服务类
+ * </p>
+ *
+ * @author CaoZixuan
+ * @since 2024-10-12
+ */
+public interface ScanPaperTypeCheckService extends IService<ScanPaperTypeCheck> {
+
+    /**
+     * 卷型检查数量
+     *
+     * @param examId        考试id
+     * @param courseId      课程id
+     * @param coursePaperId 试卷id
+     * @param status        处理状态
+     * @param dpr           数据权限
+     * @return 数量
+     */
+    int getPaperTypeCheckCount(Long examId, Long courseId, String coursePaperId, OmrTaskStatus status,
+            DataPermissionRule dpr);
+}

+ 53 - 14
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -29,6 +29,7 @@ import com.qmth.teachcloud.common.enums.PageSizeEnum;
 import com.qmth.teachcloud.common.enums.ScanStatus;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
+import com.qmth.teachcloud.common.enums.scan.ExceptionPaperType;
 import com.qmth.teachcloud.common.service.BasicCourseService;
 import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
 import com.qmth.teachcloud.common.service.FileUploadService;
@@ -167,6 +168,8 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     private ScanBatchPaperService scanBatchPaperService;
     @Resource
     private BasicCourseService basicCourseService;
+    @Resource
+    private ScanPaperTypeCheckService scanPaperTypeCheckService;
 
     @Override
     public List<String> listClassByExamIdAndCourseCode(Long examId, String paperNumber) {
@@ -499,24 +502,25 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         vo.setId(exam.getId());
         vo.setName(exam.getName());
         CheckTask ct = vo.getCheckTask();
-        ct.setUnexistCount(
-                getCount(examId, ScanStatus.UNEXIST, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
+        ct.setUnexistCount(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.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));
-        ct.setAbsentCheckCount(
-                getOmrAbsentCount(examId, false, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
-        ct.setAbsentCheckedCount(
-                getOmrAbsentCount(examId, true, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
-        ct.setObjectiveCheckCount(scanOmrTaskService.getFinishStudentCountByExamAndUserId(examId, courseId, coursePaperId,
-                OmrTaskStatus.WAITING.name(), dpr));
-        ct.setObjectiveCheckedCount(scanOmrTaskService.getFinishStudentCountByExamAndUserId(examId, courseId, coursePaperId,
-                OmrTaskStatus.PROCESSED.name(), dpr));
+        ct.setAbsentCheckCount(getOmrAbsentCount(examId, false, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
+        ct.setAbsentCheckedCount(getOmrAbsentCount(examId, true, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
+        ct.setObjectiveCheckCount(
+                scanOmrTaskService.getFinishStudentCountByExamAndUserId(examId, courseId, coursePaperId, OmrTaskStatus.WAITING.name(), dpr));
+        ct.setObjectiveCheckedCount(
+                scanOmrTaskService.getFinishStudentCountByExamAndUserId(examId, courseId, coursePaperId, OmrTaskStatus.PROCESSED.name(), dpr));
         ct.setIncompleteCount(getIncompleteCount(examId, courseId, coursePaperId, MarkPaperStatus.FORMAL, dpr));
+
+        ct.setPaperTypeCheckCount(
+                scanPaperTypeCheckService.getPaperTypeCheckCount(examId, courseId, coursePaperId, OmrTaskStatus.WAITING, dpr));
+        ct.setPaperTypeCheckedCount(
+                scanPaperTypeCheckService.getPaperTypeCheckCount(examId, courseId, coursePaperId, OmrTaskStatus.PROCESSED, dpr));
         return vo;
     }
 
@@ -559,12 +563,47 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                     student.setObjectiveScoreList(null);
                 }
                 // student.setDevice(batchService.findByPaperId(paper.getId()).getDevice());
+                ExceptionPaperType exceptionPaperType = null;
+                // 根据卷型识别结果更新考生卷型,如果卷型识别结果异常则添加到卷型检查中
+                String paperType = page.getPaperType();
+                student.setPaperType(paperType);
+                if (!SystemConstant.strNotNull(paperType)) {
+                    // 卷型为空
+                    exceptionPaperType = ExceptionPaperType.NONE;
+                } else if (!paperType.matches("[A-Z#]+")) {
+                    // 未识别到卷型
+                    exceptionPaperType = ExceptionPaperType.NONE;
+                } else if (paperType.length() > 1) {
+                    // 多卷型
+                    exceptionPaperType = ExceptionPaperType.MULTIPLE;
+                } else if ("#".equals(paperType)) {
+                    // 没有识别到卷型
+                    exceptionPaperType = ExceptionPaperType.NONE;
+                }
+
+                scanPaperTypeCheckService.remove(new QueryWrapper<ScanPaperTypeCheck>().lambda().eq(ScanPaperTypeCheck::getStudentId, student.getId()));
+                if (Objects.nonNull(exceptionPaperType)) {
+                    ScanPaperTypeCheck check = new ScanPaperTypeCheck();
+
+                    check.setExamId(paper.getExamId());
+                    check.setExceptionPaperType(exceptionPaperType);
+                    check.setPaperType(paperType);
+                    check.setStudentId(studentId);
+                    check.setPaperIndex(1);
+                    check.setPaperId(paper.getId());
+                    check.setCardNumber(paper.getCardNumber());
+                    check.setStatus(OmrTaskStatus.WAITING);
+                    check.setUserId(userId);
+                    check.setId(SystemConstant.getDbUuid());
+                    check.setCreatorId(userId);
+
+                    scanPaperTypeCheckService.save(check);
+                }
             }
 
             List<ScanPaperPage> scanPaperPages = scanPaperPageService.listByPaperId(studentPaper.getPaperId());
             for (ScanPaperPage scanPaperPage : scanPaperPages) {
-                if (scanPaperPage.getQuestion() != null
-                        && CollectionUtils.isNotEmpty(scanPaperPage.getQuestion().getResult())) {
+                if (scanPaperPage.getQuestion() != null && CollectionUtils.isNotEmpty(scanPaperPage.getQuestion().getResult())) {
                     for (String s : scanPaperPage.getQuestion().getResult()) {
                         if (s.startsWith("?")) {
                             s = s.replace("?", "");

+ 27 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPaperTypeCheckServiceImpl.java

@@ -0,0 +1,27 @@
+package com.qmth.teachcloud.mark.service.impl;
+
+import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
+import com.qmth.teachcloud.mark.entity.ScanPaperTypeCheck;
+import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
+import com.qmth.teachcloud.mark.mapper.ScanPaperTypeCheckMapper;
+import com.qmth.teachcloud.mark.service.ScanPaperTypeCheckService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 卷型检查记录表 服务实现类
+ * </p>
+ *
+ * @author CaoZixuan
+ * @since 2024-10-12
+ */
+@Service
+public class ScanPaperTypeCheckServiceImpl extends ServiceImpl<ScanPaperTypeCheckMapper, ScanPaperTypeCheck> implements ScanPaperTypeCheckService {
+
+    @Override
+    public int getPaperTypeCheckCount(Long examId, Long courseId, String coursePaperId, OmrTaskStatus status,
+            DataPermissionRule dpr) {
+        return baseMapper.getPaperTypeCheckCount(examId, courseId, coursePaperId, status, dpr);
+    }
+}

+ 38 - 0
teachcloud-mark/src/main/resources/mapper/ScanPaperTypeCheckMapper.xml

@@ -0,0 +1,38 @@
+<?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="com.qmth.teachcloud.mark.mapper.ScanPaperTypeCheckMapper">
+
+    <select id="getPaperTypeCheckCount" resultType="java.lang.Integer">
+        SELECT
+            COUNT(1)
+        FROM
+            scan_paper_type_check sptc
+                LEFT JOIN
+            mark_student ms ON sptc.student_id = ms.id
+                LEFT JOIN
+            basic_course bc ON ms.course_id = bc.id
+            <if test="dpr != null and dpr.orgIdSet != null and dpr.orgIdSet != '' and dpr.orgIdSet.size > 0">
+                AND bc.teaching_room_id IN
+                <foreach collection="dpr.orgIdSet" item="item" index="index" open="(" separator="," close=")">
+                    #{item}
+                </foreach>
+            </if>
+        <where>
+            <if test="examId != null">
+                and sptc.exam_id = #{examId}
+            </if>
+            <if test="status != null">
+                and sptc.status = #{status}
+            </if>
+            <if test="courseId != null">
+                and bc.id = #{courseId}
+            </if>
+            <if test="coursePaperId != null and coursePaperId != ''">
+                and ms.course_paper_id = #{coursePaperId}
+            </if>
+            <if test="dpr != null and dpr.requestUserId != null">
+                AND sptc.creator_id = #{dpr.requestUserId}
+            </if>
+        </where>
+    </select>
+</mapper>