xiatian hai 1 ano
pai
achega
f682ef9ec0

+ 81 - 13
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;
@@ -81,8 +83,11 @@ public class CopyDataNoReduplicateConsumer extends Consumer<CopyDataNoReduplicat
 	@Autowired
 	private QuesRepo quesRepo;
 
-	@Autowired
+	@Resource(name = "mongoTemplate")
 	private MongoTemplate mongoTemplate;
+	
+	@Resource(name = "mongoTemplate2")
+	private MongoTemplate mongoTemplate2;
 
 	@Transactional
 	@Override
@@ -109,15 +114,78 @@ 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()) {
+			createPapers(null,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,23 +194,23 @@ 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 {
+		if(qt.isObjective()) {
 			paper.setName("(" + dto.getBatch() + ")" + qt.getName() + "题_" + indx);
+		}else {
+			paper.setName("(" + dto.getBatch() + ")" + detailName + "_" + indx);
 		}
 		paper.setTitle(paper.getName());
 		paper.setTotalScore((double) qs.size());
@@ -163,10 +231,10 @@ 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 {
+		if(qt.isObjective()) {
 			detail.setName(qt.getName() + "题");
+		}else {
+			detail.setName(detailName);
 		}
 		detail.setNumber(1);
 		detail.setScore((double) qs.size());