Browse Source

批次按袋保存接口

yin 7 months ago
parent
commit
0ef4c977c1

+ 59 - 0
src/main/java/cn/com/qmth/scancentral/bean/answersave/AnswerPackageDomain.java

@@ -0,0 +1,59 @@
+package cn.com.qmth.scancentral.bean.answersave;
+
+import java.util.List;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+public class AnswerPackageDomain {
+
+    @NotNull(message = "batchId不能为空")
+    private Long batchId;
+
+    @NotBlank(message = "subjectCode不能为空")
+    private String subjectCode;
+
+    @NotNull(message = "cardNumber不能为空")
+    @Min(value = 1, message = "cardNumber不能小于1")
+    private Integer cardNumber;
+
+    @Valid
+    @NotNull(message = "students不能为空")
+    @Size(min = 1, message = "students不能为空")
+    private List<AnswerPackageStudent> students;
+
+    public Long getBatchId() {
+        return batchId;
+    }
+
+    public void setBatchId(Long batchId) {
+        this.batchId = batchId;
+    }
+
+    public Integer getCardNumber() {
+        return cardNumber;
+    }
+
+    public void setCardNumber(Integer cardNumber) {
+        this.cardNumber = cardNumber;
+    }
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public List<AnswerPackageStudent> getStudents() {
+        return students;
+    }
+
+    public void setStudents(List<AnswerPackageStudent> students) {
+        this.students = students;
+    }
+}

+ 44 - 0
src/main/java/cn/com/qmth/scancentral/bean/answersave/AnswerPackageSave.java

@@ -0,0 +1,44 @@
+package cn.com.qmth.scancentral.bean.answersave;
+
+import cn.com.qmth.scancentral.enums.BatchStatus;
+
+public class AnswerPackageSave {
+
+    private Integer scanCount;
+
+    private Long updateTime;
+
+    private BatchStatus status;
+
+    public static AnswerPackageSave create(Integer scanCount,BatchStatus status) {
+        AnswerPackageSave vo = new AnswerPackageSave();
+        vo.setScanCount(scanCount);
+        vo.setStatus(status);
+        vo.setUpdateTime(System.currentTimeMillis());
+        return vo;
+    }
+
+    public Integer getScanCount() {
+        return scanCount;
+    }
+
+    public void setScanCount(Integer scanCount) {
+        this.scanCount = scanCount;
+    }
+
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public BatchStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(BatchStatus status) {
+        this.status = status;
+    }
+}

+ 36 - 0
src/main/java/cn/com/qmth/scancentral/bean/answersave/AnswerPackageStudent.java

@@ -0,0 +1,36 @@
+package cn.com.qmth.scancentral.bean.answersave;
+
+import java.util.List;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+public class AnswerPackageStudent {
+
+    @NotBlank(message = "examNumber不能为空")
+    private String examNumber;
+    @Valid
+    @NotNull(message = "papers不能为空")
+    @Size(min = 1, message = "papers不能为空")
+    private List<AnswerPaper> papers;
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public List<AnswerPaper> getPapers() {
+        return papers;
+    }
+
+    public void setPapers(List<AnswerPaper> papers) {
+        this.papers = papers;
+    }
+
+}

+ 9 - 0
src/main/java/cn/com/qmth/scancentral/controller/scan/ScanBatchController.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.scancentral.controller.scan;
 
+import cn.com.qmth.scancentral.bean.answersave.AnswerPackageDomain;
+import cn.com.qmth.scancentral.bean.answersave.AnswerPackageSave;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -44,6 +46,13 @@ public class ScanBatchController extends BaseController {
         return batchService.batchSave(domain, user);
     }
 
+    @ApiOperation(value = "答题卡整袋扫描结果保存")
+    @RequestMapping(value = "/package/save", method = RequestMethod.POST)
+    public AnswerPackageSave batchPackageSave(@Validated @RequestBody AnswerPackageDomain domain) {
+        User user = getAccessUser();
+        return batchService.batchPackageSave(domain, user);
+    }
+
 //    @ApiOperation(value = "答题卡扫描历史标记/取消异常")
 //    @RequestMapping(value = "/mismatch/toggle", method = RequestMethod.POST)
 //    public MismatchToggleVo mismatchToggle(@Validated MismatchToggleDomain domain) {

+ 2 - 1
src/main/java/cn/com/qmth/scancentral/enums/BatchStatus.java

@@ -4,7 +4,8 @@ public enum BatchStatus {
 
     INIT("初始"),
 
-    FINISH("完成");
+    FINISH("完成"),
+    DISCARD("丢弃");
 
     private String name;
 

+ 4 - 0
src/main/java/cn/com/qmth/scancentral/service/BatchService.java

@@ -2,6 +2,8 @@ package cn.com.qmth.scancentral.service;
 
 import java.util.List;
 
+import cn.com.qmth.scancentral.bean.answersave.AnswerPackageDomain;
+import cn.com.qmth.scancentral.bean.answersave.AnswerPackageSave;
 import org.springframework.web.multipart.MultipartFile;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -111,4 +113,6 @@ public interface BatchService extends IService<BatchEntity> {
     List<BatchVo> batchList(BatchQuery req);
 
     List<BatchStudentSimpleVo> studentList(Long batchId);
+
+    AnswerPackageSave batchPackageSave(AnswerPackageDomain domain, User user);
 }

+ 114 - 2
src/main/java/cn/com/qmth/scancentral/service/impl/BatchServiceImpl.java

@@ -8,6 +8,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import cn.com.qmth.scancentral.bean.answersave.*;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.math.RandomUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -31,8 +33,6 @@ import cn.com.qmth.scancentral.bean.BatchCreateDomain;
 import cn.com.qmth.scancentral.bean.BatchQueryDomain;
 import cn.com.qmth.scancentral.bean.User;
 import cn.com.qmth.scancentral.bean.WorkloadDomain;
-import cn.com.qmth.scancentral.bean.answersave.AnswerDomain;
-import cn.com.qmth.scancentral.bean.answersave.AnswerPaper;
 import cn.com.qmth.scancentral.dao.BatchDao;
 import cn.com.qmth.scancentral.entity.AnswerCardEntity;
 import cn.com.qmth.scancentral.entity.BatchEntity;
@@ -962,4 +962,116 @@ public class BatchServiceImpl extends ServiceImpl<BatchDao, BatchEntity> impleme
         }
         return this.baseMapper.studentList(batchId);
     }
+
+    @Override
+    public AnswerPackageSave batchPackageSave(AnswerPackageDomain domain, User user) {
+        BatchEntity batch = checkBatchStatus(getById(domain.getBatchId()));
+        ExamEntity exam = examService.getById(batch.getExamId());
+        if (exam == null) {
+            throw ParameterExceptions.EXAM_NOT_FOUND;
+        }
+        if (exam.getScanByPackage() == null || !exam.getScanByPackage()) {
+            throw new ParameterException("未开启整袋扫描");
+        }
+        AnswerCardEntity answerCard = answerCardService.findByExamAndNumber(batch.getExamId(), domain.getCardNumber());
+        if (answerCard == null) {
+            throw new ParameterException("卡格式信息未找到");
+        }
+        // 验证卡格式所属科目
+        boolean allowSubject = answerCardSubjectService.checkSubject(answerCard.getExamId(), answerCard.getNumber(),
+                domain.getSubjectCode());
+        if (!allowSubject) {
+            throw new ParameterException("卡格式与科目不一致");
+        }
+        List<StudentEntity> ss = studentService.findByExamAndPackage(batch.getExamId(), batch.getPackageCode(),
+                batch.getSubjectCode());
+        if (CollectionUtils.isEmpty(ss) || ss.size() != domain.getStudents().size()) {
+            throw new ParameterException("该批次考生数量与卷袋考生数量不一致");
+        }
+
+        Map<String,AnswerPackageStudent> answerPackageStudentMap = new HashMap<>();
+        Map<String,StudentEntity> studentMap = new HashMap<>();
+        for (AnswerPackageStudent packageStudent:domain.getStudents()) {
+            String examNumber = packageStudent.getExamNumber();
+            StudentEntity student = studentService.findByExamAndSubjectCodeAndExamNumber(batch.getExamId(),
+                    domain.getSubjectCode(), examNumber);
+            if (student == null) {
+                throw new ParameterException("考生信息未找到");
+            }
+            // 整袋扫描验证packageCode
+            if (!StringUtils.equals(batch.getPackageCode(), student.getPackageCode())) {
+                throw new ParameterException("考生与批次卷袋号不一致");
+            }
+            // 不允许缺页时,保存张数需要与卡格式定义一致
+            if (!exam.getAllowUnexistPaper() && packageStudent.getPapers().size() != answerCard.getPaperCount()) {
+                throw new ParameterException("卡格式张数不一致");
+            }
+            answerPackageStudentMap.put(examNumber,packageStudent);
+            studentMap.put(examNumber,student);
+        }
+
+        for (String examNumber:studentMap.keySet()) {
+            AnswerPackageStudent answerPackageStudent = answerPackageStudentMap.get(examNumber);
+            StudentEntity student = studentMap.get(examNumber);
+            boolean studentAssigned = false;
+            List<StudentPaperEntity> studentPaperList = new ArrayList<>();
+            for (AnswerPaper answerPaper : answerPackageStudent.getPapers()) {
+                // 验证page数量
+                answerPaper.answerCardValidate(answerCard);
+                Integer paperNumber = answerPaper.getNumber();
+                PaperEntity paper = findOrCreatePaper(batch, student, paperNumber, user);
+                // 设置paper属性
+                paper.setExamId(batch.getExamId());
+                paper.setCardNumber(answerCard.getNumber());
+                paper.setNumber(paperNumber);
+                paper.setMismatch(false);
+                paper.setQuestionFilled(false);
+                paper.setSubjectiveFilled(answerPaper.getSubjectiveFilled());
+                paper.setOmrExamNumber(answerPaper.getOmrExamNumber());
+                paper.setAssigned(answerPaper.getAssigned());
+                // 保存paper与page到数据库
+                paperService.savePaperAndPages(paper, answerPaper.buildPageList(null));
+                // 记录paper与batch关联关系
+                batchPaperService.update(batch, paper, student.getId(), paperNumber, false);
+                // 创建student与paper的关联关系
+                studentPaperList.add(new StudentPaperEntity(student.getId(), paperNumber, paper.getId()));
+                studentAssigned = studentAssigned || paper.getAssigned();
+                // 更新批次统计数量,改到finish的时候更新
+                // updateAssignedCount(batch.getId());
+                // updateScanCount(batch.getId());
+                // 不开启实时审核,或者没有人工绑定的情况下,或者当前批次无需审核,直接更新考生扫描状态
+                if (VerifyStatus.CANCEL.equals(batch.getVerifyStatus()) || exam.getEnableSyncVerify() == null
+                        || !exam.getEnableSyncVerify() || !studentAssigned) {
+                    concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().lock();
+                    try {
+                        studentService.updateStudentAndPaper(user, student.getId(), studentPaperList);
+                        studentService.updateAssignedCheckCount(student.getId(), true);
+                    } finally {
+                        concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().unlock();
+                    }
+                }
+            }
+        }
+        this.batchFinish(batch.getId());
+
+        LambdaUpdateWrapper<BatchEntity> lw = new LambdaUpdateWrapper<>();
+        lw.set(BatchEntity::getStatus, BatchStatus.DISCARD);
+        lw.ne(BatchEntity::getId, batch.getId());
+        lw.eq(BatchEntity::getExamId, batch.getExamId());
+        lw.eq(BatchEntity::getSubjectCode, batch.getSubjectCode());
+        lw.eq(BatchEntity::getPackageCode, batch.getPackageCode());
+        this.update(lw);
+
+        // 更新考场扫描状态
+        ExamRoomScannedQuery req = new ExamRoomScannedQuery();
+        req.setExamId(exam.getId());
+        req.setSubjectCode(domain.getSubjectCode());
+        req.setProvince(ss.get(0).getProvince());
+        req.setCampusCode(ss.get(0).getCampusCode());
+        req.setExamSite(ss.get(0).getExamSite());
+        req.setExamRoom(ss.get(0).getExamRoom());
+        examRoomService.modifyByStudentScan(req);
+
+        return AnswerPackageSave.create(findStudentCountByBatch(batch.getId()),batch.getStatus());
+    }
 }

+ 1 - 0
src/main/resources/mapper/BatchMapper.xml

@@ -275,6 +275,7 @@
         where b.exam_id = #{req.examId}
         and b.subject_code=#{req.subjectCode}
         and b.device=#{req.device}
+        and b.stayus!='DISCARD'
         and (b.verify_status ='CONFIRM' or b.verify_status is null)
         <if test="req.startTime != null">
             and b.create_time&gt;=#{req.startTime}