weiwenhai 6 лет назад
Родитель
Сommit
a3f489aa70

+ 5 - 8
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/ExtractConfigController.java

@@ -52,18 +52,17 @@ public class ExtractConfigController extends ControllerSupport {
 
     @ApiOperation(value = "根据考试ID和课程ID获取调卷规则", notes = "根据考试ID和课程ID获取调卷规则")
     @GetMapping(value = "/findPageExtractConfig/{currentPage}/{pageSize}")
-    public ResponseEntity findPageExtractConfig(@PathVariable int currentPage,
+    public ResponseEntity<Object> findPageExtractConfig(@PathVariable int currentPage,
                                                 @PathVariable int pageSize,
                                                 @RequestParam("examId") Long examId,
-                                                @RequestParam("courseNo") String courseNo,
-                                                @RequestParam("courseLevel") String courseLevel) {
+                                                @RequestParam("courseNo") String courseNo) {
         try {
-            Page<ExtractConfig> extractConfigPageList = extractConfigService.findPageExtractConfig(currentPage, pageSize, examId, courseNo, courseLevel);
-            return new ResponseEntity<Page<ExtractConfig>>(extractConfigPageList, HttpStatus.OK);
+        	User user = getAccessUser();
+            Page<ExtractConfig> extractConfigPageList = extractConfigService.findPageExtractConfig(currentPage, pageSize, examId, courseNo,String.valueOf(user.getRootOrgId()));
+            return new ResponseEntity<Object>(extractConfigPageList, HttpStatus.OK);
         } catch (Exception e) {
             e.printStackTrace();
             throw new StatusException("Q-050065",e.getMessage());
-//            return new ResponseEntity<Object>(new ErrorMsg(e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
         }
     }
 
@@ -89,7 +88,6 @@ public class ExtractConfigController extends ControllerSupport {
     public ResponseEntity<Object> saveExtractConfig(HttpServletRequest request, @PathVariable Integer isbuildFile, @RequestBody ExtractConfig extractConfig) {
         try {
             User user = getAccessUser();
-            //AccessUser accessUser = (AccessUser) request.getAttribute("accessUser");
             extractConfig.setOrgId(user.getRootOrgId() + "");
             extractConfig.setOrgName(user.getRootOrgName());
             extractConfigFileService.saveExtractConfigAndBuildPaperFile(extractConfig, isbuildFile, user);
@@ -97,7 +95,6 @@ public class ExtractConfigController extends ControllerSupport {
         } catch (Exception e) {
             e.printStackTrace();
             throw new StatusException("Q-050099",e.getMessage());
-            //return new ResponseEntity<Object>(new ErrorMsg(e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
         }
     }
 

+ 15 - 0
examcloud-core-questions-api-provider/src/main/java/cn/com/qmth/examcloud/core/questions/api/provider/QuestionCloudServiceProvider.java

@@ -1,5 +1,7 @@
 package cn.com.qmth.examcloud.core.questions.api.provider;
 
+import java.util.List;
+
 import io.swagger.annotations.ApiOperation;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,8 +14,10 @@ import org.springframework.web.bind.annotation.RestController;
 
 import cn.com.qmth.examcloud.commons.base.exception.StatusException;
 import cn.com.qmth.examcloud.core.questions.api.QuestionCloudService;
+import cn.com.qmth.examcloud.core.questions.api.request.GetDefaultQuesionListReq;
 import cn.com.qmth.examcloud.core.questions.api.request.GetDefaultQuesionReq;
 import cn.com.qmth.examcloud.core.questions.api.request.GetDefaultQuesionsReq;
+import cn.com.qmth.examcloud.core.questions.api.response.GetCommonResp;
 import cn.com.qmth.examcloud.core.questions.api.response.GetDefaultQuesionIdResp;
 import cn.com.qmth.examcloud.core.questions.api.response.GetDefaultQuestionsResp;
 import cn.com.qmth.examcloud.core.questions.service.QuestionProviderService;
@@ -79,4 +83,15 @@ public class QuestionCloudServiceProvider implements QuestionCloudService{
 		return resp;
 	}
 
+	@ApiOperation(value = "保存多个试题")
+	@PostMapping("save_list")
+	@Override
+	public GetCommonResp saveQuestionList(GetDefaultQuesionListReq req) {
+		List<DefaultQuestion> defaultQuestions = req.getDefaultQuestions();
+		String message = questionProviderService.saveList(defaultQuestions);
+		GetCommonResp resp = new GetCommonResp();
+		resp.setMessage(message);
+		return resp;
+	}
+
 }

+ 5 - 0
examcloud-core-questions-base/pom.xml

@@ -99,6 +99,11 @@
 			<artifactId>examcloud-question-commons</artifactId>
 			<version>${examcloud.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>cn.com.qmth.examcloud.rmi</groupId>
+			<artifactId>examcloud-core-examwork-api-client</artifactId>
+			<version>${examcloud.version}</version>
+		</dependency>
 	</dependencies>
 
 </project>

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

@@ -93,7 +93,7 @@ public interface ExtractConfigService {
 	 * @param courseNo
 	 * @return
 	 */
-	public Page<ExtractConfig> findPageExtractConfig(int currentPage,int pageSize, Long examId, String courseNo, String courseLevel);
+	public Page<ExtractConfig> findPageExtractConfig(int currentPage,int pageSize, Long examId, String courseCode,String orgId);
 	
 	/**
 	 * 根据试卷id获取试卷结构

+ 9 - 0
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/QuestionProviderService.java

@@ -1,8 +1,10 @@
 package cn.com.qmth.examcloud.core.questions.service;
 
+import java.util.List;
 import java.util.Map;
 
 import org.springframework.data.domain.Page;
+
 import cn.com.qmth.examcloud.question.core.question.DefaultQuestion;
 
 /**
@@ -28,4 +30,11 @@ public interface QuestionProviderService {
 	 */
 	public Page<DefaultQuestion> findQustions(Long rootOrgId,Map<String, String> map,int curPage,int pageSize);
 	
+	/**
+	 * 批量保存试题对象
+	 * @param defaultQuestion
+	 * @return
+	 */
+	public String saveList(List<DefaultQuestion> defaultQuestions);
+	
 }

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

@@ -262,6 +262,7 @@ public class ExtractConfigProviderServiceImpl implements ExtractConfigProviderSe
 			questionGroupList.add(defaultQuestionGroup);
 		}
 		DefaultPaper defaultPaper = new DefaultPaper();
+		defaultPaper.setName(basePaper.getName());
 		defaultPaper.setQuestionGroupList(questionGroupList);
 		defaultPaper.setFullyObjective(fullyObjective);
 		return defaultPaper;

+ 35 - 23
examcloud-core-questions-service/src/main/java/cn/com/qmth/examcloud/core/questions/service/impl/ExtractConfigServiceImpl.java

@@ -24,6 +24,9 @@ import org.springframework.data.domain.Example;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
+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;
@@ -70,7 +73,12 @@ import cn.com.qmth.examcloud.core.questions.service.QuestionAudioService;
 import cn.com.qmth.examcloud.core.questions.base.BeanCopierUtil;
 import cn.com.qmth.examcloud.core.questions.base.CommonUtils;
 import cn.com.qmth.examcloud.core.questions.base.enums.PaperType;
+import cn.com.qmth.examcloud.commons.base.exception.StatusException;
 import cn.com.qmth.examcloud.commons.base.util.JsonUtil;
+import cn.com.qmth.examcloud.examwork.api.ExamCloudService;
+import cn.com.qmth.examcloud.examwork.api.bean.ExamBean;
+import cn.com.qmth.examcloud.examwork.api.request.GetExamReq;
+import cn.com.qmth.examcloud.examwork.api.response.GetExamResp;
 
 /**
  * 
@@ -149,7 +157,9 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
 
 	@Autowired
 	private PaperDetailUnitNativeRepo detailUnitNativeRepo;
-
+	
+	@Autowired
+	private ExamCloudService examCloudService;
 
 	@Override
 	public ExtractConfig findConfig(ExtractConfig condition) {
@@ -931,30 +941,32 @@ public class ExtractConfigServiceImpl implements ExtractConfigService {
     }
     
 	@Override
-	public Page<ExtractConfig> findPageExtractConfig(int currentPage,int pageSize, Long examId, String courseNo, String courseLevel) {
-		String examCourseJson = examCourseClient.findPageExamCourse(examId,courseNo,currentPage,pageSize,courseLevel);
-		
-		PageExamCourse pageExamCourse = JsonUtil.fromJson(examCourseJson,PageExamCourse.class);
-				//GsonUtil.getInstanceByJson(examCourseJson,PageExamCourse.class);
-		
-		List<ExamCourseDto> examCourseList = pageExamCourse.getContent();
-		if(examCourseList.size()==0){
-			throw new RuntimeException("考务系统无数据返回");
+	public Page<ExtractConfig> findPageExtractConfig(int currentPage,int pageSize, Long examId, String courseCode, String orgId) {
+		if(examId == null){
+			throw new StatusException("Q-","examId is null");
 		}
-		List<ExtractConfig> extractConfigs = new ArrayList<ExtractConfig>();
-		for(ExamCourseDto examCourseDto:examCourseList){
-			ExtractConfig condition = new ExtractConfig();
-			condition.setExamId(examCourseDto.getExamId());
-			condition.setCourseCode(examCourseDto.getCourseCode());
-			ExtractConfig extractConfig = this.findConfig(condition);
-			if(extractConfig==null){
-				extractConfig = new ExtractConfig(examCourseDto);
-				Course course = courseRepo.findFirstByCodeAndOrgId(examCourseDto.getCourseCode(),examCourseDto.getOrgId().toString());
-				extractConfig.setCourse(course);
-			}
-			extractConfigs.add(extractConfig);
+		Query query = new Query();
+		query.addCriteria(Criteria.where("orgId").is(orgId));
+		query.addCriteria(Criteria.where("examId").is(examId));
+		if(!StringUtils.isBlank(courseCode)){
+			query.addCriteria(Criteria.where("courseCode").is(courseCode));
 		}
-		return new PageImpl<ExtractConfig>(extractConfigs,new PageRequest(currentPage,pageSize),pageExamCourse.getTotalElements());
+		long count = this.mongoTemplate.count(query, ExtractConfig.class);
+        query.limit(pageSize);
+        query.skip((currentPage - 1) * pageSize);
+        List<ExtractConfig> extractConfigList = this.mongoTemplate.find(query, ExtractConfig.class);
+        if(extractConfigList != null && extractConfigList.size()>0){
+        	//调用考务rmi,获取考试信息
+            GetExamReq req = new GetExamReq();
+            req.setId(examId);
+            req.setRootOrgId(Long.valueOf(orgId));
+            GetExamResp resp = examCloudService.getExam(req);
+            ExamBean bean = resp.getExamBean();
+            for(ExtractConfig extractConfig:extractConfigList){
+            	extractConfig.setExamType(bean.getExamType());
+            }
+        }
+		return new PageImpl<ExtractConfig>(extractConfigList,new PageRequest(currentPage,pageSize),count);
 	}
 
 	@Override

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

@@ -381,4 +381,102 @@ public class QuestionProviderServiceImpl implements QuestionProviderService{
 		rightAnswer[0] = question.getQuesAnswer();
 		return rightAnswer;
 	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public String saveList(List<DefaultQuestion> defaultQuestions) {
+		if(defaultQuestions != null && defaultQuestions.size()>0){
+			List<Question> questions = new ArrayList<Question>();
+			for(DefaultQuestion defaultQuestion:defaultQuestions){
+				Question question = new Question();
+				if(!StringUtils.isBlank(defaultQuestion.getId())){
+					question.setId(defaultQuestion.getId());
+				}
+				question.setOrgId(defaultQuestion.getRootOrgId().toString());
+				question.setCreateTime(CommonUtils.getCurDateTime());
+				question.setDifficulty("中");
+				question.setDifficultyDegree(0.5);
+				question.setIsolated(true);
+				question.setPublicity(true);
+				question.setProperties(defaultQuestion.getProperties());
+				DefaultQuestionStructure defaultQuestionStructure = (DefaultQuestionStructure) defaultQuestion.getMasterVersion();
+				//判断试题单元对象
+				List<DefaultQuestionUnit> questionUnitList  = (List<DefaultQuestionUnit>) defaultQuestionStructure.getQuestionUnitList();
+				if(questionUnitList == null || questionUnitList.size()<1){
+					throw new StatusException("Q-012033", "试题单元对象为空");
+				}
+				if(questionUnitList.size()==1){
+					DefaultQuestionUnit defaultQuestionUnit = questionUnitList.get(0);
+					//判断试题题型
+					if(defaultQuestionUnit.getQuestionType() == null){
+						throw new StatusException("Q-012039", "试题单元中题型为空");
+					}
+					//设置题干
+					question.setQuesBody(defaultQuestionUnit.getBody());
+					QuesStructType type = buildQuesType(defaultQuestionUnit.getQuestionType());
+					if(type == null){
+						throw new StatusException("Q-012043", "试题单元中题型值不对");
+					}
+					//设置题型
+					question.setQuestionType(type);
+					//如果是选择题,判断选项
+					if(defaultQuestionUnit.getQuestionType() == QuestionType.SINGLE_CHOICE || defaultQuestionUnit.getQuestionType() == QuestionType.MULTIPLE_CHOICE){
+						List<DefaultQuestionOption> questionOptionList = (List<DefaultQuestionOption>) defaultQuestionUnit.getQuestionOptionList();
+						if(questionOptionList == null || questionOptionList.size()<1){
+							throw new StatusException("Q-012049", "试题单元中选项为空");
+						}
+						//设置选项
+						List<QuesOption> quesOptions = buildOptions(questionOptionList, defaultQuestionUnit.getRightAnswer());
+						question.setQuesOptions(quesOptions);
+					}
+					//设置答案
+					question.setQuesAnswer(buildAnswer(defaultQuestionUnit));
+				}else {
+					//套题
+					//设置题干
+					question.setQuesBody(defaultQuestionStructure.getBody());
+					question.setQuestionType(QuesStructType.NESTED_ANSWER_QUESTION);
+					//生成子题
+					List<Question> subList = new ArrayList<Question>();
+					for(DefaultQuestionUnit defaultQuestionUnit:questionUnitList){
+						Question subQues = new Question();
+						subQues.setId(UUID.randomUUID().toString());
+						subQues.setDifficulty("中");
+						subQues.setDifficultyDegree(0.5);
+						subQues.setPublicity(true);
+						//判断试题题型
+						if(defaultQuestionUnit.getQuestionType() == null){
+							throw new StatusException("Q-012039", "试题单元中题型为空");
+						}
+						//设置题干
+						subQues.setQuesBody(defaultQuestionUnit.getBody());
+						QuesStructType type = buildQuesType(defaultQuestionUnit.getQuestionType());
+						if(type == null){
+							throw new StatusException("Q-012043", "试题单元中题型值不对");
+						}
+						//设置题型
+						subQues.setQuestionType(type);
+						//如果是选择题,判断选项
+						if(defaultQuestionUnit.getQuestionType() == QuestionType.SINGLE_CHOICE || defaultQuestionUnit.getQuestionType() == QuestionType.MULTIPLE_CHOICE){
+							List<DefaultQuestionOption> questionOptionList = (List<DefaultQuestionOption>) defaultQuestionUnit.getQuestionOptionList();
+							if(questionOptionList == null || questionOptionList.size()<1){
+								throw new StatusException("Q-012049", "试题单元中选项为空");
+							}
+							//设置选项
+							List<QuesOption> quesOptions = buildOptions(questionOptionList, defaultQuestionUnit.getRightAnswer());
+							subQues.setQuesOptions(quesOptions);
+						}
+						//设置答案
+						subQues.setQuesAnswer(buildAnswer(defaultQuestionUnit));
+						subList.add(subQues);
+					}
+					question.setSubQuestions(subList);
+				}
+				questions.add(question);
+			}
+			quesRepo.save(questions);
+			return "success";
+		}
+		return "failure";
+	}
 }

+ 6 - 2
examcloud-core-questions-starter/src/main/java/cn/com/qmth/examcloud/core/questions/starter/Application.java

@@ -27,11 +27,13 @@ import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.databind.ObjectMapper;
 //import com.qmth.commons.query.dao.impl.BaseQueryDaoImpl;
 
+
 import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLog;
 import cn.com.qmth.examcloud.commons.base.logging.ExamCloudLogFactory;
 import cn.com.qmth.examcloud.commons.base.logging.SLF4JImpl;
 import cn.com.qmth.examcloud.commons.web.redis.RedisClient;
 import cn.com.qmth.examcloud.commons.web.redis.RedisClientImpl;
+import cn.com.qmth.examcloud.commons.web.support.CustomResponseErrorHandler;
 import cn.com.qmth.examcloud.core.questions.base.GridFSUtil;
 
 /**
@@ -62,11 +64,13 @@ public class Application {
 
 		SpringApplication.run(Application.class, args);
 	}
-
+	
 	@Bean
 	@LoadBalanced
 	public RestTemplate restTemplate() {
-		return new RestTemplate();
+		RestTemplate restTemplate = new RestTemplate();
+		restTemplate.setErrorHandler(new CustomResponseErrorHandler());
+		return restTemplate;
 	}
 
 	@Bean

+ 1 - 1
examcloud-core-questions-starter/src/main/resources/application-test.properties

@@ -4,7 +4,7 @@ spring.data.mongodb.database=comm-ques-bank
 eureka.client.serviceUrl.defaultZone=http://eureka-host:1111/eureka/
 spring.application.name=ExamCloud-service-question
 
-spring.redis.host=db-host
+spring.redis.host=redis-host
 spring.redis.port=6379
 
 upyun.bucketName=exam-cloud-test