yin 7 mesi fa
parent
commit
ca9a151153

+ 8 - 1
src/main/java/cn/com/qmth/scancentral/controller/scan/ScanBatchController.java

@@ -2,6 +2,8 @@ package cn.com.qmth.scancentral.controller.scan;
 
 import cn.com.qmth.scancentral.bean.answersave.AnswerPackageDomain;
 import cn.com.qmth.scancentral.bean.answersave.AnswerPackageSave;
+import cn.com.qmth.scancentral.enums.LockType;
+import com.qmth.boot.core.concurrent.service.ConcurrentService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -32,6 +34,8 @@ public class ScanBatchController extends BaseController {
 
     @Autowired
     private BatchService batchService;
+    @Autowired
+    private ConcurrentService concurrentService;
 
     @ApiOperation(value = "答题卡扫描批次创建")
     @RequestMapping(value = "/create", method = RequestMethod.POST)
@@ -50,7 +54,10 @@ public class ScanBatchController extends BaseController {
     @RequestMapping(value = "/package/save", method = RequestMethod.POST)
     public AnswerPackageSave batchPackageSave(@Validated @RequestBody AnswerPackageDomain domain) {
         User user = getAccessUser();
-        return batchService.batchPackageSave(domain, user);
+        concurrentService.getReadWriteLock(LockType.BATCH + "-" + domain.getBatchId()).writeLock().lock();
+        AnswerPackageSave result = batchService.batchPackageSave(domain, user);
+        concurrentService.getReadWriteLock(LockType.BATCH + "-" + domain.getBatchId()).writeLock().unlock();
+        return result;
     }
 
 //    @ApiOperation(value = "答题卡扫描历史标记/取消异常")

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

@@ -8,7 +8,8 @@ public enum LockType {
                             "student_answer_group_delete"), STUDENT_ANSWER_GROUP_RESET(
                                     "student_answer_group_reset"), STUDENT_ANSWER_GROUP_BUILD(
                                             "student_answer_group_build"), USER(
-                                                    "user"), EXAM_STATUS_RESET("exam_status_reset"), CHECK_ASSIGNED_RESET("check_assigned_reset");
+                                                    "user"), EXAM_STATUS_RESET("exam_status_reset"), CHECK_ASSIGNED_RESET("check_assigned_reset"),
+    BATCH("batch");
 
     private String name;
 

+ 1 - 1
src/main/java/cn/com/qmth/scancentral/service/OmrTaskService.java

@@ -55,7 +55,7 @@ public interface OmrTaskService extends IService<OmrTaskEntity> {
 
     void waitingByGroupToggle(Long groupId);
 
-    void deleteByStudentIdAndGroupId(Long groupId, Long studentId);
+    void deleteByStudentIdAndGroupId(Long groupId, Long studentId,boolean updateCount);
 
     void updateStudentId(Long studentId, Long paperId);
 

+ 18 - 13
src/main/java/cn/com/qmth/scancentral/service/impl/BatchServiceImpl.java

@@ -379,7 +379,6 @@ public class BatchServiceImpl extends ServiceImpl<BatchDao, BatchEntity> impleme
             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();
             }
@@ -913,7 +912,6 @@ public class BatchServiceImpl extends ServiceImpl<BatchDao, BatchEntity> impleme
                 concurrentService.getReadWriteLock(LockType.STUDENT + "-" + entry.getKey()).writeLock().lock();
                 try {
                     studentService.updateStudentAndPaper(user, entry.getKey(), entry.getValue());
-                    studentService.updateAssignedCheckCount(entry.getKey(), true);
                 } finally {
                     concurrentService.getReadWriteLock(LockType.STUDENT + "-" + entry.getKey()).writeLock().unlock();
                 }
@@ -1000,12 +998,13 @@ public class BatchServiceImpl extends ServiceImpl<BatchDao, BatchEntity> impleme
         }
         List<StudentEntity> ss = studentService.findByExamAndPackage(batch.getExamId(), batch.getPackageCode(),
                 batch.getSubjectCode());
-        if (CollectionUtils.isEmpty(ss) || ss.size() != domain.getStudents().size()) {
+        Map<String,StudentEntity> studentMap = ss.stream().collect(Collectors.toMap(e->e.getExamNumber(), Function.identity()));
+        if (CollectionUtils.isEmpty(ss) || ss.size() != domain.getStudents().size()
+            ||studentMap.size()!=domain.getStudents().size()) {
             throw new ParameterException("该批次考生数量与卷袋考生数量不一致");
         }
 
         Map<String,AnswerPackageStudent> answerPackageStudentMap = new HashMap<>();
-        Map<String,StudentEntity> studentMap = ss.stream().collect(Collectors.toMap(e->e.getExamNumber(), Function.identity()));
         Integer assignedCount = 0;
         for (AnswerPackageStudent packageStudent:domain.getStudents()) {
             String examNumber = packageStudent.getExamNumber();
@@ -1052,32 +1051,26 @@ public class BatchServiceImpl extends ServiceImpl<BatchDao, BatchEntity> impleme
                 // 创建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()) {
                     concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().lock();
                     try {
 //                        studentService.updateStudentAndPaper(user, student.getId(), studentPaperList);
-                        // 清空原有绑定关系
-                        studentPaperService.removeByStudentId(student.getId());
-                        // 保存绑定关系
-                        studentPaperService.saveOrUpdateBatchByMultiId(studentPaperList);
+                        // 更新绑定关系
+                        studentPaper(student, studentPaperList);
                         // 更新考生状态
                         studentService.updateStudentByPaper(user, student.getId(), false);
                         //识别对照
                         for (OmrGroupEntity g : gs) {
                             concurrentService.getReadWriteLock(LockType.OMR_GROUP + "-" + g.getId()).readLock().lock();
-                            omrTaskService.deleteByStudentIdAndGroupId(g.getId(), student.getId());
+                            omrTaskService.deleteByStudentIdAndGroupId(g.getId(), student.getId(),false);
                             List<OmrTaskEntity> list = omrTaskService.buildTask(g,  student.getId());
                             if (list != null && !list.isEmpty()) {
                                 omrTaskService.saveBatch(list);
                             }
                             concurrentService.getReadWriteLock(LockType.OMR_GROUP + "-" + g.getId()).readLock().unlock();
                         }
-                        studentService.updateAssignedCheckCount(student.getId(), true);
                     } finally {
                         concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().unlock();
                     }
@@ -1091,6 +1084,7 @@ public class BatchServiceImpl extends ServiceImpl<BatchDao, BatchEntity> impleme
         for (OmrGroupEntity g : gs) {
             concurrentService.getReadWriteLock(LockType.OMR_GROUP + "-" + g.getId()).writeLock().lock();
             g.setTotalCount(omrTaskService.countByGroupId(g.getId()));
+            omrGroupService.saveOrUpdate(g);
             concurrentService.getReadWriteLock(LockType.OMR_GROUP + "-" + g.getId()).writeLock().unlock();
         }
 
@@ -1116,4 +1110,15 @@ public class BatchServiceImpl extends ServiceImpl<BatchDao, BatchEntity> impleme
 
         return AnswerPackageSave.create(findStudentCountByBatch(batch.getId()),batch.getStatus());
     }
+
+    private void studentPaper(StudentEntity student, List<StudentPaperEntity> studentPaperList) {
+        List<StudentPaperEntity> list= studentPaperService.findByStudentId(student.getId());
+        if(list.isEmpty() || list.size() == studentPaperList.size()){
+            // 保存绑定关系
+            studentPaperService.saveOrUpdateBatchByMultiId(studentPaperList);
+        }else{
+            studentPaperService.removeByStudentId(student.getId());
+            studentPaperService.saveOrUpdateBatchByMultiId(studentPaperList);
+        }
+    }
 }

+ 4 - 2
src/main/java/cn/com/qmth/scancentral/service/impl/OmrTaskServiceImpl.java

@@ -844,13 +844,15 @@ public class OmrTaskServiceImpl extends ServiceImpl<OmrTaskDao, OmrTaskEntity> i
 
     @Transactional
     @Override
-    public void deleteByStudentIdAndGroupId(Long groupId, Long studentId) {
+    public void deleteByStudentIdAndGroupId(Long groupId, Long studentId,boolean updateCount) {
         QueryWrapper<OmrTaskEntity> wrapper = new QueryWrapper<>();
         LambdaQueryWrapper<OmrTaskEntity> lw = wrapper.lambda();
         lw.eq(OmrTaskEntity::getStudentId, studentId);
         lw.eq(OmrTaskEntity::getGroupId, groupId);
         this.remove(lw);
-        groupService.updateTotalCount(groupId);
+        if(updateCount){
+            groupService.updateTotalCount(groupId);
+        }
     }
 
     @Transactional

+ 0 - 2
src/main/java/cn/com/qmth/scancentral/service/impl/PaperServiceImpl.java

@@ -333,7 +333,6 @@ public class PaperServiceImpl extends ServiceImpl<PaperDao, PaperEntity> impleme
                             .filter(entity -> !entity.getPaperId().equals(previousStudentPaper.getPaperId()))
                             .collect(Collectors.toList());
                     studentService.updateStudentAndPaper(user, previousStudent.getId(), studentPaperList);
-                    studentService.updateAssignedCheckCount(previousStudent.getId(), true);
                 }
                 // 考生没变,直接解绑paper
                 else {
@@ -377,7 +376,6 @@ public class PaperServiceImpl extends ServiceImpl<PaperDao, PaperEntity> impleme
             }
             // 更新目标考生状态
             studentService.updateStudentAndPaper(user, student.getId(), currentStudentPaperList);
-            studentService.updateAssignedCheckCount(student.getId(), true);
             // 返回数据结果
             return PaperMigrateVo.create(domain.getPaperId());
         } finally {

+ 2 - 3
src/main/java/cn/com/qmth/scancentral/service/impl/StudentServiceImpl.java

@@ -371,7 +371,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
             if (CollectionUtils.isNotEmpty(gs)) {
                 for (OmrGroupEntity g : gs) {
                     concurrentService.getReadWriteLock(LockType.OMR_GROUP + "-" + g.getId()).readLock().lock();
-                    omrTaskService.deleteByStudentIdAndGroupId(g.getId(), student.getId());
+                    omrTaskService.deleteByStudentIdAndGroupId(g.getId(), student.getId(),true);
                     // 默认分组重新生成识别对照任务,其他任务不生成
                     if (g.getFixed()) {
                         omrTaskService.saveTask(g, student.getId());
@@ -380,6 +380,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
                 }
             }
         }
+        this.updateAssignedCheckCount(student.getId(), true);
     }
 
     @Override
@@ -1060,7 +1061,6 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
         try {
             updateStudentAndPaper(user, student.getId(),
                     removeStudentPaper(studentPaperService.findByStudentId(student.getId()), paperNumber));
-            updateAssignedCheckCount(student.getId(), true);
             PaperDeleteVo vo = new PaperDeleteVo();
             vo.setPaperCount(studentPaperService.countByStudentId(student.getId()));
             vo.setUpdateTime(new Date().getTime());
@@ -1102,7 +1102,6 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
         concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().lock();
         try {
             updateStudentAndPaper(user, student.getId(), new ArrayList<>());
-            updateAssignedCheckCount(student.getId(), true);
             AnswerDeleteVo vo = new AnswerDeleteVo();
             vo.setStatus(ScanStatus.UNEXIST);
             vo.setUpdateTime(new Date().getTime());