|  | @@ -6,7 +6,6 @@ import com.alibaba.fastjson.serializer.SerializerFeature;
 | 
											
												
													
														|  |  import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 |  |  import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
											
												
													
														|  |  import com.google.common.collect.Lists;
 |  |  import com.google.common.collect.Lists;
 | 
											
												
													
														|  |  import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
 |  |  import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
 | 
											
												
													
														|  | -import com.microsvc.toolkit.middleware.rtc.impl.TencentCloudRTCPlugin;
 |  | 
 | 
											
												
													
														|  |  import com.microsvc.toolkit.middleware.rtc.message.TencentRequest;
 |  |  import com.microsvc.toolkit.middleware.rtc.message.TencentRequest;
 | 
											
												
													
														|  |  import com.yonge.cooleshow.auth.api.entity.SysUser;
 |  |  import com.yonge.cooleshow.auth.api.entity.SysUser;
 | 
											
												
													
														|  |  import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
 |  |  import com.yonge.cooleshow.biz.dal.dao.ImNetworkRoomDao;
 | 
											
										
											
												
													
														|  | @@ -31,6 +30,7 @@ import org.springframework.beans.BeanUtils;
 | 
											
												
													
														|  |  import org.springframework.data.redis.core.RedisTemplate;
 |  |  import org.springframework.data.redis.core.RedisTemplate;
 | 
											
												
													
														|  |  import org.springframework.stereotype.Service;
 |  |  import org.springframework.stereotype.Service;
 | 
											
												
													
														|  |  import org.springframework.transaction.annotation.Transactional;
 |  |  import org.springframework.transaction.annotation.Transactional;
 | 
											
												
													
														|  | 
 |  | +import org.springframework.transaction.support.TransactionTemplate;
 | 
											
												
													
														|  |  import org.springframework.util.CollectionUtils;
 |  |  import org.springframework.util.CollectionUtils;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  import javax.annotation.Resource;
 |  |  import javax.annotation.Resource;
 | 
											
										
											
												
													
														|  | @@ -83,6 +83,8 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 | 
											
												
													
														|  |      private ImNetworkRoomMemberStatusService imNetworkRoomMemberStatusService;
 |  |      private ImNetworkRoomMemberStatusService imNetworkRoomMemberStatusService;
 | 
											
												
													
														|  |      @Resource
 |  |      @Resource
 | 
											
												
													
														|  |      private ImService imService;
 |  |      private ImService imService;
 | 
											
												
													
														|  | 
 |  | +    @Resource
 | 
											
												
													
														|  | 
 |  | +    private TransactionTemplate transactionTemplate;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      @Override
 |  |      @Override
 | 
											
												
													
														|  |      public ImNetworkRoomDao getDao() {
 |  |      public ImNetworkRoomDao getDao() {
 | 
											
										
											
												
													
														|  | @@ -90,17 +92,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      @Override
 |  |      @Override
 | 
											
												
													
														|  | -    @Transactional(rollbackFor = Exception.class)
 |  | 
 | 
											
												
													
														|  | -    public BaseResponse<ImNetworkRoomResult> joinRoom(String roomId, ClientEnum clientType) throws Exception {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    public BaseResponse<ImNetworkRoomResult> joinRoom(String roomId, RoleEnum userRole) {
 | 
											
												
													
														|  |          // 当前登录用户ID
 |  |          // 当前登录用户ID
 | 
											
												
													
														|  |          Long userId = sysUserService.getUserId();
 |  |          Long userId = sysUserService.getUserId();
 | 
											
												
													
														|  |          CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId)).
 |  |          CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId)).
 | 
											
												
													
														|  |                  orElseThrow(()->new BizException("房间信息不存在"));
 |  |                  orElseThrow(()->new BizException("房间信息不存在"));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        RoleEnum userRole = RoleEnum.RoleStudent;
 |  | 
 | 
											
												
													
														|  | -        if(clientType == ClientEnum.TEACHER){
 |  | 
 | 
											
												
													
														|  | -            userRole = RoleEnum.RoleTeacher;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  |          log.info("joinRoom params:roomId:{},userRole:{},userId:{}",roomId,userRole,userId);
 |  |          log.info("joinRoom params:roomId:{},userRole:{},userId:{}",roomId,userRole,userId);
 | 
											
												
													
														|  |          BasicUserInfo sysUser = Optional.ofNullable(teacherDao.getBasicUserInfo(userId)).
 |  |          BasicUserInfo sysUser = Optional.ofNullable(teacherDao.getBasicUserInfo(userId)).
 | 
											
												
													
														|  |                  orElseThrow(()-> new BizException("用户信息不存在"));
 |  |                  orElseThrow(()-> new BizException("用户信息不存在"));
 | 
											
										
											
												
													
														|  | @@ -110,62 +107,77 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 | 
											
												
													
														|  |          if (roomNotStart(courseSchedule)) {
 |  |          if (roomNotStart(courseSchedule)) {
 | 
											
												
													
														|  |              return BaseResponse.failed(ErrorEnum.ROOM_NOT_START);
 |  |              return BaseResponse.failed(ErrorEnum.ROOM_NOT_START);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | 
 |  | +        //获取老师基本信息
 | 
											
												
													
														|  | 
 |  | +        BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(courseSchedule.getTeacherId());
 | 
											
												
													
														|  | 
 |  | +        //XX分钟关闭房间
 | 
											
												
													
														|  | 
 |  | +        String configValue = sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |          ImNetworkRoomResult joinRoomResult = new ImNetworkRoomResult();
 |  |          ImNetworkRoomResult joinRoomResult = new ImNetworkRoomResult();
 | 
											
												
													
														|  | -        //初始化房间信息
 |  | 
 | 
											
												
													
														|  |          String imUserId = imGroupService.getImUserId(sysUser.getUserId(), userRole);
 |  |          String imUserId = imGroupService.getImUserId(sysUser.getUserId(), userRole);
 | 
											
												
													
														|  | -        ImNetworkRoom room = roomService.initRoom(roomId,userRole,imUserId);
 |  | 
 | 
											
												
													
														|  | -        BeanUtils.copyProperties(room,joinRoomResult);
 |  | 
 | 
											
												
													
														|  | -        //定时销毁房间
 |  | 
 | 
											
												
													
														|  | -        //初始化房间用户信息
 |  | 
 | 
											
												
													
														|  | -        ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole,!courseSchedule.getMuteAll());
 |  | 
 | 
											
												
													
														|  |          List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults =
 |  |          List<CourseScheduleStudentMusicSheetResult> studentMusicSheetResults =
 | 
											
												
													
														|  | -                courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(null, Long.parseLong(roomId), null, null, null);
 |  | 
 | 
											
												
													
														|  | -        if(!CollectionUtils.isEmpty(studentMusicSheetResults)){
 |  | 
 | 
											
												
													
														|  | -            List<CourseScheduleStudentMusicSheetResult> musicScores = studentMusicSheetResults.stream().
 |  | 
 | 
											
												
													
														|  | -                    filter(e -> e.getUserId().equals(userId)).collect(Collectors.toList());
 |  | 
 | 
											
												
													
														|  | -            String toJSONString = JSON.toJSONString(musicScores, SerializerFeature.DisableCircularReferenceDetect);
 |  | 
 | 
											
												
													
														|  | -            List<CourseScheduleStudentMusicSheetResult> lists = JSON.parseArray(toJSONString, CourseScheduleStudentMusicSheetResult.class);
 |  | 
 | 
											
												
													
														|  | -            roomMember.setScheduleStudentMusicScores(lists);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        ImNetworkRoomMemberResult memberResult = JSONObject.parseObject(JSONObject.toJSONString(roomMember), ImNetworkRoomMemberResult.class);
 |  | 
 | 
											
												
													
														|  | -        memberResult.setJoinTime(roomMember.getJoinTime().getTime());
 |  | 
 | 
											
												
													
														|  | -        memberResult.setCamera(roomMember.isCameraFlag());
 |  | 
 | 
											
												
													
														|  | -        memberResult.setMicrophone(roomMember.isMicFlag());
 |  | 
 | 
											
												
													
														|  | -        memberResult.setMusicModeOn(roomMember.isMusicModeFlag());
 |  | 
 | 
											
												
													
														|  | -        memberResult.setHandUpOn(roomMember.isHandFlag());
 |  | 
 | 
											
												
													
														|  | -        joinRoomResult.setUserInfo(memberResult);
 |  | 
 | 
											
												
													
														|  | -        //获取教室剩余时长
 |  | 
 | 
											
												
													
														|  | -        joinRoomResult.setSurplusTime(DateUtil.secondsBetween(now, courseSchedule.getEndTime()));
 |  | 
 | 
											
												
													
														|  | -        //获取房间所有成员
 |  | 
 | 
											
												
													
														|  | -        List<ImNetworkRoomMemberResult> members = imNetworkRoomMemberService.getDao().queryByRoomId(roomId);
 |  | 
 | 
											
												
													
														|  | -        //如果是老师,
 |  | 
 | 
											
												
													
														|  | -        if(userRole == RoleEnum.RoleTeacher){
 |  | 
 | 
											
												
													
														|  | -            //重置节拍器数据
 |  | 
 | 
											
												
													
														|  | -            imNetworkRoomMemberStatusService.lambdaUpdate().set(ImNetworkRoomMemberStatus::getPlayMidi,null)
 |  | 
 | 
											
												
													
														|  | -                            .eq(ImNetworkRoomMemberStatus::getRoomId,roomId).update();
 |  | 
 | 
											
												
													
														|  | -            //获取所有学员的伴奏下载详情
 |  | 
 | 
											
												
													
														|  | -            setMusicSheetList(members,Long.parseLong(roomId));
 |  | 
 | 
											
												
													
														|  | -        }else {
 |  | 
 | 
											
												
													
														|  | -            //获取节拍器信息
 |  | 
 | 
											
												
													
														|  | -            joinRoomResult.setPlayMidiJson(imNetworkRoomMemberStatusService.getMemberMidi(roomMember));
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        joinRoomResult.setMembers(members);
 |  | 
 | 
											
												
													
														|  | -        //课程结束后关闭教室的时间
 |  | 
 | 
											
												
													
														|  | -        joinRoomResult.setAutoCloseNetworkRoomTime(sysConfigDao.findConfigValue(SysConfigConstant.DESTROY_EXPIRED_PRACTICE_ROOM_MINUTE));
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        // 创建IM群聊
 |  | 
 | 
											
												
													
														|  | -        //获取老师基本信息
 |  | 
 | 
											
												
													
														|  | -        BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(courseSchedule.getTeacherId());
 |  | 
 | 
											
												
													
														|  | 
 |  | +                courseScheduleStudentMusicSheetService.getDao().queryBySheetIdAndCourseId(null,
 | 
											
												
													
														|  | 
 |  | +                        Long.parseLong(roomId), null, null, null);
 | 
											
												
													
														|  |          //获取学员列表
 |  |          //获取学员列表
 | 
											
												
													
														|  |          List<CourseScheduleStudentPayment> studentPayments =
 |  |          List<CourseScheduleStudentPayment> studentPayments =
 | 
											
												
													
														|  |                  courseScheduleStudentPaymentService.lambdaQuery().eq(CourseScheduleStudentPayment::getCourseId,roomId).list();
 |  |                  courseScheduleStudentPaymentService.lambdaQuery().eq(CourseScheduleStudentPayment::getCourseId,roomId).list();
 | 
											
												
													
														|  |          List<Long> studentIds = studentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
 |  |          List<Long> studentIds = studentPayments.stream().map(CourseScheduleStudentPayment::getUserId).collect(Collectors.toList());
 | 
											
												
													
														|  | -        //创建并加入群组
 |  | 
 | 
											
												
													
														|  | -        basicUserInfo.setImUserId(imGroupService.getImUserId(basicUserInfo.getUserId(),RoleEnum.RoleTeacher));
 |  | 
 | 
											
												
													
														|  | -        imGroupService.joinImGroup(roomId, basicUserInfo,
 |  | 
 | 
											
												
													
														|  | -                courseSchedule.getServiceProvider(), studentIds);
 |  | 
 | 
											
												
													
														|  | -        //获取腾讯所需基本信息配置
 |  | 
 | 
											
												
													
														|  | -        joinRoomResult.setRtcRoomConfig(roomService.getRtcRoomConfig(courseSchedule.getServiceProvider(),roomMember));
 |  | 
 | 
											
												
													
														|  | 
 |  | +        //事务处理
 | 
											
												
													
														|  | 
 |  | +        this.transaction(() -> {
 | 
											
												
													
														|  | 
 |  | +            //初始化房间信息
 | 
											
												
													
														|  | 
 |  | +            ImNetworkRoom room = null;
 | 
											
												
													
														|  | 
 |  | +            try {
 | 
											
												
													
														|  | 
 |  | +                room = roomService.initRoom(roomId,userRole,imUserId);
 | 
											
												
													
														|  | 
 |  | +            } catch (Exception e) {
 | 
											
												
													
														|  | 
 |  | +                throw new RuntimeException(e);
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            BeanUtils.copyProperties(room,joinRoomResult);
 | 
											
												
													
														|  | 
 |  | +            //定时销毁房间
 | 
											
												
													
														|  | 
 |  | +            //初始化房间用户信息
 | 
											
												
													
														|  | 
 |  | +            ImNetworkRoomMember roomMember = imNetworkRoomMemberService.initRoomMember(roomId,sysUser,userRole,!courseSchedule.getMuteAll());
 | 
											
												
													
														|  | 
 |  | +            if(!CollectionUtils.isEmpty(studentMusicSheetResults)){
 | 
											
												
													
														|  | 
 |  | +                List<CourseScheduleStudentMusicSheetResult> musicScores = studentMusicSheetResults.stream().
 | 
											
												
													
														|  | 
 |  | +                        filter(e -> e.getUserId().equals(userId)).collect(Collectors.toList());
 | 
											
												
													
														|  | 
 |  | +                String toJSONString = JSON.toJSONString(musicScores, SerializerFeature.DisableCircularReferenceDetect);
 | 
											
												
													
														|  | 
 |  | +                roomMember.setScheduleStudentMusicScores(JSON.parseArray(toJSONString, CourseScheduleStudentMusicSheetResult.class));
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            ImNetworkRoomMemberResult memberResult = JSONObject.parseObject(JSONObject.toJSONString(roomMember), ImNetworkRoomMemberResult.class);
 | 
											
												
													
														|  | 
 |  | +            memberResult.setJoinTime(roomMember.getJoinTime().getTime());
 | 
											
												
													
														|  | 
 |  | +            memberResult.setCamera(roomMember.isCameraFlag());
 | 
											
												
													
														|  | 
 |  | +            memberResult.setMicrophone(roomMember.isMicFlag());
 | 
											
												
													
														|  | 
 |  | +            memberResult.setMusicModeOn(roomMember.isMusicModeFlag());
 | 
											
												
													
														|  | 
 |  | +            memberResult.setHandUpOn(roomMember.isHandFlag());
 | 
											
												
													
														|  | 
 |  | +            joinRoomResult.setUserInfo(memberResult);
 | 
											
												
													
														|  | 
 |  | +            //获取教室剩余时长
 | 
											
												
													
														|  | 
 |  | +            joinRoomResult.setSurplusTime(DateUtil.secondsBetween(now, courseSchedule.getEndTime()));
 | 
											
												
													
														|  | 
 |  | +            //获取房间所有成员
 | 
											
												
													
														|  | 
 |  | +            List<ImNetworkRoomMemberResult> members = imNetworkRoomMemberService.getDao().queryByRoomId(roomId);
 | 
											
												
													
														|  | 
 |  | +            //如果是老师,
 | 
											
												
													
														|  | 
 |  | +            if(userRole == RoleEnum.RoleTeacher){
 | 
											
												
													
														|  | 
 |  | +                //重置节拍器数据
 | 
											
												
													
														|  | 
 |  | +                imNetworkRoomMemberStatusService.lambdaUpdate().set(ImNetworkRoomMemberStatus::getPlayMidi,null)
 | 
											
												
													
														|  | 
 |  | +                        .eq(ImNetworkRoomMemberStatus::getRoomId,roomId).update();
 | 
											
												
													
														|  | 
 |  | +                //获取所有学员的伴奏下载详情
 | 
											
												
													
														|  | 
 |  | +                setMusicSheetList(members,Long.parseLong(roomId));
 | 
											
												
													
														|  | 
 |  | +            }else {
 | 
											
												
													
														|  | 
 |  | +                //获取节拍器信息
 | 
											
												
													
														|  | 
 |  | +                joinRoomResult.setPlayMidiJson(imNetworkRoomMemberStatusService.getMemberMidi(roomMember));
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            joinRoomResult.setMembers(members);
 | 
											
												
													
														|  | 
 |  | +            //课程结束后关闭教室的时间
 | 
											
												
													
														|  | 
 |  | +            joinRoomResult.setAutoCloseNetworkRoomTime(configValue);
 | 
											
												
													
														|  | 
 |  | +            // 创建IM群聊
 | 
											
												
													
														|  | 
 |  | +            //创建并加入群组
 | 
											
												
													
														|  | 
 |  | +            basicUserInfo.setImUserId(imGroupService.getImUserId(basicUserInfo.getUserId(),RoleEnum.RoleTeacher));
 | 
											
												
													
														|  | 
 |  | +            try {
 | 
											
												
													
														|  | 
 |  | +                imGroupService.joinImGroup(roomId, basicUserInfo,
 | 
											
												
													
														|  | 
 |  | +                        courseSchedule.getServiceProvider(), studentIds);
 | 
											
												
													
														|  | 
 |  | +            } catch (Exception e) {
 | 
											
												
													
														|  | 
 |  | +                throw new RuntimeException(e);
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            //获取腾讯所需基本信息配置
 | 
											
												
													
														|  | 
 |  | +            joinRoomResult.setRtcRoomConfig(roomService.getRtcRoomConfig(courseSchedule.getServiceProvider(),roomMember));
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |          joinRoomResult.setGroupId(roomId);
 |  |          joinRoomResult.setGroupId(roomId);
 | 
											
												
													
														|  |          joinRoomResult.setStudentNums(studentIds.size());
 |  |          joinRoomResult.setStudentNums(studentIds.size());
 | 
											
												
													
														|  |          return BaseResponse.success(joinRoomResult);
 |  |          return BaseResponse.success(joinRoomResult);
 | 
											
										
											
												
													
														|  | @@ -304,15 +316,12 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      @Override
 |  |      @Override
 | 
											
												
													
														|  | -    @Transactional(rollbackFor = Exception.class)
 |  | 
 | 
											
												
													
														|  | -    public void quitRoomSuccess(String roomId, String imUserId) throws Exception {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    public void quitRoomSuccess(String roomId, String imUserId) {
 | 
											
												
													
														|  |          // 客户端类型
 |  |          // 客户端类型
 | 
											
												
													
														|  |          ClientEnum clientType = ClientEnum.valueOf(imGroupService.analysisImUserClient(imUserId));
 |  |          ClientEnum clientType = ClientEnum.valueOf(imGroupService.analysisImUserClient(imUserId));
 | 
											
												
													
														|  |          // 网络教室用户身份
 |  |          // 网络教室用户身份
 | 
											
												
													
														|  | -        RoleEnum userRole = RoleEnum.RoleTeacher;
 |  | 
 | 
											
												
													
														|  | -        if (ClientEnum.STUDENT == clientType) {
 |  | 
 | 
											
												
													
														|  | -            userRole = RoleEnum.RoleStudent;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        RoleEnum userRole = clientType == ClientEnum.TEACHER ? RoleEnum.RoleTeacher : RoleEnum.RoleStudent;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |          log.info("quitRoomSuccess: roomId={}, imUserId={}", roomId, imUserId);
 |  |          log.info("quitRoomSuccess: roomId={}, imUserId={}", roomId, imUserId);
 | 
											
												
													
														|  |          //防止幂等
 |  |          //防止幂等
 | 
											
												
													
														|  |          String QUIT_ROOM_SUCCESS = "quitRoomSuccess:";
 |  |          String QUIT_ROOM_SUCCESS = "quitRoomSuccess:";
 | 
											
										
											
												
													
														|  | @@ -321,33 +330,28 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 | 
											
												
													
														|  |              log.info("quitRoomSuccess break: roomId={}, imUserId={}", roomId, imUserId);
 |  |              log.info("quitRoomSuccess break: roomId={}, imUserId={}", roomId, imUserId);
 | 
											
												
													
														|  |              return;
 |  |              return;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        ImNetworkRoomMember roomMember = imNetworkRoomMemberService.lambdaQuery()
 |  | 
 | 
											
												
													
														|  | -                .eq(ImNetworkRoomMember::getUserId, imUserId)
 |  | 
 | 
											
												
													
														|  | -                .eq(ImNetworkRoomMember::getRoomId, roomId)
 |  | 
 | 
											
												
													
														|  | -                .eq(ImNetworkRoomMember::getRole, userRole.getValue())
 |  | 
 | 
											
												
													
														|  | -                .last("LIMIT 1").one();
 |  | 
 | 
											
												
													
														|  | -        if(Objects.isNull(roomMember)){
 |  | 
 | 
											
												
													
														|  | -            return;
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId))
 |  |          CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId))
 | 
											
												
													
														|  |                  .orElseThrow(()->new BizException("房间信息不存在"));
 |  |                  .orElseThrow(()->new BizException("房间信息不存在"));
 | 
											
												
													
														|  |          Long courseScheduleId = courseSchedule.getId();
 |  |          Long courseScheduleId = courseSchedule.getId();
 | 
											
												
													
														|  |          Long userId = Long.parseLong(imGroupService.analysisImUserId(imUserId));
 |  |          Long userId = Long.parseLong(imGroupService.analysisImUserId(imUserId));
 | 
											
												
													
														|  | -        if(RoleEnum.RoleTeacher == userRole){
 |  | 
 | 
											
												
													
														|  | -            teacherAttendanceService.signOut(userId,courseSchedule);
 |  | 
 | 
											
												
													
														|  | -        }else {
 |  | 
 | 
											
												
													
														|  | -            //记录考勤签退
 |  | 
 | 
											
												
													
														|  | -            studentAttendanceService.signOut(userId,courseSchedule);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        if (RoleEnum.RoleTeacher == userRole ||
 |  | 
 | 
											
												
													
														|  | -                imNetworkRoomMemberService.lambdaQuery().eq(ImNetworkRoomMember::getRoomId,roomId).count() <= 1){
 |  | 
 | 
											
												
													
														|  | -            //如果老师退出房间,初始化节拍器和伴奏播放配置
 |  | 
 | 
											
												
													
														|  | -            courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  | -        //退出房间
 |  | 
 | 
											
												
													
														|  | -        roomService.quitRoomSuccess(userRole,roomMember,courseSchedule.getServiceProvider());
 |  | 
 | 
											
												
													
														|  | 
 |  | +        this.transaction(()->{
 | 
											
												
													
														|  | 
 |  | +            if(RoleEnum.RoleTeacher == userRole){
 | 
											
												
													
														|  | 
 |  | +                teacherAttendanceService.signOut(userId,courseSchedule);
 | 
											
												
													
														|  | 
 |  | +                //如果老师退出房间,初始化节拍器和伴奏播放配置
 | 
											
												
													
														|  | 
 |  | +                courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
 | 
											
												
													
														|  | 
 |  | +            }else {
 | 
											
												
													
														|  | 
 |  | +                //记录考勤签退
 | 
											
												
													
														|  | 
 |  | +                studentAttendanceService.signOut(userId,courseSchedule);
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +            //退出房间
 | 
											
												
													
														|  | 
 |  | +            try {
 | 
											
												
													
														|  | 
 |  | +                roomService.quitRoomSuccess(userRole,imUserId,roomId,courseSchedule.getServiceProvider());
 | 
											
												
													
														|  | 
 |  | +            } catch (Exception e) {
 | 
											
												
													
														|  | 
 |  | +                throw new RuntimeException(e);
 | 
											
												
													
														|  | 
 |  | +            }
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -669,4 +673,11 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 | 
											
												
													
														|  |          Date addMinutes = DateUtil.addMinutes(courseSchedule.getStartTime(), Integer.parseInt(courseBeforeBufferTime));
 |  |          Date addMinutes = DateUtil.addMinutes(courseSchedule.getStartTime(), Integer.parseInt(courseBeforeBufferTime));
 | 
											
												
													
														|  |          return courseSchedule.getStartTime().compareTo(addMinutes) > 0;
 |  |          return courseSchedule.getStartTime().compareTo(addMinutes) > 0;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    public void transaction(Runnable runnable) {
 | 
											
												
													
														|  | 
 |  | +        transactionTemplate.execute(transactionStatus -> {
 | 
											
												
													
														|  | 
 |  | +            runnable.run();
 | 
											
												
													
														|  | 
 |  | +            return Boolean.TRUE;
 | 
											
												
													
														|  | 
 |  | +        });
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  }
 |  |  }
 |