| 
					
				 | 
			
			
				@@ -1,6 +1,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.fs.course.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import cn.hutool.json.JSONUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.alibaba.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.alibaba.fastjson.JSONArray; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.alibaba.fastjson.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -10,7 +11,10 @@ import com.fs.common.utils.DateUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.common.utils.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.course.cache.FsUserCourseCategoryCacheService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.course.config.CourseConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.fs.course.domain.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fs.course.domain.FsCourseAnswerLogs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fs.course.domain.FsCourseQuestionBank; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fs.course.domain.FsCourseWatchLog; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fs.course.domain.FsUserCourseCategory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.course.dto.FsCourseQuestionBankImportDTO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.course.mapper.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.course.param.FsCourseQuestionAnswerUParam; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -21,15 +25,15 @@ import com.fs.store.mapper.FsUserMapper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.store.service.IFsStorePaymentService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.fs.system.service.ISysConfigService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.google.gson.JsonParser; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import com.hc.openapi.tool.fastjson.JSON; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import jodd.util.StringUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.apache.commons.collections4.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import lombok.Getter; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 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.function.BiConsumer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.function.Function; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -360,134 +364,297 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @return String 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public String importData(List<FsCourseQuestionBankImportDTO> list, @Size String nickName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public String importData(List<FsCourseQuestionBankImportDTO> list, 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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ImportResult result = new ImportResult(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<FsCourseQuestionBank> importData = new ArrayList<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Map<String,FsUserCourseCategory> categoryData = courseCategoryMapper.queryAllCategoryData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, FsUserCourseCategory> categoryData = courseCategoryMapper.queryAllCategoryData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (FsCourseQuestionBankImportDTO importDTO : list) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                String title = importDTO.getTitle(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                String type = importDTO.getType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                String questionType = importDTO.getQuestionType(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                String questionSubTyp = importDTO.getQuestionSubTyp(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                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++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 数据验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                ValidationResult validation = validateImportData(importDTO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!validation.isValid()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    result.addFailure(importDTO.getTitle(), validation.getErrorMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (!type.contains("单") && !type.contains("多")) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    String msg = "<br/>" + failureNum + "、题目 " + title + " 导入失败:题目类型不正确"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    importErrorMsg.append(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    failureNum++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 构建题目对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                FsCourseQuestionBank questionBank = buildQuestionBank(importDTO, categoryData, nickName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                importData.add(questionBank); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                result.addSuccess(importDTO.getTitle()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 判断答案是否在选项里 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                String[] questions = question.split("\\|"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                String[] answers = answer.split("\\|"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                result.addFailure(importDTO.getTitle(), "导入异常: " + e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (type.contains("多") && answers.length < 2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    String msg = "<br/>" + failureNum + "、题目 " + title + " 导入失败:多选题答案不能少于2个"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    importErrorMsg.append(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    failureNum++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 批量保存 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!importData.isEmpty()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            fsCourseQuestionBankMapper.insertFsCourseQuestionBankBatch(importData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                List<String> optionsList = Arrays.asList(questions); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                boolean allAnswersInOptions = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return result.buildResultMessage(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 遍历每一个正确答案文本 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                for (String correctAnswer : answers) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    // 检查当前正确答案文本是否存在于选项列表中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    if (!optionsList.contains(correctAnswer.trim())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        allAnswersInOptions = false; // 发现一个不在选项里的答案 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 验证导入数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private ValidationResult validateImportData(FsCourseQuestionBankImportDTO importDTO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 基础字段验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isBlank(importDTO.getTitle())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ValidationResult.fail("标题不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isBlank(importDTO.getType())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ValidationResult.fail("类别不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (Objects.isNull(importDTO.getSort())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ValidationResult.fail("排序不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isBlank(importDTO.getAnswer())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ValidationResult.fail("答案不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (!allAnswersInOptions) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    String msg = "<br/>" + failureNum + "、题目 " + title + " 导入失败:答案不在选项中"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    importErrorMsg.append(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    failureNum++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 选项验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ValidationResult optionValidation = validateOptions(importDTO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!optionValidation.isValid()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return optionValidation; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 题目类型验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!isValidQuestionType(importDTO.getType())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ValidationResult.fail("题目类型不正确,仅支持单选题和多选题"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 分类 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                FsUserCourseCategory fsUserCourseCategory = categoryData.get(questionType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Long questionTypeId = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if(fsUserCourseCategory != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    questionTypeId = fsUserCourseCategory.getCateId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 答案验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return validateAnswers(importDTO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // 题目子分类 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                fsUserCourseCategory = categoryData.get(questionSubTyp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                Long questionSubTypeId = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if(fsUserCourseCategory != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    questionSubTypeId = fsUserCourseCategory.getCateId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 验证选项 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private ValidationResult validateOptions(FsCourseQuestionBankImportDTO importDTO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isBlank(importDTO.getQuestionA()) || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                StringUtils.isBlank(importDTO.getQuestionB()) || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                StringUtils.isBlank(importDTO.getQuestionC())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ValidationResult.fail("选项A、B、C不能为空"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return ValidationResult.success(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                questionBank.setQuestionSubType(questionSubTypeId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 验证题目类型 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private boolean isValidQuestionType(String type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return type.contains("单") || type.contains("多"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                importData.add(questionBank); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 验证答案 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private ValidationResult validateAnswers(FsCourseQuestionBankImportDTO importDTO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String[] answers = importDTO.getAnswer().trim().toUpperCase().split(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 多选题答案数量验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (importDTO.getType().contains("多") && answers.length < 2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return ValidationResult.fail("多选题答案不能少于2个"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                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++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 答案选项验证 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<String> validOptions = getValidOptions(importDTO); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for (String answer : answers) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!validOptions.contains(answer.trim())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return ValidationResult.fail("答案不在选项中"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if(CollectionUtils.isNotEmpty(importData)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            fsCourseQuestionBankMapper.insertFsCourseQuestionBankBatch(importData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return ValidationResult.success(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 获取有效选项列表 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private List<String> getValidOptions(FsCourseQuestionBankImportDTO importDTO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<String> options = new ArrayList<>(Arrays.asList("A", "B", "C")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isNotBlank(importDTO.getQuestionD())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            options.add("D"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return options; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 构建题目对象 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private FsCourseQuestionBank buildQuestionBank(FsCourseQuestionBankImportDTO importDTO, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                   Map<String, FsUserCourseCategory> categoryData, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                   String nickName) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FsCourseQuestionBank questionBank = new FsCourseQuestionBank(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 基础信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionBank.setTitle(importDTO.getTitle()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionBank.setType(getQuestionTypeCode(importDTO.getType())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionBank.setSort(importDTO.getSort()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionBank.setStatus(parseStatus(importDTO.getStatus())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionBank.setCreateTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionBank.setCreateBy(nickName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 分类信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        setQuestionCategories(questionBank, importDTO, categoryData); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 选项和答案 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionBank.setQuestion(buildQuestionOptions(importDTO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionBank.setAnswer(buildAnswer(importDTO)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return questionBank; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // 在所有导入处理完成后,构建最终的导入结果消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        importMsg.insert(0, "导入完成!成功" + successNum + " 条,失败" + failureNum + "条。"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        importMsg.append(importErrorMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        importMsg.append(importSuccessMsg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return importMsg.toString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 获取题目类型编码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Long getQuestionTypeCode(String type) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return type.contains("单") ? 1L : 2L; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 解析状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private Long parseStatus(String statusStr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isBlank(statusStr)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return 1L; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return statusStr.contains("正常") ? 1L : 0L; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return 1L; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 设置题目分类 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void setQuestionCategories(FsCourseQuestionBank questionBank, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                       FsCourseQuestionBankImportDTO importDTO, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                       Map<String, FsUserCourseCategory> categoryData) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isBlank(importDTO.getQuestionType())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FsUserCourseCategory category = categoryData.get(importDTO.getQuestionType().trim()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (category != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            questionBank.setQuestionType(category.getCateId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // 子分类 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (StringUtils.isNotBlank(importDTO.getQuestionSubTyp())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                FsUserCourseCategory subCategory = categoryData.get(importDTO.getQuestionSubTyp().trim()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (subCategory != null && Objects.equals(subCategory.getPid(), category.getCateId())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    questionBank.setQuestionSubType(subCategory.getCateId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 构建选项JSON 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String buildQuestionOptions(FsCourseQuestionBankImportDTO importDTO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONArray questionArray = new JSONArray(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String[] answers = importDTO.getAnswer().trim().toUpperCase().split(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<String> answerList = Arrays.asList(answers); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 构建选项 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        addOption(questionArray, importDTO.getQuestionA(), answerList.contains("A"), 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        addOption(questionArray, importDTO.getQuestionB(), answerList.contains("B"), 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        addOption(questionArray, importDTO.getQuestionC(), answerList.contains("C"), 2); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (StringUtils.isNotBlank(importDTO.getQuestionD())) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            addOption(questionArray, importDTO.getQuestionD(), answerList.contains("D"), 3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return JSON.toJSONString(questionArray); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 添加选项 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private void addOption(JSONArray questionArray, String optionText, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                           boolean isAnswer, int indexId) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        JSONObject option = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        option.put("name", optionText.trim()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        option.put("isAnswer", isAnswer ? 1 : 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        option.put("indexId", indexId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionArray.add(option); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 构建答案 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String buildAnswer(FsCourseQuestionBankImportDTO importDTO) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String[] answers = importDTO.getAnswer().trim().toUpperCase().split(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<String> answerList = Arrays.asList(answers); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<String, String> questionMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionMap.put("A", importDTO.getQuestionA().trim()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionMap.put("B", importDTO.getQuestionB().trim()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionMap.put("C", importDTO.getQuestionC().trim()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionMap.put("D", importDTO.getQuestionD().trim()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<String> selectedAnswers = answerList.stream() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .map(questionMap::get) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (answerList.size() == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return selectedAnswers.get(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return JSON.toJSONString(selectedAnswers); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 辅助类 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Getter 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static class ValidationResult { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final boolean valid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final String errorMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private ValidationResult(boolean valid, String errorMessage) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.valid = valid; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            this.errorMessage = errorMessage; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public static ValidationResult success() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new ValidationResult(true, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public static ValidationResult fail(String message) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return new ValidationResult(false, message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static class ImportResult { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int successNum = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private int failureNum = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final StringBuilder successMsg = new StringBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private final StringBuilder errorMsg = new StringBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void addSuccess(String title) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            successNum++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            successMsg.append("<br/>").append(successNum).append("、题目 ").append(title).append(" 导入成功"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void addFailure(String title, String error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            failureNum++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            errorMsg.append("<br/>").append(failureNum).append("、题目 ").append(title).append(" 导入失败:").append(error); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public String buildResultMessage() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return "导入完成!成功" + successNum + " 条,失败" + failureNum + "条。" + errorMsg + successMsg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 根据ID查询题目 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * @param ids   ids 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -554,6 +721,61 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return fsCourseQuestionBankMapper.selectNameByCateId(cateId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 题目导出 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @param fsCourseQuestionBank  参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * @return  list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public List<FsCourseQuestionBankImportDTO> exportData(FsCourseQuestionBank fsCourseQuestionBank) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<FsCourseQuestionBank> fsCourseQuestionBanks = fsCourseQuestionBankMapper.selectFsCourseQuestionBankList(fsCourseQuestionBank); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<Long, FsUserCourseCategory> categoryMap = courseCategoryMapper.queryAllIdKeyCategoryData(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 辅助方法:根据ID从Map获取分类名称 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Function<Long, String> getCategoryName = id -> Optional.ofNullable(categoryMap.get(id)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .map(FsUserCourseCategory::getCateName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                .orElse(null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<Integer, BiConsumer<FsCourseQuestionBankImportDTO, String>> questionSetters = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionSetters.put(0, FsCourseQuestionBankImportDTO::setQuestionA); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionSetters.put(1, FsCourseQuestionBankImportDTO::setQuestionB); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionSetters.put(2, FsCourseQuestionBankImportDTO::setQuestionC); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        questionSetters.put(3, FsCourseQuestionBankImportDTO::setQuestionD); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Map<Integer, String> answerLettersMap = new HashMap<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        answerLettersMap.put(0, "A"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        answerLettersMap.put(1, "B"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        answerLettersMap.put(2, "C"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        answerLettersMap.put(3, "D"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return fsCourseQuestionBanks.stream().map(q -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            FsCourseQuestionBankImportDTO dto = new FsCourseQuestionBankImportDTO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            dto.setTitle(q.getTitle()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            dto.setSort(q.getSort()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            dto.setType(q.getType() == 1 ? "单选" : "多选"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Optional.ofNullable(q.getQuestionType()).map(getCategoryName).ifPresent(dto::setQuestionType); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Optional.ofNullable(q.getQuestionSubType()).map(getCategoryName).ifPresent(dto::setQuestionSubTyp); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            dto.setStatus(q.getStatus() == 1 ? "正常" : "停用"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            StringBuilder answersBuilder = new StringBuilder(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            JSONArray array = JSON.parseArray(q.getQuestion()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            array.forEach(jsonObject -> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                JSONObject json = (JSONObject) jsonObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int index = json.getInteger("indexId"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                String name = json.getString("name"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                int isAnswer = json.getInteger("isAnswer"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                questionSetters.get(index).accept(dto, name); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (isAnswer == 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    answersBuilder.append(answerLettersMap.get(index)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            dto.setAnswer(answersBuilder .toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return dto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }).collect(Collectors.toList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static String[] convertStringToArray(String inputString) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         String cleanString = inputString.replaceAll("[\\[\\]\"\\s]", ""); 
			 |