weiwenhai 7 år sedan
förälder
incheckning
a51ccf736f

+ 135 - 1
cqb-gen-paper/src/main/java/com/qmth/cqb/genpaper/service/GenPaperService.java

@@ -27,6 +27,7 @@ import com.qmth.cqb.paper.model.Paper;
 import com.qmth.cqb.paper.model.PaperDetail;
 import com.qmth.cqb.paper.model.PaperDetailUnit;
 import com.qmth.cqb.paper.model.PaperStruct;
+import com.qmth.cqb.question.model.QuesProperty;
 import com.qmth.cqb.question.model.Question;
 import com.qmth.cqb.utils.BeanCopierUtil;
 import com.qmth.cqb.utils.CombinationUtils;
@@ -146,7 +147,7 @@ public class GenPaperService {
     private boolean checkQuesType(UnitContext uc,Question question){
         List<String> quesNames = uc.getUnitStruct().getQuesNames();
         if(quesNames != null && quesNames.size() > 0){
-            if(quesNames.contains(question.getQuesName()) && !uc.finish()){
+            if(quesNames.contains(question.getQuesName()) && !uc.finish() && uc.getUnitStruct().getQuestionType().name().equals(question.getQuestionType().name())){
                 return true;
             }
         }
@@ -456,4 +457,137 @@ public class GenPaperService {
         return chooseNestNum;
 
     }
+    
+    /**
+     * 蓝图组卷,根据设定试卷结构组卷
+     * @param genPaperDto
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    public Map<String, Object> genBluePaper(GenPaperDto genPaperDto) {
+        String msg = "";
+        Map<String, Object> paperMsgMap = new HashMap<String, Object>();
+        LinkedList<Question> questions = new LinkedList<Question>();
+        PaperStruct paperStruct = paperStructRepo.findOne(genPaperDto.getPaperStructId());
+        PaperContext paperContext = new PaperContext(paperStruct, genPaperDto.getConditions());
+        List<UnitContext> unitContexts = new LinkedList<UnitContext>();
+        List<DetailContext> detailContexts = paperContext.getDetails();
+        for (DetailContext dc : detailContexts) {
+            unitContexts.addAll(dc.getUnits());
+        }
+        List<Paper> papers = (List<Paper>) paperRepo.findAll(genPaperDto.getPaperIds());
+        for (Paper oldPaper : papers) {
+            List<PaperDetailUnit> unitList = unitRepo.findByPaperOrderByNumber(oldPaper);
+            for (PaperDetailUnit unit : unitList) {
+                Question question = unit.getQuestion();
+                question.setQuesName(unit.getPaperDetail().getName());
+                question.setPropertyGroup(bulidPropertyGroup(question));
+                questions.add(question);
+            }
+
+        }
+        Collections.shuffle(questions);
+        int maxLoopCount = questions.size() * 2;
+        int selectCount = 0;
+        int maxCount = unitContexts.size();
+        int loopCount = 0;
+        while (questions.size() > 0 && (selectCount < maxCount) && loopCount < maxLoopCount) {
+            Question question = questions.removeFirst();
+            boolean structTypeMatch = false;
+            boolean selected = false;
+            for (UnitContext uc : unitContexts) {
+                if (checkBlueQuesType(uc,question)) {
+                    structTypeMatch = true;
+                    if (uc.check(question)) {
+                        uc.select(question);
+                        selected = true;
+                        selectCount++;
+                        break;
+                    }
+                }
+            }
+            if (structTypeMatch && !selected) {
+                questions.addLast(question);
+            }
+            loopCount++;
+        }
+        Set<Question> quesSet = paperContext.getSelectQues();
+        if (quesSet.size() < unitContexts.size()) {
+            msg = "匹配的题源不足,请核查";
+            paperMsgMap.put("msg", msg);
+            return paperMsgMap;
+        }
+        List<Object> list = paperContext.build(paperStruct);
+        if (list != null && list.size() == 3) {
+            Paper paper = (Paper) list.get(0);
+            List<PaperDetail> paperDetails = (List<PaperDetail>) list.get(1);
+            List<PaperDetailUnit> paperDetailunits = (List<PaperDetailUnit>) list.get(2);
+            // 补全paper属性
+            paper.setName(genPaperDto.getPaperName());
+            paper.setCourseNo(genPaperDto.getCourseNo());
+            paper.setCourseName(genPaperDto.getCourseName());
+            Course course = courseRepo.findFirstByCodeAndOrgId(genPaperDto.getCourseNo(),genPaperDto.getOrgId());
+            paper.setCourse(course);
+            paper.setCreator(genPaperDto.getCreator());
+            paper.setOrgId(genPaperDto.getOrgId());
+            paper.setLevel(genPaperDto.getLevel());
+            paper.setCreateTime(CommonUtils.getCurDateTime());
+            paper.setUnitCount(this.getTotalQuesNum(paperDetailunits));
+            paper.setPaperType(PaperType.GENERATE);
+            // 数据入库
+            paper = this.persistentPaper(paperDetailunits, paperDetails, paper);
+            msg = "success";
+            paperMsgMap.put("paper", paper);
+            paperMsgMap.put("msg", msg);
+        }
+        return paperMsgMap;
+    }
+
+    /**
+     * 构建试题属性组合
+     * @param question
+     */
+    private List<String> bulidPropertyGroup(Question question) {
+    	String propertyGroup = null;
+    	List<String> propertyGroups = new ArrayList<String>();
+    	//获取试题关联的多组属性
+    	List<QuesProperty> quesProperties = question.getQuesProperties();
+    	if(quesProperties!=null && quesProperties.size()>0){
+    		for(QuesProperty quesProperty:quesProperties){
+    			if(quesProperty.getSecondProperty() != null){
+    				//有一级  和  二级
+    				propertyGroup = String.valueOf(quesProperty.getFirstProperty().getId()) + "-" + 
+								    String.valueOf(quesProperty.getSecondProperty().getId()) + "-" + 
+								    String.valueOf(question.getPublicity()) + "-" + question.getDifficulty();
+    				propertyGroups.add(propertyGroup);
+    			}else {
+    				//有一级  无  二级
+    				propertyGroup = String.valueOf(quesProperty.getFirstProperty().getId()) + "-" + 
+							   		String.valueOf(question.getPublicity()) + "-" + question.getDifficulty();
+    				propertyGroups.add(propertyGroup);
+				}
+    		}
+    		return propertyGroups;
+    	}
+    	return null;
+	}
+
+	/**
+     * 校验来源大题名称,题型结构,属性,公开度,难度
+     * @param uc
+     * @param question
+     * @return
+     */
+    private boolean checkBlueQuesType(UnitContext uc,Question question){
+        List<String> quesNames = uc.getUnitStruct().getQuesNames();
+        if(quesNames != null && quesNames.size() > 0){
+            if(quesNames.contains(question.getQuesName()) && !uc.finish() && uc.getUnitStruct().getQuestionType().name().equals(question.getQuestionType().name())){
+                if(question.getPropertyGroup().contains(uc.getUnitStruct().getPropertyGroup())){
+                	return true;
+                }
+            }
+        }
+        return false;
+    }
+
 }

+ 0 - 11
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailStruct.java

@@ -59,8 +59,6 @@ public class PaperDetailStruct implements Serializable{
 	
 	private List<CoursePropertyNumberDto> coursePropertyNumberDtos;
 	
-	private List<CoursePropertyNumber> coursePropertyNumbers;
-
 	public static long getSerialVersionUID() {
 		return serialVersionUID;
 	}
@@ -221,13 +219,4 @@ public class PaperDetailStruct implements Serializable{
 		this.coursePropertyNumberDtos = coursePropertyNumberDtos;
 	}
 
-	public List<CoursePropertyNumber> getCoursePropertyNumbers() {
-		return coursePropertyNumbers;
-	}
-
-	public void setCoursePropertyNumbers(
-			List<CoursePropertyNumber> coursePropertyNumbers) {
-		this.coursePropertyNumbers = coursePropertyNumbers;
-	}
-
 }

+ 64 - 2
cqb-paper/src/main/java/com/qmth/cqb/paper/model/PaperDetailUnitStruct.java

@@ -3,6 +3,8 @@ package com.qmth.cqb.paper.model;
 import java.io.Serializable;
 import java.util.List;
 
+import com.qmth.cqb.paper.dto.CoursePropertyNumberDto;
+
 import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
 /**
@@ -22,16 +24,39 @@ public class PaperDetailUnitStruct implements Serializable {
 
     private List<String> quesNames;//来源大题
     
-    private String propertyName; //属性名
+    private String propertyId; //属性名
     
-    private Double difficulty; //难度
+    private String difficulty; //难度
     
     private Boolean publicity; //公开度
+    
+    private String propertyGroup; //单个属性组(用来筛选题目)
 
     public static long getSerialVersionUID() {
         return serialVersionUID;
     }
 
+    public PaperDetailUnitStruct(){
+    	
+    }
+    
+    public PaperDetailUnitStruct(PaperDetailStruct paperDetailStruct,int number,CoursePropertyNumberDto coursePropertyNumberDto){
+    	this.setScore(paperDetailStruct.getScore());
+    	this.setId(String.valueOf(number));
+    	this.setNumber(number);
+    	this.setQuestionType(paperDetailStruct.getQuestionType());
+    	this.setQuesNames(paperDetailStruct.getQuesNames());
+    	this.setPropertyId(buildPropertyId(coursePropertyNumberDto));
+    }
+    
+    private String buildPropertyId(CoursePropertyNumberDto coursePropertyNumberDto){
+    	//有一级属性和二姐属性
+    	if(coursePropertyNumberDto.getPropertyParentId() != 0){
+    		return coursePropertyNumberDto.getPropertyParentId() + "-" + coursePropertyNumberDto.getPropertyId();
+    	}
+    	return String.valueOf(coursePropertyNumberDto.getPropertyId());
+    }
+    
     public String getId() {
         return id;
     }
@@ -71,4 +96,41 @@ public class PaperDetailUnitStruct implements Serializable {
     public void setQuesNames(List<String> quesNames) {
         this.quesNames = quesNames;
     }
+
+	public Boolean getPublicity() {
+		return publicity;
+	}
+
+	public void setPublicity(Boolean publicity) {
+		this.publicity = publicity;
+	}
+
+	public static long getSerialversionuid() {
+		return serialVersionUID;
+	}
+
+	public String getDifficulty() {
+		return difficulty;
+	}
+
+	public void setDifficulty(String difficulty) {
+		this.difficulty = difficulty;
+	}
+
+	public String getPropertyId() {
+		return propertyId;
+	}
+
+	public void setPropertyId(String propertyId) {
+		this.propertyId = propertyId;
+	}
+
+	public String getPropertyGroup() {
+		return propertyGroup;
+	}
+
+	public void setPropertyGroup(String propertyGroup) {
+		this.propertyGroup = propertyGroup;
+	}
+	
 }

+ 12 - 4
cqb-paper/src/main/java/com/qmth/cqb/paper/service/ImportPaperService.java

@@ -733,10 +733,10 @@ public class ImportPaperService {
             	answerStart = false;
 			}
             else if (tmpText.startsWith(ImportPaperMsg.difficulty)) {
-            	// 检测到难度开始段落
+            	// 检测到难度开始段落  difficultyDegree
             	String dif = getContent(tmpText, ImportPaperMsg.difficulty);
-            	checkDiffculty(difficulty,dif,importPaperCheck,subQuesNum);
-            	question.setDifficulty(difficulty);
+            	checkDiffculty(difficulty,dif,importPaperCheck,subQuesNum,question);
+            	question.setDifficultyDegree(difficulty);
             	answerStart = false;
 			}
             else if (tmpText.startsWith(ImportPaperMsg.publicity)) {
@@ -1227,16 +1227,24 @@ public class ImportPaperService {
      * @param subQuesNum
      * @throws Exception
      */
-    private void checkDiffculty(Double difficulty,String tmpText,ImportPaperCheck importPaperCheck,int subQuesNum)throws Exception{
+    private void checkDiffculty(Double difficulty,String tmpText,ImportPaperCheck importPaperCheck,int subQuesNum,Question question)throws Exception{
     	if(StringUtils.isBlank(tmpText)){
     		//如果为空,默认难度0.5
     		difficulty = 0.5;
+    		question.setDifficulty("中");
     	}else if(!isInteger(tmpText) || (Double.parseDouble(tmpText)<1) || (Double.parseDouble(tmpText)>10)){
     		//如果不是整数,或者在1到10之间,就报错
     		importPaperCheck.setErrorInfo(getQuesNumInfo(importPaperCheck.quesName, subQuesNum)+"中,试题难度只能是1到10之间整数");
     		throw new PaperException(importPaperCheck.errorInfo);
     	}else {
     		difficulty = Double.parseDouble(tmpText)%10;
+    		if(difficulty>0 && difficulty<0.4){
+    			question.setDifficulty("易");
+    		}else if (difficulty>0.3 && difficulty<0.8) {
+    			question.setDifficulty("中");
+			}else {
+				question.setDifficulty("难");
+			}
 		}
     }
     

+ 76 - 1
cqb-paper/src/main/java/com/qmth/cqb/paper/service/PaperStructService.java

@@ -168,6 +168,73 @@ public class PaperStructService {
             paperStruct.setDetailUnitCount(paperDetailStructs.stream().mapToInt(PaperDetailStruct::getDetailCount).sum());
         }else {
 			//新增蓝图试卷结构
+        	for(PaperDetailStruct paperDetailStruct : paperDetailStructs){
+        		List oldStructs = paperDetailStruct.getPaperDetailUnitStructs();
+                if (oldStructs != null && oldStructs.size() > 0) {
+                    oldStructs.clear();
+                }
+                List<PaperDetailUnitStruct> unitStructs = new ArrayList<PaperDetailUnitStruct>();
+                for(CoursePropertyNumberDto coursePropertyNumberDto:paperDetailStruct.getCoursePropertyNumberDtos()){
+                	//取到子节点上的题目
+                	if(coursePropertyNumberDto.getDisable()){
+                		//公开简单数量
+                    	for(int i=0;i<coursePropertyNumberDto.getPublicSimple();i++){
+                    		++number;
+                    		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct(paperDetailStruct,number,coursePropertyNumberDto);
+                    		unitStruct.setDifficulty("易");
+                    		unitStruct.setPublicity(true);
+                    		unitStruct.setPropertyGroup(buildPropertyGroup(unitStruct));
+                    		unitStructs.add(unitStruct);
+                    	}
+                    	//公开中等数量
+                    	for(int i=0;i<coursePropertyNumberDto.getPublicMedium();i++){
+                    		++number;
+                    		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct(paperDetailStruct,number,coursePropertyNumberDto);
+                    		unitStruct.setDifficulty("中");
+                    		unitStruct.setPublicity(true);
+                    		unitStruct.setPropertyGroup(buildPropertyGroup(unitStruct));
+                    		unitStructs.add(unitStruct);
+                    	}
+                    	//公开困难数量
+                    	for(int i=0;i<coursePropertyNumberDto.getPublicDifficulty();i++){
+                    		++number;
+                    		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct(paperDetailStruct,number,coursePropertyNumberDto);
+                    		unitStruct.setDifficulty("难");
+                    		unitStruct.setPublicity(true);
+                    		unitStruct.setPropertyGroup(buildPropertyGroup(unitStruct));
+                    		unitStructs.add(unitStruct);
+                    	}
+                    	//非公开简单数量
+                    	for(int i=0;i<coursePropertyNumberDto.getNoPublicSimple();i++){
+                    		++number;
+                    		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct(paperDetailStruct,number,coursePropertyNumberDto);
+                    		unitStruct.setDifficulty("易");
+                    		unitStruct.setPublicity(false);
+                    		unitStruct.setPropertyGroup(buildPropertyGroup(unitStruct));
+                    		unitStructs.add(unitStruct);
+                    	}
+                    	//非公开中等数量
+                    	for(int i=0;i<coursePropertyNumberDto.getNoPublicMedium();i++){
+                    		++number;
+                    		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct(paperDetailStruct,number,coursePropertyNumberDto);
+                    		unitStruct.setDifficulty("中");
+                    		unitStruct.setPublicity(false);
+                    		unitStruct.setPropertyGroup(buildPropertyGroup(unitStruct));
+                    		unitStructs.add(unitStruct);
+                    	}
+                    	//非公开困难
+                    	for(int i=0;i<coursePropertyNumberDto.getNoPublicDifficulty();i++){
+                    		++number;
+                    		PaperDetailUnitStruct unitStruct = new PaperDetailUnitStruct(paperDetailStruct,number,coursePropertyNumberDto);
+                    		unitStruct.setDifficulty("难");
+                    		unitStruct.setPublicity(false);
+                    		unitStruct.setPropertyGroup(buildPropertyGroup(unitStruct));
+                    		unitStructs.add(unitStruct);
+                    	}
+                	}
+                }
+                paperDetailStruct.setPaperDetailUnitStructs(unitStructs);
+        	}
         	paperStruct.setPaperStrucType(PaperStructType.BLUEPRINT);
         	//计算试卷结构难度
 			Double difficulty = getDifficulty(paperDetailStructs);
@@ -180,7 +247,15 @@ public class PaperStructService {
         return paperStructRepo.save(paperStruct);
     }
     
-    public Double getDifficulty(List<PaperDetailStruct> paperDetailStructs) {
+    /**
+     * 构建单个属性组(用来筛选题目)
+     * @param unitStruct
+     */
+    private String buildPropertyGroup(PaperDetailUnitStruct unitStruct) {
+    	return unitStruct.getPropertyId() + "-" + String.valueOf(unitStruct.getPublicity()) + "-" + unitStruct.getDifficulty();
+	}
+
+	public Double getDifficulty(List<PaperDetailStruct> paperDetailStructs) {
 		if(paperDetailStructs != null && paperDetailStructs.size() >0){
 			Integer simpleCount = 0;
 			Integer mediumCount = 0;

+ 10 - 0
cqb-question-resource/src/main/java/com/qmth/cqb/question/model/QuesProperty.java

@@ -6,6 +6,8 @@ import com.qmth.cqb.question.model.Property;
 public class QuesProperty implements Serializable{
 
 	private static final long serialVersionUID = -2303143377325064933L;
+	
+	private String coursePropertyName;//课程属性名
 
 	private Property firstProperty;//一级属性
 	
@@ -39,5 +41,13 @@ public class QuesProperty implements Serializable{
 	public static long getSerialversionuid() {
 		return serialVersionUID;
 	}
+
+	public String getCoursePropertyName() {
+		return coursePropertyName;
+	}
+
+	public void setCoursePropertyName(String coursePropertyName) {
+		this.coursePropertyName = coursePropertyName;
+	}
 	
 }

+ 31 - 10
cqb-question-resource/src/main/java/com/qmth/cqb/question/model/Question.java

@@ -94,11 +94,16 @@ public class Question implements Serializable {
      */
     private List<QuesProperty> quesProperties;//关联多组属性
     
-    private Double difficulty; //难度
+    private Double difficultyDegree ; //难度系数
     
     private Boolean publicity; //公开度
     
+    private String difficulty;// 难度
+    
+    private List<String> propertyGroup;//试题属性组合(蓝图组卷使用)
+    
     public static long getSerialVersionUID() {
+    	
         return serialVersionUID;
     }
 
@@ -339,14 +344,6 @@ public class Question implements Serializable {
         this.quesPkgPathId = quesPkgPathId;
     }
 
-	public Double getDifficulty() {
-		return difficulty;
-	}
-
-	public void setDifficulty(Double difficulty) {
-		this.difficulty = difficulty;
-	}
-
 	public Boolean getPublicity() {
 		return publicity;
 	}
@@ -362,5 +359,29 @@ public class Question implements Serializable {
 	public void setQuesProperties(List<QuesProperty> quesProperties) {
 		this.quesProperties = quesProperties;
 	}
-    
+
+	public Double getDifficultyDegree() {
+		return difficultyDegree;
+	}
+
+	public void setDifficultyDegree(Double difficultyDegree) {
+		this.difficultyDegree = difficultyDegree;
+	}
+
+	public String getDifficulty() {
+		return difficulty;
+	}
+
+	public void setDifficulty(String difficulty) {
+		this.difficulty = difficulty;
+	}
+
+	public List<String> getPropertyGroup() {
+		return propertyGroup;
+	}
+
+	public void setPropertyGroup(List<String> propertyGroup) {
+		this.propertyGroup = propertyGroup;
+	}
+
 }