From 4ba127459ff1b77df9014444fdac7636d3f091bc Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期六, 16 三月 2024 15:05:19 +0800
Subject: [PATCH] 题目导入

---
 src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java |  178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 174 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java b/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java
index 1cdabdb..cd4d574 100644
--- a/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java
+++ b/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java
@@ -1,16 +1,25 @@
 package com.mindskip.xzs.controller.admin;
 
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.enums.CellExtraTypeEnum;
 import com.alibaba.excel.metadata.data.HyperlinkData;
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
+import com.alibaba.fastjson.JSON;
 import com.mindskip.xzs.base.BaseApiController;
 import com.mindskip.xzs.base.RestResponse;
 import com.mindskip.xzs.base.SystemCode;
+import com.mindskip.xzs.context.WebContext;
 import com.mindskip.xzs.domain.Question;
+import com.mindskip.xzs.domain.QuestionSubject;
 import com.mindskip.xzs.domain.Subject;
 import com.mindskip.xzs.domain.TextContent;
 import com.mindskip.xzs.domain.enums.QuestionSourceEnum;
+import com.mindskip.xzs.domain.enums.QuestionStatusEnum;
 import com.mindskip.xzs.domain.enums.QuestionTypeEnum;
+import com.mindskip.xzs.domain.question.QuestionItemObject;
 import com.mindskip.xzs.domain.question.QuestionObject;
+import com.mindskip.xzs.excel.CurrencyDataListener;
+import com.mindskip.xzs.excel.FixedMergeCellStrategy;
 import com.mindskip.xzs.excel.SelectExcel;
 import com.mindskip.xzs.repository.DepartmentMapper;
 import com.mindskip.xzs.repository.SubjectMapper;
@@ -24,7 +33,10 @@
 import com.mindskip.xzs.vo.QuestionImportVO;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.DataValidationHelper;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -33,9 +45,8 @@
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.util.*;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 @RestController("AdminQuestionController")
@@ -50,6 +61,8 @@
     private final DepartmentMapper departmentMapper;
 
     private final QuestionSubjectService questionSubjectService;
+
+    private static final String SPLIT = "銆�";
 
     @Autowired
     public QuestionController(QuestionService questionService, TextContentService textContentService, SubjectMapper subjectMapper, DepartmentMapper departmentMapper, QuestionSubjectService questionSubjectService) {
@@ -130,11 +143,168 @@
         return RestResponse.ok();
     }
 
+    /**
+     * 涓嬭浇棰樼洰瀵煎叆妯℃澘
+     *
+     * @param response
+     * @throws IOException
+     */
     @GetMapping("/download/question/import/temp")
     public void getImportTemp(HttpServletResponse response) throws IOException {
         String fileName = URLEncoder.encode("棰樼洰瀵煎叆妯℃澘", "UTF-8").replaceAll("\\+", "%20");
         response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-        EasyExcel.write(response.getOutputStream(), QuestionImportVO.class).registerWriteHandler(new SelectExcel()).sheet("妯℃澘").doWrite(new ArrayList());
+
+        // 鏋勫缓妯℃澘鏍蜂緥鏁版嵁
+        List<QuestionImportVO> data = new ArrayList<>(4);
+        QuestionImportVO questionImportVO = new QuestionImportVO();
+        questionImportVO.setQuestionType("鍗曢�夐");
+        questionImportVO.setDifficult(2);
+        questionImportVO.setCorrect("B");
+        questionImportVO.setScore(2);
+        questionImportVO.setSubjectName("娴嬭瘯璇剧洰");
+        questionImportVO.setAnalyze("B鏄鐨�");
+        questionImportVO.setTitle("杩欐槸涓�閬撴祴璇曢鐩紝浣跨敤璇ユā鏉胯鍒犻櫎鎴栨浛鎹㈣繖閬撻");
+        questionImportVO.setOptionName("A");
+        questionImportVO.setOptionValue("閫夋垜");
+        data.add(questionImportVO);
+
+        QuestionImportVO questionImportVO1 = new QuestionImportVO();
+        questionImportVO1.setOptionName("B");
+        questionImportVO1.setOptionValue("閫塀");
+        data.add(questionImportVO1);
+
+        QuestionImportVO questionImportVO2 = new QuestionImportVO();
+        questionImportVO2.setOptionName("C");
+        questionImportVO2.setOptionValue("閫塁");
+        data.add(questionImportVO2);
+
+        QuestionImportVO questionImportVO3 = new QuestionImportVO();
+        questionImportVO3.setOptionName("D");
+        questionImportVO3.setOptionValue("閫塂");
+        data.add(questionImportVO3);
+
+        // 鏌ュ嚭鎵�鏈夌殑璇剧洰锛坋xcel涓嬫媺鏁版嵁锛�
+        List<Subject> subjects = subjectMapper.allSubject();
+        List<String> subjectNameList = subjects.stream().map(Subject::getName).collect(Collectors.toList());
+
+        EasyExcel.write(response.getOutputStream(), QuestionImportVO.class)
+                .sheet("妯℃澘")
+                .registerWriteHandler(new SelectExcel(subjectNameList))
+                .registerWriteHandler(new FixedMergeCellStrategy(2, 4, Arrays.asList(1, 2, 3, 6, 7, 8, 9)))
+                .doWrite(data);
+    }
+
+    /**
+     * 棰樼洰瀵煎叆
+     *
+     * easyexcel瀵煎叆涓�瀵瑰锛屾瘮濡備竴涓鐩紝鍥涗釜閫夐」銆傞偅涔堣鍙栧埌鐨勬暟鎹氨鏈夊洓鏉★紝绗竴鏉℃暟鎹槸榻愬叏鐨勩�傚悗闈笁鏉″彧鏈夐�夐」鏈夊��
+     * @param file
+     * @throws IOException
+     */
+    @PostMapping("/question/import")
+    @Transactional(rollbackFor = Exception.class)
+    public RestResponse importQuestion(@RequestPart("file") MultipartFile file) throws IOException {
+        Consumer<List<QuestionImportVO>> consumer = (data) -> {
+            // 棰樼洰鐨勮鐩俊鎭�
+            List<QuestionSubject> questionSubjectsList = new ArrayList<>(48);
+            for (int i = 0; i < data.size(); i++) {
+                // 棰樼洰瀹炰綋
+                Question question = new Question();
+                // 璇诲彇鐨勯鐩�
+                QuestionImportVO excelQuestion = data.get(i);
+
+                // 濡傛灉鏄涓�鏉″畬鏁存暟鎹紝閭d箞缁х画寰�鍚庤鍙栭�夐」鍐呭
+                if (excelQuestion.master()) {
+                    // 璇ラ鐨勯�夐」
+                    List<QuestionItemObject> options = new ArrayList<>(4);
+                    // 閫夐」鍐呭
+                    QuestionItemObject option = new QuestionItemObject();
+                    option.setPrefix(excelQuestion.getOptionName());
+                    option.setContent(excelQuestion.getOptionValue());
+                    options.add(option);
+                    int next = 1;
+                    // 缁х画寰�鍚庤閫夐」
+                    while (Boolean.TRUE) {
+                        // 鍒ゆ柇鏄惁鏄渶鍚庝竴鏉�
+                        if (next + i == data.size()) {
+                            break;
+                        }
+                        QuestionImportVO nextQuestion = data.get(next + i);
+                        if (nextQuestion.master()) {
+                            break;
+                        }
+                        QuestionItemObject nextOption = new QuestionItemObject();
+                        nextOption.setPrefix(nextQuestion.getOptionName());
+                        nextOption.setContent(nextQuestion.getOptionValue());
+                        options.add(nextOption);
+                        next++;
+                    }
+                    i += next;
+
+                    // 淇濆瓨棰樼洰鍐呭
+                    QuestionObject questionObject = new QuestionObject();
+                    questionObject.setQuestionItemObjects(options);
+                    questionObject.setAnalyze(excelQuestion.getAnalyze());
+                    questionObject.setTitleContent(excelQuestion.getTitle());
+                    questionObject.setCorrect(excelQuestion.getCorrect());
+
+                    TextContent textContent = new TextContent();
+                    textContent.setContent(JSON.toJSONString(questionObject));
+                    textContent.setCreateTime(new Date());
+                    textContentService.insert(textContent);
+
+                    // 淇濆瓨棰樼洰淇℃伅
+                    // 璁剧疆棰樺瀷
+                    question.setQuestionType(QuestionTypeEnum.get(excelQuestion.getQuestionType()));
+                    // 绛旀(澶氶�夐渶瑕佺敤,鍒嗗壊淇濆瓨瀛楃涓插埌鏁版嵁搴�)
+                    String[] corrects = excelQuestion.getCorrect().split(SPLIT);
+                    if (corrects.length > 1) {
+                        question.setCorrect(Arrays.asList(corrects).stream().collect(Collectors.joining(",")));
+                    } else {
+                        question.setCorrect(excelQuestion.getCorrect());
+                    }
+
+                    // 闅惧害
+                    question.setDifficult(excelQuestion.getDifficult());
+                    // 鍒嗘暟
+                    question.setScore(ExamUtil.scoreFromVM(String.valueOf(excelQuestion.getScore())));
+                    // 鍒涘缓浜�
+                    question.setCreateUser(1);
+                    question.setStatus(QuestionStatusEnum.OK.getCode());
+                    question.setCreateTime(new Date());
+                    question.setDeleted(Boolean.FALSE);
+                    question.setInfoTextContentId(textContent.getId());
+                    questionService.insert(question);
+
+
+                    // 鏌ュ嚭鎵�鏈夌殑璇剧洰
+                    List<Subject> subjects = subjectMapper.allSubject();
+                    List<String> subjectNames = Arrays.asList(excelQuestion.getSubjectName().split(SPLIT));
+                    List<Subject> targetSubject = subjects.stream()
+                            .filter(subject -> subjectNames.contains(subject.getName()))
+                            .collect(Collectors.toList());
+                    if (CollectionUtils.isEmpty(targetSubject)) {
+                        // todo 璁板綍杩欎釜閿欒
+                        continue;
+                    }
+                    // 鏋勫缓璇剧洰-棰樼洰淇℃伅
+                    questionSubjectsList = targetSubject.stream().map(subject -> {
+                        QuestionSubject questionSubject = new QuestionSubject();
+                        questionSubject.setQuestionId(question.getId());
+                        questionSubject.setSubjectId(subject.getId());
+                        questionSubject.setDeleted(0);
+                        return questionSubject;
+                    }).collect(Collectors.toList());
+                }
+                System.out.println(question);
+            }
+            // 鎵归噺淇濆瓨棰樼洰-璇剧洰淇℃伅
+            if (! CollectionUtils.isEmpty(questionSubjectsList)) {
+                questionSubjectService.saves(questionSubjectsList);
+            }
+        };
+        EasyExcel.read(file.getInputStream(), QuestionImportVO.class, new CurrencyDataListener(consumer)).sheet("妯℃澘").doRead();
+        return RestResponse.ok();
     }
 
     @PostMapping("/import")

--
Gitblit v1.8.0