CourseTableServiceImpl.java 68 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424
  1. package com.xjrsoft.module.courseTable.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.date.DateField;
  5. import cn.hutool.core.date.DateTime;
  6. import cn.hutool.core.date.DateUtil;
  7. import cn.hutool.core.util.ObjectUtil;
  8. import cn.hutool.core.util.StrUtil;
  9. import com.alibaba.excel.EasyExcel;
  10. import com.alibaba.excel.ExcelWriter;
  11. import com.alibaba.excel.write.metadata.WriteTable;
  12. import com.alibaba.excel.write.metadata.style.WriteCellStyle;
  13. import com.alibaba.excel.write.metadata.style.WriteFont;
  14. import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
  15. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  16. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  17. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  18. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  19. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  20. import com.google.gson.JsonArray;
  21. import com.google.gson.JsonObject;
  22. import com.google.gson.JsonParser;
  23. import com.xjrsoft.common.enums.CourseAdjustTypeEnum;
  24. import com.xjrsoft.common.enums.DeleteMark;
  25. import com.xjrsoft.common.enums.TimeNumberEnum;
  26. import com.xjrsoft.common.enums.TimePeriodEnum;
  27. import com.xjrsoft.common.enums.WeekEnum;
  28. import com.xjrsoft.common.exception.MyException;
  29. import com.xjrsoft.common.utils.VoToColumnUtil;
  30. import com.xjrsoft.common.utils.excel.ExcelFillCellMergePrevColUtil;
  31. import com.xjrsoft.common.utils.excel.ExcelMergeUtil;
  32. import com.xjrsoft.config.TimetableConfig;
  33. import com.xjrsoft.module.base.entity.BaseClass;
  34. import com.xjrsoft.module.base.entity.BaseClassroom;
  35. import com.xjrsoft.module.base.entity.BaseOfficeBuild;
  36. import com.xjrsoft.module.base.entity.BaseSemester;
  37. import com.xjrsoft.module.base.mapper.BaseClassroomMapper;
  38. import com.xjrsoft.module.base.mapper.BaseOfficeBuildMapper;
  39. import com.xjrsoft.module.base.mapper.BaseSemesterMapper;
  40. import com.xjrsoft.module.base.service.IBaseClassService;
  41. import com.xjrsoft.module.base.service.IBaseSemesterService;
  42. import com.xjrsoft.module.courseTable.dto.ClassListDto;
  43. import com.xjrsoft.module.courseTable.dto.ClassTeacherDto;
  44. import com.xjrsoft.module.courseTable.dto.CourseTableParse;
  45. import com.xjrsoft.module.courseTable.entity.ClassTime;
  46. import com.xjrsoft.module.courseTable.entity.CourseTable;
  47. import com.xjrsoft.module.courseTable.mapper.ClassTimeMapper;
  48. import com.xjrsoft.module.courseTable.mapper.CourseTableMapper;
  49. import com.xjrsoft.module.courseTable.service.ICourseTableService;
  50. import com.xjrsoft.module.courseTable.vo.ClassListVo;
  51. import com.xjrsoft.module.organization.entity.User;
  52. import com.xjrsoft.module.organization.service.IUserService;
  53. import com.xjrsoft.module.schedule.dto.ClassOptionDto;
  54. import com.xjrsoft.module.schedule.dto.CourseTableAdjustDto;
  55. import com.xjrsoft.module.schedule.dto.CourseTableDto;
  56. import com.xjrsoft.module.schedule.dto.CourseTableExportQueryDto;
  57. import com.xjrsoft.module.schedule.dto.ScheduleWeekExportQueryDto;
  58. import com.xjrsoft.module.schedule.entity.CourseTableBak;
  59. import com.xjrsoft.module.schedule.entity.WfCourseAdjust;
  60. import com.xjrsoft.module.schedule.mapper.CourseTableBakMapper;
  61. import com.xjrsoft.module.schedule.util.CourseTableExportQueryUtil;
  62. import com.xjrsoft.module.schedule.util.ScheduleUtil;
  63. import com.xjrsoft.module.schedule.vo.*;
  64. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  65. import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
  66. import com.xjrsoft.module.teacher.entity.BaseTeacher;
  67. import com.xjrsoft.module.teacher.entity.XjrUser;
  68. import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
  69. import com.xjrsoft.module.veb.util.ImportExcelUtil;
  70. import lombok.AllArgsConstructor;
  71. import me.zhyd.oauth.log.Log;
  72. import org.apache.poi.ss.usermodel.*;
  73. import org.apache.poi.ss.util.CellRangeAddress;
  74. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  75. import org.apache.poi.xwpf.usermodel.*;
  76. import org.springframework.beans.BeanUtils;
  77. import org.springframework.stereotype.Service;
  78. import org.springframework.transaction.annotation.Transactional;
  79. import java.io.ByteArrayOutputStream;
  80. import java.io.IOException;
  81. import java.io.InputStream;
  82. import java.time.*;
  83. import java.time.format.DateTimeFormatter;
  84. import java.util.*;
  85. import java.util.stream.Collectors;
  86. /**
  87. * <p>
  88. * 课表 服务实现类
  89. * </p>
  90. *
  91. * @author baomidou
  92. * @since 2023-09-02 02:19:56
  93. */
  94. @Service
  95. @AllArgsConstructor
  96. public class CourseTableServiceImpl extends ServiceImpl<CourseTableMapper, CourseTable> implements ICourseTableService {
  97. private final CourseTableMapper courseTableMapper;
  98. private final IBaseClassService baseClassService;
  99. private final ITeacherbaseManagerService teacherbaseManagerService;
  100. private final IBaseSemesterService baseSemesterService;
  101. private final TimetableConfig timetableConfig;
  102. private final ClassTimeMapper classTimeMapper;
  103. private final BaseSemesterMapper baseSemesterMapper;
  104. private final IBaseStudentSchoolRollService baseStudentSchoolRollService;
  105. private final CourseTableBakMapper courseTableBakMapper;
  106. private final IUserService userService;
  107. private final BaseClassroomMapper classroomMapper;
  108. private final BaseOfficeBuildMapper officeBuildMapper;
  109. @Override
  110. @Transactional(rollbackFor = Exception.class)
  111. public Boolean wordImport(InputStream inputStream) throws IOException {
  112. List<CourseTableParse> parses = courseTableWordParses(inputStream);
  113. String semester = null;
  114. if (parses.size() > 0) {
  115. semester = parses.get(0).getSemester();
  116. }
  117. BaseSemester baseSemester = baseSemesterService.getOne(Wrappers.<BaseSemester>query().lambda().eq(BaseSemester::getName, semester));
  118. if (baseSemester == null) {
  119. throw new MyException(String.format("学期【%s】不存在", semester));
  120. }
  121. // 获取班级信息
  122. List<BaseClass> baseClassList = baseClassService.list();
  123. Map<String, BaseClass> baseClassMap = baseClassList.stream().collect(Collectors.toMap(BaseClass::getName, a -> a, (k1, k2) -> k1));
  124. // 获取教师信息
  125. MPJLambdaWrapper<XjrUser> queryWrapper = new MPJLambdaWrapper<>();
  126. queryWrapper
  127. .disableSubLogicDel()
  128. .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, XjrUser::getId)
  129. .selectAll(XjrUser.class);
  130. List<XjrUser> xjrUserList = teacherbaseManagerService.list(queryWrapper);
  131. Map<String, XjrUser> xjrUsersMap = xjrUserList.stream().collect(Collectors.toMap(XjrUser::getName, a -> a, (k1, k2) -> k1));
  132. // 清空所有数据
  133. courseTableMapper.delete(Wrappers.<CourseTable>query().lambda().eq(CourseTable::getBaseSemesterId, baseSemester.getId()));
  134. List<CourseTable> params = new ArrayList<>();
  135. for (CourseTableParse item : parses) {
  136. CourseTable courseTable = BeanUtil.toBean(item, CourseTable.class);
  137. courseTable.setBaseSemesterId(baseSemester.getId());
  138. BaseClass baseClass = baseClassMap.get(item.getClassName());
  139. if (baseClass != null) {
  140. courseTable.setClassId(baseClass.getId());
  141. }
  142. XjrUser xjrUser = xjrUsersMap.get(item.getTeacherName());
  143. if (xjrUser != null) {
  144. courseTable.setTeacherId(xjrUser.getId().toString());
  145. }
  146. if (item.getWeeksCn() != null) {
  147. courseTable.setWeeks(WeekEnum.getCode(item.getWeeksCn()));
  148. }
  149. params.add(courseTable);
  150. }
  151. return this.saveBatch(params);
  152. }
  153. @Override
  154. public List<ClassListVo> classList(ClassListDto dto) {
  155. LambdaQueryWrapper<CourseTable> queryWrapper = new LambdaQueryWrapper<>();
  156. queryWrapper.eq(CourseTable::getClassId, dto.getClassId())
  157. .eq(ObjectUtil.isNotEmpty(dto.getWeeks()), CourseTable::getWeeks, dto.getWeeks());
  158. List<CourseTable> courseTables = courseTableMapper.selectList(queryWrapper);
  159. List<ClassListVo> classListVos = BeanUtil.copyToList(courseTables, ClassListVo.class);
  160. Boolean isCurrentSummer = isCurrentSummer();
  161. Map<String, ClassTime> classTimeMap = getClassTimeMap();
  162. // 获取节次时间
  163. for (int i = 0; i < classListVos.size(); i++) {
  164. ClassListVo c = classListVos.get(i);
  165. String key = String.format("%d_%d", c.getTimePeriod(), c.getTimeNumber());
  166. ClassTime ct = classTimeMap.get(key);
  167. if (ct != null) {
  168. if (isCurrentSummer) {
  169. c.setStartTime(ct.getSummerStartTime());
  170. c.setEndTime(ct.getSummerEndTime());
  171. } else {
  172. c.setStartTime(ct.getWinterStartTime());
  173. c.setEndTime(ct.getWinterEndTime());
  174. }
  175. }
  176. }
  177. return classListVos;
  178. }
  179. @Override
  180. public CourseTableVo getList(CourseTableDto dto) {
  181. List<ClassTime> classTimes = classTimeMapper.selectList(
  182. new QueryWrapper<ClassTime>().lambda()
  183. .ne(ClassTime::getTimePeriod, 0)
  184. .orderByAsc(ClassTime::getSummerStartTime)
  185. );
  186. CourseTableVo tableVo = new CourseTableVo();
  187. tableVo.setClassTimeList(classTimes);
  188. if (dto.getSemesterId() != null) {
  189. BaseSemester baseSemester = baseSemesterMapper.selectById(dto.getSemesterId());
  190. tableVo.setSemesterName(baseSemester.getName());
  191. LocalDateTime now = LocalDateTime.now();
  192. //计算本周是第几周
  193. LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault());
  194. LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingEnd().toInstant(), ZoneId.systemDefault());
  195. Duration between = Duration.between(startDateTime, endDateTime);
  196. long days = between.toDays();
  197. int weeks = (int) Math.ceil((double) days / 7);
  198. if (dto.getWeek() == null) {
  199. for (int i = 0; i < weeks; i++) {
  200. LocalDateTime startDate = startDateTime.plusDays(i * 7L).withHour(0).withMinute(0).withSecond(0).withNano(0);
  201. LocalDateTime endDate = startDate.plusDays(6).withHour(23).withMinute(59).withSecond(59).withNano(9999);
  202. if (now.isAfter(startDate) && now.isBefore(endDate)) {
  203. tableVo.setWeek("第" + (i + 1) + "周");
  204. }
  205. tableVo.setStartDate(startDate.toLocalDate());
  206. tableVo.setEndDate(endDate.toLocalDate());
  207. }
  208. } else {
  209. LocalDateTime startDate = startDateTime.plusDays((dto.getWeek() - 1) * 7L).withHour(0).withMinute(0).withSecond(0).withNano(0);
  210. LocalDateTime endDate = startDate.plusDays(6).withHour(23).withMinute(59).withSecond(59).withNano(9999);
  211. dto.setStartDate(startDate);
  212. dto.setEndDate(endDate);
  213. tableVo.setWeek("第" + dto.getWeek() + "周");
  214. tableVo.setStartDate(startDate.toLocalDate());
  215. tableVo.setEndDate(endDate.toLocalDate());
  216. }
  217. }
  218. if (!StrUtil.isEmpty(dto.getTeacherName())) {
  219. List<XjrUser> userList = teacherbaseManagerService.list(
  220. new QueryWrapper<XjrUser>().lambda()
  221. .like(!StrUtil.isEmpty(dto.getTeacherName()), XjrUser::getName, dto.getTeacherName())
  222. );
  223. List<XjrUser> userList2 = teacherbaseManagerService.list(
  224. new QueryWrapper<XjrUser>().lambda()
  225. .like(!StrUtil.isEmpty(dto.getTeacherName()), XjrUser::getCode, dto.getTeacherName())
  226. );
  227. userList.addAll(userList2);
  228. if (!userList.isEmpty()) {
  229. XjrUser xjrUser = userList.get(0);
  230. dto.setTeacherId(xjrUser.getId());
  231. tableVo.setTeacherName(xjrUser.getName());
  232. }
  233. }
  234. if (dto.getStartDate() != null && dto.getEndDate() != null) {
  235. if (dto.getStudentId() == null && dto.getTeacherId() == null && dto.getClassId() == null) {
  236. dto.setTeacherId(StpUtil.getLoginIdAsLong());
  237. } else {
  238. List<BaseStudentSchoolRoll> schoolRolls = baseStudentSchoolRollService.list(
  239. new QueryWrapper<BaseStudentSchoolRoll>().lambda().eq(BaseStudentSchoolRoll::getUserId, dto.getStudentId())
  240. );
  241. if (schoolRolls != null && !schoolRolls.isEmpty()) {
  242. dto.setCourseType("class");
  243. dto.setClassId(schoolRolls.get(0).getClassId());
  244. }
  245. }
  246. }
  247. List<CourseDetailVo> list = courseTableMapper.getList(dto);
  248. tableVo.setCourseList(list);
  249. tableVo.setClassHour(list.size());
  250. if (dto.getClassId() != null) {
  251. BaseClass baseClass = baseClassService.getById(dto.getClassId());
  252. tableVo.setClassName(baseClass.getName());
  253. }
  254. return tableVo;
  255. }
  256. /**
  257. * 调课顶课查询
  258. */
  259. @Override
  260. public List<CourseListVo> getAdjustList(String teacherId, String adjustDate, String classId, String adjustType) {
  261. CourseTableAdjustDto dto = new CourseTableAdjustDto();
  262. if (adjustDate != null && !"".equals(adjustDate)) {
  263. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  264. LocalDate localDateTime = LocalDate.parse(adjustDate, formatter);
  265. DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
  266. dto.setAdjustDate(adjustDate);
  267. dto.setWeek(dayOfWeek.getValue());
  268. }
  269. dto.setClassId(classId);
  270. if (teacherId != null && !"".equals(teacherId)) {
  271. dto.setTeacherId(Long.parseLong(teacherId));
  272. }
  273. dto.setAdjustType(adjustType);
  274. //查询正在进行中或者已经完成
  275. List<Long> courseIds = courseTableMapper.getExceptCourseIds(dto.getTeacherId());
  276. dto.setExceptCourseList(courseIds);
  277. List<CourseListVo> list = courseTableMapper.getAdjustList(dto);
  278. for (CourseListVo courseListVo : list) {
  279. if (courseListVo.getTimePeriod() == 1) {
  280. courseListVo.setTimePeriodCn("上午");
  281. } else if (courseListVo.getTimePeriod() == 2) {
  282. courseListVo.setTimePeriodCn("下午");
  283. } else if (courseListVo.getTimePeriod() == 3) {
  284. courseListVo.setTimePeriodCn("晚上");
  285. }
  286. }
  287. return list;
  288. }
  289. @Override
  290. public String getPreCheck(String preCheckType, String courseId, String swapCourseId, String swapDate, String subTeacherId) {
  291. if (preCheckType != null && !"".equals(preCheckType)) {
  292. if (CourseAdjustTypeEnum.courseExchange.getCode().equals(preCheckType)) {
  293. CourseTable courseTable = courseTableMapper.selectById(courseId);
  294. CourseTable swapCourseTable = courseTableMapper.selectById(swapCourseId);
  295. try {
  296. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  297. LocalDate localDateTime = LocalDate.parse(swapDate, formatter);
  298. JsonObject preCheck = getExtendPreCheck(localDateTime, courseTable, swapCourseTable);
  299. if (preCheck.get("code").getAsInt() == -1 && !preCheck.get("msg").isJsonNull()) {
  300. return preCheck.get("msg").getAsString();
  301. }
  302. } catch (Exception e) {
  303. throw new RuntimeException(e);
  304. }
  305. } else if (CourseAdjustTypeEnum.courseSubstitute.getCode().equals(preCheckType)) {
  306. CourseTable courseTable = courseTableMapper.selectById(courseId);
  307. try {
  308. JsonObject jsonObject = substitutePreTestin(subTeacherId, courseTable);
  309. if (jsonObject.get("code").getAsInt() == -1 && !jsonObject.get("msg").isJsonNull()) {
  310. return jsonObject.get("msg").getAsString();
  311. }
  312. } catch (Exception e) {
  313. throw new RuntimeException(e);
  314. }
  315. }
  316. }
  317. return null;
  318. }
  319. @Override
  320. @Transactional(rollbackFor = Exception.class)
  321. public Boolean adjustCourse(WfCourseAdjust courseAdjust) {
  322. //先查询课表数据,看是否能够查询到,如果能查到
  323. List<CourseTable> list = this.list(
  324. new MPJLambdaWrapper<CourseTable>()
  325. .select(CourseTable::getId)
  326. .select(CourseTable.class, x -> VoToColumnUtil.fieldsToColumns(CourseTable.class).contains(x.getProperty()))
  327. .innerJoin(CourseTableBak.class, CourseTableBak::getId, CourseTable::getId)
  328. .eq(CourseTableBak::getWfCourseAdjustId, courseAdjust.getId())
  329. );
  330. String[] courseIds = courseAdjust.getCourseId().split(",");
  331. ArrayList<String> courseIdList = new ArrayList<>(Arrays.asList(courseIds));
  332. String[] exchangeCourseIds = null;
  333. int courseCount = courseIds.length;
  334. if (CourseAdjustTypeEnum.courseExchange.getCode().equals(courseAdjust.getAdjustType())) {
  335. exchangeCourseIds = courseAdjust.getExchangeCourseId().split(",");
  336. courseCount += exchangeCourseIds.length;
  337. courseIdList.addAll(Arrays.asList(exchangeCourseIds));
  338. }
  339. LocalDateTime now = LocalDateTime.now();
  340. if (list.isEmpty() || list.size() != courseCount) {
  341. list = this.list(
  342. new MPJLambdaWrapper<CourseTable>()
  343. .select(CourseTable::getId)
  344. .select(CourseTable.class, x -> VoToColumnUtil.fieldsToColumns(CourseTable.class).contains(x.getProperty()))
  345. .innerJoin(CourseTableBak.class, CourseTableBak::getKeyInfo, CourseTable::getKeyInfo)
  346. .eq(CourseTableBak::getWfCourseAdjustId, courseAdjust.getId())
  347. );
  348. Map<String, CourseTable> courseMap = list.stream().collect(Collectors.toMap(CourseTable::getKeyInfo, x -> x));
  349. List<CourseTableBak> bakList = courseTableBakMapper.selectList(
  350. new QueryWrapper<CourseTableBak>().lambda()
  351. .eq(CourseTableBak::getWfCourseAdjustId, courseAdjust.getId())
  352. );
  353. Map<Long, String> bakKeyInfoMap = bakList.stream().collect(Collectors.toMap(CourseTableBak::getId, CourseTableBak::getKeyInfo));
  354. Map<Long, CourseTableBak> bakCourseMap = bakList.stream().collect(Collectors.toMap(CourseTableBak::getId, x -> x));
  355. if (CourseAdjustTypeEnum.courseExchange.getCode().equals(courseAdjust.getAdjustType())) {
  356. for (int i = 0; i < courseIds.length; i++) {
  357. String courseId = courseIds[i];
  358. String exchangeCourseId = exchangeCourseIds[i];
  359. //调课,将双方课程的日期(schedule_date)、时段(time_period)、节次(time_number)、周(week)、星期几(1-7)(weeks)、星期中文(weeks_cn)对调
  360. CourseTable courseTable = courseMap.get(bakKeyInfoMap.get(Long.parseLong(courseId)));
  361. if (courseTable == null) {
  362. continue;
  363. }
  364. CourseTable swapCourseTable = courseMap.get(bakKeyInfoMap.get(Long.parseLong(exchangeCourseId)));
  365. if (swapCourseTable == null) {
  366. continue;
  367. }
  368. CourseTableBak courseTableBak = bakCourseMap.get(Long.parseLong(courseId));
  369. CourseTableBak swapCourseTableBak = bakCourseMap.get(Long.parseLong(exchangeCourseId));
  370. courseTable.setAdjustType(courseAdjust.getAdjustType());
  371. courseTable.setCourseName(swapCourseTableBak.getCourseName());
  372. courseTable.setCourseId(swapCourseTableBak.getCourseId());
  373. courseTable.setTeacherId(swapCourseTableBak.getTeacherId());
  374. courseTable.setSiteId(swapCourseTableBak.getSiteId());
  375. courseTable.setTeacherName(swapCourseTableBak.getTeacherName());
  376. // courseTable.setKeyInfo(courseTable.getTeacherId() + "_"
  377. // + courseTable.getClassId() + "_"
  378. // + courseTable.getScheduleDate() + "_"
  379. // + courseTable.getCourseId() + "_"
  380. // + courseTable.getSiteId() + "_"
  381. // + courseTable.getTimeNumber()
  382. // );
  383. courseTableMapper.updateById(courseTable);
  384. swapCourseTable.setAdjustType(courseAdjust.getAdjustType());
  385. // swapCourseTable.setKeyInfo(swapCourseTable.getTeacherId() + "_"
  386. // + swapCourseTable.getClassId() + "_"
  387. // + swapCourseTable.getScheduleDate() + "_"
  388. // + swapCourseTable.getCourseId() + "_"
  389. // + swapCourseTable.getSiteId() + "_"
  390. // + swapCourseTable.getTimeNumber()
  391. // );
  392. swapCourseTable.setCourseId(courseTableBak.getCourseId());
  393. swapCourseTable.setCourseName(courseTableBak.getCourseName());
  394. swapCourseTable.setTeacherId(courseTableBak.getTeacherId());
  395. swapCourseTable.setSiteId(courseTableBak.getSiteId());
  396. swapCourseTable.setTeacherName(courseTableBak.getTeacherName());
  397. courseTableMapper.updateById(swapCourseTable);
  398. }
  399. //提交调课接口
  400. //sendExchange(courseTableBak, swapCourseTableBak, courseAdjust);
  401. } else if (CourseAdjustTypeEnum.courseSubstitute.getCode().equals(courseAdjust.getAdjustType())) {
  402. for (String courseId : courseIds) {
  403. CourseTable courseTable = courseMap.get(bakKeyInfoMap.get(Long.parseLong(courseId)));
  404. if (courseTable == null) {
  405. continue;
  406. }
  407. User applyUser = userService.getById(courseAdjust.getUserId());//申请人
  408. User exchangeUser = userService.getById(courseAdjust.getExchangeTeacherId());//顶课人
  409. String teacherId = courseTable.getTeacherId().replace(courseAdjust.getUserId().toString(), courseAdjust.getExchangeTeacherId());
  410. String teacherName = courseTable.getTeacherName().replace(applyUser.getName(), exchangeUser.getName());
  411. courseTable.setAdjustType(courseAdjust.getAdjustType());
  412. courseTable.setTeacherId(teacherId);
  413. courseTable.setTeacherName(teacherName);
  414. // courseTable.setKeyInfo(teacherId + "_" + courseTable.getClassId() + "_" + courseTable.getScheduleDate() + "_" + courseTable.getCourseId() + "_" + courseTable.getSiteId() + "_" + courseTable.getTimeNumber());
  415. courseTableMapper.updateById(courseTable);
  416. }
  417. //提交顶课接口
  418. //sendSubstitute(courseTable, courseAdjust);
  419. }
  420. } else {
  421. if (CourseAdjustTypeEnum.courseExchange.getCode().equals(courseAdjust.getAdjustType())) {
  422. for (int i = 0; i < courseIds.length; i++) {
  423. String courseId = courseIds[i];
  424. String exchangeCourseId = exchangeCourseIds[i];
  425. //调课,将双方课程的日期(schedule_date)、时段(time_period)、节次(time_number)、周(week)、星期几(1-7)(weeks)、星期中文(weeks_cn)对调
  426. CourseTable courseTable = courseTableMapper.selectById(courseId);
  427. CourseTable swapCourseTable = courseTableMapper.selectById(exchangeCourseId);
  428. if (courseTable == null || swapCourseTable == null) {
  429. continue;
  430. }
  431. CourseTable courseTableBak = BeanUtil.toBean(courseTable, CourseTable.class);
  432. CourseTable swapCourseTableBak = BeanUtil.toBean(swapCourseTable, CourseTable.class);
  433. courseTable.setAdjustType(courseAdjust.getAdjustType());
  434. courseTable.setCourseName(swapCourseTableBak.getCourseName());
  435. courseTable.setCourseId(swapCourseTableBak.getCourseId());
  436. courseTable.setTeacherId(swapCourseTableBak.getTeacherId());
  437. courseTable.setSiteId(swapCourseTableBak.getSiteId());
  438. courseTable.setTeacherName(swapCourseTableBak.getTeacherName());
  439. // courseTable.setKeyInfo(courseTable.getTeacherId() + "_"
  440. // + courseTable.getClassId() + "_"
  441. // + courseTable.getScheduleDate() + "_"
  442. // + courseTable.getCourseId() + "_"
  443. // + courseTable.getSiteId() + "_"
  444. // + courseTable.getTimeNumber()
  445. // );
  446. courseTable.setModifyDate(now);
  447. courseTableMapper.updateById(courseTable);
  448. swapCourseTable.setAdjustType(courseAdjust.getAdjustType());
  449. // swapCourseTable.setKeyInfo(swapCourseTable.getTeacherId() + "_"
  450. // + swapCourseTable.getClassId() + "_"
  451. // + swapCourseTable.getScheduleDate() + "_"
  452. // + swapCourseTable.getCourseId() + "_"
  453. // + swapCourseTable.getSiteId() + "_"
  454. // + swapCourseTable.getTimeNumber()
  455. // );
  456. swapCourseTable.setCourseId(courseTableBak.getCourseId());
  457. swapCourseTable.setCourseName(courseTableBak.getCourseName());
  458. swapCourseTable.setTeacherId(courseTableBak.getTeacherId());
  459. swapCourseTable.setSiteId(courseTableBak.getSiteId());
  460. swapCourseTable.setTeacherName(courseTableBak.getTeacherName());
  461. swapCourseTable.setModifyDate(now);
  462. courseTableMapper.updateById(swapCourseTable);
  463. }
  464. //提交调课接口
  465. //sendExchange(courseTableBak, swapCourseTableBak, courseAdjust);
  466. } else if (CourseAdjustTypeEnum.courseSubstitute.getCode().equals(courseAdjust.getAdjustType())) {
  467. for (String courseId : courseIds) {
  468. CourseTable courseTable = courseTableMapper.selectById(courseId);
  469. User applyUser = userService.getById(courseAdjust.getUserId());//申请人
  470. User exchangeUser = userService.getById(courseAdjust.getExchangeTeacherId());//顶课人
  471. String teacherId = courseTable.getTeacherId().replace(courseAdjust.getUserId().toString(), courseAdjust.getExchangeTeacherId());
  472. String teacherName = courseTable.getTeacherName().replace(applyUser.getName(), exchangeUser.getName());
  473. courseTable.setAdjustType(courseAdjust.getAdjustType());
  474. courseTable.setTeacherId(teacherId);
  475. courseTable.setTeacherName(teacherName);
  476. courseTable.setModifyDate(now);
  477. // courseTable.setKeyInfo(teacherId + "_" + courseTable.getClassId() + "_" + courseTable.getScheduleDate() + "_" + courseTable.getCourseId() + "_" + courseTable.getSiteId() + "_" + courseTable.getTimeNumber());
  478. courseTableMapper.updateById(courseTable);
  479. }
  480. //提交顶课接口
  481. //sendSubstitute(courseTable, courseAdjust);
  482. }
  483. }
  484. return Boolean.TRUE;
  485. }
  486. @Override
  487. public ByteArrayOutputStream listScheduleWeekExportQuery(ScheduleWeekExportQueryDto dto) {
  488. // 创建一个字节输出流
  489. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  490. // 获取课程表数据
  491. CourseTableVo courseTableVo = getCourseTableVo(dto);
  492. // 构建课程安排导出列表
  493. List<ScheduleWeekExportQueryVo> scheduleWeekExportQueryVoList = buildScheduleWeekExportQueryList(courseTableVo);
  494. // 将数据写入Excel文件
  495. writeScheduleWeekExportToExcel(courseTableVo, outputStream, scheduleWeekExportQueryVoList);
  496. return outputStream;
  497. }
  498. @Override
  499. public List<ClassOptionVo> getClassListByTeacherId(ClassOptionDto dto) {
  500. return this.baseMapper.getClassListByTeacherId(dto);
  501. }
  502. private CourseTableVo getCourseTableVo(ScheduleWeekExportQueryDto dto) {
  503. CourseTableDto courseTableDto = new CourseTableDto();
  504. BeanUtils.copyProperties(dto, courseTableDto);
  505. return this.getList(courseTableDto);
  506. }
  507. private List<ScheduleWeekExportQueryVo> buildScheduleWeekExportQueryList(CourseTableVo courseTableVo) {
  508. List<ClassTime> classTimeList = courseTableVo.getClassTimeList();
  509. List<CourseDetailVo> courseList = courseTableVo.getCourseList();
  510. List<ScheduleWeekExportQueryVo> scheduleWeekExportQueryVoList = new ArrayList<>();
  511. if (!courseList.isEmpty()) {
  512. Map<Integer, Map<Integer, List<CourseDetailVo>>> courseDetailVoMap = buildCourseDetailMap(courseList);
  513. scheduleWeekExportQueryVoList.addAll(buildScheduleWeekExportQueryVoList(courseDetailVoMap, classTimeList));
  514. }
  515. return scheduleWeekExportQueryVoList;
  516. }
  517. private Map<Integer, Map<Integer, List<CourseDetailVo>>> buildCourseDetailMap(List<CourseDetailVo> courseList) {
  518. // 实现构建课程详情Map的逻辑
  519. Map<Integer, Map<Integer, List<CourseDetailVo>>> courseDetailVoMap = new HashMap<>();
  520. for (CourseDetailVo courseDetailVo : courseList) {
  521. int timePeriod = Integer.parseInt(courseDetailVo.getTimePeriod().trim());
  522. int timeNumber = Integer.parseInt(courseDetailVo.getTimeNumber().trim());
  523. // 如果时间段不存在,则创建一个新的时间段Map
  524. courseDetailVoMap.putIfAbsent(timePeriod, new HashMap<>());
  525. // 获取当前时间段的Map
  526. Map<Integer, List<CourseDetailVo>> timePeriodMap = courseDetailVoMap.get(timePeriod);
  527. // 如果时间序号不存在,则创建一个新的课程列表
  528. timePeriodMap.putIfAbsent(timeNumber, new ArrayList<>());
  529. // 将课程详情添加到对应的时间段和时间序号中
  530. timePeriodMap.get(timeNumber).add(courseDetailVo);
  531. }
  532. // 返回构建好的课程详情Map
  533. return courseDetailVoMap;
  534. }
  535. private List<ScheduleWeekExportQueryVo> buildScheduleWeekExportQueryVoList(Map<Integer, Map<Integer, List<CourseDetailVo>>> courseDetailVoMap, List<ClassTime> classTimeList) {
  536. List<ScheduleWeekExportQueryVo> scheduleWeekExportQueryVoList = new ArrayList<>();
  537. // 实现构建ScheduleWeekExportQueryVo对象列表的逻辑
  538. for (ClassTime classTime : classTimeList) {
  539. ScheduleWeekExportQueryVo scheduleWeekExportQueryVo = new ScheduleWeekExportQueryVo();
  540. scheduleWeekExportQueryVo.setTimePeriod(TimePeriodEnum.getValue(classTime.getTimePeriod()));
  541. scheduleWeekExportQueryVo.setTimeNumber(TimeNumberEnum.getValue(classTime.getNumber()));
  542. Map<Integer, List<CourseDetailVo>> timePeriodListMap = courseDetailVoMap.get(classTime.getTimePeriod());
  543. if (timePeriodListMap != null) {
  544. List<CourseDetailVo> courseDetailVoList = timePeriodListMap.get(classTime.getNumber());
  545. if (courseDetailVoList != null) {
  546. for (CourseDetailVo courseDetailVo : courseDetailVoList) {
  547. for (int i = 1; i <= 7; i++) {
  548. if (courseDetailVo.getWeeks() != i) {
  549. continue;
  550. }
  551. if (courseDetailVo != null) {
  552. String courseInfo = courseDetailVo.getCourseName() + "\n" +
  553. courseDetailVo.getTeacherName() + "\n" +
  554. courseDetailVo.getClassName() + "\n" +
  555. courseDetailVo.getClassroomName() + "\n";
  556. switch (i) {
  557. case 1:
  558. scheduleWeekExportQueryVo.setMonday(courseInfo);
  559. break;
  560. case 2:
  561. scheduleWeekExportQueryVo.setTuesday(courseInfo);
  562. break;
  563. case 3:
  564. scheduleWeekExportQueryVo.setWednesday(courseInfo);
  565. break;
  566. case 4:
  567. scheduleWeekExportQueryVo.setThursday(courseInfo);
  568. break;
  569. case 5:
  570. scheduleWeekExportQueryVo.setFriday(courseInfo);
  571. break;
  572. case 6:
  573. scheduleWeekExportQueryVo.setSaturday(courseInfo);
  574. break;
  575. case 7:
  576. scheduleWeekExportQueryVo.setSunday(courseInfo);
  577. break;
  578. }
  579. }
  580. }
  581. }
  582. }
  583. }
  584. scheduleWeekExportQueryVoList.add(scheduleWeekExportQueryVo);
  585. }
  586. // 返回构建好的ScheduleWeekExportQueryVo对象列表
  587. return scheduleWeekExportQueryVoList;
  588. }
  589. private void writeScheduleWeekExportToExcel(CourseTableVo courseTableVo, ByteArrayOutputStream outputStream, List<ScheduleWeekExportQueryVo> scheduleWeekExportQueryVoList) {
  590. // 创建内容样式
  591. WriteCellStyle contentWriteCellStyle = createContentCellStyle();
  592. // 创建头部样式
  593. WriteCellStyle headWriteCellStyle = createHeadCellStyle();
  594. // 将数据写入Excel文件
  595. try (ExcelWriter excelWriter = EasyExcel.write(outputStream, ScheduleWeekExportQueryVo.class)
  596. .registerWriteHandler(new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle))
  597. .build()) {
  598. writeSheetHead(courseTableVo, excelWriter);
  599. writeSheetContent(excelWriter, scheduleWeekExportQueryVoList);
  600. }
  601. }
  602. private void writeSheetContent(ExcelWriter excelWriter, List<ScheduleWeekExportQueryVo> scheduleWeekExportQueryVoList) {
  603. int mergeRowIndex = 2;
  604. int[] mergeColumeIndex = {0};
  605. ExcelMergeUtil excelFillCellMergeStrategy = new ExcelMergeUtil(mergeRowIndex, mergeColumeIndex);
  606. WriteTable writeSheetContentTable = EasyExcel.writerTable(1).needHead(Boolean.TRUE).automaticMergeHead(Boolean.TRUE).registerWriteHandler(excelFillCellMergeStrategy).build();
  607. excelWriter.write(scheduleWeekExportQueryVoList, EasyExcel.writerSheet("模板").build(), writeSheetContentTable);
  608. }
  609. private void writeSheetHead(CourseTableVo courseTableVo, ExcelWriter excelWriter) {
  610. List<List<String>> sheetHeadList = new ArrayList<>();
  611. sheetHeadList.add(Collections.singletonList(courseTableVo.getSemesterName() + " "
  612. + ((courseTableVo.getTeacherName() != null) ? courseTableVo.getTeacherName() : courseTableVo.getClassName()) + " "
  613. + courseTableVo.getWeek() + " "
  614. + "课程表"));
  615. ExcelFillCellMergePrevColUtil sheetHeadColumn = new ExcelFillCellMergePrevColUtil();
  616. sheetHeadColumn.add(0, 0, 8);
  617. WriteTable writeSheetHeadTable = EasyExcel.writerTable(0).needHead(Boolean.TRUE).head(sheetHeadList).registerWriteHandler(sheetHeadColumn).build();
  618. excelWriter.write(new ArrayList<>(), EasyExcel.writerSheet("模板").needHead(Boolean.FALSE).build(), writeSheetHeadTable);
  619. }
  620. private WriteCellStyle createContentCellStyle() {
  621. WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
  622. contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
  623. contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  624. contentWriteCellStyle.setWrapped(true);
  625. WriteFont contentWriteFont = new WriteFont();
  626. contentWriteFont.setFontHeightInPoints((short) 12);
  627. contentWriteFont.setFontName("宋体");
  628. contentWriteCellStyle.setWriteFont(contentWriteFont);
  629. contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
  630. contentWriteCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
  631. contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
  632. contentWriteCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
  633. contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
  634. contentWriteCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
  635. contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
  636. contentWriteCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
  637. return contentWriteCellStyle;
  638. }
  639. private WriteCellStyle createHeadCellStyle() {
  640. WriteCellStyle headWriteCellStyle = new WriteCellStyle();
  641. WriteFont headWriteFont = new WriteFont();
  642. headWriteFont.setFontName("宋体");
  643. headWriteFont.setFontHeightInPoints((short) 14);
  644. headWriteFont.setBold(true);
  645. headWriteCellStyle.setWriteFont(headWriteFont);
  646. headWriteCellStyle.setBorderBottom(BorderStyle.THIN);
  647. headWriteCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
  648. headWriteCellStyle.setBorderLeft(BorderStyle.THIN);
  649. headWriteCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
  650. headWriteCellStyle.setBorderRight(BorderStyle.THIN);
  651. headWriteCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
  652. headWriteCellStyle.setBorderTop(BorderStyle.THIN);
  653. headWriteCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
  654. headWriteCellStyle.setWrapped(true);
  655. headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
  656. headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  657. headWriteCellStyle.setShrinkToFit(true);
  658. return headWriteCellStyle;
  659. }
  660. /**
  661. * 提交顶课接口
  662. *
  663. * @param courseTable
  664. * @param courseAdjust
  665. * @throws Exception
  666. */
  667. void sendSubstitute(CourseTable courseTable, WfCourseAdjust courseAdjust) throws Exception {
  668. String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/Substitute/Submit";
  669. JsonObject jsonObject = new JsonObject();
  670. jsonObject.addProperty("timetableId", courseTable.getJianyueId());
  671. jsonObject.addProperty("isCycles", Boolean.FALSE);
  672. jsonObject.addProperty("reason", courseAdjust.getReason());
  673. jsonObject.addProperty("teacherId", courseAdjust.getUserId());
  674. JsonArray extendIds = new JsonArray();
  675. extendIds.add(courseTable.getTeacherId());
  676. jsonObject.add("extendIds", extendIds);
  677. //获取时间戳
  678. long timestamp = System.currentTimeMillis();
  679. //生成签名
  680. String sign = ScheduleUtil.createSign(timestamp);
  681. String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
  682. }
  683. /**
  684. * 提交调课
  685. *
  686. * @param courseTable
  687. * @param swapCourseTable
  688. * @throws Exception
  689. */
  690. void sendExchange(CourseTable courseTable, CourseTable swapCourseTable, WfCourseAdjust courseAdjust) throws Exception {
  691. String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/Submit";
  692. JsonObject jsonObject = new JsonObject();
  693. jsonObject.addProperty("timetableId", courseTable.getJianyueId());
  694. jsonObject.addProperty("isCycles", Boolean.FALSE);
  695. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  696. jsonObject.addProperty("date", swapCourseTable.getScheduleDate().format(formatter));
  697. jsonObject.addProperty("numberOfDay", swapCourseTable.getTimeNumber());
  698. jsonObject.addProperty("rescheduleId", swapCourseTable.getJianyueId());
  699. jsonObject.addProperty("reason", courseAdjust.getReason());
  700. jsonObject.addProperty("teacherId", courseAdjust.getUserId());
  701. //获取时间戳
  702. long timestamp = System.currentTimeMillis();
  703. //生成签名
  704. String sign = ScheduleUtil.createSign(timestamp);
  705. String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
  706. }
  707. /**
  708. * 顶课预检查
  709. *
  710. * @param courseTable
  711. * @return 检查结果
  712. */
  713. JsonObject substitutePreTestin(String subTeacherId, CourseTable courseTable) throws Exception {
  714. JsonParser jsonParser = new JsonParser();
  715. String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/Substitute/PreTesting";
  716. JsonObject jsonObject = new JsonObject();
  717. jsonObject.addProperty("timetableId", courseTable.getJianyueId());
  718. jsonObject.addProperty("isCycles", Boolean.FALSE);
  719. JsonArray extendIds = new JsonArray();
  720. extendIds.add(subTeacherId);
  721. jsonObject.add("extendIds", extendIds);
  722. //获取时间戳
  723. long timestamp = System.currentTimeMillis();
  724. //生成签名
  725. String sign = ScheduleUtil.createSign(timestamp);
  726. String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
  727. if (StrUtil.isEmpty(result)) {
  728. return null;
  729. }
  730. return jsonParser.parse(result).getAsJsonObject();
  731. }
  732. /**
  733. * 调课预检查
  734. *
  735. * @param courseTable 需要调整的课程
  736. * @param swapCourseTable 对调的课程
  737. * @return 检查结果
  738. */
  739. JsonObject getExtendPreCheck(LocalDate swapDate, CourseTable courseTable, CourseTable swapCourseTable) throws Exception {
  740. JsonParser jsonParser = new JsonParser();
  741. String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/PreTesting";
  742. JsonObject jsonObject = new JsonObject();
  743. jsonObject.addProperty("timetableId", courseTable.getJianyueId());
  744. jsonObject.addProperty("isCycles", Boolean.FALSE);
  745. // jsonObject.addProperty("startDate", "2024-01-01");
  746. // jsonObject.addProperty("endDate", "2024-01-31");
  747. // jsonObject.addProperty("dayOfweek", 5);
  748. jsonObject.addProperty("numberOfday", swapCourseTable.getTimeNumber());
  749. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  750. jsonObject.addProperty("date", swapDate.format(formatter));
  751. jsonObject.addProperty("reschduleId", courseTable.getJianyueId());
  752. //获取时间戳
  753. long timestamp = System.currentTimeMillis();
  754. //生成签名
  755. String sign = ScheduleUtil.createSign(timestamp);
  756. String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
  757. if (StrUtil.isEmpty(result)) {
  758. return null;
  759. }
  760. return jsonParser.parse(result).getAsJsonObject();
  761. }
  762. /**
  763. * 获取节次
  764. *
  765. * @return
  766. */
  767. private Map<String, ClassTime> getClassTimeMap() {
  768. List<ClassTime> classTimes = classTimeMapper.selectList(null);
  769. Map<String, ClassTime> result = new HashMap<>();
  770. for (ClassTime item : classTimes) {
  771. String key = String.format("%d_%d", item.getTimePeriod(), item.getNumber());
  772. result.put(key, item);
  773. }
  774. return result;
  775. }
  776. /**
  777. * 当前时间是否在夏季
  778. *
  779. * @return
  780. */
  781. private Boolean isCurrentSummer() {
  782. DateTime now = DateUtil.date();
  783. DateTime summerStart = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getSummerStart()));
  784. DateTime summerEnd = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getSummerEnd()));
  785. DateTime winterStart = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getWinterStart()));
  786. DateTime winterEnd = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getWinterEnd()));
  787. // 如果开始时间大于结束时间,开始时间增加1年
  788. if (DateUtil.compare(summerStart, summerEnd) > 0) {
  789. summerEnd = DateUtil.offset(summerEnd, DateField.DAY_OF_YEAR, 1);
  790. }
  791. if (DateUtil.compare(winterStart, winterEnd) > 0) {
  792. winterEnd = DateUtil.offset(winterEnd, DateField.DAY_OF_YEAR, 1);
  793. }
  794. return DateUtil.compare(summerStart, now) > 0 && DateUtil.compare(summerEnd, now) < 0;
  795. }
  796. /**
  797. * 解析word课表
  798. *
  799. * @param inputStream
  800. * @return
  801. * @throws IOException
  802. */
  803. private List<CourseTableParse> courseTableWordParses(InputStream inputStream) throws IOException {
  804. XWPFDocument doc = new XWPFDocument(inputStream);
  805. List<XWPFParagraph> paras = doc.getParagraphs();
  806. String semester = null;
  807. List<String> cNames = new ArrayList<>();
  808. //获取标题
  809. for (int i = 0; i < paras.size(); i++) {
  810. String txt = paras.get(i).getText();
  811. if (i == 0) {
  812. semester = txt;
  813. continue;
  814. }
  815. txt = txt.replaceAll("总课程表", "").replace("\n", "").trim();
  816. if (!txt.equals("") && !txt.equals(semester)) {
  817. cNames.add(txt);
  818. }
  819. }
  820. List<CourseTableParse> result = new ArrayList<>();
  821. //获取文档中所有的表格
  822. List<XWPFTable> tables = doc.getTables();
  823. int tNum = 0;
  824. for (XWPFTable table : tables) {
  825. int rNum = 0;
  826. String timePeriod = null;
  827. List<String> weeks = new ArrayList<>();
  828. List<XWPFTableRow> rows = table.getRows();
  829. for (XWPFTableRow row : rows) {
  830. //获取行对应的单元格
  831. List<XWPFTableCell> cells = row.getTableCells();
  832. String timeNumber = null;
  833. for (int i = 0; i < cells.size(); i++) {
  834. String cellText = cells.get(i).getText();
  835. if (cellText.equals("") || rNum < 1) continue;
  836. if (rNum == 1) {
  837. weeks.add(cellText);
  838. continue;
  839. }
  840. if (i == 0) {
  841. timePeriod = cellText;
  842. continue;
  843. }
  844. if (i == 1) {
  845. timeNumber = cellText;
  846. continue;
  847. }
  848. List<XWPFParagraph> cParagraph = cells.get(i).getParagraphs();
  849. CourseTableParse item = new CourseTableParse();
  850. item.setSemester(semester);
  851. item.setTimePeriod(TimePeriodEnum.getCode(timePeriod));
  852. item.setTimeNumber(TimeNumberEnum.getCode(timeNumber));
  853. String week = weeks.get(Math.max(i - 2, 0));
  854. item.setWeeksCn(week);
  855. item.setClassName(cNames.get(tNum));
  856. for (int j = 0; j < cParagraph.size(); j++) {
  857. cellText = cParagraph.get(j).getText().trim();
  858. switch (j) {
  859. case 0:
  860. item.setCourseName(cellText);
  861. break;
  862. case 1:
  863. item.setTeacherName(cellText);
  864. break;
  865. case 2:
  866. item.setSiteName(cellText);
  867. break;
  868. }
  869. }
  870. result.add(item);
  871. }
  872. rNum++;
  873. }
  874. tNum++;
  875. }
  876. inputStream.close();
  877. return result;
  878. }
  879. @Override
  880. public void deleteBakData(Long wfCourseAdjustId) {
  881. courseTableBakMapper.delete(new QueryWrapper<CourseTableBak>().lambda().eq(CourseTableBak::getWfCourseAdjustId, wfCourseAdjustId));
  882. }
  883. @Override
  884. public ByteArrayOutputStream scheduleWeekExportQuery(CourseTableDto dto) {
  885. try {
  886. CourseTableVo data = this.getList(dto);
  887. Workbook workbook = new XSSFWorkbook();
  888. // 创建一个工作表(sheet)
  889. String sheetName = "课表";
  890. Sheet sheet = workbook.createSheet(sheetName);
  891. createFirstTitle(workbook, sheet, data, dto);
  892. createSecondTitle(workbook, sheet, 1);
  893. Map<Integer, ClassTime> timeNumberMap = data.getClassTimeList().stream().collect(Collectors.toMap(ClassTime::getNumber, x -> x));
  894. Map<String, List<CourseDetailVo>> timeNumberDataMap = data.getCourseList().stream().collect(Collectors.groupingBy(CourseDetailVo::getTimeNumber));
  895. List<Integer> weekList = new ArrayList<>();
  896. weekList.add(1);
  897. weekList.add(2);
  898. weekList.add(3);
  899. weekList.add(4);
  900. weekList.add(5);
  901. weekList.add(6);
  902. weekList.add(7);
  903. Collections.sort(weekList);
  904. List<Integer> timeNumberList = data.getClassTimeList().stream().map(ClassTime::getNumber).collect(Collectors.toList());
  905. Collections.sort(timeNumberList);
  906. Map<Integer, Integer> timePeriodMap = data.getClassTimeList().stream().collect(Collectors.toMap(ClassTime::getNumber, ClassTime::getTimePeriod));
  907. ArrayList<ArrayList<String>> dataList = new ArrayList<>();
  908. for (Integer timeNumber : timeNumberList) {
  909. ArrayList<String> rowData = new ArrayList<>();
  910. Integer timePeriod = timePeriodMap.get(timeNumber);
  911. String timePeriodStr = "";
  912. if (timePeriod == 1) {
  913. timePeriodStr = "上午";
  914. } else if (timePeriod == 2) {
  915. timePeriodStr = "下午";
  916. } else if (timePeriod == 3) {
  917. timePeriodStr = "晚上";
  918. }
  919. rowData.add(timePeriodStr);
  920. ClassTime classTime = timeNumberMap.get(timeNumber);
  921. String timeNumberStr = classTime.getShortName() + "\r\n" + classTime.getSummerStartTime() + "-" + classTime.getSummerEndTime();
  922. rowData.add(timeNumberStr);
  923. List<CourseDetailVo> list1 = timeNumberDataMap.get(timeNumber.toString());
  924. if (list1 == null) {
  925. for (Integer week : weekList) {
  926. rowData.add("");
  927. }
  928. dataList.add(rowData);
  929. continue;
  930. }
  931. Map<Integer, List<CourseDetailVo>> weeksMap = list1.stream().collect(Collectors.groupingBy(CourseDetailVo::getWeeks));
  932. for (Integer week : weekList) {
  933. String content = "";
  934. List<CourseDetailVo> list = weeksMap.get(week);
  935. if (list != null && !list.isEmpty()) {
  936. if (list.size() == 1) {
  937. CourseDetailVo courseDetailVo = list.get(0);
  938. content += courseDetailVo.getCourseName() + "\r\n";
  939. content += courseDetailVo.getClassroomName() + "\r\n";
  940. if ("teacher".equals(dto.getCourseType())) {
  941. content += courseDetailVo.getClassName();
  942. } else if ("class".equals(dto.getCourseType())) {
  943. content += courseDetailVo.getTeacherName();
  944. }
  945. } else {
  946. CourseDetailVo courseDetailVo = list.get(0);
  947. content += courseDetailVo.getCourseName() + "\r\n";
  948. content += courseDetailVo.getClassroomName() + "\r\n";
  949. if ("teacher".equals(dto.getCourseType())) {
  950. content += courseDetailVo.getClassName();
  951. } else if ("class".equals(dto.getCourseType())) {
  952. Set<String> classNames = list.stream().map(CourseDetailVo::getTeacherName).collect(Collectors.toSet());
  953. content += classNames.toString().replace("]", "").replace("[", "").replace(" ", "");
  954. }
  955. }
  956. }
  957. rowData.add(content);
  958. }
  959. dataList.add(rowData);
  960. }
  961. Font font = workbook.createFont();
  962. font.setFontName("宋体");
  963. font.setFontHeightInPoints((short) 9);
  964. // 创建一个单元格样式对象
  965. CellStyle cellStyle = workbook.createCellStyle();
  966. cellStyle.setFont(font); // 将字体应用到样式
  967. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  968. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  969. cellStyle.setWrapText(true);
  970. cellStyle.setBorderTop(BorderStyle.THIN);
  971. cellStyle.setBorderBottom(BorderStyle.THIN);
  972. cellStyle.setBorderLeft(BorderStyle.THIN);
  973. cellStyle.setBorderRight(BorderStyle.THIN);
  974. int rowNumber = 2;
  975. for (ArrayList<String> strings : dataList) {
  976. Row row = sheet.createRow(rowNumber);
  977. int cellNumber = 0;
  978. for (String string : strings) {
  979. Cell row1cell1 = row.createCell(cellNumber);
  980. row1cell1.setCellValue(string);
  981. row1cell1.setCellStyle(cellStyle);
  982. cellNumber++;
  983. }
  984. rowNumber++;
  985. row.setHeightInPoints(48);
  986. }
  987. //合并
  988. Map<Integer, List<Integer>> collect = data.getClassTimeList().stream()
  989. .collect(Collectors.groupingBy(ClassTime::getTimePeriod, Collectors.mapping(ClassTime::getNumber, Collectors.toList())));
  990. int firstRow = 2;
  991. for (Integer i : collect.keySet()) {
  992. int lastRow = firstRow + collect.get(i).size() - 1;
  993. if (lastRow == firstRow) {
  994. continue;
  995. }
  996. sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, 0, 0));
  997. firstRow = firstRow + collect.get(i).size();
  998. }
  999. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  1000. workbook.write(bot);
  1001. return bot;
  1002. } catch (Exception e) {
  1003. Log.error(e.getMessage(), e);
  1004. throw new MyException("导出报错,请联系管理员");
  1005. }
  1006. }
  1007. void createSecondTitle(Workbook workbook, Sheet sheet, int rowNumber) {
  1008. // 创建一个字体对象
  1009. Font font = workbook.createFont();
  1010. font.setBold(true);// 设置为粗体
  1011. font.setFontName("宋体");
  1012. //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
  1013. font.setFontHeightInPoints((short) 12);
  1014. // 创建一个单元格样式对象
  1015. CellStyle cellStyle = workbook.createCellStyle();
  1016. cellStyle.setFont(font); // 将字体应用到样式
  1017. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  1018. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  1019. cellStyle.setBorderTop(BorderStyle.THIN);
  1020. cellStyle.setBorderBottom(BorderStyle.THIN);
  1021. cellStyle.setBorderLeft(BorderStyle.THIN);
  1022. cellStyle.setBorderRight(BorderStyle.THIN);
  1023. Row row = sheet.createRow(rowNumber);
  1024. int cellNumber = 0;
  1025. Cell row1cell1 = row.createCell(cellNumber);
  1026. row1cell1.setCellValue("时间");
  1027. row1cell1.setCellStyle(cellStyle);
  1028. sheet.setColumnWidth(0, 4 * 256);
  1029. cellNumber++;
  1030. row1cell1 = row.createCell(cellNumber);
  1031. row1cell1.setCellValue("");
  1032. row1cell1.setCellStyle(cellStyle);
  1033. //合并
  1034. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, 1));
  1035. cellNumber++;
  1036. sheet.setColumnWidth(1, 12 * 256);
  1037. row1cell1 = row.createCell(cellNumber);
  1038. row1cell1.setCellValue("周一");
  1039. row1cell1.setCellStyle(cellStyle);
  1040. sheet.setColumnWidth(2, 16 * 256);
  1041. cellNumber++;
  1042. row1cell1 = row.createCell(cellNumber);
  1043. row1cell1.setCellValue("周二");
  1044. row1cell1.setCellStyle(cellStyle);
  1045. sheet.setColumnWidth(cellNumber, 16 * 256);
  1046. cellNumber++;
  1047. row1cell1 = row.createCell(cellNumber);
  1048. row1cell1.setCellValue("周三");
  1049. row1cell1.setCellStyle(cellStyle);
  1050. sheet.setColumnWidth(cellNumber, 16 * 256);
  1051. cellNumber++;
  1052. row1cell1 = row.createCell(cellNumber);
  1053. row1cell1.setCellValue("周四");
  1054. row1cell1.setCellStyle(cellStyle);
  1055. sheet.setColumnWidth(cellNumber, 16 * 256);
  1056. cellNumber++;
  1057. row1cell1 = row.createCell(cellNumber);
  1058. row1cell1.setCellValue("周五");
  1059. row1cell1.setCellStyle(cellStyle);
  1060. sheet.setColumnWidth(cellNumber, 16 * 256);
  1061. cellNumber++;
  1062. row1cell1 = row.createCell(cellNumber);
  1063. row1cell1.setCellValue("周六");
  1064. row1cell1.setCellStyle(cellStyle);
  1065. sheet.setColumnWidth(cellNumber, 16 * 256);
  1066. cellNumber++;
  1067. row1cell1 = row.createCell(cellNumber);
  1068. row1cell1.setCellValue("周日");
  1069. row1cell1.setCellStyle(cellStyle);
  1070. sheet.setColumnWidth(cellNumber, 16 * 256);
  1071. }
  1072. void createFirstTitle(Workbook workbook, Sheet sheet, CourseTableVo data, CourseTableDto dto) {
  1073. // 创建一个字体对象
  1074. Font font = workbook.createFont();
  1075. font.setBold(true);// 设置为粗体
  1076. font.setFontName("宋体");
  1077. //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
  1078. font.setFontHeightInPoints((short) 18);
  1079. // 创建一个单元格样式对象
  1080. CellStyle cellStyle = workbook.createCellStyle();
  1081. cellStyle.setFont(font); // 将字体应用到样式
  1082. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  1083. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  1084. cellStyle.setBorderTop(BorderStyle.THIN);
  1085. cellStyle.setBorderBottom(BorderStyle.THIN);
  1086. cellStyle.setBorderLeft(BorderStyle.THIN);
  1087. cellStyle.setBorderRight(BorderStyle.THIN);
  1088. Row row = sheet.createRow(0);
  1089. String title = data.getSemesterName();
  1090. if ("class".equals(dto.getCourseType())) {
  1091. title += " " + data.getClassName() + " ";
  1092. } else if ("teacher".equals(dto.getCourseType())) {
  1093. title += " " + data.getTeacherName() + " ";
  1094. }
  1095. title += data.getWeek() + " 课程表";
  1096. int cellNumber = 0;
  1097. Cell row1cell1 = row.createCell(cellNumber);
  1098. row1cell1.setCellValue(title);
  1099. row1cell1.setCellStyle(cellStyle);
  1100. for (int i = 1; i < 9; i++) {
  1101. row1cell1 = row.createCell(i);
  1102. row1cell1.setCellValue("");
  1103. row1cell1.setCellStyle(cellStyle);
  1104. }
  1105. //合并
  1106. sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));
  1107. // sheet.setColumnWidth(0, 335 * 256);
  1108. }
  1109. public Integer getSubstituteTeacherCourseCountByParams(ClassTeacherDto dto) {
  1110. return this.baseMapper.getSubstituteTeacherCourseCountByParams(dto);
  1111. }
  1112. /**
  1113. * 课表导出
  1114. *
  1115. * @param dto
  1116. * @return
  1117. */
  1118. @Override
  1119. public ByteArrayOutputStream exportQuery(CourseTableExportQueryDto dto) throws IOException {
  1120. BaseSemester baseSemester = baseSemesterMapper.selectById(dto.getSemesterId());
  1121. CourseTableExportQueryUtil exportQueryUtil = new CourseTableExportQueryUtil();
  1122. String schoolName = "重庆市铜梁职业教育中心";
  1123. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  1124. //查询数据
  1125. CourseTableDto dataDto = new CourseTableDto();
  1126. dataDto.setSemesterId(dto.getSemesterId());
  1127. dataDto.setWeek(dto.getWeek());
  1128. CourseTableVo tableVo = this.getList(dataDto);
  1129. if("calss".equals(dto.getCourseType())){//班级课表
  1130. //根据年级、专业部,查询需要导出的班级
  1131. List<BaseClass> classList = baseClassService.list(
  1132. new QueryWrapper<BaseClass>().lambda()
  1133. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  1134. .eq(BaseClass::getIsGraduate, 1)
  1135. .in(BaseClass::getGradeId, dto.getGradeIds())
  1136. .in(BaseClass::getOrgId, dto.getDeptIds())
  1137. );
  1138. Map<String, List<CourseDetailVo>> classDataMap = tableVo.getCourseList().stream().collect(Collectors.groupingBy(CourseDetailVo::getClassName));
  1139. Workbook workbook = new XSSFWorkbook();
  1140. String sheetName = "班级课表";
  1141. Sheet sheet = workbook.createSheet(sheetName);
  1142. String bigHead = "课程表";
  1143. int classTableRowCount = 16;//每个班的课表占用的总行数
  1144. for(int i = 0; i < classList.size(); i ++){
  1145. BaseClass baseClass = classList.get(i);
  1146. CourseTableVo classData = new CourseTableVo();
  1147. classData.setClassTimeList(tableVo.getClassTimeList());
  1148. classData.setCourseList(classDataMap.get(baseClass.getName()));
  1149. String rightName = "班主任:" + tableVo.getTeacherName() + " 行政班:" + baseClass.getName();
  1150. int bigHeadRow = (classTableRowCount + 3) * i;
  1151. //生成第一行title
  1152. ImportExcelUtil.createBigHead(workbook, sheet, bigHead, bigHeadRow, 8);
  1153. //生成副标题,展示所属学期
  1154. ImportExcelUtil.createSubtitle(workbook, sheet, baseSemester.getName(), bigHeadRow + 1, 8);
  1155. //生成第三行,显示学校名字、班主任和班级名字
  1156. exportQueryUtil.createThirdTitle(workbook, sheet, bigHeadRow + 2, schoolName, rightName);
  1157. //生成表头
  1158. createSecondTitle(workbook, sheet, bigHeadRow + 3);
  1159. //生成内容
  1160. exportQueryUtil.createContent(workbook, sheet, bigHeadRow + 4, classData, dto.getCourseType());
  1161. }
  1162. workbook.write(bot);
  1163. }else if("teacher".equals(dto.getCourseType())){//教师课表
  1164. //根据学期和周次,查询当前所有有课表的教师id
  1165. LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault());
  1166. LocalDate startDate = startDateTime.plusDays((dto.getWeek() - 1) * 7L).toLocalDate();
  1167. LocalDate endDate = startDate.plusDays(6);
  1168. List<CourseTable> list = this.list(
  1169. new QueryWrapper<CourseTable>().lambda()
  1170. .eq(CourseTable::getBaseSemesterId, dto.getSemesterId())
  1171. .ge(CourseTable::getScheduleDate, startDate)
  1172. .le(CourseTable::getScheduleDate, endDate)
  1173. );
  1174. Set<String> teacherIds = list.stream().map(CourseTable::getTeacherId).collect(Collectors.toSet());
  1175. Set<Long> teacherIdList = new HashSet<>();
  1176. for (String teacherId : teacherIds) {
  1177. String[] split = teacherId.split(", ");
  1178. for (String s : split) {
  1179. teacherIdList.add(Long.parseLong(s));
  1180. }
  1181. }
  1182. List<User> userList = userService.listByIds(teacherIdList);
  1183. Workbook workbook = new XSSFWorkbook();
  1184. String sheetName = "教师课表";
  1185. Sheet sheet = workbook.createSheet(sheetName);
  1186. String bigHead = "课程表";
  1187. int classTableRowCount = 16;//每个班的课表占用的总行数
  1188. for(int i = 0; i < userList.size(); i ++){
  1189. User user = userList.get(i);
  1190. List<CourseDetailVo> courseList = tableVo.getCourseList().stream().filter(x -> x.getTeacherName().contains(user.getName())).collect(Collectors.toList());
  1191. CourseTableVo classData = new CourseTableVo();
  1192. classData.setClassTimeList(tableVo.getClassTimeList());
  1193. classData.setCourseList(courseList);
  1194. String rightName = "教师:" + user.getName();
  1195. int bigHeadRow = (classTableRowCount + 3) * i;
  1196. //生成第一行title
  1197. ImportExcelUtil.createBigHead(workbook, sheet, bigHead, bigHeadRow, 8);
  1198. //生成副标题,展示所属学期
  1199. ImportExcelUtil.createSubtitle(workbook, sheet, baseSemester.getName(), bigHeadRow + 1, 8);
  1200. //生成第三行,显示学校名字、班主任和班级名字
  1201. exportQueryUtil.createThirdTitle(workbook, sheet, bigHeadRow + 2, schoolName, rightName);
  1202. //生成表头
  1203. createSecondTitle(workbook, sheet, bigHeadRow + 3);
  1204. //生成内容
  1205. exportQueryUtil.createContent(workbook, sheet, bigHeadRow + 4, classData, dto.getCourseType());
  1206. }
  1207. workbook.write(bot);
  1208. }else if("classroom".equals(dto.getCourseType())){//教室课表
  1209. Map<String, List<CourseDetailVo>> classroomDataMap = tableVo.getCourseList().stream().filter(x -> x.getClassroomName() != null).collect(Collectors.groupingBy(CourseDetailVo::getClassroomName));
  1210. List<BaseClassroom> classroomList = classroomMapper.selectList(
  1211. new QueryWrapper<BaseClassroom>().lambda()
  1212. .eq(BaseClassroom::getDeleteMark, DeleteMark.NODELETE.getCode())
  1213. );
  1214. List<BaseOfficeBuild> buildList = officeBuildMapper.selectList(
  1215. new QueryWrapper<BaseOfficeBuild>().lambda()
  1216. .eq(BaseOfficeBuild::getDeleteMark, DeleteMark.NODELETE.getCode())
  1217. );
  1218. Map<Long, String> buildMap = buildList.stream().collect(Collectors.toMap(BaseOfficeBuild::getId, BaseOfficeBuild::getName));
  1219. Workbook workbook = new XSSFWorkbook();
  1220. String sheetName = "教室课表";
  1221. Sheet sheet = workbook.createSheet(sheetName);
  1222. String bigHead = "课程表";
  1223. int classTableRowCount = 16;//每个班的课表占用的总行数
  1224. for (int i = 0; i < classroomList.size(); i ++){
  1225. BaseClassroom baseClassroom = classroomList.get(i);
  1226. String classroomName = buildMap.get(baseClassroom.getOfficeBuildId()) + baseClassroom.getName();
  1227. List<CourseDetailVo> courseList = classroomDataMap.get(classroomName);
  1228. CourseTableVo classData = new CourseTableVo();
  1229. classData.setClassTimeList(tableVo.getClassTimeList());
  1230. classData.setCourseList(courseList);
  1231. int bigHeadRow = (classTableRowCount + 3) * i;
  1232. //生成第一行title
  1233. ImportExcelUtil.createBigHead(workbook, sheet, bigHead, bigHeadRow, 8);
  1234. //生成副标题,展示所属学期
  1235. ImportExcelUtil.createSubtitle(workbook, sheet, baseSemester.getName(), bigHeadRow + 1, 8);
  1236. //生成第三行,显示学校名字、班主任和班级名字
  1237. exportQueryUtil.createThirdTitle(workbook, sheet, bigHeadRow + 2, schoolName, classroomName);
  1238. //生成表头
  1239. createSecondTitle(workbook, sheet, bigHeadRow + 3);
  1240. //生成内容
  1241. exportQueryUtil.createContent(workbook, sheet, bigHeadRow + 4, classData, dto.getCourseType());
  1242. }
  1243. workbook.write(bot);
  1244. }else if("all".equals(dto.getCourseType())){//总课表
  1245. //根据年级、专业部,查询需要导出的班级
  1246. List<BaseClass> classList = baseClassService.list(
  1247. new QueryWrapper<BaseClass>().lambda()
  1248. .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
  1249. .eq(BaseClass::getIsGraduate, 1)
  1250. .in(BaseClass::getGradeId, dto.getGradeIds())
  1251. .in(BaseClass::getOrgId, dto.getDeptIds())
  1252. );
  1253. }
  1254. return bot;
  1255. }
  1256. }