Commit 5d05869f by Future

多人音视频邀请逻辑

parent 2f4650cf
......@@ -14,6 +14,7 @@ import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
......@@ -38,7 +39,7 @@ public class ImMultiMeetController extends BaseController {
*/
@PostMapping("/invite")
@ApiOperation(value = "邀请加入多人音视频会议", notes = "邀请加入多人音视频会议")
public ApiResult<Boolean> invite(@RequestBody InviteToMultiMeetParam param) {
public ApiResult<Boolean> invite(@Validated @RequestBody InviteToMultiMeetParam param) {
log.info("邀请加入多人音视频会议入参 {}", JSON.toJSONString(param));
if (CollectionUtils.isEmpty(param.getToClients())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
......
......@@ -33,6 +33,9 @@ public class ImMultiRtcRoomMember extends BaseEntity {
@ApiModelProperty("im房间id")
private Long fkRtcRoomId;
@ApiModelProperty("client主键id")
private Long fkClientId;
@ApiModelProperty("客户端id")
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;
import com.wecloud.multimeet.entity.dto.RoomMemberDto;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.List;
/**
* @Author wenzhida
......@@ -24,4 +26,9 @@ public class MultiMeetInviteResponse extends MultiMeetDataBase implements Serial
*/
private String roomId;
/**
* 成员列表dto
*/
private List<RoomMemberDto> memberDtoList;
}
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.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.InviteToMultiMeetParam;
import com.wecloud.im.param.LeaveFromMultiMeetParam;
import com.wecloud.im.param.RejectToMultiMeetParam;
import com.wecloud.im.param.rtc.CreateRtcChannelResult;
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.multimeet.entity.dto.RoomMemberDto;
import com.wecloud.multimeet.entity.response.MultiMeetAgreeResponse;
import com.wecloud.multimeet.entity.response.MultiMeetInviteResponse;
import com.wecloud.multimeet.entity.response.MultiMeetLeaveResponse;
......@@ -38,6 +51,12 @@ public class MultiMeetServiceImpl implements MultiMeetService {
@Autowired
private UserStateCacheManager userStateCacheManager;
@Autowired
private ImMultiRtcRoomService imMultiRtcRoomService;
@Autowired
private ImMultiRtcRoomMemberService imMultiRtcRoomMemberService;
@Override
public void invite(InviteToMultiMeetParam param) {
ImClient currentClient = imClientService.getCurrentClient();
......@@ -47,20 +66,54 @@ public class MultiMeetServiceImpl implements MultiMeetService {
log.info("发起方必须在线" + currentClient.getFkAppid() + currentClient.getClientId());
throw new BusinessException("发起方必须在线");
}
for (String toClient : param.getToClients()) {
ImClient receiver = imClientService.getCacheImClient(currentClient.getFkAppid(), toClient);
if (receiver == null) {
log.info("查无接收人信息 {}", toClient);
List<RoomMemberDto> members = Lists.newArrayList();
ImMultiRtcRoom rtcRoom = imMultiRtcRoomService.getOne(new QueryWrapper<ImMultiRtcRoom>().lambda()
.eq(ImMultiRtcRoom::getFkAppid, currentClient.getFkAppid())
.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;
}
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向接收方发送通知
MultiMeetInviteResponse multiMeetInviteResponse = new MultiMeetInviteResponse();
multiMeetInviteResponse.setConversationId(param.getConversationId());
multiMeetInviteResponse.setRoomId(param.getRoomId());
multiMeetInviteResponse.setClientId(currentClient.getClientId());
multiMeetInviteResponse.setTimestamp(System.currentTimeMillis());
wsMultiMeetWrite.invite(multiMeetInviteResponse, receiver.getId());
multiMeetInviteResponse.setMemberDtoList(members);
wsMultiMeetWrite.invite(multiMeetInviteResponse, member.getFkClientId());
// 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`
(
`id` bigint NOT NULL COMMENT '主键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:已断开',
`create_time` timestamp NULL DEFAULT NULL 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