he2802 3 жил өмнө
parent
commit
1523eedf59

+ 53 - 15
zhongzheng-admin/src/main/java/com/zhongzheng/controller/bank/QuestionController.java

@@ -5,30 +5,29 @@ import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Arrays;
+import java.util.Map;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.http.HttpStatus;
+import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageInfo;
 import com.zhongzheng.common.core.domain.entity.SysUser;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.core.page.TableDataInfo;
 import com.zhongzheng.common.utils.ServletUtils;
+import com.zhongzheng.common.utils.poi.EasyPoiUtil;
 import com.zhongzheng.common.utils.poi.ExcelUtil;
 import com.zhongzheng.framework.web.service.TokenService;
-import com.zhongzheng.modules.bank.bo.QuestionAddBo;
-import com.zhongzheng.modules.bank.bo.QuestionBusinessQueryBo;
-import com.zhongzheng.modules.bank.bo.QuestionEditBo;
-import com.zhongzheng.modules.bank.bo.QuestionQueryBo;
+import com.zhongzheng.modules.bank.bo.*;
 import com.zhongzheng.modules.bank.domain.Exam;
 import com.zhongzheng.modules.bank.domain.Question;
 import com.zhongzheng.modules.bank.domain.QuestionBusiness;
 import com.zhongzheng.modules.bank.service.IQuestionBusinessService;
 import com.zhongzheng.modules.bank.service.IQuestionService;
-import com.zhongzheng.modules.bank.vo.QuestionBusinessVo;
-import com.zhongzheng.modules.bank.vo.QuestionExport;
-import com.zhongzheng.modules.bank.vo.QuestionImport;
-import com.zhongzheng.modules.bank.vo.QuestionVo;
+import com.zhongzheng.modules.bank.vo.*;
+import com.zhongzheng.modules.course.bo.CourseSectionBusinessAddBo;
+import com.zhongzheng.modules.course.vo.CourseSectionImport;
 import com.zhongzheng.modules.goods.vo.GoodsVo;
 import com.zhongzheng.modules.user.vo.UserSubscribeErrorImport;
 import lombok.RequiredArgsConstructor;
@@ -156,18 +155,19 @@ public class QuestionController extends BaseController {
     @PostMapping("/importData")
     public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
     {
-        ExcelUtil<QuestionImport> util = new ExcelUtil<QuestionImport>(QuestionImport.class);
-        List<QuestionImport> questionList = util.importExcel(file.getInputStream());
+        List<QuestionImportV2> questionList2 =EasyPoiUtil.importExcel(file,0,2,QuestionImportV2.class);
+        ExcelUtil<QuestionImportV2> util = new ExcelUtil<QuestionImportV2>(QuestionImportV2.class);
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String operName = loginUser.getUsername();
-        List<QuestionImport> errorList = iQuestionService.importQuestion(questionList, updateSupport, operName);
+        List<QuestionImport> questionList = new ArrayList<>();
+        List<QuestionImportV2> errorList = iQuestionService.importExcelQuestionV2(questionList2, updateSupport, operName);
         if(Validator.isNotEmpty(errorList)&&errorList.size()>0){
-            List<QuestionExport> errorListExport = new ArrayList<>();
-            for(QuestionImport qi : errorList){
-                QuestionExport item = BeanUtil.toBean(qi, QuestionExport.class);
+            List<QuestionImportV2> errorListExport = new ArrayList<>();
+            for(QuestionImportV2 qi : errorList){
+                QuestionImportV2 item = BeanUtil.toBean(qi, QuestionImportV2.class);
                 errorListExport.add(item);
             }
-            ExcelUtil<QuestionExport> util1 = new ExcelUtil<QuestionExport>(QuestionExport.class);
+            ExcelUtil<QuestionImportV2> util1 = new ExcelUtil<QuestionImportV2>(QuestionImportV2.class);
             String timeStr= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
             return util.exportEasyExcel(util1.exportEasyData(errorListExport), "导出错误数据"+timeStr);
         }else{
@@ -175,6 +175,44 @@ public class QuestionController extends BaseController {
         }
     }
 
+    @Log(title = "题目管理", businessType = BusinessType.IMPORT)
+    @ApiOperation("导入题目模板返回数组")
+    @PreAuthorize("@ss.hasPermi('system:question:import')")
+    @PostMapping("/importDataBackList")
+    public AjaxResult<Map<String, Object>> importDataBackList(MultipartFile file) throws Exception
+    {
+        List<QuestionImportV2> questionList2 =EasyPoiUtil.importExcel(file,0,2,QuestionImportV2.class);
+
+        ExcelUtil<QuestionImportV2> util = new ExcelUtil<QuestionImportV2>(QuestionImportV2.class);
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String operName = loginUser.getUsername();
+        //只返回数据不插入数据库
+        Map<String, Object> rs = iQuestionService.importExcelQuestionV2NotInBank(questionList2, false, operName);
+        List<QuestionImportV2> errorList = (List<QuestionImportV2>)rs.get("errorList");
+        List<QuestionAddBo> nqList = (List<QuestionAddBo>)rs.get("questionList");
+        if(Validator.isNotEmpty(errorList)&&errorList.size()>0){
+            List<QuestionImportV2> errorListExport = new ArrayList<>();
+            for(QuestionImportV2 qi : errorList){
+                QuestionImportV2 item = BeanUtil.toBean(qi, QuestionImportV2.class);
+                errorListExport.add(item);
+            }
+            ExcelUtil<QuestionImportV2> util1 = new ExcelUtil<QuestionImportV2>(QuestionImportV2.class);
+            String timeStr= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+            rs.put("errorExcel",util.exportEasyExcel(util1.exportEasyData(errorListExport), "导出错误数据"+timeStr));
+            rs.remove("errorList");
+        }
+        if(questionList2.size()>0&&questionList2.size()>nqList.size()&&nqList.size()>0){
+            rs.put("fullStatus","部分成功");
+        }
+        else if(questionList2.size()==nqList.size()){
+            rs.put("fullStatus","全部成功");
+        }
+        else{
+            rs.put("fullStatus","失败");
+        }
+        return AjaxResult.success(rs);
+    }
+
     @Log(title = "导入题目Word模板", businessType = BusinessType.IMPORT)
     @ApiOperation("导入题目Word模板")
     @PreAuthorize("@ss.hasPermi('system:question:import')")

+ 5 - 5
zhongzheng-admin/src/main/java/com/zhongzheng/controller/course/CourseSectionController.java

@@ -6,11 +6,13 @@ import java.util.Arrays;
 import java.util.Map;
 
 import cn.hutool.core.lang.Validator;
+import com.alibaba.fastjson.JSON;
 import com.zhongzheng.common.core.domain.model.LoginUser;
 import com.zhongzheng.common.utils.ServletUtils;
 import com.zhongzheng.framework.web.service.TokenService;
 import com.zhongzheng.modules.bank.vo.QuestionImport;
 import com.zhongzheng.modules.course.bo.CourseSectionAddBo;
+import com.zhongzheng.modules.course.bo.CourseSectionBusinessAddBo;
 import com.zhongzheng.modules.course.bo.CourseSectionEditBo;
 import com.zhongzheng.modules.course.bo.CourseSectionQueryBo;
 import com.zhongzheng.modules.course.domain.CourseSectionBusiness;
@@ -143,16 +145,14 @@ public class CourseSectionController extends BaseController {
     @Log(title = "导入节模板", businessType = BusinessType.IMPORT)
     @PreAuthorize("@ss.hasPermi('system:section:import')")
     @PostMapping("/importDataBusiness")
-    public AjaxResult<Map<String,Object>> importDataBusiness(MultipartFile file, Long educationTypeId,Long projectId,Long businessId,Long subjectId) throws Exception
+    public AjaxResult<Map<String,Object>> importDataBusiness(MultipartFile file,String businessJson) throws Exception
     {
+        List<CourseSectionBusinessAddBo> businessList = JSON.parseArray(businessJson, CourseSectionBusinessAddBo.class);
         ExcelUtil<CourseSectionImport> util = new ExcelUtil<CourseSectionImport>(CourseSectionImport.class);
         List<CourseSectionImport> sectionList = util.importExcel(file.getInputStream());
         Collections.reverse(sectionList);
         for(CourseSectionImport sectionImport : sectionList){
-            sectionImport.setEducationTypeId(educationTypeId);
-            sectionImport.setProjectId(projectId);
-            sectionImport.setBusinessId(businessId);
-            sectionImport.setSubjectId(subjectId);
+            sectionImport.setBusinessList(businessList);
         }
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         String operName = loginUser.getUsername();

+ 174 - 0
zhongzheng-common/src/main/java/com/zhongzheng/common/utils/poi/EasyPoiUtil.java

@@ -0,0 +1,174 @@
+package com.zhongzheng.common.utils.poi;
+
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+public class EasyPoiUtil {
+    /**
+     * 功能描述:复杂导出Excel,包括文件名以及表名。创建表头
+     *
+     * @param list 导出的实体类
+     * @param title 表头名称
+     * @param sheetName sheet表名
+     * @param pojoClass 映射的实体类
+     * @param isCreateHeader 是否创建表头
+     * @param fileName
+     * @param response
+     * @return
+     */
+    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) {
+        ExportParams exportParams = new ExportParams(title, sheetName);
+        exportParams.setCreateHeadRows(isCreateHeader);
+        defaultExport(list, pojoClass, fileName, response, exportParams);
+    }
+
+
+    /**
+     * 功能描述:复杂导出Excel,包括文件名以及表名,不创建表头
+     *
+     * @param list 导出的实体类
+     * @param title 表头名称
+     * @param sheetName sheet表名
+     * @param pojoClass 映射的实体类
+     * @param fileName
+     * @param response
+     * @return
+     */
+    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) {
+        defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
+    }
+
+    /**
+     * 功能描述:Map 集合导出
+     *
+     * @param list 实体集合
+     * @param fileName 导出的文件名称
+     * @param response
+     * @return
+     */
+    public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
+        defaultExport(list, fileName, response);
+    }
+
+    /**
+     * 功能描述:默认导出方法
+     *
+     * @param list 导出的实体集合
+     * @param fileName 导出的文件名
+     * @param pojoClass pojo实体
+     * @param exportParams ExportParams封装实体
+     * @param response
+     * @return
+     */
+    private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
+        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
+        if (workbook != null) {
+            downLoadExcel(fileName, response, workbook);
+        }
+    }
+
+    /**
+     * 功能描述:Excel导出
+     *
+     * @param fileName 文件名称
+     * @param response
+     * @param workbook Excel对象
+     * @return
+     */
+    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
+        try {
+            response.setCharacterEncoding("UTF-8");
+            response.setHeader("content-Type", "application/vnd.ms-excel");
+            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
+            workbook.write(response.getOutputStream());
+        } catch (IOException e) {
+            throw new  RuntimeException(e);
+        }
+    }
+
+    /**
+     * 功能描述:默认导出方法
+     *
+     * @param list 导出的实体集合
+     * @param fileName 导出的文件名
+     * @param response
+     * @return
+     */
+    private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
+        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
+        if (workbook != null) ;
+        downLoadExcel(fileName, response, workbook);
+    }
+
+
+    /**
+     * 功能描述:根据文件路径来导入Excel
+     *
+     * @param filePath 文件路径
+     * @param titleRows 表标题的行数
+     * @param headerRows 表头行数
+     * @param pojoClass Excel实体类
+     * @return
+     */
+    public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
+        //判断文件是否存在
+        if (StringUtils.isBlank(filePath)) {
+            return null;
+        }
+        ImportParams params = new ImportParams();
+        params.setTitleRows(titleRows);
+        params.setHeadRows(headerRows);
+        List<T> list = null;
+        try {
+            list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
+        } catch (NoSuchElementException e) {
+            throw new RuntimeException("模板不能为空");
+        } catch (Exception e) {
+            e.printStackTrace();
+
+        }
+        return list;
+    }
+
+    /**
+     * 功能描述:根据接收的Excel文件来导入Excel,并封装成实体类
+     *
+     * @param file 上传的文件
+     * @param titleRows 表标题的行数
+     * @param headerRows 表头行数
+     * @param pojoClass Excel实体类
+     * @return
+     */
+    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) {
+        if (file == null) {
+            return null;
+        }
+        ImportParams params = new ImportParams();
+        params.setTitleRows(titleRows);
+        params.setHeadRows(headerRows);
+        List<T> list = null;
+        try {
+            list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
+        } catch (NoSuchElementException e) {
+            throw new RuntimeException("excel文件不能为空");
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+
+        }
+        return list;
+    }
+}

+ 16 - 1
zhongzheng-framework/src/main/java/com/zhongzheng/framework/web/service/UserServiceImpl.java

@@ -55,6 +55,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.sql.Timestamp;
@@ -820,7 +821,21 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IU
         {
             throw new BaseException("对不起,您的账号:已停用");
         }
-        if (!SecurityUtils.matchesPassword(bo.getPwd(),user.getPassword() ))
+        String password = null;
+        if(user.getPassword().length()>20){
+            String rsaPrivate = null;
+            try {
+                InputStream certStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("config/pri.key");
+                rsaPrivate = AES.getStringByInputStream_1(certStream);
+                certStream.close();
+                password = AES.decrypt(user.getPassword(),rsaPrivate);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }else{
+            password = user.getPassword();
+        }
+        if (!SecurityUtils.matchesPassword(bo.getPwd(),password))
         {
             throw new BaseException("密码错误");
         }

+ 7 - 1
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/IQuestionService.java

@@ -8,6 +8,7 @@ import com.zhongzheng.modules.bank.bo.QuestionEditBo;
 import com.zhongzheng.modules.bank.bo.QuestionQueryBo;
 import com.zhongzheng.modules.bank.domain.Question;
 import com.zhongzheng.modules.bank.vo.QuestionImport;
+import com.zhongzheng.modules.bank.vo.QuestionImportV2;
 import com.zhongzheng.modules.bank.vo.QuestionVo;
 import com.zhongzheng.modules.goods.bo.GoodsQueryBo;
 import com.zhongzheng.modules.goods.vo.GoodsUserQuestionVo;
@@ -15,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 题库题目Service接口
@@ -61,7 +63,11 @@ public interface IQuestionService extends IService<Question> {
 	 */
 	Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
-	List<QuestionImport> importQuestion(List<QuestionImport> questionList, Boolean isUpdateSupport, String operName);
+	List<QuestionImport> importExcelQuestion(List<QuestionImport> questionList, Boolean isUpdateSupport, String operName);
+
+	List<QuestionImportV2> importExcelQuestionV2(List<QuestionImportV2> questionList, Boolean isUpdateSupport, String operName);
+
+	Map<String,Object> importExcelQuestionV2NotInBank(List<QuestionImportV2> questionList, Boolean isUpdateSupport, String operName);
 
     List<GoodsUserQuestionVo> listGoodsUserQuestionVo(GoodsQueryBo bo);
 

+ 374 - 12
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/service/impl/QuestionServiceImpl.java

@@ -23,9 +23,7 @@ import com.zhongzheng.modules.bank.mapper.QuestionMapper;
 import com.zhongzheng.modules.bank.service.IExamQuestionService;
 import com.zhongzheng.modules.bank.service.IQuestionBusinessService;
 import com.zhongzheng.modules.bank.service.IQuestionService;
-import com.zhongzheng.modules.bank.vo.QuestionBusinessImport;
-import com.zhongzheng.modules.bank.vo.QuestionImport;
-import com.zhongzheng.modules.bank.vo.QuestionVo;
+import com.zhongzheng.modules.bank.vo.*;
 import com.zhongzheng.modules.base.domain.ApplyAreas;
 import com.zhongzheng.modules.course.bo.CourseChapterSectionListAddBo;
 import com.zhongzheng.modules.course.domain.*;
@@ -252,7 +250,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public List<QuestionImport> importQuestion(List<QuestionImport> questionList, Boolean isUpdateSupport, String operName) {
+    public List<QuestionImport> importExcelQuestion(List<QuestionImport> questionList, Boolean isUpdateSupport, String operName) {
         if (Validator.isNull(questionList) || questionList.size() == 0) {
             throw new CustomException("导入数据不能为空!");
         }
@@ -369,22 +367,14 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
             bo.setPublishStatus(1);
             bo.setImportSort(nowTime + i); //导入时间从小到大排
             bo.setCreateTime(nowTime); //从大到小排
-            System.out.println(question);
             if (question.getAttached().equals("是")){
-                System.out.println("123");
                 attList.add(bo);
             }else{
-                System.out.println(bo);
-                System.out.println("CCVF"+bo.getType());
                 if(bo.getType()==4){//案例题
                     Collections.reverse(attList);
-                    System.out.println("777");
                     bo.setJsonStr(JSON.toJSONString(attList));
-                    System.out.println("666");
                     attList.clear();
                 }else {
-
-                    System.out.println(errorList);
                     if(attList.size()>0){
                         throw new CustomException("案例题格式错误");
                     }
@@ -397,6 +387,378 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         return errorList;
     }
 
+    @Override
+    public List<QuestionImportV2> importExcelQuestionV2(List<QuestionImportV2> questionList, Boolean isUpdateSupport, String operName) {
+        if (Validator.isNull(questionList) || questionList.size() == 0) {
+            throw new CustomException("导入数据不能为空!");
+        }
+        String errorLog = "";
+        String importNo = ServletUtils.getEncoded("IMPORT");
+        int i = 10;
+        Long nowTime = DateUtils.getNowTime();
+        List<QuestionImportV2> errorList = new ArrayList<>();
+        Collections.reverse(questionList);
+        //案例附属题数组
+        List<QuestionAddBo> attList = new ArrayList<>();
+        boolean isAnLi = false; // 是否案例题
+        for (QuestionImportV2 question : questionList) {
+            QuestionAddBo bo = new QuestionAddBo();
+            Integer type = null; //题目类型
+            boolean isFirst = true;
+            int startIndex = 0;
+            //业务层次,导入每条题目只有一条业务层次
+            List<QuestionBusinessAddBo> businessList = new ArrayList<>();
+            QuestionBusinessAddBo questionBusinessAddBo = new QuestionBusinessAddBo();
+            Long eduId = findEduId(question.getEducationType());
+            if (Validator.isNotEmpty(question.getEducationType())&&!Validator.isNotEmpty(eduId)) {
+                //         errorLog+=question.getEducationType()+"-该教育类型不存在\n";
+                question.setCause("教育类型不存在");
+                errorList.add(question);
+                continue;
+            }
+            Long projectId = findProjectId(question.getProject(), eduId);
+            if (Validator.isNotEmpty(question.getProject())&&!Validator.isNotEmpty(projectId)) {
+                //        errorLog+=question.getProject()+"-该项目类型不存在\n";
+                question.setCause("项目类型不存在");
+                errorList.add(question);
+                continue;
+            }
+            Long businessId = findBusinessId(question.getBusiness(), projectId);
+            if (Validator.isNotEmpty(question.getBusiness())&&!Validator.isNotEmpty(businessId)) {
+                //        errorLog+=question.getBusiness()+"-该业务层次不存在\n";
+                question.setCause("业务层次不存在");
+                errorList.add(question);
+                continue;
+            }
+            Long subjectId = findSubjectId(question.getSubject());
+            if (Validator.isNotEmpty(question.getSubject())&&!Validator.isNotEmpty(subjectId)) {
+                //        errorLog+=question.getSubject()+"-该科目不存在\n";
+                question.setCause("科目不存在");
+                errorList.add(question);
+                continue;
+            }
+            if (Validator.isNotEmpty(question.getKnowledge())) {
+                List<String> knowledgeList = Arrays.asList(question.getKnowledge().split(","));
+                List<Long> kIdList = new ArrayList<>();
+                for (String knowledge : knowledgeList) {
+                    Long knowledgeId = findKnowledgeId(knowledge);
+                    if (!Validator.isNotEmpty(knowledgeId)) {
+                        //知识点不存在则导入
+                        ExamKnowledgeAddBo addBo = new ExamKnowledgeAddBo();
+                        addBo.setName(knowledge);
+                        List<ExamKnowledgeBusinessAddBo> bList = new ArrayList<>();
+                        ExamKnowledgeBusinessAddBo bAddBo = new ExamKnowledgeBusinessAddBo();
+                        bAddBo.setBusinessId(businessId);
+                        bAddBo.setSubjectId(subjectId);
+                        bList.add(bAddBo);
+                        addBo.setExamKnowledgeBusinessAddBoList(bList);
+                        addBo.setStatus(1);
+                        knowledgeId = iExamKnowledgeService.insertByImportQuestionAddBo(addBo);
+                        if (Validator.isEmpty(knowledgeId) || knowledgeId == 0) {
+                            //        errorLog+=knowledge+"-该知识点不存在\n";
+                            question.setCause("该知识点不存在");
+                            errorList.add(question);
+                            continue;
+                        }
+                        //新增进入redis
+                        String key = "KNO_" + knowledge;
+                        redisCache.setCacheObject(key, knowledgeId, 3, TimeUnit.MINUTES);//3分钟
+                    }
+                    kIdList.add(knowledgeId);
+                }
+                //知识点ID拼接
+                bo.setKnowledgeIds(ToolsUtils.join(",", kIdList));
+            }
+            questionBusinessAddBo.setEducationTypeId(eduId);
+            questionBusinessAddBo.setProjectId(projectId);
+            questionBusinessAddBo.setBusinessId(businessId);
+            questionBusinessAddBo.setSubjectId(subjectId);
+            if(Validator.isNotEmpty(eduId)){
+                businessList.add(questionBusinessAddBo);
+                bo.setBusinessList(businessList);
+            }
+            if(Validator.isNotEmpty(question.getBusinessList())){
+                bo.setBusinessList(question.getBusinessList());
+            }
+            for(QuestionImportContent vo : question.getQuestionList()){
+                if(Validator.isNotEmpty(vo.getContent())){
+                    type = findType(vo.getType());
+                    if(isFirst){
+                        isFirst = false;
+                        //题目主体
+                        bo.setType(type);
+                        bo.setContent(vo.getContent());
+                        bo.setAnalysisContent(vo.getAnalysisContent());
+                        if(type==1||type==2){ //单选或多选
+                            Map<String,Object> rs = getOptionsList(startIndex,question.getQuestionList());
+                            bo.setOptionsList((List<QuestionChildAddBo>)rs.get("optionsList"));
+                            bo.setAnswerQuestion((String) rs.get("answerStr"));
+                        }
+                        if(type==3){ //判断题
+                            if(vo.getOption().equals("正确")&&vo.getAnswer().equals("是")){
+                                bo.setAnswerQuestion("1");
+                            }
+                            else if(vo.getOption().equals("错误")&&vo.getAnswer().equals("否")){
+                                bo.setAnswerQuestion("1");
+                            }
+                            else{
+                                bo.setAnswerQuestion("0");
+                            }
+                        }
+                        if(type==4){
+                            isAnLi = true;
+                        }
+                    }else{
+                        //案例题附加题
+                        QuestionAddBo childAddBo = new QuestionAddBo();
+                        childAddBo.setType(type);
+                        childAddBo.setContent(vo.getContent());
+                        childAddBo.setAnalysisContent(vo.getAnalysisContent());
+                        if(type==1||type==2){ //单选或多选
+                            Map<String,Object> rs = getOptionsList(startIndex,question.getQuestionList());
+                            childAddBo.setOptionsList((List<QuestionChildAddBo>)rs.get("optionsList"));
+                            childAddBo.setAnswerQuestion((String) rs.get("answerStr"));
+                        }
+                        if(type==3){ //判断题
+                            if(vo.getOption().equals("正确")&&vo.getAnswer().equals("是")){
+                                childAddBo.setAnswerQuestion("1");
+                            }
+                            else if(vo.getOption().equals("错误")&&vo.getAnswer().equals("否")){
+                                childAddBo.setAnswerQuestion("1");
+                            }
+                            else{
+                                childAddBo.setAnswerQuestion("0");
+                            }
+                        }
+                        attList.add(childAddBo);
+                    }
+                }
+                startIndex++;
+            }
+            if(isAnLi){
+                bo.setJsonStr(JSON.toJSONString(attList));
+            }
+            bo.setStatus(1);
+            bo.setPrefixName(question.getPrefixName());
+            bo.setCreateBy(operName);
+            bo.setImportNo(importNo);
+            bo.setPublishStatus(1);
+            bo.setImportSort(nowTime + i); //导入时间从小到大排
+            bo.setCreateTime(nowTime); //从大到小排
+            errorLog = insertByAddBoImport(bo, i);
+            attList.clear();
+            isFirst = true;
+            isAnLi = false;
+            i++;
+        }
+        return errorList;
+    }
+
+    @Override
+    public Map<String, Object> importExcelQuestionV2NotInBank(List<QuestionImportV2> questionList, Boolean isUpdateSupport, String operName) {
+        Map<String, Object> map = new HashMap<>();
+        if (Validator.isNull(questionList) || questionList.size() == 0) {
+            throw new CustomException("导入数据不能为空!");
+        }
+        String errorLog = "";
+        String importNo = ServletUtils.getEncoded("IMPORT");
+        int i = 10;
+        Long nowTime = DateUtils.getNowTime();
+        List<QuestionImportV2> errorList = new ArrayList<>();
+        //案例附属题数组
+        List<QuestionAddBo> attList = new ArrayList<>();
+        List<QuestionAddBo> nqList = new ArrayList<>();
+        boolean isAnLi = false; // 是否案例题
+        for (QuestionImportV2 question : questionList) {
+            QuestionAddBo bo = new QuestionAddBo();
+            Integer type = null; //题目类型
+            boolean isFirst = true;
+            int startIndex = 0;
+            //业务层次,导入每条题目只有一条业务层次
+            List<QuestionBusinessAddBo> businessList = new ArrayList<>();
+            QuestionBusinessAddBo questionBusinessAddBo = new QuestionBusinessAddBo();
+            Long eduId = findEduId(question.getEducationType());
+            if (Validator.isNotEmpty(question.getEducationType())&&!Validator.isNotEmpty(eduId)) {
+                //         errorLog+=question.getEducationType()+"-该教育类型不存在\n";
+                question.setCause("教育类型不存在");
+                errorList.add(question);
+                continue;
+            }
+            Long projectId = findProjectId(question.getProject(), eduId);
+            if (Validator.isNotEmpty(question.getProject())&&!Validator.isNotEmpty(projectId)) {
+                //        errorLog+=question.getProject()+"-该项目类型不存在\n";
+                question.setCause("项目类型不存在");
+                errorList.add(question);
+                continue;
+            }
+            Long businessId = findBusinessId(question.getBusiness(), projectId);
+            if (Validator.isNotEmpty(question.getBusiness())&&!Validator.isNotEmpty(businessId)) {
+                //        errorLog+=question.getBusiness()+"-该业务层次不存在\n";
+                question.setCause("业务层次不存在");
+                errorList.add(question);
+                continue;
+            }
+            Long subjectId = findSubjectId(question.getSubject());
+            if (Validator.isNotEmpty(question.getSubject())&&!Validator.isNotEmpty(subjectId)) {
+                //        errorLog+=question.getSubject()+"-该科目不存在\n";
+                question.setCause("科目不存在");
+                errorList.add(question);
+                continue;
+            }
+            if (Validator.isNotEmpty(question.getKnowledge())) {
+                List<String> knowledgeList = Arrays.asList(question.getKnowledge().split(","));
+                List<Long> kIdList = new ArrayList<>();
+                for (String knowledge : knowledgeList) {
+                    Long knowledgeId = findKnowledgeId(knowledge);
+                    if (!Validator.isNotEmpty(knowledgeId)) {
+                        //知识点不存在则导入
+                        ExamKnowledgeAddBo addBo = new ExamKnowledgeAddBo();
+                        addBo.setName(knowledge);
+                        List<ExamKnowledgeBusinessAddBo> bList = new ArrayList<>();
+                        ExamKnowledgeBusinessAddBo bAddBo = new ExamKnowledgeBusinessAddBo();
+                        bAddBo.setBusinessId(businessId);
+                        bAddBo.setSubjectId(subjectId);
+                        bList.add(bAddBo);
+                        addBo.setExamKnowledgeBusinessAddBoList(bList);
+                        addBo.setStatus(1);
+                        knowledgeId = iExamKnowledgeService.insertByImportQuestionAddBo(addBo);
+                        if (Validator.isEmpty(knowledgeId) || knowledgeId == 0) {
+                            //        errorLog+=knowledge+"-该知识点不存在\n";
+                            question.setCause("该知识点不存在");
+                            errorList.add(question);
+                            continue;
+                        }
+                        //新增进入redis
+                        String key = "KNO_" + knowledge;
+                        redisCache.setCacheObject(key, knowledgeId, 3, TimeUnit.MINUTES);//3分钟
+                    }
+                    kIdList.add(knowledgeId);
+                }
+                //知识点ID拼接
+                bo.setKnowledgeIds(ToolsUtils.join(",", kIdList));
+            }
+            questionBusinessAddBo.setEducationTypeId(eduId);
+            questionBusinessAddBo.setProjectId(projectId);
+            questionBusinessAddBo.setBusinessId(businessId);
+            questionBusinessAddBo.setSubjectId(subjectId);
+            if(Validator.isNotEmpty(eduId)){
+                businessList.add(questionBusinessAddBo);
+                bo.setBusinessList(businessList);
+            }
+            if(Validator.isNotEmpty(question.getBusinessList())){
+                bo.setBusinessList(question.getBusinessList());
+            }
+            boolean hasError = false;
+            for(QuestionImportContent vo : question.getQuestionList()){
+                if(Validator.isNotEmpty(vo.getContent())){
+                    type = findType(vo.getType());
+                    if(isFirst){
+                        isFirst = false;
+                        //题目主体
+                        bo.setType(type);
+                        bo.setContent(vo.getContent());
+                        bo.setAnalysisContent(vo.getAnalysisContent());
+                        if(Validator.isEmpty(type)){
+                            question.setCause("题目类型错误");
+                            errorList.add(question);
+                            hasError = true;
+                            break;
+                        }
+                        if(type==1||type==2){ //单选或多选
+                            Map<String,Object> rs = getOptionsList(startIndex,question.getQuestionList());
+                            bo.setOptionsList((List<QuestionChildAddBo>)rs.get("optionsList"));
+                            bo.setAnswerQuestion((String) rs.get("answerStr"));
+                        }
+                        if(type==3){ //判断题
+                            if(vo.getOption().equals("正确")&&vo.getAnswer().equals("是")){
+                                bo.setAnswerQuestion("1");
+                            }
+                            else if(vo.getOption().equals("错误")&&vo.getAnswer().equals("否")){
+                                bo.setAnswerQuestion("1");
+                            }
+                            else{
+                                bo.setAnswerQuestion("0");
+                            }
+                        }
+                        if(type==4){
+                            isAnLi = true;
+                        }
+                    }else{
+                        //案例题附加题
+                        QuestionAddBo childAddBo = new QuestionAddBo();
+                        childAddBo.setType(type);
+                        childAddBo.setContent(vo.getContent());
+                        childAddBo.setAnalysisContent(vo.getAnalysisContent());
+                        if(type==1||type==2){ //单选或多选
+                            Map<String,Object> rs = getOptionsList(startIndex,question.getQuestionList());
+                            childAddBo.setOptionsList((List<QuestionChildAddBo>)rs.get("optionsList"));
+                            childAddBo.setAnswerQuestion((String) rs.get("answerStr"));
+                        }
+                        if(type==3){ //判断题
+                            if(vo.getOption().equals("正确")&&vo.getAnswer().equals("是")){
+                                childAddBo.setAnswerQuestion("1");
+                            }
+                            else if(vo.getOption().equals("错误")&&vo.getAnswer().equals("否")){
+                                childAddBo.setAnswerQuestion("1");
+                            }
+                            else{
+                                childAddBo.setAnswerQuestion("0");
+                            }
+                        }
+                        attList.add(childAddBo);
+                    }
+                }
+                startIndex++;
+            }
+            if(hasError){
+                continue;
+            }
+            if(isAnLi){
+                bo.setJsonStr(JSON.toJSONString(attList));
+            }
+            bo.setStatus(1);
+            bo.setPrefixName(question.getPrefixName());
+            bo.setCreateBy(operName);
+            bo.setImportNo(importNo);
+            bo.setPublishStatus(1);
+            bo.setImportSort(nowTime + i); //导入时间从小到大排
+            bo.setCreateTime(nowTime); //从大到小排
+            nqList.add(bo);
+            attList.clear();
+            isFirst = true;
+            isAnLi = false;
+            i++;
+        }
+        map.put("errorList",errorList);
+        map.put("questionList",nqList);
+        return map;
+    }
+
+    private Map<String,Object> getOptionsList(int startIndex,List<QuestionImportContent> list){
+        Map<String,Object> map = new HashMap<>();
+        String answerQuestion = "";
+        List<QuestionChildAddBo> optionsList = new ArrayList<>(); //题目选项
+        List<Long> answerList = new ArrayList<>(); //答案选项
+        Long j = 1L;
+        for(int i = startIndex;i<list.size();i++){
+            QuestionImportContent entity = list.get(i);
+            if(Validator.isNotEmpty(entity.getContent())&&i>startIndex){
+                break;
+            }
+            QuestionChildAddBo addBo = new QuestionChildAddBo();
+            addBo.setContent(entity.getOption());
+            addBo.setOptionsId(j);
+            optionsList.add(addBo);
+            if("是".equals(entity.getAnswer())){
+                answerList.add(j);
+            }
+            j++;
+        }
+        map.put("optionsList",optionsList);
+        map.put("answerStr",ToolsUtils.join(",", answerList));
+        return map;
+    }
+
     @Override
     public List<GoodsUserQuestionVo> listGoodsUserQuestionVo(GoodsQueryBo bo) {
         return baseMapper.listGoodsUserQuestionVo(bo);

+ 42 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionImportContent.java

@@ -0,0 +1,42 @@
+package com.zhongzheng.modules.bank.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 题库题目添加对象 question
+ *
+ * @author hjl
+ * @date 2021-10-22
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class QuestionImportContent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 题目正文 */
+    @Excel(name = "*题目内容")
+    private String content;
+
+    @Excel(name = "*题目类型")
+    private String type;
+
+    @Excel(name = "答案解析")
+    private String analysisContent;
+
+    @Excel(name = "*选项内容")
+    private String option;
+
+    @Excel(name = "*是否正确选项")
+    private String answer;
+}

+ 57 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/bank/vo/QuestionImportV2.java

@@ -0,0 +1,57 @@
+package com.zhongzheng.modules.bank.vo;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import cn.afterturn.easypoi.excel.annotation.ExcelCollection;
+import com.zhongzheng.modules.bank.bo.QuestionBusinessAddBo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+/**
+ * 题库题目添加对象 question
+ *
+ * @author hjl
+ * @date 2021-10-22
+ */
+@Data
+@NoArgsConstructor
+@Accessors(chain = true)
+public class QuestionImportV2 implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 前缀名称 */
+    @Excel(name = "标题前缀")
+    private String prefixName;
+
+    /** 教育类型ID */
+    @Excel(name = "教育类型")
+    private String educationType;
+    /** 业务层次id */
+    @Excel(name = "业务层次")
+    private String business;
+    /** 科目id */
+    @Excel(name = "科目")
+    private String subject;
+    /** 项目ID */
+    @Excel(name = "项目类型")
+    private String project;
+
+    @Excel(name = "知识点")
+    private String knowledge;
+
+    private List<String> knowledgeList;
+
+    @Excel(name = "失败原因")
+    private String cause;
+
+    @ExcelCollection(name = "题目主体")
+    private List<QuestionImportContent> questionList;
+
+    private List<QuestionBusinessAddBo> businessList;
+}

+ 22 - 21
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/service/impl/CourseSectionServiceImpl.java

@@ -228,51 +228,52 @@ public class CourseSectionServiceImpl extends ServiceImpl<CourseSectionMapper, C
             List<CourseSectionBusinessAddBo> businessList = new ArrayList<>();
             CourseSectionBusinessAddBo addBo = new CourseSectionBusinessAddBo();
             Long eduId = null;
-            if(Validator.isNotEmpty(sectionImport.getEducationTypeId())){
-                eduId = sectionImport.getEducationTypeId();
-            }else{
+            if(Validator.isEmpty(sectionImport.getBusinessList())){
                 eduId = findEduId(sectionImport.getEducationType());
             }
-            if(!Validator.isNotEmpty(eduId)){
+            if(!Validator.isNotEmpty(eduId)&&Validator.isNotEmpty(sectionImport.getEducationType())){
                 errorLog+="第"+(size - Index)+"条:"+sectionImport.getEducationType()+"-该教育类型不存在。\r\n";
                 continue;
             }
             Long projectId = null;
-            if(Validator.isNotEmpty(sectionImport.getProjectId())){
-                projectId = sectionImport.getProjectId();
-            }else{
+            if(Validator.isEmpty(sectionImport.getBusinessList())){
                 projectId = findProjectId(sectionImport.getProject(),eduId);
             }
-            if(!Validator.isNotEmpty(projectId)){
+            if(!Validator.isNotEmpty(projectId)&&Validator.isNotEmpty(sectionImport.getProject())){
                 errorLog+="第"+(size - Index)+"条:"+sectionImport.getProject()+"-该项目类型不存在或者和教育类型不匹配。\r\n";
                 continue;
             }
             Long businessId = null;
-            if(Validator.isNotEmpty(sectionImport.getBusinessId())){
-                businessId = sectionImport.getBusinessId();
-            }else{
+            if(Validator.isEmpty(sectionImport.getBusinessList())){
                 businessId = findBusinessId(sectionImport.getBusiness(),projectId);
             }
-            if(!Validator.isNotEmpty(businessId)){
+            if(!Validator.isNotEmpty(businessId)&&Validator.isNotEmpty(sectionImport.getBusiness())){
                 errorLog+="第"+(size - Index)+"条:"+sectionImport.getBusiness()+"-该业务层次不存在或者和项目类型不匹配。\r\n";
                 continue;
             }
-            Long subjectId = findSubjectId(sectionImport.getSubject());
-            if(!Validator.isNotEmpty(subjectId)){
+            Long subjectId = null;
+            if(Validator.isEmpty(sectionImport.getBusinessList())){
+                subjectId = findSubjectId(sectionImport.getSubject());
+            }
+            if(!Validator.isNotEmpty(subjectId)&&Validator.isNotEmpty(sectionImport.getSubject())){
                 errorLog+="第"+(size - Index)+"条:"+sectionImport.getSubject()+"-该科目不存在。\r\n";
                 continue;
             }
             Integer sectionType = findType(sectionImport.getSectionType());
-            if(!Validator.isNotEmpty(sectionType)){
+            if(!Validator.isNotEmpty(sectionType)&&Validator.isNotEmpty(sectionImport.getSectionType())){
                 errorLog+="第"+(size - Index)+"条:"+sectionImport.getSectionType()+"-该节类型不存在。\r\n";
                 continue;
             }
-            addBo.setEducationTypeId(eduId);
-            addBo.setProjectId(projectId);
-            addBo.setBusinessId(businessId);
-            addBo.setSubjectId(subjectId);
-            businessList.add(addBo);
-
+            if(Validator.isNotEmpty(eduId)){
+                addBo.setEducationTypeId(eduId);
+                addBo.setProjectId(projectId);
+                addBo.setBusinessId(businessId);
+                addBo.setSubjectId(subjectId);
+                businessList.add(addBo);
+            }
+            if(Validator.isNotEmpty(sectionImport.getBusinessList())){
+                businessList = sectionImport.getBusinessList();
+            }
             bo.setPrefixName(sectionImport.getPrefixName());
             bo.setName(sectionImport.getName());
             bo.setName(sectionImport.getName());

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/course/vo/CourseSectionImport.java

@@ -83,4 +83,6 @@ public class CourseSectionImport {
     private Long subjectId;
 
     private Long projectId;
+
+    private List<CourseSectionBusinessAddBo> businessList;
 }

+ 2 - 0
zhongzheng-system/src/main/java/com/zhongzheng/modules/grade/vo/ClassPeriodVo.java

@@ -176,6 +176,8 @@ public class ClassPeriodVo implements Comparable<ClassPeriodVo> {
 	/** 直播结束时间 */
 	@ApiModelProperty("直播结束时间")
 	private Long liveEndTime;
+	@ApiModelProperty("直播地址")
+	private String liveUrl;
 
 	@Override
 	public int compareTo(ClassPeriodVo o) {

+ 1 - 1
zhongzheng-system/src/main/resources/mapper/modules/activity/ActivityRecommendMapper.xml

@@ -69,7 +69,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             LEFT JOIN course_education_type cet ON ar.education_type_id = cet.id
             LEFT JOIN course_project_type cpt ON ar.project_id = cpt.id
             LEFT JOIN course_business cb ON ar.business_id = cb.id
-        WHERE 1 = 1
+        WHERE 1 = 1 and ar.`status` = 1
         <if test="type != null and type != ''">
             AND ar.type = #{type}
         </if>

+ 9 - 4
zhongzheng-system/src/main/resources/mapper/modules/user/UserStudyRecordMapper.xml

@@ -131,6 +131,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="sectionType" column="section_type"/>
         <result property="liveStartTime" column="live_start_time"/>
         <result property="liveEndTime" column="live_end_time"/>
+        <result property="liveUrl" column="live_url"/>
     </resultMap>
 
 
@@ -1091,7 +1092,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         1 as type,
         NULL as section_type,
         NULL as live_start_time,
-        NULL as live_end_time
+        NULL as live_end_time,
+        NULL as live_url
         FROM
         course_menu cm
         where 1=1
@@ -1107,7 +1109,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         2 as type,
         NULL as section_type,
         NULL as live_start_time,
-        NULL as live_end_time
+        NULL as live_end_time,
+        NULL as live_url
         FROM
         course_menu cm
         LEFT JOIN goods_course gc on gc.course_id = cm.course_id
@@ -1122,7 +1125,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         3 as type,
         cs.section_type,
         cs.live_start_time,
-        cs.live_end_time
+        cs.live_end_time,
+        cs.live_url
         FROM
         course_menu cm
         LEFT JOIN course_section cs on cm.menu_id = cs.section_id
@@ -1140,7 +1144,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         cs.section_type,
         3 AS type,
         cs.live_start_time,
-        cs.live_end_time
+        cs.live_end_time,
+        cs.live_url
         FROM
         course_chapter_section ccs
         LEFT JOIN course_section cs on ccs.section_id = cs.section_id