package com.xjrsoft.module.base.controller; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xjrsoft.common.handler.FormContentStyleStrategy; import com.xjrsoft.common.page.ConventPage; import com.xjrsoft.common.page.PageOutput; import com.xjrsoft.common.model.result.RT; import com.xjrsoft.module.base.dto.AddBaseClassCourseDto; import com.xjrsoft.module.base.dto.UpdateBaseClassCourseDto; import cn.dev33.satoken.annotation.SaCheckPermission; import com.alibaba.excel.EasyExcel; import com.xjrsoft.module.base.entity.ClassCourseTextbook; import com.xjrsoft.module.base.entity.CourseBookInfo; import com.xjrsoft.module.base.entity.ExportBaseClassCourseVo; import com.xjrsoft.module.base.service.impl.BaseCourseSubjectServiceImpl; import com.xjrsoft.module.textbook.service.impl.TextbookServiceImpl; import org.apache.ibatis.annotations.Param; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import com.alibaba.excel.support.ExcelTypeEnum; import org.springframework.http.ResponseEntity; import java.io.ByteArrayOutputStream; import java.util.*; import com.xjrsoft.module.base.dto.BaseClassCoursePageDto; import com.xjrsoft.module.base.entity.BaseClassCourse; import com.xjrsoft.module.base.service.IBaseClassCourseService; import com.xjrsoft.module.base.vo.BaseClassCoursePageVo; import com.xjrsoft.module.base.vo.BaseClassCourseVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import java.util.stream.Collectors; /** * @title: 班级课程 * @Author brealinxx * @Date: 2024-06-04 * @Version 1.0 */ @RestController @RequestMapping("/base" + "/baseClassCourse") @Api(value = "/base" + "/baseClassCourse",tags = "班级课程代码") @AllArgsConstructor public class BaseClassCourseController { private static final Logger log = LoggerFactory.getLogger(BaseClassCourseController.class); private final IBaseClassCourseService baseClassCourseService; private final BaseCourseSubjectServiceImpl baseCourseSubjectServiceImpl; private final TextbookServiceImpl textbookServiceImpl; @GetMapping(value = "/page") @ApiOperation(value="班级课程列表(分页)") @SaCheckPermission("baseclasscourse:detail") public RT> page(@Valid BaseClassCoursePageDto dto){ Page page = baseClassCourseService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto); PageOutput pageOutput = ConventPage.getPageOutput(page, BaseClassCoursePageVo.class); return RT.ok(pageOutput); } @GetMapping("/getSemesterTree") @ApiOperation("获取年级树结构") @SaCheckPermission("baseclasscourse:detail") public RT>> semesterTree(){ Map> tree = baseClassCourseService.getSemesterTree(); return RT.ok(tree); } @GetMapping(value = "/info") @ApiOperation(value="根据id查询班级课程信息") @SaCheckPermission("baseclasscourse:detail") public RT info(@RequestParam Long id){ BaseClassCourse baseClassCourse = baseClassCourseService.getById(id); if (baseClassCourse == null) { return RT.error("找不到此数据!"); } return RT.ok(BeanUtil.toBean(baseClassCourse, BaseClassCourseVo.class)); } @GetMapping("/getAllCoursesAndTextbooks") @ApiOperation(value="获取所有课程教材") @SaCheckPermission("baseclasscourse:detail") public RT> getAllCoursesAndTextbooks(@RequestParam(required = false) Long[] classIds, @RequestParam(required = false) Long subjectGroupId, @RequestParam Long semester) { List data = baseClassCourseService.getAllCourseBook(classIds, subjectGroupId, semester); return RT.ok(data); } @GetMapping("/getAllSelectedCoursesAndTextbooks") @ApiOperation(value="获取所有以选择课程教材") @SaCheckPermission("baseclasscourse:detail") public RT> getAllSelectedCoursesAndTextbooks(@RequestParam(required = false) Long[] classIds, @RequestParam(required = false) Long semester) { List data = baseClassCourseService.getSelectedCourseBook(classIds, semester); return RT.ok(data); } @GetMapping("/updateAddCoursesAndTextbooks") @ApiOperation(value="更新增加课程教材") @SaCheckPermission("baseclasscourse:detail") public RT updateAddCoursesAndTextbooks(@Valid ClassCourseTextbook list) { for (Long classId : list.getClassId()){ for (Long i = 0L ;i < list.getCourseId().length; i++){ baseClassCourseService.updateAddCourseBook(classId, list.getCourseId()[Math.toIntExact(i)], list.getTextbookId()[Math.toIntExact(i)]); } } return RT.ok(); } @GetMapping("/updateRemoveCoursesAndTextbooks") @ApiOperation(value="更新减少课程教材") @SaCheckPermission("baseclasscourse:detail") public RT updateRemoveCoursesAndTextbooks(@Valid ClassCourseTextbook list) { for (Long classId : list.getClassId()){ for (Long i = 0L ;i < list.getCourseId().length; i++){ baseClassCourseService.updateRemoveCourseBook(classId, list.getCourseId()[Math.toIntExact(i)], list.getTextbookId()[Math.toIntExact(i)]); } } return RT.ok(); } @GetMapping("/insertClassCourseTextbookCombinations") @ApiOperation(value="复用课程教材") @SaCheckPermission("baseclasscourse:detail") public RT insertClassCourseTextbookCombinations(@RequestParam Long newClassId, @RequestParam Long[] sourceClassIds, @RequestParam Long semester) { // baseClassCourseService.markExistingRecordsAsDeleted(newClassId, sourceClassId); for (Long sourceId : sourceClassIds){ baseClassCourseService.duplicateCourseBook(newClassId, sourceId, semester); } return RT.ok(); } @PostMapping @ApiOperation(value = "新增班级课程") @SaCheckPermission("baseclasscourse:add") public RT add(@Valid @RequestBody AddBaseClassCourseDto dto){ BaseClassCourse baseClassCourse = BeanUtil.toBean(dto, BaseClassCourse.class); boolean isSuccess = baseClassCourseService.save(baseClassCourse); return RT.ok(isSuccess); } @PutMapping @ApiOperation(value = "修改班级课程") @SaCheckPermission("baseclasscourse:edit") public RT update(@Valid @RequestBody UpdateBaseClassCourseDto dto){ BaseClassCourse baseClassCourse = BeanUtil.toBean(dto, BaseClassCourse.class); return RT.ok(baseClassCourseService.updateById(baseClassCourse)); } @DeleteMapping @ApiOperation(value = "删除班级课程") @SaCheckPermission("baseclasscourse:delete") public RT delete(@Valid @RequestBody List ids){ return RT.ok(baseClassCourseService.removeBatchByIds(ids)); } @PostMapping("/import") @ApiOperation(value = "导入") public RT importData(@RequestParam MultipartFile file) throws IOException { List savedDataList = EasyExcel.read(file.getInputStream()).headRowNumber(3).head(BaseClassCoursePageVo.class).sheet().doReadSync(); List baseClassCourses = new ArrayList<>(); List duplicateLogs = new ArrayList<>(); List errorLogs = new ArrayList<>(); for (BaseClassCoursePageVo vo : savedDataList) { try { Long classId = Long.parseLong(baseClassCourseService.GetClassIdByName(vo.getClassName()).toString()); Long courseId = Long.parseLong(baseClassCourseService.GetCourseIdByName(vo.getCourseName()).toString()); Long textbookId = Long.parseLong(baseClassCourseService.GetTextbookIdByName(vo.getTextbookName()).toString()); if (baseClassCourseService.checkExits(classId, courseId, textbookId)) { duplicateLogs.add(String.format("[输入的信息重复添加] 班级: %s, 课程: %s, 教材: %s", vo.getClassName(), vo.getCourseName(), vo.getTextbookName())); continue; } if (classId != null && courseId != null && textbookId != null) { BaseClassCourse baseClassCourse = new BaseClassCourse(); baseClassCourse.setClassId(classId); baseClassCourse.setCourseId(courseId); baseClassCourse.setTextbookId(textbookId); baseClassCourse.setCreateDate(new Date()); baseClassCourse.setDeleteMark(0); baseClassCourses.add(baseClassCourse); } } catch (NumberFormatException e) { errorLogs.add(String.format("[无法解析输入的信息] 班级: %s, 班级: %s, 教材: %s", vo.getClassName(), vo.getCourseName(), vo.getTextbookName())); } catch (Exception e) { errorLogs.add(String.format("[意外错误(检查输入的名称是否正确且存在,输入错误可能返回 null)] 班级: %s, 课程: %s, 教材: %s - 错误信息:%s", vo.getClassName(), vo.getCourseName(), vo.getTextbookName(), e.getMessage())); } } Boolean result = baseClassCourseService.saveBatch(baseClassCourses); if (!duplicateLogs.isEmpty() || !errorLogs.isEmpty()) { String detailedMessage = String.format("[导入完成但存在问题] 问题: %s. 其他错误: %s", String.join("; ", duplicateLogs), String.join("; ", errorLogs)); return RT.error(400, detailedMessage); } return RT.ok(result); } @GetMapping("/export") @ApiOperation(value = "导出") public ResponseEntity exportData(@Valid BaseClassCoursePageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) { List customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput) page(dto).getData()).getList(); ByteArrayOutputStream bot = new ByteArrayOutputStream(); EasyExcel.write(bot, BaseClassCoursePageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList); return RT.fileStream(bot.toByteArray(), "BaseClassCourse" + ExcelTypeEnum.XLSX.getValue()); } }