This commit is contained in:
77
2024-05-21 11:19:46 +08:00
parent 5dc1ca2521
commit 640aa3237e
13 changed files with 101 additions and 20 deletions

View File

@@ -0,0 +1,7 @@
package com.ruoyi.cai.constant;
public class CommonConstant {
public static final String CITY = "北京";
public static final Integer CITY_ID = 110100;
}

View File

@@ -21,7 +21,6 @@ public class AmqpWsProducer {
});
}
@Deprecated
public void sendRoomSettleDelay(String message, Integer timeout){
rabbitTemplate.convertAndSend(RoomSettleDelayWsMqConstant.EXCHANGE_NAME,
RoomSettleDelayWsMqConstant.ROUTING_KEY,

View File

@@ -149,7 +149,7 @@ public class DynamicServiceImpl extends ServiceImpl<DynamicMapper, Dynamic> impl
List<DynamicAddReq.DynamicImageAddReq> imageList = res.getImageList();
if(CollectionUtil.isNotEmpty(imageList)){
for (DynamicAddReq.DynamicImageAddReq imageVo : imageList) {
CaiFileUtils.FileSize fileSize = CaiFileUtils.getFileSize(imageVo.getUrl());
CaiFileUtils.FileSize fileSize = CaiFileUtils.getFastFileSize(imageVo.getUrl());
DynamicImages po = new DynamicImages();
po.setUserId(dynamic.getUserId());
po.setDynamicId(dynamic.getId());

View File

@@ -20,6 +20,10 @@ public class CaiFileUtils {
private static String BASE_URL = "https://nono-1257812345.cos.ap-shanghai.myqcloud.com/";
public static FileSize getFastFileSize(String url){
return new FileSize();
}
public static FileSize getFileSize(String url){
FileSize fileSize = new FileSize();
String suffix = StringUtils.substring(url, url.lastIndexOf("."), url.length());
@@ -36,6 +40,5 @@ public class CaiFileUtils {
log.error("获取文件图片大小失败",e);
}
return new FileSize();
}
}

View File

@@ -4,9 +4,12 @@ import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.cai.domain.UserCall;
import com.ruoyi.cai.notice.YunxinWsServiceV2;
import com.ruoyi.cai.service.AnchorService;
import com.ruoyi.cai.service.UserCallService;
import com.ruoyi.cai.service.UserService;
import com.ruoyi.cai.ws.bean.FdCtxData;
import com.ruoyi.cai.ws.bean.Room;
import com.ruoyi.cai.ws.bean.UserData;
import com.ruoyi.cai.ws.constant.HangUpEnums;
import com.ruoyi.cai.ws.constant.RoomStatusEnums;
import com.ruoyi.cai.ws.dto.WsRMsgGen;
@@ -28,6 +31,10 @@ public class CancelMessageHandler extends AbstractMessageHandle implements IMess
private RoomService roomService;
@Autowired
private YunxinWsServiceV2 yunxinWsService;
@Autowired
private UserService userService;
@Autowired
private AnchorService anchorService;
@Override
public void processOn(Room room, FdCtxData fdCtxData, JSONObject map) {
@@ -54,6 +61,12 @@ public class CancelMessageHandler extends AbstractMessageHandle implements IMess
userCallService.update(Wrappers.lambdaUpdate(UserCall.class)
.eq(UserCall::getId,roomId)
.set(UserCall::getStatus,RoomStatusEnums.STATUS_CALLER_CANCEL.getCode()));
// 释放主播的接听状态
UserData receiverUserData = room.getReceiverUserData();
if(receiverUserData != null && receiverUserData.getConnectTime() != null && receiverUserData.getConnectTime() > 0){
userService.updateVideoStatus(receiverId,0);
anchorService.updateVideoStatus(receiverId,0);
}
}
}

View File

@@ -4,9 +4,12 @@ import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.cai.domain.UserCall;
import com.ruoyi.cai.notice.YunxinWsServiceV2;
import com.ruoyi.cai.service.AnchorService;
import com.ruoyi.cai.service.UserCallService;
import com.ruoyi.cai.service.UserService;
import com.ruoyi.cai.ws.bean.FdCtxData;
import com.ruoyi.cai.ws.bean.Room;
import com.ruoyi.cai.ws.bean.UserData;
import com.ruoyi.cai.ws.constant.HangUpEnums;
import com.ruoyi.cai.ws.constant.RoomStatusEnums;
import com.ruoyi.cai.ws.dto.WsRMsgGen;
@@ -28,6 +31,10 @@ public class RefuseMessageHandler extends AbstractMessageHandle implements IMess
private UserCallService userCallService;
@Autowired
private YunxinWsServiceV2 yunxinWsService;
@Autowired
private UserService userService;
@Autowired
private AnchorService anchorService;
@Override
public void processOn(Room room, FdCtxData fdCtxData, JSONObject map) {
@@ -46,11 +53,16 @@ public class RefuseMessageHandler extends AbstractMessageHandle implements IMess
Long receiverId = room.getReceiverId();
Long callerId = room.getCallId();
yunxinWsService.sendToCallNotify(callerId,receiverId, CallNoticeEnum.REFUSE,0L);
// 更新房间状态
userCallService.update(Wrappers.lambdaUpdate(UserCall.class)
.eq(UserCall::getId,room.getRoomId())
.set(UserCall::getStatus,RoomStatusEnums.STATUS_REFUSE.getCode()));
// 释放主播的接听状态
UserData receiverUserData = room.getReceiverUserData();
if(receiverUserData != null && receiverUserData.getConnectTime() != null && receiverUserData.getConnectTime() > 0){
userService.updateVideoStatus(receiverId,0);
anchorService.updateVideoStatus(receiverId,0);
}
}

View File

@@ -28,7 +28,9 @@ public class WebSocketSessionHolder {
}
public static void addSession(String sessionKey, WebSocketSession session,Long userId) {
log.info("收到sessionId={} userId={}",sessionKey, userId);
Object roomIdObj = session.getAttributes().get("room_id");
String roomId = String.valueOf(roomIdObj);
log.info("收到sessionId={} roomId={} userId={}",sessionKey, roomId, userId);
USER_SESSION_MAP.put(sessionKey, session);
if(USER_SESSION_ID_MAP.containsKey(userId)){ // T人动作
String sessionKeyOld = USER_SESSION_ID_MAP.get(userId);
@@ -37,10 +39,11 @@ public class WebSocketSessionHolder {
if(webSocketSession != null){
if(webSocketSession.isOpen()){
try {
log.info("检测到该用户存在历史的sessionId={} userId={} 清理掉",sessionKey, userId);
log.info("检测到该用户存在历史的sessionId={} roomId={} userId={} 清理掉",sessionKey, roomId, userId);
webSocketSession.close(new CloseStatus(500100));
} catch (IOException e) {
// ignore
log.error("关闭房间失败",e);
}
}
removeSession(sessionKeyOld);

View File

@@ -191,12 +191,6 @@ public class RoomService {
userService.updateVideoStatus(receiverId,0);
anchorService.updateVideoStatus(receiverId,0);
}
// 声网踢人
if(room.getRoomData().getBeginTime() != null && room.getRoomData().getBeginTime() > 0){
ExecutorConstant.ROOM_EXECUTOR.execute(() -> {
agora.closeChannel(roomId);
});
}
// 修改释放状态
Map<String,Object> map = new HashMap<>();
map.put("releaseRes",true);

View File

@@ -4,10 +4,12 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.ruoyi.cai.dto.video.VideoSettleResp;
import com.ruoyi.cai.dto.video.WithholdingFeeUserResp;
import com.ruoyi.cai.executor.ExecutorConstant;
import com.ruoyi.cai.manager.ConsumerManager;
import com.ruoyi.cai.manager.LockManager;
import com.ruoyi.cai.notice.YunxinWsServiceV2;
import com.ruoyi.cai.service.AccountService;
import com.ruoyi.cai.trd.Agora;
import com.ruoyi.cai.ws.bean.Room;
import com.ruoyi.cai.ws.cache.OnlineDataCache;
import com.ruoyi.cai.ws.cache.RoomCtxCache;
@@ -45,6 +47,8 @@ public class SettleService {
private RoomCtxCache roomCtxCache;
@Autowired
private RedissonClient redissonClient;
@Autowired
private Agora agora;
/**
@@ -62,17 +66,18 @@ public class SettleService {
Long userId = room.getCallUserData().getId();
Integer price = room.getRoomData().getCallPrice();
settleService.withholdingFeeUser(userId,Long.valueOf(price),room);
log.info("roomId={} 拨打方 1分钟扣分成功",roomId);
// 给双方推送可通话时长
try {
Long time = roomService.canCallTime(room);
List<String> keys = roomCtxCache.getSessionKeysByRoomId(roomId);
RoomWebSocketUtil.sendSendMessage(keys, WsRMsgGen.canCallTime(time));
}catch (Exception e){
log.error("扣费后-推送可通话时长失败!",e);
log.error("roomId={} 扣费后-推送可通话时长失败!",roomId, e);
}
return true;
}catch (Exception e){
log.error("预扣费失败!准备挂断电话",e);
log.error("roomId={} 预扣费失败!准备挂断电话",roomId,e);
boolean b = roomService.hangUp(room.getRoomId());
if(b){
// 结算操作
@@ -140,23 +145,30 @@ public class SettleService {
* @param room
*/
private SettleResp deal(Room room){
if(room.isCanCall()){ // 正在通话中,无需在结算
if(room.isCanCall()){
log.info("roomId={} 房间正在通话中,无需结算",room.getRoomId());
return SettleResp.builder().nextRun(true).build();
}
if(room.isSettle()){ // 已经结算了,无需结算
if(room.isSettle()){
log.info("roomId={} 已经结算了,无需结算",room.getRoomId());
return SettleResp.builder().nextRun(false).build();
}
if(!room.isReleaseRes()){ // 房间资源是否已经释放
roomService.releaseRes(room.getRoomId()); // 释放房间会更新用户和主播的状态
}
Long roomId = room.getRoomId();
// 未通话,无需结算
VideoSettleResp resp = new VideoSettleResp();
if(room.getRoomData().getBeginTime() == null){
roomDataCache.hMSet(roomId,"settleTime", DateUtil.currentSeconds());
}else{
resp = consumerManager.videoSettle(room);
}
// 声网踢人
if(room.getRoomData().getBeginTime() != null && room.getRoomData().getBeginTime() > 0){
ExecutorConstant.ROOM_EXECUTOR.execute(() -> {
agora.closeChannel(roomId);
});
}
// 修改房间缓存
Map<String,Object> map = new HashMap<>();
map.put("payCoin",resp.getPayCoin());