fix 提交答案的bug

beetlsql3-dev
Mlxa0324 2 years ago
parent b1069fbf8e
commit eba567f294

@ -0,0 +1,169 @@
package cn.jlw.util;
import cn.hutool.core.lang.Range;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.ibeetl.jlw.enums.ResourcesQuestionTypeEnum;
import lombok.Builder;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import static cn.hutool.core.util.ObjectUtil.defaultIfNull;
import static java.util.stream.Collectors.joining;
/**
* ,
*
*
* @author mlx
*/
@Slf4j
public class QuestionUtil {
/**
*
*/
private static Range<String> LETTER_RANGE = new Range<>("A", "Z", (current, end, index) -> {
char c = current.toCharArray()[0];
if (c == end.toCharArray()[0]) {
return null;
}
return String.valueOf(++c);
});
/**
*
*
*
* @param obj 123
*
* @param stemFieldName
* @param optionFieldPrefixName
* @param trueAnswerFieldName
* @param questionTypeFieldName
* @return
*/
public static <T> Collection<QuestionInfo> convertToRandomOrderQuestionList(T obj, final String stemFieldName,
final String optionFieldPrefixName, final String trueAnswerFieldName, final String questionTypeFieldName) {
// 不取父类的属性
Field[] fieldsDirectly = ReflectUtil.getFieldsDirectly(obj.getClass(), false);
// 正确答案 值(字母值)
String trueAnswer = defaultIfNull(ReflectUtil.getFieldValue(obj, trueAnswerFieldName), "").toString();
// 题干 值
String questionStem = defaultIfNull(ReflectUtil.getFieldValue(obj, stemFieldName), "").toString();
String questionType = defaultIfNull(ReflectUtil.getFieldValue(obj, questionTypeFieldName), "").toString();
// 选项的属性
Field[] optionFields = ArrayUtil.filter(fieldsDirectly, field -> field.getName().contains(optionFieldPrefixName));
// 使用Map的无序性进行重排序
Map<String, QuestionInfo> Kv = new HashMap<>(6);
// 选项字段遍历
for (Field optionField : optionFields) {
String optionText = defaultIfNull(ReflectUtil.getFieldValue(obj, optionField), "").toString();
// 为空跳出
if (StrUtil.isBlank(optionText)) {
continue;
}
String optionName = optionField.getName();
QuestionInfo questionInfo = QuestionInfo.builder().questionStem(questionStem)
.questionType(EnumUtil.likeValueOf(ResourcesQuestionTypeEnum.class, Integer.valueOf(questionType)))
.optionText(optionText).isTrue(trueAnswer.contains(optionName))
.build();
Kv.put(optionName, questionInfo);
}
// 这里需要先重置,以防万一
LETTER_RANGE.reset();
// 设置选项的字母
Kv.forEach((k, v) -> {
v.setOptionLetter(LETTER_RANGE.next());
});
return Kv.values();
}
/**
*
* @param collection
* @param t
* @param stemFieldName
* @param optionFieldPrefixName
* @param trueAnswerFieldName
* @return
* @param <T>
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static <T> void fullSomeField(Collection<QuestionInfo> collection, T t, final String stemFieldName,
final String optionFieldPrefixName, final String trueAnswerFieldName) {
try {
LETTER_RANGE.reset();
// 正确答案
String answer = collection.stream().filter(QuestionInfo::getIsTrue)
.map(QuestionInfo::getOptionLetter).sorted().collect(joining(","));
// 选项的属性名字
String[] optionNames = collection.stream()
.map(item -> optionFieldPrefixName.concat(item.getOptionLetter())).toArray(String[]::new);
QuestionInfo[] questionInfos = collection.toArray(new QuestionInfo[]{});
for (int i = 0; i < questionInfos.length; i++) {
QuestionInfo questionInfo = questionInfos[i];
ReflectUtil.setFieldValue(t, stemFieldName, questionInfo.getQuestionStem());
ReflectUtil.setFieldValue(t, trueAnswerFieldName, answer);
for (int j = 0; j < optionNames.length; j++) {
ReflectUtil.setFieldValue(t, optionNames[j], questionInfos[i].getOptionText());
}
}
}catch (Exception e) {
log.debug(e.getMessage());
}
}
/**
*
* @param t
* @param stemFieldName
* @param optionFieldPrefixName
* @param trueAnswerFieldName
* @param <T>
*/
public static <T> void shuffleQuestion(T t, final String stemFieldName,
final String optionFieldPrefixName, final String trueAnswerFieldName, final String questionTypeFieldName) {
Collection<QuestionInfo> questionInfos = convertToRandomOrderQuestionList(t, stemFieldName, optionFieldPrefixName, trueAnswerFieldName, questionTypeFieldName);
fullSomeField(questionInfos, t, stemFieldName, optionFieldPrefixName, trueAnswerFieldName);
}
@Data
@Builder
public static class QuestionInfo {
/**
*
*/
private String questionStem;
/**
*
*/
private String optionText;
/**
*
*/
private String optionLetter;
/**
*
*/
private Boolean isTrue;
/**
*
*/
private ResourcesQuestionTypeEnum questionType;
}
}

@ -5,8 +5,6 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import com.ibeetl.jlw.enums.ResourcesQuestionTypeEnum;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
@ -23,6 +21,7 @@ import static org.apache.commons.lang3.StringUtils.upperCase;
*
* @author mlx
*/
@Deprecated
public class ResourcesQuestionOptionEntity {
@ -76,11 +75,13 @@ public class ResourcesQuestionOptionEntity {
/**
* ,
*
*
* @param answerFieldName
* @param prefix questionOption
* @param lastIsUppercase
*/
@Deprecated
public static void shuffleOrderOptions(Object obj, final String answerFieldName, final String prefix, Boolean lastIsUppercase) {
String questionAnswer = (String)ReflectUtil.getFieldValue(obj, answerFieldName);
Assert.notBlank(questionAnswer, "答案不能为空!");
@ -128,8 +129,8 @@ public class ResourcesQuestionOptionEntity {
// 答案和选项ABCDEF..对应
Map<String, String> answerMap = new HashMap<>(6);
// 判断题目是否有重复的值
// Assert.isTrue(optionTextList.size() == lastLetterFieldNameList.size(),
// "答案中有重复的值,请检查!");
Assert.isTrue(optionTextList.size() == lastLetterFieldNameList.size(),
"答案中有重复的值,请检查!");
// 乱序集合处理
for (int i = 0; i < lastLetterFieldNameList.size(); i++) {
@ -175,51 +176,4 @@ public class ResourcesQuestionOptionEntity {
Field[] fields = ReflectUtil.getFieldsDirectly(clazz, false);
verifyFieldExists(fields, answerFieldName, prefix);
}
/**
*
*
* @param obj
* @param stemFieldName
* @param optionFieldName
* @param trueOptionFieldName
* @param lastIsUppercase
* @return
*/
// public static List<QuestionInfo> getQuestionList(Object obj, final String stemFieldName,
// final String optionFieldName,
// final String trueOptionFieldName, Boolean lastIsUppercase) {
// ReflectUtil.getFields(obj, field -> {
// field.getName().
// })
// }
@Data
public static class QuestionInfo {
/**
*
*/
private String questionStem;
/**
*
*/
private String optionText;
/**
*
*/
private String optionLetter;
/**
*
*/
private boolean isTrue;
/**
*
*/
private ResourcesQuestionTypeEnum questionType;
}
}

@ -563,7 +563,7 @@ public class GeneralQuestionLogService extends CoreBaseService<GeneralQuestionLo
}
Assert.isTrue(!questionLog.getQuestionLogAddType().equals(addType), "无法再次提交答案,题目已完成!");
// 学生提交的答案
String answersText = join(questionLogMap.get(questionLog.getGeneralResourcesQuestionSnapshotId()), ",");
String answersText = join(questionLogMap.get(questionLog.getGeneralResourcesQuestionSnapshotId().toString()).split(","), ",");
// 是否是正确答案
Boolean isCorrectAnswer = questionLog.getQuestionAnswer().equalsIgnoreCase(answersText);
// 计算该题目学生的得分情况
@ -576,7 +576,10 @@ public class GeneralQuestionLogService extends CoreBaseService<GeneralQuestionLo
questionLog.setGeneralQuestionLogFinishTime(finishTime);
questionLog.setGeneralQuestionLogAnswer(answersText);
questionLog.setQuestionLogAddType(addType);
questionLog.setOrgId(student.getOrgId());
questionLog.setUserId(student.getUserId());
// 只添加可以更新的数据
updateList.add(questionLog);
});

@ -44,9 +44,10 @@ import javax.validation.constraints.NotNull;
import java.io.*;
import java.util.*;
import static cn.hutool.core.util.ObjectUtil.defaultIfNull;
import static cn.jlw.util.CacheUserUtil.getStudent;
import static cn.jlw.util.QuestionUtil.shuffleQuestion;
import static com.ibeetl.admin.core.util.ExcelUtil.getCellFormatValue;
import static com.ibeetl.jlw.entity.ResourcesQuestionOptionEntity.shuffleOrderOptions;
import static com.ibeetl.jlw.enums.BusinessCourseInfoEnum.SYSTEM_QUESTION;
import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.CHAPTER_EXERCISE;
import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.HOMEWORK_FILE;
@ -392,7 +393,7 @@ public class GeneralQuestionSettingService extends CoreBaseService<GeneralQuesti
generalQuestionSetting.setGeneralQuestionSettingType(EnumUtil.likeValueOf(ResourcesQuestionSnapshotFromTypeEnum.class, generalQuestionSettingType));
generalQuestionSetting.setGeneralQuestionSettingRequire(generalQuestionSettingRequire);
generalQuestionSetting.setGeneralQuestionSettingFile(generalQuestionSettingFile);
generalQuestionSetting.setGeneralQuestionSettingPushStatus(EnumUtil.likeValueOf(GlobalPushStatusEnum.class, generalQuestionSettingPushStatus));
generalQuestionSetting.setGeneralQuestionSettingPushStatus(EnumUtil.likeValueOf(GlobalPushStatusEnum.class, Integer.valueOf(defaultIfNull(generalQuestionSettingPushStatus, "-1"))));
generalQuestionSetting.setGeneralQuestionSettingStatus(Integer.parseInt(generalQuestionSettingStatus));
generalQuestionSetting.setGeneralQuestionSettingAddTime(TimeTool.getTime(generalQuestionSettingAddTime));
generalQuestionSetting.setOrgId(coreUser.getOrgId());
@ -506,13 +507,14 @@ public class GeneralQuestionSettingService extends CoreBaseService<GeneralQuesti
// 题目查询
resourcesQuestionSnapshots = generalResourcesQuestionSnapshotService.getValuesByQueryNotWithPermission(questionSnapshotQuery);
//
resourcesQuestionSnapshots = ObjectUtil.defaultIfNull(resourcesQuestionSnapshots, new ArrayList<>());
resourcesQuestionSnapshots = defaultIfNull(resourcesQuestionSnapshots, new ArrayList<>());
// 选项乱序(限单选、多选)
if (TRUE_CONST.equals(hwSetting.getGeneralQuestionSettingOptionNoOrder())) {
// 单题选项排序处理
resourcesQuestionSnapshots.forEach(value -> {
shuffleOrderOptions(value, "questionAnswer","questionOption", true);
shuffleQuestion(value, "questionStem","questionOption",
"questionAnswer", "questionType");
});
}

@ -45,6 +45,7 @@ import static cn.hutool.core.util.ArrayUtil.join;
import static cn.jlw.util.CacheUserUtil.getStudent;
import static com.ibeetl.admin.core.util.user.CacheUserUtil.getUserId;
import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.FINALLY_SUBMIT;
import static com.ibeetl.jlw.enums.QuestionLogAddTypeEnum.PRE_SUBMIT;
import static com.ibeetl.jlw.enums.ResourcesQuestionSnapshotFromTypeEnum.EXAM;
import static java.util.stream.Collectors.groupingBy;
@ -369,12 +370,14 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService<Teacher
if (!validateQuestionLogAddTimeLatest(questionSettingId, questionLog.getResourcesQuestionSnapshotId().toString(), studentId, addTime)) {
return;
}
Assert.isTrue(!questionLog.getQuestionLogAddType().equals(addType), "无法再次提交答案,题目已完成!");
Assert.isTrue(null == questionLog.getQuestionLogAddType()
|| addType.equals(PRE_SUBMIT), "无法再次提交答案,题目已完成!");
// 学生提交的答案
String answersText = join(questionLogMap.get(questionLog.getResourcesQuestionSnapshotId()), ",");
String answersText = join(questionLogMap.get(questionLog.getResourcesQuestionSnapshotId().toString()).split(","), ",");
// 是否是正确答案
Boolean isCorrectAnswer = questionLog.getQuestionAnswer().equalsIgnoreCase(answersText);
// 完成时间
// 完成时间,从生成试卷时候,开始计算
long finishTime = DateUtil.between(questionLog.getTeacherOpenCourseQuestionLogAddTime(), now, MINUTE);
// 填充属性
@ -384,6 +387,8 @@ public class TeacherOpenCourseQuestionLogService extends CoreBaseService<Teacher
questionLog.setTeacherOpenCourseQuestionLogUpdateTime(now);
questionLog.setTeacherOpenCourseQuestionLogFinishTime(finishTime);
questionLog.setQuestionLogAddType(addType);
questionLog.setOrgId(student.getOrgId());
questionLog.setUserId(student.getUserId());
// 只添加可以更新的数据
updateList.add(questionLog);

@ -705,7 +705,8 @@ public class TeacherOpenCourseQuestionSettingService extends CoreBaseService<Tea
if (TRUE_CONST.equals(hwSetting.getTeacherOpenCourseQuestionSettingOptionNoOrder())) {
// 单题选项排序处理
resourcesQuestionSnapshots.forEach(value -> {
// shuffleOrderOptions(value, "questionAnswer","questionOption", true);
// shuffleQuestion(value, "questionStem","questionOption",
// "questionAnswer", "questionType");
});
}

@ -117,6 +117,7 @@ public class TeacherOpenCourseQuestionLogController {
@PostMapping(API + "/addQuestionLog.do")
@ResponseBody
public JsonResult addQuestionLog(@RequestBody QuestionLogAddDTO questionLogAddDTO, @SCoreUser CoreUser coreUser) {
Assert.notNull(coreUser, "请登录后再操作");
Assert.isTrue(coreUser.isStudent(), "非学生身份,无法提交!");
teacherOpenCourseQuestionLogService.insertQuestionLog(questionLogAddDTO);
return JsonResult.success();

Loading…
Cancel
Save