Jelajahi Sumber

Merge branch 'feature/0414-trtc' of http://git.dayaedu.com/yonge/mec into feature/0414-trtc

liujc 2 tahun lalu
induk
melakukan
2428008e5d

+ 37 - 0
mec-im/src/main/java/com/ym/pojo/ReqDeviceControlData.java

@@ -22,6 +22,12 @@ public class ReqDeviceControlData {
 	private Integer musicScoreAccompanimentId;
 	//伴奏音量
 	private Integer soundVolume = 100;
+	// 服务提供方
+	private String serviceProvider;
+	// 发送用户信息
+	private String sendUserId;
+	private String sendUserName;
+	private String avatar;
 
 	public Integer getMusicScoreAccompanimentId() {
 		return musicScoreAccompanimentId;
@@ -102,4 +108,35 @@ public class ReqDeviceControlData {
 		this.ticket = ticket;
 	}
 
+	public String getServiceProvider() {
+		return serviceProvider;
+	}
+
+	public void setServiceProvider(String serviceProvider) {
+		this.serviceProvider = serviceProvider;
+	}
+
+	public String getSendUserId() {
+		return sendUserId;
+	}
+
+	public void setSendUserId(String sendUserId) {
+		this.sendUserId = sendUserId;
+	}
+
+	public String getSendUserName() {
+		return sendUserName;
+	}
+
+	public void setSendUserName(String sendUserName) {
+		this.sendUserName = sendUserName;
+	}
+
+	public String getAvatar() {
+		return avatar;
+	}
+
+	public void setAvatar(String avatar) {
+		this.avatar = avatar;
+	}
 }

+ 144 - 5
mec-im/src/main/java/com/ym/service/Impl/RoomServiceImpl.java

@@ -1023,6 +1023,26 @@ public class RoomServiceImpl implements RoomService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean controlDevice(ReqDeviceControlData data) throws Exception {
+
+        // RTC服务方信息
+        if (StringUtils.isBlank(data.getServiceProvider())) {
+
+            // 课程信息
+            CourseSchedule courseSchedule = courseScheduleDao.get(Long.parseLong(data.getRoomId().substring(1)));
+            if (Objects.isNull(courseSchedule)) {
+                throw new BizException("无效的课程编号");
+            }
+            data.setServiceProvider(courseSchedule.getServiceProvider());
+
+            // 课程老师信息
+            SysUser sysUser = sysUserFeignService.queryUserById(courseSchedule.getTeacherId());
+            if (Objects.nonNull(sysUser)) {
+                data.setSendUserId(sysUser.getId().toString());
+                data.setSendUserName(sysUser.getRealName());
+                data.setAvatar(sysUser.getAvatar());
+            }
+        }
+
         String roomId = data.getRoomId();
         String userId = data.getUserId();
         DeviceTypeEnum typeEnum;
@@ -1062,6 +1082,45 @@ public class RoomServiceImpl implements RoomService {
         SysUser authUser = sysUserFeignService.queryUserInfo();
         log.info("controlDevice: userId = {}, typeEnum = {}, enable = {} ,roomId = {}", userId, typeEnum, enable, roomId);
 
+        // RTC服务对象
+        RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(data.getServiceProvider());
+
+        // 通知消息
+        RTCRoomMessage.MessageContent notifyContent = RTCRoomMessage.MessageContent
+                .builder()
+                .type(typeEnum.ordinal())
+                .enable(enable)
+                .targetId(userId)
+                .targetName(authUser.getUsername())
+                .sendUserInfo(RTCRoomMessage.MessageUser.builder()
+                        .sendUserId(data.getSendUserId())
+                        .sendUserName(data.getSendUserName())
+                        .avatarUrl(data.getAvatar())
+                        .build())
+                .build();
+
+        // 消息内容
+        RTCRoomMessage.MessageContent messageContent = RTCRoomMessage.MessageContent
+                .builder()
+                .type(typeEnum.ordinal())
+                .enable(enable)
+                .sendUserInfo(RTCRoomMessage.MessageUser.builder()
+                        .sendUserId(userId)
+                        .sendUserName(authUser.getUsername())
+                        .avatarUrl(authUser.getAvatar())
+                        .build())
+                .build();
+
+        // 腾讯云消息推送
+        RTCRoomMessage message = RTCRoomMessage.builder()
+                .objectName(RTCRoomMessage.DEVICE_MESSAGE)
+                .fromUserId(userId)
+                .toChatRoomId(roomId)
+                .content(messageContent)
+                .isPersisted(1)
+                .isIncludeSender(0)
+                .build();
+
         if (enable) {
             if (typeEnum.equals(DeviceTypeEnum.ExamSong)) {
                 long scheduleId = Long.parseLong(roomId.substring(1));
@@ -1076,7 +1135,15 @@ public class RoomServiceImpl implements RoomService {
                 courseScheduleStudentPaymentDao.adjustExamSong(scheduleId, Integer.parseInt(userId), JSON.toJSONString(msg));
                 DeviceStateChangedMessage deviceResourceMessage = new DeviceStateChangedMessage(typeEnum.ordinal(), enable);
                 deviceResourceMessage.setUserId(userId);
-                imHelper.publishMessage(authUser.getId().toString(), roomId, deviceResourceMessage, 1);
+
+                // 消息发送
+                if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
+                    // 腾讯云推送
+                    pluginService.sendChatRoomMessage(message.objectName(RTCRoomMessage.DEVICE_MESSAGE).content(messageContent));
+                } else {
+                    // 融云推送
+                    imHelper.publishMessage(authUser.getId().toString(), roomId, deviceResourceMessage, 1);
+                }
             } else if (typeEnum.equals(DeviceTypeEnum.MusicScore)) {
                 long scheduleId = Long.parseLong(roomId.substring(1));
                 //关闭所有曲目播放
@@ -1113,7 +1180,15 @@ public class RoomServiceImpl implements RoomService {
                 msg.setType(taskInfo.getTypeEnum().ordinal());
                 msg.setOpUserId(authUser.getId().toString());
                 msg.setOpUserName(authUser.getUsername());
-                imHelper.publishMessage(authUser.getId().toString(), userId, roomId, msg);
+
+                // 发送消息
+                if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
+                    // 腾讯消息
+                    pluginService.sendChatRoomMessage(message.objectName(RTCRoomMessage.CONTROL_DEVICE_NOTIFY_MESSAGE).content(notifyContent));
+                } else {
+                    // 融云消息
+                    imHelper.publishMessage(authUser.getId().toString(), userId, roomId, msg);
+                }
             }
         } else {
             if (typeEnum.equals(DeviceTypeEnum.Camera)) {
@@ -1150,7 +1225,15 @@ public class RoomServiceImpl implements RoomService {
             if (userInfo != null) {
                 deviceResourceMessage.setUserName(userInfo.getName());
             }
-            imHelper.publishMessage(authUser.getId().toString(), roomId, deviceResourceMessage, 1);
+
+            // 发送消息
+            if (TencentCloudRTCPlugin.PLUGIN_NAME.equals(pluginService.pluginName())) {
+                // 腾讯消息
+                pluginService.sendChatRoomMessage(message.objectName(RTCRoomMessage.DEVICE_MESSAGE).content(messageContent));
+            } else {
+                // 融云消息
+                imHelper.publishMessage(authUser.getId().toString(), roomId, deviceResourceMessage, 1);
+            }
         }
         return true;
     }
@@ -1158,8 +1241,25 @@ public class RoomServiceImpl implements RoomService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean batchControlDevice(ReqDeviceControlData data) throws Exception {
+
+        // 课程ID
+        long courseScheduleId = Long.parseLong(data.getRoomId().substring(1));
+        CourseSchedule courseSchedule = courseScheduleDao.get(courseScheduleId);
+        if (Objects.isNull(courseSchedule)) {
+            throw new BizException("无效的课程编号");
+        }
+        data.setServiceProvider(courseSchedule.getServiceProvider());
+
+        // 课程老师信息
+        SysUser sysUser = sysUserFeignService.queryUserById(courseSchedule.getTeacherId());
+        if (Objects.nonNull(sysUser)) {
+            data.setSendUserId(sysUser.getId().toString());
+            data.setSendUserName(sysUser.getRealName());
+            data.setAvatar(sysUser.getAvatar());
+        }
+
         if (data.getExamSongOn() != null || data.getMusicScoreOn() != null || data.getAccompanimentOn() != null) {
-            List<BasicUserDto> students = courseScheduleStudentPaymentDao.findStudents(Long.parseLong(data.getRoomId().substring(1)));
+            List<BasicUserDto> students = courseScheduleStudentPaymentDao.findStudents(courseScheduleId);
             for (BasicUserDto e : students) {
                 data.setUserId(e.getUserId().toString());
                 controlDevice(data);
@@ -1295,7 +1395,46 @@ public class RoomServiceImpl implements RoomService {
             deviceResourceMessage.setSoundVolume(room.getSoundVolume());
         }
         deviceResourceMessage.setUserId(userId);
-        imHelper.publishMessage(userId, roomId, deviceResourceMessage, 1);
+
+        // 查询课程信息
+        CourseSchedule courseSchedule = courseScheduleDao.get(Long.parseLong(roomId.substring(1)));
+        if (Objects.isNull(courseSchedule)) {
+            throw new BizException("无效的课程ID");
+        }
+        data.setServiceProvider(courseSchedule.getServiceProvider());
+
+        // RTC服务对象
+        RTCRoomPluginService pluginService = rtcRoomPluginContext.getPluginService(data.getServiceProvider());
+        // 消息内容
+        RTCRoomMessage.MessageContent messageContent = RTCRoomMessage.MessageContent
+                .builder()
+                .type(deviceResourceMessage.getType())
+                .enable(deviceResourceMessage.isEnable())
+                .sendUserInfo(RTCRoomMessage.MessageUser.builder()
+                        .sendUserId(authUser.getId().toString())
+                        .sendUserName(authUser.getRealName())
+                        .avatarUrl(authUser.getAvatar())
+                        .build())
+                .build();
+
+        // 腾讯云消息推送
+        RTCRoomMessage message = RTCRoomMessage.builder()
+                .objectName(RTCRoomMessage.DEVICE_MESSAGE)
+                .fromUserId(userId)
+                .toChatRoomId(roomId)
+                .content(messageContent)
+                .isPersisted(1)
+                .isIncludeSender(0)
+                .build();
+
+        if (TencentCloudRTCPlugin.PLUGIN_NAME.matches(data.getServiceProvider())) {
+            // 发送消息
+            pluginService.sendChatRoomMessage(message);
+        } else {
+            // 融云消息推送
+            imHelper.publishMessage(userId, roomId, deviceResourceMessage, 1);
+        }
+
         log.info("syncDeviceState : {}, {}", roomId, enable);
         return true;
     }