From e43fc041656dcd446143cf40e3c20b2bd9f5d11c Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期一, 27 五月 2024 09:15:29 +0800 Subject: [PATCH] bug --- src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java | 309 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 286 insertions(+), 23 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 a7e40d9..1dbbad1 100644 --- a/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java +++ b/src/main/java/com/mindskip/xzs/controller/admin/QuestionController.java @@ -1,13 +1,27 @@ 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.domain.vo.DeptQuestionVO; +import com.mindskip.xzs.excel.*; import com.mindskip.xzs.repository.DepartmentMapper; +import com.mindskip.xzs.repository.DeptQuestionMapper; import com.mindskip.xzs.repository.SubjectMapper; import com.mindskip.xzs.service.*; import com.mindskip.xzs.utility.*; @@ -16,15 +30,25 @@ 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; +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; +import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; +import java.net.URLEncoder; +import java.util.*; +import java.util.function.Consumer; import java.util.stream.Collectors; @RestController("AdminQuestionController") @@ -33,24 +57,24 @@ private final QuestionService questionService; private final TextContentService textContentService; - private final SubjectMapper subjectMapper; - private final DepartmentMapper departmentMapper; - private final QuestionSubjectService questionSubjectService; + private final DeptQuestionMapper deptQuestionMapper; - @Autowired - public QuestionController(QuestionService questionService, TextContentService textContentService, SubjectMapper subjectMapper, DepartmentMapper departmentMapper, QuestionSubjectService questionSubjectService) { + private static final String SPLIT = "銆�"; + + public QuestionController(QuestionService questionService, TextContentService textContentService, SubjectMapper subjectMapper, DepartmentMapper departmentMapper, QuestionSubjectService questionSubjectService, DeptQuestionMapper deptQuestionMapper) { this.questionService = questionService; this.textContentService = textContentService; this.subjectMapper = subjectMapper; this.departmentMapper = departmentMapper; this.questionSubjectService = questionSubjectService; + this.deptQuestionMapper = deptQuestionMapper; } @RequestMapping(value = "/page", method = RequestMethod.POST) - public RestResponse<PageInfo<QuestionResponseVM>> pageList(@RequestBody QuestionPageRequestVM model) { + public RestResponse<PageInfo<QuestionResponseVM>> pageList(@RequestBody @Valid QuestionPageRequestVM model) { PageInfo<Question> pageInfo = questionService.page(model); PageInfo<QuestionResponseVM> page = PageInfoHelper.copyMap(pageInfo, q -> { QuestionResponseVM vm = modelMapper.map(q, QuestionResponseVM.class); @@ -66,6 +90,9 @@ e.setSubName(subjectMapper.page(subjectPageRequestVM).get(0).getName()); return e; }).collect(Collectors.toList())); + // 鏌ヨ棰樼洰鎵�灞為儴闂� + String deptNames = deptQuestionMapper.deptByQuestionId(q.getId()).stream().map(DeptQuestionVO::getDeptName).collect(Collectors.joining("銆�")); + vm.setDeptNames(deptNames); return vm; }); return RestResponse.ok(page); @@ -88,9 +115,8 @@ } @RequestMapping(value = "/select/{id}", method = RequestMethod.POST) - public RestResponse<QuestionEditRequestVM> select(@PathVariable Integer id) { - QuestionEditRequestVM newVM = questionService.getQuestionEditRequestVM(id); - return RestResponse.ok(newVM); + public RestResponse<ExamQuestionVO> select(@PathVariable Integer id) { + return RestResponse.ok(questionService.getQuestionEditRequestVM(id)); } @@ -120,13 +146,237 @@ 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"); + + // 鏋勫缓妯℃澘鏍蜂緥鏁版嵁 + 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(0, 1, 2, 5, 6, 7, 8))) + .doWrite(data); + } + + @PostMapping("/question/export") + public void exportQuestion(@RequestBody QuestionExportVO query, HttpServletResponse response) throws IOException { + // 鏌ヨ瀵煎嚭鏁版嵁 + 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"); + + // 鏌ュ嚭鎵�鏈夌殑璇剧洰锛坋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); + } + + /** + * 棰樼洰瀵煎叆 + * + * 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") - public void importUser(@RequestPart("file") MultipartFile file) throws Exception { + public RestResponse importUser(@RequestPart("file") MultipartFile file) throws Exception { List<QuestionEditVO> questionEditVOS = ExcelUtils.readMultipartFile(file, QuestionEditVO.class) .stream().map(e -> { e.setQuestionType(QuestionTypeEnum.get(e.getType())); - e.setSubjectId(subjectMapper.getName(e.getSubjectName()).getId()); - e.setGradeLevel(departmentMapper.getName(e.getDepartment()).getId()); +// e.setSubjectId(subjectMapper.getName(e.getSbNames()).getId()); +// e.setGradeLevel(departmentMapper.getName(e.getDepartment()).getId()); return e; }).collect(Collectors.toList()); @@ -145,25 +395,38 @@ questionEditItemVM.setPrefix("B"); questionEditItemVM.setContent(vm.getB()); questionEditItemVMS.add(questionEditItemVM); - questionEditItemVM = new QuestionEditItemVM(); - questionEditItemVM.setPrefix("C"); - questionEditItemVM.setContent(vm.getC()); - questionEditItemVMS.add(questionEditItemVM); - questionEditItemVM = new QuestionEditItemVM(); - questionEditItemVM.setPrefix("D"); - questionEditItemVM.setContent(vm.getD()); - questionEditItemVMS.add(questionEditItemVM); + if(!"".equals(vm.getC()) && vm.getC()!=null){ + questionEditItemVM = new QuestionEditItemVM(); + questionEditItemVM.setPrefix("C"); + questionEditItemVM.setContent(vm.getC()); + questionEditItemVMS.add(questionEditItemVM); + } + if(!"".equals(vm.getD()) && vm.getD()!=null){ + questionEditItemVM = new QuestionEditItemVM(); + questionEditItemVM.setPrefix("D"); + questionEditItemVM.setContent(vm.getD()); + questionEditItemVMS.add(questionEditItemVM); + } vm.setItems(questionEditItemVMS); List<String> str = Arrays.asList(vm.getCorrect().split(",")); + List<Subject> subjectList = subjectMapper.getNames(vm.getSbNames().split(",")); + + Integer[] arr =subjectList.stream() + .map(Subject::getId).toArray(Integer[]::new); + + vm.setSubjectIds(arr); //澶氶�� if (str.size() > 1) { vm.setCorrectArray(str); vm.setCorrect(null); } + vm.setScore(QuestionSourceEnum.fromType(vm.getQuestionType()).toString()); + vm.setDifficult(4); questionService.insertFullQuestion(vm, getCurrentUser().getId()); questionEditItemVMS.clear(); } + return RestResponse.ok(); } } -- Gitblit v1.8.0