|  | @@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 | 
											
												
													
														|  |  import com.alibaba.fastjson.JSONObject;
 |  |  import com.alibaba.fastjson.JSONObject;
 | 
											
												
													
														|  |  import com.alibaba.fastjson.serializer.SerializerFeature;
 |  |  import com.alibaba.fastjson.serializer.SerializerFeature;
 | 
											
												
													
														|  |  import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 |  |  import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
											
												
													
														|  | 
 |  | +import com.microsvc.toolkit.middleware.rtc.RTCRoomPluginService;
 | 
											
												
													
														|  |  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;
 | 
											
												
													
														|  |  import com.yonge.cooleshow.biz.dal.dao.SysConfigDao;
 |  |  import com.yonge.cooleshow.biz.dal.dao.SysConfigDao;
 | 
											
										
											
												
													
														|  | @@ -302,8 +303,6 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 | 
											
												
													
														|  |      @Override
 |  |      @Override
 | 
											
												
													
														|  |      @Transactional(rollbackFor = Exception.class)
 |  |      @Transactional(rollbackFor = Exception.class)
 | 
											
												
													
														|  |      public void quitRoomSuccess(String roomId, String imUserId) throws Exception {
 |  |      public void quitRoomSuccess(String roomId, String imUserId) throws Exception {
 | 
											
												
													
														|  | -        // 用户ID
 |  | 
 | 
											
												
													
														|  | -        Long userId = Long.parseLong(imGroupService.analysisImUserId(imUserId));
 |  | 
 | 
											
												
													
														|  |          // 客户端类型
 |  |          // 客户端类型
 | 
											
												
													
														|  |          ClientEnum clientType = ClientEnum.valueOf(imGroupService.analysisImUserClient(imUserId));
 |  |          ClientEnum clientType = ClientEnum.valueOf(imGroupService.analysisImUserClient(imUserId));
 | 
											
												
													
														|  |          // 网络教室用户身份
 |  |          // 网络教室用户身份
 | 
											
										
											
												
													
														|  | @@ -311,16 +310,16 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 | 
											
												
													
														|  |          if (ClientEnum.STUDENT == clientType) {
 |  |          if (ClientEnum.STUDENT == clientType) {
 | 
											
												
													
														|  |              userRole = RoleEnum.RoleStudent;
 |  |              userRole = RoleEnum.RoleStudent;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        log.info("quitRoomSuccess: roomId={}, userId={}", roomId, userId);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        log.info("quitRoomSuccess: roomId={}, imUserId={}", roomId, imUserId);
 | 
											
												
													
														|  |          //防止幂等
 |  |          //防止幂等
 | 
											
												
													
														|  |          String QUIT_ROOM_SUCCESS = "quitRoomSuccess:";
 |  |          String QUIT_ROOM_SUCCESS = "quitRoomSuccess:";
 | 
											
												
													
														|  | -        StringBuilder sb  = new StringBuilder(QUIT_ROOM_SUCCESS).append(roomId).append(userId);
 |  | 
 | 
											
												
													
														|  | -        if (Boolean.FALSE.equals(redisTemplate.opsForValue().setIfAbsent(sb.toString(), userId, 1L, TimeUnit.SECONDS))){
 |  | 
 | 
											
												
													
														|  | -            log.info("quitRoomSuccess break: roomId={}, userId={}", roomId, userId);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        StringBuilder sb  = new StringBuilder(QUIT_ROOM_SUCCESS).append(roomId).append(imUserId);
 | 
											
												
													
														|  | 
 |  | +        if (Boolean.FALSE.equals(redisTemplate.opsForValue().setIfAbsent(sb.toString(), imUserId, 1L, TimeUnit.SECONDS))){
 | 
											
												
													
														|  | 
 |  | +            log.info("quitRoomSuccess break: roomId={}, imUserId={}", roomId, imUserId);
 | 
											
												
													
														|  |              return;
 |  |              return;
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |          ImNetworkRoomMember roomMember = imNetworkRoomMemberService.lambdaQuery()
 |  |          ImNetworkRoomMember roomMember = imNetworkRoomMemberService.lambdaQuery()
 | 
											
												
													
														|  | -                .eq(ImNetworkRoomMember::getUserId, userId)
 |  | 
 | 
											
												
													
														|  | 
 |  | +                .eq(ImNetworkRoomMember::getUserId, imUserId)
 | 
											
												
													
														|  |                  .eq(ImNetworkRoomMember::getRoomId, roomId)
 |  |                  .eq(ImNetworkRoomMember::getRoomId, roomId)
 | 
											
												
													
														|  |                  .eq(ImNetworkRoomMember::getRole, userRole.getValue())
 |  |                  .eq(ImNetworkRoomMember::getRole, userRole.getValue())
 | 
											
												
													
														|  |                  .last("LIMIT 1").one();
 |  |                  .last("LIMIT 1").one();
 | 
											
										
											
												
													
														|  | @@ -331,23 +330,21 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 | 
											
												
													
														|  |          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();
 | 
											
												
													
														|  | -        RoleEnum roleEnum = RoleEnum.RoleStudent;
 |  | 
 | 
											
												
													
														|  | -        if(Objects.equals(courseSchedule.getTeacherId(),userId)
 |  | 
 | 
											
												
													
														|  | -                && ClientEnum.TEACHER == clientType){
 |  | 
 | 
											
												
													
														|  | -            roleEnum = RoleEnum.RoleTeacher;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        Long userId = Long.parseLong(imGroupService.analysisImUserId(imUserId));
 | 
											
												
													
														|  | 
 |  | +        if(RoleEnum.RoleTeacher == userRole){
 | 
											
												
													
														|  |              teacherAttendanceService.signOut(userId,courseSchedule);
 |  |              teacherAttendanceService.signOut(userId,courseSchedule);
 | 
											
												
													
														|  |          }else {
 |  |          }else {
 | 
											
												
													
														|  |              //记录考勤签退
 |  |              //记录考勤签退
 | 
											
												
													
														|  |              studentAttendanceService.signOut(userId,courseSchedule);
 |  |              studentAttendanceService.signOut(userId,courseSchedule);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        if (roleEnum == RoleEnum.RoleTeacher ||
 |  | 
 | 
											
												
													
														|  | 
 |  | +        if (RoleEnum.RoleTeacher == userRole ||
 | 
											
												
													
														|  |                  imNetworkRoomMemberService.lambdaQuery().eq(ImNetworkRoomMember::getRoomId,roomId).count() <= 1){
 |  |                  imNetworkRoomMemberService.lambdaQuery().eq(ImNetworkRoomMember::getRoomId,roomId).count() <= 1){
 | 
											
												
													
														|  |              //如果老师退出房间,初始化节拍器和伴奏播放配置
 |  |              //如果老师退出房间,初始化节拍器和伴奏播放配置
 | 
											
												
													
														|  |              courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
 |  |              courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |          //退出房间
 |  |          //退出房间
 | 
											
												
													
														|  | -        roomService.quitRoomSuccess(roleEnum,roomMember,courseSchedule.getServiceProvider());
 |  | 
 | 
											
												
													
														|  | 
 |  | +        roomService.quitRoomSuccess(userRole,roomMember,courseSchedule.getServiceProvider());
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -461,6 +458,25 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe
 | 
											
												
													
														|  |                  List<ImNetworkRoomMember> roomMembers = imNetworkRoomMemberService.lambdaQuery()
 |  |                  List<ImNetworkRoomMember> roomMembers = imNetworkRoomMemberService.lambdaQuery()
 | 
											
												
													
														|  |                          .eq(ImNetworkRoomMember::getRoomId,deviceControl.getRoomId())
 |  |                          .eq(ImNetworkRoomMember::getRoomId,deviceControl.getRoomId())
 | 
											
												
													
														|  |                          .eq(ImNetworkRoomMember::getRole,RoleEnum.RoleStudent.getValue()).list();
 |  |                          .eq(ImNetworkRoomMember::getRole,RoleEnum.RoleStudent.getValue()).list();
 | 
											
												
													
														|  | 
 |  | +                // 同步全员静音状态
 | 
											
												
													
														|  | 
 |  | +                if (deviceControl.getDeviceType() == ImNetworkDeviceTypeEnum.MICROPHONE || deviceControl.getCancelMuteFlag() != null) {
 | 
											
												
													
														|  | 
 |  | +                    courseScheduleService.lambdaUpdate().eq(CourseSchedule::getId,deviceControl.getRoomId())
 | 
											
												
													
														|  | 
 |  | +                                    .set(CourseSchedule::getMuteAll,!deviceControl.getEnable())
 | 
											
												
													
														|  | 
 |  | +                                    .set(CourseSchedule::getCancelMuteFlag,deviceControl.getCancelMuteFlag())
 | 
											
												
													
														|  | 
 |  | +                            .update();
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  | 
 |  | +                /*CourseSchedule courseSchedule = courseScheduleService.getById(deviceControl.getRoomId());
 | 
											
												
													
														|  | 
 |  | +                // 修改网管课群自定义属性
 | 
											
												
													
														|  | 
 |  | +                RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(courseSchedule.getServiceProvider());
 | 
											
												
													
														|  | 
 |  | +                if (Objects.nonNull(pluginService) && Objects.nonNull(newCourseSchedule)) {
 | 
											
												
													
														|  | 
 |  | +                    // 更新群自定义字段
 | 
											
												
													
														|  | 
 |  | +                    updateChatRoomGroupData(data.getRoomId(), newCourseSchedule, pluginService);
 | 
											
												
													
														|  | 
 |  | +                }
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +                // 取消网络课群静音
 | 
											
												
													
														|  | 
 |  | +                if (Objects.isNull(data.getMicrophoneOn())) {
 | 
											
												
													
														|  | 
 |  | +                    return true;
 | 
											
												
													
														|  | 
 |  | +                }*/
 | 
											
												
													
														|  |                  if (!CollectionUtils.isEmpty(roomMembers)) {
 |  |                  if (!CollectionUtils.isEmpty(roomMembers)) {
 | 
											
												
													
														|  |                      for (ImNetworkRoomMember roomMember : roomMembers) {
 |  |                      for (ImNetworkRoomMember roomMember : roomMembers) {
 | 
											
												
													
														|  |                          deviceControl.setUserId(roomMember.getUserId());
 |  |                          deviceControl.setUserId(roomMember.getUserId());
 |