xiatian 2 tahun lalu
induk
melakukan
3071560cc0

+ 121 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/bean/randompaper/StructQuestionCheckDto.java

@@ -0,0 +1,121 @@
+package cn.com.qmth.examcloud.core.questions.service.bean.randompaper;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import cn.com.qmth.examcloud.core.questions.dao.entity.PaperDetailStruct;
+import cn.com.qmth.examcloud.core.questions.dao.entity.dto.CoursePropertyNumberDto;
+import cn.com.qmth.examcloud.core.questions.dao.entity.dto.PaperDetailUnitStructDto;
+
+public class StructQuestionCheckDto {
+	private Set<String> usedQuesIds = new HashSet<>();
+	private Boolean pub;
+	private String difficulty;
+	private PaperDetailUnitStructDto us;
+	private Integer index;
+	private Integer detailNumber;
+	private Integer needCount;
+	private StructQuestionInfo sqinfo;
+	private CoursePropertyNumberDto cp;
+	private StructQuestionCountInfo si;
+	private List<QuestionDto> questionList;
+	private PaperDetailStruct ds;
+
+	public Integer getDetailNumber() {
+		return detailNumber;
+	}
+
+	public void setDetailNumber(Integer detailNumber) {
+		this.detailNumber = detailNumber;
+	}
+
+	public StructQuestionInfo getSqinfo() {
+		return sqinfo;
+	}
+
+	public void setSqinfo(StructQuestionInfo sqinfo) {
+		this.sqinfo = sqinfo;
+	}
+
+	public CoursePropertyNumberDto getCp() {
+		return cp;
+	}
+
+	public void setCp(CoursePropertyNumberDto cp) {
+		this.cp = cp;
+	}
+
+	public List<QuestionDto> getQuestionList() {
+		return questionList;
+	}
+
+	public void setQuestionList(List<QuestionDto> questionList) {
+		this.questionList = questionList;
+	}
+
+	public Integer getNeedCount() {
+		return needCount;
+	}
+
+	public void setNeedCount(Integer needCount) {
+		this.needCount = needCount;
+	}
+
+	public Boolean getPub() {
+		return pub;
+	}
+
+	public void setPub(Boolean pub) {
+		this.pub = pub;
+	}
+
+	public String getDifficulty() {
+		return difficulty;
+	}
+
+	public void setDifficulty(String difficulty) {
+		this.difficulty = difficulty;
+	}
+
+	public StructQuestionCountInfo getSi() {
+		return si;
+	}
+
+	public void setSi(StructQuestionCountInfo si) {
+		this.si = si;
+	}
+
+	public Set<String> getUsedQuesIds() {
+		return usedQuesIds;
+	}
+
+	public void setUsedQuesIds(Set<String> usedQuesIds) {
+		this.usedQuesIds = usedQuesIds;
+	}
+
+	public PaperDetailUnitStructDto getUs() {
+		return us;
+	}
+
+	public void setUs(PaperDetailUnitStructDto us) {
+		this.us = us;
+	}
+
+	public Integer getIndex() {
+		return index;
+	}
+
+	public void setIndex(Integer index) {
+		this.index = index;
+	}
+
+	public PaperDetailStruct getDs() {
+		return ds;
+	}
+
+	public void setDs(PaperDetailStruct ds) {
+		this.ds = ds;
+	}
+
+}

+ 114 - 73
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/RandomPaperServiceImpl.java

@@ -30,8 +30,6 @@ import cn.com.qmth.examcloud.core.questions.base.enums.PaperStructType;
 import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
 import cn.com.qmth.examcloud.core.questions.base.enums.QuestionDifficulty;
 import cn.com.qmth.examcloud.core.questions.base.question.enums.QuesStructType;
-import cn.com.qmth.examcloud.core.questions.dao.PaperDetailUnitRepo;
-import cn.com.qmth.examcloud.core.questions.dao.PaperRepo;
 import cn.com.qmth.examcloud.core.questions.dao.PaperStructRepo;
 import cn.com.qmth.examcloud.core.questions.dao.PropertyRepo;
 import cn.com.qmth.examcloud.core.questions.dao.RandomPaperQuestionRepo;
@@ -53,6 +51,7 @@ import cn.com.qmth.examcloud.core.questions.service.bean.randompaper.RandomPaper
 import cn.com.qmth.examcloud.core.questions.service.bean.randompaper.RandomPaperQuery;
 import cn.com.qmth.examcloud.core.questions.service.bean.randompaper.RandomPaperQuestionDto;
 import cn.com.qmth.examcloud.core.questions.service.bean.randompaper.StructInfo;
+import cn.com.qmth.examcloud.core.questions.service.bean.randompaper.StructQuestionCheckDto;
 import cn.com.qmth.examcloud.core.questions.service.bean.randompaper.StructQuestionCountInfo;
 import cn.com.qmth.examcloud.core.questions.service.bean.randompaper.StructQuestionInfo;
 import cn.com.qmth.examcloud.support.cache.CacheHelper;
@@ -69,10 +68,6 @@ public class RandomPaperServiceImpl implements RandomPaperService {
 	@Autowired
 	private PropertyRepo propertyRepo;
 	@Autowired
-	private PaperRepo paperRepo;
-	@Autowired
-	private PaperDetailUnitRepo unitRepo;
-	@Autowired
 	private RandomPaperRepo randomPaperRepo;
 	@Autowired
 	private RandomPaperQuestionRepo randomPaperQuestionRepo;
@@ -241,10 +236,11 @@ public class RandomPaperServiceImpl implements RandomPaperService {
 
 	@Override
 	public StructInfo getPaperQuestionViewInfo(String structId, List<String> paperIds) {
-		StructInfo ret=getPaperQuestionInfo(structId, paperIds);
+		StructInfo ret = getPaperQuestionInfo(structId, paperIds);
 		clearQuestionIds(ret);
 		return ret;
 	}
+
 	private StructInfo getPaperQuestionInfo(String structId, List<String> paperIds) {
 		StructInfo ret = new StructInfo();
 		ret.setValid(true);
@@ -254,6 +250,8 @@ public class RandomPaperServiceImpl implements RandomPaperService {
 		for (String paperId : paperIds) {
 			unitList.addAll(findUnitPaperId(paperId));
 		}
+		StructQuestionCheckDto cd = new StructQuestionCheckDto();
+		cd.setQuestionList(questionList);
 		if (PaperStructType.BLUEPRINT.equals(ps.getPaperStrucType())) {
 			for (PaperDetailUnitDto unit : unitList) {
 				unit.getQuestion().setQuesName(unit.getPaperDetail().getName());
@@ -269,10 +267,13 @@ public class RandomPaperServiceImpl implements RandomPaperService {
 					StructQuestionInfo sqinfo = new StructQuestionInfo();
 					sqinfos.add(sqinfo);
 					sqinfo.setDetailName(ds.getName());
+					cd.setDetailNumber(detailNumber);
+					cd.setDs(ds);
+					cd.setSqinfo(sqinfo);
 					for (CoursePropertyNumberDto cp : ds.getCoursePropertyNumberDtos()) {
 						if (!cp.getDisable()) {
-							setQuestionInfoByBlue(detailNumber, ds.getQuestionType(), ds.getQuesNames(), sqinfo, cp,
-									questionList);
+							cd.setCp(cp);
+							setQuestionInfoByBlue(cd);
 						}
 					}
 					sqinfo.setTotalCount(sqinfo.getHardInfo().getCount() + sqinfo.getMediumInfo().getCount()
@@ -293,10 +294,14 @@ public class RandomPaperServiceImpl implements RandomPaperService {
 					StructQuestionInfo sqinfo = new StructQuestionInfo();
 					sqinfos.add(sqinfo);
 					sqinfo.setDetailName(ds.getName());
+					cd.setDetailNumber(detailNumber);
+					cd.setSqinfo(sqinfo);
 					int index = 0;
 					for (PaperDetailUnitStructDto us : ds.getUnitStructs()) {
 						index++;
-						setQuestionInfoByExact(index, detailNumber, us, sqinfo, questionList);
+						cd.setIndex(index);
+						cd.setUs(us);
+						setQuestionInfoByExact(cd);
 					}
 					sqinfo.setTotalCount(sqinfo.getHardInfo().getCount() + sqinfo.getMediumInfo().getCount()
 							+ sqinfo.getEasyInfo().getCount());
@@ -352,122 +357,158 @@ public class RandomPaperServiceImpl implements RandomPaperService {
 		}
 	}
 
-	private void setQuestionInfoByExact(Integer index, Integer detailNumber, PaperDetailUnitStructDto us,
-			StructQuestionInfo sqinfo, List<QuestionDto> questionList) {
-		StructQuestionCountInfo si = null;
+	private void setQuestionInfoByExact(StructQuestionCheckDto cd) {
+		PaperDetailUnitStructDto us = cd.getUs();
+		StructQuestionInfo sqinfo = cd.getSqinfo();
 		if (us.getNoPublicDifficulty() > 0) {
-			si = sqinfo.getHardInfo();
-			setQuestionInfoByExact(index, detailNumber, us.getQuestionType(), us.getQuesNames(), si, false,
-					QuestionDifficulty.HARD.getName(), us.getNoPublicDifficulty(), questionList);
+			cd.setSi(sqinfo.getHardInfo());
+			cd.setPub(false);
+			cd.setDifficulty(QuestionDifficulty.HARD.getName());
+			cd.setNeedCount(us.getNoPublicDifficulty());
+			setQuestionInfoByExactItem(cd);
 		}
 		if (us.getPublicDifficulty() > 0) {
-			si = sqinfo.getHardInfo();
-			setQuestionInfoByExact(index, detailNumber, us.getQuestionType(), us.getQuesNames(), si, true,
-					QuestionDifficulty.HARD.getName(), us.getPublicDifficulty(), questionList);
+			cd.setSi(sqinfo.getHardInfo());
+			cd.setPub(true);
+			cd.setDifficulty(QuestionDifficulty.HARD.getName());
+			cd.setNeedCount(us.getPublicDifficulty());
+			setQuestionInfoByExactItem(cd);
 		}
 
 		if (us.getNoPublicMedium() > 0) {
-			si = sqinfo.getMediumInfo();
-			setQuestionInfoByExact(index, detailNumber, us.getQuestionType(), us.getQuesNames(), si, false,
-					QuestionDifficulty.MEDIUM.getName(), us.getNoPublicMedium(), questionList);
+			cd.setSi(sqinfo.getMediumInfo());
+			cd.setPub(false);
+			cd.setDifficulty(QuestionDifficulty.MEDIUM.getName());
+			cd.setNeedCount(us.getNoPublicMedium());
+			setQuestionInfoByExactItem(cd);
 		}
 		if (us.getPublicMedium() > 0) {
-			si = sqinfo.getMediumInfo();
-			setQuestionInfoByExact(index, detailNumber, us.getQuestionType(), us.getQuesNames(), si, true,
-					QuestionDifficulty.MEDIUM.getName(), us.getPublicMedium(), questionList);
+			cd.setSi(sqinfo.getMediumInfo());
+			cd.setPub(true);
+			cd.setDifficulty(QuestionDifficulty.MEDIUM.getName());
+			cd.setNeedCount(us.getPublicMedium());
+			setQuestionInfoByExactItem(cd);
 		}
 		if (us.getNoPublicSimple() > 0) {
-			si = sqinfo.getEasyInfo();
-			setQuestionInfoByExact(index, detailNumber, us.getQuestionType(), us.getQuesNames(), si, false,
-					QuestionDifficulty.EASY.getName(), us.getNoPublicSimple(), questionList);
+			cd.setSi(sqinfo.getEasyInfo());
+			cd.setPub(false);
+			cd.setDifficulty(QuestionDifficulty.EASY.getName());
+			cd.setNeedCount(us.getNoPublicSimple());
+			setQuestionInfoByExactItem(cd);
 		}
 		if (us.getPublicSimple() > 0) {
-			si = sqinfo.getEasyInfo();
-			setQuestionInfoByExact(index, detailNumber, us.getQuestionType(), us.getQuesNames(), si, true,
-					QuestionDifficulty.EASY.getName(), us.getPublicSimple(), questionList);
+			cd.setSi(sqinfo.getEasyInfo());
+			cd.setPub(true);
+			cd.setDifficulty(QuestionDifficulty.EASY.getName());
+			cd.setNeedCount(us.getPublicSimple());
+			setQuestionInfoByExactItem(cd);
 		}
 	}
 
-	private void setQuestionInfoByExact(Integer index, Integer detailNumber, QuesStructType st, List<String> quesNames,
-			StructQuestionCountInfo si, Boolean pub, String difficulty, Integer count, List<QuestionDto> questionList) {
+	private void setQuestionInfoByExactItem(StructQuestionCheckDto cd) {
+		StructQuestionCountInfo si = cd.getSi();
 		RandomPaperQuestionDto rq = new RandomPaperQuestionDto();
-		rq.setDetailNumber(detailNumber);
-		rq.setKey(index + "-" + pub + "-" + difficulty);
+		rq.setDetailNumber(cd.getDetailNumber());
+		rq.setKey(cd.getIndex() + "-" + cd.getPub() + "-" + cd.getDifficulty());
 		si.getQuestionInfo().add(rq);
-		if (CollectionUtils.isNotEmpty(questionList)) {
-			Iterator<QuestionDto> it = questionList.iterator();
+		if (CollectionUtils.isNotEmpty(cd.getQuestionList())) {
+			Iterator<QuestionDto> it = cd.getQuestionList().iterator();
 			while (it.hasNext()) {
 				QuestionDto q = it.next();
-				if (checkExactQuesType(quesNames, st, pub, difficulty, q)) {
-					rq.getQuestionIds().add(q.getId());
+				if (cd.getUsedQuesIds().contains(q.getId())) {
 					it.remove();
+				} else {
+					if (checkExactQuesType(cd.getUs().getQuesNames(), cd.getUs().getQuestionType(), cd.getPub(),
+							cd.getDifficulty(), q)) {
+						rq.getQuestionIds().add(q.getId());
+						cd.getUsedQuesIds().add(q.getId());
+						it.remove();
+					}
 				}
 			}
 		}
 		si.setCount(si.getCount() + rq.getQuestionIds().size());
-		if (si.getValid() && count > rq.getQuestionIds().size()) {
+		if (si.getValid() && cd.getNeedCount() > rq.getQuestionIds().size()) {
 			si.setValid(false);
-			si.setInvalidMsg(getExactErrmsg(index, detailNumber, pub, difficulty));
+			si.setInvalidMsg(getExactErrmsg(cd.getIndex(), cd.getDetailNumber(), cd.getPub(), cd.getDifficulty()));
 		}
 	}
 
-	private void setQuestionInfoByBlue(Integer detailNumber, QuesStructType st, List<String> quesNames,
-			StructQuestionInfo sqinfo, CoursePropertyNumberDto cp, List<QuestionDto> questionList) {
-		StructQuestionCountInfo si = null;
+	private void setQuestionInfoByBlue(StructQuestionCheckDto cd) {
+		StructQuestionInfo sqinfo = cd.getSqinfo();
+		CoursePropertyNumberDto cp = cd.getCp();
 		if (cp.getNoPublicDifficulty() > 0) {
-			si = sqinfo.getHardInfo();
-			setQuestionInfoByBlueProp(detailNumber, st, quesNames, si, cp.getPropertyParentId(), cp.getPropertyId(),
-					false, QuestionDifficulty.HARD.getName(), cp.getNoPublicDifficulty(), questionList);
+			cd.setSi(sqinfo.getHardInfo());
+			cd.setPub(false);
+			cd.setDifficulty(QuestionDifficulty.HARD.getName());
+			cd.setNeedCount(cp.getNoPublicDifficulty());
+			setQuestionInfoByBlueProp(cd);
 		}
 		if (cp.getPublicDifficulty() > 0) {
-			si = sqinfo.getHardInfo();
-			setQuestionInfoByBlueProp(detailNumber, st, quesNames, si, cp.getPropertyParentId(), cp.getPropertyId(),
-					true, QuestionDifficulty.HARD.getName(), cp.getPublicDifficulty(), questionList);
+			cd.setSi(sqinfo.getHardInfo());
+			cd.setPub(true);
+			cd.setDifficulty(QuestionDifficulty.HARD.getName());
+			cd.setNeedCount(cp.getPublicDifficulty());
+			setQuestionInfoByBlueProp(cd);
 		}
 
 		if (cp.getNoPublicMedium() > 0) {
-			si = sqinfo.getMediumInfo();
-			setQuestionInfoByBlueProp(detailNumber, st, quesNames, si, cp.getPropertyParentId(), cp.getPropertyId(),
-					false, QuestionDifficulty.MEDIUM.getName(), cp.getNoPublicMedium(), questionList);
+			cd.setSi(sqinfo.getMediumInfo());
+			cd.setPub(false);
+			cd.setDifficulty(QuestionDifficulty.MEDIUM.getName());
+			cd.setNeedCount(cp.getNoPublicMedium());
+			setQuestionInfoByBlueProp(cd);
 		}
 		if (cp.getPublicMedium() > 0) {
-			si = sqinfo.getMediumInfo();
-			setQuestionInfoByBlueProp(detailNumber, st, quesNames, si, cp.getPropertyParentId(), cp.getPropertyId(),
-					true, QuestionDifficulty.MEDIUM.getName(), cp.getPublicMedium(), questionList);
+			cd.setSi(sqinfo.getMediumInfo());
+			cd.setPub(true);
+			cd.setDifficulty(QuestionDifficulty.MEDIUM.getName());
+			cd.setNeedCount(cp.getPublicMedium());
+			setQuestionInfoByBlueProp(cd);
 		}
 		if (cp.getNoPublicSimple() > 0) {
-			si = sqinfo.getEasyInfo();
-			setQuestionInfoByBlueProp(detailNumber, st, quesNames, si, cp.getPropertyParentId(), cp.getPropertyId(),
-					false, QuestionDifficulty.EASY.getName(), cp.getNoPublicSimple(), questionList);
+			cd.setSi(sqinfo.getEasyInfo());
+			cd.setPub(false);
+			cd.setDifficulty(QuestionDifficulty.EASY.getName());
+			cd.setNeedCount(cp.getNoPublicSimple());
+			setQuestionInfoByBlueProp(cd);
 		}
 		if (cp.getPublicSimple() > 0) {
-			si = sqinfo.getEasyInfo();
-			setQuestionInfoByBlueProp(detailNumber, st, quesNames, si, cp.getPropertyParentId(), cp.getPropertyId(),
-					true, QuestionDifficulty.EASY.getName(), cp.getPublicSimple(), questionList);
+			cd.setSi(sqinfo.getEasyInfo());
+			cd.setPub(true);
+			cd.setDifficulty(QuestionDifficulty.EASY.getName());
+			cd.setNeedCount(cp.getPublicSimple());
+			setQuestionInfoByBlueProp(cd);
 		}
 	}
 
-	private void setQuestionInfoByBlueProp(Integer detailNumber, QuesStructType st, List<String> quesNames,
-			StructQuestionCountInfo si, String pproid, String proid, Boolean pub, String difficulty, Integer count,
-			List<QuestionDto> questionList) {
+	private void setQuestionInfoByBlueProp(StructQuestionCheckDto cd) {
+		StructQuestionCountInfo si = cd.getSi();
 		RandomPaperQuestionDto rq = new RandomPaperQuestionDto();
-		rq.setDetailNumber(detailNumber);
-		rq.setKey(bulidPropertyGroupByBlueStruct(pproid, proid, pub, difficulty));
+		rq.setDetailNumber(cd.getDetailNumber());
+		rq.setKey(bulidPropertyGroupByBlueStruct(cd.getCp().getPropertyParentId(), cd.getCp().getPropertyId(),
+				cd.getPub(), cd.getDifficulty()));
 		si.getQuestionInfo().add(rq);
-		if (CollectionUtils.isNotEmpty(questionList)) {
-			Iterator<QuestionDto> it = questionList.iterator();
+		if (CollectionUtils.isNotEmpty(cd.getQuestionList())) {
+			Iterator<QuestionDto> it = cd.getQuestionList().iterator();
 			while (it.hasNext()) {
 				QuestionDto q = it.next();
-				if (checkBlueQuesType(quesNames, st, rq.getKey(), q)) {
-					rq.getQuestionIds().add(q.getId());
+				if (cd.getUsedQuesIds().contains(q.getId())) {
 					it.remove();
+				} else {
+					if (checkBlueQuesType(cd.getDs().getQuesNames(), cd.getDs().getQuestionType(), rq.getKey(), q)) {
+						rq.getQuestionIds().add(q.getId());
+						cd.getUsedQuesIds().add(q.getId());
+						it.remove();
+					}
 				}
 			}
 		}
 		si.setCount(si.getCount() + rq.getQuestionIds().size());
-		if (si.getValid() && count > rq.getQuestionIds().size()) {
+		if (si.getValid() && cd.getNeedCount() > rq.getQuestionIds().size()) {
 			si.setValid(false);
-			si.setInvalidMsg(getBlueErrmsg(detailNumber, pproid, proid, pub, difficulty));
+			si.setInvalidMsg(getBlueErrmsg(cd.getDetailNumber(), cd.getCp().getPropertyParentId(),
+					cd.getCp().getPropertyId(), cd.getPub(), cd.getDifficulty()));
 		}
 	}