From 4ba127459ff1b77df9014444fdac7636d3f091bc Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期六, 16 三月 2024 15:05:19 +0800 Subject: [PATCH] 题目导入 --- src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 174 insertions(+), 4 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 1cdabdb..cd4d574 100644 --- a/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java +++ b/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java @@ -1,16 +1,25 @@ package com.mindskip.xzs.controller.admin; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.enums.CellExtraTypeEnum; import com.alibaba.excel.metadata.data.HyperlinkData; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.alibaba.fastjson.JSON; import com.mindskip.xzs.base.BaseApiController; import com.mindskip.xzs.base.RestResponse; import com.mindskip.xzs.base.SystemCode; +import com.mindskip.xzs.context.WebContext; import com.mindskip.xzs.domain.Question; +import com.mindskip.xzs.domain.QuestionSubject; import com.mindskip.xzs.domain.Subject; import com.mindskip.xzs.domain.TextContent; import com.mindskip.xzs.domain.enums.QuestionSourceEnum; +import com.mindskip.xzs.domain.enums.QuestionStatusEnum; 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.repository.DepartmentMapper; import com.mindskip.xzs.repository.SubjectMapper; @@ -24,7 +33,10 @@ import com.mindskip.xzs.vo.QuestionImportVO; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -33,9 +45,8 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.util.*; +import java.util.function.Consumer; import java.util.stream.Collectors; @RestController("AdminQuestionController") @@ -50,6 +61,8 @@ private final DepartmentMapper departmentMapper; private final QuestionSubjectService questionSubjectService; + + private static final String SPLIT = "銆�"; @Autowired public QuestionController(QuestionService questionService, TextContentService textContentService, SubjectMapper subjectMapper, DepartmentMapper departmentMapper, QuestionSubjectService questionSubjectService) { @@ -130,11 +143,168 @@ return RestResponse.ok(); } + /** + * 涓嬭浇棰樼洰瀵煎叆妯℃澘 + * + * @param response + * @throws IOException + */ @GetMapping("/download/question/import/temp") public void getImportTemp(HttpServletResponse response) throws IOException { String fileName = URLEncoder.encode("棰樼洰瀵煎叆妯℃澘", "UTF-8").replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - EasyExcel.write(response.getOutputStream(), QuestionImportVO.class).registerWriteHandler(new SelectExcel()).sheet("妯℃澘").doWrite(new ArrayList()); + + // 鏋勫缓妯℃澘鏍蜂緥鏁版嵁 + 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(); + 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(1, 2, 3, 6, 7, 8, 9))) + .doWrite(data); + } + + /** + * 棰樼洰瀵煎叆 + * + * easyexcel瀵煎叆涓�瀵瑰锛屾瘮濡備竴涓鐩紝鍥涗釜閫夐」銆傞偅涔堣鍙栧埌鐨勬暟鎹氨鏈夊洓鏉★紝绗竴鏉℃暟鎹槸榻愬叏鐨勩�傚悗闈笁鏉″彧鏈夐�夐」鏈夊�� + * @param file + * @throws IOException + */ + @PostMapping("/question/import") + @Transactional(rollbackFor = Exception.class) + public RestResponse importQuestion(@RequestPart("file") MultipartFile file) throws IOException { + Consumer<List<QuestionImportVO>> consumer = (data) -> { + // 棰樼洰鐨勮鐩俊鎭� + List<QuestionSubject> questionSubjectsList = new ArrayList<>(48); + for (int i = 0; i < data.size(); i++) { + // 棰樼洰瀹炰綋 + Question question = new Question(); + // 璇诲彇鐨勯鐩� + QuestionImportVO excelQuestion = data.get(i); + + // 濡傛灉鏄涓�鏉″畬鏁存暟鎹紝閭d箞缁х画寰�鍚庤鍙栭�夐」鍐呭 + if (excelQuestion.master()) { + // 璇ラ鐨勯�夐」 + List<QuestionItemObject> options = new ArrayList<>(4); + // 閫夐」鍐呭 + QuestionItemObject option = new QuestionItemObject(); + option.setPrefix(excelQuestion.getOptionName()); + option.setContent(excelQuestion.getOptionValue()); + options.add(option); + int next = 1; + // 缁х画寰�鍚庤閫夐」 + while (Boolean.TRUE) { + // 鍒ゆ柇鏄惁鏄渶鍚庝竴鏉� + if (next + i == data.size()) { + break; + } + QuestionImportVO nextQuestion = data.get(next + i); + if (nextQuestion.master()) { + break; + } + QuestionItemObject nextOption = new QuestionItemObject(); + nextOption.setPrefix(nextQuestion.getOptionName()); + nextOption.setContent(nextQuestion.getOptionValue()); + options.add(nextOption); + next++; + } + i += next; + + // 淇濆瓨棰樼洰鍐呭 + QuestionObject questionObject = new QuestionObject(); + questionObject.setQuestionItemObjects(options); + questionObject.setAnalyze(excelQuestion.getAnalyze()); + questionObject.setTitleContent(excelQuestion.getTitle()); + questionObject.setCorrect(excelQuestion.getCorrect()); + + TextContent textContent = new TextContent(); + textContent.setContent(JSON.toJSONString(questionObject)); + textContent.setCreateTime(new Date()); + textContentService.insert(textContent); + + // 淇濆瓨棰樼洰淇℃伅 + // 璁剧疆棰樺瀷 + question.setQuestionType(QuestionTypeEnum.get(excelQuestion.getQuestionType())); + // 绛旀(澶氶�夐渶瑕佺敤,鍒嗗壊淇濆瓨瀛楃涓插埌鏁版嵁搴�) + String[] corrects = excelQuestion.getCorrect().split(SPLIT); + if (corrects.length > 1) { + question.setCorrect(Arrays.asList(corrects).stream().collect(Collectors.joining(","))); + } else { + question.setCorrect(excelQuestion.getCorrect()); + } + + // 闅惧害 + question.setDifficult(excelQuestion.getDifficult()); + // 鍒嗘暟 + question.setScore(ExamUtil.scoreFromVM(String.valueOf(excelQuestion.getScore()))); + // 鍒涘缓浜� + question.setCreateUser(1); + question.setStatus(QuestionStatusEnum.OK.getCode()); + question.setCreateTime(new Date()); + question.setDeleted(Boolean.FALSE); + question.setInfoTextContentId(textContent.getId()); + questionService.insert(question); + + + // 鏌ュ嚭鎵�鏈夌殑璇剧洰 + List<Subject> subjects = subjectMapper.allSubject(); + List<String> subjectNames = Arrays.asList(excelQuestion.getSubjectName().split(SPLIT)); + List<Subject> targetSubject = subjects.stream() + .filter(subject -> subjectNames.contains(subject.getName())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(targetSubject)) { + // todo 璁板綍杩欎釜閿欒 + continue; + } + // 鏋勫缓璇剧洰-棰樼洰淇℃伅 + questionSubjectsList = targetSubject.stream().map(subject -> { + QuestionSubject questionSubject = new QuestionSubject(); + questionSubject.setQuestionId(question.getId()); + questionSubject.setSubjectId(subject.getId()); + questionSubject.setDeleted(0); + return questionSubject; + }).collect(Collectors.toList()); + } + System.out.println(question); + } + // 鎵归噺淇濆瓨棰樼洰-璇剧洰淇℃伅 + if (! CollectionUtils.isEmpty(questionSubjectsList)) { + questionSubjectService.saves(questionSubjectsList); + } + }; + EasyExcel.read(file.getInputStream(), QuestionImportVO.class, new CurrencyDataListener(consumer)).sheet("妯℃澘").doRead(); + return RestResponse.ok(); } @PostMapping("/import") -- Gitblit v1.8.0