|
@@ -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());
|
|
|
+ }
|
|
|
}
|