|
@@ -1,26 +1,25 @@
|
|
|
package com.yonge.cooleshow.biz.dal.service.impl;
|
|
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
|
|
|
import com.yonge.cooleshow.auth.api.entity.SysUser;
|
|
|
-import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
|
|
|
-import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
|
|
|
-import com.yonge.cooleshow.common.constant.SysConfigConstant;
|
|
|
import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
|
|
|
-import com.yonge.cooleshow.biz.dal.entity.CourseCalendarEntity;
|
|
|
-import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
|
|
|
-import com.yonge.cooleshow.biz.dal.entity.CourseTimeEntity;
|
|
|
-import com.yonge.cooleshow.biz.dal.entity.HolidaysFestivals;
|
|
|
+import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
|
|
|
+import com.yonge.cooleshow.biz.dal.entity.*;
|
|
|
import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
|
|
|
import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
|
|
|
import com.yonge.cooleshow.biz.dal.service.HolidaysFestivalsService;
|
|
|
import com.yonge.cooleshow.biz.dal.service.SysConfigService;
|
|
|
+import com.yonge.cooleshow.biz.dal.service.TeacherFreeTimeService;
|
|
|
import com.yonge.cooleshow.biz.dal.support.PageUtil;
|
|
|
import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
|
|
|
+import com.yonge.cooleshow.biz.dal.vo.MyCourseVo;
|
|
|
import com.yonge.cooleshow.biz.dal.vo.TeacherLiveCourseInfoVo;
|
|
|
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
|
|
|
import com.yonge.cooleshow.common.exception.BizException;
|
|
|
import com.yonge.cooleshow.common.page.PageInfo;
|
|
|
import com.yonge.toolset.utils.date.DateUtil;
|
|
@@ -37,6 +36,7 @@ import javax.validation.Valid;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.*;
|
|
|
+import java.util.function.BiConsumer;
|
|
|
import java.util.function.Function;
|
|
|
|
|
|
/**
|
|
@@ -57,6 +57,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
private HolidaysFestivalsService holidaysFestivalsService;
|
|
|
@Autowired
|
|
|
private SysConfigService sysConfigService;
|
|
|
+ @Autowired
|
|
|
+ private TeacherFreeTimeService teacherFreeTimeService;
|
|
|
|
|
|
@Override
|
|
|
public CourseScheduleDao getDao() {
|
|
@@ -108,7 +110,12 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
//获取日期-目前上课没有跨天情况
|
|
|
String ymd = DateUtil.format(startTime, DateUtil.DEFAULT_PATTERN);
|
|
|
//查询大于当前时间并未开始的课程
|
|
|
- List<CourseSchedule> list = baseMapper.queryStudentCourse(studentId, ymd);
|
|
|
+ Map<String, Object> param = new HashMap<>();
|
|
|
+ param.put("studentId", studentId);
|
|
|
+ param.put("greaterDate", new Date());
|
|
|
+ param.put("classDate", ymd);
|
|
|
+ param.put("status", CourseScheduleEnum.NOT_START.getCode());
|
|
|
+ List<CourseSchedule> list = baseMapper.queryStudentCourse(param);
|
|
|
return checkCourseTime(list, CourseSchedule::getStartTime, CourseSchedule::getEndTime, startTime, endTime);
|
|
|
}
|
|
|
|
|
@@ -155,8 +162,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
* @param endTime 新增课程结束时间
|
|
|
* @return true 有交集 false 没有交集
|
|
|
*/
|
|
|
- public <T> boolean checkCourseTime(List<T> list, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun,
|
|
|
- Date startTime, Date endTime) {
|
|
|
+ public <T> boolean checkCourseTime(List<T> list, Function<T, Date> startTimeFun, Function<T, Date> endTimeFun, Date startTime, Date endTime) {
|
|
|
WrapperUtil.checkObj(startTime, "开始时间不能为空!");
|
|
|
WrapperUtil.checkObj(endTime, "结束时间不能为空!");
|
|
|
// 如果没有课程,直接返回false
|
|
@@ -241,12 +247,25 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
LocalDate lastDay = firstDay.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
//获取老师的课程 key:日期-年月日 value:课程时间-开始时间,结束时间
|
|
|
Map<String, List<CourseTimeEntity>> nowCourseMap = getTeacherCourseTime(teacherId, firstDay.toString(), lastDay.toString());
|
|
|
- //储存节假日数据,避免重复查询
|
|
|
- Map<Integer, List<String>> holidayMap = new HashMap<>();
|
|
|
//生成日历数据
|
|
|
List<CourseCalendarEntity> courseCalendarEntities = generateCourseData(firstDay, lastDay, singleCourseMinutes);
|
|
|
+ //对比课程数据,筛选出空余的课程时间
|
|
|
+ opsCourseCalendarData(nowCourseMap, courseCalendarEntities, 0);
|
|
|
+ return courseCalendarEntities;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对比课程数据,筛选出空余的课程时间
|
|
|
+ *
|
|
|
+ * @param nowCourseMap 现有课程
|
|
|
+ * @param courseCalendarEntities 课程时间日历
|
|
|
+ * @param skipHoliday 是否跳过节假日 0:不跳过 1跳过
|
|
|
+ */
|
|
|
+ private void opsCourseCalendarData(Map<String, List<CourseTimeEntity>> nowCourseMap, List<CourseCalendarEntity> courseCalendarEntities, Integer skipHoliday) {
|
|
|
+ //储存节假日数据,避免重复查询
|
|
|
+ Map<Integer, List<String>> holidayMap = new HashMap<>();
|
|
|
courseCalendarEntities.forEach(calendarEntity -> {
|
|
|
- //获取课程数据,并剔除交集时间段数据,
|
|
|
+ //获取课程数据,并剔除交集时间段数据
|
|
|
List<CourseTimeEntity> nowCourse = nowCourseMap.get(calendarEntity.getDate());
|
|
|
if (CollectionUtils.isEmpty(nowCourse)) {
|
|
|
//当日没课
|
|
@@ -280,9 +299,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
});
|
|
|
//是否是节假日 0:不是 1是
|
|
|
calendarEntity.setHoliday(holiday.contains(calendarEntity.getDate()) ? 1 : 0);
|
|
|
+ calendarEntity.setSkipHoliday(skipHoliday);//直播课日历只展示节假日 不跳过节假日
|
|
|
});
|
|
|
-
|
|
|
- return courseCalendarEntities;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -300,23 +318,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
.ge(CourseSchedule::getClassDate, startDate)
|
|
|
.le(CourseSchedule::getClassDate, endDate)
|
|
|
);
|
|
|
- //老师课程 key:日期-年月日 value:课程
|
|
|
- Map<String, List<CourseTimeEntity>> nowCourse = new HashMap<>();
|
|
|
- if (CollectionUtils.isNotEmpty(courseList)) {
|
|
|
- WrapperUtil.groupList(courseList, CourseSchedule::getClassDate)
|
|
|
- .forEach((k, v) -> {
|
|
|
- List<CourseTimeEntity> value = new ArrayList<>();
|
|
|
- v.forEach(course -> {
|
|
|
- CourseTimeEntity courseTimeEntity = new CourseTimeEntity();
|
|
|
- courseTimeEntity.setStartTime(course.getStartTime());
|
|
|
- courseTimeEntity.setEndTime(course.getEndTime());
|
|
|
- value.add(courseTimeEntity);
|
|
|
- });
|
|
|
- nowCourse.put(DateUtil.dateToString(k), value);
|
|
|
- }
|
|
|
- );
|
|
|
- }
|
|
|
- return nowCourse;
|
|
|
+ return getCourseListMap(courseList);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -348,14 +350,8 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
List<CourseTimeEntity> times = new ArrayList<>();
|
|
|
//获取当前日期
|
|
|
entity.setDate(firstDay.toString());
|
|
|
- int finalAddDay = addDay;
|
|
|
- dayTime.forEach(time -> {
|
|
|
- CourseTimeEntity courseTimeEntity = new CourseTimeEntity();
|
|
|
- courseTimeEntity.setStartTime(DateUtil.addDays(time.getStartTime(), finalAddDay));
|
|
|
- courseTimeEntity.setEndTime(DateUtil.addDays(time.getEndTime(), finalAddDay));
|
|
|
- times.add(courseTimeEntity);
|
|
|
- });
|
|
|
- entity.courseTime(times);
|
|
|
+ //将每日上课时间时间添加到日历中
|
|
|
+ opsCourseDayTime(addDay, entity, times, dayTime);
|
|
|
list.add(entity);
|
|
|
firstDay = firstDay.plusDays(1L);
|
|
|
addDay++;
|
|
@@ -411,18 +407,168 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 生成陪练课日历
|
|
|
+ * 生成陪练课日历-用于学生购买指定老师陪练课
|
|
|
+ *
|
|
|
+ * @param param 传入参数
|
|
|
+ * <p> - teacherId 老师id
|
|
|
+ * <p> - studentId 学生id
|
|
|
+ * <p> - year 年
|
|
|
+ * <p> - month 月
|
|
|
+ * <p> - day 日
|
|
|
+ * @return 返回传入时间当月每日的剩余时间段
|
|
|
*/
|
|
|
- public void generatePracticeCourseCalender() {
|
|
|
- //todo 注意:如果是陪练课的日历需要查询老师设置的陪练课时间有哪些,不能直接根据时间段来
|
|
|
- //获取周 int value = calendarDay.getDayOfWeek().getValue();
|
|
|
+ public List<CourseCalendarEntity> createPracticeCourseCalender(Map<String, Object> param) {
|
|
|
+ //校验数据
|
|
|
+ Long teacherId = WrapperUtil.toLong(param, "teacherId", "老师id不能为空!");
|
|
|
+ Long studentId = WrapperUtil.toLong(param, "teacherId", "学生id不能为空!");
|
|
|
+ Integer year = WrapperUtil.toInt(param, "year", "日历的时间年份不能为空!");
|
|
|
+ Integer month = WrapperUtil.toInt(param, "month", "日历的时间月份不能为空!");
|
|
|
+ Integer day = WrapperUtil.toInt(param, "month", "日历的时间日期不能为空!");
|
|
|
+
|
|
|
+ //传入的日期+1天开始
|
|
|
+ LocalDate firstDay = LocalDate.of(year, month, day).plusDays(1L);
|
|
|
+ //根据firstDay计算出该月的最后一天
|
|
|
+ LocalDate lastDay = firstDay.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
+ //查询老师陪练课设置
|
|
|
+ TeacherFreeTime teacherTime = teacherFreeTimeService.getOne(Wrappers.<TeacherFreeTime>lambdaQuery()
|
|
|
+ .eq(TeacherFreeTime::getDefaultFlag, true)
|
|
|
+ .eq(TeacherFreeTime::getTeacherId, teacherId)
|
|
|
+ );
|
|
|
+ Optional.ofNullable(teacherTime).orElseThrow(() -> new BizException("未查询到老师陪练课设置!"));
|
|
|
+ //根据老师设置的陪练课时间生成当月日历
|
|
|
+ List<CourseCalendarEntity> courseCalendarEntities = generatePracticeCalendar(teacherTime, firstDay, lastDay);
|
|
|
+ //查询老师及当前学生的课时
|
|
|
+ Map<String, List<CourseTimeEntity>> nowCourseMap = getAllPracticeCourseTime(teacherId, studentId, firstDay.toString(), lastDay.toString());
|
|
|
+ //和生成的日历对比,筛选出空余的课程时间
|
|
|
+ opsCourseCalendarData(nowCourseMap, courseCalendarEntities, teacherTime.getSkipHolidayFlag() ? 1 : 0);
|
|
|
+ return courseCalendarEntities;
|
|
|
}
|
|
|
|
|
|
- private SysUser getSysUser() {
|
|
|
- return Optional.ofNullable(sysUserFeignService.queryUserInfo())
|
|
|
- .orElseThrow(() -> new BizException("用户不存在"));
|
|
|
+ /**
|
|
|
+ * 生成老师陪练课日历
|
|
|
+ * <p>陪练课的日历需要查询老师设置的陪练课时间,根据设置的时间来生成日历
|
|
|
+ */
|
|
|
+ private List<CourseCalendarEntity> generatePracticeCalendar(TeacherFreeTime teacherTime, LocalDate firstDay, LocalDate lastDay) {
|
|
|
+ //将老师设置的陪练课时间结构化 key::数字周几 1~7 value:具体的时间 开始时间-结束时间
|
|
|
+ Map<Integer, List<CourseTimeEntity>> teacherPracticeTime = getTeacherPracticeTime(teacherTime);
|
|
|
+ //每日日期数据
|
|
|
+ List<CourseCalendarEntity> list = new ArrayList<>();
|
|
|
+ //添加的天数
|
|
|
+ int addDay = 0;
|
|
|
+ //获取每日日期数据
|
|
|
+ while (firstDay.isBefore(lastDay) || firstDay.isEqual(lastDay)) {
|
|
|
+ CourseCalendarEntity entity = new CourseCalendarEntity();
|
|
|
+ List<CourseTimeEntity> times = new ArrayList<>();
|
|
|
+ //获取当前日期
|
|
|
+ entity.setDate(firstDay.toString());
|
|
|
+ //获取当前日期周几
|
|
|
+ int weekNum = firstDay.getDayOfWeek().getValue();
|
|
|
+ List<CourseTimeEntity> timeEntities = teacherPracticeTime.get(weekNum);
|
|
|
+ if (CollectionUtils.isNotEmpty(timeEntities)) {
|
|
|
+ //将每日上课时间时间添加到日历中
|
|
|
+ opsCourseDayTime(addDay, entity, times, timeEntities);
|
|
|
+ }
|
|
|
+ list.add(entity);
|
|
|
+ firstDay = firstDay.plusDays(1L);
|
|
|
+ addDay++;
|
|
|
+ }
|
|
|
+ return list;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 将每日上课时间时间添加到日历中
|
|
|
+ *
|
|
|
+ * @param addDay 添加的天数
|
|
|
+ * @param entity 实体数据
|
|
|
+ * @param times 课程数据集合
|
|
|
+ * @param timeEntities 每日上课时间集合
|
|
|
+ */
|
|
|
+ private void opsCourseDayTime(int addDay, CourseCalendarEntity entity, List<CourseTimeEntity> times, List<CourseTimeEntity> timeEntities) {
|
|
|
+ timeEntities.forEach(time -> {
|
|
|
+ CourseTimeEntity courseTimeEntity = new CourseTimeEntity();
|
|
|
+ courseTimeEntity.setStartTime(DateUtil.addDays(time.getStartTime(), addDay));
|
|
|
+ courseTimeEntity.setEndTime(DateUtil.addDays(time.getEndTime(), addDay));
|
|
|
+ times.add(courseTimeEntity);
|
|
|
+ });
|
|
|
+ entity.setCourseTime(times);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 将老师设置的陪练课时间结构化
|
|
|
+ *
|
|
|
+ * @return key::数字周几 1~7 value:具体的时间 开始时间-结束时间
|
|
|
+ */
|
|
|
+ private Map<Integer, List<CourseTimeEntity>> getTeacherPracticeTime(TeacherFreeTime teacherTime) {
|
|
|
+ Map<Integer, List<CourseTimeEntity>> teacherPracticeTime = new HashMap<>();
|
|
|
+ //将老师设置的陪练课时间放入map中
|
|
|
+ BiConsumer<String, Integer> timeCon = (timeStr, weekNum) -> {
|
|
|
+ if (StringUtils.isBlank(timeStr)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<CourseTimeEntity> timeEntityList = new ArrayList<>(JSONObject.parseArray(timeStr, CourseTimeEntity.class));
|
|
|
+ teacherPracticeTime.put(weekNum, timeEntityList);
|
|
|
+ };
|
|
|
+ timeCon.accept(teacherTime.getMonday(), 1);
|
|
|
+ timeCon.accept(teacherTime.getTuesday(), 2);
|
|
|
+ timeCon.accept(teacherTime.getWednesday(), 3);
|
|
|
+ timeCon.accept(teacherTime.getThursday(), 4);
|
|
|
+ timeCon.accept(teacherTime.getFriday(), 5);
|
|
|
+ timeCon.accept(teacherTime.getSaturday(), 6);
|
|
|
+ timeCon.accept(teacherTime.getSunday(), 7);
|
|
|
+ return teacherPracticeTime;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询老师及当前学生的课时
|
|
|
+ *
|
|
|
+ * @param teacherId 老师id
|
|
|
+ * @param studentId 学员id
|
|
|
+ */
|
|
|
+ private Map<String, List<CourseTimeEntity>> getAllPracticeCourseTime(Long teacherId, Long studentId, String startDate, String endDate) {
|
|
|
+ //查询该老师指定时间段的课程
|
|
|
+ List<CourseSchedule> courseList = this.list(Wrappers.<CourseSchedule>lambdaQuery()
|
|
|
+ .eq(CourseSchedule::getTeacherId, teacherId)
|
|
|
+ .ge(CourseSchedule::getClassDate, startDate)
|
|
|
+ .le(CourseSchedule::getClassDate, endDate)
|
|
|
+ );
|
|
|
+ if (CollectionUtils.isEmpty(courseList)) {
|
|
|
+ courseList = new ArrayList<>();
|
|
|
+ }
|
|
|
+ //查询学生的课程
|
|
|
+ Map<String, Object> param = new HashMap<>();
|
|
|
+ param.put("studentId", studentId);
|
|
|
+ param.put("startClassDate", startDate);
|
|
|
+ param.put("endClassDate", endDate);
|
|
|
+ List<CourseSchedule> studentCourse = baseMapper.queryStudentCourse(param);
|
|
|
+ //将数据合并
|
|
|
+ if (CollectionUtils.isNotEmpty(studentCourse)) {
|
|
|
+ courseList.addAll(studentCourse);
|
|
|
+ }
|
|
|
+ return getCourseListMap(courseList);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, List<CourseTimeEntity>> getCourseListMap(List<CourseSchedule> courseList) {
|
|
|
+ //key:课程日期-年月日 value:课程
|
|
|
+ Map<String, List<CourseTimeEntity>> nowCourse = new HashMap<>();
|
|
|
+ if (CollectionUtils.isNotEmpty(courseList)) {
|
|
|
+ WrapperUtil.groupList(courseList, CourseSchedule::getClassDate)
|
|
|
+ .forEach((k, v) -> {
|
|
|
+ List<CourseTimeEntity> value = new ArrayList<>();
|
|
|
+ v.forEach(course -> {
|
|
|
+ CourseTimeEntity courseTimeEntity = new CourseTimeEntity();
|
|
|
+ courseTimeEntity.setStartTime(course.getStartTime());
|
|
|
+ courseTimeEntity.setEndTime(course.getEndTime());
|
|
|
+ value.add(courseTimeEntity);
|
|
|
+ });
|
|
|
+ nowCourse.put(DateUtil.dateToString(k), value);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return nowCourse;
|
|
|
+ }
|
|
|
+
|
|
|
+ private SysUser getSysUser() {
|
|
|
+ return Optional.ofNullable(sysUserFeignService.queryUserInfo()).orElseThrow(() -> new BizException("用户不存在"));
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* @Description: 老师端-首页-我的课程-陪练课
|