|
@@ -10,6 +10,8 @@ import java.util.Map;
|
|
import java.util.Set;
|
|
import java.util.Set;
|
|
import java.util.UUID;
|
|
import java.util.UUID;
|
|
|
|
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
+
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.bson.types.ObjectId;
|
|
import org.bson.types.ObjectId;
|
|
@@ -81,8 +83,11 @@ public class CopyDataNoReduplicateConsumer extends Consumer<CopyDataNoReduplicat
|
|
@Autowired
|
|
@Autowired
|
|
private QuesRepo quesRepo;
|
|
private QuesRepo quesRepo;
|
|
|
|
|
|
- @Autowired
|
|
|
|
|
|
+ @Resource(name = "mongoTemplate")
|
|
private MongoTemplate mongoTemplate;
|
|
private MongoTemplate mongoTemplate;
|
|
|
|
+
|
|
|
|
+ @Resource(name = "mongoTemplate2")
|
|
|
|
+ private MongoTemplate mongoTemplate2;
|
|
|
|
|
|
@Transactional
|
|
@Transactional
|
|
@Override
|
|
@Override
|
|
@@ -109,15 +114,78 @@ public class CopyDataNoReduplicateConsumer extends Consumer<CopyDataNoReduplicat
|
|
private void removeReduplicate(QuesStructType qt, Map<QuesStructType, List<Question>> map,
|
|
private void removeReduplicate(QuesStructType qt, Map<QuesStructType, List<Question>> map,
|
|
CopyDataNoReduplicateDto dto) {
|
|
CopyDataNoReduplicateDto dto) {
|
|
List<Question> qs = checkQuestion(map.get(qt));
|
|
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;
|
|
return;
|
|
}
|
|
}
|
|
if (qs.size() <= 200) {
|
|
if (qs.size() <= 200) {
|
|
- createPaper(qs, qt, dto, 1);
|
|
|
|
|
|
+ createPaper(detailName,qs, qt, dto, 1);
|
|
redisClient.expire(withoutReduplicateLock, cacheLockTimeout);
|
|
redisClient.expire(withoutReduplicateLock, cacheLockTimeout);
|
|
} else {
|
|
} else {
|
|
int size = qs.size();
|
|
int size = qs.size();
|
|
@@ -126,23 +194,23 @@ public class CopyDataNoReduplicateConsumer extends Consumer<CopyDataNoReduplicat
|
|
|
|
|
|
for (int i = 0; i < count; i++) {
|
|
for (int i = 0; i < count; i++) {
|
|
List<Question> subList = qs.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
|
|
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);
|
|
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) {
|
|
if (qs.size() == 0) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
Course course = of(dto.getCourse());
|
|
Course course = of(dto.getCourse());
|
|
Paper paper = new Paper();
|
|
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);
|
|
paper.setName("(" + dto.getBatch() + ")" + qt.getName() + "题_" + indx);
|
|
|
|
+ }else {
|
|
|
|
+ paper.setName("(" + dto.getBatch() + ")" + detailName + "_" + indx);
|
|
}
|
|
}
|
|
paper.setTitle(paper.getName());
|
|
paper.setTitle(paper.getName());
|
|
paper.setTotalScore((double) qs.size());
|
|
paper.setTotalScore((double) qs.size());
|
|
@@ -163,10 +231,10 @@ public class CopyDataNoReduplicateConsumer extends Consumer<CopyDataNoReduplicat
|
|
|
|
|
|
PaperDetail detail = new PaperDetail();
|
|
PaperDetail detail = new PaperDetail();
|
|
detail.setPaper(paper);
|
|
detail.setPaper(paper);
|
|
- if(QuesStructType.NESTED_ANSWER_QUESTION.equals(qt)) {
|
|
|
|
- detail.setName(qt.getName());
|
|
|
|
- }else {
|
|
|
|
|
|
+ if(qt.isObjective()) {
|
|
detail.setName(qt.getName() + "题");
|
|
detail.setName(qt.getName() + "题");
|
|
|
|
+ }else {
|
|
|
|
+ detail.setName(detailName);
|
|
}
|
|
}
|
|
detail.setNumber(1);
|
|
detail.setNumber(1);
|
|
detail.setScore((double) qs.size());
|
|
detail.setScore((double) qs.size());
|