浏览代码

Merge remote-tracking branch 'remotes/origin/hotfixes_v5.0.1_20230921_updates' into dev_v5.0.2

xiatian 1 年之前
父节点
当前提交
092a290ba0

+ 29 - 1
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/QuesTypeNameService.java

@@ -18,7 +18,35 @@ public class QuesTypeNameService {
 
     @Autowired
     private QuesTypeNameRepo quesTypeRepo;
-
+    
+    public void saveQuesTypeName(Long rootOrgId,String courseCode,QuesStructType questionType,String detailName) {
+    	List<QuesTypeName> quesTypeNames = quesTypeRepo.findQuesName(rootOrgId.toString(), courseCode, questionType);
+        if (quesTypeNames != null && quesTypeNames.size() > 0) {
+            QuesTypeName quesTypeName = quesTypeNames.get(0);
+            List<String> quesNames = quesTypeName.getQuesNames();
+            if (quesNames != null && quesNames.size() > 0) {
+                if (quesNames.contains(detailName)) {
+                    return;
+                } else {
+                    quesNames.add(detailName);
+                }
+            } else {
+                quesNames = new ArrayList<>();
+                quesNames.add(detailName);
+            }
+            quesTypeName.setQuesNames(quesNames);
+            quesTypeRepo.save(quesTypeName);
+        } else {
+            QuesTypeName quesTypeName = new QuesTypeName();
+            List<String> quesNames = new ArrayList<>();
+            quesNames.add(detailName);
+            quesTypeName.setOrgId(rootOrgId.toString());
+            quesTypeName.setCourseNo(courseCode);
+            quesTypeName.setQuestionType(questionType);
+            quesTypeName.setQuesNames(quesNames);
+            quesTypeRepo.save(quesTypeName);
+        }
+    }
     /**
      * 保存来源大题名称
      *

+ 84 - 17
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/consumer/CopyDataNoReduplicateConsumer.java

@@ -10,6 +10,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
+import javax.annotation.Resource;
+
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.bson.types.ObjectId;
@@ -46,6 +48,7 @@ import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailUnit;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionAudio;
+import cn.com.qmth.examcloud.core.questions.service.QuesTypeNameService;
 import cn.com.qmth.examcloud.core.questions.service.QuestionAudioService;
 import cn.com.qmth.examcloud.core.questions.service.UpYunService;
 import cn.com.qmth.examcloud.core.questions.service.bean.CopyDataNoReduplicateDto;
@@ -81,8 +84,15 @@ public class CopyDataNoReduplicateConsumer extends Consumer<CopyDataNoReduplicat
 	@Autowired
 	private QuesRepo quesRepo;
 
-	@Autowired
+	@Resource(name = "mongoTemplate")
 	private MongoTemplate mongoTemplate;
+	
+	@Resource(name = "mongoTemplate2")
+	private MongoTemplate mongoTemplate2;
+	
+	@Autowired
+	private QuesTypeNameService quesTypeNameService;
+	
 
 	@Transactional
 	@Override
@@ -109,15 +119,80 @@ public class CopyDataNoReduplicateConsumer extends Consumer<CopyDataNoReduplicat
 	private void removeReduplicate(QuesStructType qt, Map<QuesStructType, List<Question>> map,
 			CopyDataNoReduplicateDto dto) {
 		List<Question> qs = checkQuestion(map.get(qt));
-		createPapers(qs, qt, dto);
+		if (CollectionUtils.isEmpty(qs)) {
+			return;
+		}
+		if(qt.isObjective()) {
+			String detailName=qt.getName()+"题";
+			quesTypeNameService.saveQuesTypeName(dto.getUser().getRootOrgId(), dto.getCourse().getCode(), qt, detailName);
+			createPapers(detailName,qs, qt, dto);
+		}else {
+			Map<String,List<Question>> details=details(qs);
+			for (String detailName : details.keySet()) {
+				createPapers(detailName,details.get(detailName), qt, dto);
+			}
+		}
+	}
+	
+	private List<PaperDetailUnit> findUnits(List<Question> qs) {
+		List<ObjectId> ids=new ArrayList<>();
+		for(Question q:qs) {
+			ids.add(new ObjectId(q.getId()));
+		}
+		Query query = new Query();
+		query.addCriteria(Criteria.where("question.$id").in(ids));
+		query.addCriteria(Criteria.where("paperType").is(PaperType.IMPORT.name()));
+		List<PaperDetailUnit> ret = this.mongoTemplate2.find(query, PaperDetailUnit.class, "paperDetailUnit");
+		return ret;
+	}
+	
+	private List<PaperDetail> findDetails(List<PaperDetailUnit> us) {
+		List<ObjectId> ids=new ArrayList<>();
+		for(PaperDetailUnit u:us) {
+			ids.add(new ObjectId(u.getPaperDetail().getId()));
+		}
+		Query query = new Query();
+		query.addCriteria(Criteria.where("_id").in(ids));
+		List<PaperDetail> ret = this.mongoTemplate2.find(query, PaperDetail.class, "paperDetail");
+		return ret;
+	}
+	
+	private Map<String,List<Question>> details(List<Question> qs){
+		Map<String,List<Question>> ret=new HashMap<>();
+		if (CollectionUtils.isEmpty(qs)) {
+			return ret;
+		}
+		Map<String,Question> qmap=new HashMap<>();
+		for(Question q:qs) {
+			qmap.put(q.getId(), q);
+		}
+		List<PaperDetailUnit> us=findUnits(qs);
+		
+		List<PaperDetail> ds =findDetails(us);
+		Map<String,PaperDetail> dmap=new HashMap<>();
+		for(PaperDetail d:ds) {
+			dmap.put(d.getId(), d);
+		}
+		
+		for(PaperDetailUnit u:us) {
+			String detailName=dmap.get(u.getPaperDetail().getId()).getName();
+			List<Question> tem=ret.get(detailName);
+			if(tem==null) {
+				tem=new ArrayList<>();
+				ret.put(detailName, tem);
+			}
+			tem.add(qmap.get(u.getQuestion().getId()));
+		}
+		
+		return ret;
 	}
 
-	private void createPapers(List<Question> qs, QuesStructType qt, CopyDataNoReduplicateDto dto) {
-		if (qs == null || qs.size() == 0) {
+	private void createPapers(String detailName,List<Question> qs, QuesStructType qt, CopyDataNoReduplicateDto dto) {
+		if (CollectionUtils.isEmpty(qs)) {
 			return;
 		}
 		if (qs.size() <= 200) {
-			createPaper(qs, qt, dto, 1);
+			createPaper(detailName,qs, qt, dto, 1);
 			redisClient.expire(withoutReduplicateLock, cacheLockTimeout);
 		} else {
 			int size = qs.size();
@@ -126,24 +201,20 @@ public class CopyDataNoReduplicateConsumer extends Consumer<CopyDataNoReduplicat
 
 			for (int i = 0; i < count; i++) {
 				List<Question> subList = qs.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
-				createPaper(subList, qt, dto, i + 1);
+				createPaper(detailName,subList, qt, dto, i + 1);
 				redisClient.expire(withoutReduplicateLock, cacheLockTimeout);
 			}
 		}
 
 	}
 
-	private void createPaper(List<Question> qs, QuesStructType qt, CopyDataNoReduplicateDto dto, int indx) {
+	private void createPaper(String detailName,List<Question> qs, QuesStructType qt, CopyDataNoReduplicateDto dto, int indx) {
 		if (qs.size() == 0) {
 			return;
 		}
 		Course course = of(dto.getCourse());
 		Paper paper = new Paper();
-		if(QuesStructType.NESTED_ANSWER_QUESTION.equals(qt)) {
-			paper.setName("(" + dto.getBatch() + ")" + qt.getName() + "_" + indx);
-		}else {
-			paper.setName("(" + dto.getBatch() + ")" + qt.getName() + "题_" + indx);
-		}
+		paper.setName("(" + dto.getBatch() + ")" + detailName + "_" +dto.getCourse().getCode()+"_"+ indx);
 		paper.setTitle(paper.getName());
 		paper.setTotalScore((double) qs.size());
 		paper.setCreator(dto.getUser().getDisplayName());
@@ -163,11 +234,7 @@ public class CopyDataNoReduplicateConsumer extends Consumer<CopyDataNoReduplicat
 
 		PaperDetail detail = new PaperDetail();
 		detail.setPaper(paper);
-		if(QuesStructType.NESTED_ANSWER_QUESTION.equals(qt)) {
-			detail.setName(qt.getName());
-		}else {
-			detail.setName(qt.getName() + "题");
-		}
+		detail.setName(detailName);
 		detail.setNumber(1);
 		detail.setScore((double) qs.size());
 		detail.setUnitCount(qs.size());