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 a9832ac4..fa4f0f14 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/ResourcesQuestion.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/ResourcesQuestion.java @@ -2,7 +2,6 @@ package com.ibeetl.jlw.entity; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.EnumUtil; -import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.ReflectUtil; import cn.jlw.validate.ValidateConfig; @@ -23,7 +22,6 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -import static cn.hutool.core.util.ArrayUtil.join; import static cn.hutool.core.util.ObjectUtil.defaultIfNull; /* @@ -359,6 +357,9 @@ public class ResourcesQuestion extends BaseEntity{ this.resourcesQuestionOptionList = questionOptionList; } + public static final String LINE_8 = "_{8,}"; + public static final String SPLIT_ = "[---]"; + /** * 表设计缺陷,需要根据题目类型,进行值的转化,再存放到相应的位置 * @param questionOptionList @@ -388,25 +389,17 @@ public class ResourcesQuestion extends BaseEntity{ }); } break; case FILL_QUESTION: { - // 填空题 questionOptionA 存放的是空格的数量 - questionOptionList.forEach(item -> { - Integer count = NumberUtil.toInt(defaultIfNull(getQuestionOptionA(), "0").getBytes()); - setQuestionOptionA((++count).toString()); - }); + } break; case ANALYSIS_QUESTION: { // 分析题 questionOptionA 存放的是[---] 空的长度 // 分析题 questionOptionB 存放的是带填空的题干 - questionOptionList.forEach(item -> { - Integer count = NumberUtil.toInt(defaultIfNull(getQuestionOptionA(), "0").getBytes()); + questionOptionList.forEach(text -> { + Integer count = Integer.valueOf(defaultIfNull(getQuestionOptionA(), "0")); setQuestionOptionA((++count).toString()); - String questionOptionB = defaultIfNull(getQuestionOptionB(), ""); - - String[] splitArr = item.split("_{8,}"); - if (splitArr != null) { - setQuestionOptionB(questionOptionB + join(splitArr, "[---]")); - } + String replacedText = text.replaceAll(LINE_8, SPLIT_); + setQuestionOptionB(defaultIfNull(getQuestionOptionB(), "").concat(replacedText)); }); } break; default: 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 93e919df..b763cc1e 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/ResourcesQuestionService.java @@ -57,16 +57,16 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.function.Function; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import static cn.hutool.core.util.ArrayUtil.join; +import static com.ibeetl.jlw.entity.ResourcesQuestion.LINE_8; +import static com.ibeetl.jlw.entity.ResourcesQuestion.SPLIT_; import static com.ibeetl.jlw.entity.ResourcesQuestionOptionEntity.shuffleOrderOptions; import static com.ibeetl.jlw.enums.AddTypeEnum.ADMIN_ADD; import static com.ibeetl.jlw.enums.AddTypeEnum.FACULTY_ADD; import static com.ibeetl.jlw.service.strategy.StrategyContext.QuestionParagraphTypeEnum.OTHER; -import static com.ibeetl.jlw.service.strategy.StrategyContext.QuestionTypeConcatEnum.DECIDE; -import static com.ibeetl.jlw.service.strategy.StrategyContext.QuestionTypeConcatEnum.MULTIPLE; +import static com.ibeetl.jlw.service.strategy.StrategyContext.QuestionTypeConcatEnum.*; +import static com.ibeetl.jlw.service.strategy.WordQuestionOption.OPTION_REGEX; import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.joining; @@ -896,10 +896,11 @@ public class ResourcesQuestionService extends CoreBaseService resourcesQuestion.setOrgId(coreUser.getOrgId()); resourcesQuestion.setAddType(coreUser.isAdmin() ? ADMIN_ADD : FACULTY_ADD); - if (StringUtils.isNotBlank(questionStem.get())) { - resourcesQuestion.setQuestionStem(questionStem.get().replace("<", "<").replace(">", ">")); - } else { - resourcesQuestion.setQuestionStem(questionStem.get()); + // 填空题 questionOptionA 存放的是空格的数量 + if (StrUtil.isNotBlank(questionStem.get())) { + String replacedText = questionStem.get().replaceAll(LINE_8, SPLIT_); + resourcesQuestion.setQuestionOptionA(String.valueOf(StrUtil.count(replacedText, SPLIT_))); + resourcesQuestion.setQuestionStem(replacedText); } question.set(resourcesQuestion); @@ -951,9 +952,6 @@ public class ResourcesQuestionService extends CoreBaseService return resultVO; } - /** 取选项的正则 */ - private Pattern optionPattern = Pattern.compile("^[A-Za-z][\\.\\、\\.  ]"); - /** * 给题目添加选项 * @param text 单个选项的内容 @@ -962,13 +960,9 @@ public class ResourcesQuestionService extends CoreBaseService public void putQuestionOption(String text, ResourcesQuestion question){ //text为选项 if (StringUtils.isNotBlank(text)){ - text = text.replace("<","<").replace(">",">"); - } - Matcher matcher = optionPattern.matcher(text); - if(matcher.find()){ - String questionOption = text.substring(2); - question.putQuestionOptionList(Collections.singletonList(questionOption)); + text = text.replace("<","<").replace(">",">").replaceFirst(OPTION_REGEX, ""); } + question.putQuestionOptionList(Collections.singletonList(text)); } /** @@ -995,24 +989,25 @@ public class ResourcesQuestionService extends CoreBaseService /** 题干 */ case STEM: { questionStem.set(questionStem.get().concat(v)); - question.get().setQuestionStem(questionStem.get()); + String replacedText = questionStem.get().replaceAll(LINE_8, SPLIT_); + question.get().setQuestionOptionA(String.valueOf(StrUtil.count(replacedText, SPLIT_))); + question.get().setQuestionStem(replacedText); } 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)); -// } + if (SINGLE.equals(typeConcatEnum.get()) || MULTIPLE.equals(typeConcatEnum.get())) { + question.get().putQuestionOptionList(Collections.singletonList(v)); + } + // 分析题和填空题 + else if(ANALYSIS_QUESTION.equals(typeConcatEnum.get())) { + question.get().setQuestionOptionB(question.get().getQuestionOptionB().concat(v).replaceAll(LINE_8, SPLIT_)); + question.get().setQuestionOptionA(String.valueOf(StrUtil.count(question.get().getQuestionOptionB(), SPLIT_))); + } + // 填空题 + else if(FILL_QUESTION.equals(typeConcatEnum.get())) { + question.get().setQuestionOptionA(String.valueOf(StrUtil.count(question.get().getQuestionOptionB(), SPLIT_))); + } } break; /** 答案 */ case ANSWER: { @@ -1096,7 +1091,8 @@ public class ResourcesQuestionService extends CoreBaseService //

ABC

只获取ABC 删除所有标签元素。 String replaced = questionAnswer.replaceAll(" |", ""); // 取中文或者字母, 也有移除空格等符号的操作 - String res = ObjectUtil.defaultIfNull(ReUtil.getGroup0("[A-Za-z\\u4e00-\\u9fa5]+", replaced), replaced).toUpperCase(); +// String res = ObjectUtil.defaultIfNull(ReUtil.getGroup0("[A-Za-z\\u4e00-\\u9fa5]+", replaced), replaced).toUpperCase(); + String res = replaced.trim(); // 如果只有字母,则拆分规则: ABC => A,B,C if (typeConcatEnum.equals(MULTIPLE) && ReUtil.isMatch("^[A-Za-z]+$",res)) { // ABC => A,B,C diff --git a/web/src/main/java/com/ibeetl/jlw/service/strategy/WordQuestionOption.java b/web/src/main/java/com/ibeetl/jlw/service/strategy/WordQuestionOption.java index 10c5ee56..5e3cb858 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/strategy/WordQuestionOption.java +++ b/web/src/main/java/com/ibeetl/jlw/service/strategy/WordQuestionOption.java @@ -22,11 +22,11 @@ public class WordQuestionOption implements WordStrategy { /** * 举例: A. A、 A. A  A */ - private final String REGEX = "^[A-Za-z][\\.\\、\\.  ]"; + public static final String OPTION_REGEX = "^[A-Za-z][\\.\\、\\.  ]+"; /** * 第二种类型 分析题 (1).或(1)、或(1).或(1)、 */ - private final String REGEX2 = "^[((]\\d+[))][\\.\\、\\.  ]"; + public static final String OPTION_REGEX2 = "^考核内容[、\\::\\.  ]"; @Getter private StrategyContext.QuestionParagraphTypeEnum typeEnum = StrategyContext.QuestionParagraphTypeEnum.OPTION; @@ -39,7 +39,7 @@ public class WordQuestionOption implements WordStrategy { @Override public boolean support(String paragraph) { String text = paragraph.trim(); - return ReUtil.contains(REGEX, text) || ReUtil.contains(REGEX2, text); + return ReUtil.contains(OPTION_REGEX, text) || ReUtil.contains(OPTION_REGEX2, text); } @@ -49,7 +49,7 @@ public class WordQuestionOption implements WordStrategy { // paragraph = paragraph.replaceFirst(REGEX, "").trim(); paragraph = paragraph.trim(); Map map = new HashMap<>(1); - map.put(typeEnum, paragraph.trim()); + map.put(typeEnum, paragraph); consumer.accept(map); return paragraph; } diff --git a/web/src/main/java/com/ibeetl/jlw/validator/QuestionValidator.java b/web/src/main/java/com/ibeetl/jlw/validator/QuestionValidator.java index 95db599b..19e78c77 100644 --- a/web/src/main/java/com/ibeetl/jlw/validator/QuestionValidator.java +++ b/web/src/main/java/com/ibeetl/jlw/validator/QuestionValidator.java @@ -2,6 +2,7 @@ package com.ibeetl.jlw.validator; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import cn.jlw.util.ToolUtils; import com.ibeetl.jlw.entity.ResourcesQuestion; import org.apache.commons.lang3.Range; @@ -13,6 +14,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import static cn.hutool.core.util.ObjectUtil.defaultIfNull; +import static com.ibeetl.jlw.entity.ResourcesQuestion.SPLIT_; import static com.ibeetl.jlw.service.strategy.StrategyContext.QuestionTypeConcatEnum.*; /** @@ -118,9 +121,27 @@ public class QuestionValidator { return questionAnswer.length() != 1 ? "单选题只能有一个答案": ""; } - for (String s : questionAnswer.split(",")) { - if (!options.contains(s.toUpperCase())) { - return "答案不在选项内"; + if(Arrays.asList(SINGLE.getTypeConcat(), MULTIPLE.getTypeConcat()).contains(questionType)) { + for (String s : questionAnswer.split(",")) { + if (!options.contains(s.toUpperCase())) { + return "答案不在选项内"; + } + } + } + + if (FILL_QUESTION.getTypeConcat().equals(questionType)) { + // 答案只能是对或错,前后不能有空格 + return StrUtil.count(question.getQuestionStem(), SPLIT_) == 0 ? "填空题缺少填空,或没按照要求,输入填空位置的横线长度!" : ""; + } + if (ANALYSIS_QUESTION.getTypeConcat().equals(questionType)) { + // 答案只能是对或错,前后不能有空格 + int haveCount = StrUtil.count(question.getQuestionOptionB(), SPLIT_); + int countNum = Integer.valueOf(defaultIfNull(question.getQuestionOptionA(), "0")); + if (countNum == 0 || haveCount == 0) { + return "填空题缺少填空,或没按照要求,输入填空位置的横线长度!"; + } + if (countNum != haveCount) { + return "填空位置和填空数量不匹配!"; } }