Selaa lähdekoodia

复制试卷优化批处理。

deason 7 vuotta sitten
vanhempi
commit
c2d78e0e46

+ 49 - 35
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ClonePaperService.java

@@ -102,10 +102,8 @@ public class ClonePaperService {
             //保存新试卷的所有试题信息
             this.savePaperDetails(detailMaps, newPaper, user);
         } catch (Exception e) {
-            if (newPaper.getId() != null) {
-                //如果试题保存失败,则还原数据
-                paperService.deletePapers(Lists.newArrayList(newPaper.getId()));
-            }
+            //如果试题保存失败,则还原数据
+            paperService.deletePapers(Lists.newArrayList(newPaper.getId()));
             throw new PaperException("克隆试卷失败!");
         }
     }
@@ -124,7 +122,8 @@ public class ClonePaperService {
         }
         //批量保存大题
         paperDetailRepo.save(detailMaps.keySet());
-
+        List<PaperDetailUnit> newDetailUnits = new ArrayList<>();
+        List<Question> newQuestions = new ArrayList<>();
         for (Map.Entry<PaperDetail, List<PaperDetailUnit>> entry : detailMaps.entrySet()) {
             PaperDetail detail = entry.getKey();
             log.info("new paperDetailId:" + detail.getId());
@@ -132,28 +131,35 @@ public class ClonePaperService {
             for (PaperDetailUnit detailUnit : detailUnits) {
                 detailUnit.setPaper(newPaper);
                 detailUnit.setPaperDetail(detail);
-                Question question = detailUnit.getQuestion();
-                this.updateQuestionPkgPath(question);
-                //保存试题
-                quesRepo.save(question);
-                log.info("new questionId:" + question.getId());
+                newDetailUnits.add(detailUnit);
+                newQuestions.add(detailUnit.getQuestion());
+            }
+        }
+        //更新试题的PkgPath
+        for (Question question : newQuestions) {
+            this.updateQuestionPkgPath(question);
+        }
+        //批量新增试题
+        quesRepo.save(newQuestions);
 
-                //保存试题的音频信息
-                List<QuestionAudio> audioList = question.getAudioList();
-                if (audioList != null && audioList.size() > 0) {
-                    for (QuestionAudio audio : audioList) {
-                        audio.setQuestionId(question.getId());
-                        questionAudioService.saveQuestionAudio(audio, user);
-                        log.info("new questionAudioId:" + audio.getId());
-                    }
-                    this.updateQuestionBody(question, audioList);
+        for (Question question : newQuestions) {
+            List<QuestionAudio> audioList = question.getAudioList();
+            if (audioList != null && audioList.size() > 0) {
+                for (QuestionAudio audio : audioList) {
+                    audio.setQuestionId(question.getId());
+                    questionAudioService.saveQuestionAudio(audio, user);
+                    log.info("new questionAudioId:" + audio.getId());
                 }
+                this.updateQuestionBody(question, audioList);
+                //如果试题存在音频,则更新试题的音频信息
+                quesRepo.save(question);
             }
-            //批量保存小题
-            paperDetailUnitRepo.save(detailUnits);
-            //复制来源大题的名称
-            quesTypeNameService.saveCloneQuesTypeName(detailUnits, newPaper.getCourseNo());
         }
+
+        //批量保存试题单元
+        paperDetailUnitRepo.save(newDetailUnits);
+        //复制来源大题的名称
+        quesTypeNameService.saveCloneQuesTypeName(newDetailUnits, newPaper.getCourseNo());
     }
 
     /**
@@ -252,21 +258,29 @@ public class ClonePaperService {
      * 复制试卷的所有试题信息
      */
     private Map<PaperDetail, List<PaperDetailUnit>> copyPaperDetails(Paper oldPaper, User user, Course course) throws PaperException {
-        List<PaperDetail> oldPaperDetails = paperDetailRepo.findByPaperOrderByNumber(oldPaper);
-        if (oldPaperDetails == null || oldPaperDetails.size() == 0) {
-            throw new PaperException("原试卷的大题不存在!");
+        //批量查询原试卷的所有试题
+        List<PaperDetailUnit> allDetailUnits = paperDetailUnitRepo.findByPaperOrderByNumber(oldPaper);
+        if (allDetailUnits == null || allDetailUnits.size() == 0) {
+            throw new PaperException("原试卷的试题不存在!");
         }
-
+        //按大题有序封装对应的试题列表
+        Map<PaperDetail, List<PaperDetailUnit>> oldDetailMaps = new TreeMap<>();
+        for (PaperDetailUnit detailUnit : allDetailUnits) {
+            PaperDetail detail = detailUnit.getPaperDetail();
+            if (!oldDetailMaps.containsKey(detail)) {
+                oldDetailMaps.put(detail, new ArrayList<>());
+            }
+            List<PaperDetailUnit> detailUnits = oldDetailMaps.get(detail);
+            detailUnits.add(detailUnit);
+        }
+        //开始复制
         Map<PaperDetail, List<PaperDetailUnit>> detailMaps = new TreeMap<>();
-        for (PaperDetail oldPaperDetail : oldPaperDetails) {
+        for (Map.Entry<PaperDetail, List<PaperDetailUnit>> entry : oldDetailMaps.entrySet()) {
             //复制大题信息
+            PaperDetail oldPaperDetail = entry.getKey();
             PaperDetail paperDetail = this.copyPaperDetail(oldPaperDetail, user.getDisplayName());
-            List<PaperDetailUnit> oldDetailUnits = paperDetailUnitRepo.findByPaperDetailOrderByNumber(oldPaperDetail);
-            if (oldDetailUnits == null || oldDetailUnits.size() == 0) {
-                throw new PaperException("原试卷的大题下的试题不存在!");
-            }
-
-            //复制大题下的所有小题
+            //复制大题下的所有试题单元
+            List<PaperDetailUnit> oldDetailUnits = entry.getValue();
             List<PaperDetailUnit> detailUnits = new ArrayList<>();
             for (PaperDetailUnit oldDetailUnit : oldDetailUnits) {
                 PaperDetailUnit detailUnit = this.copyPaperDetailUnit(oldDetailUnit, course, user.getDisplayName());
@@ -317,7 +331,7 @@ public class ClonePaperService {
     }
 
     /**
-     * 复制小题信息
+     * 复制试题单元信息
      */
     private PaperDetailUnit copyPaperDetailUnit(PaperDetailUnit oldDetailUnit, Course course, String createUser) throws PaperException {
         Question oldQuestion = oldDetailUnit.getQuestion();