diff --git a/web/src/main/java/com/ibeetl/jlw/entity/ResourcesQuestion.java b/web/src/main/java/com/ibeetl/jlw/entity/ResourcesQuestion.java index 3703e3d2..4134fead 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/ResourcesQuestion.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/ResourcesQuestion.java @@ -1,5 +1,7 @@ package com.ibeetl.jlw.entity; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.EnumUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.ReflectUtil; import cn.jlw.validate.ValidateConfig; @@ -7,18 +9,26 @@ import com.ibeetl.admin.core.annotation.Dict; import com.ibeetl.admin.core.annotation.DictEnum; import com.ibeetl.admin.core.entity.BaseEntity; import com.ibeetl.jlw.enums.AddTypeEnum; +import com.ibeetl.jlw.enums.ResourcesQuestionTypeEnum; +import lombok.extern.slf4j.Slf4j; import org.beetl.sql.annotation.entity.AutoID; +import org.beetl.sql.annotation.entity.InsertIgnore; +import org.beetl.sql.annotation.entity.UpdateIgnore; import javax.validation.constraints.NotNull; import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import static cn.hutool.core.util.ObjectUtil.defaultIfNull; + /* * 资源管理 - 题库管理 * gen by Spring Boot2 Admin 2021-06-25 */ +@Slf4j public class ResourcesQuestion extends BaseEntity{ //ID @@ -314,4 +324,78 @@ public class ResourcesQuestion extends BaseEntity{ } return result; } + + /** + * 查找为Null的题目选项字段 + * @return + */ + private Field findNullQuestionOptionField() { + Field[] fields = ReflectUtil.getFields(this.getClass(), f -> f.getName().startsWith("questionOption")); + + for (Field field : fields) { + Object fieldValue = ReflectUtil.getFieldValue(this, field); + if (fieldValue == null) { + return field; + } + } + return null; + } + + /** + * 用于存放无限长度的题目答案 + */ + @UpdateIgnore + @InsertIgnore + private List questionOptionList; + + public List getQuestionOptionList() { + List result = takeQuestionOptionConcatList(); + result.addAll(defaultIfNull(questionOptionList, Collections.emptyList())); + return result; + } + + public void setQuestionOptionList(List questionOptionList) { + this.questionOptionList = questionOptionList; + } + + /** + * 表设计缺陷,需要根据题目类型,进行值的转化,再存放到相应的位置 + * @param questionOptionList + */ + public void putQuestionOptionList(List questionOptionList) { + if (CollectionUtil.isEmpty(questionOptionList)) { + return; + } + + ResourcesQuestionTypeEnum questionTypeEnum = EnumUtil.likeValueOf(ResourcesQuestionTypeEnum.class, this.getQuestionType()); + + if (questionTypeEnum != null) { + switch (questionTypeEnum) { + case SINGLE_QUESTION: + case MULTIPLE_QUESTION: { + questionOptionList.forEach(item -> { + Field optionField = findNullQuestionOptionField(); + if (optionField != null) { + ReflectUtil.setFieldValue(this, optionField, item); + } + }); + } break; + case FILL_QUESTION: { + // 填空题 questionOptionA 存放的是[---] 空的长度 + final String optionName = "questionOptionA"; + } break; + case ANALYSIS_QUESTION: { + // 分析题 questionOptionA 存放的是[---] 空的长度 + // 分析题 questionOptionB 存放的是带填空的题干 + final String optionName = "questionOptionA"; + final String questionSubStem = "questionOptionB"; + + + } break; + default: + log.error("ResourcesQuestion.putQuestionOptionList 方法,未知的题目类型!"); + break; + } + } + } } diff --git a/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionService.java b/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionService.java index 91aba03c..030ab8f5 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionService.java @@ -22,7 +22,6 @@ import com.ibeetl.jlw.service.strategy.StrategyContext; import com.ibeetl.jlw.validator.QuestionValidator; import com.ibeetl.jlw.web.query.CourseInfoQuery; import com.ibeetl.jlw.web.query.ResourcesQuestionQuery; -import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.util.Strings; @@ -789,8 +788,17 @@ public class ResourcesQuestionService extends CoreBaseService return g; } - @SneakyThrows - public JsonResult importQBankWordTemplate(@NotEmpty List fileEntityList, CoreUser coreUser, String referer) { + /** + * 功能描述:
+ * word方式导入题目 + * + * @param fileEntityList 文件列表 + * @param coreUser 传入的用户,使用机构ID和用户ID + * @return {@link JsonResult} + * @Author: lx + * @Date: 2023/1/8 22:49 + */ + public JsonResult importQuestionByWordTemplate(@NotEmpty List fileEntityList, CoreUser coreUser) { /** 找出段落, 逐段落处理 */ AtomicReference inputStream = new AtomicReference<>(); AtomicReference xDocument = new AtomicReference<>(); @@ -873,25 +881,22 @@ public class ResourcesQuestionService extends CoreBaseService questionAnswer.set(Strings.EMPTY); /** 带有编号的段落,是主题干。需要创建新的题目对象 */ - ResourcesQuestion qs = new ResourcesQuestion(); + ResourcesQuestion resourcesQuestion = new ResourcesQuestion(); /** 题目类型,查询插入操作 */ - QuestionType questionType = selectOrInsert(typeConcatEnum.get(), coreUser); - qs.setQuestionTypeId(questionType.getQuestionTypeId()); - qs.putQuestionTypeConcat(questionType.getQuestionTypeConcat()); - qs.putQuestionTypeName(questionType.getQuestionTypeName()); - qs.setQuestionScore(questionScore.get()); + ResourcesQuestionTypeEnum questionType = selectQuestionType(typeConcatEnum.get()); + resourcesQuestion.setQuestionType(questionType.getCode()); + resourcesQuestion.setQuestionScore(questionScore.get()); + resourcesQuestion.setQuestionStatus(1); + resourcesQuestion.setUserId(coreUser.getId()); + resourcesQuestion.setOrgId(coreUser.getOrgId()); if (StringUtils.isNotBlank(questionStem.get())){ - qs.setQuestionStem(questionStem.get().replace("<","<").replace(">",">")); + resourcesQuestion.setQuestionStem(questionStem.get().replace("<","<").replace(">",">")); }else { - qs.setQuestionStem(questionStem.get()); + resourcesQuestion.setQuestionStem(questionStem.get()); } - qs.setQuestionStatus(1); - qs.setUserId(coreUser.getId()); - qs.setOrgId(coreUser.getOrgId()); - - question.set(qs); + question.set(resourcesQuestion); questionList.add(question.get()); } } break; @@ -915,14 +920,10 @@ public class ResourcesQuestionService extends CoreBaseService titleStb.append(recordsCount.get()); titleStb.append(" 道题目"); - Object ids[] = getCourseIdsNew(title[0], groupByCourseId.get(), groupByCourseName.get()); - final Long courseId = (Long)ids[0]; - final Long chapterId = (Long)ids[1]; - String finalTitle = !referer.contains(publicReferer)? titleStb.toString(): titleStb.append(ids[2] + Strings.EMPTY).toString(); + String finalTitle = titleStb.toString(); /** 最后检测属性, 并行处理,没有向外部非线程安全的变量写入东西,无需担心丢数据 */ questionList.parallelStream().forEach(item -> { - item.set("chapterId", ObjectUtil.defaultIfNull(chapterId, courseId)); questionValidator.checkQuestion(item); checkUnique(item); }); @@ -931,11 +932,11 @@ public class ResourcesQuestionService extends CoreBaseService checkLocalQuestionsUnique(questionList); /** 拼成前端需要的数据 */ - resultMap.put(url2HttpUrl(fileEntity.getUrl()),new Object[]{finalTitle,questionList}); + resultMap.put(fileEntity.getUrl(), new Object[]{ finalTitle, questionList }); } catch (Exception ex) { ex.printStackTrace(); } finally { - try {inputStream.get().close();xDocument.get().close();} - catch (Exception ioe) {ioe.printStackTrace();} + try {inputStream.get().close(); xDocument.get().close(); } + catch (Exception ioe) { ioe.printStackTrace(); } } }); @@ -957,29 +958,77 @@ public class ResourcesQuestionService extends CoreBaseService } Matcher matcher = optionPattern.matcher(text); if(matcher.find()){ - QuestionOption questionOption = new QuestionOption(); - questionOption.setQuestionOptionContent(text.substring(2)); - if(null != question.takeQuestionOptionList()){ - List questionOptionList = question.takeQuestionOptionList(); - questionOptionList.add(questionOption); - question.putQuestionOptionList(questionOptionList); - }else { - List questionOptionList = new ArrayList<>(); + String questionOption = text.substring(2); + // 在现有的列表中添加 + if(null != question.getQuestionOptionList()){ + List questionOptionList = question.getQuestionOptionList(); questionOptionList.add(questionOption); question.putQuestionOptionList(questionOptionList); } - - if(null != question.takeQuestionOptionConcatList()){ - List questionOptionConcatList = question.takeQuestionOptionConcatList(); - questionOptionConcatList.add(text.substring(2)); - question.putQuestionOptionConcatList(questionOptionConcatList); - }else { - List questionOptionConcatList = new ArrayList<>(); - questionOptionConcatList.add(text.substring(2)); - question.putQuestionOptionConcatList(questionOptionConcatList); + // 新建 + else { + question.putQuestionOptionList(Collections.singletonList(questionOption)); } } + } + + /** + * 插入到对应的段落中. + * 直接在引用的数据上进行修改数据 + * 换行追加的方法 + * + * @param typeConcatEnum 题型枚举 + * @param paragraphType 段落类型 + * @param v 当前段落文本 + * @param question 问题实体 + */ + private void insertCorrespondingParagraph(final AtomicReference typeConcatEnum, + final StrategyContext.QuestionParagraphTypeEnum paragraphType, + final String v, + final AtomicReference question, + final AtomicReference questionStem, + final AtomicReference questionAnswer) { + if(null == paragraphType) { + return; + } + + switch(paragraphType) { + /** 题干 */ + case STEM: { + questionStem.set(questionStem.get().concat(v)); + question.get().setQuestionStem(questionStem.get()); + } break; + /** 选项 */ + case OPTION: { + List optionList = question.get().takeQuestionOptionConcatList(); + if (ObjectUtil.isNotEmpty(optionList)) { + final int[] index = { 0 }; + optionList.forEach(str-> { + if(index[0] == optionList.size() -1) { + str = str.concat(v); + } + }); + } +// if (ObjectUtil.isNotEmpty(questionOptions)) { +// QuestionOption questionOption = questionOptions.get(questionOptions.size() - 1); +// questionOption.setQuestionOptionContent(questionOption.getQuestionOptionContent().concat(v)); +// } + + } break; + /** 答案 */ + case ANSWER: { + questionAnswer.set(secondFormat(questionAnswer.get().concat(v), typeConcatEnum.get())); + question.get().setQuestionAnswer(questionAnswer.get()); + } break; + } + } + /** + * 查询是否存在,不存在则插入新数据 + * @param typeConcatEnum + */ + public ResourcesQuestionTypeEnum selectQuestionType(StrategyContext.QuestionTypeConcatEnum typeConcatEnum) { + return EnumUtil.likeValueOf(ResourcesQuestionTypeEnum.class, typeConcatEnum.getTypeConcat()); } /** diff --git a/web/src/main/java/com/ibeetl/jlw/web/ResourcesQuestionController.java b/web/src/main/java/com/ibeetl/jlw/web/ResourcesQuestionController.java index 2af807ba..7470cbd1 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/ResourcesQuestionController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/ResourcesQuestionController.java @@ -632,12 +632,20 @@ public class ResourcesQuestionController{ return JsonResult.success(resourcesQuestionService.getGroupQuestionTypeCount(courseInfoId)); } - //导入模板信息(word) -// @PostMapping(MODEL + "/importQBankWordTemplate.json") -// @Function("question.query") -// @ResponseBody -// public JsonResult importQBankWordTemplate(Integer isPublic,@RFile List fileEntityList,@SCoreUser CoreUser coreUser, @RequestReferer String referer) { -// JsonResult jsonResult = resourcesQuestionService.importQBankWordTemplate(isPublic,fileEntityList,coreUser,referer); -// return jsonResult; -// } + /** + * 功能描述:
+ * word方式导入题目 + * + * @param fileEntityList 文件列表 + * @param coreUser 传入的用户,使用机构ID和用户ID + * @return {@link JsonResult} + * @Author: lx + * @Date: 2023/1/8 22:49 + */ + @PostMapping(MODEL + "/importQuestionByWordTemplate.json") + @ResponseBody + public JsonResult importQuestionByWordTemplate(@RFile List fileEntityList, @SCoreUser CoreUser coreUser) { + JsonResult jsonResult = resourcesQuestionService.importQuestionByWordTemplate(fileEntityList, coreUser); + return jsonResult; + } }