CourseTableServiceImpl.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. package com.xjrsoft.module.courseTable.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.date.DateField;
  4. import cn.hutool.core.date.DateTime;
  5. import cn.hutool.core.date.DateUtil;
  6. import cn.hutool.core.util.ObjectUtil;
  7. import cn.hutool.core.util.StrUtil;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  10. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  11. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  12. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  13. import com.google.gson.JsonArray;
  14. import com.google.gson.JsonObject;
  15. import com.google.gson.JsonParser;
  16. import com.xjrsoft.common.enums.CourseAdjustTypeEnum;
  17. import com.xjrsoft.common.enums.TimeNumberEnum;
  18. import com.xjrsoft.common.enums.TimePeriodEnum;
  19. import com.xjrsoft.common.enums.WeekEnum;
  20. import com.xjrsoft.common.exception.MyException;
  21. import com.xjrsoft.config.TimetableConfig;
  22. import com.xjrsoft.module.base.entity.BaseClass;
  23. import com.xjrsoft.module.base.entity.BaseSemester;
  24. import com.xjrsoft.module.base.mapper.BaseSemesterMapper;
  25. import com.xjrsoft.module.base.service.IBaseClassService;
  26. import com.xjrsoft.module.base.service.IBaseSemesterService;
  27. import com.xjrsoft.module.courseTable.dto.ClassListDto;
  28. import com.xjrsoft.module.courseTable.dto.CourseTableParse;
  29. import com.xjrsoft.module.courseTable.entity.ClassTime;
  30. import com.xjrsoft.module.courseTable.entity.CourseTable;
  31. import com.xjrsoft.module.courseTable.mapper.ClassTimeMapper;
  32. import com.xjrsoft.module.courseTable.mapper.CourseTableMapper;
  33. import com.xjrsoft.module.courseTable.service.ICourseTableService;
  34. import com.xjrsoft.module.courseTable.vo.ClassListVo;
  35. import com.xjrsoft.module.schedule.dto.CourseTableAdjustDto;
  36. import com.xjrsoft.module.schedule.dto.CourseTableDto;
  37. import com.xjrsoft.module.schedule.entity.WfCourseAdjust;
  38. import com.xjrsoft.module.schedule.mapper.CourseTableBakMapper;
  39. import com.xjrsoft.module.schedule.util.ScheduleUtil;
  40. import com.xjrsoft.module.schedule.vo.CourseDetailVo;
  41. import com.xjrsoft.module.schedule.vo.CourseListVo;
  42. import com.xjrsoft.module.schedule.vo.CourseTableVo;
  43. import com.xjrsoft.module.teacher.entity.BaseTeacher;
  44. import com.xjrsoft.module.teacher.entity.XjrUser;
  45. import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
  46. import lombok.AllArgsConstructor;
  47. import org.apache.poi.xwpf.usermodel.XWPFDocument;
  48. import org.apache.poi.xwpf.usermodel.XWPFParagraph;
  49. import org.apache.poi.xwpf.usermodel.XWPFTable;
  50. import org.apache.poi.xwpf.usermodel.XWPFTableCell;
  51. import org.apache.poi.xwpf.usermodel.XWPFTableRow;
  52. import org.springframework.stereotype.Service;
  53. import org.springframework.transaction.annotation.Transactional;
  54. import java.io.IOException;
  55. import java.io.InputStream;
  56. import java.time.DayOfWeek;
  57. import java.time.Duration;
  58. import java.time.LocalDate;
  59. import java.time.LocalDateTime;
  60. import java.time.ZoneId;
  61. import java.time.format.DateTimeFormatter;
  62. import java.util.ArrayList;
  63. import java.util.Date;
  64. import java.util.HashMap;
  65. import java.util.List;
  66. import java.util.Map;
  67. import java.util.stream.Collectors;
  68. /**
  69. * <p>
  70. * 课表 服务实现类
  71. * </p>
  72. *
  73. * @author baomidou
  74. * @since 2023-09-02 02:19:56
  75. */
  76. @Service
  77. @AllArgsConstructor
  78. public class CourseTableServiceImpl extends ServiceImpl<CourseTableMapper, CourseTable> implements ICourseTableService {
  79. private final CourseTableMapper courseTableMapper;
  80. private final IBaseClassService baseClassService;
  81. private final ITeacherbaseManagerService teacherbaseManagerService;
  82. private final IBaseSemesterService baseSemesterService;
  83. private final TimetableConfig timetableConfig;
  84. private final ClassTimeMapper classTimeMapper;
  85. private final BaseSemesterMapper baseSemesterMapper;
  86. private final CourseTableBakMapper courseTableBakMapper;
  87. @Override
  88. @Transactional(rollbackFor = Exception.class)
  89. public Boolean wordImport(InputStream inputStream) throws IOException {
  90. List<CourseTableParse> parses = courseTableWordParses(inputStream);
  91. String semester = null;
  92. if (parses.size() > 0) {
  93. semester = parses.get(0).getSemester();
  94. }
  95. BaseSemester baseSemester = baseSemesterService.getOne(Wrappers.<BaseSemester>query().lambda().eq(BaseSemester::getName, semester));
  96. if (baseSemester == null) {
  97. throw new MyException(String.format("学期【%s】不存在", semester));
  98. }
  99. // 获取班级信息
  100. List<BaseClass> baseClassList = baseClassService.list();
  101. Map<String, BaseClass> baseClassMap = baseClassList.stream().collect(Collectors.toMap(BaseClass::getName, a -> a, (k1, k2) -> k1));
  102. // 获取教师信息
  103. MPJLambdaWrapper<XjrUser> queryWrapper = new MPJLambdaWrapper<>();
  104. queryWrapper
  105. .disableSubLogicDel()
  106. .innerJoin(BaseTeacher.class, BaseTeacher::getUserId, XjrUser::getId)
  107. .selectAll(XjrUser.class);
  108. List<XjrUser> xjrUserList = teacherbaseManagerService.list(queryWrapper);
  109. Map<String, XjrUser> xjrUsersMap = xjrUserList.stream().collect(Collectors.toMap(XjrUser::getName, a -> a, (k1, k2) -> k1));
  110. // 清空所有数据
  111. courseTableMapper.delete(Wrappers.<CourseTable>query().lambda().eq(CourseTable::getBaseSemesterId, baseSemester.getId()));
  112. List<CourseTable> params = new ArrayList<>();
  113. for (CourseTableParse item : parses) {
  114. CourseTable courseTable = BeanUtil.toBean(item, CourseTable.class);
  115. courseTable.setBaseSemesterId(baseSemester.getId());
  116. BaseClass baseClass = baseClassMap.get(item.getClassName());
  117. if (baseClass != null) {
  118. courseTable.setClassId(baseClass.getId());
  119. }
  120. XjrUser xjrUser = xjrUsersMap.get(item.getTeacherName());
  121. if (xjrUser != null) {
  122. courseTable.setTeacherId(xjrUser.getId());
  123. }
  124. if (item.getWeeksCn() != null) {
  125. courseTable.setWeeks(WeekEnum.getCode(item.getWeeksCn()));
  126. }
  127. params.add(courseTable);
  128. }
  129. return this.saveBatch(params);
  130. }
  131. @Override
  132. public List<ClassListVo> classList(ClassListDto dto) {
  133. LambdaQueryWrapper<CourseTable> queryWrapper = new LambdaQueryWrapper<>();
  134. queryWrapper.eq(CourseTable::getClassId, dto.getClassId())
  135. .eq(ObjectUtil.isNotEmpty(dto.getWeeks()), CourseTable::getWeeks,dto.getWeeks());
  136. List<CourseTable> courseTables = courseTableMapper.selectList(queryWrapper);
  137. List<ClassListVo> classListVos = BeanUtil.copyToList(courseTables, ClassListVo.class);
  138. Boolean isCurrentSummer = isCurrentSummer();
  139. Map<String, ClassTime> classTimeMap = getClassTimeMap();
  140. // 获取节次时间
  141. for (int i = 0; i < classListVos.size(); i++) {
  142. ClassListVo c = classListVos.get(i);
  143. String key = String.format("%d_%d", c.getTimePeriod(), c.getTimeNumber());
  144. ClassTime ct = classTimeMap.get(key);
  145. if (ct != null) {
  146. if (isCurrentSummer) {
  147. c.setStartTime(ct.getSummerStartTime());
  148. c.setEndTime(ct.getSummerEndTime());
  149. } else {
  150. c.setStartTime(ct.getWinterStartTime());
  151. c.setEndTime(ct.getWinterEndTime());
  152. }
  153. }
  154. }
  155. return classListVos;
  156. }
  157. @Override
  158. public CourseTableVo getList(CourseTableDto dto) {
  159. List<ClassTime> classTimes = classTimeMapper.selectList(
  160. new QueryWrapper<ClassTime>().lambda().orderByAsc(ClassTime::getSummerStartTime)
  161. );
  162. CourseTableVo tableVo = new CourseTableVo();
  163. tableVo.setClassTimeList(classTimes);
  164. if(dto.getSemesterId() != null){
  165. BaseSemester baseSemester = baseSemesterMapper.selectById(dto.getSemesterId());
  166. tableVo.setSemesterName(baseSemester.getName());
  167. LocalDateTime now = LocalDateTime.now();
  168. //计算本周是第几周
  169. LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getStartDate().toInstant(), ZoneId.systemDefault());
  170. LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getEndDate().toInstant(), ZoneId.systemDefault());
  171. Duration between = Duration.between(startDateTime, endDateTime);
  172. long days = between.toDays();
  173. int weeks = (int) Math.ceil((double) days / 7);
  174. if(dto.getWeek() == null){
  175. for (int i = 0; i < weeks; i ++){
  176. LocalDateTime startDate = startDateTime.plusDays(i * 7).withHour(0).withMinute(0).withSecond(0).withNano(0);
  177. LocalDateTime endDate = startDateTime.plusDays((i + 1) * 7).withHour(23).withMinute(59).withSecond(59).withNano(9999);
  178. if(now.isAfter(startDate) && now.isBefore(endDate)){
  179. tableVo.setWeek("第" + (i + 1) + "周");
  180. }
  181. }
  182. }else{
  183. LocalDateTime startDate = startDateTime.plusDays((dto.getWeek() - 1) * 7).withHour(0).withMinute(0).withSecond(0).withNano(0);
  184. LocalDateTime endDate = startDateTime.plusDays(dto.getWeek() * 7).withHour(23).withMinute(59).withSecond(59).withNano(9999);
  185. dto.setStartDate(startDate);
  186. dto.setEndDate(endDate);
  187. tableVo.setWeek("第" + dto.getWeek() + "周");
  188. }
  189. }
  190. if(!StrUtil.isEmpty(dto.getTeacherName())){
  191. List<XjrUser> userList = teacherbaseManagerService.list(
  192. new QueryWrapper<XjrUser>().lambda()
  193. .like(!StrUtil.isEmpty(dto.getTeacherName()), XjrUser::getName, dto.getTeacherName())
  194. .like(!StrUtil.isEmpty(dto.getJobNumber()), XjrUser::getCode, dto.getJobNumber())
  195. );
  196. if(userList != null && !userList.isEmpty()){
  197. XjrUser xjrUser = userList.get(0);
  198. dto.setTeacherId(xjrUser.getId());
  199. tableVo.setTeacherName(xjrUser.getName());
  200. }
  201. }
  202. List<CourseDetailVo> list = courseTableMapper.getList(dto);
  203. tableVo.setCourseList(list);
  204. tableVo.setClassHour(list.size());
  205. if(dto.getClassId() != null){
  206. BaseClass baseClass = baseClassService.getById(dto.getClassId());
  207. tableVo.setClassName(baseClass.getName());
  208. }
  209. return tableVo;
  210. }
  211. /**
  212. * 调课顶课查询
  213. */
  214. @Override
  215. public List<CourseListVo> getAdjustList(String teacherId, String adjustDate) {
  216. CourseTableAdjustDto dto = new CourseTableAdjustDto();
  217. if(adjustDate != null && !"".equals(adjustDate)){
  218. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  219. LocalDate localDateTime = LocalDate.parse(adjustDate, formatter);
  220. DayOfWeek dayOfWeek = localDateTime.getDayOfWeek();
  221. dto.setWeek(dayOfWeek.getValue());
  222. }
  223. dto.setTeacherId(Long.parseLong(teacherId));
  224. return courseTableMapper.getAdjustList(dto);
  225. }
  226. @Override
  227. public String getPreCheck(String preCheckType, String courseId, String swapCourseId, String swapDate, String subTeacherId) {
  228. if(preCheckType != null && !"".equals(preCheckType)){
  229. if(CourseAdjustTypeEnum.courseExchange.getCode().equals(preCheckType)){
  230. CourseTable courseTable = courseTableMapper.selectById(courseId);
  231. CourseTable swapCourseTable = courseTableMapper.selectById(swapCourseId);
  232. try {
  233. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  234. LocalDate localDateTime = LocalDate.parse(swapDate, formatter);
  235. JsonObject preCheck = getExtendPreCheck(localDateTime, courseTable, swapCourseTable);
  236. if(!preCheck.get("data").getAsBoolean() && !preCheck.get("msg").isJsonNull()){
  237. return preCheck.get("msg").getAsString();
  238. }
  239. } catch (Exception e) {
  240. throw new RuntimeException(e);
  241. }
  242. }else if(CourseAdjustTypeEnum.courseSubstitute.getCode().equals(preCheckType)){
  243. CourseTable courseTable = courseTableMapper.selectById(courseId);
  244. try {
  245. JsonObject jsonObject = substitutePreTestin(subTeacherId, courseTable);
  246. if(!jsonObject.get("data").getAsBoolean() && !jsonObject.get("msg").isJsonNull()){
  247. return jsonObject.get("msg").getAsString();
  248. }
  249. } catch (Exception e) {
  250. throw new RuntimeException(e);
  251. }
  252. }
  253. }
  254. return null;
  255. }
  256. @Override
  257. public Boolean adjustCourse(WfCourseAdjust courseAdjust) throws Exception {
  258. if(CourseAdjustTypeEnum.courseExchange.getCode().equals(courseAdjust.getAdjustType())){
  259. //调课,将双方课程的日期(schedule_date)、时段(time_period)、节次(time_number)、周(week)、星期几(1-7)(weeks)、星期中文(weeks_cn)对调
  260. CourseTable courseTable = courseTableMapper.selectById(courseAdjust.getCourseId());
  261. CourseTable swapCourseTable = courseTableMapper.selectById(courseAdjust.getExchangeCourseId());
  262. CourseTable courseTableBak = BeanUtil.toBean(courseTable, CourseTable.class);
  263. CourseTable swapCourseTableBak = BeanUtil.toBean(swapCourseTable, CourseTable.class);
  264. courseTable.setScheduleDate(swapCourseTableBak.getScheduleDate());
  265. courseTable.setTimePeriod(swapCourseTableBak.getTimePeriod());
  266. courseTable.setTimeNumber(swapCourseTableBak.getTimeNumber());
  267. courseTable.setWeek(swapCourseTableBak.getWeek());
  268. courseTable.setWeeks(swapCourseTableBak.getWeeks());
  269. courseTable.setWeeksCn(swapCourseTableBak.getWeeksCn());
  270. courseTableMapper.updateById(courseTable);
  271. swapCourseTable.setScheduleDate(courseTableBak.getScheduleDate());
  272. swapCourseTable.setTimePeriod(courseTableBak.getTimePeriod());
  273. swapCourseTable.setTimeNumber(courseTableBak.getTimeNumber());
  274. swapCourseTable.setWeek(courseTableBak.getWeek());
  275. swapCourseTable.setWeeks(courseTableBak.getWeeks());
  276. swapCourseTable.setWeeksCn(courseTableBak.getWeeksCn());
  277. courseTableMapper.updateById(swapCourseTable);
  278. //提交调课接口
  279. sendExchange(courseTableBak, swapCourseTableBak, courseAdjust);
  280. }else if(CourseAdjustTypeEnum.courseSubstitute.getCode().equals(courseAdjust.getAdjustType())){
  281. CourseTable courseTable = courseTableMapper.selectById(courseAdjust.getCourseId());
  282. courseTable.setTeacherId(courseAdjust.getExchangeTeacherId());
  283. courseTableMapper.updateById(courseTable);
  284. //提交顶课接口
  285. sendSubstitute(courseTable, courseAdjust);
  286. }
  287. return Boolean.TRUE;
  288. }
  289. /**
  290. * 提交顶课接口
  291. * @param courseTable
  292. * @param courseAdjust
  293. * @throws Exception
  294. */
  295. void sendSubstitute(CourseTable courseTable, WfCourseAdjust courseAdjust) throws Exception {
  296. String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/Substitute/Submit";
  297. JsonObject jsonObject = new JsonObject();
  298. jsonObject.addProperty("timetableId", courseTable.getJianyueId());
  299. jsonObject.addProperty("isCycles", Boolean.FALSE);
  300. jsonObject.addProperty("reason", courseAdjust.getReason());
  301. jsonObject.addProperty("teacherId", courseAdjust.getUserId());
  302. JsonArray extendIds = new JsonArray();
  303. extendIds.add(courseTable.getTeacherId());
  304. jsonObject.add("extendIds", extendIds);
  305. //获取时间戳
  306. long timestamp = System.currentTimeMillis();
  307. //生成签名
  308. String sign = ScheduleUtil.createSign(timestamp);
  309. String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
  310. System.out.println(result);
  311. }
  312. /**
  313. * 提交调课
  314. * @param courseTable
  315. * @param swapCourseTable
  316. * @throws Exception
  317. */
  318. void sendExchange(CourseTable courseTable, CourseTable swapCourseTable, WfCourseAdjust courseAdjust) throws Exception {
  319. String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/Submit";
  320. JsonObject jsonObject = new JsonObject();
  321. jsonObject.addProperty("timetableId", courseTable.getJianyueId());
  322. jsonObject.addProperty("isCycles", Boolean.FALSE);
  323. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  324. jsonObject.addProperty("date", swapCourseTable.getScheduleDate().format(formatter));
  325. jsonObject.addProperty("numberOfDay", swapCourseTable.getTimeNumber());
  326. jsonObject.addProperty("rescheduleId", swapCourseTable.getJianyueId());
  327. jsonObject.addProperty("reason", courseAdjust.getReason());
  328. jsonObject.addProperty("teacherId", courseAdjust.getUserId());
  329. //获取时间戳
  330. long timestamp = System.currentTimeMillis();
  331. //生成签名
  332. String sign = ScheduleUtil.createSign(timestamp);
  333. String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
  334. }
  335. /**
  336. * 顶课预检查
  337. * @param courseTable
  338. * @return 检查结果
  339. */
  340. JsonObject substitutePreTestin(String subTeacherId, CourseTable courseTable) throws Exception {
  341. JsonParser jsonParser = new JsonParser();
  342. String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/Substitute/PreTesting";
  343. JsonObject jsonObject = new JsonObject();
  344. jsonObject.addProperty("timetableId", courseTable.getJianyueId());
  345. jsonObject.addProperty("isCycles", Boolean.FALSE);
  346. JsonArray extendIds = new JsonArray();
  347. extendIds.add(subTeacherId);
  348. jsonObject.add("extendIds", extendIds);
  349. //获取时间戳
  350. long timestamp = System.currentTimeMillis();
  351. //生成签名
  352. String sign = ScheduleUtil.createSign(timestamp);
  353. String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
  354. if(StrUtil.isEmpty(result)){
  355. return null;
  356. }
  357. return jsonParser.parse(result).getAsJsonObject();
  358. }
  359. /**
  360. * 调课预检查
  361. * @param courseTable 需要调整的课程
  362. * @param swapCourseTable 对调的课程
  363. * @return 检查结果
  364. */
  365. JsonObject getExtendPreCheck(LocalDate swapDate, CourseTable courseTable, CourseTable swapCourseTable) throws Exception {
  366. JsonParser jsonParser = new JsonParser();
  367. String url = ScheduleUtil.apiUrl + "RescheduleApply/Extend/PreTesting";
  368. JsonObject jsonObject = new JsonObject();
  369. jsonObject.addProperty("timetableId", courseTable.getJianyueId());
  370. jsonObject.addProperty("isCycles", Boolean.FALSE);
  371. // jsonObject.addProperty("startDate", "2024-01-01");
  372. // jsonObject.addProperty("endDate", "2024-01-31");
  373. // jsonObject.addProperty("dayOfweek", 5);
  374. jsonObject.addProperty("numberOfday", swapCourseTable.getTimeNumber());
  375. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  376. jsonObject.addProperty("date", swapDate.format(formatter));
  377. jsonObject.addProperty("reschduleId", courseTable.getJianyueId());
  378. //获取时间戳
  379. long timestamp = System.currentTimeMillis();
  380. //生成签名
  381. String sign = ScheduleUtil.createSign(timestamp);
  382. String result = ScheduleUtil.doPost(url, jsonObject.toString(), sign, timestamp);
  383. if(StrUtil.isEmpty(result)){
  384. return null;
  385. }
  386. return jsonParser.parse(result).getAsJsonObject();
  387. }
  388. /**
  389. * 获取节次
  390. *
  391. * @return
  392. */
  393. private Map<String, ClassTime> getClassTimeMap() {
  394. List<ClassTime> classTimes = classTimeMapper.selectList(null);
  395. Map<String, ClassTime> result = new HashMap<>();
  396. for (ClassTime item : classTimes) {
  397. String key = String.format("%d_%d", item.getTimePeriod(), item.getNumber());
  398. result.put(key, item);
  399. }
  400. return result;
  401. }
  402. /**
  403. * 当前时间是否在夏季
  404. *
  405. * @return
  406. */
  407. private Boolean isCurrentSummer() {
  408. DateTime now = DateUtil.date();
  409. DateTime summerStart = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getSummerStart()));
  410. DateTime summerEnd = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getSummerEnd()));
  411. DateTime winterStart = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getWinterStart()));
  412. DateTime winterEnd = DateUtil.parse(String.format("%d-%s", now.year(), timetableConfig.getWinterEnd()));
  413. // 如果开始时间大于结束时间,开始时间增加1年
  414. if (DateUtil.compare(summerStart, summerEnd) > 0) {
  415. summerEnd = DateUtil.offset(summerEnd, DateField.DAY_OF_YEAR, 1);
  416. }
  417. if (DateUtil.compare(winterStart, winterEnd) > 0) {
  418. winterEnd = DateUtil.offset(winterEnd, DateField.DAY_OF_YEAR, 1);
  419. }
  420. if (DateUtil.compare(summerStart, now) > 0 && DateUtil.compare(summerEnd, now) < 0) {
  421. return true;
  422. }
  423. return false;
  424. }
  425. /**
  426. * 解析word课表
  427. *
  428. * @param inputStream
  429. * @return
  430. * @throws IOException
  431. */
  432. private List<CourseTableParse> courseTableWordParses(InputStream inputStream) throws IOException {
  433. XWPFDocument doc = new XWPFDocument(inputStream);
  434. List<XWPFParagraph> paras = doc.getParagraphs();
  435. String semester = null;
  436. List<String> cNames = new ArrayList<>();
  437. //获取标题
  438. for (int i = 0; i < paras.size(); i++) {
  439. String txt = paras.get(i).getText();
  440. if (i == 0) {
  441. semester = txt;
  442. continue;
  443. }
  444. txt = txt.replaceAll("总课程表", "").replace("\n", "").trim();
  445. if (!txt.equals("") && !txt.equals(semester)) {
  446. cNames.add(txt);
  447. }
  448. }
  449. List<CourseTableParse> result = new ArrayList<>();
  450. //获取文档中所有的表格
  451. List<XWPFTable> tables = doc.getTables();
  452. int tNum = 0;
  453. for (XWPFTable table : tables) {
  454. int rNum = 0;
  455. String timePeriod = null;
  456. List<String> weeks = new ArrayList<>();
  457. List<XWPFTableRow> rows = table.getRows();
  458. for (XWPFTableRow row : rows) {
  459. //获取行对应的单元格
  460. List<XWPFTableCell> cells = row.getTableCells();
  461. String timeNumber = null;
  462. for (int i = 0; i < cells.size(); i++) {
  463. String cellText = cells.get(i).getText();
  464. if (cellText.equals("") || rNum < 1) continue;
  465. if (rNum == 1) {
  466. weeks.add(cellText);
  467. continue;
  468. }
  469. if (i == 0) {
  470. timePeriod = cellText;
  471. continue;
  472. }
  473. if (i == 1) {
  474. timeNumber = cellText;
  475. continue;
  476. }
  477. List<XWPFParagraph> cParagraph = cells.get(i).getParagraphs();
  478. CourseTableParse item = new CourseTableParse();
  479. item.setSemester(semester);
  480. item.setTimePeriod(TimePeriodEnum.getCode(timePeriod));
  481. item.setTimeNumber(TimeNumberEnum.getCode(timeNumber));
  482. String week = weeks.get(Math.max(i - 2, 0));
  483. item.setWeeksCn(week);
  484. item.setClassName(cNames.get(tNum));
  485. for (int j = 0; j < cParagraph.size(); j++) {
  486. cellText = cParagraph.get(j).getText().trim();
  487. switch (j) {
  488. case 0:
  489. item.setCourseName(cellText);
  490. break;
  491. case 1:
  492. item.setTeacherName(cellText);
  493. break;
  494. case 2:
  495. item.setSiteName(cellText);
  496. break;
  497. }
  498. }
  499. result.add(item);
  500. }
  501. rNum++;
  502. }
  503. tNum++;
  504. }
  505. inputStream.close();
  506. return result;
  507. }
  508. }