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