| 
					
				 | 
			
			
				@@ -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]", ""); 
			 |