|
@@ -1,24 +1,28 @@
|
|
package com.fs.course.service.impl;
|
|
package com.fs.course.service.impl;
|
|
|
|
|
|
import cn.hutool.json.JSONUtil;
|
|
import cn.hutool.json.JSONUtil;
|
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.fs.common.core.domain.R;
|
|
import com.fs.common.core.domain.R;
|
|
|
|
+import com.fs.common.exception.ServiceException;
|
|
import com.fs.common.utils.DateUtils;
|
|
import com.fs.common.utils.DateUtils;
|
|
import com.fs.common.utils.StringUtils;
|
|
import com.fs.common.utils.StringUtils;
|
|
import com.fs.course.config.CourseConfig;
|
|
import com.fs.course.config.CourseConfig;
|
|
import com.fs.course.domain.*;
|
|
import com.fs.course.domain.*;
|
|
|
|
+import com.fs.course.dto.FsCourseQuestionBankImportDTO;
|
|
import com.fs.course.mapper.*;
|
|
import com.fs.course.mapper.*;
|
|
import com.fs.course.param.FsCourseQuestionAnswerUParam;
|
|
import com.fs.course.param.FsCourseQuestionAnswerUParam;
|
|
import com.fs.course.service.IFsCourseQuestionBankService;
|
|
import com.fs.course.service.IFsCourseQuestionBankService;
|
|
import com.fs.store.domain.FsUser;
|
|
import com.fs.store.domain.FsUser;
|
|
import com.fs.store.mapper.FsUserMapper;
|
|
import com.fs.store.mapper.FsUserMapper;
|
|
-import com.fs.store.param.WxSendRedPacketParam;
|
|
|
|
import com.fs.store.service.IFsStorePaymentService;
|
|
import com.fs.store.service.IFsStorePaymentService;
|
|
import com.fs.system.service.ISysConfigService;
|
|
import com.fs.system.service.ISysConfigService;
|
|
|
|
+import com.hc.openapi.tool.fastjson.JSON;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
+import javax.validation.constraints.Size;
|
|
import java.util.*;
|
|
import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@@ -49,6 +53,8 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
|
|
private FsUserCourseVideoMapper courseVideoMapper;
|
|
private FsUserCourseVideoMapper courseVideoMapper;
|
|
@Autowired
|
|
@Autowired
|
|
private FsCourseWatchLogMapper courseWatchLogMapper;
|
|
private FsCourseWatchLogMapper courseWatchLogMapper;
|
|
|
|
+ @Autowired
|
|
|
|
+ private FsUserCourseCategoryMapper courseCategoryMapper;
|
|
|
|
|
|
/**
|
|
/**
|
|
* 查询题库
|
|
* 查询题库
|
|
@@ -331,6 +337,122 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 题目导入
|
|
|
|
+ *
|
|
|
|
+ * @param list 数据
|
|
|
|
+ * @param nickName 昵称
|
|
|
|
+ * @return String
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public String importData(List<FsCourseQuestionBankImportDTO> list, @Size String nickName) {
|
|
|
|
+ if (Objects.isNull(list) || list.isEmpty()) {
|
|
|
|
+ throw new ServiceException("导入数据不能为空");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int successNum = 0;
|
|
|
|
+ int failureNum = 0;
|
|
|
|
+ StringBuilder importSuccessMsg = new StringBuilder();
|
|
|
|
+ StringBuilder importErrorMsg = new StringBuilder();
|
|
|
|
+ StringBuilder importMsg = new StringBuilder();
|
|
|
|
+
|
|
|
|
+ for (FsCourseQuestionBankImportDTO importDTO : list) {
|
|
|
|
+ try {
|
|
|
|
+ String title = importDTO.getTitle();
|
|
|
|
+ String type = importDTO.getType();
|
|
|
|
+ String questionType = importDTO.getQuestionType();
|
|
|
|
+ String question = importDTO.getQuestion();
|
|
|
|
+ String answer = importDTO.getAnswer();
|
|
|
|
+
|
|
|
|
+ if (StringUtils.isBlank(title) || StringUtils.isBlank(type) || StringUtils.isBlank(question) || StringUtils.isBlank(answer)) {
|
|
|
|
+ String msg = "<br/>" + failureNum + "、题目 " + title + " 导入失败:信息不完整";
|
|
|
|
+ importErrorMsg.append(msg);
|
|
|
|
+ failureNum++;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!type.contains("单") && !type.contains("多")) {
|
|
|
|
+ String msg = "<br/>" + failureNum + "、题目 " + title + " 导入失败:题目类型不正确";
|
|
|
|
+ importErrorMsg.append(msg);
|
|
|
|
+ failureNum++;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 判断答案是否在选项里
|
|
|
|
+ String[] questions = question.split("\\|");
|
|
|
|
+ String[] answers = answer.split("\\|");
|
|
|
|
+
|
|
|
|
+ if (type.contains("多") && answers.length < 2) {
|
|
|
|
+ String msg = "<br/>" + failureNum + "、题目 " + title + " 导入失败:多选题答案不能少于2个";
|
|
|
|
+ importErrorMsg.append(msg);
|
|
|
|
+ failureNum++;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ List<String> optionsList = Arrays.asList(questions);
|
|
|
|
+ boolean allAnswersInOptions = true;
|
|
|
|
+
|
|
|
|
+ // 遍历每一个正确答案文本
|
|
|
|
+ for (String correctAnswer : answers) {
|
|
|
|
+ // 检查当前正确答案文本是否存在于选项列表中
|
|
|
|
+ if (!optionsList.contains(correctAnswer.trim())) {
|
|
|
|
+ allAnswersInOptions = false; // 发现一个不在选项里的答案
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!allAnswersInOptions) {
|
|
|
|
+ String msg = "<br/>" + failureNum + "、题目 " + title + " 导入失败:答案不在选项中";
|
|
|
|
+ importErrorMsg.append(msg);
|
|
|
|
+ failureNum++;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ JSONArray questionArray = new JSONArray();
|
|
|
|
+ optionsList = Arrays.asList(answers);
|
|
|
|
+ for (int i = 0; i < questions.length; i++) {
|
|
|
|
+ JSONObject optionObj = new JSONObject();
|
|
|
|
+ optionObj.put("name", questions[i]);
|
|
|
|
+ optionObj.put("isAnswer", optionsList.contains(questions[i].trim()) ? 1 : 0);
|
|
|
|
+ optionObj.put("indexId", i);
|
|
|
|
+ questionArray.add(optionObj);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 分类
|
|
|
|
+ Long questionTypeId = null;
|
|
|
|
+ FsUserCourseCategory category = courseCategoryMapper.selectFsUserCourseCategoryByName(questionType);
|
|
|
|
+ if (Objects.nonNull(category)) {
|
|
|
|
+ questionTypeId = category.getCateId();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ FsCourseQuestionBank questionBank = new FsCourseQuestionBank();
|
|
|
|
+ questionBank.setTitle(title);
|
|
|
|
+ questionBank.setType(type.contains("单") ? 1L : 2L);
|
|
|
|
+ questionBank.setQuestionType(questionTypeId);
|
|
|
|
+ questionBank.setStatus(1L);
|
|
|
|
+ questionBank.setSort(importDTO.getSort());
|
|
|
|
+ questionBank.setQuestion(JSON.toJSONString(questionArray));
|
|
|
|
+ questionBank.setAnswer(answers.length > 1 ? JSON.toJSONString(answers) : answer);
|
|
|
|
+ questionBank.setCreateTime(new Date());
|
|
|
|
+ questionBank.setCreateBy(nickName);
|
|
|
|
+ fsCourseQuestionBankMapper.insertFsCourseQuestionBank(questionBank);
|
|
|
|
+
|
|
|
|
+ importSuccessMsg.append("<br/>").append(successNum).append("、题目 ").append(title).append(" 导入成功");
|
|
|
|
+ successNum++;
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ String msg = "<br/>" + failureNum + "、题目 " + importDTO.getTitle() + " 导入异常:";
|
|
|
|
+ importErrorMsg.append(msg).append(e.getMessage());
|
|
|
|
+ failureNum++;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // 在所有导入处理完成后,构建最终的导入结果消息
|
|
|
|
+ importMsg.insert(0, "导入完成!成功" + successNum + " 条,失败" + failureNum + "条。");
|
|
|
|
+ importMsg.append(importErrorMsg);
|
|
|
|
+ importMsg.append(importSuccessMsg);
|
|
|
|
+ return importMsg.toString();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
|
|
public static String[] convertStringToArray(String inputString) {
|
|
public static String[] convertStringToArray(String inputString) {
|
|
String cleanString = inputString.replaceAll("[\\[\\]\"\\s]", "");
|
|
String cleanString = inputString.replaceAll("[\\[\\]\"\\s]", "");
|