From a8d58fb9de62c0b743ca86be2ad6a9bf6dbdde32 Mon Sep 17 00:00:00 2001 From: Mlxa0324 Date: Wed, 2 Nov 2022 17:33:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=91=A8=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ibeetl/admin/core/util/DateUtil.java | 129 ++++++++++++++++-- doc/sql/mysql/tianze-pro-update.sql | 5 +- .../TeacherOpenCourseScheduleSession.java | 5 +- .../TeacherOpenCourseScheduleSessionSnap.java | 4 + ...acherOpenCourseScheduleSessionService.java | 39 +++++- ...rOpenCourseStudentSigninLogController.java | 2 +- ...herOpenCourseScheduleSessionSnapQuery.java | 12 ++ .../teacherOpenCourseScheduleSessionSnap.md | 19 +++ 8 files changed, 199 insertions(+), 16 deletions(-) diff --git a/admin-core/src/main/java/com/ibeetl/admin/core/util/DateUtil.java b/admin-core/src/main/java/com/ibeetl/admin/core/util/DateUtil.java index 470d2fcf..a6601614 100644 --- a/admin-core/src/main/java/com/ibeetl/admin/core/util/DateUtil.java +++ b/admin-core/src/main/java/com/ibeetl/admin/core/util/DateUtil.java @@ -1,20 +1,17 @@ package com.ibeetl.admin.core.util; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.util.ObjectUtil; + import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.Date; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; -public class DateUtil { +public class DateUtil extends cn.hutool.core.date.DateUtil { public static Date MAX_DATE = maxDate(); - - - public static String now() { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - return sdf.format(new Date()); - } - public static String now(String format) { SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(new Date()); @@ -28,4 +25,118 @@ public class DateUtil { throw new RuntimeException(e); } } + + /** + * 返回时间区间一共有几周。 + * 周一为开始,周日为结束。 + * + * @param dateTimeList 时间区间列表。无序也可以 + * @return + */ + public static Integer dateListWeekSize(List dateTimeList) { + if(ObjectUtil.isEmpty(dateTimeList)) { return 0; } + + Set weekNumber = new HashSet<>(); + for (Date time : dateTimeList) { + // 一年中的第几周,只要有变化,就认为是其他周 + weekNumber.add(weekOfYear(time)); + } + + return weekNumber.size(); + + } + + /** + * 返回待比对的日期,所在列表的第几周 + * + * @param dateTimeList 排序后的日期劣币啊呸 + * @return 返回待比对的日期,所在列表的第几周 + */ + public static Map> groupDateListToWeek(List dateTimeList) { + + Map> res = new HashMap<>(6); + if(ObjectUtil.isEmpty(dateTimeList)) { return res; } + + // 一共有多少周 + Integer weekSize = dateListWeekSize(dateTimeList); + + + // 初始化 + for (int i = 1; i <= weekSize; i++) { + res.put(i, new ArrayList<>()); + + // 迭代器,速度会快一些 + Iterator iterator = dateTimeList.iterator(); + + // 遍历列表 + while (iterator.hasNext()) { + T next = iterator.next(); + DateTime weekStartDateTime = beginOfWeek(next); + + // 遍历的时间,和它自己周的开始时间,是它所在本年度的第几周相等。就认为是同一周 + if(weekOfYear(next) == weekOfYear(weekStartDateTime)) { + res.get(i).add(next); + iterator.remove(); + } + } + } + + return res; + } + + + /** + * 指定时间在时间列表中所在的第几周 + * 根据日历的周来。 + * + * @return + */ + public static Integer weekNumberInList(List dateTimeList, T date) { + if(ObjectUtil.isEmpty(dateTimeList)) { return 0; } + + TreeSet weekNumber = new TreeSet<>(); + for (Date dateTime : dateTimeList) { + // 一年中的第几周,只要有变化,就认为是其他周 + weekNumber.add(weekOfYear(dateTime)); + } + + // 待查询的时间,在今天所在的周 + int dateWeekOfYear = weekOfYear(date); + //计数 + int i = 1; + for (Integer wn : weekNumber) { + if(wn.equals(dateWeekOfYear)) { + return i; + } + i++; + } + return 0; + } + + /** + * 指定时间在时间列表中所在的第几周 + * 根据天数来 + * + * @param date + * @return + * @param + */ + public static Integer weekNumberInList(T startDate, T date, int weekNumber) { + + AtomicInteger index = new AtomicInteger(0); + +// int pageTotalNumber = dateTimeList.size() / pageSize; +// +// // 分页 +// List list = ListUtil.page(1, pageSize, dateTimeList); +// page -> { +// for (int i = 0; i < page.size(); i++) { +// if(page.get(i).compareTo(date) == 0) { +// index.set(i + 1); +// } +// } +// }); TODO malixiang 这里要写 + + return index.get(); + } } diff --git a/doc/sql/mysql/tianze-pro-update.sql b/doc/sql/mysql/tianze-pro-update.sql index da4b11a9..13152b79 100644 --- a/doc/sql/mysql/tianze-pro-update.sql +++ b/doc/sql/mysql/tianze-pro-update.sql @@ -323,4 +323,7 @@ create table teacher_open_course_merge_schedule_session alter table teacher_open_course_merge_schedule_session comment '课程开课-关联-排课配置'; -ALTER TABLE teacher_open_course_chat_log ADD COLUMN chat_log_send_type varchar(50) COMMENT '发送类型 枚举(ChatLogSendTypeEnum)'; +ALTER TABLE teacher_open_course_chat_log ADD COLUMN chat_log_send_type varchar(50) COMMENT '发送类型 枚举(ChatLogSendTypeEnum)'; + +ALTER TABLE teacher_open_course_schedule_session_snap ADD COLUMN teacher_open_course_schedule_session_snap_current_week_number int(10) COMMENT '所在时间列表的第几周'; + diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseScheduleSession.java b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseScheduleSession.java index 8076b1ba..79ac0203 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseScheduleSession.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseScheduleSession.java @@ -98,8 +98,9 @@ public class TeacherOpenCourseScheduleSession extends BaseEntity{ private Long userId ; - @FetchSql("select * from teacher_open_course_schedule_session_snap where teacher_open_course_schedule_session_snap_status = 1 " + - " and teacher_open_course_id = #teacherOpenCourseId#" ) + @FetchSql("select t.* from teacher_open_course_schedule_session_snap t where t.teacher_open_course_schedule_session_snap_status = 1 " + + " and t.teacher_open_course_id = #teacherOpenCourseId# " + + "order by t.teacher_open_course_schedule_session_day_time asc " ) @UpdateIgnore @InsertIgnore @DictDeep diff --git a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseScheduleSessionSnap.java b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseScheduleSessionSnap.java index 69a9ced9..055195e9 100644 --- a/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseScheduleSessionSnap.java +++ b/web/src/main/java/com/ibeetl/jlw/entity/TeacherOpenCourseScheduleSessionSnap.java @@ -45,6 +45,10 @@ public class TeacherOpenCourseScheduleSessionSnap extends BaseEntity{ private Long teacherOpenCourseId ; + // 所在时间列表的第几周 + + private int teacherOpenCourseScheduleSessionSnapCurrentWeekNumber ; + //状态(1正常 2删除) @Dict(type="global_status") diff --git a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseScheduleSessionService.java b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseScheduleSessionService.java index f118399a..bc3c2524 100644 --- a/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseScheduleSessionService.java +++ b/web/src/main/java/com/ibeetl/jlw/service/TeacherOpenCourseScheduleSessionService.java @@ -39,10 +39,14 @@ import org.springframework.validation.annotation.Validated; import javax.validation.constraints.NotNull; import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; import static cn.hutool.core.collection.CollUtil.join; import static cn.hutool.core.date.DatePattern.NORM_DATE_PATTERN; +import static cn.hutool.core.date.DateUtil.parseDate; +import static com.ibeetl.admin.core.util.DateUtil.weekNumberInList; +import static java.util.stream.Collectors.groupingBy; import static java.util.stream.Collectors.toMap; @@ -76,9 +80,28 @@ public class TeacherOpenCourseScheduleSessionService extends CoreBaseService queryByConditionGroup(PageQuery query){ PageQuery ret = teacherOpenCourseScheduleSessionDao.queryByConditionGroup(query); queryListAfter(ret.getList()); + + ((List)ret.getList()).parallelStream() + .forEach(scheduleSession -> { + // 每周根据周次进行拆分 + scheduleSession.set("partitionList", sessionTagListPartition(scheduleSession.getSessionTagList())); + }); return ret; } + /** + * 排课多周次每周进行拆分 + * + * @param sessionTagList 至少确保已经根据日期排过序 + * @return + */ + private Map> sessionTagListPartition(List sessionTagList) { + Map> listMap = sessionTagList.stream() + .collect(groupingBy(TeacherOpenCourseScheduleSessionSnap::getTeacherOpenCourseScheduleSessionSnapCurrentWeekNumber)); + + return listMap; + } + public PageQueryqueryByConditionQuery(PageQuery query){ PageQuery ret = teacherOpenCourseScheduleSessionDao.queryByConditionQuery(query); queryListAfter(ret.getList()); @@ -215,7 +238,7 @@ public class TeacherOpenCourseScheduleSessionService extends CoreBaseService dateTimes = DateUtil.rangeToList(startTime, endTime, DateField.DAY_OF_YEAR); @@ -270,6 +293,9 @@ public class TeacherOpenCourseScheduleSessionService extends CoreBaseService dateTimes = insertByOptionResult.getDateTimes(); Long teacherOpenCourseScheduleSessionId = insertByOptionResult.getTeacherOpenCourseScheduleSessionId(); + DateTime startTime = parseDate(options.getStartTime()); + DateTime endTime = DateUtil.offsetWeek(startTime, options.getWeekNum()); + // 断言,确保开课节次不为空 Assert.notEmpty(options.getSessionClassList(), "开课节次不能为空!"); @@ -310,14 +336,17 @@ public class TeacherOpenCourseScheduleSessionService extends CoreBaseService classIdMap = Optional.ofNullable(teacherOpenCourseScheduleSessionClassDao.getValuesByQuery(classQuery)).orElseGet(Lists::emptyList) .stream().collect(toMap(TeacherOpenCourseScheduleSessionClass::getTeacherOpenCourseScheduleSessionClassId, sc -> sc)); // 一个教室ID对应一个或多个开课节次ID - options.getSessionClassList().forEach((sessionClassId ,sessionTagIdsList) -> { + // 为防止lambda里修改集合。 + CopyOnWriteArrayList finalDateTimes = new CopyOnWriteArrayList<>(dateTimes); + + // 班级和课次列表遍历 + options.getSessionClassList().forEach((sessionClassId , sessionTagIdsList) -> { // 断言,确保开课节次不为空 Assert.notEmpty(sessionTagIdsList, "开课节次列表不能为空!"); // 课次的标签ID @@ -334,6 +363,10 @@ public class TeacherOpenCourseScheduleSessionService extends CoreBaseService