Commit 5d05869f by Future

多人音视频邀请逻辑

parent 2f4650cf
...@@ -14,6 +14,7 @@ import io.swagger.annotations.ApiOperation; ...@@ -14,6 +14,7 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
...@@ -38,7 +39,7 @@ public class ImMultiMeetController extends BaseController { ...@@ -38,7 +39,7 @@ public class ImMultiMeetController extends BaseController {
*/ */
@PostMapping("/invite") @PostMapping("/invite")
@ApiOperation(value = "邀请加入多人音视频会议", notes = "邀请加入多人音视频会议") @ApiOperation(value = "邀请加入多人音视频会议", notes = "邀请加入多人音视频会议")
public ApiResult<Boolean> invite(@RequestBody InviteToMultiMeetParam param) { public ApiResult<Boolean> invite(@Validated @RequestBody InviteToMultiMeetParam param) {
log.info("邀请加入多人音视频会议入参 {}", JSON.toJSONString(param)); log.info("邀请加入多人音视频会议入参 {}", JSON.toJSONString(param));
if (CollectionUtils.isEmpty(param.getToClients())) { if (CollectionUtils.isEmpty(param.getToClients())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
......
...@@ -33,6 +33,9 @@ public class ImMultiRtcRoomMember extends BaseEntity { ...@@ -33,6 +33,9 @@ public class ImMultiRtcRoomMember extends BaseEntity {
@ApiModelProperty("im房间id") @ApiModelProperty("im房间id")
private Long fkRtcRoomId; private Long fkRtcRoomId;
@ApiModelProperty("client主键id")
private Long fkClientId;
@ApiModelProperty("客户端id") @ApiModelProperty("客户端id")
private String clientId; private String clientId;
......
package com.wecloud.multimeet.entity.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/3/16 11:21
* @Description 房间成员dto
*/
@Data
public class RoomMemberDto implements Serializable {
private static final long serialVersionUID = 7634567721658236530L;
/**
* client主键id
*/
private Long fkClientId;
/**
* 客户端id
*/
private String clientId;
/**
* 多人音视频房间成员状态枚举
* @see com.wecloud.im.enums.MultiRtcMemberStateEnum
*/
private Integer state;
}
package com.wecloud.multimeet.entity.response; package com.wecloud.multimeet.entity.response;
import com.wecloud.multimeet.entity.dto.RoomMemberDto;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.io.Serializable; import java.io.Serializable;
import java.util.List;
/** /**
* @Author wenzhida * @Author wenzhida
...@@ -24,4 +26,9 @@ public class MultiMeetInviteResponse extends MultiMeetDataBase implements Serial ...@@ -24,4 +26,9 @@ public class MultiMeetInviteResponse extends MultiMeetDataBase implements Serial
*/ */
private String roomId; private String roomId;
/**
* 成员列表dto
*/
private List<RoomMemberDto> memberDtoList;
} }
package com.wecloud.multimeet.service.impl; package com.wecloud.multimeet.service.impl;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMultiRtcRoom;
import com.wecloud.im.entity.ImMultiRtcRoomMember;
import com.wecloud.im.enums.MultiRtcMemberStateEnum;
import com.wecloud.im.enums.MultiRtcRoomStateEnum;
import com.wecloud.im.param.AgreeToMultiMeetParam; import com.wecloud.im.param.AgreeToMultiMeetParam;
import com.wecloud.im.param.InviteToMultiMeetParam; import com.wecloud.im.param.InviteToMultiMeetParam;
import com.wecloud.im.param.LeaveFromMultiMeetParam; import com.wecloud.im.param.LeaveFromMultiMeetParam;
import com.wecloud.im.param.RejectToMultiMeetParam; import com.wecloud.im.param.RejectToMultiMeetParam;
import com.wecloud.im.param.rtc.CreateRtcChannelResult; import com.wecloud.im.param.rtc.CreateRtcChannelResult;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImMultiRtcRoomMemberService;
import com.wecloud.im.service.ImMultiRtcRoomService;
import com.wecloud.im.ws.cache.UserStateCacheManager; import com.wecloud.im.ws.cache.UserStateCacheManager;
import com.wecloud.multimeet.entity.dto.RoomMemberDto;
import com.wecloud.multimeet.entity.response.MultiMeetAgreeResponse; import com.wecloud.multimeet.entity.response.MultiMeetAgreeResponse;
import com.wecloud.multimeet.entity.response.MultiMeetInviteResponse; import com.wecloud.multimeet.entity.response.MultiMeetInviteResponse;
import com.wecloud.multimeet.entity.response.MultiMeetLeaveResponse; import com.wecloud.multimeet.entity.response.MultiMeetLeaveResponse;
...@@ -38,6 +51,12 @@ public class MultiMeetServiceImpl implements MultiMeetService { ...@@ -38,6 +51,12 @@ public class MultiMeetServiceImpl implements MultiMeetService {
@Autowired @Autowired
private UserStateCacheManager userStateCacheManager; private UserStateCacheManager userStateCacheManager;
@Autowired
private ImMultiRtcRoomService imMultiRtcRoomService;
@Autowired
private ImMultiRtcRoomMemberService imMultiRtcRoomMemberService;
@Override @Override
public void invite(InviteToMultiMeetParam param) { public void invite(InviteToMultiMeetParam param) {
ImClient currentClient = imClientService.getCurrentClient(); ImClient currentClient = imClientService.getCurrentClient();
...@@ -47,20 +66,54 @@ public class MultiMeetServiceImpl implements MultiMeetService { ...@@ -47,20 +66,54 @@ public class MultiMeetServiceImpl implements MultiMeetService {
log.info("发起方必须在线" + currentClient.getFkAppid() + currentClient.getClientId()); log.info("发起方必须在线" + currentClient.getFkAppid() + currentClient.getClientId());
throw new BusinessException("发起方必须在线"); throw new BusinessException("发起方必须在线");
} }
for (String toClient : param.getToClients()) { List<RoomMemberDto> members = Lists.newArrayList();
ImClient receiver = imClientService.getCacheImClient(currentClient.getFkAppid(), toClient); ImMultiRtcRoom rtcRoom = imMultiRtcRoomService.getOne(new QueryWrapper<ImMultiRtcRoom>().lambda()
if (receiver == null) { .eq(ImMultiRtcRoom::getFkAppid, currentClient.getFkAppid())
log.info("查无接收人信息 {}", toClient); .eq(ImMultiRtcRoom::getRoomId, param.getRoomId()));
if (rtcRoom == null) {
rtcRoom = new ImMultiRtcRoom();
rtcRoom.setId(SnowflakeUtil.getId());
rtcRoom.setFkAppid(currentClient.getFkAppid());
rtcRoom.setRoomId(param.getRoomId());
rtcRoom.setState(MultiRtcRoomStateEnum.CREATED.getCode());
rtcRoom.setCreateTime(new Date());
rtcRoom.setUpdateTime(new Date());
imMultiRtcRoomService.save(rtcRoom);
} else {
List<ImMultiRtcRoomMember> rtcRoomMemberList = imMultiRtcRoomMemberService.list(
new QueryWrapper<ImMultiRtcRoomMember>().lambda()
.eq(ImMultiRtcRoomMember::getFkRtcRoomId, rtcRoom.getId())
.ne(ImMultiRtcRoomMember::getClientId, currentClient.getClientId())
);
for (ImMultiRtcRoomMember imMultiRtcRoomMember : rtcRoomMemberList) {
RoomMemberDto roomMemberDto = new RoomMemberDto();
roomMemberDto.setFkClientId(imMultiRtcRoomMember.getFkClientId());
roomMemberDto.setClientId(imMultiRtcRoomMember.getClientId());
roomMemberDto.setState(imMultiRtcRoomMember.getState());
members.add(roomMemberDto);
}
}
for (String toClientId : param.getToClients()) {
ImClient toClient = imClientService.getCacheImClient(currentClient.getFkAppid(), toClientId);
if (toClient == null) {
log.info("查无接收人信息 {}", toClientId);
continue; continue;
} }
RoomMemberDto roomMemberDto = new RoomMemberDto();
roomMemberDto.setFkClientId(toClient.getId());
roomMemberDto.setClientId(toClient.getClientId());
roomMemberDto.setState(MultiRtcMemberStateEnum.CALLING.getCode());
members.add(roomMemberDto);
}
for (RoomMemberDto member : members) {
// ws向接收方发送通知 // ws向接收方发送通知
MultiMeetInviteResponse multiMeetInviteResponse = new MultiMeetInviteResponse(); MultiMeetInviteResponse multiMeetInviteResponse = new MultiMeetInviteResponse();
multiMeetInviteResponse.setConversationId(param.getConversationId()); multiMeetInviteResponse.setConversationId(param.getConversationId());
multiMeetInviteResponse.setRoomId(param.getRoomId()); multiMeetInviteResponse.setRoomId(param.getRoomId());
multiMeetInviteResponse.setClientId(currentClient.getClientId()); multiMeetInviteResponse.setClientId(currentClient.getClientId());
multiMeetInviteResponse.setTimestamp(System.currentTimeMillis()); multiMeetInviteResponse.setTimestamp(System.currentTimeMillis());
multiMeetInviteResponse.setMemberDtoList(members);
wsMultiMeetWrite.invite(multiMeetInviteResponse, receiver.getId()); wsMultiMeetWrite.invite(multiMeetInviteResponse, member.getFkClientId());
// TODO 待开发 下发安卓和ios系统推送 // TODO 待开发 下发安卓和ios系统推送
} }
......
-- 在feature-cluster 2021年12月22日之后,需要执行的的sql增量脚本 -- 在feature-cluster 2021年12月22日之后,需要执行的的sql增量脚本
...@@ -136,7 +136,8 @@ CREATE TABLE `im_multi_rtc_room_member` ...@@ -136,7 +136,8 @@ CREATE TABLE `im_multi_rtc_room_member`
( (
`id` bigint NOT NULL COMMENT '主键id', `id` bigint NOT NULL COMMENT '主键id',
`fk_rtc_room_id` bigint NOT NULL COMMENT 'im房间id', `fk_rtc_room_id` bigint NOT NULL COMMENT 'im房间id',
`client_id` bigint NOT NULL COMMENT '客户端id', `fk_client_id` bigint NOT NULL COMMENT 'client主键id',
`client_id` varchar(200) DEFAULT NULL COMMENT '客户方提供的唯一id',
`state` tinyint NOT NULL DEFAULT '1' COMMENT '房间成员状态,1:呼叫中,2:已接听,3:已拒绝,4:未接听,5:已断开', `state` tinyint NOT NULL DEFAULT '1' COMMENT '房间成员状态,1:呼叫中,2:已接听,3:已拒绝,4:未接听,5:已断开',
`create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间', `create_time` timestamp NULL DEFAULT NULL COMMENT '创建时间',
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment