Long 1 місяць тому
батько
коміт
c06e8da64d

+ 22 - 0
fs-admin/src/main/java/com/fs/course/controller/FsCourseQuestionBankController.java

@@ -11,11 +11,14 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.core.security.LoginUser;
 import com.fs.core.web.service.TokenService;
 import com.fs.course.domain.FsCourseQuestionBank;
+import com.fs.course.dto.FsCourseQuestionBankImportDTO;
 import com.fs.course.service.IFsCourseQuestionBankService;
 
+import com.fs.store.dto.StoreOrderExpressExportDTO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -106,4 +109,23 @@ public class FsCourseQuestionBankController extends BaseController
         return toAjax(fsCourseQuestionBankService.deleteFsCourseQuestionBankByIds(ids));
     }
 
+    //下载模板
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate() {
+        ExcelUtil<FsCourseQuestionBankImportDTO> util = new ExcelUtil<>(FsCourseQuestionBankImportDTO.class);
+        return util.importTemplateExcel("课程题目数据");
+    }
+
+    @Log(title = "导入", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('course:courseQuestionBank:importData')")
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file) throws Exception {
+        ExcelUtil<FsCourseQuestionBankImportDTO> util = new ExcelUtil<>(FsCourseQuestionBankImportDTO.class);
+        List<FsCourseQuestionBankImportDTO> list = util.importExcel(file.getInputStream());
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String message = fsCourseQuestionBankService.importData(list, loginUser.getUser().getNickName());
+        return AjaxResult.success(message);
+    }
+
 }

+ 1 - 1
fs-service-system/src/main/java/com/fs/course/domain/FsCourseQuestionBank.java

@@ -41,5 +41,5 @@ public class FsCourseQuestionBank extends BaseEntity
     /** 答案 */
     @Excel(name = "答案")
     private String answer;
-    private String questionType;
+    private Long questionType;
 }

+ 26 - 0
fs-service-system/src/main/java/com/fs/course/dto/FsCourseQuestionBankImportDTO.java

@@ -0,0 +1,26 @@
+package com.fs.course.dto;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class FsCourseQuestionBankImportDTO {
+
+    @Excel(name = "标题")
+    private String title;
+
+    @Excel(name = "问题类别")
+    private String questionType;
+
+    @Excel(name = "题目类型: 单选 多选")
+    private String type;
+
+    @Excel(name = "选项: 多个用 | 隔开")
+    private String question;
+
+    @Excel(name = "答案: 多个用 | 隔开")
+    private String answer;
+
+    @Excel(name = "序号")
+    private long sort;
+}

+ 9 - 0
fs-service-system/src/main/java/com/fs/course/mapper/FsUserCourseCategoryMapper.java

@@ -3,6 +3,7 @@ package com.fs.course.mapper;
 import java.util.List;
 import com.fs.course.domain.FsUserCourseCategory;
 import com.fs.his.vo.OptionsVO;
+import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
 /**
@@ -69,4 +70,12 @@ public interface FsUserCourseCategoryMapper
 
     @Select("select cate_id dict_value, cate_name dict_label  from fs_user_course_category WHERE pid =#{pid} and is_del=0 ")
     List<OptionsVO> selectCateListByPid(Long pid);
+
+    /**
+     * 根据名称查询分类
+     * @param name  名称
+     * @return  FsUserCourseCategory
+     */
+    @Select("select * from fs_user_course_category where cate_name = #{name} limit 1")
+    FsUserCourseCategory selectFsUserCourseCategoryByName(@Param("name")String name);
 }

+ 10 - 0
fs-service-system/src/main/java/com/fs/course/service/IFsCourseQuestionBankService.java

@@ -2,8 +2,10 @@ package com.fs.course.service;
 
 import com.fs.common.core.domain.R;
 import com.fs.course.domain.FsCourseQuestionBank;
+import com.fs.course.dto.FsCourseQuestionBankImportDTO;
 import com.fs.course.param.FsCourseQuestionAnswerUParam;
 
+import javax.validation.constraints.Size;
 import java.util.List;
 
 /**
@@ -73,4 +75,12 @@ public interface IFsCourseQuestionBankService
      */
     R courseAnswerByfsUser(FsCourseQuestionAnswerUParam param);
 
+    /**
+     * 题目导入
+     *
+     * @param list     数据
+     * @param nickName 昵称
+     * @return String
+     */
+    String importData(List<FsCourseQuestionBankImportDTO> list, @Size String nickName);
 }

+ 123 - 1
fs-service-system/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java

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