| 
					
				 | 
			
			
				@@ -19,14 +19,14 @@ import org.apache.commons.lang3.StringUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.slf4j.LoggerFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.BeanUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.data.redis.core.RedisTemplate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.util.CollectionUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import javax.annotation.Resource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.function.BiConsumer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import java.util.function.Consumer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.TimeUnit; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.stream.Collectors; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -58,6 +58,10 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private IMHelper imHelper; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private MusicSheetAccompanimentService musicSheetAccompanimentService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @Resource 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private RedisTemplate<String,Object> redisTemplate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private String QUIT_ROOM_SUCCESS = "quitRoomSuccess:"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public ImNetworkRoomDao getDao() { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -180,48 +184,32 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public void leaveRoom(String roomId) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Long userId = sysUserService.getUserId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.info("leaveRoom: roomId={}, userId={}", roomId, userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        long courseScheduleId = Long.parseLong(roomId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Long teacherId = Optional.ofNullable(courseScheduleService.getById(courseScheduleId)). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                map(CourseSchedule::getTeacherId). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                orElseThrow(()->new BizException("房间信息不存在")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        UserRoleEnum userRole = UserRoleEnum.STUDENT; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if(teacherId.equals(userId)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            userRole = UserRoleEnum.TEACHER; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (userRole == UserRoleEnum.TEACHER){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            //如果老师退出房间,关闭伴奏 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            courseScheduleStudentPaymentService.getDao().adjustPlayMidi(courseScheduleId, null, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            courseScheduleStudentPaymentService.getDao().adjustExamSong(courseScheduleId, null, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public void quitRoomSuccess(String roomId, Long userId) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info("quitRoomSuccess: roomId={}, userId={}", roomId, userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //防止幂等 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        StringBuffer sb  = new StringBuffer(QUIT_ROOM_SUCCESS).append(roomId).append(userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!redisTemplate.opsForValue().setIfAbsent(sb.toString(),userId,1l, TimeUnit.SECONDS)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            log.info("quitRoomSuccess break: roomId={}, userId={}", roomId, userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getDao().findByRidAndUid(roomId, userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //删除用户信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        imNetworkRoomMemberService.getDao().delByRidAndUid(roomId,userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //发送退出房间的消息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ImNetworkRoomMemberChangedMessage msg = new ImNetworkRoomMemberChangedMessage(roomMember,ImNetworkRoomMemberChangedEnum.JOIN); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        imHelper.publishMessage(userId.toString(), roomId, msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        imHelper.quit(new String[]{userId.toString()}, roomId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //记录考勤信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //是否删除房间信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    @Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public void leaveRoomSuccess(String roomId, Long userId) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.info("leaveRoomSuccess: roomId={}, userId={}", roomId, userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(Objects.isNull(roomMember)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         CourseSchedule courseSchedule = Optional.ofNullable(courseScheduleService.getById(roomId)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 .orElseThrow(()->new BizException("房间信息不存在")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Long courseScheduleId = courseSchedule.getId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         UserRoleEnum roleEnum = UserRoleEnum.STUDENT; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if(Objects.equals(courseSchedule.getTeacherId(),userId)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             roleEnum = UserRoleEnum.TEACHER; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         //记录考勤信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ImNetworkRoom room = baseMapper.findByRoomId(roomId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (roleEnum == UserRoleEnum.TEACHER){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //如果老师退出房间,关闭伴奏 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            courseScheduleStudentMusicSheetService.getDao().closePlayStatus(courseScheduleId,null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            courseScheduleStudentPaymentService.getDao().adjustPlayMidi(courseScheduleId, null, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            courseScheduleStudentPaymentService.getDao().adjustExamSong(courseScheduleId, null, null); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (isUserDisplay(room.getDisplay(), userId)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 room.setDisplay(""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 this.updateDisplay(userId,room); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -229,7 +217,6 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //老师退出房间,初始化节拍器和伴奏播放配置 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             courseScheduleStudentPaymentService.adjustPlayMidiAndMusicSheet(courseSchedule.getId(), null, null,""); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        ImNetworkRoomMember roomMember = imNetworkRoomMemberService.getDao().findByRidAndUid(roomId, userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         int memberNum = imNetworkRoomMemberService.getDao().countByRoomId(roomId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (memberNum <= 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             imHelper.dismiss(userId.toString(), roomId); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -363,7 +350,7 @@ public class ImNetworkRoomServiceImpl extends ServiceImpl<ImNetworkRoomDao, ImNe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         String roomId = deviceControl.getRoomId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Long userId = deviceControl.getUserId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         Boolean enable = deviceControl.getEnable(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        log.info("controlDevice: roomId:{} ,deviceType:{} ,enable:{} ,userId:{}", roomId,deviceControl.getDeviceType(),enable); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        log.info("controlDevice: roomId:{} ,deviceType:{} ,enable:{} ,userId:{}", roomId,deviceControl.getDeviceType(),enable,userId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if(enable){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             long scheduleId = Long.parseLong(roomId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             ImNetworkDeviceStateChangedMessage deviceResourceMessage = new ImNetworkDeviceStateChangedMessage(deviceControl.getDeviceType().ordinal(),enable); 
			 |