liujc 2 éve
szülő
commit
783bb9274c

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleDao.java

@@ -2058,6 +2058,22 @@ public interface CourseScheduleDao extends BaseDAO<Long, CourseSchedule> {
     void updateLiveRemind(@Param("courseScheduleId") Long courseScheduleId, @Param("liveRemind") int liveRemind);
 
     /**
+     * 更新课程关联直播间编号
+     *
+     * @param courseScheduleIds 课程ID
+     * @param liveRoomId 直播间编号
+     */
+    void batchUpdateLiveRoomId(@Param("courseScheduleIds") List<Long> courseScheduleIds, @Param("liveRoomId") String liveRoomId);
+
+    /**
+     * 更新课程关联直播间编号
+     *
+     * @param courseScheduleIds 课程ID
+     * @param continuousCourse 连堂课状态
+     */
+    void batchUpdateContinuousCourse(@Param("courseScheduleIds") List<Long> courseScheduleIds, @Param("continuousCourse") Boolean continuousCourse);
+
+    /**
      * 获取下一次连堂课
      *
      * @param classGroupId 班级编号

+ 150 - 25
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleServiceImpl.java

@@ -66,6 +66,7 @@ import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 import static com.ym.mec.biz.dal.entity.CourseSchedule.CourseScheduleType.MUSIC_NETWORK;
@@ -5973,12 +5974,10 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		if (courseSchedule.getTeachMode() == TeachModeEnum.OFFLINE) {
 			throw new BizException("请前往线下教室");
 		}
-
-		List<CourseScheduleWrapper.CourseScheduleTime> courseScheduleTimes = Lists.newArrayList();
-		courseScheduleTimes.add(CourseScheduleWrapper.CourseScheduleTime.builder()
-				.startTime(getDateTime(courseSchedule.getClassDate(), courseSchedule.getStartClassTime()).getMillis())
-				.endTime(getDateTime(courseSchedule.getClassDate(), courseSchedule.getEndClassTime()).getMillis())
-				.build());
+		// 课程开始时间
+		courseSchedule.setStartClassTime(getDateTime(courseSchedule.getClassDate(), courseSchedule.getStartClassTime()).toDate());
+		// 课程结束时间
+		courseSchedule.setEndClassTime(getDateTime(courseSchedule.getClassDate(), courseSchedule.getEndClassTime()).toDate());
 
 		// 是否是连堂课
 		String continueCourseTime = sysTenantConfigService.getTenantConfigValue(SysConfigService.ONLINE_CONTINUE_COURSE_TIME, courseSchedule.getTenantId());
@@ -5987,34 +5986,127 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 		}
 
 		// 连堂课标准:同一个老师,同一天,同一课程组,连续上课
+		List<CourseSchedule> continuousCourse = courseScheduleDao.getTeacherContinuousCourse(courseSchedule.getClassGroupId(),
+				courseSchedule.getClassDate(), courseSchedule.getActualTeacherId());
+		for (CourseSchedule item : continuousCourse) {
+			// 设置开始时间
+			item.setStartClassTime(getDateTime(item.getClassDate(), item.getStartClassTime()).toDate());
+			// 设置结束时间
+			item.setEndClassTime(getDateTime(item.getClassDate(), item.getEndClassTime()).toDate());
+		}
+
+		// 课程按开始时间排序
+		continuousCourse = continuousCourse.stream()
+				.sorted(Comparator.comparing(CourseSchedule::getStartClassTime))
+				.collect(Collectors.toList());
+
+		// 以当前课程为分界线,分为两个集合
+		List<CourseSchedule> beforeCourse = Lists.newArrayList();
+		List<CourseSchedule> afterCourse = Lists.newArrayList();
+
+		CourseSchedule schedule;
+		for (CourseSchedule item : continuousCourse) {
+			if (item.getId().longValue() == courseSchedule.getId()) {
+				continue;
+			}
 
+			schedule = JSON.parseObject(JSON.toJSONString(item), CourseSchedule.class);
+			if (item.getEndClassTime().getTime() <= courseSchedule.getStartClassTime().getTime()) {
+				beforeCourse.add(schedule);
+			}
 
+			if (courseSchedule.getEndClassTime().getTime() <= item.getStartClassTime().getTime()) {
+				afterCourse.add(schedule);
+			}
+		}
 
-		CourseSchedule schedule = courseSchedule;
-		// 如果当前课程是连堂课,那么获取第一节课的课程编号
-		while (true) {
-			String classDate = DateUtil.format(schedule.getClassDate(), DateUtil.DEFAULT_PATTERN);
-			String startClassTime = DateUtil.format(schedule.getStartClassTime(), DateUtil.EXPANDED_TIME_FORMAT);
-			schedule = courseScheduleDao.getFirstCourse(schedule.getClassGroupId(), classDate + " " + startClassTime, schedule.getActualTeacherId(), continueCourseTime);
-			if (schedule != null) {
-				courseScheduleTimes.add(CourseScheduleWrapper.CourseScheduleTime.builder()
-						.startTime(getDateTime(schedule.getClassDate(), schedule.getStartClassTime()).getMillis())
-						.endTime(getDateTime(schedule.getClassDate(), schedule.getEndClassTime()).getMillis())
-						.build());
-			} else {
-				break;
+		// 当前课程之前连堂课
+		beforeCourse.add(JSON.parseObject(JSON.toJSONString(courseSchedule), CourseSchedule.class));
+		// 当前课程之后连堂课
+		afterCourse.add(0, JSON.parseObject(JSON.toJSONString(courseSchedule), CourseSchedule.class));
+
+		// 课程前连堂状态
+		updateContinuousCourseStatus(continueCourseTime, beforeCourse);
+
+		List<CourseSchedule> newCourseSchedules = Lists.newArrayList();
+		// 课程连堂状态
+		if (beforeCourse.get(beforeCourse.size() - 1).getContinuousCourse()) {
+			List<CourseSchedule> collect = beforeCourse.stream()
+					.filter(CourseSchedule::getContinuousCourse)
+					.collect(Collectors.toList());
+			if (CollectionUtils.isNotEmpty(collect)) {
+				newCourseSchedules.addAll(collect);
 			}
 		}
 
-		if (courseScheduleTimes.size() <= 1) {
+		// 课程后连堂状态
+		updateContinuousCourseStatus(continueCourseTime, afterCourse);
+		if (afterCourse.get(0).getContinuousCourse()) {
+			List<CourseSchedule> collect = afterCourse.stream()
+					.filter(CourseSchedule::getContinuousCourse)
+					.collect(Collectors.toList());
+			if (CollectionUtils.isNotEmpty(collect)) {
 
-			// 定时任务更新课程状态为进行中,判断当前课程状态是否匹配
-			if (CourseStatusEnum.NOT_START == courseSchedule.getStatus()) {
-				throw new BizException("直播课暂未开启,请稍后重试");
+				if (CollectionUtils.isEmpty(newCourseSchedules)) {
+					newCourseSchedules.addAll(collect);
+				} else {
+					newCourseSchedules.addAll(collect.subList(1, collect.size()));
+				}
 			}
-			if (CourseStatusEnum.OVER == courseSchedule.getStatus()) {
-				throw new BizException("直播课已结束");
+		}
+
+		List<CourseScheduleWrapper.CourseScheduleTime> courseScheduleTimes = Lists.newArrayList();
+		if (CollectionUtils.isNotEmpty(newCourseSchedules)) {
+
+			// 连党课程信息
+			for (CourseSchedule item : newCourseSchedules) {
+				courseScheduleTimes.add(CourseScheduleWrapper.CourseScheduleTime.builder()
+						.startTime(item.getStartClassTime().getTime())
+						.endTime(item.getEndClassTime().getTime())
+						.build());
 			}
+
+			// 获取连堂课第一节信息
+			courseSchedule = newCourseSchedules.get(0);
+
+			CourseSchedule finalCourseSchedule = courseSchedule;
+			CompletableFuture.runAsync(() -> {
+
+				List<Long> collect = newCourseSchedules.stream()
+						.map(CourseSchedule::getId)
+						.distinct().collect(Collectors.toList());
+				try {
+
+					// 关联直播间编号
+					courseScheduleDao.batchUpdateLiveRoomId(collect, finalCourseSchedule.getLiveRoomId());
+
+					collect = newCourseSchedules.subList(0, newCourseSchedules.size() - 1).stream()
+							.map(CourseSchedule::getId)
+							.distinct().collect(Collectors.toList());
+					// 更新连堂课状态
+					courseScheduleDao.batchUpdateContinuousCourse(collect, true);
+
+				} catch (Exception e) {
+				    log.error("getLiveCourseScheduleTime courseScheduleIds={}", collect, e);
+				}
+
+			});
+
+		} else {
+
+			// 当前课程信息
+			courseScheduleTimes.add(CourseScheduleWrapper.CourseScheduleTime.builder()
+					.startTime(courseSchedule.getStartClassTime().getTime())
+					.endTime(courseSchedule.getEndClassTime().getTime())
+					.build());
+		}
+
+		// 定时任务更新课程状态为进行中,判断当前课程状态是否匹配
+		if (CourseStatusEnum.NOT_START == courseSchedule.getStatus()) {
+			throw new BizException("直播课暂未开启,请稍后重试");
+		}
+		if (CourseStatusEnum.OVER == courseSchedule.getStatus()) {
+			throw new BizException("直播课已结束");
 		}
 
 		// 直播间配置
@@ -6041,6 +6133,39 @@ public class CourseScheduleServiceImpl extends BaseServiceImpl<Long, CourseSched
 	}
 
 	/**
+	 * 更新当前课程连堂状态
+	 * @param continueCourseTime 连堂时间间隔
+	 * @param continuousCourse 连堂课程
+	 */
+	private void updateContinuousCourseStatus(String continueCourseTime, List<CourseSchedule> continuousCourse) {
+
+		// continuousCourse对象相邻两个时间比较,如果时间间隔小于5分钟,那么合并为连堂课
+		DateTime startTime;
+		DateTime endTime;
+		for (int i = 0; i < continuousCourse.size(); i++) {
+			CourseSchedule current = continuousCourse.get(i);
+			CourseSchedule next = null;
+			if (i + 1 < continuousCourse.size()) {
+				next = continuousCourse.get(i + 1);
+			}
+			if (next != null) {
+
+				startTime = getDateTime(current.getClassDate(), current.getEndClassTime());
+				endTime = getDateTime(next.getClassDate(), next.getStartClassTime());
+				// 如果当前课程结束时间和下一节课开始时间间隔小于5分钟,那么合并时间
+				if (startTime.isBefore(endTime)
+						&& startTime.plusMinutes(Integer.parseInt(continueCourseTime) + 1).isAfter(endTime)) {
+					// 上节连堂状态
+					current.setContinuousCourse(true);
+					// 下节连堂状态
+					next.setContinuousCourse(true);
+				}
+			}
+		}
+
+	}
+
+	/**
 	 * 课程开始时间
 	 * @param day 开始天
 	 * @param time 开始时间

+ 7 - 1
mec-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -4380,11 +4380,17 @@
     <update id="updateLiveRemind">
         update course_schedule set live_remind_ = #{liveRemind} where id_ = #{courseScheduleId}
     </update>
+    <update id="batchUpdateLiveRoomId">
+        update course_schedule set live_room_id_ = #{liveRoomId} where id_ IN (<foreach collection="courseScheduleIds" separator="," item="item">#{item}</foreach>)
+    </update>
+    <update id="batchUpdateContinuousCourse">
+        update course_schedule set continuous_course_ = #{continuousCourse} where id_ IN (<foreach collection="courseScheduleIds" separator="," item="item">#{item}</foreach>)
+    </update>
 
     <select id="getTeacherContinuousCourse" resultMap="CourseSchedule">
         SELECT <include refid="resultSql"/> FROM course_schedule cs
         WHERE cs.class_group_id_ = #{classGroupId}
-        AND cs.actual_teacher_id_ = #{teacherId} AND cs.pre_course_flag_ = 0
+        AND cs.actual_teacher_id_ = #{teacherId} AND cs.pre_course_flag_ = 0 AND cs.class_date_ = #{classDate}
         ORDER BY cs.class_date_ DESC,cs.end_class_time_ DESC
     </select>
 </mapper>