word题目导入

beetlsql3-dev
Mlxa0324 2 years ago
parent 974c09af42
commit 6c5a68b280

@ -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:

@ -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>
resourcesQuestion.setOrgId(coreUser.getOrgId());
resourcesQuestion.setAddType(coreUser.isAdmin() ? ADMIN_ADD : FACULTY_ADD);
if (StringUtils.isNotBlank(questionStem.get())) {
resourcesQuestion.setQuestionStem(questionStem.get().replace("<", "&lt;").replace(">", "&gt;"));
} 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<ResourcesQuestion>
return resultVO;
}
/** 取选项的正则 */
private Pattern optionPattern = Pattern.compile("^[A-Za-z][\\.\\、\\  ]");
/**
*
* @param text
@ -962,13 +960,9 @@ public class ResourcesQuestionService extends CoreBaseService<ResourcesQuestion>
public void putQuestionOption(String text, ResourcesQuestion question){
//text为选项
if (StringUtils.isNotBlank(text)){
text = text.replace("<","&lt;").replace(">","&gt;");
}
Matcher matcher = optionPattern.matcher(text);
if(matcher.find()){
String questionOption = text.substring(2);
question.putQuestionOptionList(Collections.singletonList(questionOption));
text = text.replace("<","&lt;").replace(">","&gt;").replaceFirst(OPTION_REGEX, "");
}
question.putQuestionOptionList(Collections.singletonList(text));
}
/**
@ -995,24 +989,25 @@ public class ResourcesQuestionService extends CoreBaseService<ResourcesQuestion>
/** 题干 */
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<String> 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<ResourcesQuestion>
// <p>ABC</p> 只获取ABC 删除所有</>标签元素。
String replaced = questionAnswer.replaceAll(" |</?[a-zA-Z\\u4e00-\\u9fa5]*?[^<]>", "");
// 取中文或者字母, 也有移除空格等符号的操作
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

@ -22,11 +22,11 @@ public class WordQuestionOption implements WordStrategy<String> {
/**
* 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<String> {
@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<String> {
// paragraph = paragraph.replaceFirst(REGEX, "").trim();
paragraph = paragraph.trim();
Map<StrategyContext.QuestionParagraphTypeEnum, String> map = new HashMap<>(1);
map.put(typeEnum, paragraph.trim());
map.put(typeEnum, paragraph);
consumer.accept(map);
return paragraph;
}

@ -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 "填空位置和填空数量不匹配!";
}
}

Loading…
Cancel
Save