From 9797dca8f3a12c0e72942b8043c1b225bde2bbaf Mon Sep 17 00:00:00 2001
From: 龚焕茏 <2842157468@qq.com>
Date: 星期二, 09 七月 2024 16:26:02 +0800
Subject: [PATCH] feat:题目导入
---
src/main/java/com/ycl/jxkg/mapper/QuestionMapper.java | 4
src/main/resources/mapper/QuestionMapper.xml | 32 ---
src/main/java/com/ycl/jxkg/domain/vo/admin/exam/QuestionImportVO.java | 14 -
src/main/java/com/ycl/jxkg/controller/admin/QuestionController.java | 14 +
src/main/java/com/ycl/jxkg/domain/vo/admin/exam/ExamPaperImportVO.java | 72 +++++++++
src/main/java/com/ycl/jxkg/service/QuestionService.java | 20 ++
src/main/java/com/ycl/jxkg/excel/PaperSelectExcel.java | 77 +++++++++
src/main/java/com/ycl/jxkg/service/impl/QuestionServiceImpl.java | 149 ++++++++++++++++++
src/main/java/com/ycl/jxkg/service/impl/ExamPaperServiceImpl.java | 40 ++--
9 files changed, 358 insertions(+), 64 deletions(-)
diff --git a/src/main/java/com/ycl/jxkg/controller/admin/QuestionController.java b/src/main/java/com/ycl/jxkg/controller/admin/QuestionController.java
index bf1555a..06e0450 100644
--- a/src/main/java/com/ycl/jxkg/controller/admin/QuestionController.java
+++ b/src/main/java/com/ycl/jxkg/controller/admin/QuestionController.java
@@ -8,8 +8,8 @@
import com.ycl.jxkg.domain.vo.admin.question.QuestionEditRequestVO;
import com.ycl.jxkg.domain.vo.admin.question.QuestionPageRequestVO;
import com.ycl.jxkg.domain.vo.admin.question.QuestionResponseVO;
-import com.ycl.jxkg.service.QuestionService;
import com.ycl.jxkg.enums.QuestionTypeEnum;
+import com.ycl.jxkg.service.QuestionService;
import com.ycl.jxkg.utils.ErrorUtil;
import com.ycl.jxkg.utils.HtmlUtil;
import com.ycl.jxkg.utils.JsonUtil;
@@ -18,7 +18,9 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
@RequiredArgsConstructor
@@ -89,4 +91,14 @@
return Result.ok("鎿嶄綔鎴愬姛");
}
+ @GetMapping("/download/importTemplate")
+ public void importTemplate(HttpServletResponse response) {
+ questionService.importTemplate(response);
+ }
+
+ @PostMapping("/import")
+ public Result<Boolean> importPaper(MultipartFile file) {
+ return questionService.importQuestion(file);
+ }
+
}
diff --git a/src/main/java/com/ycl/jxkg/domain/vo/admin/exam/ExamPaperImportVO.java b/src/main/java/com/ycl/jxkg/domain/vo/admin/exam/ExamPaperImportVO.java
new file mode 100644
index 0000000..dcf9022
--- /dev/null
+++ b/src/main/java/com/ycl/jxkg/domain/vo/admin/exam/ExamPaperImportVO.java
@@ -0,0 +1,72 @@
+package com.ycl.jxkg.domain.vo.admin.exam;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
+import com.alibaba.excel.enums.poi.VerticalAlignmentEnum;
+import lombok.Data;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author gonghl
+ * @since 2024-7-4
+ */
+@Data
+@ColumnWidth(20)
+@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
+public class ExamPaperImportVO {
+
+ @ExcelProperty("鏍囬")
+ private String label;
+
+ @ExcelProperty("棰樼洰绫诲瀷")
+ private String questionType;
+
+ @ExcelProperty("绉戠洰")
+ private String subject;
+
+ @ColumnWidth(80)
+ @ExcelProperty("棰樺共")
+ private String title;
+
+ /** 棰樼洰鍐呭 **/
+ @ExcelIgnore
+ private String questionContent;
+
+ /** 閫夐」鍐呭 **/
+ @ExcelProperty({"棰樼洰閫夐」", "閫夐」"})
+ private String optionName;
+
+ @ExcelProperty({"棰樼洰閫夐」", "閫夐」鍊�"})
+ private String optionValue;
+
+ @ExcelProperty("绛旀(澶氫釜鐢ㄣ�侀殧寮�)")
+ private String correct;
+
+ /** 瑙f瀽 **/
+ @ColumnWidth(30)
+ @ExcelProperty("瑙f瀽")
+ private String analyze;
+
+ /** 棰樼洰鍒嗘暟 **/
+ @ExcelProperty("棰樼洰鍒嗘暟")
+ private Integer score;
+
+ /** 棰樼洰闅惧害 **/
+ @ExcelProperty("棰樼洰闅惧害")
+ private Integer difficult;
+
+ /**
+ * 杩斿洖璇ユ潯鏁版嵁鏄笉鏄锛屽洜涓鸿繕鏈夐�夐」銆傞�夐」鐨勮繖浜涘�兼槸绌虹殑
+ */
+ public boolean master() {
+ return StringUtils.hasText(questionType) && StringUtils.hasText(label);
+ }
+
+ public boolean intact() {
+ return StringUtils.hasText(title) && StringUtils.hasText(correct);
+ }
+
+}
diff --git a/src/main/java/com/ycl/jxkg/domain/vo/admin/exam/QuestionImportVO.java b/src/main/java/com/ycl/jxkg/domain/vo/admin/exam/QuestionImportVO.java
index 0275355..966ccc8 100644
--- a/src/main/java/com/ycl/jxkg/domain/vo/admin/exam/QuestionImportVO.java
+++ b/src/main/java/com/ycl/jxkg/domain/vo/admin/exam/QuestionImportVO.java
@@ -9,8 +9,6 @@
import lombok.Data;
import org.springframework.util.StringUtils;
-import java.util.List;
-
/**
* @author gonghl
* @since 2024-7-4
@@ -20,19 +18,11 @@
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)
public class QuestionImportVO {
- @ExcelProperty("鏍囬")
- private String label;
-
@ExcelProperty("棰樼洰绫诲瀷")
private String questionType;
@ExcelProperty("绉戠洰")
private String subject;
-
- @ExcelIgnore
- private List<Integer> subjectIds;
- @ExcelIgnore
- private List<String> subjectList;
@ColumnWidth(80)
@ExcelProperty("棰樺共")
@@ -68,10 +58,6 @@
/**
* 杩斿洖璇ユ潯鏁版嵁鏄笉鏄锛屽洜涓鸿繕鏈夐�夐」銆傞�夐」鐨勮繖浜涘�兼槸绌虹殑
*/
- public boolean master() {
- return StringUtils.hasText(questionType) && StringUtils.hasText(label);
- }
-
public boolean intact() {
return StringUtils.hasText(title) && StringUtils.hasText(correct);
}
diff --git a/src/main/java/com/ycl/jxkg/excel/PaperSelectExcel.java b/src/main/java/com/ycl/jxkg/excel/PaperSelectExcel.java
new file mode 100644
index 0000000..21433ea
--- /dev/null
+++ b/src/main/java/com/ycl/jxkg/excel/PaperSelectExcel.java
@@ -0,0 +1,77 @@
+package com.ycl.jxkg.excel;
+
+import com.alibaba.excel.metadata.Head;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.write.handler.CellWriteHandler;
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddressList;
+
+import java.util.List;
+
+/**
+ * 璁剧疆easy-excel涓嬫媺澶勭悊鍣�
+ *
+ * @author锛歺p
+ * @date锛�2024/3/15 17:27
+ */
+public class PaperSelectExcel implements CellWriteHandler {
+
+ /**
+ * 棰樼洰绫诲瀷
+ */
+ private String[] questionTypeList = {"鍗曢�夐", "澶氶�夐", "鍒ゆ柇棰�"};
+ /**
+ * 璇剧洰
+ */
+ private List<String> subjectNameList;
+ /**
+ * 閫夐」涓嬫媺鏁版嵁
+ */
+ private String[] optionList = {"A","B","C","D","E","F","G","H"};
+
+ public PaperSelectExcel(List subjectNameList) {
+ this.subjectNameList = subjectNameList;
+ }
+
+ @Override
+ public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
+ // 鑾峰彇sheet瀵硅薄
+ Sheet sheet = writeSheetHolder.getSheet();
+
+
+ // 鑾峰彇鏁版嵁鏍¢獙helper锛宔xcel鐨勪笅鎷夊氨鏄�氳繃鏁版嵁鏍¢獙璁剧疆
+ DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper();
+
+ // 璁剧疆棰樼洰涓嬫媺鑼冨洿锛岀涓�鍒楋紝1500琛屽唴
+ CellRangeAddressList questionTypeRange = new CellRangeAddressList(1, 1500, 1, 1);
+ // 娣诲姞棰樼洰涓嬫媺
+ DataValidationConstraint questionConstraint = dataValidationHelper.createExplicitListConstraint(questionTypeList);
+ DataValidation questionValidation = dataValidationHelper.createValidation(questionConstraint, questionTypeRange);
+ sheet.addValidationData(questionValidation);
+
+
+ // 璁剧疆璇剧洰涓嬫媺鑼冨洿锛岀2鍒楋紝1500琛屽唴
+ CellRangeAddressList subjectTypeRange = new CellRangeAddressList(1, 1500, 2, 2);
+ // 娣诲姞璇剧洰涓嬫媺
+ DataValidationConstraint subjectConstraint = dataValidationHelper.createExplicitListConstraint(subjectNameList.toArray((new String[0])));
+ DataValidation subjectValidation = dataValidationHelper.createValidation(subjectConstraint, subjectTypeRange);
+ sheet.addValidationData(subjectValidation);
+
+ // 璁剧疆閫夐」涓嬫媺鑼冨洿锛岀4鍒楋紝1500琛屽唴
+ CellRangeAddressList optionRange = new CellRangeAddressList(2, 1500, 4, 4);
+ // 娣诲姞閫夐」涓嬫媺
+ DataValidationConstraint optionConstraint = dataValidationHelper.createExplicitListConstraint(optionList);
+ DataValidation optionValidation = dataValidationHelper.createValidation(optionConstraint, optionRange);
+ sheet.addValidationData(optionValidation);
+
+ // 璁剧疆閫夐」涓嬫媺鑼冨洿锛岀4鍒楋紝1500琛屽唴
+ CellRangeAddressList answerRange = new CellRangeAddressList(2, 1500, 6, 6);
+ // 娣诲姞閫夐」涓嬫媺
+ DataValidationConstraint answerConstraint = dataValidationHelper.createExplicitListConstraint(optionList);
+ DataValidation answerValidation = dataValidationHelper.createValidation(answerConstraint, answerRange);
+ sheet.addValidationData(answerValidation);
+
+ }
+}
diff --git a/src/main/java/com/ycl/jxkg/mapper/QuestionMapper.java b/src/main/java/com/ycl/jxkg/mapper/QuestionMapper.java
index 124be48..721dbd0 100644
--- a/src/main/java/com/ycl/jxkg/mapper/QuestionMapper.java
+++ b/src/main/java/com/ycl/jxkg/mapper/QuestionMapper.java
@@ -4,8 +4,8 @@
import com.ycl.jxkg.domain.entity.Question;
import com.ycl.jxkg.domain.other.KeyValue;
import com.ycl.jxkg.domain.question.RandomQuestionDTO;
+import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperImportVO;
import com.ycl.jxkg.domain.vo.admin.exam.QuestionExportVO;
-import com.ycl.jxkg.domain.vo.admin.exam.QuestionImportVO;
import com.ycl.jxkg.domain.vo.admin.question.QuestionPageRequestVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -44,6 +44,6 @@
*/
List<Question> getRandomQuestion(@Param("subjectId") Integer subjectId, @Param("questionType") Integer questionType,@Param("difficult") Integer difficult, @Param("num") Integer num);
- List<QuestionImportVO> export(@Param("query") QuestionExportVO query);
+ List<ExamPaperImportVO> export(@Param("query") QuestionExportVO query);
}
diff --git a/src/main/java/com/ycl/jxkg/service/QuestionService.java b/src/main/java/com/ycl/jxkg/service/QuestionService.java
index 08822d8..f24eb9d 100644
--- a/src/main/java/com/ycl/jxkg/service/QuestionService.java
+++ b/src/main/java/com/ycl/jxkg/service/QuestionService.java
@@ -2,13 +2,16 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
+import com.ycl.jxkg.base.Result;
import com.ycl.jxkg.domain.entity.Question;
import com.ycl.jxkg.domain.vo.admin.exam.QuestionExportVO;
-import com.ycl.jxkg.domain.vo.admin.exam.QuestionImportVO;
+import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperImportVO;
import com.ycl.jxkg.domain.vo.admin.question.QuestionEditRequestVO;
import com.ycl.jxkg.domain.vo.admin.question.QuestionPageRequestVO;
import com.ycl.jxkg.domain.vo.admin.question.QuestionResponseVO;
+import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletResponse;
import java.util.List;
public interface QuestionService extends IService<Question> {
@@ -39,6 +42,19 @@
* @param query 鏌ヨ鏉′欢
* @return 棰樼洰
*/
- List<QuestionImportVO> export(QuestionExportVO query);
+ List<ExamPaperImportVO> export(QuestionExportVO query);
+
+ /**
+ * 瀵煎叆棰樼洰
+ * @param file excel
+ * @return 瀵煎叆缁撴灉
+ */
+ Result<Boolean> importQuestion(MultipartFile file);
+
+ /**
+ * 涓嬭浇瀵煎叆棰樼洰妯℃澘
+ * @param response 缁撴灉
+ */
+ void importTemplate(HttpServletResponse response);
}
diff --git a/src/main/java/com/ycl/jxkg/service/impl/ExamPaperServiceImpl.java b/src/main/java/com/ycl/jxkg/service/impl/ExamPaperServiceImpl.java
index 4e85c14..612d808 100644
--- a/src/main/java/com/ycl/jxkg/service/impl/ExamPaperServiceImpl.java
+++ b/src/main/java/com/ycl/jxkg/service/impl/ExamPaperServiceImpl.java
@@ -350,9 +350,10 @@
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
// 鏋勫缓妯℃澘鏍蜂緥鏁版嵁
- List<QuestionImportVO> data = new ArrayList<>(8);
- QuestionImportVO questionImportVO = new QuestionImportVO();
+ List<ExamPaperImportVO> data = new ArrayList<>(8);
+ ExamPaperImportVO questionImportVO = new ExamPaperImportVO();
questionImportVO.setLabel("鏍囬1");
+ questionImportVO.setSubject("璇枃");
questionImportVO.setQuestionType("鍗曢�夐");
questionImportVO.setDifficult(2);
questionImportVO.setCorrect("A");
@@ -363,23 +364,27 @@
questionImportVO.setOptionValue("閫夋垜");
data.add(questionImportVO);
- QuestionImportVO questionImport1 = new QuestionImportVO();
+ ExamPaperImportVO questionImport1 = new ExamPaperImportVO();
questionImport1.setOptionName("B");
questionImport1.setOptionValue("閫塀");
data.add(questionImport1);
- QuestionImportVO questionImport2 = new QuestionImportVO();
+ ExamPaperImportVO questionImport2 = new ExamPaperImportVO();
questionImport2.setOptionName("C");
questionImport2.setOptionValue("閫塁");
data.add(questionImport2);
- QuestionImportVO questionImport3 = new QuestionImportVO();
+ ExamPaperImportVO questionImport3 = new ExamPaperImportVO();
questionImport3.setOptionName("D");
questionImport3.setOptionValue("閫塂");
data.add(questionImport3);
- EasyExcel.write(response.getOutputStream(), QuestionImportVO.class)
+ // 鏌ュ嚭鎵�鏈夌殑璇剧洰锛坋xcel涓嬫媺鏁版嵁锛�
+ List<Subject> subjects = subjectService.list();
+ List<String> subjectNameList = subjects.stream().map(Subject::getName).collect(Collectors.toList());
+ EasyExcel.write(response.getOutputStream(), ExamPaperImportVO.class)
.sheet("妯℃澘")
+ .registerWriteHandler(new PaperSelectExcel(subjectNameList))
.registerWriteHandler(new FixedMergeCellStrategy(2, 4, Arrays.asList(2, 3, 6, 7, 8, 9)))
.registerWriteHandler(new FixedMergeCellStrategy(2, 20, Arrays.asList(0, 1)))
.doWrite(data);
@@ -389,13 +394,13 @@
@SneakyThrows
public void export(QuestionExportVO query, HttpServletResponse response) {
// 鏌ヨ瀵煎嚭鏁版嵁
- List<QuestionImportVO> exportData = questionService.export(query);
+ List<ExamPaperImportVO> exportData = questionService.export(query);
// 鏋勫缓鏁版嵁
- List<QuestionImportVO> exportList = new ArrayList<>(exportData.size() * 4);
+ List<ExamPaperImportVO> exportList = new ArrayList<>(exportData.size() * 4);
// 琛屽悎骞惰鍒�
List<RowItem> mergeRowList = new ArrayList<>(exportData.size());
int j = 2;
- for (QuestionImportVO data : exportData) {
+ for (ExamPaperImportVO data : exportData) {
QuestionObject questionContent = JSON.parseObject(data.getQuestionContent(), QuestionObject.class);
RowItem rowItem = new RowItem();
@@ -407,7 +412,7 @@
int i = 0;
for (QuestionItemObject option : questionContent.getQuestionItemObjects()) {
if (i == 0) {
- QuestionImportVO master = new QuestionImportVO();
+ ExamPaperImportVO master = new ExamPaperImportVO();
BeanUtils.copyProperties(data, master);
if (org.springframework.util.StringUtils.hasText(data.getQuestionType())) {
master.setQuestionType(QuestionTypeEnum.fromCode(Integer.valueOf(data.getQuestionType())).getName());
@@ -421,7 +426,7 @@
master.setScore(score.divide(BigDecimal.TEN).intValue());
exportList.add(master);
} else {
- QuestionImportVO optionItem = new QuestionImportVO();
+ ExamPaperImportVO optionItem = new ExamPaperImportVO();
optionItem.setOptionName(option.getPrefix());
optionItem.setOptionValue(option.getContent());
exportList.add(optionItem);
@@ -438,7 +443,7 @@
// 鏌ュ嚭鎵�鏈夌殑璇剧洰锛坋xcel涓嬫媺鏁版嵁锛�
List<Subject> subjects = subjectService.list();
List<String> subjectNameList = subjects.stream().map(Subject::getName).collect(Collectors.toList());
- EasyExcel.write(response.getOutputStream(), QuestionImportVO.class)
+ EasyExcel.write(response.getOutputStream(), ExamPaperImportVO.class)
.sheet("棰樼洰瀵煎嚭鏁版嵁")
.registerWriteHandler(new SelectExcel(subjectNameList))
.registerWriteHandler(new DynamicMergeCellStrategy(mergeRowList, Arrays.asList(0, 1, 2, 5, 6, 7, 8)))
@@ -459,11 +464,11 @@
// 涓�寮犺瘯鍗峰涓爣棰�
ArrayList<PaperFixQuestionDTO> list = new ArrayList<>();
- Consumer<List<QuestionImportVO>> consumer = (data) -> {
+ Consumer<List<ExamPaperImportVO>> consumer = (data) -> {
// 寰幆姣忎竴琛�
for (int i = 0; i < data.size(); i++) {
// 璇诲彇鐨勯鐩�
- QuestionImportVO excelQuestion = data.get(i);
+ ExamPaperImportVO excelQuestion = data.get(i);
String questionType = excelQuestion.getQuestionType();
String label = excelQuestion.getLabel();
// 鍒ゆ柇鏄惁鏍囬
@@ -491,7 +496,7 @@
if (i + 1 == data.size()) {
break;
}
- QuestionImportVO nextQuestion = data.get(1 + i);
+ ExamPaperImportVO nextQuestion = data.get(1 + i);
if (nextQuestion.intact()) {
break;
}
@@ -526,7 +531,7 @@
question.setDeleted(0);
question.setQuestionType(QuestionTypeEnum.get(questionType));
// 鏍规嵁绉戠洰鍚嶇О鑾峰彇id
- QuestionImportVO finalExcelQuestion = excelQuestion;
+ ExamPaperImportVO finalExcelQuestion = excelQuestion;
question.setSubjectId(subjects.stream().filter(subject -> subject.getName().equals(finalExcelQuestion.getSubject())).findFirst().get().getId());
questions.add(question);
@@ -537,6 +542,7 @@
paperQuestion.setScore(BigDecimal.valueOf(excelQuestion.getScore()));
paperQuestions.add(paperQuestion);
}
+ // 涓嬩竴鏉℃暟鎹槸鏍囬
if (i + 1 == data.size() || data.get(i + 1).master()) {
break;
}
@@ -552,7 +558,7 @@
}
}
};
- EasyExcel.read(file.getInputStream(), QuestionImportVO.class, new CurrencyDataListener(consumer)).sheet("妯℃澘").doRead();
+ EasyExcel.read(file.getInputStream(), ExamPaperImportVO.class, new CurrencyDataListener(consumer)).sheet("妯℃澘").doRead();
// 淇濆瓨棰樼洰
questionService.saveBatch(questions);
// 淇濆瓨璇曞嵎
diff --git a/src/main/java/com/ycl/jxkg/service/impl/QuestionServiceImpl.java b/src/main/java/com/ycl/jxkg/service/impl/QuestionServiceImpl.java
index 755ede6..d2d447e 100644
--- a/src/main/java/com/ycl/jxkg/service/impl/QuestionServiceImpl.java
+++ b/src/main/java/com/ycl/jxkg/service/impl/QuestionServiceImpl.java
@@ -1,13 +1,18 @@
package com.ycl.jxkg.service.impl;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
+import com.ycl.jxkg.base.Result;
import com.ycl.jxkg.domain.entity.Question;
+import com.ycl.jxkg.domain.entity.Subject;
import com.ycl.jxkg.domain.other.KeyValue;
import com.ycl.jxkg.domain.question.QuestionItemObject;
import com.ycl.jxkg.domain.question.QuestionObject;
+import com.ycl.jxkg.domain.vo.admin.exam.ExamPaperImportVO;
import com.ycl.jxkg.domain.vo.admin.exam.QuestionExportVO;
import com.ycl.jxkg.domain.vo.admin.exam.QuestionImportVO;
import com.ycl.jxkg.domain.vo.admin.question.QuestionEditItemVO;
@@ -16,19 +21,30 @@
import com.ycl.jxkg.domain.vo.admin.question.QuestionResponseVO;
import com.ycl.jxkg.enums.QuestionTypeEnum;
import com.ycl.jxkg.enums.general.StatusEnum;
+import com.ycl.jxkg.excel.CurrencyDataListener;
+import com.ycl.jxkg.excel.FixedMergeCellStrategy;
+import com.ycl.jxkg.excel.SelectExcel;
import com.ycl.jxkg.mapper.QuestionMapper;
import com.ycl.jxkg.service.QuestionService;
+import com.ycl.jxkg.service.SubjectService;
import com.ycl.jxkg.utils.DateTimeUtil;
import com.ycl.jxkg.utils.ExamUtil;
import com.ycl.jxkg.utils.HtmlUtil;
import com.ycl.jxkg.utils.JsonUtil;
import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Date;
import java.util.List;
+import java.util.function.Consumer;
import java.util.stream.Collectors;
@Service
@@ -36,7 +52,7 @@
public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> implements QuestionService {
private final QuestionMapper questionMapper;
-
+ private final SubjectService subjectService;
@Override
public PageInfo<QuestionResponseVO> page(QuestionPageRequestVO requestVM) {
@@ -182,8 +198,137 @@
}
@Override
- public List<QuestionImportVO> export(QuestionExportVO query) {
+ public List<ExamPaperImportVO> export(QuestionExportVO query) {
return questionMapper.export(query);
}
+ @Override
+ @Transactional
+ @SneakyThrows
+ public Result<Boolean> importQuestion(MultipartFile file) {
+ List<Subject> subjects = subjectService.list();
+ // 棰樼洰闆嗗悎鐢ㄤ簬鎵归噺淇濆瓨
+ ArrayList<Question> questions = new ArrayList<>();
+ Consumer<List<QuestionImportVO>> consumer = (data) -> {
+ // 寰幆姣忎竴琛�
+ for (int i = 0; i < data.size(); i++) {
+ // 璇诲彇鐨勯鐩�
+ QuestionImportVO excelQuestion = data.get(i);
+ String questionType = excelQuestion.getQuestionType();
+ // 鍒ゆ柇鏄惁瀹屾暣棰樼洰
+ if (excelQuestion.intact()) {
+ // 寰幆棰樼洰
+ while (Boolean.TRUE) {
+ // 鏇存柊璇诲彇鐨勯鐩�
+ excelQuestion = data.get(i);
+ Question question = new Question();
+ // 璇ラ鐨勯�夐」
+ List<QuestionItemObject> options = new ArrayList<>(8);
+ // 閫夐」鍐呭
+ QuestionItemObject option = new QuestionItemObject();
+ option.setPrefix(excelQuestion.getOptionName());
+ option.setContent(excelQuestion.getOptionValue());
+ options.add(option);
+ // 寰幆閫夐」
+ while (Boolean.TRUE) {
+ // 鍒ゆ柇鏄惁鏄渶鍚庝竴鏉�
+ if (i + 1 == data.size()) {
+ break;
+ }
+ QuestionImportVO nextQuestion = data.get(1 + i);
+ if (nextQuestion.intact()) {
+ break;
+ }
+ QuestionItemObject nextOption = new QuestionItemObject();
+ nextOption.setPrefix(nextQuestion.getOptionName());
+ nextOption.setContent(nextQuestion.getOptionValue());
+ options.add(nextOption);
+ i++;
+ }
+ // 淇濆瓨棰樼洰鍐呭
+ QuestionObject questionObject = new QuestionObject();
+ questionObject.setQuestionItemObjects(options);
+ questionObject.setAnalyze(excelQuestion.getAnalyze());
+ questionObject.setTitleContent(excelQuestion.getTitle());
+ questionObject.setCorrect(excelQuestion.getCorrect());
+ question.setTitle(excelQuestion.getTitle());
+ question.setContent(JSON.toJSONString(questionObject));
+ question.setQuestionType(QuestionTypeEnum.get(excelQuestion.getQuestionType()));
+ // 绛旀(澶氶�夐渶瑕佺敤銆佸垎鍓蹭繚瀛樺瓧绗︿覆鍒版暟鎹簱)
+ String[] corrects = excelQuestion.getCorrect().split("銆�");
+ if (corrects.length > 1) {
+ question.setCorrect(String.join(",", corrects));
+ } else {
+ question.setCorrect(excelQuestion.getCorrect());
+ }
+ // 闅惧害
+ question.setDifficult(excelQuestion.getDifficult());
+ // 鍒涘缓浜�
+ question.setCreateUser(2);
+ question.setStatus(StatusEnum.ENABLE);
+ question.setCreateTime(new Date());
+ question.setDeleted(0);
+ question.setQuestionType(QuestionTypeEnum.get(questionType));
+ // 鏍规嵁绉戠洰鍚嶇О鑾峰彇id
+ QuestionImportVO finalExcelQuestion = excelQuestion;
+ question.setSubjectId(subjects.stream().filter(subject -> subject.getName().equals(finalExcelQuestion.getSubject())).findFirst().get().getId());
+ questions.add(question);
+ if (i + 1 == data.size() || data.get(i + 1).intact()) {
+ break;
+ }
+ i++;
+ }
+ }
+ }
+ };
+ EasyExcel.read(file.getInputStream(), QuestionImportVO.class, new CurrencyDataListener(consumer)).sheet("妯℃澘").doRead();
+ // 淇濆瓨棰樼洰
+ return Result.ok(saveBatch(questions));
+ }
+
+ @Override
+ @SneakyThrows
+ public void importTemplate(HttpServletResponse response) {
+ String fileName = URLEncoder.encode("璇曞嵎瀵煎叆妯℃澘", "UTF-8").replaceAll("\\+", "%20");
+ response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+
+ // 鏋勫缓妯℃澘鏍蜂緥鏁版嵁
+ List<QuestionImportVO> data = new ArrayList<>(8);
+ QuestionImportVO questionImportVO = new QuestionImportVO();
+ questionImportVO.setQuestionType("鍗曢�夐");
+ questionImportVO.setSubject("璇枃");
+ questionImportVO.setDifficult(2);
+ questionImportVO.setCorrect("A");
+ questionImportVO.setScore(2);
+ questionImportVO.setAnalyze("A鏄鐨�");
+ questionImportVO.setTitle("杩欐槸涓�閬撴祴璇曢鐩紝浣跨敤璇ユā鏉胯鍒犻櫎鎴栨浛鎹㈣繖閬撻");
+ questionImportVO.setOptionName("A");
+ questionImportVO.setOptionValue("閫夋垜");
+ data.add(questionImportVO);
+
+ QuestionImportVO questionImport1 = new QuestionImportVO();
+ questionImport1.setOptionName("B");
+ questionImport1.setOptionValue("閫塀");
+ data.add(questionImport1);
+
+ QuestionImportVO questionImport2 = new QuestionImportVO();
+ questionImport2.setOptionName("C");
+ questionImport2.setOptionValue("閫塁");
+ data.add(questionImport2);
+
+ QuestionImportVO questionImport3 = new QuestionImportVO();
+ questionImport3.setOptionName("D");
+ questionImport3.setOptionValue("閫塂");
+ data.add(questionImport3);
+
+ // 鏌ュ嚭鎵�鏈夌殑璇剧洰锛坋xcel涓嬫媺鏁版嵁锛�
+ List<Subject> subjects = subjectService.list();
+ 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(0, 1, 2, 5, 6, 7, 8)))
+ .doWrite(data);
+ }
+
}
diff --git a/src/main/resources/mapper/QuestionMapper.xml b/src/main/resources/mapper/QuestionMapper.xml
index dfb80da..59076e6 100644
--- a/src/main/resources/mapper/QuestionMapper.xml
+++ b/src/main/resources/mapper/QuestionMapper.xml
@@ -128,33 +128,13 @@
<collection property="subjectList" column="id" ofType="string" select="selectSubjects"/>
</resultMap>
- <resultMap id="exportMap" type="com.ycl.jxkg.domain.vo.admin.exam.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="export" resultMap="exportMap">
+ <select id="export" resultType="com.ycl.jxkg.domain.vo.admin.exam.ExamPaperImportVO">
SELECT
- DISTINCT
- q.*, ttc.content
- FROM
- t_question q
- INNER JOIN t_ex ttc on q.info_text_content_id = ttc.id AND q.deleted = 0
- <where>
- <if test="query.examPaperId != null">
- AND tqs.subject_id IN
- <foreach collection="query.subjectIds" open="(" separator="," close=")" item="subjectId">
- #{subjectId}
- </foreach>
- </if>
- </where>
+ q.*,
+ s.NAME AS SUBJECT
+ FROM t_question q
+ LEFT JOIN t_subject s ON subject_id = s.id
+ ORDER BY q.id
</select>
</mapper>
--
Gitblit v1.8.0