From 47cd9ecc0eff38ffe6b3b794b2bf197e958f4403 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期三, 14 五月 2025 15:50:57 +0800
Subject: [PATCH] bug:学员有状态不能修改问题

---
 src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java |  550 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 503 insertions(+), 47 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 30cdbcc..3eb5a3a 100644
--- a/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java
+++ b/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java
@@ -1,30 +1,52 @@
 package com.mindskip.xzs.controller.admin;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.github.pagehelper.PageInfo;
 import com.mindskip.xzs.base.BaseApiController;
 import com.mindskip.xzs.base.RestResponse;
 import com.mindskip.xzs.base.SystemCode;
 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.domain.vo.ExamVO;
+import com.mindskip.xzs.domain.vo.DeptQuestionVO;
+import com.mindskip.xzs.excel.CurrencyDataListener;
+import com.mindskip.xzs.excel.SelectExcel;
+import com.mindskip.xzs.repository.DepartmentMapper;
+import com.mindskip.xzs.repository.DeptQuestionMapper;
+import com.mindskip.xzs.repository.SubjectMapper;
 import com.mindskip.xzs.service.QuestionService;
+import com.mindskip.xzs.service.QuestionSubjectService;
 import com.mindskip.xzs.service.TextContentService;
 import com.mindskip.xzs.utility.*;
 import com.mindskip.xzs.utility.convert.QuestionClassConvert;
 import com.mindskip.xzs.utility.excel.ExcelUtils;
+import com.mindskip.xzs.viewmodel.admin.education.SubjectPageRequestVM;
 import com.mindskip.xzs.viewmodel.admin.question.*;
-import com.github.pagehelper.PageInfo;
+import com.mindskip.xzs.vo.QuestionExportData;
+import com.mindskip.xzs.vo.QuestionExportVO;
+import com.mindskip.xzs.vo.QuestionImportVO;
+import com.mindskip.xzs.vo.QuestionSubjectVO;
 import org.apache.commons.lang3.StringUtils;
-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;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.*;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 @RestController("AdminQuestionController")
@@ -33,15 +55,24 @@
 
     private final QuestionService questionService;
     private final TextContentService textContentService;
+    private final SubjectMapper subjectMapper;
+    private final DepartmentMapper departmentMapper;
+    private final QuestionSubjectService questionSubjectService;
+    private final DeptQuestionMapper deptQuestionMapper;
 
-    @Autowired
-    public QuestionController(QuestionService questionService, TextContentService textContentService) {
+    private static final String SPLIT = ",";
+
+    public QuestionController(QuestionService questionService, TextContentService textContentService, SubjectMapper subjectMapper, DepartmentMapper departmentMapper, QuestionSubjectService questionSubjectService, DeptQuestionMapper deptQuestionMapper) {
         this.questionService = questionService;
         this.textContentService = textContentService;
+        this.subjectMapper = subjectMapper;
+        this.departmentMapper = departmentMapper;
+        this.questionSubjectService = questionSubjectService;
+        this.deptQuestionMapper = deptQuestionMapper;
     }
 
     @RequestMapping(value = "/page", method = RequestMethod.POST)
-    public RestResponse<PageInfo<QuestionResponseVM>> pageList(@RequestBody QuestionPageRequestVM model) {
+    public RestResponse<PageInfo<QuestionResponseVM>> pageList(@RequestBody @Valid QuestionPageRequestVM model) {
         PageInfo<Question> pageInfo = questionService.page(model);
         PageInfo<QuestionResponseVM> page = PageInfoHelper.copyMap(pageInfo, q -> {
             QuestionResponseVM vm = modelMapper.map(q, QuestionResponseVM.class);
@@ -51,6 +82,15 @@
             QuestionObject questionObject = JsonUtil.toJsonObject(textContent.getContent(), QuestionObject.class);
             String clearHtml = HtmlUtil.clear(questionObject.getTitleContent());
             vm.setShortTitle(clearHtml);
+            vm.setQuestionSubjects(questionSubjectService.getQuestion(vm.getId()).stream().map(e -> {
+                SubjectPageRequestVM subjectPageRequestVM = new SubjectPageRequestVM();
+                subjectPageRequestVM.setId(e.getSubjectId());
+                e.setSubName(subjectMapper.page(subjectPageRequestVM).stream().map(Subject::getName).collect(Collectors.joining(SPLIT)));
+                return e;
+            }).collect(Collectors.toList()));
+            // 鏌ヨ棰樼洰鎵�灞為儴闂�
+            String deptNames = deptQuestionMapper.deptByQuestionId(q.getId()).stream().map(DeptQuestionVO::getDeptName).collect(Collectors.joining("銆�"));
+            vm.setDeptNames(deptNames);
             return vm;
         });
         return RestResponse.ok(page);
@@ -73,18 +113,14 @@
     }
 
     @RequestMapping(value = "/select/{id}", method = RequestMethod.POST)
-    public RestResponse<QuestionEditRequestVM> select(@PathVariable Integer id) {
-        QuestionEditRequestVM newVM = questionService.getQuestionEditRequestVM(id);
-        return RestResponse.ok(newVM);
+    public RestResponse<ExamQuestionVO> select(@PathVariable Integer id) {
+        return RestResponse.ok(questionService.getQuestionEditRequestVM(id));
     }
 
 
     @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)
     public RestResponse delete(@PathVariable Integer id) {
-        Question question = questionService.selectById(id);
-        question.setDeleted(true);
-        questionService.updateByIdFilter(question);
-        return RestResponse.ok();
+        return RestResponse.ok(questionService.remove(id));
     }
 
     private RestResponse validQuestionEditRequestVM(QuestionEditRequestVM model) {
@@ -108,44 +144,464 @@
         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");
+
+        // 鏋勫缓妯℃澘鏍蜂緥鏁版嵁
+        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.setOptionA("閫夋垜");
+        questionImportVO.setOptionB("閫夋垜");
+        questionImportVO.setOptionC("閫夋垜");
+        questionImportVO.setOptionD("閫夋垜");
+        data.add(questionImportVO);
+
+        // 鏌ュ嚭鎵�鏈夌殑璇剧洰锛坋xcel涓嬫媺鏁版嵁锛�
+        List<Subject> subjects = subjectMapper.allSubject(new ArrayList<>(), Boolean.TRUE);
+        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);
+    }
+
+//    @PostMapping("/question/export")
+//    public void exportQuestion(@RequestBody QuestionExportVO query, HttpServletResponse response) throws IOException {
+//        // 鏌ヨ瀵煎嚭鏁版嵁
+//        List<QuestionImportVO> exportData = questionService.export(query);
+//        // 鏋勫缓鏁版嵁
+//        List<QuestionImportVO> exportList = new ArrayList<>(exportData.size() * 4);
+//        // 琛屽悎骞惰鍒�
+//        List<RowItem> mergeRowList = new ArrayList<>(exportData.size());
+//        int j = 2;
+//        for (QuestionImportVO data : exportData) {
+//            QuestionObject questionContent = JSON.parseObject(data.getQuestionContent(), QuestionObject.class);
+//
+//            RowItem rowItem = new RowItem();
+//            rowItem.setStart(j);
+//            int end = j + questionContent.getQuestionItemObjects().size() - 1;
+//            rowItem.setEnd(end);
+//            mergeRowList.add(rowItem);
+//            j = end + 1;
+//            int i = 0;
+//            for (QuestionItemObject option : questionContent.getQuestionItemObjects()) {
+//                if (i == 0) {
+//                    QuestionImportVO master = new QuestionImportVO();
+//                    BeanUtils.copyProperties(data, master);
+//                    if (org.springframework.util.StringUtils.hasText(data.getQuestionType())) {
+//                        master.setQuestionType(QuestionTypeEnum.fromCode(Integer.valueOf(data.getQuestionType())).getName());
+//                    }
+//                    master.setOptionName(option.getPrefix());
+//                    master.setOptionValue(option.getContent());
+//                    master.setTitle(questionContent.getTitleContent());
+//                    master.setAnalyze(questionContent.getAnalyze());
+//                    master.setSubjectName(data.getSubjectList().stream().collect(Collectors.joining("銆�")));
+//                    master.setCorrect(data.getCorrect().replaceAll(",", "銆�"));
+//                    BigDecimal score = BigDecimal.valueOf(master.getScore());
+//                    master.setScore(score.divide(BigDecimal.TEN).intValue());
+//                    exportList.add(master);
+//                } else {
+//                    QuestionImportVO optionItem = new QuestionImportVO();
+//                    optionItem.setOptionName(option.getPrefix());
+//                    optionItem.setOptionValue(option.getContent());
+//                    exportList.add(optionItem);
+//                }
+//                i++;
+//            }
+//        }
+//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+//        response.setCharacterEncoding("utf-8");
+//        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+//        String fileName = URLEncoder.encode("棰樼洰瀵煎嚭鏁版嵁", "UTF-8").replaceAll("\\+", "%20");
+//        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+//
+//        // 鏌ュ嚭鎵�鏈夌殑璇剧洰锛坋xcel涓嬫媺鏁版嵁锛�
+//        List<Subject> subjects = subjectMapper.allSubject(new ArrayList<>(), Boolean.TRUE);
+//        List<String> subjectNameList = subjects.stream().map(Subject::getName).collect(Collectors.toList());
+//        EasyExcel.write(response.getOutputStream(), QuestionImportVO.class)
+//                .sheet("棰樼洰瀵煎嚭鏁版嵁")
+//                .registerWriteHandler(new SelectExcel(subjectNameList))
+//                .registerWriteHandler(new DynamicMergeCellStrategy(mergeRowList, Arrays.asList(0, 1, 2, 5, 6, 7, 8)))
+//                .doWrite(exportList);
+//    }
+
+    /**
+     * 棰樼洰瀵煎叆
+     *
+     * easyexcel瀵煎叆涓�瀵瑰锛屾瘮濡備竴涓鐩紝鍥涗釜閫夐」銆傞偅涔堣鍙栧埌鐨勬暟鎹氨鏈夊洓鏉★紝绗竴鏉℃暟鎹槸榻愬叏鐨勩�傚悗闈笁鏉″彧鏈夐�夐」鏈夊��
+     * @param file
+     * @throws IOException
+     */
     @PostMapping("/import")
-    public void importUser(@RequestPart("file") MultipartFile file) throws Exception {
-        List<QuestionEditVO> questionEditVOS = ExcelUtils.readMultipartFile(file, QuestionEditVO.class);
+    @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++) {
 
-        List<QuestionEditRequestVM> list = QuestionClassConvert.INSTANCE.QuestionEditVOListToQuestionEditRequestVMList(questionEditVOS);
+                // 棰樼洰瀹炰綋
+                Question question = new Question();
+                // 璇诲彇鐨勯鐩�
+                QuestionImportVO excelQuestion = data.get(i);
 
-        List<QuestionEditItemVM> questionEditItemVMS = new ArrayList<>();
-        QuestionEditItemVM questionEditItemVM = new QuestionEditItemVM();
+                // 鍒ゆ柇棰樺共鏄惁閲嶅锛岄噸澶嶄笉娣诲姞
+                Integer questionId = questionService.countQuestionByTitle(excelQuestion.getTitle());
+                if (Objects.isNull(questionId)) {
+                    // 璇ラ鐨勯�夐」
+                    List<QuestionItemObject> options = new ArrayList<>(4);
+                    // 閫夐」鍐呭
+                    QuestionItemObject optionA = new QuestionItemObject();
+                    optionA.setPrefix("A");
+                    optionA.setContent(excelQuestion.getOptionA());
+                    options.add(optionA);
 
-        //缁勮棰樼洰
-        for (QuestionEditRequestVM vm : list) {
-            questionEditItemVM.setPrefix("A");
-            questionEditItemVM.setContent(vm.getA());
+                    QuestionItemObject optionB = new QuestionItemObject();
+                    optionB.setPrefix("B");
+                    optionB.setContent(excelQuestion.getOptionB());
+                    options.add(optionB);
 
-            questionEditItemVMS.add(questionEditItemVM);
-            questionEditItemVM = new QuestionEditItemVM();
-            questionEditItemVM.setPrefix("B");
-            questionEditItemVM.setContent(vm.getB());
-            questionEditItemVMS.add(questionEditItemVM);
-            questionEditItemVM = new QuestionEditItemVM();
-            questionEditItemVM.setPrefix("C");
-            questionEditItemVM.setContent(vm.getC());
-            questionEditItemVMS.add(questionEditItemVM);
-            questionEditItemVM = new QuestionEditItemVM();
-            questionEditItemVM.setPrefix("D");
-            questionEditItemVM.setContent(vm.getD());
-            questionEditItemVMS.add(questionEditItemVM);
-            vm.setItems(questionEditItemVMS);
-            List<String> str = Arrays.asList(vm.getCorrect().split(","));
+                    if (StringUtils.isNotBlank(excelQuestion.getOptionC())) {
+                        QuestionItemObject optionC = new QuestionItemObject();
+                        optionC.setPrefix("C");
+                        optionC.setContent(excelQuestion.getOptionC());
+                        options.add(optionC);
+                    }
+                    if (StringUtils.isNotBlank(excelQuestion.getOptionD())) {
+                        QuestionItemObject optionD = new QuestionItemObject();
+                        optionD.setPrefix("D");
+                        optionD.setContent(excelQuestion.getOptionD());
+                        options.add(optionD);
+                    }
 
-            //澶氶��
-            if (str.size() > 1) {
-                vm.setCorrectArray(str);
-                vm.setCorrect(null);
+                    // 淇濆瓨棰樼洰鍐呭
+                    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 rightAnswer = excelQuestion.getCorrect().replaceAll("\\s+", "");
+                    // 绛旀(澶氶�夐渶瑕佺敤,鍒嗗壊淇濆瓨瀛楃涓插埌鏁版嵁搴�)
+                    String[] corrects = rightAnswer.split(SPLIT);
+                    if (corrects.length > 1) {
+                        question.setCorrect(Arrays.asList(corrects).stream().collect(Collectors.joining(",")));
+                    } else {
+                        question.setCorrect(rightAnswer);
+                    }
+
+                    // 闅惧害
+                    question.setDifficult(excelQuestion.getDifficult());
+                    // 鍒嗘暟
+                    if (StringUtils.isBlank(excelQuestion.getScore())) {
+                        question.setScore(ExamUtil.scoreFromVM(QuestionSourceEnum.fromType(question.getQuestionType()) + ""));
+                    } else {
+                        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<String> subjectNames = Arrays.asList(excelQuestion.getSubjectName().split(SPLIT));
+                    List<Subject> subjects = subjectNames.stream().map(name -> {
+                        // 鍒ゆ柇璇剧洰鏄惁瀛樺湪浜庢暟鎹簱锛屽鏋滀笉瀛樺湪鍒欒嚜鍔ㄦ柊澧炶鐩�
+                        Subject byName = subjectMapper.getByName(name);
+                        if (Objects.isNull(byName)) {
+                            byName = new Subject();
+                            byName.setName(name);
+                            byName.setDeleted(false);
+                            subjectMapper.insert(byName);
+                        }
+                        return byName;
+                    }).collect(Collectors.toList());
+
+                    // 鏋勫缓璇剧洰-棰樼洰淇℃伅
+                    questionSubjectsList = subjects.stream()
+                            .filter(subject -> {
+                                // 鍘婚噸棰樼洰锛氶骞�+璇剧洰鐩稿悓鎵嶇畻鍚屼竴棰�
+                                List<QuestionSubjectVO> lists = questionService.countQuestionByTitleAndSubject(excelQuestion.getTitle(), subject.getId());
+                                return 0 == lists.size();
+                            })
+                            .map(subject -> {
+                                QuestionSubject questionSubject = new QuestionSubject();
+                                questionSubject.setQuestionId(question.getId());
+                                questionSubject.setSubjectId(subject.getId());
+                                questionSubject.setDeleted(0);
+                                return questionSubject;
+                            }).collect(Collectors.toList());
+                    // 鎵归噺淇濆瓨棰樼洰-璇剧洰淇℃伅
+                    if (! CollectionUtils.isEmpty(questionSubjectsList)) {
+                        questionSubjectService.saves(questionSubjectsList);
+                    }
+                } else {
+                    question.setId(questionId);
+                    this.updateQuestion(question, excelQuestion);
+                    List<String> subjectNames = Arrays.asList(excelQuestion.getSubjectName().split(SPLIT));
+                    List<Subject> subjects = subjectNames.stream().map(name -> {
+                        // 鍒ゆ柇璇剧洰鏄惁瀛樺湪浜庢暟鎹簱锛屽鏋滀笉瀛樺湪鍒欒嚜鍔ㄦ柊澧炶鐩�
+                        Subject byName = subjectMapper.getByName(name);
+                        if (Objects.isNull(byName)) {
+                            byName = new Subject();
+                            byName.setName(name);
+                            byName.setDeleted(false);
+                            subjectMapper.insert(byName);
+                        }
+                        return byName;
+                    }).collect(Collectors.toList());
+                    // 鏋勫缓璇剧洰-棰樼洰淇℃伅
+                    questionSubjectsList = subjects.stream()
+                            .filter(subject -> {
+                                // 鍘婚噸棰樼洰锛氶骞�+璇剧洰鐩稿悓鎵嶇畻鍚屼竴棰�(棰樺共鐩稿悓锛氫絾鏈夋柊澧炵殑璇剧洰鏃舵墠鍋氫繚瀛�)
+                                List<QuestionSubjectVO> lists = questionService.countQuestionByTitleAndSubject(excelQuestion.getTitle(), subject.getId());
+                                return 0 == lists.size();
+                            })
+                            .map(subject -> {
+                                QuestionSubject questionSubject = new QuestionSubject();
+                                questionSubject.setQuestionId(questionId);
+                                questionSubject.setSubjectId(subject.getId());
+                                questionSubject.setDeleted(0);
+                                return questionSubject;
+                            }).collect(Collectors.toList());
+                    // 鎵归噺淇濆瓨棰樼洰-璇剧洰淇℃伅
+                    if (! CollectionUtils.isEmpty(questionSubjectsList)) {
+                        questionSubjectService.saves(questionSubjectsList);
+                    }
+                }
             }
 
-            questionService.insertFullQuestion(vm, getCurrentUser().getId());
-            questionEditItemVMS.clear();
+
+        };
+        EasyExcel.read(file.getInputStream(), QuestionImportVO.class, new CurrencyDataListener(consumer)).sheet("妯℃澘").doRead();
+        return RestResponse.ok();
+    }
+
+    /**
+     * 瀵煎叆鏃讹紝濡傛灉棰樺共閲嶅锛岄偅涔堟洿鏂伴鐩俊鎭紙璇ユ柟娉曚笉浼氭洿鏂伴鐩殑棰樺簱淇℃伅锛�
+     *
+     * @param question
+     * @param excelQuestion
+     */
+    private void updateQuestion(Question question, QuestionImportVO excelQuestion) {
+        Question question1 = questionService.selectById(question.getId());
+        // 璇ラ鐨勯�夐」
+        List<QuestionItemObject> options = new ArrayList<>(4);
+        // 閫夐」鍐呭
+        QuestionItemObject optionA = new QuestionItemObject();
+        optionA.setPrefix("A");
+        optionA.setContent(excelQuestion.getOptionA());
+        options.add(optionA);
+
+        QuestionItemObject optionB = new QuestionItemObject();
+        optionB.setPrefix("B");
+        optionB.setContent(excelQuestion.getOptionB());
+        options.add(optionB);
+
+        if (StringUtils.isNotBlank(excelQuestion.getOptionC())) {
+            QuestionItemObject optionC = new QuestionItemObject();
+            optionC.setPrefix("C");
+            optionC.setContent(excelQuestion.getOptionC());
+            options.add(optionC);
         }
+        if (StringUtils.isNotBlank(excelQuestion.getOptionD())) {
+            QuestionItemObject optionD = new QuestionItemObject();
+            optionD.setPrefix("D");
+            optionD.setContent(excelQuestion.getOptionD());
+            options.add(optionD);
+        }
+
+        // 鏇存柊棰樼洰鍐呭
+        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());
+        textContent.setId(question1.getInfoTextContentId());
+        textContentService.updateByIdFilter(textContent);
+
+        // 淇濆瓨棰樼洰淇℃伅
+        // 璁剧疆棰樺瀷
+        question.setQuestionType(QuestionTypeEnum.get(excelQuestion.getQuestionType()));
+        // 绛旀鍘绘帀绌烘牸
+        String rightAnswer = excelQuestion.getCorrect().replaceAll("\\s+", "");
+        // 绛旀(澶氶�夐渶瑕佺敤,鍒嗗壊淇濆瓨瀛楃涓插埌鏁版嵁搴�)
+        String[] corrects = rightAnswer.split(SPLIT);
+        if (corrects.length > 1) {
+            question.setCorrect(Arrays.asList(corrects).stream().collect(Collectors.joining(",")));
+        } else {
+            question.setCorrect(rightAnswer);
+        }
+
+        // 闅惧害
+        question.setDifficult(excelQuestion.getDifficult());
+        // 鍒嗘暟
+        if (StringUtils.isBlank(excelQuestion.getScore())) {
+            question.setScore(ExamUtil.scoreFromVM(QuestionSourceEnum.fromType(question.getQuestionType()) + ""));
+        } else {
+            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.updateByIdFilter(question);
+
+    }
+
+//    @PostMapping("/import")
+//    public RestResponse importQuestion(@RequestPart("file") MultipartFile file) throws Exception {
+//        List<QuestionEditVO> questionEditVOS = ExcelUtils.readMultipartFile(file, QuestionEditVO.class)
+//                .stream().map(e -> {
+//                    e.setQuestionType(QuestionTypeEnum.get(e.getType()));
+////                    e.setSubjectId(subjectMapper.getName(e.getSbNames()).getId());
+////                    e.setGradeLevel(departmentMapper.getName(e.getDepartment()).getId());
+//                    return e;
+//                }).collect(Collectors.toList());
+//
+//        List<QuestionEditRequestVM> list = QuestionClassConvert.INSTANCE.QuestionEditVOListToQuestionEditRequestVMList(questionEditVOS);
+//
+//        List<QuestionEditItemVM> questionEditItemVMS = new ArrayList<>();
+//        QuestionEditItemVM questionEditItemVM = new QuestionEditItemVM();
+//
+//        //缁勮棰樼洰
+//        for (QuestionEditRequestVM vm : list) {
+//            // 鍒ゆ柇棰樺共鏄惁閲嶅锛岄噸澶嶄笉娣诲姞
+//            Integer num = questionService.countQuestionByTitle(vm.getTitle());
+//            if (num > 0) {
+//                continue;
+//            }
+//
+//            questionEditItemVM.setPrefix("A");
+//            questionEditItemVM.setContent(vm.getA());
+//
+//            questionEditItemVMS.add(questionEditItemVM);
+//            questionEditItemVM = new QuestionEditItemVM();
+//            questionEditItemVM.setPrefix("B");
+//            questionEditItemVM.setContent(vm.getB());
+//            questionEditItemVMS.add(questionEditItemVM);
+//            if(!"".equals(vm.getC()) && vm.getC()!=null){
+//                questionEditItemVM = new QuestionEditItemVM();
+//                questionEditItemVM.setPrefix("C");
+//                questionEditItemVM.setContent(vm.getC());
+//                questionEditItemVMS.add(questionEditItemVM);
+//            }
+//            if(!"".equals(vm.getD()) && vm.getD()!=null){
+//                questionEditItemVM = new QuestionEditItemVM();
+//                questionEditItemVM.setPrefix("D");
+//                questionEditItemVM.setContent(vm.getD());
+//                questionEditItemVMS.add(questionEditItemVM);
+//            }
+//            vm.setItems(questionEditItemVMS);
+//            // 娓呯┖鍓嶅悗鐨勯�楀彿锛屼互鍏嶅悗缁綔绛斿垽鏂负閿欒
+//            String s = vm.getCorrect().replaceAll("^,+|,+$", "");
+//            if (Objects.equals(s, "姝g‘")) s = "A";
+//            if (Objects.equals(s, "閿欒")) s = "B";
+//            vm.setCorrect(s);
+//            List<String> str = Arrays.asList(s.split(SPLIT));
+//
+//            List<Subject> subjectList = subjectMapper.getNames(vm.getSbNames().split(SPLIT));
+//
+//            Integer[] arr =subjectList.stream()
+//                    .map(Subject::getId).toArray(Integer[]::new);
+//
+//            vm.setSubjectIds(arr);
+//            //澶氶��
+//            if (str.size() > 1) {
+//                vm.setCorrectArray(str);
+//                vm.setCorrect(null);
+//            }
+//            vm.setScore(QuestionSourceEnum.fromType(vm.getQuestionType()).toString());
+//            vm.setDifficult(4);
+//
+//            questionService.insertFullQuestion(vm, getCurrentUser().getId());
+//            questionEditItemVMS.clear();
+//        }
+//        return RestResponse.ok();
+//    }
+
+    @PostMapping("/question/export")
+    public void exportQuestion(@RequestBody QuestionExportVO query, HttpServletResponse response) throws IOException {
+        // 鏌ヨ瀵煎嚭鏁版嵁
+        List<QuestionImportVO> exportData = questionService.exportData(query);
+        // 澶勭悊瀹屽杽鏁版嵁
+        exportData.stream().forEach(question -> {
+            if (StringUtils.isNotBlank(question.getQuestionContent())) {
+                QuestionObject questionContent = JSON.parseObject(question.getQuestionContent(), QuestionObject.class);
+                // 璁剧疆閫夐」
+                for (QuestionItemObject option : questionContent.getQuestionItemObjects()) {
+                    String optionContent = option.getContent();
+                    if ("A".equals(option.getPrefix())) {
+                        question.setOptionA(optionContent);
+                    } else if ("B".equals(option.getPrefix())) {
+                        question.setOptionB(optionContent);
+                    } else if ("C".equals(option.getPrefix())) {
+                        question.setOptionC(optionContent);
+                    } else if ("D".equals(option.getPrefix())) {
+                        question.setOptionD(optionContent);
+                    }
+                }
+                question.setScore(BigDecimal.valueOf(Double.valueOf(question.getScore())).divide(BigDecimal.TEN).toString());
+                // 璁剧疆棰樺共銆佽В鏋�
+                question.setAnalyze(questionContent.getAnalyze());
+                question.setTitle(questionContent.getTitleContent());
+                // 璁剧疆璇剧洰
+                question.setSubjectName(question.getSubjectList().stream().collect(Collectors.joining(",")));
+                // 璁剧疆棰樺瀷
+                question.setQuestionType(QuestionTypeEnum.fromCode(Integer.valueOf(question.getQuestionType())).getName());
+            }
+        });
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setCharacterEncoding("utf-8");
+        // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
+        String fileName = URLEncoder.encode("棰樼洰瀵煎嚭鏁版嵁", "UTF-8").replaceAll("\\+", "%20");
+        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+
+
+        // 鏌ュ嚭鎵�鏈夌殑璇剧洰锛坋xcel涓嬫媺鏁版嵁锛�
+        List<Subject> subjects = subjectMapper.allSubject(new ArrayList<>(), Boolean.TRUE);
+        List<String> subjectNameList = subjects.stream().map(Subject::getName).collect(Collectors.toList());
+
+        // 鏌ュ嚭鎵�鏈夌殑璇剧洰锛坋xcel涓嬫媺鏁版嵁锛�
+        EasyExcel.write(response.getOutputStream(), QuestionImportVO.class)
+                .sheet("棰樼洰瀵煎嚭鏁版嵁")
+                .registerWriteHandler(new SelectExcel(subjectNameList))
+                .doWrite(exportData);
     }
 }

--
Gitblit v1.8.0