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