package com.xjrsoft.module.courseTable.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteTable; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.metadata.style.WriteFont; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.xjrsoft.common.enums.CourseAdjustTypeEnum; import com.xjrsoft.common.enums.DeleteMark; import com.xjrsoft.common.enums.TimeNumberEnum; import com.xjrsoft.common.enums.TimePeriodEnum; import com.xjrsoft.common.enums.WeekEnum; import com.xjrsoft.common.exception.MyException; import com.xjrsoft.common.model.result.RT; import com.xjrsoft.common.utils.VoToColumnUtil; import com.xjrsoft.common.utils.excel.ExcelFillCellMergePrevColUtil; import com.xjrsoft.common.utils.excel.ExcelMergeUtil; import com.xjrsoft.config.TimetableConfig; import com.xjrsoft.module.base.entity.BaseClass; import com.xjrsoft.module.base.entity.BaseClassroom; import com.xjrsoft.module.base.entity.BaseOfficeBuild; import com.xjrsoft.module.base.entity.BaseSemester; import com.xjrsoft.module.base.mapper.BaseClassroomMapper; import com.xjrsoft.module.base.mapper.BaseOfficeBuildMapper; import com.xjrsoft.module.base.mapper.BaseSemesterMapper; import com.xjrsoft.module.base.service.IBaseClassService; import com.xjrsoft.module.base.service.IBaseSemesterService; import com.xjrsoft.module.courseTable.dto.ClassListDto; import com.xjrsoft.module.courseTable.dto.ClassTeacherDto; import com.xjrsoft.module.courseTable.dto.CourseTableParse; import com.xjrsoft.module.courseTable.entity.ClassTime; import com.xjrsoft.module.courseTable.entity.CourseTable; import com.xjrsoft.module.courseTable.mapper.ClassTimeMapper; import com.xjrsoft.module.courseTable.mapper.CourseTableMapper; import com.xjrsoft.module.courseTable.service.ICourseTableService; import com.xjrsoft.module.courseTable.vo.ClassListVo; import com.xjrsoft.module.organization.entity.User; import com.xjrsoft.module.organization.service.IUserService; import com.xjrsoft.module.schedule.dto.ClassOptionDto; import com.xjrsoft.module.schedule.dto.CourseTableAdjustDto; import com.xjrsoft.module.schedule.dto.CourseTableDto; import com.xjrsoft.module.schedule.dto.CourseTableExportQueryDto; import com.xjrsoft.module.schedule.dto.ScheduleWeekExportQueryDto; import com.xjrsoft.module.schedule.entity.CourseTableBak; import com.xjrsoft.module.schedule.entity.WfCourseAdjust; import com.xjrsoft.module.schedule.mapper.CourseTableBakMapper; import com.xjrsoft.module.schedule.util.CourseTableExportQueryUtil; import com.xjrsoft.module.schedule.util.ScheduleUtil; import com.xjrsoft.module.schedule.vo.*; import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll; import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService; import com.xjrsoft.module.teacher.entity.BaseTeacher; import com.xjrsoft.module.teacher.entity.XjrUser; import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService; import com.xjrsoft.module.veb.util.ImportExcelUtil; import lombok.AllArgsConstructor; import me.zhyd.oauth.log.Log; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xwpf.usermodel.*; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.stream.Collectors; /** *

* 课表 服务实现类 *

* * @author baomidou * @since 2023-09-02 02:19:56 */ @Service @AllArgsConstructor public class CourseTableServiceImpl extends ServiceImpl implements ICourseTableService { private final CourseTableMapper courseTableMapper; private final IBaseClassService baseClassService; private final ITeacherbaseManagerService teacherbaseManagerService; private final IBaseSemesterService baseSemesterService; private final TimetableConfig timetableConfig; private final ClassTimeMapper classTimeMapper; private final BaseSemesterMapper baseSemesterMapper; private final IBaseStudentSchoolRollService baseStudentSchoolRollService; private final CourseTableBakMapper courseTableBakMapper; private final IUserService userService; private final BaseClassroomMapper classroomMapper; private final BaseOfficeBuildMapper officeBuildMapper; @Override @Transactional(rollbackFor = Exception.class) public Boolean wordImport(InputStream inputStream) throws IOException { List parses = courseTableWordParses(inputStream); String semester = null; if (parses.size() > 0) { semester = parses.get(0).getSemester(); } BaseSemester baseSemester = baseSemesterService.getOne(Wrappers.query().lambda().eq(BaseSemester::getName, semester)); if (baseSemester == null) { throw new MyException(String.format("学期【%s】不存在", semester)); } // 获取班级信息 List baseClassList = baseClassService.list(); Map baseClassMap = baseClassList.stream().collect(Collectors.toMap(BaseClass::getName, a -> a, (k1, k2) -> k1)); // 获取教师信息 MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.disableSubLogicDel().innerJoin(BaseTeacher.class, BaseTeacher::getUserId, XjrUser::getId).selectAll(XjrUser.class); List xjrUserList = teacherbaseManagerService.list(queryWrapper); Map xjrUsersMap = xjrUserList.stream().collect(Collectors.toMap(XjrUser::getName, a -> a, (k1, k2) -> k1)); // 清空所有数据 courseTableMapper.delete(Wrappers.query().lambda().eq(CourseTable::getBaseSemesterId, baseSemester.getId())); List params = new ArrayList<>(); for (CourseTableParse item : parses) { CourseTable courseTable = BeanUtil.toBean(item, CourseTable.class); courseTable.setBaseSemesterId(baseSemester.getId()); BaseClass baseClass = baseClassMap.get(item.getClassName()); if (baseClass != null) { courseTable.setClassId(baseClass.getId()); } XjrUser xjrUser = xjrUsersMap.get(item.getTeacherName()); if (xjrUser != null) { courseTable.setTeacherId(xjrUser.getId().toString()); } if (item.getWeeksCn() != null) { courseTable.setWeeks(WeekEnum.getCode(item.getWeeksCn())); } params.add(courseTable); } return this.saveBatch(params); } @Override public List classList(ClassListDto dto) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(CourseTable::getClassId, dto.getClassId()).eq(ObjectUtil.isNotEmpty(dto.getWeeks()), CourseTable::getWeeks, dto.getWeeks()); List courseTables = courseTableMapper.selectList(queryWrapper); List classListVos = BeanUtil.copyToList(courseTables, ClassListVo.class); Boolean isCurrentSummer = isCurrentSummer(); Map classTimeMap = getClassTimeMap(); // 获取节次时间 for (int i = 0; i < classListVos.size(); i++) { ClassListVo c = classListVos.get(i); String key = String.format("%d_%d", c.getTimePeriod(), c.getTimeNumber()); ClassTime ct = classTimeMap.get(key); if (ct != null) { if (isCurrentSummer) { c.setStartTime(ct.getSummerStartTime()); c.setEndTime(ct.getSummerEndTime()); } else { c.setStartTime(ct.getWinterStartTime()); c.setEndTime(ct.getWinterEndTime()); } } } return classListVos; } @Override public CourseTableVo getList(CourseTableDto dto) { List classTimes = classTimeMapper.selectList(new QueryWrapper().lambda().ne(ClassTime::getTimePeriod, 0).orderByAsc(ClassTime::getSummerStartTime) ); CourseTableVo tableVo = new CourseTableVo(); tableVo.setClassTimeList(classTimes); if (dto.getSemesterId() != null) { BaseSemester baseSemester = baseSemesterMapper.selectById(dto.getSemesterId()); tableVo.setSemesterName(baseSemester.getName()); LocalDateTime now = LocalDateTime.now(); // 计算本周是第几周 LocalDate semesterStart = LocalDate.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault()); LocalDate semesterEnd = LocalDate.ofInstant(baseSemester.getTeachingEnd().toInstant(), ZoneId.systemDefault()); // 调整到完整的周范围(周一到周日) LocalDate weekStart = semesterStart.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); LocalDate weekEnd = semesterEnd.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); // 计算总周数 long totalWeeks = ChronoUnit.WEEKS.between(weekStart, weekEnd.plusDays(1)); // 加1天以确保包含最后一周 if (dto.getWeek() == null) { // 查找当前日期所在的周 long weeksBetween = ChronoUnit.WEEKS.between(weekStart, now); LocalDate calculatedWeekStart = weekStart.plusWeeks(weeksBetween); LocalDate calculatedWeekEnd = calculatedWeekStart.plusDays(6); // 验证是否在学期范围内 LocalDate nowDate = now.toLocalDate(); if (!nowDate.isBefore(weekStart) && !nowDate.isAfter(weekEnd)) { int currentWeek = (int) (weeksBetween + 1); tableVo.setWeek("第" + currentWeek + "周"); tableVo.setStartDate(calculatedWeekStart); tableVo.setEndDate(calculatedWeekEnd); } else { tableVo.setWeek("不在学期范围内"); tableVo.setStartDate(weekStart); tableVo.setEndDate(weekEnd); } } else { // 根据指定周数计算日期范围 int weekNumber = dto.getWeek(); if (weekNumber < 1 || weekNumber > totalWeeks) { throw new MyException("周数必须在1到" + totalWeeks + "之间"); } LocalDateTime semesterStartDateTime = baseSemester.getTeachingStart().toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); LocalDateTime weekStartDateTime = semesterStartDateTime .plusWeeks(weekNumber - 1) .toLocalDate() .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) .atStartOfDay(); LocalDateTime weekEndDateTime = weekStartDateTime.plusDays(6) .with(LocalTime.MAX); dto.setStartDate(weekStartDateTime); dto.setEndDate(weekEndDateTime); tableVo.setWeek("第" + weekNumber + "周"); tableVo.setWeek("第" + weekNumber + "周"); tableVo.setStartDate(weekStartDateTime.toLocalDate()); tableVo.setEndDate(weekEndDateTime.toLocalDate()); } } if (!StrUtil.isEmpty(dto.getTeacherName())) { List userList = teacherbaseManagerService.list(new QueryWrapper().lambda().like(!StrUtil.isEmpty(dto.getTeacherName()), XjrUser::getName, dto.getTeacherName())); List userList2 = teacherbaseManagerService.list(new QueryWrapper().lambda().like(!StrUtil.isEmpty(dto.getTeacherName()), XjrUser::getCode, dto.getTeacherName())); userList.addAll(userList2); if (!userList.isEmpty()) { XjrUser xjrUser = userList.get(0); dto.setTeacherId(xjrUser.getId()); tableVo.setTeacherName(xjrUser.getName()); } } if (dto.getStartDate() != null && dto.getEndDate() != null && dto.getIsCustom() == null) { if (dto.getStudentId() == null && dto.getTeacherId() == null && dto.getClassId() == null) { dto.setTeacherId(StpUtil.getLoginIdAsLong()); } else { List schoolRolls = baseStudentSchoolRollService.list(new QueryWrapper().lambda().eq(BaseStudentSchoolRoll::getUserId, dto.getStudentId())); if (schoolRolls != null && !schoolRolls.isEmpty()) { dto.setCourseType("class"); dto.setClassId(schoolRolls.get(0).getClassId()); } } } List list = courseTableMapper.getList(dto); tableVo.setCourseList(list); tableVo.setClassHour(list.size()); if (dto.getClassId() != null) { BaseClass baseClass = baseClassService.getById(dto.getClassId()); tableVo.setClassName(baseClass.getName()); } return tableVo; } /** * 调课顶课查询 */ @Override public List getAdjustList(String teacherId, String adjustDate, String classId, String adjustType) { CourseTableAdjustDto dto = new CourseTableAdjustDto(); if (adjustDate != null && !"".equals(adjustDate)) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate localDateTime = LocalDate.parse(adjustDate, formatter); DayOfWeek dayOfWeek = localDateTime.getDayOfWeek(); dto.setAdjustDate(adjustDate); dto.setWeek(dayOfWeek.getValue()); } dto.setClassId(classId); if (teacherId != null && !"".equals(teacherId)) { dto.setTeacherId(Long.parseLong(teacherId)); } dto.setAdjustType(adjustType); //查询正在进行中或者已经完成 List courseIds = courseTableMapper.getExceptCourseIds(dto.getTeacherId()); dto.setExceptCourseList(courseIds); List list = courseTableMapper.getAdjustList(dto); for (CourseListVo courseListVo : list) { if (courseListVo.getTimePeriod() == 1) { courseListVo.setTimePeriodCn("上午"); } else if (courseListVo.getTimePeriod() == 2) { courseListVo.setTimePeriodCn("下午"); } else if (courseListVo.getTimePeriod() == 3) { courseListVo.setTimePeriodCn("晚上"); } } return list; } @Override public String getPreCheck(String preCheckType, String courseId, String swapCourseId, String swapDate, String subTeacherId) { if (preCheckType != null && !"".equals(preCheckType)) { if (CourseAdjustTypeEnum.courseExchange.getCode().equals(preCheckType)) { CourseTable courseTable = courseTableMapper.selectById(courseId); CourseTable swapCourseTable = courseTableMapper.selectById(swapCourseId); try { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate localDateTime = LocalDate.parse(swapDate, formatter); JsonObject preCheck = getExtendPreCheck(localDateTime, courseTable, swapCourseTable); if (preCheck.get("code").getAsInt() == -1 && !preCheck.get("msg").isJsonNull()) { return preCheck.get("msg").getAsString(); } } catch (Exception e) { throw new RuntimeException(e); } } else if (CourseAdjustTypeEnum.courseSubstitute.getCode().equals(preCheckType)) { CourseTable courseTable = courseTableMapper.selectById(courseId); try { JsonObject jsonObject = substitutePreTestin(subTeacherId, courseTable); if (jsonObject.get("code").getAsInt() == -1 && !jsonObject.get("msg").isJsonNull()) { return jsonObject.get("msg").getAsString(); } } catch (Exception e) { throw new RuntimeException(e); } } } return null; } @Override @Transactional(rollbackFor = Exception.class) public Boolean adjustCourse(WfCourseAdjust courseAdjust) { //先查询课表数据,看是否能够查询到,如果能查到 List list = this.list(new MPJLambdaWrapper().select(CourseTable::getId).select(CourseTable.class, x -> VoToColumnUtil.fieldsToColumns(CourseTable.class).contains(x.getProperty())).innerJoin(CourseTableBak.class, CourseTableBak::getId, CourseTable::getId).eq(CourseTableBak::getWfCourseAdjustId, courseAdjust.getId())); String[] courseIds = courseAdjust.getCourseId().split(","); ArrayList courseIdList = new ArrayList<>(Arrays.asList(courseIds)); String[] exchangeCourseIds = null; int courseCount = courseIds.length; if (CourseAdjustTypeEnum.courseExchange.getCode().equals(courseAdjust.getAdjustType())) { exchangeCourseIds = courseAdjust.getExchangeCourseId().split(","); courseCount += exchangeCourseIds.length; courseIdList.addAll(Arrays.asList(exchangeCourseIds)); } LocalDateTime now = LocalDateTime.now(); if (list.isEmpty() || list.size() != courseCount) { list = this.list(new MPJLambdaWrapper().select(CourseTable::getId).select(CourseTable.class, x -> VoToColumnUtil.fieldsToColumns(CourseTable.class).contains(x.getProperty())).innerJoin(CourseTableBak.class, CourseTableBak::getKeyInfo, CourseTable::getKeyInfo).eq(CourseTableBak::getWfCourseAdjustId, courseAdjust.getId())); Map courseMap = list.stream().collect(Collectors.toMap(CourseTable::getKeyInfo, x -> x)); List bakList = courseTableBakMapper.selectList(new QueryWrapper().lambda().eq(CourseTableBak::getWfCourseAdjustId, courseAdjust.getId())); Map bakKeyInfoMap = bakList.stream().collect(Collectors.toMap(CourseTableBak::getId, CourseTableBak::getKeyInfo)); Map bakCourseMap = bakList.stream().collect(Collectors.toMap(CourseTableBak::getId, x -> x)); if (CourseAdjustTypeEnum.courseExchange.getCode().equals(courseAdjust.getAdjustType())) { for (int i = 0; i < courseIds.length; i++) { String courseId = courseIds[i]; String exchangeCourseId = exchangeCourseIds[i]; if (StrUtil.isEmpty(exchangeCourseId)) { continue; } //调课,将双方课程的日期(schedule_date)、时段(time_period)、节次(time_number)、周(week)、星期几(1-7)(weeks)、星期中文(weeks_cn)对调 CourseTable courseTable = courseMap.get(bakKeyInfoMap.get(Long.parseLong(courseId))); if (courseTable == null) { continue; } CourseTable swapCourseTable = courseMap.get(bakKeyInfoMap.get(Long.parseLong(exchangeCourseId))); if (swapCourseTable == null) { continue; } CourseTableBak courseTableBak = bakCourseMap.get(Long.parseLong(courseId)); CourseTableBak swapCourseTableBak = bakCourseMap.get(Long.parseLong(exchangeCourseId)); courseTable.setAdjustType(courseAdjust.getAdjustType()); courseTable.setCourseName(swapCourseTableBak.getCourseName()); courseTable.setCourseId(swapCourseTableBak.getCourseId()); courseTable.setTeacherId(swapCourseTableBak.getTeacherId()); courseTable.setSiteId(swapCourseTableBak.getSiteId()); courseTable.setTeacherName(swapCourseTableBak.getTeacherName()); // courseTable.setKeyInfo(courseTable.getTeacherId() + "_" // + courseTable.getClassId() + "_" // + courseTable.getScheduleDate() + "_" // + courseTable.getCourseId() + "_" // + courseTable.getSiteId() + "_" // + courseTable.getTimeNumber() // ); courseTableMapper.updateById(courseTable); swapCourseTable.setAdjustType(courseAdjust.getAdjustType()); // swapCourseTable.setKeyInfo(swapCourseTable.getTeacherId() + "_" // + swapCourseTable.getClassId() + "_" // + swapCourseTable.getScheduleDate() + "_" // + swapCourseTable.getCourseId() + "_" // + swapCourseTable.getSiteId() + "_" // + swapCourseTable.getTimeNumber() // ); swapCourseTable.setCourseId(courseTableBak.getCourseId()); swapCourseTable.setCourseName(courseTableBak.getCourseName()); swapCourseTable.setTeacherId(courseTableBak.getTeacherId()); swapCourseTable.setSiteId(courseTableBak.getSiteId()); swapCourseTable.setTeacherName(courseTableBak.getTeacherName()); courseTableMapper.updateById(swapCourseTable); } //提交调课接口 //sendExchange(courseTableBak, swapCourseTableBak, courseAdjust); } else if (CourseAdjustTypeEnum.courseSubstitute.getCode().equals(courseAdjust.getAdjustType())) { for (String courseId : courseIds) { CourseTable courseTable = courseMap.get(bakKeyInfoMap.get(Long.parseLong(courseId))); if (courseTable == null) { continue; } User applyUser = userService.getById(courseAdjust.getUserId());//申请人 User exchangeUser = userService.getById(courseAdjust.getExchangeTeacherId());//顶课人 String teacherId = courseTable.getTeacherId().replace(courseAdjust.getUserId().toString(), courseAdjust.getExchangeTeacherId()); String teacherName = courseTable.getTeacherName().replace(applyUser.getName(), exchangeUser.getName()); courseTable.setAdjustType(courseAdjust.getAdjustType()); courseTable.setTeacherId(teacherId); courseTable.setTeacherName(teacherName); // courseTable.setKeyInfo(teacherId + "_" + courseTable.getClassId() + "_" + courseTable.getScheduleDate() + "_" + courseTable.getCourseId() + "_" + courseTable.getSiteId() + "_" + courseTable.getTimeNumber()); courseTableMapper.updateById(courseTable); } //提交顶课接口 //sendSubstitute(courseTable, courseAdjust); } } else { if (CourseAdjustTypeEnum.courseExchange.getCode().equals(courseAdjust.getAdjustType())) { for (int i = 0; i < courseIds.length; i++) { String courseId = courseIds[i]; String exchangeCourseId = exchangeCourseIds[i]; //调课,将双方课程的日期(schedule_date)、时段(time_period)、节次(time_number)、周(week)、星期几(1-7)(weeks)、星期中文(weeks_cn)对调 CourseTable courseTable = courseTableMapper.selectById(courseId); CourseTable swapCourseTable = courseTableMapper.selectById(exchangeCourseId); if (courseTable == null || swapCourseTable == null) { continue; } CourseTable courseTableBak = BeanUtil.toBean(courseTable, CourseTable.class); CourseTable swapCourseTableBak = BeanUtil.toBean(swapCourseTable, CourseTable.class); courseTable.setAdjustType(courseAdjust.getAdjustType()); courseTable.setCourseName(swapCourseTableBak.getCourseName()); courseTable.setCourseId(swapCourseTableBak.getCourseId()); courseTable.setTeacherId(swapCourseTableBak.getTeacherId()); courseTable.setSiteId(swapCourseTableBak.getSiteId()); courseTable.setTeacherName(swapCourseTableBak.getTeacherName()); // courseTable.setKeyInfo(courseTable.getTeacherId() + "_" // + courseTable.getClassId() + "_" // + courseTable.getScheduleDate() + "_" // + courseTable.getCourseId() + "_" // + courseTable.getSiteId() + "_" // + courseTable.getTimeNumber() // ); courseTable.setModifyDate(now); courseTableMapper.updateById(courseTable); swapCourseTable.setAdjustType(courseAdjust.getAdjustType()); // swapCourseTable.setKeyInfo(swapCourseTable.getTeacherId() + "_" // + swapCourseTable.getClassId() + "_" // + swapCourseTable.getScheduleDate() + "_" // + swapCourseTable.getCourseId() + "_" // + swapCourseTable.getSiteId() + "_" // + swapCourseTable.getTimeNumber() // ); swapCourseTable.setCourseId(courseTableBak.getCourseId()); swapCourseTable.setCourseName(courseTableBak.getCourseName()); swapCourseTable.setTeacherId(courseTableBak.getTeacherId()); swapCourseTable.setSiteId(courseTableBak.getSiteId()); swapCourseTable.setTeacherName(courseTableBak.getTeacherName()); swapCourseTable.setModifyDate(now); courseTableMapper.updateById(swapCourseTable); } //提交调课接口 //sendExchange(courseTableBak, swapCourseTableBak, courseAdjust); } else if (CourseAdjustTypeEnum.courseSubstitute.getCode().equals(courseAdjust.getAdjustType())) { for (String courseId : courseIds) { CourseTable courseTable = courseTableMapper.selectById(courseId); if (courseTable == null) { continue; } User applyUser = userService.getById(courseAdjust.getUserId());//申请人 User exchangeUser = userService.getById(courseAdjust.getExchangeTeacherId());//顶课人 String teacherId = courseTable.getTeacherId().replace(courseAdjust.getUserId().toString(), courseAdjust.getExchangeTeacherId()); String teacherName = courseTable.getTeacherName().replace(applyUser.getName(), exchangeUser.getName()); courseTable.setAdjustType(courseAdjust.getAdjustType()); courseTable.setTeacherId(teacherId); courseTable.setTeacherName(teacherName); courseTable.setModifyDate(now); // courseTable.setKeyInfo(teacherId + "_" + courseTable.getClassId() + "_" + courseTable.getScheduleDate() + "_" + courseTable.getCourseId() + "_" + courseTable.getSiteId() + "_" + courseTable.getTimeNumber()); courseTableMapper.updateById(courseTable); } //提交顶课接口 //sendSubstitute(courseTable, courseAdjust); } } return Boolean.TRUE; } @Override public ByteArrayOutputStream listScheduleWeekExportQuery(ScheduleWeekExportQueryDto dto) { // 创建一个字节输出流 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 获取课程表数据 CourseTableVo courseTableVo = getCourseTableVo(dto); // 构建课程安排导出列表 List scheduleWeekExportQueryVoList = buildScheduleWeekExportQueryList(courseTableVo); // 将数据写入Excel文件 writeScheduleWeekExportToExcel(courseTableVo, outputStream, scheduleWeekExportQueryVoList); return outputStream; } @Override public List getClassListByTeacherId(ClassOptionDto dto) { return this.baseMapper.getClassListByTeacherId(dto); } private CourseTableVo getCourseTableVo(ScheduleWeekExportQueryDto dto) { CourseTableDto courseTableDto = new CourseTableDto(); BeanUtils.copyProperties(dto, courseTableDto); return this.getList(courseTableDto); } private List buildScheduleWeekExportQueryList(CourseTableVo courseTableVo) { List classTimeList = courseTableVo.getClassTimeList(); List courseList = courseTableVo.getCourseList(); List scheduleWeekExportQueryVoList = new ArrayList<>(); if (!courseList.isEmpty()) { Map>> courseDetailVoMap = buildCourseDetailMap(courseList); scheduleWeekExportQueryVoList.addAll(buildScheduleWeekExportQueryVoList(courseDetailVoMap, classTimeList)); } return scheduleWeekExportQueryVoList; } private Map>> buildCourseDetailMap(List courseList) { // 实现构建课程详情Map的逻辑 Map>> courseDetailVoMap = new HashMap<>(); for (CourseDetailVo courseDetailVo : courseList) { int timePeriod = Integer.parseInt(courseDetailVo.getTimePeriod().trim()); int timeNumber = Integer.parseInt(courseDetailVo.getTimeNumber().trim()); // 如果时间段不存在,则创建一个新的时间段Map courseDetailVoMap.putIfAbsent(timePeriod, new HashMap<>()); // 获取当前时间段的Map Map> timePeriodMap = courseDetailVoMap.get(timePeriod); // 如果时间序号不存在,则创建一个新的课程列表 timePeriodMap.putIfAbsent(timeNumber, new ArrayList<>()); // 将课程详情添加到对应的时间段和时间序号中 timePeriodMap.get(timeNumber).add(courseDetailVo); } // 返回构建好的课程详情Map return courseDetailVoMap; } private List buildScheduleWeekExportQueryVoList(Map>> courseDetailVoMap, List classTimeList) { List scheduleWeekExportQueryVoList = new ArrayList<>(); // 实现构建ScheduleWeekExportQueryVo对象列表的逻辑 for (ClassTime classTime : classTimeList) { ScheduleWeekExportQueryVo scheduleWeekExportQueryVo = new ScheduleWeekExportQueryVo(); scheduleWeekExportQueryVo.setTimePeriod(TimePeriodEnum.getValue(classTime.getTimePeriod())); scheduleWeekExportQueryVo.setTimeNumber(TimeNumberEnum.getValue(classTime.getNumber())); Map> timePeriodListMap = courseDetailVoMap.get(classTime.getTimePeriod()); if (timePeriodListMap != null) { List courseDetailVoList = timePeriodListMap.get(classTime.getNumber()); if (courseDetailVoList != null) { for (CourseDetailVo courseDetailVo : courseDetailVoList) { for (int i = 1; i <= 7; i++) { if (courseDetailVo.getWeeks() != i) { continue; } if (courseDetailVo != null) { String courseInfo = courseDetailVo.getCourseName() + "\n" + courseDetailVo.getTeacherName() + "\n" + courseDetailVo.getClassName() + "\n" + courseDetailVo.getClassroomName() + "\n"; switch (i) { case 1: scheduleWeekExportQueryVo.setMonday(courseInfo); break; case 2: scheduleWeekExportQueryVo.setTuesday(courseInfo); break; case 3: scheduleWeekExportQueryVo.setWednesday(courseInfo); break; case 4: scheduleWeekExportQueryVo.setThursday(courseInfo); break; case 5: scheduleWeekExportQueryVo.setFriday(courseInfo); break; case 6: scheduleWeekExportQueryVo.setSaturday(courseInfo); break; case 7: scheduleWeekExportQueryVo.setSunday(courseInfo); break; } } } } } } scheduleWeekExportQueryVoList.add(scheduleWeekExportQueryVo); } // 返回构建好的ScheduleWeekExportQueryVo对象列表 return scheduleWeekExportQueryVoList; } private void writeScheduleWeekExportToExcel(CourseTableVo courseTableVo, ByteArrayOutputStream outputStream, List scheduleWeekExportQueryVoList) { // 创建内容样式 WriteCellStyle contentWriteCellStyle = createContentCellStyle(); // 创建头部样式 WriteCellStyle headWriteCellStyle = createHeadCellStyle(); // 将数据写入Excel文件 try (ExcelWriter excelWriter = EasyExcel.write(outputStream, ScheduleWeekExportQueryVo.class).registerWriteHandler(new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle)).build()) { writeSheetHead(courseTableVo, excelWriter); writeSheetContent(excelWriter, scheduleWeekExportQueryVoList); } } private void writeSheetContent(ExcelWriter excelWriter, List scheduleWeekExportQueryVoList) { int mergeRowIndex = 2; int[] mergeColumeIndex = {0}; ExcelMergeUtil excelFillCellMergeStrategy = new ExcelMergeUtil(mergeRowIndex, mergeColumeIndex); WriteTable writeSheetContentTable = EasyExcel.writerTable(1).needHead(Boolean.TRUE).automaticMergeHead(Boolean.TRUE).registerWriteHandler(excelFillCellMergeStrategy).build(); excelWriter.write(scheduleWeekExportQueryVoList, EasyExcel.writerSheet("模板").build(), writeSheetContentTable); } private void writeSheetHead(CourseTableVo courseTableVo, ExcelWriter excelWriter) { List> sheetHeadList = new ArrayList<>(); sheetHeadList.add(Collections.singletonList(courseTableVo.getSemesterName() + " " + ((courseTableVo.getTeacherName() != null) ? courseTableVo.getTeacherName() : courseTableVo.getClassName()) + " " + courseTableVo.getWeek() + " " + "课程表")); ExcelFillCellMergePrevColUtil sheetHeadColumn = new ExcelFillCellMergePrevColUtil(); sheetHeadColumn.add(0, 0, 8); WriteTable writeSheetHeadTable = EasyExcel.writerTable(0).needHead(Boolean.TRUE).head(sheetHeadList).registerWriteHandler(sheetHeadColumn).build(); excelWriter.write(new ArrayList<>(), EasyExcel.writerSheet("模板").needHead(Boolean.FALSE).build(), writeSheetHeadTable); } private WriteCellStyle createContentCellStyle() { WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); contentWriteCellStyle.setWrapped(true); WriteFont contentWriteFont = new WriteFont(); contentWriteFont.setFontHeightInPoints((short) 12); contentWriteFont.setFontName("宋体"); contentWriteCellStyle.setWriteFont(contentWriteFont); contentWriteCellStyle.setBorderBottom(BorderStyle.THIN); contentWriteCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); contentWriteCellStyle.setBorderLeft(BorderStyle.THIN); contentWriteCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); contentWriteCellStyle.setBorderRight(BorderStyle.THIN); contentWriteCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); contentWriteCellStyle.setBorderTop(BorderStyle.THIN); contentWriteCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); return contentWriteCellStyle; } private WriteCellStyle createHeadCellStyle() { WriteCellStyle headWriteCellStyle = new WriteCellStyle(); WriteFont headWriteFont = new WriteFont(); headWriteFont.setFontName("宋体"); headWriteFont.setFontHeightInPoints((short) 14); headWriteFont.setBold(true); headWriteCellStyle.setWriteFont(headWriteFont); headWriteCellStyle.setBorderBottom(BorderStyle.THIN); headWriteCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); headWriteCellStyle.setBorderLeft(BorderStyle.THIN); headWriteCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); headWriteCellStyle.setBorderRight(BorderStyle.THIN); headWriteCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); headWriteCellStyle.setBorderTop(BorderStyle.THIN); headWriteCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); headWriteCellStyle.setWrapped(true); headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); headWriteCellStyle.setShrinkToFit(true); return headWriteCellStyle; } /** * 提交顶课接口 * * @param courseTable * @param courseAdjust * @throws Exception */ void sendSubstitute(CourseTable courseTable, WfCourseAdjust courseAdjust) throws Exception { String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/Substitute/Submit"; JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("timetableId", courseTable.getJianyueId()); jsonObject.addProperty("isCycles", Boolean.FALSE); jsonObject.addProperty("reason", courseAdjust.getReason()); jsonObject.addProperty("teacherId", courseAdjust.getUserId()); JsonArray extendIds = new JsonArray(); extendIds.add(courseTable.getTeacherId()); jsonObject.add("extendIds", extendIds); //获取时间戳 long timestamp = System.currentTimeMillis(); //生成签名 String sign = ScheduleUtil.createSign(timestamp); String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp); } /** * 提交调课 * * @param courseTable * @param swapCourseTable * @throws Exception */ void sendExchange(CourseTable courseTable, CourseTable swapCourseTable, WfCourseAdjust courseAdjust) throws Exception { String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/Submit"; JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("timetableId", courseTable.getJianyueId()); jsonObject.addProperty("isCycles", Boolean.FALSE); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); jsonObject.addProperty("date", swapCourseTable.getScheduleDate().format(formatter)); jsonObject.addProperty("numberOfDay", swapCourseTable.getTimeNumber()); jsonObject.addProperty("rescheduleId", swapCourseTable.getJianyueId()); jsonObject.addProperty("reason", courseAdjust.getReason()); jsonObject.addProperty("teacherId", courseAdjust.getUserId()); //获取时间戳 long timestamp = System.currentTimeMillis(); //生成签名 String sign = ScheduleUtil.createSign(timestamp); String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp); } /** * 顶课预检查 * * @param courseTable * @return 检查结果 */ JsonObject substitutePreTestin(String subTeacherId, CourseTable courseTable) throws Exception { JsonParser jsonParser = new JsonParser(); String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/Substitute/PreTesting"; JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("timetableId", courseTable.getJianyueId()); jsonObject.addProperty("isCycles", Boolean.FALSE); JsonArray extendIds = new JsonArray(); extendIds.add(subTeacherId); jsonObject.add("extendIds", extendIds); //获取时间戳 long timestamp = System.currentTimeMillis(); //生成签名 String sign = ScheduleUtil.createSign(timestamp); String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp); if (StrUtil.isEmpty(result)) { return null; } return jsonParser.parse(result).getAsJsonObject(); } /** * 调课预检查 * * @param courseTable 需要调整的课程 * @param swapCourseTable 对调的课程 * @return 检查结果 */ JsonObject getExtendPreCheck(LocalDate swapDate, CourseTable courseTable, CourseTable swapCourseTable) throws Exception { JsonParser jsonParser = new JsonParser(); String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/PreTesting"; JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("timetableId", courseTable.getJianyueId()); jsonObject.addProperty("isCycles", Boolean.FALSE); // jsonObject.addProperty("startDate", "2024-01-01"); // jsonObject.addProperty("endDate", "2024-01-31"); // jsonObject.addProperty("dayOfweek", 5); jsonObject.addProperty("numberOfday", swapCourseTable.getTimeNumber()); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); jsonObject.addProperty("date", swapDate.format(formatter)); jsonObject.addProperty("reschduleId", courseTable.getJianyueId()); //获取时间戳 long timestamp = System.currentTimeMillis(); //生成签名 String sign = ScheduleUtil.createSign(timestamp); String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp); if (StrUtil.isEmpty(result)) { return null; } return jsonParser.parse(result).getAsJsonObject(); } /** * 获取节次 * * @return */ private Map getClassTimeMap() { List classTimes = classTimeMapper.selectList(null); Map result = new HashMap<>(); for (ClassTime item : classTimes) { String key = String.format("%d_%d", item.getTimePeriod(), item.getNumber()); result.put(key, item); } return result; } /** * 当前时间是否在夏季 * * @return */ private Boolean isCurrentSummer() { DateTime now = DateUtil.date(); DateTime summerStart = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getSummerStart())); DateTime summerEnd = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getSummerEnd())); DateTime winterStart = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getWinterStart())); DateTime winterEnd = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getWinterEnd())); // 如果开始时间大于结束时间,开始时间增加1年 if (DateUtil.compare(summerStart, summerEnd) > 0) { summerEnd = DateUtil.offset(summerEnd, DateField.DAY_OF_YEAR, 1); } if (DateUtil.compare(winterStart, winterEnd) > 0) { winterEnd = DateUtil.offset(winterEnd, DateField.DAY_OF_YEAR, 1); } return DateUtil.compare(summerStart, now) > 0 && DateUtil.compare(summerEnd, now) < 0; } /** * 解析word课表 * * @param inputStream * @return * @throws IOException */ private List courseTableWordParses(InputStream inputStream) throws IOException { XWPFDocument doc = new XWPFDocument(inputStream); List paras = doc.getParagraphs(); String semester = null; List cNames = new ArrayList<>(); //获取标题 for (int i = 0; i < paras.size(); i++) { String txt = paras.get(i).getText(); if (i == 0) { semester = txt; continue; } txt = txt.replaceAll("总课程表", "").replace("\n", "").trim(); if (!txt.equals("") && !txt.equals(semester)) { cNames.add(txt); } } List result = new ArrayList<>(); //获取文档中所有的表格 List tables = doc.getTables(); int tNum = 0; for (XWPFTable table : tables) { int rNum = 0; String timePeriod = null; List weeks = new ArrayList<>(); List rows = table.getRows(); for (XWPFTableRow row : rows) { //获取行对应的单元格 List cells = row.getTableCells(); String timeNumber = null; for (int i = 0; i < cells.size(); i++) { String cellText = cells.get(i).getText(); if (cellText.equals("") || rNum < 1) continue; if (rNum == 1) { weeks.add(cellText); continue; } if (i == 0) { timePeriod = cellText; continue; } if (i == 1) { timeNumber = cellText; continue; } List cParagraph = cells.get(i).getParagraphs(); CourseTableParse item = new CourseTableParse(); item.setSemester(semester); item.setTimePeriod(TimePeriodEnum.getCode(timePeriod)); item.setTimeNumber(TimeNumberEnum.getCode(timeNumber)); String week = weeks.get(Math.max(i - 2, 0)); item.setWeeksCn(week); item.setClassName(cNames.get(tNum)); for (int j = 0; j < cParagraph.size(); j++) { cellText = cParagraph.get(j).getText().trim(); switch (j) { case 0: item.setCourseName(cellText); break; case 1: item.setTeacherName(cellText); break; case 2: item.setSiteName(cellText); break; } } result.add(item); } rNum++; } tNum++; } inputStream.close(); return result; } @Override public void deleteBakData(Long wfCourseAdjustId) { courseTableBakMapper.delete(new QueryWrapper().lambda().eq(CourseTableBak::getWfCourseAdjustId, wfCourseAdjustId)); } @Override public ByteArrayOutputStream scheduleWeekExportQuery(CourseTableDto dto) { try { CourseTableVo data = this.getList(dto); Workbook workbook = new XSSFWorkbook(); // 创建一个工作表(sheet) String sheetName = "课表"; Sheet sheet = workbook.createSheet(sheetName); createFirstTitle(workbook, sheet, data, dto); createSecondTitle(workbook, sheet, 1); Map timeNumberMap = data.getClassTimeList().stream().collect(Collectors.toMap(ClassTime::getNumber, x -> x)); Map> timeNumberDataMap = data.getCourseList().stream().collect(Collectors.groupingBy(CourseDetailVo::getTimeNumber)); List weekList = new ArrayList<>(); weekList.add(1); weekList.add(2); weekList.add(3); weekList.add(4); weekList.add(5); weekList.add(6); weekList.add(7); Collections.sort(weekList); List timeNumberList = data.getClassTimeList().stream().map(ClassTime::getNumber).collect(Collectors.toList()); Collections.sort(timeNumberList); Map timePeriodMap = data.getClassTimeList().stream().collect(Collectors.toMap(ClassTime::getNumber, ClassTime::getTimePeriod)); ArrayList> dataList = new ArrayList<>(); for (Integer timeNumber : timeNumberList) { ArrayList rowData = new ArrayList<>(); Integer timePeriod = timePeriodMap.get(timeNumber); String timePeriodStr = ""; if (timePeriod == 1) { timePeriodStr = "上午"; } else if (timePeriod == 2) { timePeriodStr = "下午"; } else if (timePeriod == 3) { timePeriodStr = "晚上"; } rowData.add(timePeriodStr); ClassTime classTime = timeNumberMap.get(timeNumber); String timeNumberStr = classTime.getShortName() + "\r\n" + classTime.getSummerStartTime() + "-" + classTime.getSummerEndTime(); rowData.add(timeNumberStr); List list1 = timeNumberDataMap.get(timeNumber.toString()); if (list1 == null) { for (Integer week : weekList) { rowData.add(""); } dataList.add(rowData); continue; } Map> weeksMap = list1.stream().collect(Collectors.groupingBy(CourseDetailVo::getWeeks)); for (Integer week : weekList) { String content = ""; List list = weeksMap.get(week); if (list != null && !list.isEmpty()) { if (list.size() == 1) { CourseDetailVo courseDetailVo = list.get(0); content += courseDetailVo.getCourseName() + "\r\n"; content += courseDetailVo.getClassroomName() + "\r\n"; if ("teacher".equals(dto.getCourseType())) { content += courseDetailVo.getClassName(); } else if ("class".equals(dto.getCourseType())) { content += courseDetailVo.getTeacherName(); } } else { CourseDetailVo courseDetailVo = list.get(0); content += courseDetailVo.getCourseName() + "\r\n"; content += courseDetailVo.getClassroomName() + "\r\n"; if ("teacher".equals(dto.getCourseType())) { content += courseDetailVo.getClassName(); } else if ("class".equals(dto.getCourseType())) { Set classNames = list.stream().map(CourseDetailVo::getTeacherName).collect(Collectors.toSet()); content += classNames.toString().replace("]", "").replace("[", "").replace(" ", ""); } } } rowData.add(content); } dataList.add(rowData); } Font font = workbook.createFont(); font.setFontName("宋体"); font.setFontHeightInPoints((short) 9); // 创建一个单元格样式对象 CellStyle cellStyle = workbook.createCellStyle(); cellStyle.setFont(font); // 将字体应用到样式 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setWrapText(true); cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); int rowNumber = 2; for (ArrayList strings : dataList) { Row row = sheet.createRow(rowNumber); int cellNumber = 0; for (String string : strings) { Cell row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue(string); row1cell1.setCellStyle(cellStyle); cellNumber++; } rowNumber++; row.setHeightInPoints(48); } //合并 Map> collect = data.getClassTimeList().stream().collect(Collectors.groupingBy(ClassTime::getTimePeriod, Collectors.mapping(ClassTime::getNumber, Collectors.toList()))); int firstRow = 2; for (Integer i : collect.keySet()) { int lastRow = firstRow + collect.get(i).size() - 1; if (lastRow == firstRow) { continue; } sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, 0, 0)); firstRow = firstRow + collect.get(i).size(); } ByteArrayOutputStream bot = new ByteArrayOutputStream(); workbook.write(bot); return bot; } catch (Exception e) { Log.error(e.getMessage(), e); throw new MyException("导出报错,请联系管理员"); } } void createSecondTitle(Workbook workbook, Sheet sheet, int rowNumber) { // 创建一个字体对象 Font font = workbook.createFont(); font.setBold(true);// 设置为粗体 font.setFontName("宋体"); //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色 font.setFontHeightInPoints((short) 12); // 创建一个单元格样式对象 CellStyle cellStyle = workbook.createCellStyle(); cellStyle.setFont(font); // 将字体应用到样式 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); Row row = sheet.createRow(rowNumber); int cellNumber = 0; Cell row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue("时间"); row1cell1.setCellStyle(cellStyle); sheet.setColumnWidth(0, 4 * 256); cellNumber++; row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue(""); row1cell1.setCellStyle(cellStyle); //合并 sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, 1)); cellNumber++; sheet.setColumnWidth(1, 12 * 256); row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue("周一"); row1cell1.setCellStyle(cellStyle); sheet.setColumnWidth(2, 16 * 256); cellNumber++; row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue("周二"); row1cell1.setCellStyle(cellStyle); sheet.setColumnWidth(cellNumber, 16 * 256); cellNumber++; row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue("周三"); row1cell1.setCellStyle(cellStyle); sheet.setColumnWidth(cellNumber, 16 * 256); cellNumber++; row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue("周四"); row1cell1.setCellStyle(cellStyle); sheet.setColumnWidth(cellNumber, 16 * 256); cellNumber++; row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue("周五"); row1cell1.setCellStyle(cellStyle); sheet.setColumnWidth(cellNumber, 16 * 256); cellNumber++; row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue("周六"); row1cell1.setCellStyle(cellStyle); sheet.setColumnWidth(cellNumber, 16 * 256); cellNumber++; row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue("周日"); row1cell1.setCellStyle(cellStyle); sheet.setColumnWidth(cellNumber, 16 * 256); } void createFirstTitle(Workbook workbook, Sheet sheet, CourseTableVo data, CourseTableDto dto) { // 创建一个字体对象 Font font = workbook.createFont(); font.setBold(true);// 设置为粗体 font.setFontName("宋体"); //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色 font.setFontHeightInPoints((short) 18); // 创建一个单元格样式对象 CellStyle cellStyle = workbook.createCellStyle(); cellStyle.setFont(font); // 将字体应用到样式 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); Row row = sheet.createRow(0); String title = data.getSemesterName(); if ("class".equals(dto.getCourseType())) { title += " " + data.getClassName() + " "; } else if ("teacher".equals(dto.getCourseType())) { title += " " + data.getTeacherName() + " "; } title += data.getWeek() + " 课程表"; int cellNumber = 0; Cell row1cell1 = row.createCell(cellNumber); row1cell1.setCellValue(title); row1cell1.setCellStyle(cellStyle); for (int i = 1; i < 9; i++) { row1cell1 = row.createCell(i); row1cell1.setCellValue(""); row1cell1.setCellStyle(cellStyle); } //合并 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8)); // sheet.setColumnWidth(0, 335 * 256); } public Integer getSubstituteTeacherCourseCountByParams(ClassTeacherDto dto) { return this.baseMapper.getSubstituteTeacherCourseCountByParams(dto); } /** * 课表导出 * * @param dto * @return */ @Override public ByteArrayOutputStream exportQuery(CourseTableExportQueryDto dto) throws IOException { BaseSemester baseSemester = baseSemesterMapper.selectById(dto.getSemesterId()); CourseTableExportQueryUtil exportQueryUtil = new CourseTableExportQueryUtil(); String schoolName = "重庆市铜梁职业教育中心"; ByteArrayOutputStream bot = new ByteArrayOutputStream(); //查询数据 CourseTableDto dataDto = new CourseTableDto(); dataDto.setSemesterId(dto.getSemesterId()); dataDto.setWeek(dto.getWeek()); dataDto.setIsCustom(1); CourseTableVo tableVo = this.getList(dataDto); if ("class".equals(dto.getCourseType())) {//班级课表 //根据年级、专业部,查询需要导出的班级 List classList = baseClassService.list(new QueryWrapper().lambda().eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode()).eq(BaseClass::getIsGraduate, 1).in(BaseClass::getGradeId, dto.getGradeIds()).in(BaseClass::getOrgId, dto.getDeptIds())); if (classList.isEmpty()) { throw new MyException("未查询到班级,无法导出"); } Map> classDataMap = tableVo.getCourseList().stream().filter(x -> x.getClassName() != null).collect(Collectors.groupingBy(CourseDetailVo::getClassName)); List teacherIds = classList.stream().map(BaseClass::getTeacherId).collect(Collectors.toList()); List userList = userService.listByIds(teacherIds); Map teacherMap = userList.stream().collect(Collectors.toMap(User::getId, User::getName)); Workbook workbook = new XSSFWorkbook(); String sheetName = "班级课表"; Sheet sheet = workbook.createSheet(sheetName); String bigHead = "课程表"; int classTableRowCount = 16;//每个班的课表占用的总行数 int i = 0; for (BaseClass baseClass : classList) { CourseTableVo classData = new CourseTableVo(); classData.setClassTimeList(tableVo.getClassTimeList()); if (!classDataMap.containsKey(baseClass.getName())) { continue; } classData.setCourseList(classDataMap.get(baseClass.getName())); String rightName = "班主任:" + teacherMap.get(baseClass.getTeacherId()) + " 行政班:" + baseClass.getName(); int bigHeadRow = (classTableRowCount + 3) * i; //生成第一行title ImportExcelUtil.createBigHead(workbook, sheet, bigHead, bigHeadRow, 8); //生成副标题,展示所属学期 ImportExcelUtil.createSubtitle(workbook, sheet, baseSemester.getName(), bigHeadRow + 1, 8); //生成第三行,显示学校名字、班主任和班级名字 exportQueryUtil.createThirdTitle(workbook, sheet, bigHeadRow + 2, schoolName, rightName); //生成表头 createSecondTitle(workbook, sheet, bigHeadRow + 3); //生成内容 exportQueryUtil.createContent(workbook, sheet, bigHeadRow + 4, classData, dto.getCourseType()); i++; } workbook.write(bot); } else if ("teacher".equals(dto.getCourseType())) {//教师课表 //根据学期和周次,查询当前所有有课表的教师id LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault()); LocalDate startDate = startDateTime.plusDays((dto.getWeek() - 1) * 7L).toLocalDate(); LocalDate endDate = startDate.plusDays(6); List list = this.list(new QueryWrapper().lambda().eq(CourseTable::getBaseSemesterId, dto.getSemesterId()).ge(CourseTable::getScheduleDate, startDate).le(CourseTable::getScheduleDate, endDate)); Set teacherIds = list.stream().map(CourseTable::getTeacherId).collect(Collectors.toSet()); Set teacherIdList = new HashSet<>(); for (String teacherId : teacherIds) { String[] split = teacherId.split(", "); for (String s : split) { teacherIdList.add(Long.parseLong(s)); } } List userList = userService.listByIds(teacherIdList); Workbook workbook = new XSSFWorkbook(); String sheetName = "教师课表"; Sheet sheet = workbook.createSheet(sheetName); String bigHead = "课程表"; int classTableRowCount = 16;//每个班的课表占用的总行数 for (int i = 0; i < userList.size(); i++) { User user = userList.get(i); List courseList = tableVo.getCourseList().stream().filter(x -> x.getTeacherName().contains(user.getName())).collect(Collectors.toList()); CourseTableVo classData = new CourseTableVo(); classData.setClassTimeList(tableVo.getClassTimeList()); classData.setCourseList(courseList); String rightName = "教师:" + user.getName(); int bigHeadRow = (classTableRowCount + 3) * i; //生成第一行title ImportExcelUtil.createBigHead(workbook, sheet, bigHead, bigHeadRow, 8); //生成副标题,展示所属学期 ImportExcelUtil.createSubtitle(workbook, sheet, baseSemester.getName(), bigHeadRow + 1, 8); //生成第三行,显示学校名字、班主任和班级名字 exportQueryUtil.createThirdTitle(workbook, sheet, bigHeadRow + 2, schoolName, rightName); //生成表头 createSecondTitle(workbook, sheet, bigHeadRow + 3); //生成内容 exportQueryUtil.createContent(workbook, sheet, bigHeadRow + 4, classData, dto.getCourseType()); } workbook.write(bot); } else if ("classroom".equals(dto.getCourseType())) {//教室课表 Map> classroomDataMap = tableVo.getCourseList().stream().filter(x -> x.getClassroomName() != null).collect(Collectors.groupingBy(CourseDetailVo::getClassroomName)); List classroomList = classroomMapper.selectList(new QueryWrapper().lambda().eq(BaseClassroom::getDeleteMark, DeleteMark.NODELETE.getCode())); List buildList = officeBuildMapper.selectList(new QueryWrapper().lambda().eq(BaseOfficeBuild::getDeleteMark, DeleteMark.NODELETE.getCode())); Map buildMap = buildList.stream().collect(Collectors.toMap(BaseOfficeBuild::getId, BaseOfficeBuild::getName)); Workbook workbook = new XSSFWorkbook(); String sheetName = "教室课表"; Sheet sheet = workbook.createSheet(sheetName); String bigHead = "课程表"; int classTableRowCount = 16;//每个班的课表占用的总行数 int i = 0; for (BaseClassroom baseClassroom : classroomList) { String classroomName = buildMap.get(baseClassroom.getOfficeBuildId()) + baseClassroom.getName(); if (!classroomDataMap.containsKey(classroomName)) { continue; } List courseList = classroomDataMap.get(classroomName); CourseTableVo classData = new CourseTableVo(); classData.setClassTimeList(tableVo.getClassTimeList()); classData.setCourseList(courseList); int bigHeadRow = (classTableRowCount + 3) * i; //生成第一行title ImportExcelUtil.createBigHead(workbook, sheet, bigHead, bigHeadRow, 8); //生成副标题,展示所属学期 ImportExcelUtil.createSubtitle(workbook, sheet, baseSemester.getName(), bigHeadRow + 1, 8); //生成第三行,显示学校名字、班主任和班级名字 exportQueryUtil.createThirdTitle(workbook, sheet, bigHeadRow + 2, schoolName, classroomName); //生成表头 createSecondTitle(workbook, sheet, bigHeadRow + 3); //生成内容 exportQueryUtil.createContent(workbook, sheet, bigHeadRow + 4, classData, dto.getCourseType()); i++; } workbook.write(bot); } else if ("all".equals(dto.getCourseType())) {//总课表 //根据年级、专业部,查询需要导出的班级 List classList = baseClassService.list(new QueryWrapper().lambda().eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode()).eq(BaseClass::getIsGraduate, 1).in(BaseClass::getGradeId, dto.getGradeIds()).in(BaseClass::getOrgId, dto.getDeptIds()).orderByAsc(BaseClass::getName)); if (classList.isEmpty()) { throw new MyException("未查询到班级,无法导出"); } Map> classDataMap = tableVo.getCourseList().stream().filter(x -> x.getClassName() != null).collect(Collectors.groupingBy(CourseDetailVo::getClassName)); ArrayList> dataList = new ArrayList<>(); for (BaseClass baseClass : classList) { List detailVoList = classDataMap.get(baseClass.getName()); if (detailVoList == null) { continue; } Map> weeksMap = detailVoList.stream().collect(Collectors.groupingBy(CourseDetailVo::getWeeks)); List weekList = new ArrayList<>(); weekList.add(1); weekList.add(2); weekList.add(3); weekList.add(4); weekList.add(5); weekList.add(6); weekList.add(7); ArrayList classData = new ArrayList<>(); classData.add(baseClass.getName()); for (Integer weeks : weekList) { if (!weeksMap.containsKey(weeks)) { for (ClassTime classTime : tableVo.getClassTimeList()) { classData.add(""); } continue; } Map timeNumberMap = weeksMap.get(weeks).stream().filter(x -> x.getTimeNumber() != null).collect(Collectors.toMap(CourseDetailVo::getTimeNumber, x -> x)); for (ClassTime classTime : tableVo.getClassTimeList()) { CourseDetailVo courseDetailVo = timeNumberMap.get(classTime.getNumber().toString()); if (courseDetailVo == null) { classData.add(""); continue; } String content = courseDetailVo.getCourseName() + "\r\n" + courseDetailVo.getTeacherName(); if (courseDetailVo.getClassroomName() != null) { content += "\r\n" + courseDetailVo.getClassroomName(); } classData.add(content); } } dataList.add(classData); } Workbook workbook = new XSSFWorkbook(); String sheetName = "总课表"; Sheet sheet = workbook.createSheet(sheetName); exportQueryUtil.createAllCourseTableTitle(workbook, sheet, tableVo.getClassTimeList()); Font font = workbook.createFont(); font.setFontName("宋体"); font.setFontHeightInPoints((short) 12); CellStyle cellStyle = workbook.createCellStyle(); cellStyle.setFont(font); // 将字体应用到样式 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); cellStyle.setBorderLeft(BorderStyle.THIN); cellStyle.setBorderRight(BorderStyle.THIN); cellStyle.setWrapText(true); int rowNumber = 2; for (ArrayList rowData : dataList) { Row row = sheet.createRow(rowNumber); for (int i = 0; i < rowData.size(); i++) { Cell cell = row.createCell(i); cell.setCellValue(rowData.get(i)); cell.setCellStyle(cellStyle); } rowNumber++; row.setHeightInPoints(48); } workbook.write(bot); } return bot; } @Override public CurrentWeekVo getCurrentWeekOld(CourseTableDto dto) { BaseSemester baseSemester = baseSemesterService.getCurrentSemester(); if (baseSemester == null) { return null; } LocalDateTime now = LocalDateTime.now(); if (dto.getScheduleDate() != null) { now = dto.getScheduleDate(); } //计算本周是第几周 LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault()); LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingEnd().toInstant(), ZoneId.systemDefault()); Duration between = Duration.between(startDateTime, endDateTime); long days = between.toDays(); int weeks = (int) Math.ceil((double) days / 7); for (int i = 0; i < weeks; i++) { LocalDateTime startDate = startDateTime.plusDays(i * 7L).withHour(0).withMinute(0).withSecond(0).withNano(0); LocalDateTime endDate = startDate.plusDays(6).withHour(23).withMinute(59).withSecond(59).withNano(9999); if (now.isAfter(startDate) && now.isBefore(endDate)) { CurrentWeekVo currentWeekVo = new CurrentWeekVo(); currentWeekVo.setWeek(i + 1); currentWeekVo.setStartDate(startDate.toLocalDate()); currentWeekVo.setEndDate(endDate.toLocalDate()); return currentWeekVo; } } return null; } @Override public CurrentWeekVo getCurrentWeek(CourseTableDto dto) { BaseSemester baseSemester = baseSemesterService.getCurrentSemester(); if (baseSemester == null) { return null; } LocalDateTime now = LocalDateTime.now(); if (dto.getScheduleDate() != null) { now = dto.getScheduleDate(); } LocalDate semesterStart = LocalDate.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault()); LocalDate semesterEnd = LocalDate.ofInstant(baseSemester.getTeachingEnd().toInstant(), ZoneId.systemDefault()); // 调整开始日期到本周星期一 LocalDate adjustedStart = semesterStart.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)); // 调整结束日期到本周星期日 LocalDate adjustedEnd = semesterEnd.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY)); // 计算总周数 long totalDays = java.time.temporal.ChronoUnit.DAYS.between(adjustedStart, adjustedEnd) + 1; int totalWeeks = (int) (totalDays / 7); // 生成每一周的信息 for (int i = 0; i < totalWeeks; i++) { LocalDateTime startDate = adjustedStart.plusWeeks(i).atStartOfDay();//.atTime(0, 0, 0); LocalDateTime endDate = startDate.plusDays(6).withHour(23).withMinute(59).withSecond(59).withNano(9999); if (now.isAfter(startDate) && now.isBefore(endDate)) { CurrentWeekVo currentWeekVo = new CurrentWeekVo(); currentWeekVo.setWeek(i + 1); currentWeekVo.setStartDate(startDate.toLocalDate()); currentWeekVo.setEndDate(endDate.toLocalDate()); return currentWeekVo; } } return null; } }