浏览代码

修改答题卡扫描图片绑定考生

xiatian 1 年之前
父节点
当前提交
1f45de22c1

+ 14 - 8
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/ScanAnswerController.java

@@ -1,9 +1,5 @@
 package com.qmth.distributed.print.api.mark;
 
-import java.util.List;
-
-import com.qmth.teachcloud.common.util.Result;
-import com.qmth.teachcloud.common.util.ResultUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -13,20 +9,22 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import com.qmth.teachcloud.mark.bean.UpdateTimeVo;
 import com.qmth.teachcloud.mark.bean.omredit.OmrEditDomain;
+import com.qmth.teachcloud.mark.bean.papermigrate.PaperMigrateDomain;
+import com.qmth.teachcloud.mark.bean.papermigrate.PaperMigrateVo;
 import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryDomain;
-import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryVo;
 import com.qmth.teachcloud.mark.bean.scananswer.SheetUploadVo;
 import com.qmth.teachcloud.mark.dto.refix.AnswerRefixDomain;
-import com.qmth.teachcloud.mark.dto.refix.AnswerRefixVo;
 import com.qmth.teachcloud.mark.service.MarkStudentService;
 import com.qmth.teachcloud.mark.service.ScanBatchService;
+import com.qmth.teachcloud.mark.service.ScanPaperService;
 import com.qmth.teachcloud.mark.service.ScanRefixBatchService;
 
 import io.swagger.annotations.Api;
@@ -50,7 +48,8 @@ public class ScanAnswerController {
 	
 	@Autowired
 	private ScanBatchService scanBatchService;
-	
+	@Autowired
+	private ScanPaperService scanPaperService;
 	@Autowired
 	private MarkStudentService markStudentService;
 
@@ -87,4 +86,11 @@ public class ScanAnswerController {
     	SysUser user = (SysUser) ServletUtil.getRequestUser();
         return markStudentService.omrEdit(user.getId(),domain);
     }
+    
+    @ApiOperation(value = "修改答题卡扫描图片绑定考生")
+    @RequestMapping(value = "paper/migrate", method = RequestMethod.POST)
+    public PaperMigrateVo paperMigrate(@Validated @RequestBody PaperMigrateDomain domain) {
+    	SysUser user = (SysUser) ServletUtil.getRequestUser();
+        return scanPaperService.paperMigrate(user, domain);
+    }
 }

+ 86 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/papermigrate/PaperMigrateDomain.java

@@ -0,0 +1,86 @@
+package com.qmth.teachcloud.mark.bean.papermigrate;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+public class PaperMigrateDomain {
+
+    @NotNull(message = "paperId不能为空")
+    private Long paperId;
+
+    @NotNull(message = "考试ID不能为空")
+    private Long examId;
+
+    @NotBlank(message = "coursePaperId不能为空")
+    private String coursePaperId;
+    
+    @NotBlank(message = "studentCode不能为空")
+    private String studentCode;
+    
+    @NotNull(message = "paperNumber不能为空")
+    private Integer paperNumber;
+
+    @NotNull(message = "cardNumber不能为空")
+    private Integer cardNumber;
+
+    private List<PaperMigratePage> pages;
+
+    public Long getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+
+    public String getCoursePaperId() {
+		return coursePaperId;
+	}
+
+	public void setCoursePaperId(String coursePaperId) {
+		this.coursePaperId = coursePaperId;
+	}
+
+	public String getStudentCode() {
+		return studentCode;
+	}
+
+	public void setStudentCode(String studentCode) {
+		this.studentCode = studentCode;
+	}
+
+	public Integer getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(Integer paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Integer getCardNumber() {
+        return cardNumber;
+    }
+
+    public void setCardNumber(Integer cardNumber) {
+        this.cardNumber = cardNumber;
+    }
+
+    public List<PaperMigratePage> getPages() {
+        return pages;
+    }
+
+    public void setPages(List<PaperMigratePage> pages) {
+        this.pages = pages;
+    }
+
+}

+ 86 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/papermigrate/PaperMigratePage.java

@@ -0,0 +1,86 @@
+package com.qmth.teachcloud.mark.bean.papermigrate;
+
+import java.util.List;
+
+import com.qmth.boot.core.exception.ParameterException;
+import com.qmth.teachcloud.mark.bean.ArrayResult;
+import com.qmth.teachcloud.mark.bean.BoolResult;
+import com.qmth.teachcloud.mark.entity.ScanPaperPage;
+
+public class PaperMigratePage {
+
+    private Integer index;
+
+    private List<String> sheetUri;
+
+    private BoolResult absent;
+
+    private BoolResult breach;
+
+
+    private ArrayResult question;
+
+
+    private String recogData;
+
+    public Integer getIndex() {
+        return index;
+    }
+
+    public void setIndex(Integer index) {
+        this.index = index;
+    }
+
+    public BoolResult getAbsent() {
+        return absent;
+    }
+
+    public void setAbsent(BoolResult absent) {
+        this.absent = absent;
+    }
+
+    public BoolResult getBreach() {
+        return breach;
+    }
+
+    public void setBreach(BoolResult breach) {
+        this.breach = breach;
+    }
+
+
+    public ArrayResult getQuestion() {
+        return question;
+    }
+
+    public void setQuestion(ArrayResult question) {
+        this.question = question;
+    }
+
+
+    public List<String> getSheetUri() {
+		return sheetUri;
+	}
+
+	public void setSheetUri(List<String> sheetUri) {
+		this.sheetUri = sheetUri;
+	}
+
+	public String getRecogData() {
+        return recogData;
+    }
+
+    public void setRecogData(String recogData) {
+        this.recogData = recogData;
+    }
+
+    public ScanPaperPage update(ScanPaperPage page) {
+        if (page == null) {
+            throw new ParameterException("找不到对应的page信息, pageIndex=" + index);
+        }
+        page.setAbsent(absent);
+        page.setBreach(breach);
+        page.setQuestion(question);
+        page.setRecogData(recogData);
+        return page;
+    }
+}

+ 32 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/papermigrate/PaperMigrateVo.java

@@ -0,0 +1,32 @@
+package com.qmth.teachcloud.mark.bean.papermigrate;
+
+public class PaperMigrateVo {
+
+    private Long paperId;
+
+    private Long updateTime;
+
+    public static PaperMigrateVo create(Long paperId) {
+        PaperMigrateVo vo = new PaperMigrateVo();
+        vo.setPaperId(paperId);
+        vo.setUpdateTime(System.currentTimeMillis());
+        return vo;
+    }
+
+    public Long getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
+}

+ 10 - 4
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanPaperService.java

@@ -1,15 +1,17 @@
 package com.qmth.teachcloud.mark.service;
 
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.mark.bean.papermigrate.PaperMigrateDomain;
+import com.qmth.teachcloud.mark.bean.papermigrate.PaperMigrateVo;
 import com.qmth.teachcloud.mark.bean.scananswer.StudentPaperVo;
 import com.qmth.teachcloud.mark.bean.scanpaper.PaperVo;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
 import com.qmth.teachcloud.mark.entity.ScanPaper;
 import com.qmth.teachcloud.mark.entity.ScanPaperPage;
 
-import java.util.List;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-
 /**
  * <p>
  *  服务类
@@ -31,4 +33,8 @@ public interface ScanPaperService extends IService<ScanPaper> {
 	List<PaperVo> findStudentPaper(Long studentId);
 
 	List<StudentPaperVo> listByStudentIds(List<Long> paramList);
+
+	PaperMigrateVo paperMigrate(SysUser user, PaperMigrateDomain domain);
+
+	boolean updateMismatch(Long id, boolean mismatch);
 }

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

@@ -22,6 +22,8 @@ public interface ScanStudentPaperService extends IService<ScanStudentPaper> {
 	ScanStudentPaper findByPaperId(Long paperId);
 
 	void removeByStudentId(@NotNull Long studentId);
+	
+	void removeByStudentIdAndPaperId(@NotNull Long studentId,@NotNull Long paperId);
 
 	ScanStudentPaper findByStudentIdAndPaperNumber(Long studentId, Integer number);
 

+ 212 - 64
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPaperServiceImpl.java

@@ -1,27 +1,43 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.validation.constraints.NotNull;
 
+import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 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.extension.service.impl.ServiceImpl;
+import com.qmth.boot.core.concurrent.service.ConcurrentService;
+import com.qmth.boot.core.exception.ParameterException;
+import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.mark.bean.papermigrate.PaperMigrateDomain;
+import com.qmth.teachcloud.mark.bean.papermigrate.PaperMigratePage;
+import com.qmth.teachcloud.mark.bean.papermigrate.PaperMigrateVo;
 import com.qmth.teachcloud.mark.bean.scananswer.StudentPaperVo;
 import com.qmth.teachcloud.mark.bean.scanpaper.PaperVo;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
+import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.entity.ScanAnswerCard;
 import com.qmth.teachcloud.mark.entity.ScanPaper;
 import com.qmth.teachcloud.mark.entity.ScanPaperPage;
+import com.qmth.teachcloud.mark.entity.ScanStudentPaper;
+import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.mapper.ScanPaperMapper;
+import com.qmth.teachcloud.mark.service.MarkStudentService;
 import com.qmth.teachcloud.mark.service.ScanAnswerCardService;
+import com.qmth.teachcloud.mark.service.ScanAnswerCardSubjectService;
 import com.qmth.teachcloud.mark.service.ScanPaperPageService;
 import com.qmth.teachcloud.mark.service.ScanPaperService;
+import com.qmth.teachcloud.mark.service.ScanStudentPaperService;
 
 /**
  * <p>
@@ -33,79 +49,211 @@ import com.qmth.teachcloud.mark.service.ScanPaperService;
  */
 @Service
 public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper> implements ScanPaperService {
-    @Autowired
-    private ScanAnswerCardService answerCardService;
-    @Autowired
-    private ScanPaperPageService paperPageService;
+	@Autowired
+	private ScanAnswerCardService answerCardService;
+	@Autowired
+	private ScanPaperPageService paperPageService;
+	@Autowired
+	private MarkStudentService markStudentService;
+	@Autowired
+	private ConcurrentService concurrentService;
+	@Autowired
+	private ScanStudentPaperService scanStudentPaperService;
+	@Autowired
+	private ScanAnswerCardSubjectService scanAnswerCardSubjectService;
+
 	/**
-     * 全量更新paper和所属的page集合,并刷新paper相关属性
-     *
-     * @param paper
-     * @param pages
-     */
-    @Override
-    @Transactional
-    public void savePaperAndPages(@NotNull ScanPaper paper,@NotNull List<ScanPaperPage> pages ) {
-        // 与卡格式校验
-        ScanAnswerCard answerCard = answerCardService.findByExamAndNumber(paper.getExamId(), paper.getCardNumber());
-        if (answerCard == null) {
-        	throw ExceptionResultEnum.ERROR.exception("卡格式不存在, cardNumber=" + paper.getCardNumber());
-        }
-        if (pages.size() != (answerCard.getSinglePage() ? 1 : 2)) {
-        	throw ExceptionResultEnum.ERROR.exception("paper.page数量与卡格式不符, cardNumber=" + paper.getCardNumber());
-        }
-        // 更新paper属性
-        paper.setPageCount(pages.size());
-        paper.setQuestionFilled(false);
-        // 判断是否客观题已填涂
-        for (ScanPaperPage page : pages) {
-            paper.setQuestionFilled(paper.getQuestionFilled() || page.isQuestionFilled());
-        }
-        // 保存paper数据
-        saveOrUpdate(paper);
-        for (ScanPaperPage page : pages) {
-        	//FIXME 
-            // 验证原图与裁切图已上传
+	 * 全量更新paper和所属的page集合,并刷新paper相关属性
+	 *
+	 * @param paper
+	 * @param pages
+	 */
+	@Override
+	@Transactional
+	public void savePaperAndPages(@NotNull ScanPaper paper, @NotNull List<ScanPaperPage> pages) {
+		// 与卡格式校验
+		ScanAnswerCard answerCard = answerCardService.findByExamAndNumber(paper.getExamId(), paper.getCardNumber());
+		if (answerCard == null) {
+			throw ExceptionResultEnum.ERROR.exception("卡格式不存在, cardNumber=" + paper.getCardNumber());
+		}
+		if (pages.size() != (answerCard.getSinglePage() ? 1 : 2)) {
+			throw ExceptionResultEnum.ERROR.exception("paper.page数量与卡格式不符, cardNumber=" + paper.getCardNumber());
+		}
+		// 更新paper属性
+		paper.setPageCount(pages.size());
+		paper.setQuestionFilled(false);
+		// 判断是否客观题已填涂
+		for (ScanPaperPage page : pages) {
+			paper.setQuestionFilled(paper.getQuestionFilled() || page.isQuestionFilled());
+		}
+		// 保存paper数据
+		saveOrUpdate(paper);
+		for (ScanPaperPage page : pages) {
+			// FIXME
+			// 验证原图与裁切图已上传
 //            if (!fileStore.exist(page.getSheetPath())) {
 //            	throw ExceptionResultEnum.ERROR.exception("原图不存在:" + page.getSheetPath());
 //            }
-            page.setPaperId(paper.getId());
-        }
-        // 保存page数据
-        paperPageService.saveOrUpdateBatch(pages);
-    }
+			page.setPaperId(paper.getId());
+		}
+		// 保存page数据
+		paperPageService.saveOrUpdateBatch(pages);
+	}
 
-    @Override
-    public int getAssignedCount(Long examId,Boolean checked) {
+	@Override
+	public int getAssignedCount(Long examId, Boolean checked) {
 		QueryWrapper<ScanPaper> wrapper = new QueryWrapper<>();
-        LambdaQueryWrapper<ScanPaper> lw = wrapper.lambda();
-        lw.eq(ScanPaper::getExamId, examId);
-        lw.eq(ScanPaper::getAssigned, true);
-        if(checked!=null) {
-        	lw.eq(ScanPaper::getAssignConfirmed, checked);
-        }
-        return baseMapper.selectCount(wrapper);
+		LambdaQueryWrapper<ScanPaper> lw = wrapper.lambda();
+		lw.eq(ScanPaper::getExamId, examId);
+		lw.eq(ScanPaper::getAssigned, true);
+		if (checked != null) {
+			lw.eq(ScanPaper::getAssignConfirmed, checked);
+		}
+		return baseMapper.selectCount(wrapper);
 	}
 
-    @Override
-    public List<StudentPaperDetailDto> listStudentPaperDetail(Long studentId) {
-        return this.baseMapper.listStudentPaperDetail(studentId);
-    }
+	@Override
+	public List<StudentPaperDetailDto> listStudentPaperDetail(Long studentId) {
+		return this.baseMapper.listStudentPaperDetail(studentId);
+	}
 
+	@Override
+	public int getCountByExamAndCardNumber(Long examId, Integer number) {
+		LambdaQueryWrapper<ScanPaper> lw = new LambdaQueryWrapper<>();
+		lw.eq(ScanPaper::getExamId, examId);
+		lw.eq(ScanPaper::getCardNumber, number);
+		return this.count(lw);
+	}
+
+	@Override
+	public List<PaperVo> findStudentPaper(Long studentId) {
+		return baseMapper.findStudentPaper(studentId);
+	}
+
+	@Override
+	public List<StudentPaperVo> listByStudentIds(List<Long> paramList) {
+		return baseMapper.listByStudentIds(paramList);
+	}
+
+	@Transactional
+	@Override
+	public PaperMigrateVo paperMigrate(SysUser user, PaperMigrateDomain domain) {
+		// 查找修改paper
+		ScanPaper paper = getById(domain.getPaperId());
+		if (paper == null) {
+			throw new ParameterException("题卡信息未找到, paperId=" + domain.getPaperId());
+		}
+		// 查找目标考生
+		MarkStudent student = markStudentService.findByExamIdAndCoursePaperIdAndStudentCode(domain.getExamId(),
+				domain.getCoursePaperId(), domain.getStudentCode());
+		if (student == null) {
+			throw new ParameterException("考生信息未找到");
+		}
+		// 目标考生已扫描时,输入卡格式需要保持一致
+		if (student.getCardNumber() != null && !student.getCardNumber().equals(domain.getCardNumber())) {
+			throw new ParameterException("卡格式与目标考生不一致");
+		}
+		// 校验卡格式
+		ScanAnswerCard answerCard = answerCardService.findByExamAndNumber(domain.getExamId(), domain.getCardNumber());
+		if (answerCard == null) {
+			throw new ParameterException("卡格式信息未找到");
+		}
+		// 验证卡格式所属科目
+		boolean allowSubject = scanAnswerCardSubjectService.checkSubject(answerCard.getExamId(), answerCard.getNumber(),
+				student.getCoursePaperId());
+		if (!allowSubject) {
+			throw new ParameterException("卡格式与考生科目不一致");
+		}
+		// cardNumber或paperNumber有变化,都需要重新识别
+		if ((!paper.getNumber().equals(domain.getPaperNumber())
+				|| !paper.getCardNumber().equals(domain.getCardNumber()))
+				&& CollectionUtils.isEmpty(domain.getPages())) {
+			throw new ParameterException("卡格式有变化需要重新识别, pages信息不能为空");
+		}
+		// 指定paper现有绑定考生
+		MarkStudent previousStudent = null;
+		ScanStudentPaper previousStudentPaper = scanStudentPaperService.findByPaperId(domain.getPaperId());
+		if (previousStudentPaper != null) {
+			// 考生没变,张数也没变
+			if (previousStudentPaper.getStudentId().equals(student.getId())
+					&& previousStudentPaper.getPaperIndex().equals(domain.getPaperNumber())) {
+				throw new ParameterException("该题卡已绑定该考生");
+			}
+			// 考生ID变了才需要获取原考生
+			if (!previousStudentPaper.getStudentId().equals(student.getId())) {
+				previousStudent = markStudentService.getById(previousStudentPaper.getStudentId());
+			}
+		}
+		if (previousStudent != null) {
+			concurrentService.getReadWriteLock(LockType.STUDENT + "-" + previousStudent.getId()).writeLock().lock();
+		}
+		concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().lock();
+		try {
+			if (previousStudentPaper != null) {
+				// 解绑paper和原有考生
+				if (previousStudent != null) {
+					List<ScanStudentPaper> studentPaperList = scanStudentPaperService
+							.findByStudentId(previousStudent.getId()).stream()
+							.filter(entity -> !entity.getPaperId().equals(previousStudentPaper.getPaperId()))
+							.collect(Collectors.toList());
+					markStudentService.updateStudentAndPaper(user, previousStudent.getId(), studentPaperList);
+				}
+				// 考生没变,直接解绑paper
+				else {
+					scanStudentPaperService.removeByStudentIdAndPaperId(previousStudentPaper.getStudentId(),
+							previousStudentPaper.getPaperId());
+				}
+			}
+			// 更新paper属性
+			paper.setCardNumber(domain.getCardNumber());
+			paper.setNumber(domain.getPaperNumber());
+			// 修改的paper强制置为人工绑定
+			paper.setAssigned(true);
+			// 原有mismatch标记需要清除
+			paper.setMismatch(false);
+			paper.setUpdaterId(user.getId());
+			paper.setUpdateTime(System.currentTimeMillis());
+			if (CollectionUtils.isNotEmpty(domain.getPages())) {
+				// 重新识别时更新所有page
+				List<ScanPaperPage> pages = new ArrayList<>();
+				for (PaperMigratePage page : domain.getPages()) {
+					pages.add(page.update(paperPageService.findPaperIdAndIndex(paper.getId(), page.getIndex())));
+				}
+				savePaperAndPages(paper, pages);
+			} else {
+				saveOrUpdate(paper);
+			}
+			// 查找目标考生现有绑定paper
+			boolean exist = false;
+			List<ScanStudentPaper> currentStudentPaperList = scanStudentPaperService.findByStudentId(student.getId());
+			for (ScanStudentPaper current : currentStudentPaperList) {
+				if (current.getPaperIndex().equals(paper.getNumber())) {
+					exist = true;
+					updateMismatch(current.getPaperId(), true);
+					current.setPaperId(paper.getId());
+				}
+			}
+			if (!exist) {
+				currentStudentPaperList.add(new ScanStudentPaper(student.getId(), paper.getNumber(), paper.getId()));
+			}
+			// 更新目标考生状态
+			markStudentService.updateStudentAndPaper(user, student.getId(), currentStudentPaperList);
+			// 返回数据结果
+			return PaperMigrateVo.create(domain.getPaperId());
+		} finally {
+			concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().unlock();
+			if (previousStudent != null) {
+				concurrentService.getReadWriteLock(LockType.STUDENT + "-" + previousStudent.getId()).writeLock()
+						.unlock();
+			}
+		}
+	}
     @Override
-    public int getCountByExamAndCardNumber(Long examId, Integer number) {
-        LambdaQueryWrapper<ScanPaper> lw = new LambdaQueryWrapper<>();
-        lw.eq(ScanPaper::getExamId, examId);
-        lw.eq(ScanPaper::getCardNumber, number);
-        return this.count(lw);
-    }
-    @Override
-    public List<PaperVo> findStudentPaper(Long studentId) {
-        return baseMapper.findStudentPaper(studentId);
-    }
-    
-    @Override
-    public List<StudentPaperVo> listByStudentIds(List<Long> paramList) {
-        return baseMapper.listByStudentIds(paramList);
+    @Transactional
+    public boolean updateMismatch(Long id, boolean mismatch) {
+        LambdaUpdateWrapper<ScanPaper> lw = new LambdaUpdateWrapper<>();
+        lw.set(ScanPaper::getMismatch, mismatch);
+        lw.eq(ScanPaper::getId, id);
+        return this.update(lw);
     }
 }

+ 12 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanStudentPaperServiceImpl.java

@@ -2,6 +2,8 @@ package com.qmth.teachcloud.mark.service.impl;
 
 import java.util.List;
 
+import javax.validation.constraints.NotNull;
+
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -58,4 +60,14 @@ public class ScanStudentPaperServiceImpl extends ServiceImpl<ScanStudentPaperMap
         lw.eq(ScanStudentPaper::getPaperIndex, paperNumber);
         return baseMapper.selectOne(wrapper);
     }
+
+    @Transactional
+	@Override
+	public void removeByStudentIdAndPaperId(@NotNull Long studentId, @NotNull Long paperId) {
+		QueryWrapper<ScanStudentPaper> wrapper = new QueryWrapper<>();
+        LambdaQueryWrapper<ScanStudentPaper> lw = wrapper.lambda();
+        lw.eq(ScanStudentPaper::getStudentId, studentId);
+        lw.eq(ScanStudentPaper::getPaperId, paperId);
+        this.baseMapper.delete(wrapper);
+	}
 }