xiatian 5 éve
szülő
commit
04897f627f

+ 21 - 14
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/CoursePropertyController.java

@@ -1,13 +1,9 @@
 package cn.com.qmth.examcloud.core.questions.api.controller;
 
-import cn.com.qmth.examcloud.api.commons.security.bean.User;
-import cn.com.qmth.examcloud.commons.exception.StatusException;
-import cn.com.qmth.examcloud.core.questions.base.Constants;
-import cn.com.qmth.examcloud.core.questions.dao.entity.CourseProperty;
-import cn.com.qmth.examcloud.core.questions.dao.entity.dto.CoursePropertyDto;
-import cn.com.qmth.examcloud.core.questions.service.CoursePropertyService;
-import cn.com.qmth.examcloud.web.support.ControllerSupport;
-import io.swagger.annotations.ApiOperation;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -16,11 +12,22 @@ import org.springframework.data.domain.Sort.Direction;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
 
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
+import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
+import cn.com.qmth.examcloud.core.questions.base.Constants;
+import cn.com.qmth.examcloud.core.questions.dao.entity.CourseProperty;
+import cn.com.qmth.examcloud.core.questions.dao.entity.dto.CoursePropertyDto;
+import cn.com.qmth.examcloud.core.questions.service.CoursePropertyService;
+import cn.com.qmth.examcloud.web.support.ControllerSupport;
+import io.swagger.annotations.ApiOperation;
 
 /**
  * @author weiwenhai
@@ -30,6 +37,7 @@ import java.util.stream.Stream;
 @Controller
 @RequestMapping("${api_cqb}/")
 public class CoursePropertyController extends ControllerSupport {
+
     @Autowired
     private CoursePropertyService coursePropertyService;
 
@@ -48,8 +56,7 @@ public class CoursePropertyController extends ControllerSupport {
     @ApiOperation(value = "根据orgId查询所有课程属性(分页)")
     @GetMapping(value = "/courseProperty/all/{curPage}/{pageSize}")
     public ResponseEntity<Object> findAllByOrgId(@ModelAttribute CoursePropertyDto coursePropertyDto,
-                                                 @PathVariable Integer curPage,
-                                                 @PathVariable Integer pageSize) {
+            @PathVariable Integer curPage, @PathVariable Integer pageSize) {
         User user = getAccessUser();
         if (user == null) {
             throw new StatusException(Constants.SYS_CODE_500, "请先登录!");

+ 10 - 17
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/QuesController.java

@@ -3,7 +3,6 @@ package cn.com.qmth.examcloud.core.questions.api.controller;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
@@ -15,11 +14,11 @@ import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
-
 import com.google.gson.Gson;
-
 import cn.com.qmth.examcloud.api.commons.security.bean.User;
+import cn.com.qmth.examcloud.commons.exception.StatusException;
 import cn.com.qmth.examcloud.core.questions.dao.QuesRepo;
 import cn.com.qmth.examcloud.core.questions.dao.entity.Question;
 import cn.com.qmth.examcloud.core.questions.dao.entity.QuestionSearchCondition;
@@ -147,19 +146,21 @@ public class QuesController extends ControllerSupport {
     public ResponseEntity<Object> getQuesCount(@ModelAttribute QuestionSearchCondition searchCondition) {
         User user = getAccessUser();
         searchCondition.setOrgId(user.getRootOrgId().toString());
-        long count = quesService.findQuesCount(searchCondition);
+        long count = quesService.findQuesCount(searchCondition); 
         return new ResponseEntity<>(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) {
+    @PutMapping(value = "/question/updatePro/paperIds")
+    public void updateProByPapers(@RequestParam String ids,
+            @RequestParam(required = false) Double difficultyDegree,
+            @RequestParam(required = false) Boolean publicity) {
+        if(difficultyDegree==null&&publicity==null) {
+            throw new StatusException("10001", "难度和公开度不能都为空");
+        }
         User user = getAccessUser();
         List<String> paperList = Stream.of(ids.split(",")).collect(Collectors.toList());
         quesService.updateProByPapers(paperList, difficultyDegree, publicity, user);
-        return new ResponseEntity<>(HttpStatus.OK);
     }
 
     @ApiOperation(value = "根据课程代码更新试题属性", notes = "根据课程代码更新试题属性")
@@ -172,13 +173,5 @@ public class QuesController extends ControllerSupport {
         return new ResponseEntity<>(HttpStatus.OK);
     }
 
-//    private void clearQuestionCache(String questionId) {
-//        //清理与当前试题相关的缓存
-//        final String patternKey = CACHE_KEY_QUESTION + "*" + questionId;
-//        Set<String> keys = redisTemplate.keys(patternKey);
-//        if (CollectionUtils.isNotEmpty(keys)) {
-//            redisTemplate.delete(keys);
-//        }
-//    }
 
 }

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

@@ -53,7 +53,9 @@ import java.util.regex.Pattern;
  */
 @Service("quesService")
 public class QuesServiceImpl implements QuesService {
+
     private static final Logger log = LoggerFactory.getLogger(QuesServiceImpl.class);
+
     @Autowired
     private QuesRepo quesRepo;
 
@@ -109,59 +111,39 @@ public class QuesServiceImpl implements QuesService {
      * @param previous
      * @param update
      */
-    /*private void updateMainInfo(Question previous, Question update) {
-        String now = CommonUtils.getCurDateTime();
-        if (update.getScore() != null) {
-            previous.setScore(update.getScore());
-        }
-        previous.setQuesAnswer(update.getQuesAnswer());
-        previous.setQuesAnswerAnalysis(update.getQuesAnswerAnalysis());
-        previous.setQuesBody(update.getQuesBody());
-        if (update.getQuesOptions() != null && update.getQuesOptions().size() > 0) {
-            List<QuesOption> quesOptions = update.getQuesOptions();
-            List<QuesOption> saveQuesOptions = previous.getQuesOptions();
-            if (saveQuesOptions.size() != quesOptions.size()) {
-                previous.setQuesOptions(quesOptions);
-            } else {
-                for (int i = 0; i < quesOptions.size(); i++) {
-                    saveQuesOptions.get(i).setOptionBody(quesOptions.get(i).getOptionBody());
-                    // 设置正确答案(chenken-2017.4.24)
-                    saveQuesOptions.get(i).setIsCorrect(quesOptions.get(i).getIsCorrect());
-                }
-            }
-        }
-        if (update.getQuesParams() != null) {
-            if (previous.getQuesParams() == null) {
-                previous.setQuesParams(new HashMap<>());
-            }
-            for (String key : update.getQuesParams().keySet()) {
-                previous.getQuesParams().put(key, update.getQuesParams().get(key));
-            }
-        }
-        if (previous.getCreateTime() == null) {
-            previous.setCreateTime(now);
-        }
-        if (update.getSubQuestions() != null) {
-            if (previous.getSubQuestions() == null) {
-                previous.setSubQuestions(new ArrayList<>());
-            }
-            int previousSize = previous.getSubQuestions().size();
-            int updateSize = update.getSubQuestions().size();
-            for (int i = 0; i < updateSize; i++) {
-                if (previousSize <= i) {
-                    previous.getSubQuestions().add(update.getSubQuestions().get(i));
-                } else {
-                    updateMainInfo(previous.getSubQuestions().get(i), update.getSubQuestions().get(i));
-                }
-            }
-        }
-        previous.setUpdateTime(now);
-        updateSubId(previous);
-    }*/
+    /*
+     * private void updateMainInfo(Question previous, Question update) { String
+     * now = CommonUtils.getCurDateTime(); if (update.getScore() != null) {
+     * previous.setScore(update.getScore()); }
+     * previous.setQuesAnswer(update.getQuesAnswer());
+     * previous.setQuesAnswerAnalysis(update.getQuesAnswerAnalysis());
+     * previous.setQuesBody(update.getQuesBody()); if (update.getQuesOptions()
+     * != null && update.getQuesOptions().size() > 0) { List<QuesOption>
+     * quesOptions = update.getQuesOptions(); List<QuesOption> saveQuesOptions =
+     * previous.getQuesOptions(); if (saveQuesOptions.size() !=
+     * quesOptions.size()) { previous.setQuesOptions(quesOptions); } else { for
+     * (int i = 0; i < quesOptions.size(); i++) {
+     * saveQuesOptions.get(i).setOptionBody(quesOptions.get(i).getOptionBody());
+     * // 设置正确答案(chenken-2017.4.24)
+     * saveQuesOptions.get(i).setIsCorrect(quesOptions.get(i).getIsCorrect()); }
+     * } } if (update.getQuesParams() != null) { if (previous.getQuesParams() ==
+     * null) { previous.setQuesParams(new HashMap<>()); } for (String key :
+     * update.getQuesParams().keySet()) { previous.getQuesParams().put(key,
+     * update.getQuesParams().get(key)); } } if (previous.getCreateTime() ==
+     * null) { previous.setCreateTime(now); } if (update.getSubQuestions() !=
+     * null) { if (previous.getSubQuestions() == null) {
+     * previous.setSubQuestions(new ArrayList<>()); } int previousSize =
+     * previous.getSubQuestions().size(); int updateSize =
+     * update.getSubQuestions().size(); for (int i = 0; i < updateSize; i++) {
+     * if (previousSize <= i) {
+     * previous.getSubQuestions().add(update.getSubQuestions().get(i)); } else {
+     * updateMainInfo(previous.getSubQuestions().get(i),
+     * update.getSubQuestions().get(i)); } } } previous.setUpdateTime(now);
+     * updateSubId(previous); }
+     */
 
     /**
-     * 保存试题,用于页面新增和更新
-     * 导入时不能调用该方法,里面有更新Word的代码
+     * 保存试题,用于页面新增和更新 导入时不能调用该方法,里面有更新Word的代码
      *
      * @param question
      */
@@ -180,12 +162,12 @@ public class QuesServiceImpl implements QuesService {
         } else {
             question.setUpdateTime(now);
         }
-        //跟新音频文件,以及音频文件排序
+        // 跟新音频文件,以及音频文件排序
         if (question.getHasAudio() != null && question.getHasAudio()) {
             questionAudioService.deleteAudioNotInQuestion(question);
-            //给音频重新排序
+            // 给音频重新排序
             questionAudioService.sortAudio(question);
-            //如果根据questionId查询不出音频了,将hasAudio设置为false
+            // 如果根据questionId查询不出音频了,将hasAudio设置为false
             List<QuestionAudio> questionAudios = questionAudioRepo.findByQuestionId(question.getId());
             if (questionAudios.size() == 0) {
                 question.setHasAudio(false);
@@ -194,7 +176,7 @@ public class QuesServiceImpl implements QuesService {
         setSelectQuestionAnswer(question, "");
         updateSubId(question);
         updateQuesWord(question);
-        //更新QuesBody,把  下划线  转成  ##
+        // 更新QuesBody,把 下划线 转成 ##
         updateQuesBody(question);
         return quesRepo.save(question);
     }
@@ -249,16 +231,19 @@ public class QuesServiceImpl implements QuesService {
         }
 
         if (searchCondition.getCoursePropertyName() != null) {
-            query.addCriteria(Criteria.where("quesProperties.coursePropertyName").is(searchCondition.getCoursePropertyName()));
+            query.addCriteria(
+                    Criteria.where("quesProperties.coursePropertyName").is(searchCondition.getCoursePropertyName()));
         }
 
-        //二级属性不为空,那么一级属性也不为空
+        // 二级属性不为空,那么一级属性也不为空
         if (StringUtils.isNotEmpty(searchCondition.getSecondPropertyId())) {
-            query.addCriteria(Criteria.where("quesProperties").elemMatch(
-                    Criteria.where("firstProperty.id").is(searchCondition.getFirstPropertyId()).and("secondProperty.id").is(searchCondition.getSecondPropertyId())));
+            query.addCriteria(Criteria.where("quesProperties")
+                    .elemMatch(Criteria.where("firstProperty.id").is(searchCondition.getFirstPropertyId())
+                            .and("secondProperty.id").is(searchCondition.getSecondPropertyId())));
         } else {
             if (searchCondition.getFirstPropertyId() != null) {
-                query.addCriteria(Criteria.where("quesProperties").elemMatch(Criteria.where("firstProperty.id").is(searchCondition.getFirstPropertyId())));
+                query.addCriteria(Criteria.where("quesProperties")
+                        .elemMatch(Criteria.where("firstProperty.id").is(searchCondition.getFirstPropertyId())));
             }
         }
 
@@ -315,7 +300,8 @@ public class QuesServiceImpl implements QuesService {
      * @param pageSize
      * @return
      */
-    public Page<Question> findByIdExclude(Set<String> idSet, String courseNo, QuesStructType quesType, int curPage, int pageSize, Long orgId, String quesBody) {
+    public Page<Question> findByIdExclude(Set<String> idSet, String courseNo, QuesStructType quesType, int curPage,
+            int pageSize, Long orgId, String quesBody) {
         Query query = new Query();
         query.addCriteria(Criteria.where("orgId").is(orgId + ""));
         query.addCriteria(Criteria.where("course.enable").is("true"));
@@ -324,7 +310,7 @@ public class QuesServiceImpl implements QuesService {
         }
         query.addCriteria(Criteria.where("course.code").is(courseNo));
         query.addCriteria(Criteria.where("id").nin(idSet));
-        //模糊匹配
+        // 模糊匹配
         if (StringUtils.isNotBlank(quesBody)) {
             Pattern pattern = Pattern.compile("^.*" + quesBody + ".*$", Pattern.CASE_INSENSITIVE);
             query.addCriteria(Criteria.where("quesBody").regex(pattern));
@@ -334,7 +320,8 @@ public class QuesServiceImpl implements QuesService {
         query.limit(pageSize);
         query.skip((curPage - 1L) * pageSize);
         List<Question> questionList = this.mongoTemplate.find(query, Question.class);
-        Page<Question> questionPageList = new PageImpl<Question>(questionList, new PageRequest(curPage - 1, pageSize), total);
+        Page<Question> questionPageList = new PageImpl<Question>(questionList, new PageRequest(curPage - 1, pageSize),
+                total);
         for (Question question : questionPageList) {
             formatQues(question);
         }
@@ -427,10 +414,10 @@ public class QuesServiceImpl implements QuesService {
             StringBuffer pWordMl = new StringBuffer();
             question.setQuesBodyWord(reduceImage(quesBody, pWordMl, wordMLPackage));
         }
-        if (!StringUtils.isEmpty(quesAnswer)
-                && (question.getQuestionType() == QuesStructType.FILL_BLANK_QUESTION
+        if (!StringUtils.isEmpty(quesAnswer) && (question.getQuestionType() == QuesStructType.FILL_BLANK_QUESTION
                 || question.getQuestionType() == QuesStructType.TEXT_ANSWER_QUESTION)) {
-            //question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(quesAnswer)));
+            // question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage,
+            // CommonUtils.formatHtml(quesAnswer)));
             StringBuffer pWordMl = new StringBuffer();
             question.setQuesAnswerWord(reduceImage(quesAnswer, pWordMl, wordMLPackage));
         }
@@ -438,9 +425,8 @@ public class QuesServiceImpl implements QuesService {
             quesAnswer = "<p>" + quesAnswer + "</p>";
             question.setQuesAnswerWord(DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(quesAnswer)));
         }
-        if (!StringUtils.isEmpty(quesAnswer) &&
-                (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
-                        || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION)) {
+        if (!StringUtils.isEmpty(quesAnswer) && (question.getQuestionType() == QuesStructType.SINGLE_ANSWER_QUESTION
+                || question.getQuestionType() == QuesStructType.MULTIPLE_ANSWER_QUESTION)) {
             question.setQuesAnswerWord(makeQuesAnswerWord(quesAnswer));
         }
         List<QuesOption> quesOptions = question.getQuesOptions();
@@ -450,14 +436,15 @@ public class QuesServiceImpl implements QuesService {
                     quesOption.setOptionBody("<p></p>");
                 }
                 StringBuffer pWordMl = new StringBuffer();
-                //quesOption.setOptionBodyWord(DocxProcessUtil.html2Docx(wordMLPackage,CommonUtils.formatHtml(quesOption.getOptionBody())));
+                // quesOption.setOptionBodyWord(DocxProcessUtil.html2Docx(wordMLPackage,CommonUtils.formatHtml(quesOption.getOptionBody())));
                 quesOption.setOptionBodyWord(reduceImage(quesOption.getOptionBody(), pWordMl, wordMLPackage));
             }
         }
     }
 
-    //如果图片过大,改变图片大小
-    private String reduceImage(String html, StringBuffer pWordMl, WordprocessingMLPackage wordMLPackage) throws Exception {
+    // 如果图片过大,改变图片大小
+    private String reduceImage(String html, StringBuffer pWordMl, WordprocessingMLPackage wordMLPackage)
+            throws Exception {
         String bodyString = DocxProcessUtil.html2Docx(wordMLPackage, CommonUtils.formatHtml(html));
         if (bodyString.indexOf("cx") > -1 || bodyString.indexOf("cy") > -1) {
             String tmpStr = DocxProcessUtil.BODY_HEADER + bodyString + DocxProcessUtil.BODY_TAIL;
@@ -511,15 +498,9 @@ public class QuesServiceImpl implements QuesService {
     }
 
     private String makeQuesAnswerWord(String quesAnswer) {
-        String template = "<w:p xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:rsidR=\"00F65544\" w:rsidP=\"00F65544\" w:rsidRDefault=\"001738E2\">" +
-                "<w:r w:rsidR=\"00F65544\">" +
-                "<w:rPr>" +
-                "<w:rFonts w:hint=\"eastAsia\"/>" +
-                "<w:szCs w:val=\"21\"/>" +
-                "</w:rPr>" +
-                "<w:t>quesAnswer</w:t>" +
-                "</w:r>" +
-                "</w:p>";
+        String template = "<w:p xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" w:rsidR=\"00F65544\" w:rsidP=\"00F65544\" w:rsidRDefault=\"001738E2\">"
+                + "<w:r w:rsidR=\"00F65544\">" + "<w:rPr>" + "<w:rFonts w:hint=\"eastAsia\"/>"
+                + "<w:szCs w:val=\"21\"/>" + "</w:rPr>" + "<w:t>quesAnswer</w:t>" + "</w:r>" + "</w:p>";
         return template.replace("quesAnswer", quesAnswer);
     }
 
@@ -574,7 +555,6 @@ public class QuesServiceImpl implements QuesService {
         }
     }
 
-
     private String getSelectQuestionAnswer(Question question, String optionOrder) {
         String answer = "";
         List<QuesOption> quesOptions = question.getQuesOptions();
@@ -624,20 +604,23 @@ public class QuesServiceImpl implements QuesService {
         }
 
         if (searchCondition.getCoursePropertyName() != null) {
-            query.addCriteria(Criteria.where("quesProperties.coursePropertyName").is(searchCondition.getCoursePropertyName()));
+            query.addCriteria(
+                    Criteria.where("quesProperties.coursePropertyName").is(searchCondition.getCoursePropertyName()));
         }
 
         if (searchCondition.getDifficulty() != null) {
             query.addCriteria(Criteria.where("difficulty").is(searchCondition.getDifficulty()));
         }
 
-        //二级属性不为空,那么一级属性也不为空
+        // 二级属性不为空,那么一级属性也不为空
         if (StringUtils.isNotEmpty(searchCondition.getSecondPropertyId())) {
-            query.addCriteria(Criteria.where("quesProperties").elemMatch(
-                    Criteria.where("firstProperty.id").is(searchCondition.getFirstPropertyId()).and("secondProperty.id").is(searchCondition.getSecondPropertyId())));
+            query.addCriteria(Criteria.where("quesProperties")
+                    .elemMatch(Criteria.where("firstProperty.id").is(searchCondition.getFirstPropertyId())
+                            .and("secondProperty.id").is(searchCondition.getSecondPropertyId())));
         } else {
             if (searchCondition.getFirstPropertyId() != null) {
-                query.addCriteria(Criteria.where("quesProperties").elemMatch(Criteria.where("firstProperty.id").is(searchCondition.getFirstPropertyId())));
+                query.addCriteria(Criteria.where("quesProperties")
+                        .elemMatch(Criteria.where("firstProperty.id").is(searchCondition.getFirstPropertyId())));
             }
         }
 
@@ -662,7 +645,7 @@ public class QuesServiceImpl implements QuesService {
         query2.addCriteria(Criteria.where("paperType").is(PaperType.IMPORT));
         List<PaperDetailUnit> paperDetailUnits = this.mongoTemplate.find(query2, PaperDetailUnit.class);
         String quesNames = searchCondition.getQuesNames();
-        List<String> list = Arrays.asList(quesNames.split(","));//[单选题]  单选
+        List<String> list = Arrays.asList(quesNames.split(","));// [单选题] 单选
         for (PaperDetailUnit unit : paperDetailUnits) {
             if (list.contains(unit.getPaperDetail().getName())) {
                 count++;
@@ -676,12 +659,14 @@ public class QuesServiceImpl implements QuesService {
     public void updateProByPapers(List<String> paperList, Double difficultyDegree, Boolean publicity, User user) {
         List<Paper> papers = new ArrayList<>();
         String difficulty = "";
-        if (difficultyDegree > 0 && difficultyDegree < 0.4) {
-            difficulty = "难";
-        } else if (difficultyDegree > 0.3 && difficultyDegree < 0.8) {
-            difficulty = "中";
-        } else {
-            difficulty = "易";
+        if (difficultyDegree != null) {
+            if (difficultyDegree > 0 && difficultyDegree < 0.4) {
+                difficulty = "难";
+            } else if (difficultyDegree > 0.3 && difficultyDegree < 0.8) {
+                difficulty = "中";
+            } else {
+                difficulty = "易";
+            }
         }
         List<String> quesIds = new ArrayList<>();
         List<Question> subQues = new ArrayList<>();
@@ -693,9 +678,13 @@ public class QuesServiceImpl implements QuesService {
                 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);
+                        if (difficultyDegree != null) {
+                            subQuestion.setDifficultyDegree(difficultyDegree);
+                            subQuestion.setDifficulty(difficulty);
+                        }
+                        if (publicity != null) {
+                            subQuestion.setPublicity(publicity);
+                        }
                         question.setSubQuestions(subQuestions);
                     }
                     subQues.add(question);
@@ -708,9 +697,17 @@ public class QuesServiceImpl implements QuesService {
         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);
+            Update update = null;
+            if (difficultyDegree != null) {
+                update = Update.update("difficultyDegree", difficultyDegree).set("difficulty", difficulty);
+            }
+            if (publicity != null) {
+                if (difficultyDegree != null) {
+                    update = update.set("publicity", publicity);
+                } else {
+                    update = Update.update("publicity", publicity);
+                }
+            }
             this.mongoTemplate.updateMulti(query, update, Question.class);
         }
         for (Paper paper : papers) {
@@ -761,13 +758,15 @@ public class QuesServiceImpl implements QuesService {
         Question question = optional.get();
         QuestionAnswerBean bean = new QuestionAnswerBean();
         List<String> answers = new ArrayList<>();
-        final String separator = "";//默认分隔符
+        final String separator = "";// 默认分隔符
 
         if (QuesStructType.NESTED_ANSWER_QUESTION == question.getQuestionType()) {
             List<Question> subQuestions = question.getSubQuestions();
             for (Question subQuestion : subQuestions) {
-                if (QuesStructType.SINGLE_ANSWER_QUESTION == subQuestion.getQuestionType() || QuesStructType.MULTIPLE_ANSWER_QUESTION == subQuestion.getQuestionType()) {
-                    List<String> values = QuestionAnswerConvert.parseQuestionOptionAnswerList(subQuestion.getQuesOptions());
+                if (QuesStructType.SINGLE_ANSWER_QUESTION == subQuestion.getQuestionType()
+                        || QuesStructType.MULTIPLE_ANSWER_QUESTION == subQuestion.getQuestionType()) {
+                    List<String> values = QuestionAnswerConvert
+                            .parseQuestionOptionAnswerList(subQuestion.getQuesOptions());
                     answers.add(StringUtils.join(values, separator));
                 } else {
                     List<String> values = QuestionAnswerConvert.parseQuestionAnswerList(subQuestion);
@@ -775,7 +774,8 @@ public class QuesServiceImpl implements QuesService {
                 }
             }
         } else {
-            if (QuesStructType.SINGLE_ANSWER_QUESTION == question.getQuestionType() || QuesStructType.MULTIPLE_ANSWER_QUESTION == question.getQuestionType()) {
+            if (QuesStructType.SINGLE_ANSWER_QUESTION == question.getQuestionType()
+                    || QuesStructType.MULTIPLE_ANSWER_QUESTION == question.getQuestionType()) {
                 List<String> values = QuestionAnswerConvert.parseQuestionOptionAnswerList(question.getQuesOptions());
                 answers.add(StringUtils.join(values, separator));
             } else {