Преглед на файлове

人工绑定改为考生整个绑定

xiatian преди 1 година
родител
ревизия
eee6f587c9

+ 20 - 41
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/papermigrate/PaperMigrateDomain.java

@@ -6,8 +6,6 @@ import java.util.List;
 
 public class PaperMigrateDomain {
 
-    @NotNull(message = "paperId不能为空")
-    private Long paperId;
 
     @NotNull(message = "考试ID不能为空")
     private Long examId;
@@ -18,32 +16,20 @@ public class PaperMigrateDomain {
     @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;
-    }
+    private List<PaperMigratePaper> papers;
 
-    public Long getExamId() {
-        return examId;
-    }
-
-    public void setExamId(Long examId) {
-        this.examId = examId;
-    }
+	public Long getExamId() {
+		return examId;
+	}
 
+	public void setExamId(Long examId) {
+		this.examId = examId;
+	}
 
-    public String getCoursePaperId() {
+	public String getCoursePaperId() {
 		return coursePaperId;
 	}
 
@@ -59,28 +45,21 @@ public class PaperMigrateDomain {
 		this.studentCode = studentCode;
 	}
 
-	public Integer getPaperNumber() {
-        return paperNumber;
-    }
-
-    public void setPaperNumber(Integer paperNumber) {
-        this.paperNumber = paperNumber;
-    }
+	public Integer getCardNumber() {
+		return cardNumber;
+	}
 
-    public Integer getCardNumber() {
-        return cardNumber;
-    }
+	public void setCardNumber(Integer cardNumber) {
+		this.cardNumber = cardNumber;
+	}
 
-    public void setCardNumber(Integer cardNumber) {
-        this.cardNumber = cardNumber;
-    }
+	public List<PaperMigratePaper> getPapers() {
+		return papers;
+	}
 
-    public List<PaperMigratePage> getPages() {
-        return pages;
-    }
+	public void setPapers(List<PaperMigratePaper> papers) {
+		this.papers = papers;
+	}
 
-    public void setPages(List<PaperMigratePage> pages) {
-        this.pages = pages;
-    }
 
 }

+ 87 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/papermigrate/PaperMigratePaper.java

@@ -0,0 +1,87 @@
+package com.qmth.teachcloud.mark.bean.papermigrate;
+
+import java.util.List;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+public class PaperMigratePaper {
+
+	@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;
+	}
+    
+    
+}

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

@@ -27,4 +27,6 @@ public interface ScanStudentPaperService extends IService<ScanStudentPaper> {
 
 	ScanStudentPaper findByStudentIdAndPaperNumber(Long studentId, Integer number);
 
+	List<ScanStudentPaper> findByPaperIds(List<Long> paperIds);
+
 }

+ 8 - 4
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -503,13 +503,17 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     @Transactional
     public void updateStudentAndPaper(@NotNull SysUser user, @NotNull Long id,
                                       @NotNull List<ScanStudentPaper> studentPaperList) {
-        for (ScanStudentPaper studentPaper : studentPaperList) {
-            studentPaper.setStudentId(id);
+        if(CollectionUtils.isNotEmpty(studentPaperList)) {
+        	for (ScanStudentPaper studentPaper : studentPaperList) {
+	            studentPaper.setStudentId(id);
+        	}
         }
         // 清空原有绑定关系
         studentPaperService.removeByStudentId(id);
-        // 保存绑定关系
-        studentPaperService.saveOrUpdateBatch(studentPaperList);
+        if(CollectionUtils.isNotEmpty(studentPaperList)) {
+	        // 保存绑定关系
+	        studentPaperService.saveOrUpdateBatch(studentPaperList);
+        }
         // 更新考生状态
         updateStudentByPaper(user.getId(), id, true);
     }

+ 80 - 68
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPaperServiceImpl.java

@@ -10,6 +10,7 @@ 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.PaperMigratePaper;
 import com.qmth.teachcloud.mark.bean.papermigrate.PaperMigrateVo;
 import com.qmth.teachcloud.mark.bean.scananswer.StudentPaperVo;
 import com.qmth.teachcloud.mark.bean.scanpaper.PaperVo;
@@ -48,8 +49,6 @@ public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper
     private ConcurrentService concurrentService;
     @Autowired
     private ScanStudentPaperService scanStudentPaperService;
-    @Autowired
-    private ScanAnswerCardSubjectService scanAnswerCardSubjectService;
 
     /**
      * 全量更新paper和所属的page集合,并刷新paper相关属性
@@ -126,14 +125,22 @@ public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper
         return baseMapper.listByStudentIds(paramList);
     }
 
+    private boolean isEmptyPage(PaperMigrateDomain domain) {
+    	for(PaperMigratePaper paper:domain.getPapers()) {
+			if (CollectionUtils.isEmpty(paper.getPages())) {
+				return true;
+	        }
+    	}
+    	return false;
+    }
+    
     @Transactional
     @Override
     public PaperMigrateVo paperMigrate(SysUser user, PaperMigrateDomain domain) {
-        // 查找修改paper
-        ScanPaper paper = getById(domain.getPaperId());
-        if (paper == null) {
-            throw new ParameterException("题卡信息未找到, paperId=" + domain.getPaperId());
+    	if (CollectionUtils.isEmpty(domain.getPapers())) {
+            throw new ParameterException("papers信息不能为空");
         }
+    	List<Long> paperIds=domain.getPapers().stream().map(e -> e.getPaperId()).collect(Collectors.toList());
         // 查找目标考生
         MarkStudent student = markStudentService.findByExamIdAndCoursePaperIdAndStudentCode(domain.getExamId(),
                 domain.getCoursePaperId(), domain.getStudentCode());
@@ -155,24 +162,21 @@ public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper
 //        if (!allowSubject) {
 //            throw new ParameterException("卡格式与考生科目不一致");
 //        }
-        // cardNumber或paperNumber有变化,都需要重新识别
-        if ((!paper.getNumber().equals(domain.getPaperNumber())
-                || !paper.getCardNumber().equals(domain.getCardNumber()))
-                && CollectionUtils.isEmpty(domain.getPages())) {
+        // cardNumber有变化,需要重新识别
+        if (!student.getCardNumber().equals(domain.getCardNumber())
+                && isEmptyPage(domain)) {
             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("该题卡已绑定该考生");
-            }
+        List<ScanStudentPaper> previousStudentPapers = scanStudentPaperService.findByPaperIds(paperIds);
+        if (CollectionUtils.isNotEmpty(previousStudentPapers)) {
+        	checkStudent(previousStudentPapers);
+        	Long previousStudentId=previousStudentPapers.get(0).getStudentId();
             // 考生ID变了才需要获取原考生
-            if (!previousStudentPaper.getStudentId().equals(student.getId())) {
-                previousStudent = markStudentService.getById(previousStudentPaper.getStudentId());
+            if (!previousStudentId.equals(student.getId())) {
+                previousStudent = markStudentService.getById(previousStudentId);
             }
         }
         if (previousStudent != null) {
@@ -180,57 +184,52 @@ public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper
         }
         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()));
+            // 解绑paper和原有考生
+            if (previousStudent != null) {
+                markStudentService.updateStudentAndPaper(user, previousStudent.getId(), null);
             }
-            // 更新目标考生状态
+        	for(PaperMigratePaper vp:domain.getPapers()) {
+        		ScanPaper paper=getById(vp.getPaperId());
+        		if(paper==null) {
+        			throw new ParameterException("题卡信息未找到.paperId="+vp.getPaperId());
+        		}
+	            // 更新paper属性
+	            paper.setCardNumber(domain.getCardNumber());
+	            paper.setNumber(vp.getPaperNumber());
+	            // 修改的paper强制置为人工绑定
+	            paper.setAssigned(true);
+	            // 原有mismatch标记需要清除
+	            paper.setMismatch(false);
+	            paper.setUpdaterId(user.getId());
+	            paper.setUpdateTime(System.currentTimeMillis());
+	            if (CollectionUtils.isNotEmpty(vp.getPages())) {
+	                // 重新识别时更新所有page
+	                List<ScanPaperPage> pages = new ArrayList<>();
+	                for (PaperMigratePage page : vp.getPages()) {
+	                    pages.add(page.update(paperPageService.findPaperIdAndIndex(paper.getId(), page.getIndex())));
+	                }
+	                savePaperAndPages(paper, pages);
+	            } else {
+	                saveOrUpdate(paper);
+	            }
+        	}
+        	// 查找目标考生现有绑定paper
+        	List<ScanStudentPaper> currentStudentPaperList = scanStudentPaperService.findByStudentId(student.getId());
+        	if (CollectionUtils.isNotEmpty(currentStudentPaperList)) {
+        		for (ScanStudentPaper current : currentStudentPaperList) {
+	    			updateMismatch(current.getPaperId(), true);
+	        	}
+        	}
+        	//解绑目标考生现有paper
+        	scanStudentPaperService.removeByStudentId(student.getId());
+        	// 更新目标考生状态
+        	currentStudentPaperList.clear();
+        	for(PaperMigratePaper vp:domain.getPapers()) {
+        		currentStudentPaperList.add(new ScanStudentPaper(student.getId(), vp.getPaperNumber(), vp.getPaperId()));
+        	}
             markStudentService.updateStudentAndPaper(user, student.getId(), currentStudentPaperList);
             // 返回数据结果
-            return PaperMigrateVo.create(domain.getPaperId());
+            return PaperMigrateVo.create(student.getId());
         } finally {
             concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().unlock();
             if (previousStudent != null) {
@@ -240,7 +239,20 @@ public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper
         }
     }
 
-    @Override
+    private void checkStudent(List<ScanStudentPaper> previousStudentPapers) {
+    	Long studentId=null;
+		for(ScanStudentPaper sp:previousStudentPapers) {
+			if(studentId==null) {
+				studentId=sp.getStudentId();
+			}else {
+				if(!sp.getStudentId().equals(studentId)) {
+					throw new ParameterException("被绑定的题卡不属于同一个考生");
+				}
+			}
+		}
+	}
+
+	@Override
     @Transactional
     public boolean updateMismatch(Long id, boolean mismatch) {
         LambdaUpdateWrapper<ScanPaper> lw = new LambdaUpdateWrapper<>();

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

@@ -43,6 +43,14 @@ public class ScanStudentPaperServiceImpl extends ServiceImpl<ScanStudentPaperMap
 		return baseMapper.selectOne(wrapper);
 	}
 	
+	@Override
+	public List<ScanStudentPaper> findByPaperIds(List<Long> paperIds) {
+		QueryWrapper<ScanStudentPaper> wrapper = new QueryWrapper<>();
+		LambdaQueryWrapper<ScanStudentPaper> lw = wrapper.lambda();
+		lw.in(ScanStudentPaper::getPaperId, paperIds);
+		return this.list(wrapper);
+	}
+	
     @Transactional
     @Override
     public void removeByStudentId(Long studentId) {