diff --git a/ruoyi-cai/pom.xml b/ruoyi-cai/pom.xml
index 601f539e..22e3e5d1 100644
--- a/ruoyi-cai/pom.xml
+++ b/ruoyi-cai/pom.xml
@@ -26,5 +26,15 @@
com.ruoyi
ruoyi-system
+
+ com.alibaba
+ fastjson
+ 2.0.19
+
+
+ com.ruoyi
+ ruoyi-websocket
+ 4.8.2
+
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/chat/ChatManager.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/chat/ChatManager.java
index 1e9dd1de..a1d2f7c6 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/chat/ChatManager.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/chat/ChatManager.java
@@ -14,6 +14,7 @@ import com.ruoyi.cai.service.CaiAnchorService;
import com.ruoyi.cai.service.CaiGuardTotalService;
import com.ruoyi.cai.service.CaiUserCallService;
import com.ruoyi.cai.service.CaiUserService;
+import com.ruoyi.cai.ws.bean.Room;
import com.ruoyi.cai.ws.manager.WebSocketManager;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.helper.LoginHelper;
@@ -58,10 +59,11 @@ public class ChatManager {
if(anchor == null){
throw new ServiceException("主播技能不存在");
}
- String roomId = webSocketManager.checkOnlineRoom(fromUser.getId(), toUser.getId());
- if(StringUtils.isEmpty(roomId)){
+ String roomId = null;
+ Room room = webSocketManager.checkOnlineRoom(fromUser.getId(), toUser.getId());
+ if(room == null){
CaiUserCall call = userCallService.createCall(fromUser, toUser, anchor);
- roomId = webSocketManager.createRoom(call.getId());
+ roomId = webSocketManager.createRoom(call.getId()+"");
}
String weSocketUrl = String.format(properties.getWebSocketUrl(),"token",roomId);
Long guardPrice = systemConfigManager.getSystemConfigOfLong(SystemConfigEnum.GUARD_PRICE);
@@ -96,11 +98,10 @@ public class ChatManager {
if(!userCall.getFromUid().equals(userId) && !userCall.getToUid().equals(userId)){
throw new ServiceException("无权限操作房间");
}
- String roomIdNew = webSocketManager.checkOnlineRoom(userCall.getFromUid(), userCall.getToUid());
- if (StringUtils.isNotEmpty(roomIdNew)) {
- throw new ServiceException("'服务繁忙'");
+ Room room = webSocketManager.checkOnlineRoom(userCall.getFromUid(), userCall.getToUid());
+ if (room == null) {
+ throw new ServiceException("'对方已取消通话'");
}
- // 判断房间号是否还存在 TODO
List userList = userService.listByIds(Arrays.asList(userCall.getFromUid(), userCall.getToUid()));
Map userMap = userList.stream().collect(Collectors.toMap(CaiUser::getId, Function.identity()));
CaiUser fromUser = userMap.get(userCall.getFromUid());
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserCall.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserCall.java
index e31a07ab..08def435 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserCall.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/domain/CaiUserCall.java
@@ -45,6 +45,7 @@ public class CaiUserCall implements Serializable {
* 结束通话时间
*/
private LocalDateTime endTime;
+ private String skillName;
/**
* 通话时长
*/
@@ -85,6 +86,8 @@ public class CaiUserCall implements Serializable {
* 接收者-工会-视频比例
*/
private BigDecimal receiverUnionVideoDivide;
+ private Boolean receiverUnionGet;
+ private Boolean receiverInviteGet;
/**
* 接收者-邀请人
*/
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiAnchorService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiAnchorService.java
index 0ffafaa9..fd0636e6 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiAnchorService.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiAnchorService.java
@@ -21,4 +21,6 @@ public interface CaiAnchorService extends IService {
Page pageApp(PageQuery pageQuery, AnchorListQuery query);
CaiAnchor getByUserId(Long userId);
+
+ void updateVideoStatus(Long userId, int videoStatus);
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserService.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserService.java
index 98d526fb..9831e0e2 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserService.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/CaiUserService.java
@@ -29,4 +29,6 @@ public interface CaiUserService extends IService {
UserInfoVo info(Long userId);
CaiUser getByUserCode(String userCode);
+
+ void updateVideoStatus(Long userId, int videoStatus);
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiAnchorServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiAnchorServiceImpl.java
index 07c00fa7..ab60b68e 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiAnchorServiceImpl.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiAnchorServiceImpl.java
@@ -7,6 +7,7 @@ import com.ruoyi.cai.domain.CaiAnchor;
import com.ruoyi.cai.dto.admin.vo.CaiAnchorAdminVo;
import com.ruoyi.cai.dto.app.query.AnchorListQuery;
import com.ruoyi.cai.dto.app.vo.AnchorListVo;
+import com.ruoyi.cai.dto.app.vo.AnchorVo;
import com.ruoyi.cai.mapper.CaiAnchorMapper;
import com.ruoyi.cai.service.CaiAnchorService;
import com.ruoyi.common.core.domain.PageQuery;
@@ -40,4 +41,11 @@ public class CaiAnchorServiceImpl extends ServiceImpl
public CaiAnchor getByUserId(Long userId){
return this.getOne(Wrappers.lambdaQuery(CaiAnchor.class).eq(CaiAnchor::getUserId,userId));
}
+
+ @Override
+ public void updateVideoStatus(Long userId, int videoStatus) {
+ this.update(Wrappers.lambdaUpdate(CaiAnchor.class)
+ .eq(CaiAnchor::getUserId,userId)
+ .set(CaiAnchor::getVideoStatus,videoStatus));
+ }
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserServiceImpl.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserServiceImpl.java
index 2072f272..b33cbc36 100644
--- a/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserServiceImpl.java
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/service/impl/CaiUserServiceImpl.java
@@ -95,4 +95,11 @@ public class CaiUserServiceImpl extends ServiceImpl impl
public CaiUser getByUserCode(String userCode){
return this.getOne(Wrappers.lambdaQuery(CaiUser.class).eq(CaiUser::getUsercode,userCode).last("limit 1"));
}
+
+ @Override
+ public void updateVideoStatus(Long userId, int videoStatus) {
+ this.update(Wrappers.lambdaUpdate(CaiUser.class)
+ .eq(CaiUser::getId,userId)
+ .set(CaiUser::getVideoStatus,videoStatus));
+ }
}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/CallerRoom.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/CallerRoom.java
new file mode 100644
index 00000000..108a0524
--- /dev/null
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/CallerRoom.java
@@ -0,0 +1,4 @@
+package com.ruoyi.cai.ws.bean;
+
+public class CallerRoom {
+}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/FdCtxData.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/FdCtxData.java
new file mode 100644
index 00000000..733aaed2
--- /dev/null
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/FdCtxData.java
@@ -0,0 +1,14 @@
+package com.ruoyi.cai.ws.bean;
+
+import lombok.Data;
+
+@Data
+public class FdCtxData {
+
+ private String sessionKey;
+ private String roomId;
+ private Long userId;
+ private Integer userType;
+ private Long tarUserId;
+ private Integer tarUserType;
+}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/Room.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/Room.java
new file mode 100644
index 00000000..e9a5a22b
--- /dev/null
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/Room.java
@@ -0,0 +1,34 @@
+package com.ruoyi.cai.ws.bean;
+
+import com.ruoyi.cai.ws.constant.HangUpEnums;
+import com.ruoyi.cai.ws.constant.RoomStatusEnums;
+import com.ruoyi.cai.ws.service.CheckConnectionDTO;
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class Room {
+
+ private RoomData roomData;
+ private UserData callUserData;
+ private UserData receiverUserData;
+
+ public String getRoomId(){
+ return roomData.getRoomId();
+ }
+
+ public Integer getStatus(){
+ return roomData.getStatus();
+ }
+
+ public boolean isCanCall(){
+ return RoomStatusEnums.isCanCall(roomData.getStatus());
+ }
+
+ public boolean isOnline() {
+ return RoomStatusEnums.STATUS_AGREE.getCode().equals(roomData.getStatus());
+ }
+
+}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/RoomData.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/RoomData.java
new file mode 100644
index 00000000..9363a282
--- /dev/null
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/RoomData.java
@@ -0,0 +1,15 @@
+package com.ruoyi.cai.ws.bean;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class RoomData {
+ private String roomId;
+ private Long callPrice;
+ private String skillName;
+ private Integer status;
+ private BigDecimal videoDivide;
+ private Long hangUpTime;
+}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/UserData.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/UserData.java
new file mode 100644
index 00000000..0373be91
--- /dev/null
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/bean/UserData.java
@@ -0,0 +1,21 @@
+package com.ruoyi.cai.ws.bean;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class UserData {
+ private Long id;
+ private String roomId;
+ private int userType;
+ private String nickname;
+ private String userCode;
+ private Long inviterId;
+ private BigDecimal inviterRate;
+ private Boolean inviterIsGet;
+
+ private Long unionUserId;
+ private BigDecimal unionUserRate;
+ private Boolean unionIsGet;
+}
diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/cache/CallerRoomCache.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/cache/CallerRoomCache.java
new file mode 100644
index 00000000..56e6cf88
--- /dev/null
+++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/ws/cache/CallerRoomCache.java
@@ -0,0 +1,41 @@
+package com.ruoyi.cai.ws.cache;
+
+import com.ruoyi.cai.ws.constant.RedisConstant;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class CallerRoomCache {
+ @Autowired
+ private StringRedisTemplate redisTemplate;
+
+ public String getKey(Long fromUserId){
+ return String.format(RedisConstant.CALLER_ROOM_DATA,fromUserId);
+ }
+
+ public String getRoomId(Long fromUserId, Long toUserId){
+ String key = getKey(fromUserId);
+ Object roomId = redisTemplate.opsForHash().get(key, toUserId);
+ return roomId == null ? null : String.valueOf(roomId);
+ }
+
+ public void addRoom(Long fromUid, Long toUid, Long roomId) {
+ String key = getKey(fromUid);
+ redisTemplate.opsForHash().put(key,toUid,roomId);
+ redisTemplate.expire(key,7, TimeUnit.DAYS);
+ }
+
+ public Map