|  | @@ -1,24 +1,28 @@
 | 
	
		
			
				|  |  |  package com.fs.course.service.impl;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import cn.hutool.json.JSONUtil;
 | 
	
		
			
				|  |  | +import com.alibaba.fastjson.JSONArray;
 | 
	
		
			
				|  |  |  import com.alibaba.fastjson.JSONObject;
 | 
	
		
			
				|  |  |  import com.fs.common.core.domain.R;
 | 
	
		
			
				|  |  | +import com.fs.common.exception.ServiceException;
 | 
	
		
			
				|  |  |  import com.fs.common.utils.DateUtils;
 | 
	
		
			
				|  |  |  import com.fs.common.utils.StringUtils;
 | 
	
		
			
				|  |  |  import com.fs.course.config.CourseConfig;
 | 
	
		
			
				|  |  |  import com.fs.course.domain.*;
 | 
	
		
			
				|  |  | +import com.fs.course.dto.FsCourseQuestionBankImportDTO;
 | 
	
		
			
				|  |  |  import com.fs.course.mapper.*;
 | 
	
		
			
				|  |  |  import com.fs.course.param.FsCourseQuestionAnswerUParam;
 | 
	
		
			
				|  |  |  import com.fs.course.service.IFsCourseQuestionBankService;
 | 
	
		
			
				|  |  |  import com.fs.store.domain.FsUser;
 | 
	
		
			
				|  |  |  import com.fs.store.mapper.FsUserMapper;
 | 
	
		
			
				|  |  | -import com.fs.store.param.WxSendRedPacketParam;
 | 
	
		
			
				|  |  |  import com.fs.store.service.IFsStorePaymentService;
 | 
	
		
			
				|  |  |  import com.fs.system.service.ISysConfigService;
 | 
	
		
			
				|  |  | +import com.hc.openapi.tool.fastjson.JSON;
 | 
	
		
			
				|  |  |  import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import javax.validation.constraints.Size;
 | 
	
		
			
				|  |  |  import java.util.*;
 | 
	
		
			
				|  |  |  import java.util.stream.Collectors;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -49,6 +53,8 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
 | 
	
		
			
				|  |  |      private FsUserCourseVideoMapper courseVideoMapper;
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      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) {
 | 
	
		
			
				|  |  |          String cleanString = inputString.replaceAll("[\\[\\]\"\\s]", "");
 |