From dcaea52b2c0778ec4f929f60752cc6baf37b5a50 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期五, 29 三月 2024 13:50:43 +0800
Subject: [PATCH] 题目导出

---
 src/main/java/com/mindskip/xzs/excel/DynamicMergeCellStrategy.java      |   45 +++++++++++
 src/main/java/com/mindskip/xzs/service/QuestionService.java             |    3 
 src/main/java/com/mindskip/xzs/repository/QuestionMapper.java           |    3 
 src/main/resources/mapper/QuestionMapper.xml                            |   32 +++++++
 src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java    |    3 
 src/main/java/com/mindskip/xzs/excel/RowItem.java                       |   18 ++++
 src/main/java/com/mindskip/xzs/vo/QuestionImportVO.java                 |   14 ++-
 src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java |   61 +++++++++++++-
 src/main/java/com/mindskip/xzs/vo/QuestionExportVO.java                 |   43 ++++++++++
 src/main/java/com/mindskip/xzs/vo/SubjectVO.java                        |   16 ++++
 10 files changed, 223 insertions(+), 15 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 3614c69..12cad20 100644
--- a/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java
+++ b/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java
@@ -18,9 +18,7 @@
 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.excel.*;
 import com.mindskip.xzs.repository.DepartmentMapper;
 import com.mindskip.xzs.repository.SubjectMapper;
 import com.mindskip.xzs.service.*;
@@ -30,6 +28,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.QuestionExportVO;
 import com.mindskip.xzs.vo.QuestionImportVO;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.DataValidationHelper;
@@ -44,6 +43,7 @@
 import javax.validation.Valid;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.util.*;
 import java.util.function.Consumer;
@@ -194,16 +194,65 @@
                 .doWrite(data);
     }
 
-    @PostMapping("/question/export")
-    public void importQuestion(QuestionPageRequestVM query, HttpServletResponse response) throws IOException {
+    @GetMapping("/question/export")
+    public void importQuestion(QuestionExportVO query, HttpServletResponse response) throws IOException {
+        query.formartTime();
         // 鏌ヨ瀵煎嚭鏁版嵁
         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");
-        EasyExcel.write(response.getOutputStream(), QuestionImportVO.class).sheet("棰樼洰瀵煎嚭鏁版嵁").doWrite(exportData);
+
+        // 鏌ュ嚭鎵�鏈夌殑璇剧洰锛坋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 DynamicMergeCellStrategy(mergeRowList, Arrays.asList(0, 1, 2, 5, 6, 7, 8)))
+                .doWrite(exportList);
     }
 
     /**
diff --git a/src/main/java/com/mindskip/xzs/excel/DynamicMergeCellStrategy.java b/src/main/java/com/mindskip/xzs/excel/DynamicMergeCellStrategy.java
new file mode 100644
index 0000000..5ef30c5
--- /dev/null
+++ b/src/main/java/com/mindskip/xzs/excel/DynamicMergeCellStrategy.java
@@ -0,0 +1,45 @@
+package com.mindskip.xzs.excel;
+
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.write.merge.AbstractMergeStrategy;
+import lombok.Data;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.util.CellRangeAddress;
+
+import java.util.List;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/3/16 11:20
+ */
+public class DynamicMergeCellStrategy extends AbstractMergeStrategy {
+
+    /**
+     * 澶氬皯琛屽悎骞朵竴娆★紙璧峰浣嶇疆锛�
+     */
+    private List<RowItem> rowMergeList;
+
+    /**
+     * 鍝簺鍒楅渶瑕佸悎骞惰
+     */
+    private List<Integer> mergeWhichColumn;
+
+    public DynamicMergeCellStrategy(List<RowItem> rowMergeList, List<Integer> mergeWhichColumn) {
+        this.rowMergeList = rowMergeList;
+        this.mergeWhichColumn = mergeWhichColumn;
+    }
+
+    @Override
+    protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
+        // 鍙湁鍗曞厓鏍肩殑琛屽垪鍦ㄥ悎骞惰寖鍥村唴鎵嶅悎骞�
+        if (mergeWhichColumn.contains(cell.getColumnIndex())) {
+            rowMergeList.stream().forEach(rowItem -> {
+                if (rowItem.getStart() <= relativeRowIndex && rowItem.getEnd() >= relativeRowIndex) {
+                    CellRangeAddress cellRangeAddress = new CellRangeAddress(rowItem.getStart(), rowItem.getEnd(), cell.getColumnIndex(), cell.getColumnIndex());
+                    sheet.addMergedRegionUnsafe(cellRangeAddress);
+                }
+            });
+        }
+    }
+}
diff --git a/src/main/java/com/mindskip/xzs/excel/RowItem.java b/src/main/java/com/mindskip/xzs/excel/RowItem.java
new file mode 100644
index 0000000..b13ea98
--- /dev/null
+++ b/src/main/java/com/mindskip/xzs/excel/RowItem.java
@@ -0,0 +1,18 @@
+package com.mindskip.xzs.excel;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/3/29 9:12
+ */
+@Data
+public class RowItem {
+
+    private Integer start;
+
+    private Integer end;
+
+}
diff --git a/src/main/java/com/mindskip/xzs/repository/QuestionMapper.java b/src/main/java/com/mindskip/xzs/repository/QuestionMapper.java
index 2972edb..dbb8924 100644
--- a/src/main/java/com/mindskip/xzs/repository/QuestionMapper.java
+++ b/src/main/java/com/mindskip/xzs/repository/QuestionMapper.java
@@ -3,6 +3,7 @@
 import com.mindskip.xzs.domain.other.KeyValue;
 import com.mindskip.xzs.domain.Question;
 import com.mindskip.xzs.viewmodel.admin.question.QuestionPageRequestVM;
+import com.mindskip.xzs.vo.QuestionExportVO;
 import com.mindskip.xzs.vo.QuestionImportVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -23,5 +24,5 @@
 
     List<Question> getAll();
 
-    List<QuestionImportVO> export(@Param("query") QuestionPageRequestVM query);
+    List<QuestionImportVO> export(@Param("query") QuestionExportVO query);
 }
diff --git a/src/main/java/com/mindskip/xzs/service/QuestionService.java b/src/main/java/com/mindskip/xzs/service/QuestionService.java
index be5706a..a098ffc 100644
--- a/src/main/java/com/mindskip/xzs/service/QuestionService.java
+++ b/src/main/java/com/mindskip/xzs/service/QuestionService.java
@@ -5,6 +5,7 @@
 import com.mindskip.xzs.viewmodel.admin.question.QuestionEditRequestVM;
 import com.mindskip.xzs.viewmodel.admin.question.QuestionPageRequestVM;
 import com.github.pagehelper.PageInfo;
+import com.mindskip.xzs.vo.QuestionExportVO;
 import com.mindskip.xzs.vo.QuestionImportVO;
 import org.apache.ibatis.annotations.Param;
 
@@ -37,5 +38,5 @@
      * @param query
      * @return
      */
-    List<QuestionImportVO> export(QuestionPageRequestVM query);
+    List<QuestionImportVO> export(QuestionExportVO query);
 }
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 fd2cddd..7e8b0cc 100644
--- a/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java
+++ b/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java
@@ -25,6 +25,7 @@
 import com.mindskip.xzs.viewmodel.admin.question.QuestionPageRequestVM;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.mindskip.xzs.vo.QuestionExportVO;
 import com.mindskip.xzs.vo.QuestionImportVO;
 import org.modelmapper.ModelMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -253,7 +254,7 @@
 
 
     @Override
-    public List<QuestionImportVO> export(QuestionPageRequestVM query) {
+    public List<QuestionImportVO> export(QuestionExportVO query) {
         return questionMapper.export(query);
     }
 }
diff --git a/src/main/java/com/mindskip/xzs/vo/QuestionExportVO.java b/src/main/java/com/mindskip/xzs/vo/QuestionExportVO.java
new file mode 100644
index 0000000..b3a8c13
--- /dev/null
+++ b/src/main/java/com/mindskip/xzs/vo/QuestionExportVO.java
@@ -0,0 +1,43 @@
+package com.mindskip.xzs.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.mindskip.xzs.utility.DateTimeUtil;
+import lombok.Data;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/3/28 16:40
+ */
+@Data
+public class QuestionExportVO {
+
+    /**
+     * 棰樺瀷
+     */
+    private Integer questionType;
+
+    /**
+     * 寮�濮嬫椂闂�
+     */
+    private String startStr;
+    private Date start;
+
+    /**
+     * 缁撴潫鏃堕棿
+     */
+    private String endStr;
+    private Date end;
+
+    public void formartTime() {
+        if (StringUtils.hasText(startStr)) {
+            start = DateTimeUtil.parse(startStr, "yyyy-MM-dd HH:mm:ss");
+        }
+        if (StringUtils.hasText(endStr)) {
+            end = DateTimeUtil.parse(endStr, "yyyy-MM-dd HH:mm:ss");
+        }
+    }
+
+}
diff --git a/src/main/java/com/mindskip/xzs/vo/QuestionImportVO.java b/src/main/java/com/mindskip/xzs/vo/QuestionImportVO.java
index 390e872..4c6035e 100644
--- a/src/main/java/com/mindskip/xzs/vo/QuestionImportVO.java
+++ b/src/main/java/com/mindskip/xzs/vo/QuestionImportVO.java
@@ -6,10 +6,8 @@
 import com.alibaba.excel.annotation.write.style.ContentStyle;
 import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
 import com.alibaba.excel.enums.poi.VerticalAlignmentEnum;
-import com.mindskip.xzs.viewmodel.admin.question.QuestionEditItemVM;
-import io.swagger.models.auth.In;
+import com.mindskip.xzs.domain.vo.QuestionSubjectVO;
 import lombok.Data;
-import org.apache.poi.ss.usermodel.HorizontalAlignment;
 import org.springframework.util.StringUtils;
 
 import java.util.List;
@@ -28,12 +26,21 @@
 
     @ExcelProperty("璇剧洰(澶氫釜鐢ㄣ�侀殧寮�)")
     private String subjectName;
+
     @ExcelIgnore
     private List<Integer> subjectIds;
+    @ExcelIgnore
+    private List<String> subjectList;
 
     @ColumnWidth(80)
     @ExcelProperty("棰樺共")
     private String title;
+
+    /***
+     * 棰樼洰鍐呭
+     */
+    @ExcelIgnore
+    private String questionContent;
 
     // 閫夐」鍐呭
     @ExcelProperty({"棰樼洰閫夐」", "閫夐」"})
@@ -49,7 +56,6 @@
     @ColumnWidth(30)
     @ExcelProperty("瑙f瀽")
     private String analyze;
-
 
     // 棰樼洰鍒嗘暟
     @ExcelProperty("棰樼洰鍒嗘暟")
diff --git a/src/main/java/com/mindskip/xzs/vo/SubjectVO.java b/src/main/java/com/mindskip/xzs/vo/SubjectVO.java
new file mode 100644
index 0000000..5b22752
--- /dev/null
+++ b/src/main/java/com/mindskip/xzs/vo/SubjectVO.java
@@ -0,0 +1,16 @@
+package com.mindskip.xzs.vo;
+
+import lombok.Data;
+
+/**
+ * @author锛歺p
+ * @date锛�2024/3/28 8:57
+ */
+@Data
+public class SubjectVO {
+
+    private Long id;
+
+    private String subjectName;
+
+}
diff --git a/src/main/resources/mapper/QuestionMapper.xml b/src/main/resources/mapper/QuestionMapper.xml
index 6a2e725..fe253d0 100644
--- a/src/main/resources/mapper/QuestionMapper.xml
+++ b/src/main/resources/mapper/QuestionMapper.xml
@@ -244,11 +244,39 @@
   </select>
 
   <select id="export" resultMap="exportMap">
-    SELECT * FROM t_question q INNER JOIN t_question_subject qs on q.id = qs.question_id
+    SELECT
+           q.*, ttc.content
+    FROM
+         t_question q
+             INNER JOIN t_text_content ttc on q.info_text_content_id = ttc.id AND q.deleted = 0
+    <where>
+      <if test="query.questionType != null">
+        q.question_type = #{query.questionType}
+      </if>
+      <if test="query.start != null and query.end != null">
+        q.create_time between #{query.start} and #{query.end}
+      </if>
+    </where>
   </select>
 
   <resultMap id="exportMap" type="com.mindskip.xzs.vo.QuestionImportVO">
-
+    <result column="question_type" property="questionType" />
+    <result column="title" property="title" />
+    <result column="analyze" property="analyze" />
+    <result column="score" property="score" />
+    <result column="difficult" property="difficult" />
+    <result column="content" property="questionContent" />
+    <result column="score" property="score" />
+    <result column="correct" property="correct" />
+    <collection property="subjectList" column="id" ofType="string" select="selectSubjects"/>
   </resultMap>
 
+  <select id="selectSubjects" 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 = #{id} AND tqs.deleted = 0 AND ts.deleted = 0
+  </select>
+
 </mapper>

--
Gitblit v1.8.0