|  | @@ -1,5 +1,35 @@
 | 
	
		
			
				|  |  |  package com.yonge.cooleshow.biz.dal.service.impl;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.COOLESHOW;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.LIVE_ROOM_HEART_BEAT;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.LIVE_ROOM_INFO;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.LIVE_ROOM_LIKE;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.LIVE_ROOM_ONLINE_USER_LIST;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.LIVE_ROOM_TOTAL_USER_LIST;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.LIVE_USER_LAST_CLIENT_IP;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.LIVE_USER_LAST_TIME;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.LIVE_USER_ROOM;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.ROOM_UID;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.TEACHER_TEMP_LIVE_ROOM;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.USER_ID;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.common.constant.SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE;
 | 
	
		
			
				|  |  | +import static com.yonge.cooleshow.common.constant.SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import java.time.LocalDate;
 | 
	
		
			
				|  |  | +import java.util.Collections;
 | 
	
		
			
				|  |  | +import java.util.Date;
 | 
	
		
			
				|  |  | +import java.util.HashMap;
 | 
	
		
			
				|  |  | +import java.util.List;
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.Objects;
 | 
	
		
			
				|  |  | +import java.util.Optional;
 | 
	
		
			
				|  |  | +import java.util.concurrent.TimeUnit;
 | 
	
		
			
				|  |  | +import java.util.function.BiFunction;
 | 
	
		
			
				|  |  | +import java.util.function.BiPredicate;
 | 
	
		
			
				|  |  | +import java.util.function.Consumer;
 | 
	
		
			
				|  |  | +import java.util.function.Function;
 | 
	
		
			
				|  |  | +import java.util.stream.Collectors;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  import com.alibaba.fastjson.JSONObject;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
	
	
		
			
				|  | @@ -14,6 +44,7 @@ import com.yonge.cooleshow.biz.dal.service.*;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.support.IMHelper;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 | 
	
		
			
				|  |  |  import com.yonge.toolset.base.exception.BizException;
 | 
	
		
			
				|  |  |  import com.yonge.toolset.base.page.PageInfo;
 | 
	
		
			
				|  |  |  import com.yonge.toolset.mybatis.support.PageUtil;
 | 
	
	
		
			
				|  | @@ -30,18 +61,50 @@ import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import java.time.LocalDate;
 | 
	
		
			
				|  |  | -import java.util.*;
 | 
	
		
			
				|  |  | -import java.util.concurrent.TimeUnit;
 | 
	
		
			
				|  |  | -import java.util.function.BiFunction;
 | 
	
		
			
				|  |  | -import java.util.function.BiPredicate;
 | 
	
		
			
				|  |  | -import java.util.function.Consumer;
 | 
	
		
			
				|  |  | -import java.util.function.Function;
 | 
	
		
			
				|  |  | -import java.util.stream.Collectors;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import static com.yonge.cooleshow.biz.dal.constant.LiveRoomConstant.*;
 | 
	
		
			
				|  |  | -import static com.yonge.cooleshow.common.constant.SysConfigConstant.DESTROY_EXPIRED_LIVE_ROOM_MINUTE;
 | 
	
		
			
				|  |  | -import static com.yonge.cooleshow.common.constant.SysConfigConstant.PRE_CREATE_LIVE_ROOM_MINUTE;
 | 
	
		
			
				|  |  | +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.dao.LiveRoomDao;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.CourseScheduleStudentPayment;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.CourseScheduleTeacherSalary;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.IMApiResultInfo;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.ImRoomMessage;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.ImUserStateSync;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.LiveRoom;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.RoomInfoCache;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.RoomUserInfoCache;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.StudentAttendance;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.TeacherAttendance;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.enums.RoomTypeEnum;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.enums.TeacherSalaryEnum;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.CourseGroupService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.CourseScheduleStudentPaymentService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.CourseScheduleTeacherSalaryService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.LiveRoomService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.StudentAttendanceService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.TeacherAttendanceService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.UserOrderService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.support.IMHelper;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.vo.TeacherLivingInfoVo;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
 | 
	
		
			
				|  |  | +import com.yonge.toolset.base.exception.BizException;
 | 
	
		
			
				|  |  | +import com.yonge.toolset.base.page.PageInfo;
 | 
	
		
			
				|  |  | +import com.yonge.toolset.mybatis.support.PageUtil;
 | 
	
		
			
				|  |  | +import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 | 
	
		
			
				|  |  | +import com.yonge.toolset.utils.date.DateUtil;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * 直播房间与课程的关系表表(LiveRoom)表服务实现类
 | 
	
	
		
			
				|  | @@ -78,6 +141,8 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 | 
	
		
			
				|  |  |      @Autowired
 | 
	
		
			
				|  |  |      private SysMessageService sysMessageService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private LiveBroadcastRoomMemberService liveBroadcastRoomMemberService;
 | 
	
		
			
				|  |  |      /**
 | 
	
		
			
				|  |  |       * 生成房间UID
 | 
	
		
			
				|  |  |       *
 | 
	
	
		
			
				|  | @@ -274,6 +339,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 | 
	
		
			
				|  |  |          String roomTitle = WrapperUtil.toStr(param, "roomTitle", "房间标题不能为空!");
 | 
	
		
			
				|  |  |          String liveRemark = WrapperUtil.toStr(param, "liveRemark", "直播间描述不能为空!");
 | 
	
		
			
				|  |  |          Integer liveTime = WrapperUtil.toInt(param, "liveTime", "请选择直播时长!");
 | 
	
		
			
				|  |  | +        String coverPic = WrapperUtil.toStr(param, "coverPic", "直播封面图不能为空!");
 | 
	
		
			
				|  |  |          if (roomTitle.length() > 20) {
 | 
	
		
			
				|  |  |              throw new BizException("直播标题不能超出20个字");
 | 
	
		
			
				|  |  |          }
 | 
	
	
		
			
				|  | @@ -301,6 +367,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 | 
	
		
			
				|  |  |          room.setCreatedBy(teacherId);
 | 
	
		
			
				|  |  |          room.setCreatedTime(liveStartTime);
 | 
	
		
			
				|  |  |          room.setType(en.getCode());
 | 
	
		
			
				|  |  | +        room.setCoverPic(coverPic);
 | 
	
		
			
				|  |  |          this.save(room);
 | 
	
		
			
				|  |  |          log.info("createTempLiveRoom>>>>>>room:{}", room.getRoomUid());
 | 
	
		
			
				|  |  |          //去融云创建房间及创建房间缓存信息
 | 
	
	
		
			
				|  | @@ -452,6 +519,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          //修改房间状态
 | 
	
		
			
				|  |  |          room.setLiveState(2);
 | 
	
		
			
				|  |  | +        // room.setRoomState(1);
 | 
	
		
			
				|  |  |          this.updateById(room);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          String speakerIdStr = room.getSpeakerId().toString();
 | 
	
	
		
			
				|  | @@ -598,6 +666,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 | 
	
		
			
				|  |  |              if (!onlineUserInfo.isExists()) {
 | 
	
		
			
				|  |  |                  return;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +            liveBroadcastRoomMemberService.saveRecord(roomUid,userId, InOrOutEnum.OUT, YesOrNoEnum.NO);
 | 
	
		
			
				|  |  |              //从在线人员列表删除该人员
 | 
	
		
			
				|  |  |              onlineUserInfo.fastRemove(userId);
 | 
	
		
			
				|  |  |              //学员退出 写学生考勤表
 | 
	
	
		
			
				|  | @@ -726,6 +795,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 | 
	
		
			
				|  |  |          Date now = new Date();
 | 
	
		
			
				|  |  |          roomInfo.setSpeakerState(0);
 | 
	
		
			
				|  |  |          roomInfo.setJoinRoomTime(now);
 | 
	
		
			
				|  |  | +        liveBroadcastRoomMemberService.saveRecord(roomUid, roomInfo.getSpeakerId(), InOrOutEnum.IN, YesOrNoEnum.NO);
 | 
	
		
			
				|  |  |          //查询老师是否有进入过,没有则写老师考勤表的进入时间
 | 
	
		
			
				|  |  |          this.setTeacherAttendance(roomInfo.getSpeakerId(), roomInfo.getCourseGroupId(), roomInfo.getCourseId());
 | 
	
		
			
				|  |  |          //记录当前用户对应的房间uid
 | 
	
	
		
			
				|  | @@ -751,6 +821,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 | 
	
		
			
				|  |  |          RMap<Long, String> roomTotalUser = this.getTotalUserCache(roomUid);
 | 
	
		
			
				|  |  |          //判断是否第一次进房间
 | 
	
		
			
				|  |  |          RoomUserInfoCache userInfo;
 | 
	
		
			
				|  |  | +        liveBroadcastRoomMemberService.saveRecord(roomUid,userId, InOrOutEnum.IN, YesOrNoEnum.YES);
 | 
	
		
			
				|  |  |          if (roomTotalUser.containsKey(userId)) {
 | 
	
		
			
				|  |  |              //多次进入更新动态进入时间
 | 
	
		
			
				|  |  |              userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoCache.class);
 | 
	
	
		
			
				|  | @@ -786,7 +857,7 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 | 
	
		
			
				|  |  |          //校验房间是否存在
 | 
	
		
			
				|  |  |          RBucket<RoomInfoCache> roomInfoCache = this.getLiveRoomInfo(roomUid);
 | 
	
		
			
				|  |  |          if (!roomInfoCache.isExists()) {
 | 
	
		
			
				|  |  | -            throw new BizException("直播还未开始!");
 | 
	
		
			
				|  |  | +            throw new BizException("直播还未开始或已结束!");
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          RoomInfoCache roomInfo = roomInfoCache.get();
 | 
	
		
			
				|  |  |          //校验观看者是否买过课,如果是非临时直播间,则校验是否已经买过课
 | 
	
	
		
			
				|  | @@ -1069,5 +1140,22 @@ public class LiveRoomServiceImpl extends ServiceImpl<LiveRoomDao, LiveRoom> impl
 | 
	
		
			
				|  |  |      public LiveRoom getLiveInRoomBySpeakerId(Long speakerId) {
 | 
	
		
			
				|  |  |          return baseMapper.getLiveInRoomBySpeakerId(speakerId);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Override
 | 
	
		
			
				|  |  | +	public List<TeacherLivingInfoVo> queryTeacherLivingList() {
 | 
	
		
			
				|  |  | +		return baseMapper.queryTeacherLivingList();
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public void whetherMic(String roomUid, Integer whetherMic) {
 | 
	
		
			
				|  |  | +        //校验房间是否存在
 | 
	
		
			
				|  |  | +        RBucket<RoomInfoCache> roomInfoCache = getLiveRoomInfo(roomUid);
 | 
	
		
			
				|  |  | +        if (!roomInfoCache.isExists()) {
 | 
	
		
			
				|  |  | +            log.error("teacherCheckRoomInfo>>>live not start  roomUid: {} ", roomUid);
 | 
	
		
			
				|  |  | +            throw new BizException("直播还未开始!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        RoomInfoCache roomInfo = roomInfoCache.get();
 | 
	
		
			
				|  |  | +        roomInfo.setWhether_mic(whetherMic);
 | 
	
		
			
				|  |  | +        roomInfoCache.set(roomInfo);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |