Explorar el Código

merge from release_v4.1.1

deason hace 3 años
padre
commit
d00e2192a5
Se han modificado 13 ficheros con 125 adiciones y 29 borrados
  1. 30 0
      examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/DefaultQuesionController.java
  2. 2 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/CoursePropertyServiceImpl.java
  3. 3 0
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExportPaperServiceImpl.java
  4. 6 3
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperDetailUnitServiceImpl.java
  5. 12 2
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperServiceImpl.java
  6. 14 1
      examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/util/ExportPaperUtil.java
  7. 5 5
      examcloud-core-questions-starter/shell/start.sh
  8. 2 1
      examcloud-core-questions-starter/shell/stop.sh
  9. 30 15
      examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/config/Swagger2.java
  10. 2 1
      examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/config/initData.java
  11. 1 0
      examcloud-core-questions-starter/src/main/resources/security.properties
  12. BIN
      examcloud-core-questions-starter/src/main/resources/templates/answerImportTemplate.xlsx
  13. 18 0
      examcloud-core-questions-starter/src/test/java/cn/com/qmth/examcloud/core/questions/test/QuestionTest.java

+ 30 - 0
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/controller/DefaultQuesionController.java

@@ -9,6 +9,7 @@ import cn.com.qmth.examcloud.core.questions.api.request.GetQuestionReq;
 import cn.com.qmth.examcloud.core.questions.service.ExtractConfigProviderService;
 import cn.com.qmth.examcloud.core.questions.service.QuestionProviderService;
 import cn.com.qmth.examcloud.question.commons.core.question.DefaultQuestion;
+import cn.com.qmth.examcloud.support.handler.QuestionBodyHandler;
 import cn.com.qmth.examcloud.web.support.ControllerSupport;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
@@ -116,4 +117,33 @@ public class DefaultQuesionController extends ControllerSupport {
         DefaultQuestion defaultQuestion = extractConfigExamService.getDefaultQuestion(examId, courseCode, groupCode, questionId);
         return new ResponseEntity<>(defaultQuestion, HttpStatus.OK);
     }
+
+    @ApiOperation(value = "查询试题(客户端)")
+    @PostMapping("/question/for/client")
+    public ResponseEntity<Object> findOneForClient(@RequestBody GetQuestionReq questionReq) {
+        Long examId = questionReq.getExamId();
+
+        if (null == examId) {
+            throw new StatusException("Q-010078", "examId is null");
+        }
+        String courseCode = questionReq.getCourseCode();
+        if (StringUtils.isBlank(courseCode)) {
+            throw new StatusException("Q-010082", "courseCode is null");
+        }
+        String groupCode = questionReq.getGroupCode();
+        if (StringUtils.isBlank(groupCode)) {
+            throw new StatusException("Q-010086", "groupCode is null");
+        }
+        String questionId = questionReq.getQuestionId();
+        if (StringUtils.isBlank(questionId)) {
+            throw new StatusException("Q-010090", "questionId is null");
+        }
+        DefaultQuestion defaultQuestion = extractConfigExamService.getDefaultQuestion(examId, courseCode, groupCode, questionId);
+
+        // 将题干、选项等 HTML结构转换为“富文本”JSON结构
+        QuestionBodyHandler.convertRichText(defaultQuestion);
+
+        return new ResponseEntity<>(defaultQuestion, HttpStatus.OK);
+    }
+
 }

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

@@ -394,8 +394,9 @@ public class CoursePropertyServiceImpl implements CoursePropertyService {
 			c.setName(cur.getPropertyName());
 			c.setOrgId(user.getRootOrgId());
 			c.setEnable(true);
-			coursePropertyRepo.save(c);
 		}
+		c.setUpdateTime(new Date());
+		coursePropertyRepo.save(c);
 		
 		Property first=propertyRepo.findByOrgIdAndCoursePropertyIdAndParentIdAndCode(user.getRootOrgId(), c.getId(), Property.ROOT_PARENT_ID, cur.getFirstPropertyCode());
 		if(first!=null) {

+ 3 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExportPaperServiceImpl.java

@@ -166,6 +166,9 @@ public class ExportPaperServiceImpl implements ExportPaperService {
                 if (exportContentList.indexOf(ExamFileType.ANSWER.name()) > -1) {
                     exportPaperAbstractService.downloadPaperAnswer(dto);
                 }
+            } catch (StatusException e) {
+                LOG.error(e.getMessage(), e);
+                throw e;
             } catch (Exception e) {
                 LOG.error(e.getMessage(), e);
                 throw new StatusException("100001", e.getMessage());

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

@@ -269,19 +269,22 @@ public class PaperDetailUnitServiceImpl implements PaperDetailUnitService {
 
                     Question sub = baseQuestion.getSubQuestions().get(index - 1);
                     if (updateQuestion.getId().equals(sub.getId())) {
+                    	if(updateQuestion.getScore().doubleValue()!=baseUnit.getSubScoreList().get(index - 1).doubleValue()) {
+                    		throw new StatusException("500", "试卷已调用,不能修改分数");
+                    	}
                         checkUpdate(updateQuestion, sub);
 
                     }
                 }
             }
         } else {
+        	if(updateUnit.getScore().doubleValue()!=baseUnit.getScore().doubleValue()) {
+        		throw new StatusException("500", "试卷已调用,不能修改分数");
+        	}
         	checkUpdate(updateQuestion, baseQuestion);
         }
     }
     private void checkUpdate(Question update,Question base) {
-    	if(update.getScore().doubleValue()!=base.getScore().doubleValue()) {
-    		throw new StatusException("500", "试卷已调用,不能修改分数");
-    	}
     	if(QuesStructType.SINGLE_ANSWER_QUESTION.equals(base.getQuestionType())
     			||QuesStructType.MULTIPLE_ANSWER_QUESTION.equals(base.getQuestionType())){
 	    	if(update.getQuesOptions().size()!=base.getQuesOptions().size()) {

+ 12 - 2
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/PaperServiceImpl.java

@@ -353,7 +353,6 @@ public class PaperServiceImpl implements PaperService {
      * @param paperExp
      * @return
      */
-    @SuppressWarnings("unchecked")
     public Map<String, Object> savePaper(PaperExp paperExp, User user) {
         Map<String, Object> msgMap = new HashMap<>();
 
@@ -2295,6 +2294,7 @@ public class PaperServiceImpl implements PaperService {
             saveQuestion.add(domain.getSubNumber().toString());
         }
 
+        Set<String> updateQuesIds = new HashSet<String>();
         List<Question> ques = new ArrayList<Question>();
         for (PaperDetailUnit unit : paperDetailUnits) {
             Question qu = unit.getQuestion();
@@ -2303,17 +2303,23 @@ public class PaperServiceImpl implements PaperService {
                     for (int i = 0; i < unit.getQuestion().getSubQuestions().size(); i++) {
                         if (answerMap.get(unit.getNumber() + "-" + (i + 1)) != null) {
                             checkAndSetAnswer(unit.getQuestion().getSubQuestions().get(i), answerMap.get(unit.getNumber() + "-" + (i + 1)).getAnswer(), unit.getNumber(), i + 1);
+                            updateQuesIds.add(qu.getId());
                         }
                     }
                 } else {
                     if (answerMap.get(unit.getNumber().toString()) != null) {
                         checkAndSetAnswer(qu, answerMap.get(unit.getNumber().toString()).getAnswer(), unit.getNumber(), null);
+                        updateQuesIds.add(qu.getId());
                     }
                 }
             }
             ques.add(qu);
         }
         quesRepo.saveAll(ques);
+        //清除缓存
+    	for(String qid:updateQuesIds) {
+    		paperDetailUnitService.clearQuestionCache(qid);
+        }
     }
 
     private void checkAndSetAnswer(Question question, String answer, Integer subNum, Integer childNum) {
@@ -2354,7 +2360,11 @@ public class PaperServiceImpl implements PaperService {
                     answerFomatErr(subNum, childNum, "答案选项不存在");
                 }
             }
-            question.setQuesAnswer(answer);
+            if(pAnswerArray.length>1) {
+            	question.setQuesAnswer(StringUtils.join(pAnswerArray, ","));
+            }else {
+            	question.setQuesAnswer(answer);
+            }
             processSelectOption(question);
         } else if (QuesStructType.BOOL_ANSWER_QUESTION.equals(question.getQuestionType())) {
             if (!answer.equals("正确") && !answer.equals("错误")) {

+ 14 - 1
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/util/ExportPaperUtil.java

@@ -326,7 +326,7 @@ public class ExportPaperUtil {
 
     private static List<JSection> getSections(String html, boolean diposeFillBlank) {
         if (StringUtils.isBlank(html)) {
-            return null;
+            return getEmptySections();
         }
         html = html.trim();
         if (!html.startsWith("<p>")) {
@@ -349,6 +349,19 @@ public class ExportPaperUtil {
         return ss;
 
     }
+    
+    private static List<JSection> getEmptySections(){
+    	List<JSection> ss = new ArrayList<JSection>();
+    	JSection s = new JSection();
+        List<SectionElement> ses = new ArrayList<SectionElement>();
+        s.setElements(ses);
+        SectionElement se=new SectionElement();
+        se.setType(ELEMENT_TYPE_TEXT);
+        se.setValue("");
+        ses.add(se);
+        ss.add(s);
+        return ss;
+    }
 
     private static void getSectionElement(Node ce, List<SectionElement> ses, boolean diposeFillBlank) {
         if ("span".equals(ce.nodeName()) && ce.childNodeSize() > 0) {

+ 5 - 5
examcloud-core-questions-starter/shell/start.sh

@@ -1,17 +1,17 @@
 #!/bin/bash
 
-PROJECT_JAR="examcloud-core-questions-starter-v4.1.0-RELEASE.jar"
-
-PROJECT_JVM_ARGS=`cat start.vmoptions`
+PROJECT_JAR=`find . -name "examcloud-core-questions-starter*.jar"`
+PROJECT_JAR=${PROJECT_JAR:6}
 
 PROJECT_ARGS=`cat start.args`
-
 PROJECT_ARGS=$PROJECT_ARGS" --sys.config.center.secretKey="$1
 
+PROJECT_JVM_ARGS=`cat start.vmoptions`
+
 PID_LIST=`ps -ef | grep $PROJECT_JAR | grep java | awk '{print $2}'`
 if [ ! -z "$PID_LIST" ]; then
     echo "$PROJECT_JAR is already running..."
-    exit -1
+    #exit -1
 fi
 
 nohup java $PROJECT_JVM_ARGS -jar lib/$PROJECT_JAR $PROJECT_ARGS >/dev/null 2>&1 &

+ 2 - 1
examcloud-core-questions-starter/shell/stop.sh

@@ -1,6 +1,7 @@
 #!/bin/bash
 
-PROJECT_JAR="examcloud-core-questions-starter-v4.1.0-RELEASE.jar"
+PROJECT_JAR=`find . -name "examcloud-core-questions-starter*.jar"`
+PROJECT_JAR=${PROJECT_JAR:6}
 
 ps -ef | grep $PROJECT_JAR | grep java | awk '{printf("kill -15 %s\n",$2)}' | sh
 BUILD_ID=DONTKILLME

+ 30 - 15
examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/config/Swagger2.java

@@ -2,32 +2,47 @@ package cn.com.qmth.examcloud.core.questions.starter.config;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-
 import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
 import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.Contact;
+import springfox.documentation.service.Parameter;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spring.web.plugins.Docket;
 import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Configuration
 @EnableSwagger2WebMvc
 public class Swagger2 {
 
-	@Bean
-	public Docket createRestApi() {
-		return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
-				.apis(RequestHandlerSelectors
-						.basePackage("cn.com.qmth.examcloud.core.questions.api"))
-				.paths(PathSelectors.any()).build();
-	}
+    @Bean
+    public Docket buildDocket() {
+        List<Parameter> parameters = new ArrayList<>();
+        parameters.add(new ParameterBuilder().name("key").modelRef(new ModelRef("String")).parameterType("header").required(false).build());
+        parameters.add(new ParameterBuilder().name("token").modelRef(new ModelRef("String")).parameterType("header").required(false).build());
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .groupName("default")
+                .apiInfo(buildApiInfo())
+                .globalOperationParameters(parameters)
+                .useDefaultResponseMessages(false)
+                .select()
+                // .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
+                .apis(RequestHandlerSelectors.basePackage("cn.com.qmth.examcloud.core.questions.api.controller"))
+                .paths(PathSelectors.any())
+                .build();
+    }
 
-	private ApiInfo apiInfo() {
-		return new ApiInfoBuilder().title("API doc")
-				.contact(new Contact("qmth", "http://xxxxx/", "")).version("xxx")
-				.description("API文档").build();
-	}
+    public ApiInfo buildApiInfo() {
+        return new ApiInfoBuilder()
+                .title("考试云平台接口文档")
+                .version("v4.x.x")
+                .build();
+    }
 
-}
+}

+ 2 - 1
examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/config/initData.java

@@ -17,7 +17,7 @@ public class initData implements CommandLineRunner {
     private static final Logger log = LoggerFactory.getLogger(initData.class);
 
     @Autowired
-    SettingService settingService;
+    private SettingService settingService;
 
     @Override
     public void run(String... args) throws Exception {
@@ -26,4 +26,5 @@ public class initData implements CommandLineRunner {
         DocxProcessUtil.init();
         log.info("设置初始化完成");
     }
+
 }

+ 1 - 0
examcloud-core-questions-starter/src/main/resources/security.properties

@@ -1,2 +1,3 @@
 [s][${api_cqb}/][/paper/export/{id}/{exportContentList}/{examType}][GET]=true
 [s][${api_cqb}/default_question][/question][POST]=true
+[s][${api_cqb}/default_question][/question/for/client][POST]=true

BIN
examcloud-core-questions-starter/src/main/resources/templates/answerImportTemplate.xlsx


+ 18 - 0
examcloud-core-questions-starter/src/test/java/cn/com/qmth/examcloud/core/questions/test/QuestionTest.java

@@ -0,0 +1,18 @@
+package cn.com.qmth.examcloud.core.questions.test;
+
+import cn.com.qmth.examcloud.core.questions.starter.CoreQuestionApp;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = CoreQuestionApp.class)
+public class QuestionTest {
+
+    @Test
+    public void demo() throws Exception {
+
+    }
+
+}