From 78b94b6a8eb94af251450a89b1f133e92423ec84 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期二, 02 七月 2024 15:19:11 +0800
Subject: [PATCH] 题目导入导出

---
 src/main/java/com/mindskip/xzs/service/QuestionService.java             |   10 +
 src/main/java/com/mindskip/xzs/repository/QuestionMapper.java           |   13 ++
 src/main/resources/mapper/QuestionMapper.xml                            |   37 ++++++
 src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java    |    6 +
 src/main/java/com/mindskip/xzs/vo/QuestionExportData.java               |   60 ++++++++++
 src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java |  191 +++++++++++++++++--------------
 6 files changed, 229 insertions(+), 88 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 faa4c6c..6c0bb5c 100644
--- a/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java
+++ b/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java
@@ -30,6 +30,7 @@
 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 org.apache.commons.lang3.StringUtils;
@@ -159,103 +160,75 @@
 
         // 鏋勫缓妯℃澘鏍蜂緥鏁版嵁
         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(new ArrayList<>(), Boolean.TRUE);
         List<String> subjectNameList = subjects.stream().map(Subject::getName).collect(Collectors.toList());
 
-        EasyExcel.write(response.getOutputStream(), QuestionImportVO.class)
+        EasyExcel.write(response.getOutputStream(), QuestionExportData.class)
                 .sheet("妯℃澘")
-                .registerWriteHandler(new SelectExcel(subjectNameList))
-                .registerWriteHandler(new FixedMergeCellStrategy(2, 4, Arrays.asList(0, 1, 2, 5, 6, 7, 8)))
                 .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);
-    }
+//    @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);
+//    }
 
     /**
      * 棰樼洰瀵煎叆
@@ -429,4 +402,46 @@
         }
         return RestResponse.ok();
     }
+
+    @PostMapping("/question/export")
+    public void exportQuestion(@RequestBody QuestionExportVO query, HttpServletResponse response) throws IOException {
+        // 鏌ヨ瀵煎嚭鏁版嵁
+        List<QuestionExportData> exportData = questionService.exportData(query);
+        // 澶勭悊瀹屽杽鏁版嵁
+        exportData.stream().forEach(question -> {
+            if (StringUtils.isNotBlank(question.getContent())) {
+                QuestionObject questionContent = JSON.parseObject(question.getContent(), 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.setAnalyze(questionContent.getAnalyze());
+                question.setTitle(questionContent.getTitleContent());
+                // 璁剧疆璇剧洰
+                question.setSubject(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涓嬫媺鏁版嵁锛�
+        EasyExcel.write(response.getOutputStream(), QuestionExportData.class)
+                .sheet("棰樼洰瀵煎嚭鏁版嵁")
+                .doWrite(exportData);
+    }
 }
diff --git a/src/main/java/com/mindskip/xzs/repository/QuestionMapper.java b/src/main/java/com/mindskip/xzs/repository/QuestionMapper.java
index e8a2a9c..854d04c 100644
--- a/src/main/java/com/mindskip/xzs/repository/QuestionMapper.java
+++ b/src/main/java/com/mindskip/xzs/repository/QuestionMapper.java
@@ -1,11 +1,13 @@
 package com.mindskip.xzs.repository;
 
 import com.mindskip.xzs.domain.Question;
+import com.mindskip.xzs.domain.Subject;
 import com.mindskip.xzs.domain.other.KeyValue;
 import com.mindskip.xzs.domain.vo.QuestionVO;
 import com.mindskip.xzs.viewmodel.admin.question.QuestionPageRequestVM;
 import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentRequestVM;
 import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentResponseVM;
+import com.mindskip.xzs.vo.QuestionExportData;
 import com.mindskip.xzs.vo.QuestionExportVO;
 import com.mindskip.xzs.vo.QuestionImportVO;
 import org.apache.ibatis.annotations.Mapper;
@@ -28,6 +30,14 @@
 
     List<Question> getAll();
 
+    /**
+     * 鏌ヨ瀵煎嚭鏁版嵁
+     *
+     * @param query
+     * @return
+     */
+    List<QuestionExportData> exportData(@Param("query") QuestionExportVO query);
+
     List<QuestionImportVO> export(@Param("query") QuestionExportVO query);
 
     List<QuestionPageStudentResponseVM> selectQuestion(QuestionPageStudentRequestVM model);
@@ -35,4 +45,7 @@
     QuestionVO selectContentById(Integer id);
 
     QuestionVO getAnswer(Integer id);
+
+
+
 }
diff --git a/src/main/java/com/mindskip/xzs/service/QuestionService.java b/src/main/java/com/mindskip/xzs/service/QuestionService.java
index b1318c4..7532cdc 100644
--- a/src/main/java/com/mindskip/xzs/service/QuestionService.java
+++ b/src/main/java/com/mindskip/xzs/service/QuestionService.java
@@ -9,6 +9,7 @@
 import com.mindskip.xzs.viewmodel.student.question.answer.QuestionAnswerVO;
 import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentRequestVM;
 import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentResponseVM;
+import com.mindskip.xzs.vo.QuestionExportData;
 import com.mindskip.xzs.vo.QuestionExportVO;
 import com.mindskip.xzs.vo.QuestionImportVO;
 import org.apache.ibatis.annotations.Param;
@@ -44,6 +45,14 @@
      */
     List<QuestionImportVO> export(QuestionExportVO query);
 
+    /**
+     * 棰樼洰瀵煎嚭鏁版嵁
+     *
+     * @param query
+     * @return
+     */
+    List<QuestionExportData> exportData(QuestionExportVO query);
+
     PageInfo<QuestionPageStudentResponseVM> selectQuestion(QuestionPageStudentRequestVM model);
 
     /** 鏌ュ嚭棰樼洰涓讳綋鍐呭 */
@@ -51,4 +60,5 @@
 
     /** 鑾峰彇棰樼洰绛旀銆佽В鏋� */
     RestResponse getAnswer(Integer id);
+
 }
diff --git a/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java b/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java
index 3e5ce6b..1edf777 100644
--- a/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java
+++ b/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java
@@ -32,6 +32,7 @@
 import com.github.pagehelper.PageInfo;
 import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentRequestVM;
 import com.mindskip.xzs.viewmodel.student.question.answer.QuestionPageStudentResponseVM;
+import com.mindskip.xzs.vo.QuestionExportData;
 import com.mindskip.xzs.vo.QuestionExportVO;
 import com.mindskip.xzs.vo.QuestionImportVO;
 import lombok.RequiredArgsConstructor;
@@ -298,6 +299,11 @@
     }
 
     @Override
+    public List<QuestionExportData> exportData(QuestionExportVO query) {
+        return questionMapper.exportData(query);
+    }
+
+    @Override
     public PageInfo<QuestionPageStudentResponseVM> selectQuestion(QuestionPageStudentRequestVM model) {
         return PageHelper.startPage(model.getPageIndex(), model.getPageSize()).doSelectPageInfo(() ->
                 questionMapper.selectQuestion(model).stream().peek(
diff --git a/src/main/java/com/mindskip/xzs/vo/QuestionExportData.java b/src/main/java/com/mindskip/xzs/vo/QuestionExportData.java
new file mode 100644
index 0000000..50c9274
--- /dev/null
+++ b/src/main/java/com/mindskip/xzs/vo/QuestionExportData.java
@@ -0,0 +1,60 @@
+package com.mindskip.xzs.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/7/2 14:05
+ */
+@Data
+public class QuestionExportData {
+
+    @ExcelIgnore
+    private Integer id;
+
+    @ExcelIgnore
+    private String content;
+
+    @ExcelIgnore
+    private List<String> subjectList;
+
+    @ExcelProperty(value = "棰樺瀷")
+    private String questionType;
+
+    @ExcelProperty(value = "璇剧洰")
+    @ColumnWidth(30)
+    private String subject;
+
+    @ExcelProperty(value = "棰樺共")
+    @ColumnWidth(40)
+    private String title;
+
+    @ExcelProperty(value = "閫夐」A")
+    @ColumnWidth(40)
+    private String optionA;
+
+    @ColumnWidth(40)
+    @ExcelProperty(value = "閫夐」B")
+    private String optionB;
+
+    @ColumnWidth(40)
+    @ExcelProperty(value = "閫夐」C")
+    private String optionC;
+
+    @ColumnWidth(40)
+    @ExcelProperty(value = "閫夐」D")
+    private String optionD;
+
+    @ColumnWidth(120)
+    @ExcelProperty(value = "瑙f瀽")
+    private String analyze;
+
+    @ColumnWidth(10)
+    @ExcelProperty(value = "绛旀")
+    private String answer;
+}
diff --git a/src/main/resources/mapper/QuestionMapper.xml b/src/main/resources/mapper/QuestionMapper.xml
index 6fe00b0..4129fa3 100644
--- a/src/main/resources/mapper/QuestionMapper.xml
+++ b/src/main/resources/mapper/QuestionMapper.xml
@@ -268,6 +268,36 @@
         </where>
     </select>
 
+    <select id="exportData" resultMap="exportDataMap">
+        SELECT
+        DISTINCT
+        q.id,
+        q.question_type,
+        q.correct as answer,
+        ttc.content
+        FROM
+        t_question q
+        INNER JOIN t_text_content ttc on q.info_text_content_id = ttc.id AND q.deleted = 0
+        INNER JOIN t_question_subject tqs on q.id = tqs.question_id
+        <where>
+            <if test="query.subjectIds != null and query.subjectIds.size > 0">
+                AND tqs.subject_id IN
+                <foreach collection="query.subjectIds" open="(" separator="," close=")" item="subjectId">
+                    #{subjectId}
+                </foreach>
+            </if>
+        </where>
+    </select>
+
+    <resultMap id="exportDataMap"  type="com.mindskip.xzs.vo.QuestionExportData">
+        <result column="question_type" property="questionType"/>
+        <result column="title" property="title"/>
+        <result column="analyze" property="analyze"/>
+        <result column="content" property="content"/>
+        <result column="correct" property="answer"/>
+        <collection property="subjectList" column="id" ofType="string" select="selectSubjects"/>
+    </resultMap>
+
     <resultMap id="exportMap" type="com.mindskip.xzs.vo.QuestionImportVO">
         <result column="question_type" property="questionType"/>
         <result column="title" property="title"/>
@@ -287,6 +317,13 @@
                             ON tqs.subject_id = ts.id AND tqs.question_id = #{id} AND tqs.deleted = 0 AND ts.deleted = 0
     </select>
 
+    <select id="getQuestionSubjects" resultType="string">
+        SELECT ts.name
+        FROM t_question_subject tqs
+                 INNER JOIN t_subject ts
+                            ON tqs.subject_id = ts.id AND tqs.question_id = #{questionId} AND tqs.deleted = 0 AND ts.deleted = 0
+    </select>
+
     <select id="getVoByIds" resultType="com.mindskip.xzs.domain.vo.QuestionVO">
         SELECT
         tq.id,

--
Gitblit v1.8.0