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/excel/CurrencyDataListener.java | 105 +++++++++++ src/main/java/com/mindskip/xzs/excel/SelectExcel.java | 42 +++ src/main/java/com/mindskip/xzs/viewmodel/admin/question/ExamQuestionVO.java | 34 +++ src/main/java/com/mindskip/xzs/configuration/spring/security/SecurityConfigurer.java | 8 src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java | 42 ++-- src/main/java/com/mindskip/xzs/excel/FixedMergeCellStrategy.java | 45 +++++ src/main/java/com/mindskip/xzs/vo/QuestionImportVO.java | 45 ++-- src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java | 178 +++++++++++++++++++ src/main/java/com/mindskip/xzs/vo/OptionAndValueVO.java | 20 ++ 9 files changed, 461 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/mindskip/xzs/configuration/spring/security/SecurityConfigurer.java b/src/main/java/com/mindskip/xzs/configuration/spring/security/SecurityConfigurer.java index 97e109b..1cb3769 100644 --- a/src/main/java/com/mindskip/xzs/configuration/spring/security/SecurityConfigurer.java +++ b/src/main/java/com/mindskip/xzs/configuration/spring/security/SecurityConfigurer.java @@ -79,7 +79,13 @@ .and().authenticationProvider(restAuthenticationProvider) .authorizeRequests() .antMatchers(securityIgnoreUrls.toArray(ignores)).permitAll() - .antMatchers("/api/admin/department/list", "/api/admin/video/getList","/api/admin/user/conversion","/api/admin/examPaperGrade/updates","/api/admin/question/download/question/import/temp").permitAll() + .antMatchers("/api/admin/department/list", + "/api/admin/video/getList", + "/api/admin/user/conversion", + "/api/admin/examPaperGrade/updates", + "/api/admin/question/download/question/import/temp", + "/api/admin/question/question/import" + ).permitAll() // todo 璁剧疆閮ㄩ棬绠$悊鍛樺彲浠ョ湅鐨勮姹� .antMatchers("/api/admin/**").hasAnyRole(RoleEnum.ADMIN.getName(), RoleEnum.DEPT_ADMIN.getName()) .antMatchers("/api/student/**").hasRole(RoleEnum.STUDENT.getName()) 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") diff --git a/src/main/java/com/mindskip/xzs/excel/CurrencyDataListener.java b/src/main/java/com/mindskip/xzs/excel/CurrencyDataListener.java new file mode 100644 index 0000000..424645d --- /dev/null +++ b/src/main/java/com/mindskip/xzs/excel/CurrencyDataListener.java @@ -0,0 +1,105 @@ +package com.mindskip.xzs.excel; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.read.listener.ReadListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; + +/** + * easyExcel 澶氳〃閫氱敤璇诲彇鐩戝惉鍣� + * + * @author xp + */ +public class CurrencyDataListener<T> implements ReadListener<T> { + + + private Consumer consumer; + + /** + * 姣忛殧100鏉″瓨鍌ㄦ暟鎹簱锛岀劧鍚庢竻鐞唋ist 锛屾柟渚垮唴瀛樺洖鏀� + */ + private static final int BATCH_COUNT = 100; + + /** + * 缂撳瓨鐨勬暟鎹� + */ + private List<T> cachedDataList = new ArrayList<>(BATCH_COUNT); + + private final static Logger log = LoggerFactory.getLogger(CurrencyDataListener.class); + + public CurrencyDataListener(Consumer<List<T>> consumer) { + this.consumer = consumer; + } + + /** + * 璇诲彇鍑虹幇寮傚父澶勭悊 + * + * @param e + * @param analysisContext + * @throws Exception + */ + @Override + public void onException(Exception e, AnalysisContext analysisContext) throws Exception { + + } + + /** + * 澶勭悊琛ㄥご + * @param map + * @param analysisContext + */ + @Override + public void invokeHead(Map<Integer, ReadCellData<?>> map, AnalysisContext analysisContext) { + + } + + /** + * 璇诲彇鏁版嵁,姣忎竴鏉℃暟鎹В鏋愰兘浼氭潵璋冪敤 + * + * @param data + * @param analysisContext + */ + @Override + public void invoke(T data, AnalysisContext analysisContext) { + cachedDataList.add(data); + // 杈惧埌BATCH_COUNT浜嗭紝闇�瑕佸幓瀛樺偍涓�娆℃暟鎹簱锛岄槻姝㈡暟鎹嚑涓囨潯鏁版嵁鍦ㄥ唴瀛橈紝瀹规槗OOM + if (cachedDataList.size() >= BATCH_COUNT) { + try { + // 蹇呴』瑕佹崟鑾峰紓甯革紝鍚﹀垯鍒楄〃涓嶄細娓呯┖ + saveData(); + } catch (Exception e) { + e.printStackTrace(); + } + // 瀛樺偍瀹屾垚娓呯悊 list + cachedDataList = new ArrayList<>(BATCH_COUNT); + } + } + + /** + * 璇诲彇瀹屾垚 + * + * @param analysisContext + */ + @Override + public void doAfterAllAnalysed(AnalysisContext analysisContext) { + saveData(); + log.info("鎵�鏈夋暟鎹В鏋愬畬鎴愶紒"); + } + + @Override + public boolean hasNext(AnalysisContext analysisContext) { + return true; + } + + private void saveData() { + log.info("{}鏉℃暟鎹紝寮�濮嬪瓨鍌ㄦ暟鎹簱锛�", cachedDataList.size()); + consumer.accept(cachedDataList); + log.info("瀛樺偍鏁版嵁搴撴垚鍔燂紒"); + } +} diff --git a/src/main/java/com/mindskip/xzs/excel/FixedMergeCellStrategy.java b/src/main/java/com/mindskip/xzs/excel/FixedMergeCellStrategy.java new file mode 100644 index 0000000..3e3f68f --- /dev/null +++ b/src/main/java/com/mindskip/xzs/excel/FixedMergeCellStrategy.java @@ -0,0 +1,45 @@ +package com.mindskip.xzs.excel; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.write.merge.AbstractMergeStrategy; +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 FixedMergeCellStrategy extends AbstractMergeStrategy { + + /** + * 璧峰浣嶇疆 + */ + private Integer startRow; + + /** + * 鍚堝苟澶氬皯琛� + */ + private Integer mergeRowNumber; + + /** + * 鍝簺鍒楅渶瑕佸悎骞惰 + */ + private List<Integer> mergeWhichColumn; + + public FixedMergeCellStrategy(Integer startRow, Integer mergeRowNumber, List<Integer> mergeWhichColumn) { + this.startRow = startRow; + this.mergeRowNumber = mergeRowNumber; + this.mergeWhichColumn = mergeWhichColumn; + } + + @Override + protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) { + for (Integer whichColumn : mergeWhichColumn) { + CellRangeAddress cellRangeAddress = new CellRangeAddress(startRow, startRow + mergeRowNumber - 1, whichColumn - 1, whichColumn - 1); + sheet.addMergedRegionUnsafe(cellRangeAddress); + } + } +} diff --git a/src/main/java/com/mindskip/xzs/excel/SelectExcel.java b/src/main/java/com/mindskip/xzs/excel/SelectExcel.java index 4ad8e22..0c91aeb 100644 --- a/src/main/java/com/mindskip/xzs/excel/SelectExcel.java +++ b/src/main/java/com/mindskip/xzs/excel/SelectExcel.java @@ -22,8 +22,22 @@ */ public class SelectExcel implements CellWriteHandler { - private String[] questionTypeList = {"鍗曢��", "澶氶��", "鍒ゆ柇"}; - private String[] subjectTypeList = {"a","b"}; + /** + * 棰樼洰绫诲瀷 + */ + private String[] questionTypeList = {"鍗曢�夐", "澶氶�夐", "鍒ゆ柇棰�"}; + /** + * 璇剧洰 + */ + private List<String> subjectNameList; + /** + * 閫夐」涓嬫媺鏁版嵁 + */ + private String[] optionList = {"A","B","C","D","E","F","G","H"}; + + public SelectExcel(List subjectNameList) { + this.subjectNameList = subjectNameList; + } @Override public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { @@ -34,20 +48,34 @@ // 鑾峰彇鏁版嵁鏍¢獙helper DataValidationHelper dataValidationHelper = sheet.getDataValidationHelper(); - // 璁剧疆棰樼洰涓嬫媺鑼冨洿锛岀涓�鍒楋紝500琛屽唴 - CellRangeAddressList questionTypeRange = new CellRangeAddressList(0, 500, 0, 0); + // 璁剧疆棰樼洰涓嬫媺鑼冨洿锛岀涓�鍒楋紝1500琛屽唴 + CellRangeAddressList questionTypeRange = new CellRangeAddressList(1, 1500, 0, 0); // 娣诲姞棰樼洰涓嬫媺 DataValidationConstraint questionConstraint = dataValidationHelper.createExplicitListConstraint(questionTypeList); DataValidation questionValidation = dataValidationHelper.createValidation(questionConstraint, questionTypeRange); sheet.addValidationData(questionValidation); - // 璁剧疆璇剧洰涓嬫媺鑼冨洿锛岀2鍒楋紝500琛屽唴 - CellRangeAddressList subjectTypeRange = new CellRangeAddressList(0, 500, 1, 1); + // 璁剧疆璇剧洰涓嬫媺鑼冨洿锛岀2鍒楋紝1500琛屽唴 + CellRangeAddressList subjectTypeRange = new CellRangeAddressList(1, 1500, 1, 1); // 娣诲姞璇剧洰涓嬫媺 - DataValidationConstraint subjectConstraint = dataValidationHelper.createExplicitListConstraint(subjectTypeList); + 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, 3, 3); + // 娣诲姞閫夐」涓嬫媺 + DataValidationConstraint optionConstraint = dataValidationHelper.createExplicitListConstraint(optionList); + DataValidation optionValidation = dataValidationHelper.createValidation(optionConstraint, optionRange); + sheet.addValidationData(optionValidation); + + // 璁剧疆閫夐」涓嬫媺鑼冨洿锛岀4鍒楋紝1500琛屽唴 + CellRangeAddressList answerRange = new CellRangeAddressList(2, 1500, 5, 5); + // 娣诲姞閫夐」涓嬫媺 + DataValidationConstraint answerConstraint = dataValidationHelper.createExplicitListConstraint(optionList); + DataValidation answerValidation = dataValidationHelper.createValidation(answerConstraint, answerRange); + sheet.addValidationData(answerValidation); + } } 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 98e5ac6..bdfb0fa 100644 --- a/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java +++ b/src/main/java/com/mindskip/xzs/service/impl/QuestionServiceImpl.java @@ -156,27 +156,27 @@ questionEditRequestVM.setTitle(questionObject.getTitleContent()); //绛旀 -// QuestionTypeEnum questionTypeEnum = QuestionTypeEnum.fromCode(question.getQuestionType()); -// switch (questionTypeEnum) { -// case SingleChoice: -// case TrueFalse: -// questionEditRequestVM.setCorrect(question.getCorrect()); -// break; -// case MultipleChoice: -// questionEditRequestVM.setCorrectArray(ExamUtil.contentToArray(question.getCorrect())); -// break; -// case GapFilling: -// List<String> correctContent = questionObject.getQuestionItemObjects().stream().map(d -> d.getContent()).collect(Collectors.toList()); -// questionEditRequestVM.setCorrectArray(correctContent); -// break; -// case ShortAnswer: -// questionEditRequestVM.setCorrect(questionObject.getCorrect()); -// break; -// default: -// break; -// } -// questionEditRequestVM.setScore(ExamUtil.scoreToVM(question.getScore())); -// questionEditRequestVM.setAnalyze(questionObject.getAnalyze()); + QuestionTypeEnum questionTypeEnum = QuestionTypeEnum.fromCode(question.getQuestionType()); + switch (questionTypeEnum) { + case SingleChoice: + case TrueFalse: + questionEditRequestVM.setCorrect(question.getCorrect()); + break; + case MultipleChoice: + questionEditRequestVM.setCorrectArray(ExamUtil.contentToArray(question.getCorrect())); + break; + case GapFilling: + List<String> correctContent = questionObject.getQuestionItemObjects().stream().map(d -> d.getContent()).collect(Collectors.toList()); + questionEditRequestVM.setCorrectArray(correctContent); + break; + case ShortAnswer: + questionEditRequestVM.setCorrect(questionObject.getCorrect()); + break; + default: + break; + } + questionEditRequestVM.setScore(ExamUtil.scoreToVM(question.getScore())); + questionEditRequestVM.setAnalyze(questionObject.getAnalyze()); //棰樼洰椤规槧灏� diff --git a/src/main/java/com/mindskip/xzs/viewmodel/admin/question/ExamQuestionVO.java b/src/main/java/com/mindskip/xzs/viewmodel/admin/question/ExamQuestionVO.java index 8e0b895..44d8eea 100644 --- a/src/main/java/com/mindskip/xzs/viewmodel/admin/question/ExamQuestionVO.java +++ b/src/main/java/com/mindskip/xzs/viewmodel/admin/question/ExamQuestionVO.java @@ -28,21 +28,43 @@ */ private String title; + /** + * 鍒嗘暟 + */ + private String score; + + /** + * 瑙f瀽 + */ + private String analyze; + + /** + * 闅惧害 + */ + private Integer difficult; + + /** + * 澶氶�夐绛旀 + */ + private List<String> correctArray; + + /** + * 鍗曢�夌瓟妗� + */ + private String correct; + private String sbNames; private List<QuestionSubject> questionSubjects; - //绛旀 + /** + * 閫夐」 + */ private List<QuestionEditItemVM> items; private Integer itemOrder; private String department; - - private String a; - private String b; - private String c; - private String d; } diff --git a/src/main/java/com/mindskip/xzs/vo/OptionAndValueVO.java b/src/main/java/com/mindskip/xzs/vo/OptionAndValueVO.java new file mode 100644 index 0000000..3724e85 --- /dev/null +++ b/src/main/java/com/mindskip/xzs/vo/OptionAndValueVO.java @@ -0,0 +1,20 @@ +package com.mindskip.xzs.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 棰樼洰閫夐」 + * + * @author锛歺p + * @date锛�2024/3/15 22:53 + */ +@Data +public class OptionAndValueVO { + + @ExcelProperty({"棰樼洰閫夐」", "閫夐」"}) + private String optionName; + + @ExcelProperty({"棰樼洰閫夐」", "閫夐」鍊�"}) + private String optionValue; +} diff --git a/src/main/java/com/mindskip/xzs/vo/QuestionImportVO.java b/src/main/java/com/mindskip/xzs/vo/QuestionImportVO.java index 3894850..b61ec5f 100644 --- a/src/main/java/com/mindskip/xzs/vo/QuestionImportVO.java +++ b/src/main/java/com/mindskip/xzs/vo/QuestionImportVO.java @@ -2,8 +2,15 @@ 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 com.mindskip.xzs.viewmodel.admin.question.QuestionEditItemVM; +import io.swagger.models.auth.In; import lombok.Data; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.springframework.util.StringUtils; + import java.util.List; /** @@ -12,12 +19,13 @@ */ @Data @ColumnWidth(20) +@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER, verticalAlignment = VerticalAlignmentEnum.CENTER)//鍐呭鏍峰紡 public class QuestionImportVO { @ExcelProperty("棰樼洰绫诲瀷") - private Integer questionType; + private String questionType; - @ExcelProperty("璇剧洰") + @ExcelProperty("璇剧洰(澶氫釜鐢ㄣ�侀殧寮�)") private String subjectName; @ColumnWidth(80) @@ -25,36 +33,35 @@ private String title; // 閫夐」鍐呭 - @ColumnWidth(60) - @ExcelProperty("閫夐」鍜岀瓟妗�") - private List<QuestionEditItemVM> items; + @ExcelProperty({"棰樼洰閫夐」", "閫夐」"}) + private String optionName; + + @ExcelProperty({"棰樼洰閫夐」", "閫夐」鍊�"}) + private String optionValue; + + @ExcelProperty("绛旀(澶氫釜鐢ㄣ�侀殧寮�)") + private String correct; // 瑙f瀽 @ColumnWidth(30) @ExcelProperty("瑙f瀽") private String analyze; - @ExcelProperty("绛旀") - private String correct; // 棰樼洰鍒嗘暟 @ExcelProperty("棰樼洰鍒嗘暟") - private String score; + private Integer score; // 棰樼洰闅惧害 @ExcelProperty("棰樼洰闅惧害") private Integer difficult; - @ExcelProperty("閫夐」A") - private String a; - - @ExcelProperty("閫夐」B") - private String b; - - @ExcelProperty("閫夐」C") - private String c; - - @ExcelProperty("閫夐」D") - private String d; + /** + * 杩斿洖璇ユ潯鏁版嵁鏄笉鏄锛屽洜涓鸿繕鏈夐�夐」銆傞�夐」鐨勮繖浜涘�兼槸绌虹殑 + * @return + */ + public boolean master() { + return StringUtils.hasText(questionType) && StringUtils.hasText(subjectName) && StringUtils.hasText(title); + } } -- Gitblit v1.8.0