package com.xjrsoft.module.courseTable.service.impl; 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.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.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.config.TimetableConfig; import com.xjrsoft.module.base.entity.BaseClass; import com.xjrsoft.module.base.entity.BaseSemester; 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.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.schedule.dto.CourseTableDto; import com.xjrsoft.module.schedule.vo.CourseDetailVo; import com.xjrsoft.module.schedule.vo.CourseTableVo; import com.xjrsoft.module.teacher.entity.BaseTeacher; import com.xjrsoft.module.teacher.entity.XjrUser; import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService; import lombok.AllArgsConstructor; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableCell; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.io.InputStream; import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; 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; @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()); } 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(null); 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(); //计算本周是第几周 LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getStartDate().toInstant(), ZoneId.systemDefault()); LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getEndDate().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 * 7).withHour(0).withMinute(0).withSecond(0).withNano(0); LocalDateTime endDate = startDateTime.plusDays((i + 1) * 7).withHour(23).withMinute(59).withSecond(59).withNano(9999); if(now.isAfter(startDate) && now.isBefore(endDate)){ tableVo.setWeek("第" + (i + 1) + "周"); } } } if(!StrUtil.isEmpty(dto.getTeacherName())){ List userList = teacherbaseManagerService.list( new QueryWrapper().lambda() .like(!StrUtil.isEmpty(dto.getTeacherName()), XjrUser::getName, dto.getTeacherName()) .like(!StrUtil.isEmpty(dto.getJobNumber()), XjrUser::getCode, dto.getJobNumber()) ); if(userList != null && !userList.isEmpty()){ XjrUser xjrUser = userList.get(0); dto.setTeacherId(xjrUser.getId()); tableVo.setTeacherName(xjrUser.getName()); } } 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; } /** * 获取节次 * * @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); } if (DateUtil.compare(summerStart, now) > 0 && DateUtil.compare(summerEnd, now) < 0) { return true; } return false; } /** * 解析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; } }