Browse Source

新功能提交

weiwenhai 7 năm trước cách đây
mục cha
commit
c5c8427481

+ 1 - 1
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/GenPaperController.java

@@ -70,7 +70,7 @@ public class GenPaperController extends ControllerSupport {
 			}
 			//如果是组一套试卷
 			if (genPaperDto.getGenNumber() == 1) {
-				//判断抽题类型  按数量  按分数
+				//判断抽题类型  按数量  按分数   genPaperDto.getSimpleGenPaperPolicy() == RandomGenPaperPolicy.BY_QUESTIONNUM
 	            if (genPaperDto.getSimpleGenPaperPolicy().getKey() == 1L) {
 	                paperMap = genPaperService.genPaperByQuestionNumW(genPaperDto,user);
 	            }else {

+ 22 - 0
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/service/core/api/QuesController.java

@@ -1,6 +1,8 @@
 package cn.com.qmth.examcloud.service.core.api;
 
 import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -148,4 +150,24 @@ public class QuesController extends ControllerSupport {
         long count = quesService.findQuesCount(searchCondition);
         return new ResponseEntity<Object>(count, HttpStatus.OK);
     }
+    
+    @ApiOperation(value = "根据试卷ids更新试题属性", notes = "根据试卷ids更新试题属性")
+    @PutMapping(value = "/question/updatePro/paperIds/{ids}/{difficultyDegree}/{publicity}")
+    public ResponseEntity<Object> updateProByPapers(@PathVariable String ids,
+    												@PathVariable Double difficultyDegree,
+    												@PathVariable Boolean publicity){
+    	List<String> paperList = Stream.of(ids.split(",")).collect(Collectors.toList());
+    	quesService.updateProByPapers(paperList,difficultyDegree,publicity);
+    	return new ResponseEntity<Object>(HttpStatus.OK);
+    }
+    
+    @ApiOperation(value = "根据课程代码更新试题属性", notes = "根据课程代码更新试题属性")
+    @PutMapping(value = "/question/updatePro/courseCode/{courseCode}/{difficultyDegree}/{publicity}/{orgId}")
+    public ResponseEntity<Object> updateProByCourse(@PathVariable String courseCode,
+													@PathVariable Double difficultyDegree,
+													@PathVariable Boolean publicity,
+													@PathVariable String orgId){
+    	quesService.updateProByCourse(courseCode,difficultyDegree,publicity,orgId);
+    	return new ResponseEntity<Object>(HttpStatus.OK);
+    }
 }

+ 3 - 2
examcloud-core-questions-base/src/main/java/cn/com/qmth/examcloud/core/questions/base/CommonUtils.java

@@ -734,7 +734,7 @@ public final class CommonUtils {
      * @param original  随机数范围
      * @return
      */
-    public static List<Integer> getTandom(List<Integer> list,int size,int original){
+    public static List<Integer> getRandom(List<Integer> list,int size,int original){
     	Random rand = new Random();
 		Integer i = rand.nextInt(original);
 		if(!list.contains(i) && i<original){
@@ -743,7 +743,7 @@ public final class CommonUtils {
 				return list;
 			}
 		}
-		getTandom(list,size,original);
+		getRandom(list,size,original);
     	return list;
     }
     
@@ -782,4 +782,5 @@ public final class CommonUtils {
             return sb.toString();
         }
     }
+    
 }

+ 120 - 2
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/ImportPaperService.java

@@ -2,14 +2,17 @@ package cn.com.qmth.examcloud.core.questions.service;
 
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.OutputStream;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Random;
 import java.util.Set;
 import java.util.UUID;
 import java.util.regex.Pattern;
@@ -22,6 +25,7 @@ import cn.com.qmth.examcloud.core.questions.dao.CoursePropertyRepo;
 import cn.com.qmth.examcloud.core.questions.dao.PropertyRepo;
 import cn.com.qmth.examcloud.core.questions.dao.QuesPkgPathRepo;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionPkgPath;
+import main.java.com.UpYun;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
@@ -32,6 +36,7 @@ import org.docx4j.wml.P;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.domain.Example;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.commons.CommonsMultipartFile;
@@ -52,6 +57,7 @@ import cn.com.qmth.examcloud.core.questions.dao.entity.Property;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuesOption;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuesProperty;
 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.dao.entity.QuestionType;
 import cn.com.qmth.examcloud.core.questions.service.QuesService;
 import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
@@ -108,6 +114,23 @@ public class ImportPaperService {
     @Autowired
     PropertyRepo propertyRepo;
     
+    @Autowired
+	QuestionAudioService questionAudioService;
+    
+    @Value("${upyun.bucketName}")
+	protected String bucketName;
+	
+	@Value("${upyun.userName}")
+	protected String userName;
+	
+	@Value("${upyun.password}")
+	protected String password;
+	
+	@Value("${upyun.audio.uploadUrl}")
+    private String upyunRadioPath;
+	
+	public static final String TEMP_FILE_EXP = "docxExport/";
+    
     /**
      * 获取上传文件
      *
@@ -1756,7 +1779,7 @@ public class ImportPaperService {
         				paperDetailUnit.setSubScoreList(oldPaperDetailUnit.getSubScoreList());
         				paperDetailUnit.setPaperDetail(paperDetail);
         				paperDetailUnit.setQuestionType(oldPaperDetailUnit.getQuestionType());
-        				copyQuestion(paperDetailUnit,oldPaperDetailUnit,course);
+        				copyQuestion(paperDetailUnit,oldPaperDetailUnit,course,user);
         				paperDetailUnit.setOptionOrder(oldPaperDetailUnit.getOptionOrder());
         				paperDetailUnit.setCreator(user.getDisplayName());
         				paperDetailUnit.setCreateTime(CommonUtils.getCurDateTime());
@@ -1769,7 +1792,7 @@ public class ImportPaperService {
     	}
 	}
 
-	private void copyQuestion(PaperDetailUnit paperDetailUnit,PaperDetailUnit oldPaperDetailUnit,Course course) {
+	private void copyQuestion(PaperDetailUnit paperDetailUnit,PaperDetailUnit oldPaperDetailUnit,Course course,User user) {
 		Question oldQuestion = oldPaperDetailUnit.getQuestion();
 		Question newQuestion = BeanCopierUtil.copyProperties(oldQuestion,Question.class);
 		QuestionPkgPath oldQuesPkgPath = quesPkgPathRepo.findFirstById(oldQuestion.getQuesPkgPathId());
@@ -1782,8 +1805,103 @@ public class ImportPaperService {
 		newQuestion.setQuesProperties(null);
 		newQuestion.setPropertyGroup(null);
 		newQuestion = quesRepo.save(newQuestion);
+		//复制音频
+		if(oldQuestion.getHasAudio()!=null && oldQuestion.getHasAudio()){
+			try {
+				//查询旧音频
+				List<QuestionAudio> oldQuestionAudios = questionAudioService.findQuestionAudiosByQuestionId(oldQuestion.getId());
+		    	//复制文件下载路径
+				String copyAudioPath = TEMP_FILE_EXP + File.separator + user.getDisplayName()+"_copyAudioPath";
+				//新建文件夹
+		    	File copyAudioDir = new File(copyAudioPath);
+		    	if(!copyAudioDir.exists()){
+		    		copyAudioDir.mkdirs();
+		    	}
+				for(QuestionAudio oldAudio:oldQuestionAudios){
+					//生成随机数,防止文件重名
+					Random random = new Random();
+			    	int randomNumber = random.nextInt(1000);
+			    	//定义文件下载名称,下载音频文件
+					String newAudioFileName = newQuestion.getId()+"_"+randomNumber+"_"+ oldAudio.getFileName();
+					UpYun upyun = new UpYun(bucketName,userName,password);
+					//下载音频
+					File audioFile = new File(copyAudioPath + File.separator + newAudioFileName);
+					try{
+						upyun.readFile(oldAudio.getFileUrl(), audioFile);
+					}catch(Exception e){
+						e.printStackTrace();
+						throw new RuntimeException("下载音频失败");
+					}
+					//重新上传新的音频文件
+					upyun.writeFile(upyunRadioPath+newAudioFileName, audioFile,true);
+					audioFile.delete();
+					//拷贝旧对象
+					QuestionAudio newAudio = new QuestionAudio(newQuestion.getId(), oldAudio.getFileName(), upyunRadioPath+newAudioFileName);
+					newAudio.setCreateTime(new Date());
+					newAudio.setCreateUser(user.getDisplayName());
+					questionAudioService.saveQuestionAudio(newAudio,user);
+				}
+				//删除文件夹
+				copyAudioDir.delete();
+				//查询新音频
+				List<QuestionAudio> newQuestionAudios = questionAudioService.findQuestionAudiosByQuestionId(newQuestion.getId());
+				Map<String,String> newMap = new HashMap<String, String>();
+				for(QuestionAudio audio:newQuestionAudios){
+					newMap.put(audio.getFileName(), audio.getId());
+				}
+				//在题干html片段中替换音频存储id
+				String body = newQuestion.getQuesBody();
+				List<String> ids = CommonUtils.getTagANames(body);
+				List<String> names = CommonUtils.getTagANames2(body);
+				Map<String, String> oldBodyMap = new HashMap<String, String>();
+				for(int i=0;i<ids.size();i++){
+					oldBodyMap.put(names.get(i), ids.get(i));
+				}
+				for(String key:oldBodyMap.keySet()){
+					body = body.replace(oldBodyMap.get(key), newMap.get(key));
+				}
+				newQuestion.setQuesBody(body);
+				//替换选项中的音频存储id
+				if(newQuestion.getQuesOptions()!=null&&newQuestion.getQuesOptions().size()>0){
+					for(QuesOption option:newQuestion.getQuesOptions()){
+						String newOptionBody = option.getOptionBody();
+						List<String> optionIds = CommonUtils.getTagANames(newOptionBody);
+						List<String> optionNames = CommonUtils.getTagANames2(newOptionBody);
+						Map<String, String> oldOptionMap = new HashMap<String, String>();
+						for(int i=0;i<optionIds.size();i++){
+							oldOptionMap.put(optionNames.get(i), optionIds.get(i));
+						}
+						for(String key:oldOptionMap.keySet()){
+							newOptionBody = newOptionBody.replace(oldOptionMap.get(key), newMap.get(key));
+						}
+						option.setOptionBody(newOptionBody);
+					}
+				}
+				newQuestion = quesRepo.save(newQuestion);
+			}catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
 		paperDetailUnit.setQuestion(newQuestion);
 	}
+	
+	public static void main(String[] args){
+		try {
+			String copyAudioPath = "H:" + File.separator + "audio";
+			String newAudioFileName = "111_2.mp3";
+			UpYun upyun = new UpYun("exam-cloud-test","examcloud","examcloud123456");
+			//下载音频
+			File audioFile = new File(copyAudioPath + File.separator + newAudioFileName);
+			upyun.readFile("/comm-ques-bank/dev/audio/5b387c9f80a362313ce94162_503_1_1_1.mp3", audioFile);
+			//重新上传新的音频文件
+			File audioFileNew = new File(copyAudioPath + File.separator + newAudioFileName);
+			upyun.writeFile("/comm-ques-bank/dev/audio/"+newAudioFileName, audioFileNew,true);
+			//audioFile.delete();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		System.out.println("OK");
+	}
 
 	//克隆原试卷所有属性
     private Paper cloneOldPaper(Paper oldPaper,String paperName,Course course, User user) {

+ 16 - 1
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/QuesService.java

@@ -9,7 +9,6 @@ import org.springframework.stereotype.Service;
 
 import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionSearchCondition;
-
 import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 
 /**
@@ -92,4 +91,20 @@ public interface QuesService {
      * @return
      */
     public long findQuesCount(QuestionSearchCondition searchCondition);
+    
+    /**
+     * 根据试卷ids集合更新试题属性
+     * @param paperList
+     * @param difficultyDegree
+     * @param publicity
+     */
+	public void updateProByPapers(List<String> paperList,Double difficultyDegree, Boolean publicity);
+	
+	/**
+	 * 根据课程代码更新试题属性
+	 * @param courseCode
+	 * @param difficultyDegree
+	 * @param publicity
+	 */
+	public void updateProByCourse(String courseCode,Double difficultyDegree,Boolean publicity,String orgId);
 }

+ 38 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/CqdxExportPaperService.java

@@ -1,11 +1,13 @@
 package cn.com.qmth.examcloud.core.questions.service.export;
 
 import java.io.File;
+import java.math.BigDecimal;
 import java.util.List;
 
 import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
 import org.springframework.stereotype.Service;
 
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 import cn.com.qmth.examcloud.commons.web.security.bean.User;
 import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.ExamFileType;
@@ -14,6 +16,7 @@ import cn.com.qmth.examcloud.core.questions.base.word.DocxProcessUtil;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExportStructure;
 import cn.com.qmth.examcloud.core.questions.dao.entity.ExtractConfig;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionTypeNum;
+import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperDetailExp;
 import cn.com.qmth.examcloud.core.questions.service.bean.dto.PaperExp;
 
 /**
@@ -54,6 +57,41 @@ public class CqdxExportPaperService extends ExportPaperAbstractService {
 			DocxProcessUtil.processImage(zipFileName+File.separator+answerFileName,getPkgList(paperId));
 		}
 	}
+	
+	/**
+   	 * 设置大题标题
+   	 * @param paperDetailExps
+   	 */
+   	public void setExpDtoTitle(List<PaperDetailExp> paperDetailExps) {
+   		for(PaperDetailExp paperDetailExp:paperDetailExps){
+   			String title = "";
+   			String titleDetail = null;
+   			String totalScore = BigDecimal.valueOf(paperDetailExp.getScore()).stripTrailingZeros().toPlainString();
+   			QuesStructType type = paperDetailExp.getPaperDetailUnits().get(0).getQuestionType();
+   			String questionScore = checkPaperDetailUnitScore(paperDetailExp);
+   			if(questionScore!=null){
+   				questionScore = deletePoint(questionScore);
+   			}
+   			String scoreString = questionScore==null?"":"每小题"+questionScore+"分,";
+   			if (type == QuesStructType.SINGLE_ANSWER_QUESTION) {
+   				title = "(本大题共" + paperDetailExp.getUnitCount() + "小题,"
+   						+ scoreString + "共" + totalScore + "分)";
+   				titleDetail = "在每小题列出的备选项中只有一个符合题目要求的,请将其选出并将“答题卡”的相应代码涂黑,错涂、多涂或未涂均无分";
+   			} else if (type == QuesStructType.MULTIPLE_ANSWER_QUESTION) {
+   				title = "(本大题共" + paperDetailExp.getUnitCount() + "小题,"
+   						+ scoreString + "共" + totalScore+ "分)";
+   				titleDetail = "在每小题列出的备选项中至少有两个符合题目要求,请将符合项选出并将“答题卡”的相应代码涂黑,错涂、多涂、少涂或未涂均无分";
+   			} else if (type == QuesStructType.BOOL_ANSWER_QUESTION) {
+   				title = "(本大题共" + paperDetailExp.getUnitCount() + "小题,"
+   						+ scoreString + "共" + totalScore+ "分。"
+   						+ "正确的填涂√、错误填涂×。错涂、多涂或未涂均无分)";
+   			} else {
+   				title = "(本大题共"+paperDetailExp.getUnitCount()+"小题,"+scoreString+"共"+totalScore+"分)";
+   			}
+   			paperDetailExp.setTitle(title);
+   			paperDetailExp.setTitleDetail(titleDetail);
+   		}
+   	}
 
 	@Override
     public void uploadFile(ExtractConfig extractConfig,String paperId,ExportStructure exportStructure,User accessUser) throws Exception{

+ 1 - 1
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/DzkdExportPaperService.java

@@ -159,7 +159,7 @@ public class DzkdExportPaperService extends ExportPaperAbstractService {
 	}
 	
 	//去掉分数后面的小数点
-  	private String deletePoint(String str) {
+  	protected String deletePoint(String str) {
   		if(str.indexOf(".0")>-1){
   			return str.replace(".0", "");
   		}

+ 1 - 1
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/export/ExportPaperAbstractService.java

@@ -798,7 +798,7 @@ public abstract class ExportPaperAbstractService {
     }
     
     //去掉分数后面的小数点
-  	private String deletePoint(String str) {
+  	protected String deletePoint(String str) {
   		if(str.indexOf(".0")>-1){
   			return str.replace(".0", "");
   		}

+ 11 - 6
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/GenPaperService.java

@@ -267,7 +267,7 @@ public class GenPaperService {
     			}
     			//生成随机抽取的题号
     			List<Integer> questionsIndex = new ArrayList<Integer>();
-    			questionsIndex = CommonUtils.getTandom(questionsIndex, unitList.size(), unitList.size());
+    			questionsIndex = CommonUtils.getRandom(questionsIndex, unitList.size(), unitList.size());
     			//定义随机抽题的数量
     			double lastScore = 0;
     			List<PaperDetailUnit> newDetailUnits = new ArrayList<PaperDetailUnit>();
@@ -308,15 +308,19 @@ public class GenPaperService {
      */
     public Map<String, Object> genPaperByQuestionNumW(GenPaperDto genPaperDto,User user) {
     	//定义返回给前端的集合
-    	Map<String, Object> paperMsgMap = new HashMap<String, Object>();
+    	
+    	//Map<String, Object> paperMsgMap = new HashMap<String, Object>();
+    	
     	//获取所有试卷与抽题数
-    	Map<String, Double> paperMap = genPaperDto.getSimpleParams();
-    	paperMsgMap = extractByQuestionNum(paperMap,paperMsgMap,genPaperDto,user);
+    	//Map<String, Double> paperMap = genPaperDto.getSimpleParams();
+    	
+    	Map<String, Object> paperMsgMap = extractByQuestionNum(genPaperDto.getSimpleParams(),genPaperDto,user);
     	return paperMsgMap;
     }
     
     //通过题目数量组卷
-    private Map<String, Object> extractByQuestionNum(Map<String, Double> paperMap,Map<String, Object> paperMsgMap,GenPaperDto genPaperDto,User user){
+    private Map<String, Object> extractByQuestionNum(Map<String, Double> paperMap,GenPaperDto genPaperDto,User user){
+    	Map<String, Object> paperMsgMap = new HashMap<String, Object>();
     	if(paperMap != null && paperMap.size()>0){
     		//定义随机选中的小题集合
     		List<PaperDetailUnit> selectedUnits = new ArrayList<PaperDetailUnit>();
@@ -331,13 +335,14 @@ public class GenPaperService {
     			//计算所有题目数量
     			int questionSum = countQuestions(unitList);
     			if(needNumber>questionSum){
+    				//unitList.get(0).getPaper.getName();
     				Paper paper = paperRepo.findOne(paperId);
     				paperMsgMap.put("msg", "\""+paper.getName()+"\"试卷,题源不够");
                     return paperMsgMap;
     			}
     			//生成随机抽取的题号
     			List<Integer> questionsIndex = new ArrayList<Integer>();
-    			questionsIndex = CommonUtils.getTandom(questionsIndex, unitList.size(), unitList.size());
+    			questionsIndex = CommonUtils.getRandom(questionsIndex, unitList.size(), unitList.size());
     			//定义随机抽题的数量
     			int lastNumber = 0;
     			List<PaperDetailUnit> newDetailUnits = new ArrayList<PaperDetailUnit>();

+ 85 - 1
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/QuesServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.examcloud.core.questions.service.impl;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -34,11 +35,15 @@ import org.springframework.data.domain.Sort.Order;
 import org.springframework.data.mongodb.core.MongoTemplate;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
 import org.springframework.stereotype.Service;
 
-import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
+import com.netflix.infix.lang.infix.antlr.EventFilterParser.null_predicate_return;
 
+import cn.com.qmth.examcloud.common.dto.question.enums.QuesStructType;
 import cn.com.qmth.examcloud.core.questions.dao.CourseRepo;
+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.QuesRepo;
 import cn.com.qmth.examcloud.core.questions.dao.QuestionAudioRepo;
 import cn.com.qmth.examcloud.core.questions.service.QuesService;
@@ -72,6 +77,12 @@ public class QuesServiceImpl implements QuesService{
     @Autowired
     private QuesPkgPathRepo quesPkgPathRepo;
     
+    @Autowired
+    private PaperDetailUnitRepo unitRepo;
+    
+    @Autowired
+    private PaperRepo paperRepo;
+    
     private static WordprocessingMLPackage wordMLPackage = null;
     
     static{
@@ -599,5 +610,78 @@ public class QuesServiceImpl implements QuesService{
         long count = this.mongoTemplate.count(query, Question.class);
 		return count;
 	}
+
+	@Override
+	public void updateProByPapers(List<String> paperList,Double difficultyDegree, Boolean publicity) {
+		String difficulty = "";
+		if(difficultyDegree>0 && difficultyDegree<0.4){
+			difficulty = "难";
+		}else if (difficultyDegree>0.3 && difficultyDegree<0.8) {
+			difficulty = "中";
+		}else {
+			difficulty = "易";
+		}
+		List<String> quesIds = new ArrayList<String>();
+		List<Question> subQues = new ArrayList<Question>();
+		for(String id:paperList){
+			Paper paper = paperRepo.findOne(id);
+			List<PaperDetailUnit> paperDetailUnits = unitRepo.findByPaper(paper);
+			for(PaperDetailUnit unit:paperDetailUnits){
+				Question question = unit.getQuestion();
+				if(question.getSubQuestions()!=null && question.getSubQuestions().size()>0){
+					List<Question> subQuestions = question.getSubQuestions();
+					for(Question subQuestion:subQuestions){
+						subQuestion.setDifficultyDegree(difficultyDegree);
+						subQuestion.setDifficulty(difficulty);
+						subQuestion.setPublicity(publicity);
+						question.setSubQuestions(subQuestions);
+					}
+					subQues.add(question);
+				}
+				quesIds.add(question.getId());
+			}
+		}
+		quesRepo.save(subQues);
+		if(quesIds != null && quesIds.size()>0){
+			Query query = new Query();
+			query.addCriteria(Criteria.where("id").in(quesIds));
+			//query.addCriteria(Criteria.where("subQuestions.id").in(subQuesIds));
+			Update update = Update.update("difficultyDegree", difficultyDegree).set("publicity", publicity).set("difficulty", difficulty);
+			//Update update = Update.update("subQuestions.$.difficultyDegree", difficultyDegree).set("subQuestions.$.publicity", publicity);
+			this.mongoTemplate.updateMulti(query, update, Question.class);
+		}
+	}
+
+	@Override
+	public void updateProByCourse(String courseCode, Double difficultyDegree, Boolean publicity,String orgId) {
+		String difficulty = "";
+		if(difficultyDegree>0 && difficultyDegree<0.4){
+			difficulty = "难";
+		}else if (difficultyDegree>0.3 && difficultyDegree<0.8) {
+			difficulty = "中";
+		}else {
+			difficulty = "易";
+		}
+		Query query = new Query();
+        query.addCriteria(Criteria.where("orgId").is(orgId+""));
+        query.addCriteria(Criteria.where("course.enable").is("true"));
+        query.addCriteria(Criteria.where("course.code").is(courseCode));
+        List<Question> questionList = this.mongoTemplate.find(query,Question.class);
+        if(questionList != null && questionList.size() >0){
+        	for(Question question:questionList){
+        		question.setDifficultyDegree(difficultyDegree);
+        		question.setDifficulty(difficulty);
+        		question.setPublicity(publicity);
+        		if(question.getSubQuestions() != null && question.getSubQuestions().size() >0){
+        			for(Question subQues:question.getSubQuestions()){
+        				subQues.setDifficultyDegree(difficultyDegree);
+        				subQues.setDifficulty(difficulty);
+						subQues.setPublicity(publicity);
+        			}
+        		}
+            }
+        }
+        quesRepo.save(questionList);
+	}
 }