From 2d821b689c44cb4c2f9849cf5103463c74453cde Mon Sep 17 00:00:00 2001 From: wgf <121463602@qq.com> Date: Mon, 12 Jun 2023 00:09:04 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=95=99=E5=B8=88=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E8=AF=95=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/批量题库导入模板.xlsx | Bin 10862 -> 10824 bytes ...enCourseMergeResourcesQuestionService.java | 311 +++++++++++++++++- ...ourseMergeResourcesQuestionController.java | 57 ++-- 3 files changed, 337 insertions(+), 31 deletions(-) diff --git a/web/filesystem/template/批量题库导入模板.xlsx b/web/filesystem/template/批量题库导入模板.xlsx index 087f2fbb4eb9a05594969c6b8b0bb0c80591ab8c..ea8ff70c1f1358921e71e72e4a6902cb6bd47cbf 100644 GIT binary patch delta 2858 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 delta 2872 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 BK)e6| diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeResourcesQuestionService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeResourcesQuestionService.java index bd91f522..9fccf53b 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeResourcesQuestionService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseMergeResourcesQuestionService.java @@ -10,6 +10,7 @@ import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.jlw.util.ToolUtils; +import cn.jlw.util.excel.ExcelFailRecord; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.ibeetl.admin.core.entity.CoreUser; @@ -26,9 +27,7 @@ import com.ibeetl.jlw.entity.*; import com.ibeetl.jlw.entity.dto.QuestionSettingDTO; import com.ibeetl.jlw.entity.vo.QuestionTypeCountVO; import com.ibeetl.jlw.entity.vo.ResourcesCourseInfoAuthDetailsVO; -import com.ibeetl.jlw.enums.CopyFromEnum; -import com.ibeetl.jlw.enums.GlobalUpStatusEnum; -import com.ibeetl.jlw.enums.ResourcesQuestionTypeEnum; +import com.ibeetl.jlw.enums.*; import com.ibeetl.jlw.web.query.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -104,7 +103,7 @@ public class TeacherOpenCourseMergeResourcesQuestionService extends CoreBaseServ return ret; } - public PageQuery queryByConditionQuery(PageQuery query) { + public PageQuery queryByConditionQuery(PageQuery query) { PageQuery ret = teacherOpenCourseMergeResourcesQuestionDao.queryByConditionQuery(query); queryListAfter(ret.getList()); return ret; @@ -210,6 +209,310 @@ public class TeacherOpenCourseMergeResourcesQuestionService extends CoreBaseServ return JsonResult.failMessage("添加失败"); } + + /** + * 教师端导入实体 + * @param fileEntity + * @param coreUser + * @return + */ + @Transactional + public JsonResult importTemplate(FileEntity fileEntity, CoreUser coreUser) { + if (null != fileEntity) { + File file = new File(fileEntity.getAbsoluteUrl()); + if (file.exists() && file.isFile() && file.canRead() && ToolUtils.findInSet("xls,xlsx", fileEntity.getFormat())) { + Workbook wb = null; + InputStream is = null; + try { + is = Files.newInputStream(Paths.get(fileEntity.getAbsoluteUrl())); + if ("xls".equals(fileEntity.getFormat())) { + wb = new HSSFWorkbook(is); + } else if ("xlsx".equals(fileEntity.getFormat())) { + wb = new XSSFWorkbook(is); + } + } catch (IOException e) { + e.printStackTrace(); + } + try { + if (null != is) { + is.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + if (wb != null) { + List errMsg = new ArrayList<>(); + + //获取Sheet1 + Sheet sheet = wb.getSheet("Sheet1"); + //获取最大行数 + int rowNum = sheet.getPhysicalNumberOfRows(); + //获取第一行 + Row firstRow = sheet.getRow(0); + //获取最大列数 + int colNum = firstRow.getPhysicalNumberOfCells(); + + String[] columns = {"归属课程", "归属章节", "题型", "分值", "题干", "选项A", "选项B", "选项C", "选项D", "选项E", "答案 单选是一个 多选是多个 判断是对错", "解析"}; + + Map map = new HashMap<>();//获取需要的表头的列 + + //从第一列找到需要的表头 + for (int i = 0; i < colNum; i++) { + String cellData = getCellFormatValue(firstRow.getCell(i)); + for (int j = 0; j < columns.length; j++) { + if (columns[j].equals(cellData)) { + map.put(columns[j], i); + } + } + } + + //验证所需要的表头是否全 + Integer flag = 0; + for (int i = 0; i < columns.length; i++) { + if (null != map.get(columns[i])) { + flag++; + } + } + if (flag != columns.length) { + return JsonResult.failMessage("导入失败,表格表头应包含 \"归属课程\",\"归属章节\",\"题型\",\"分值\",\"题干\",\"选项A\",\"选项B\",\"选项C\",\"选项D\",\"选项E\",\"答案 单选是一个 多选是多个 判断是对错\",\"解析\""); + } + + int count = 0; + + Date now = new Date(); + + for (int i = 1; i < rowNum; i++) { + Row row = sheet.getRow(i); + if (null == row) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + (i + 1) + "数据为空"); + excelFailRecord.setRow(i); + errMsg.add(excelFailRecord); + continue; + } + String courseInfoName = getCellFormatValue(row.getCell(map.get(columns[0]))); + String chapterName = getCellFormatValue(row.getCell(map.get(columns[1]))); + String questionType = getCellFormatValue(row.getCell(map.get(columns[2]))); + + if (StringUtils.isNotBlank(questionType)) { + questionType = questionType.replace("题", "").trim(); + } + + String questionScore = getCellFormatValue(row.getCell(map.get(columns[3]))); + String questionStem = getCellFormatValue(row.getCell(map.get(columns[4]))); + + String questionOptionA = getCellFormatValue(row.getCell(map.get(columns[5]))); + String questionOptionB = getCellFormatValue(row.getCell(map.get(columns[6]))); + String questionOptionC = getCellFormatValue(row.getCell(map.get(columns[7]))); + String questionOptionD = getCellFormatValue(row.getCell(map.get(columns[8]))); + String questionOptionE = getCellFormatValue(row.getCell(map.get(columns[9]))); + + String questionAnswer = getCellFormatValue(row.getCell(map.get(columns[10]))); + questionAnswer = resourcesQuestionService.answerFormat(questionType, questionAnswer);//格式化 + String questionAnalysis = getCellFormatValue(row.getCell(map.get(columns[11]))); + + if (StringUtils.isBlank(questionScore)) { + questionScore = "1";//默认一分 + } + + + String m = ""; + if (StringUtils.isNotBlank(questionAnswer)) { + m = resourcesQuestionService.judge(questionType, questionOptionA, questionOptionB, questionOptionC, questionOptionD, questionOptionE, questionAnswer); + } + if (StringUtils.isBlank(courseInfoName)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[0]) + 1) + "列,第" + (i + 1) + "行课程为空"); + excelFailRecord.setColumn(map.get(columns[0]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + + } else if (StringUtils.isBlank(chapterName)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[1]) + 1) + "列,第" + (i + 1) + "行归属章节为空"); + excelFailRecord.setColumn(map.get(columns[1]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + } else if (StringUtils.isBlank(questionType)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[2]) + 1) + "列,第" + (i + 1) + "行题型为空"); + excelFailRecord.setColumn(map.get(columns[2]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + + } else if (!ToolUtils.findInSet("单选,多选,判断", questionType)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[2]) + 1) + "列,第" + (i + 1) + "行题型异常"); + excelFailRecord.setColumn(map.get(columns[2]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + + } else if (StringUtils.isBlank(questionScore)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[3]) + 1) + "列,第" + (i + 1) + "行分值为空"); + excelFailRecord.setColumn(map.get(columns[3]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + + } else if (StringUtils.isBlank(questionStem)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[4]) + 1) + "列,第" + (i + 1) + "行题干为空"); + excelFailRecord.setColumn(map.get(columns[4]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + + } else if (StringUtils.isBlank(questionAnswer)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[10]) + 1) + "列,第" + (i + 1) + "行答案为空"); + excelFailRecord.setColumn(map.get(columns[10]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + + } else if (StringUtils.isNotBlank(m)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + (i + 1) + "行" + m); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + + } else if (!NumberUtil.isNumber(questionScore)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[3]) + 1) + "列,第" + (i + 1) + "行分值数值格式错误"); + excelFailRecord.setColumn(map.get(columns[3]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + + } else { + questionAnswer = questionAnswer.trim(); + courseInfoName = courseInfoName.trim(); + chapterName = chapterName.trim(); + questionType = questionType.trim(); + questionScore = questionScore.trim(); + questionStem = questionStem.trim(); + questionAnswer = questionAnswer.trim(); + + //去掉最后一个逗号 + if (StringUtils.isNotBlank(questionAnswer)) { + if (questionAnswer.lastIndexOf(",") == questionAnswer.length() - 1) { + questionAnswer = questionAnswer.substring(0, questionAnswer.length() - 1); + } + } + + //查课程 + TeacherOpenCourseQuery course = new TeacherOpenCourseQuery(); + course.setTeacherOpenCourseStatus(1); + course.setOrgId(course.getOrgId()); + course.setUserId(course.getUserId()); + course.setTeacherOpenCourseTitle(courseInfoName); + //调现有的接口去查 + List teacherOpenCourseList = teacherOpenCourseDao.getValuesByQuery(course); + + if (CollectionUtils.isEmpty(teacherOpenCourseList)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[0]) + 1) + "列,第" + (i + 1) + "课程不存在"); + excelFailRecord.setColumn(map.get(columns[0]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + } else { + TeacherOpenCourseMergeCourseInfoQuery teacherOpenCourseMergeCourseInfo = new TeacherOpenCourseMergeCourseInfoQuery(); + teacherOpenCourseMergeCourseInfo.setTeacherOpenCourseId(teacherOpenCourseList.get(0).getTeacherOpenCourseId()); + teacherOpenCourseMergeCourseInfo.setCourseInfoStatus(1); + teacherOpenCourseMergeCourseInfo.setCourseInfoType(1); + List courseInfoList = teacherOpenCourseMergeCourseInfoDao.getValuesByQuery(teacherOpenCourseMergeCourseInfo); + + if (CollectionUtils.isEmpty(courseInfoList)) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[0]) + 1) + "列,第" + (i + 1) + "课程不存在"); + excelFailRecord.setColumn(map.get(columns[0]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + } else { + + TeacherOpenCourseMergeCourseInfoQuery chapterCourseInfoQuery = new TeacherOpenCourseMergeCourseInfoQuery(); + chapterCourseInfoQuery.setTeacherOpenCourseId(teacherOpenCourseList.get(0).getTeacherOpenCourseId()); + chapterCourseInfoQuery.setCourseInfoStatus(1); + chapterCourseInfoQuery.setCourseInfoType(2); + chapterCourseInfoQuery.setCourseInfoName(chapterName); + List chapterCourseInfoList = teacherOpenCourseMergeCourseInfoDao.getValuesByQuery(chapterCourseInfoQuery); + if (CollectionUtils.isEmpty(chapterCourseInfoList)){ + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + ToolUtils.numberToLetter(map.get(columns[0]) + 1) + "列,第" + (i + 1) + "章节不存在"); + excelFailRecord.setColumn(map.get(columns[0]) + 1); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + }else { + TeacherOpenCourseMergeCourseInfo chapterCourseInfo = chapterCourseInfoList.get(0); + TeacherOpenCourseMergeResourcesQuestion rq = new TeacherOpenCourseMergeResourcesQuestion(); + rq.setQuestionStem(questionStem); + rq.setTeacherOpenCourseMergeCourseInfoId(chapterCourseInfo.getTeacherOpenCourseMergeCourseInfoId()); + rq.setTeacherOpenCourseId(chapterCourseInfo.getTeacherOpenCourseId()); + List collect = teacherOpenCourseMergeResourcesQuestionDao.template(rq).stream().filter(item -> !Objects.equals(item.getQuestionStatus(), 0)).collect(toList()); + if (collect.size() > 0) { + ExcelFailRecord excelFailRecord = new ExcelFailRecord(); + excelFailRecord.setFailMessage("第" + (i + 1) + "行题目重复"); + excelFailRecord.setRow((i + 1)); + errMsg.add(excelFailRecord); + continue; + } + + + //插入题目 + TeacherOpenCourseMergeResourcesQuestion pojo = new TeacherOpenCourseMergeResourcesQuestion(); + pojo.setTeacherOpenCourseId(chapterCourseInfo.getTeacherOpenCourseId()); + pojo.setTeacherOpenCourseMergeCourseInfoId(chapterCourseInfo.getTeacherOpenCourseMergeCourseInfoId()); + pojo.setQuestionType("单选".equals(questionType) ? 1 : "多选".equals(questionType) ? 2 : 3); + pojo.setQuestionScore(StringUtils.isNotBlank(questionScore) ? new BigDecimal(questionScore) : BigDecimal.ONE); + pojo.setQuestionStem(questionStem); + if (((Integer) 3).equals(pojo.getQuestionType())) { + pojo.setQuestionAnswer(questionAnswer); + } else { + pojo.setQuestionOptionA(questionOptionA); + pojo.setQuestionOptionB(questionOptionB); + pojo.setQuestionOptionC(questionOptionC); + pojo.setQuestionOptionD(questionOptionD); + pojo.setQuestionOptionE(questionOptionE); + pojo.setQuestionAnswer(questionAnswer); + } + pojo.setQuestionAnalysis(questionAnalysis); + // 默认导入上架状态 + pojo.setQuestionStatus(1); + pojo.setFromType(CopyFromEnum.FROM_OPEN_COURSE); + pojo.setUserId(coreUser.getId()); + pojo.setOrgId(coreUser.getOrgId()); + pojo.setSourceFromId(-1L); + insert(pojo); + + forceInsertChapterTestByMergeResourcesQuestion(pojo); + count ++; + } + } + } + } + } + + if (count > 0) { + JsonResult jsonResult = new JsonResult(); + jsonResult.setCode(JsonReturnCode.SUCCESS.getCode()); + jsonResult.setData(errMsg); + jsonResult.setMsg("导入成功,共导入" + count + "条。"); + return jsonResult; + } else { + JsonResult jsonResult = new JsonResult(); + jsonResult.setCode(JsonReturnCode.FAIL.getCode()); + jsonResult.setData(errMsg); + jsonResult.setMsg("导入全部失败,请查看下面的失败列表"); + return jsonResult; + } + } + return JsonResult.failMessage("导入失败"); + } else { + return JsonResult.failMessage("上传失败"); + } + } else { + return JsonResult.failMessage("上传失败"); + } + } + /** * 不会删除章节练习中的快照题目信息的方式,插入到章节练习库中。 * diff --git a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseMergeResourcesQuestionController.java b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseMergeResourcesQuestionController.java index 405fd072..c55509f5 100644 --- a/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseMergeResourcesQuestionController.java +++ b/web/src/main/java/com/ibeetl/jlw/web/TeacherOpenCourseMergeResourcesQuestionController.java @@ -510,7 +510,8 @@ public class TeacherOpenCourseMergeResourcesQuestionController extends BaseContr response.setContentType("application/octet-stream"); //这后面可以设置导出Excel的名称,此例中名为template.xls - response.setHeader("Content-disposition", "attachment;filename=resourcesQuestionTemplate(" + TimeTool.getNowTime("YMD") + ").xlsx"); + String excelName = new String(("批量题库导入模板").getBytes("GB2312"), "ISO8859-1") + ".xlsx"; + response.setHeader("Content-disposition", "attachment;filename=" +excelName); //刷新缓冲 response.flushBuffer(); @@ -545,31 +546,33 @@ public class TeacherOpenCourseMergeResourcesQuestionController extends BaseContr */ @SneakyThrows @PostMapping(API + "/importBatchTemplate.do") - public JsonResult importBatchTemplate(@NotNull(message = "导入的文件不能为空!") MultipartFile file, TeacherOpenCourseQuery teacherOpenCourseQuery, @SCoreUser CoreUser coreUser) { - - try { - Assert.isNull(getStudent(), "学生无法访问该接口"); - - // 输出 Excel - MyValidateExcelCellDataListener listener = new MyValidateExcelCellDataListener<>(); - - ExcelUtil.readExcelNotContainHeader(file, TeacherOpenCourseMergeResourcesQuestionImport.class, listener); - // 判断错误的结果集 - Assert.isTrue(CollectionUtil.isEmpty(listener.getFailMessage()), JSONUtil.toJsonStr(listener.getFailMessage())); - // 类型转换 - List options = listener.getData().stream() - .map(TeacherOpenCourseMergeResourcesQuestionImport::pojo).collect(Collectors.toList()); - - // 只复制用户ID和组织ID。 当前导入到开课题库的用户,基本上是学生管理员,或者教师,所以直接获取当前的登录人userId和orgId就好 - BeanUtil.beanPropertyCopyToList(coreUser, options, MapUtil.of("id", "userId"), "userId", "orgId"); - - // 循环插入吧,这样支持插入到测试章节题库中 - options.forEach(teacherOpenCourseMergeResourcesQuestionService::addByObject); - } - catch (IllegalArgumentException exception) { - return JsonResult.failMessage(exception.getMessage()).setCode(DIY_ERROR.getCode()); - } - - return JsonResult.successMessage("导入成功!"); + public JsonResult importBatchTemplate(@NotNull(message = "导入的文件不能为空!") @RFile FileEntity fileEntity, @SCoreUser CoreUser coreUser) { + +// try { +// Assert.isNull(getStudent(), "学生无法访问该接口"); +// +// // 输出 Excel +// MyValidateExcelCellDataListener listener = new MyValidateExcelCellDataListener<>(); +// +// ExcelUtil.readExcelNotContainHeader(file, TeacherOpenCourseMergeResourcesQuestionImport.class, listener); +// // 判断错误的结果集 +// Assert.isTrue(CollectionUtil.isEmpty(listener.getFailMessage()), JSONUtil.toJsonStr(listener.getFailMessage())); +// // 类型转换 +// List options = listener.getData().stream() +// .map(TeacherOpenCourseMergeResourcesQuestionImport::pojo).collect(Collectors.toList()); +// +// // 只复制用户ID和组织ID。 当前导入到开课题库的用户,基本上是学生管理员,或者教师,所以直接获取当前的登录人userId和orgId就好 +// BeanUtil.beanPropertyCopyToList(coreUser, options, MapUtil.of("id", "userId"), "userId", "orgId"); +// +// // 循环插入吧,这样支持插入到测试章节题库中 +// options.forEach(teacherOpenCourseMergeResourcesQuestionService::addByObject); +// } +// catch (IllegalArgumentException exception) { +// return JsonResult.failMessage(exception.getMessage()).setCode(DIY_ERROR.getCode()); +// } +// +// return JsonResult.successMessage("导入成功!"); + Assert.isNull(getStudent(), "学生无法访问该接口"); + return teacherOpenCourseMergeResourcesQuestionService.importTemplate(fileEntity,coreUser); } }