Commit 2e18c987 by Shadow

Merge remote-tracking branch 'origin/xiaohudou_20220427' into xiaohudou_20220427

parents 4c876043 9b461cd7
......@@ -129,7 +129,7 @@
<dependency>
<groupId>com.wecloud</groupId>
<artifactId>pushserver-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<version>0.1.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.wecloud.imserver</groupId>
......
package com.wecloud.im.action;
import com.alibaba.fastjson.JSON;
import com.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.im.param.rtc.*;
import com.wecloud.im.sdk.enums.CallTypeEnum;
import com.wecloud.im.service.ImRtcRecordService;
import com.wecloud.im.vo.MissedRtcRecordVO;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.rtc.service.RtcService;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.im.param.rtc.CandidateForwardParam;
import com.wecloud.im.param.rtc.CreateRtcChannelParam;
import com.wecloud.im.param.rtc.CreateRtcChannelResult;
import com.wecloud.im.param.rtc.JoinRtcChannelParam;
import com.wecloud.im.param.rtc.LeaveRtcChannelParam;
import com.wecloud.im.param.rtc.RejectRtcChannelParam;
import com.wecloud.im.param.rtc.SdpForwardParam;
import com.wecloud.im.sdk.enums.CallTypeEnum;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.rtc.service.RtcService;
import java.util.Map;
@Slf4j
@Component
......@@ -33,6 +27,9 @@ public class RtcAction {
@Autowired
private RtcService rtcService;
@Autowired
private ImRtcRecordService rtcRecordService;
/**
* 创建频道,并邀请客户端加入
*/
......@@ -86,4 +83,11 @@ public class RtcAction {
rtcService.candidateForward(data);
return WsResponse.ok();
}
@ApiOperation("未接音视频")
@ActionMapping("/missedConversation")
public WsResponse<MissedRtcRecordVO> missedConversation(String userId){
MissedRtcRecordVO missedRtcRecord = rtcRecordService.getMissedRtcRecord(userId);
return WsResponse.ok(missedRtcRecord);
}
}
......@@ -5,16 +5,14 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wecloud.im.entity.ImRtcRecord;
import com.wecloud.im.param.rtc.SingleRtcRecordParam;
import com.wecloud.im.service.ImRtcRecordService;
import com.wecloud.im.vo.MissedRtcRecordVO;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
/**
* @author nanqianhao
......@@ -37,4 +35,17 @@ public class ImRtcRecordController extends BaseController {
return ApiResult.ok(rtcRecordService.getPageImRtcRecords(singleRtcRecordParam));
}
@ApiOperation("未接音视频")
@GetMapping("/missedConversation")
ApiResult<MissedRtcRecordVO> missedConversation(@RequestParam("userId") String userId){
MissedRtcRecordVO missedRtcRecord = rtcRecordService.getMissedRtcRecord(userId);
// 如果没有记录 则状态为4
if (missedRtcRecord==null){
MissedRtcRecordVO missedRtcRecordVO = new MissedRtcRecordVO();
missedRtcRecordVO.setState(4);
return ApiResult.ok(missedRtcRecordVO);
}
return ApiResult.ok(missedRtcRecord);
}
}
......@@ -5,6 +5,7 @@ import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImRtcRecord;
import com.wecloud.im.param.rtc.CreateRtcChannelParam;
import com.wecloud.im.param.rtc.SingleRtcRecordParam;
import com.wecloud.im.vo.MissedRtcRecordVO;
import io.geekidea.springbootplus.framework.common.service.BaseService;
/**
......@@ -34,4 +35,10 @@ public interface ImRtcRecordService extends BaseService<ImRtcRecord> {
* 获取通话记录
*/
Page<ImRtcRecord> getPageImRtcRecords(SingleRtcRecordParam singleRtcRecordParam);
/**
* 获取应用后台下未接受的音视频通话
*/
MissedRtcRecordVO getMissedRtcRecord(String userId);
}
package com.wecloud.im.service.impl;
import com.wecloud.im.post.MessageBuilder;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
......@@ -273,6 +274,14 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
eventPublisher.publishEvent(new ClientSendMessageEvent(imApplication.getId(), messageById));
// 组装消息
Map<String, Object> content = new HashMap<>();
content.put("operator", imClientSender.getClientId());
content.put("beOperatedMsgId", imMsgRecall.getMsgId());
content.put("msgOwner", msgOwner.getClientId());
ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.MSG_WITHDRAW, imApplication,
imClientSender, new ImConversation().setId(messageById.getFkConversationId()), JsonUtils.encodeJson(content));
this.save(imMessage);
if (saveOk) {
// 查询该会话所有成员
......@@ -373,6 +382,15 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
throw new BusinessException("未查找到消息发送者");
}
// 组装消息
Map<String, Object> content = new HashMap<>();
content.put("operator", imClientSender.getClientId());
content.put("beOperatedMsgId", message.getId());
content.put("msgOwner", msgOwner.getClientId());
ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.MSG_DELETE, imApplication,
imClientSender, new ImConversation().setId(message.getFkConversationId()), JsonUtils.encodeJson(content));
this.save(imMessage);
if (saveOk) {
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
......
......@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImRtcRecord;
import com.wecloud.im.mapper.ImRtcRecordMapper;
......@@ -11,15 +12,20 @@ import com.wecloud.im.param.rtc.CreateRtcChannelParam;
import com.wecloud.im.param.rtc.SingleRtcRecordParam;
import com.wecloud.im.sdk.enums.RtcStateEnum;
import com.wecloud.im.sdk.enums.SingleRtcOperateTypeEnum;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImRtcRecordService;
import com.wecloud.im.vo.MissedRtcRecordVO;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
......@@ -32,6 +38,9 @@ import java.util.Date;
@Service
public class ImRtcRecordServiceImpl extends BaseServiceImpl<ImRtcRecordMapper, ImRtcRecord> implements ImRtcRecordService {
@Autowired
private ImClientService imClientService;
@Async
@Override
public void createRtcRecord(CreateRtcChannelParam param, Long channelId, ImClient currentClient) {
......@@ -111,5 +120,28 @@ public class ImRtcRecordServiceImpl extends BaseServiceImpl<ImRtcRecordMapper, I
return page;
}
@Override
public MissedRtcRecordVO getMissedRtcRecord(String userId) {
ImClient currentClient = imClientService.getCacheImClient(SecurityUtils.getCurrentAppId(), userId);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 1);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ImRtcRecord missRtcRecord = this.getOne(new LambdaQueryWrapper<ImRtcRecord>()
.eq(ImRtcRecord::getFkAppid, currentClient.getFkAppid())
.in(ImRtcRecord::getState, Lists.newArrayList(RtcStateEnum.CREATED.getCode(), RtcStateEnum.ING.getCode()))
.eq(ImRtcRecord::getToClientId, currentClient.getClientId())
.between(ImRtcRecord::getCreateTime, df.format(calendar.getTime()), df.format(new Date()))
);
if (missRtcRecord != null) {
MissedRtcRecordVO missedRtcRecordVo = new MissedRtcRecordVO();
missedRtcRecordVo.setState(missRtcRecord.getState());
missedRtcRecordVo.setCallType(missRtcRecord.getCallType());
missedRtcRecordVo.setFromClientId(missRtcRecord.getFromClientId());
missedRtcRecordVo.setChannelId(missRtcRecord.getChannelId());
return missedRtcRecordVo;
} else {
return null;
}
}
}
package com.wecloud.im.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author nanqianhao
* @date 2022/6/16
* @apiNote
*/
@Data
@ApiModel(value = "未接音视频记录返回对象")
public class MissedRtcRecordVO implements Serializable {
private static final long serialVersionUID = 5095229246261665876L;
@ApiModelProperty("频道id")
private Long channelId;
@ApiModelProperty("发起方clientId")
private String fromClientId;
@ApiModelProperty(value = "音视频类型: 1-video或2-voice")
private Integer callType;
@ApiModelProperty("频道状态,1:音视频发起,2:音视频中,3:音视频结束, 4:没有记录")
private Integer state;
}
package com.wecloud.rtc.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.google.common.collect.Lists;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImRtcRecord;
......@@ -12,6 +14,7 @@ import com.wecloud.im.param.rtc.JoinRtcChannelParam;
import com.wecloud.im.param.rtc.LeaveRtcChannelParam;
import com.wecloud.im.param.rtc.RejectRtcChannelParam;
import com.wecloud.im.param.rtc.SdpForwardParam;
import com.wecloud.im.sdk.enums.RtcStateEnum;
import com.wecloud.im.sdk.enums.SingleRtcOperateTypeEnum;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientBlacklistService;
......@@ -95,15 +98,19 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
public CreateRtcChannelResult createAndCall(CreateRtcChannelParam createRtcChannelParam) {
ImClient currentClient = imClientService.getCurrentClient();
Long rtcChannelId = SnowflakeUtil.getId();
// 判断发起方必须在线
boolean onlineStatus = userStateCacheManager.isOnline(currentClient.getId());
if (!onlineStatus) {
log.info("发起方必须在线" + currentClient.getFkAppid() + currentClient.getClientId());
ApiResult.fail();
}
ImClient toClient = imClientService.getCacheImClient(currentClient.getFkAppid(), createRtcChannelParam.getToClient());
if (toClient == null) {
ApiResult.fail();
throw new BusinessException("查无接收人信息");
}
ImRtcRecord imRtcRecord = imRtcRecordService.getOne(new LambdaQueryWrapper<ImRtcRecord>()
.eq(ImRtcRecord::getFkAppid, currentClient.getFkAppid())
.in(ImRtcRecord::getState, Lists.newArrayList(RtcStateEnum.CREATED.getCode(), RtcStateEnum.ING.getCode()))
.and(o -> o.eq(ImRtcRecord::getToClientId, toClient.getClientId())
.or()
.eq(ImRtcRecord::getFromClientId, toClient.getClientId()))
);
if (imRtcRecord != null) {
throw new BusinessException("对方忙线中");
}
// 拉黑逻辑
black(currentClient, toClient);
......
......@@ -187,4 +187,9 @@ public class ResourcePathConstants {
public static final String ADD_OR_MODIFY_CONVERSATION_ATTRIBUTE_REQUEST = "/api/conversation/sdk" +
"/addOrModifyAttribute";
/**
* 后台状态下未接到音视频判断
*/
public static final String GET_MISSED_RTCRECORD="/api/rtcRecord/missedConversation";
}
package com.wecloud.im.sdk;
import com.wecloud.im.sdk.model.*;
import java.util.List;
import java.util.Map;
import com.wecloud.im.sdk.model.Attributes;
import com.wecloud.im.sdk.model.Blacklist;
import com.wecloud.im.sdk.model.ChatRoomMember;
import com.wecloud.im.sdk.model.ClientRelation;
import com.wecloud.im.sdk.model.Conversation;
import com.wecloud.im.sdk.model.CreateConversation;
import com.wecloud.im.sdk.model.Friend;
import com.wecloud.im.sdk.model.GroupChatMessage;
import com.wecloud.im.sdk.model.GroupChatStatusMessage;
import com.wecloud.im.sdk.model.GroupSettingParam;
import com.wecloud.im.sdk.model.ImClient;
import com.wecloud.im.sdk.model.ImRtcRecord;
import com.wecloud.im.sdk.model.PageResult;
import com.wecloud.im.sdk.model.PrivateChatMessage;
import com.wecloud.im.sdk.model.PrivateChatStatusMessage;
import com.wecloud.im.sdk.model.RtcRecord;
import com.wecloud.im.sdk.model.SingleUserNotification;
import com.wecloud.im.sdk.model.Token;
import com.wecloud.im.sdk.model.UnsureFriend;
/**
*
* @Author luozh
......@@ -412,4 +395,13 @@ public interface WecloudIm {
* @Return
*/
Boolean singleUserNotification(SingleUserNotification singleUserNotification);
/**
* 后台状态下未接到音视频判断
* @Author nanqianhao
* @Date 2022年05月25日 09:36:47
* @param
* @Return
*/
MissedRtcRecord getMissedRtcRecord(String UserId);
}
package com.wecloud.im.sdk;
import java.net.URL;
import java.util.List;
import java.util.Map;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import com.wecloud.im.sdk.internal.WecloudImContactsOperation;
import com.wecloud.im.sdk.internal.WecloudImConversationOperation;
import com.wecloud.im.sdk.internal.WecloudImGroupOperation;
import com.wecloud.im.sdk.internal.WecloudImMessageOperation;
import com.wecloud.im.sdk.internal.WecloudImRtcRecordOperation;
import com.wecloud.im.sdk.internal.WecloudImSystemNotificationOperation;
import com.wecloud.im.sdk.internal.WecloudImUserOperation;
import com.wecloud.im.sdk.internal.*;
import com.wecloud.im.sdk.model.*;
import java.net.URL;
import java.util.List;
import java.util.Map;
/**
*
* @Author luozh
......@@ -365,6 +358,14 @@ public class WecloudImClient implements WecloudIm {
return imSystemNotificationOperation.singleUserNotification(singleUserNotificationRequest);
}
@Override
public MissedRtcRecord getMissedRtcRecord(String UserId) {
MissedRtcRecordParam missedRtcRecordParam =
MissedRtcRecordParam.builder().userId(UserId).build();
return imRtcRecordOperation.getMissedRtcRecord(missedRtcRecordParam);
}
private void initOperations() {
this.imUserOperation = new WecloudImUserOperation(apiDomain, appKey, appSecret);
this.imConversationOperation = new WecloudImConversationOperation(apiDomain, appKey, appSecret);
......
package com.wecloud.im.sdk.internal;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.wecloud.im.sdk.common.HttpMethod;
import com.wecloud.im.sdk.common.RequestMessage;
import com.wecloud.im.sdk.model.ImRtcRecord;
import com.wecloud.im.sdk.model.PageResult;
import com.wecloud.im.sdk.model.RtcRecordRequest;
import com.wecloud.im.sdk.model.*;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import static com.wecloud.im.sdk.ResourcePathConstants.GET_MISSED_RTCRECORD;
import static com.wecloud.im.sdk.ResourcePathConstants.LIST_RTC_RECORDS_REQUEST;
/**
......@@ -58,4 +57,22 @@ public class WecloudImRtcRecordOperation extends WecloudImOperation {
PageResult<ImRtcRecord> rtcRecords = JSON.parseObject(JSON.toJSONString(result), typeReference);
return rtcRecords;
}
public MissedRtcRecord getMissedRtcRecord(MissedRtcRecordParam missedRtcRecordParam){
Map<String, Object> param = new HashMap<>();
param.put("userId",missedRtcRecordParam.getUserId()+"");
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(GET_MISSED_RTCRECORD)
.setMethod(HttpMethod.GET).setParameters(param)
.setOriginalRequest(missedRtcRecordParam).build();
Object result = doOperation(request);
TypeReference<MissedRtcRecord> typeReference = new TypeReference<MissedRtcRecord>() {
};
MissedRtcRecord rtcRecords = JSON.parseObject(JSON.toJSONString(result), typeReference);
return rtcRecords;
}
}
package com.wecloud.im.sdk.model;
import lombok.Data;
import java.io.Serializable;
/**
* @author nanqianhao
* @date 2022/6/16
* @apiNote
*/
@Data
public class MissedRtcRecord implements Serializable {
private static final long serialVersionUID = -4276311990569662993L;
private Long channelId;
private String fromClientId;
private Integer callType;
private Integer state;
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
/**
* @author nanqianhao
* @date 2022/6/16
* @apiNote
*/
@Getter
@Setter
@Builder
public class MissedRtcRecordParam extends WebServiceRequest{
/**
* 用户id
*/
private String userId;
}
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