From 7a436bf6e3e00ade708e454351bc81cc306b60b6 Mon Sep 17 00:00:00 2001 From: pengjie <17373303529@163.com> Date: Tue, 4 Jun 2024 19:26:21 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=98=E5=BA=93=E5=AF=BC=E5=85=A5=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DownloadController.java | 12 +++ .../ExamQuestionBankController.java | 79 ++++++++---------- .../exam/vo/ExamQuestionBankImport.java | 32 ++++--- .../java/com/zhgd/xmgl/util/ExcelUtils.java | 4 +- src/main/resources/excel/题库导入模版.xlsx | Bin 13397 -> 13031 bytes 5 files changed, 69 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/DownloadController.java b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/DownloadController.java index e4f4e13bd..378fd3290 100644 --- a/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/DownloadController.java +++ b/src/main/java/com/zhgd/xmgl/modules/basicdata/controller/DownloadController.java @@ -5,6 +5,7 @@ import com.zhgd.xmgl.modules.bigdevice.service.ITowerAlarmService; import com.zhgd.xmgl.modules.bigdevice.service.ITowerCurrentDataService; import com.zhgd.xmgl.modules.bigdevice.service.ITowerWorkCycleService; import com.zhgd.xmgl.modules.dangerous.service.IHiddenDangerInspectRecordService; +import com.zhgd.xmgl.modules.exam.service.IExamQuestionBankService; import com.zhgd.xmgl.modules.massrebound.service.IMassReboundSurveyAreaService; import com.zhgd.xmgl.modules.quality.service.IQualityInspectionRecordService; import com.zhgd.xmgl.modules.standard.service.IStandardAlarmService; @@ -44,6 +45,8 @@ public class DownloadController { @Autowired private IWorkerInfoService workerInfoService; @Autowired + private IExamQuestionBankService examQuestionBankService; + @Autowired private IWorkerMonthAttendanceStatisticsService workerMonthAttendanceStatisticsService; @Autowired private IMassReboundSurveyAreaService massReboundSurveyAreaService; @@ -311,6 +314,15 @@ public class DownloadController { workerInfoService.exporExcelWorkerTemplate(response, projectSn); } + @ApiOperation(value = "题库导入模板下载", notes = "题库导入模板下载", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "query", required = true, dataType = "String"), + }) + @GetMapping(value = "/exporExcelExamQuestionTemplate") + public void exporExcelExamQuestionTemplate(HttpServletResponse response, String projectSn) { + examQuestionBankService.exporExcelTemplate(response, projectSn); + } + @ApiOperation(value = "列表查询隐患检查记录信息下载", notes = "列表查询隐患检查记录信息下载", httpMethod = "GET") @ApiImplicitParams({ @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "query", required = true, dataType = "String"), diff --git a/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamQuestionBankController.java b/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamQuestionBankController.java index c554f3446..d63bbe6ae 100644 --- a/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamQuestionBankController.java +++ b/src/main/java/com/zhgd/xmgl/modules/exam/controller/ExamQuestionBankController.java @@ -17,6 +17,7 @@ import com.zhgd.xmgl.modules.exam.vo.ExamQuestionBankVo; import com.zhgd.xmgl.modules.exam.vo.RandomQuery; import com.zhgd.xmgl.security.entity.UserInfo; import com.zhgd.xmgl.security.util.SecurityUtils; +import com.zhgd.xmgl.util.ExcelUtils; import com.zhgd.xmgl.util.PageUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -323,28 +324,25 @@ public class ExamQuestionBankController { List pageList = examQuestionBankService.list(queryWrapper); List subList = examSubjectService.list(); List resultList = new ArrayList<>(); - int index = 1; for (ExamQuestionBank examQuestionBank : pageList) { ExamSubject examSubject = subList.stream().filter(s -> s.getId().toString().equals(examQuestionBank.getSubjectId().toString())) .collect(Collectors.toList()).get(0); ExamQuestionBankImport examQuestionBankImport = new ExamQuestionBankImport(); - examQuestionBankImport.setIndex(index + "、"); examQuestionBankImport.setSubjectName(examSubject.getName()); examQuestionBankImport.setQuestionName(examQuestionBank.getQuestionName()); examQuestionBankImport.setTypeName(getType(examQuestionBank.getType())); examQuestionBankImport.setDifficulty(getDifficulty(examQuestionBank.getDifficulty())); examQuestionBankImport.setOptions(examQuestionBank.getOptions()); examQuestionBankImport.setIsEnable(examQuestionBank.getIsEnable() == 1 ? "是" : "否"); - examQuestionBankImport.setScore(examQuestionBank.getScore()); + examQuestionBankImport.setScore(examQuestionBank.getScore().toString()); resultList.add(examQuestionBankImport); List questionOptions = examQuestionOptionService.list(Wrappers.lambdaQuery().eq(ExamQuestionOption::getQuestionId, examQuestionBank.getId())); for (ExamQuestionOption questionOption : questionOptions) { ExamQuestionBankImport examQuestionBankImport1 = new ExamQuestionBankImport(); - examQuestionBankImport1.setSubjectName(questionOption.getOptionCode()); - examQuestionBankImport1.setQuestionName(questionOption.getOptionDesc()); + examQuestionBankImport1.setOptionCode(questionOption.getOptionCode()); + examQuestionBankImport1.setOptionDesc(questionOption.getOptionDesc()); resultList.add(examQuestionBankImport1); } - index++; } //导出文件名称 mv.addObject(NormalExcelConstants.FILE_NAME, "题目管理列表"); @@ -376,40 +374,42 @@ public class ExamQuestionBankController { params.setHeadRows(1); params.setNeedSave(true); try { - List examQuestionBankImports = ExcelImportUtil.importExcel(file.getInputStream(), ExamQuestionBankImport.class, params); + List> examQuestionBankImports = ExcelUtils.jxlExlToList(file.getInputStream(), 0); List examQuestionBankList = new ArrayList<>(); List examQuestionOptionList = new ArrayList<>(); int index = 0; - for (ExamQuestionBankImport examQuestionBankImport : examQuestionBankImports) { - if (StringUtils.isNotBlank(examQuestionBankImport.getQuestionName())) { - if (StringUtils.isNotBlank(examQuestionBankImport.getIndex())) { - index++; - List subjects = subList.stream().filter(s -> s.getName().equals(examQuestionBankImport.getSubjectName())).collect(Collectors.toList()); - if (subjects == null || subjects.size() == 0) { - throw new CustomException("没有对应的科目名称,请检查", HttpStatus.INTERNAL_SERVER_ERROR); - } - ExamQuestionBank examQuestionBank = new ExamQuestionBank(); - examQuestionBank.setId((long) index); - examQuestionBank.setSubjectId(subjects.get(0).getId()); - examQuestionBank.setQuestionName(examQuestionBankImport.getQuestionName()); - examQuestionBank.setType(getType(examQuestionBankImport.getTypeName())); - examQuestionBank.setDifficulty(getDifficulty(examQuestionBankImport.getDifficulty())); - examQuestionBank.setOptions(examQuestionBankImport.getOptions()); - examQuestionBank.setIsEnable(examQuestionBankImport.getIsEnable().equals("是") ? 1 : 0); - examQuestionBank.setScore(examQuestionBankImport.getScore()); - examQuestionBank.setProjectSn(systemUser.getSn()); - examQuestionBank.setCreateBy(systemUser.getUserId().toString()); - examQuestionBank.setCreateTime(new Date()); - examQuestionBank.setUpdateBy(systemUser.getUserId().toString()); - examQuestionBank.setUpdateTime(examQuestionBank.getCreateTime()); - examQuestionBankList.add(examQuestionBank); - } else { - ExamQuestionOption examQuestionOption = new ExamQuestionOption(); - examQuestionOption.setQuestionId((long) index); - examQuestionOption.setOptionCode(examQuestionBankImport.getSubjectName()); - examQuestionOption.setOptionDesc(examQuestionBankImport.getQuestionName()); - examQuestionOptionList.add(examQuestionOption); + for (Map examQuestionBankImport : examQuestionBankImports) { + if (StringUtils.isNotBlank(examQuestionBankImport.get("*科目名称").trim())) { + index++; + List subjects = subList.stream().filter(s -> s.getName().equals(examQuestionBankImport.get("*科目名称").trim())).collect(Collectors.toList()); + if (subjects == null || subjects.size() == 0) { + throw new CustomException("没有对应的科目名称,请检查", HttpStatus.INTERNAL_SERVER_ERROR); } + ExamQuestionBank examQuestionBank = new ExamQuestionBank(); + examQuestionBank.setId((long) index); + examQuestionBank.setSubjectId(subjects.get(0).getId()); + examQuestionBank.setQuestionName(examQuestionBankImport.get("*试题名称").trim()); + examQuestionBank.setType(getType(examQuestionBankImport.get("*试题类型").trim())); + examQuestionBank.setDifficulty(getDifficulty(examQuestionBankImport.get("*难易程度").trim())); + examQuestionBank.setOptions(examQuestionBankImport.get("*试题答案").trim()); + examQuestionBank.setIsEnable(examQuestionBankImport.get("*是否应用").trim().equals("是") ? 1 : 0); + try { + examQuestionBank.setScore(Integer.parseInt(examQuestionBankImport.get("*作答正确得分").trim())); + } catch (Exception e) { + throw new CustomException("分数格式错误,请填写正确的分数", HttpStatus.INTERNAL_SERVER_ERROR); + } + examQuestionBank.setProjectSn(systemUser.getSn()); + examQuestionBank.setCreateBy(systemUser.getUserId().toString()); + examQuestionBank.setCreateTime(new Date()); + examQuestionBank.setUpdateBy(systemUser.getUserId().toString()); + examQuestionBank.setUpdateTime(examQuestionBank.getCreateTime()); + examQuestionBankList.add(examQuestionBank); + } else if(StringUtils.isNotBlank(examQuestionBankImport.get("*选项代码").trim())) { + ExamQuestionOption examQuestionOption = new ExamQuestionOption(); + examQuestionOption.setQuestionId((long) index); + examQuestionOption.setOptionCode(examQuestionBankImport.get("*选项代码").trim()); + examQuestionOption.setOptionDesc(examQuestionBankImport.get("*选项描述").trim()); + examQuestionOptionList.add(examQuestionOption); } } for (ExamQuestionBank examQuestionBank : examQuestionBankList) { @@ -438,13 +438,6 @@ public class ExamQuestionBankController { return Result.ok("文件导入失败!"); } - @ApiOperation(value = "导入模板下载", notes = "导入模板下载", httpMethod = "GET") - @ApiImplicitParam(name = "projectSn", value = "项目SN", paramType = "query", required = true, dataType = "String") - @GetMapping(value = "/exporExcelTemplate") - public void exporExcelTemplate(HttpServletResponse response, String projectSn) { - examQuestionBankService.exporExcelTemplate(response, projectSn); - } - private String getType(int type) { String typeName = null; switch (type) { diff --git a/src/main/java/com/zhgd/xmgl/modules/exam/vo/ExamQuestionBankImport.java b/src/main/java/com/zhgd/xmgl/modules/exam/vo/ExamQuestionBankImport.java index f528cb67c..252128a11 100644 --- a/src/main/java/com/zhgd/xmgl/modules/exam/vo/ExamQuestionBankImport.java +++ b/src/main/java/com/zhgd/xmgl/modules/exam/vo/ExamQuestionBankImport.java @@ -9,35 +9,41 @@ import org.jeecgframework.poi.excel.annotation.Excel; @ApiModel(value = "试题导入(VO)", description = "ExamQuestionBankImport") public class ExamQuestionBankImport { - @Excel(name = "试题序号", width = 15) - @ApiModelProperty(value = "试题序号") private String index; - @Excel(name = "科目名称/选项代码", width = 15) - @ApiModelProperty(value = "科目名称/选项代码") + @Excel(name = "*科目名称", width = 15) + @ApiModelProperty(value = "科目名称") private String subjectName; - @Excel(name = "试题名称/选项描述", width = 15) - @ApiModelProperty(value = "试题名称/选项描述") + @Excel(name = "*试题名称", width = 15) + @ApiModelProperty(value = "试题名称") private String questionName; - @Excel(name = "试题类型(单选题;多选题;)", width = 15) - @ApiModelProperty(value = "试题类型(单选题;多选题;)") + @Excel(name = "*试题类型", width = 15) + @ApiModelProperty(value = "试题类型") private String typeName; - @Excel(name = "难易程度", width = 15) + @Excel(name = "*难易程度", width = 15) @ApiModelProperty(value = "难易程度") private String difficulty; - @Excel(name = "试题答案", width = 15) + @Excel(name = "*试题答案", width = 15) @ApiModelProperty(value = "试题答案") private String options; - @Excel(name = "是否应用(否;是)", width = 15) + @Excel(name = "*是否应用(否;是)", width = 15) @ApiModelProperty(value = "是否应用(否;是)") private String isEnable; - @Excel(name = "作答正确得分", width = 15) + @Excel(name = "*作答正确得分", width = 15) @ApiModelProperty(value = "作答正确得分") - private Integer score; + private String score; + + @Excel(name = "*选项代码", width = 15) + @ApiModelProperty(value = "选项代码") + private String optionCode; + + @Excel(name = "*选项描述", width = 15) + @ApiModelProperty(value = "选项描述") + private String optionDesc; } diff --git a/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java b/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java index deba14ce3..9637eda7d 100644 --- a/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java +++ b/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java @@ -253,7 +253,7 @@ public class ExcelUtils { public static void exporExcelExamQuestionBankTemplate(HttpServletResponse response, List subjectList) { try { - ClassPathResource classPathResource = new ClassPathResource("excel/题库导入模板.xlsx"); + ClassPathResource classPathResource = new ClassPathResource("excel/题库导入模版.xlsx"); InputStream inputStream = classPathResource.getInputStream(); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); //部门/班组下拉列 @@ -266,7 +266,7 @@ public class ExcelUtils { cell1.setCellValue(subjectList.get(i).getName()); } } - downLoadExcel("题库导入模板.xlsx", response, workbook); + downLoadExcel("题库导入模版.xlsx", response, workbook); } catch (IOException e) { log.error("error:", e); } diff --git a/src/main/resources/excel/题库导入模版.xlsx b/src/main/resources/excel/题库导入模版.xlsx index 888b992f93e3c2a9938053b05644a20aa9f43039..7fe478788dbe89cec095f9ed37d36522e6451770 100644 GIT binary patch delta 7193 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 JbN+qD{{x%0Kk)zn delta 7695 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 Jl&