zhangnaisong
2024-08-01 93cecfaf0fae080ebd0212adea714726290d0d4a
ard-work/src/main/java/com/ruoyi/utils/websocket/service/ChatServerEndpoint.java
@@ -1,26 +1,25 @@
package com.ruoyi.utils.websocket.service;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.app.position.domain.ArdAppPosition;
import com.ruoyi.app.position.service.IArdAppPositionService;
import com.ruoyi.app.position.service.impl.AppPositionPush;
import com.ruoyi.app.position.service.impl.AppPositionPushService;
import com.ruoyi.app.position.service.impl.ArdAppPositionServiceImpl;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.call.dto.CallMessage;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.utils.websocket.util.WebSocketUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static com.ruoyi.utils.websocket.util.WebSocketUtils.ONLINE_USER_SESSIONS;
/**
 * @ClassName ChatServerEndpoint
@@ -40,31 +39,64 @@
        String message = "用户[" + userId + "] 成功连接!";
        log.info("用户登录:" + message);
        WebSocketUtils.sendMessage(session, message);
        //region 旧方法
//        //每个用户连接时,启动初始所有app用户位置发送
//        AppPositionPush.initDataMap.put(userId,AppPositionPush.getAppPositionList());
//        AppPositionPush.initPushTask(userId,session,3000);
        //endregion
    }
    @OnMessage
    public void onMessage(@PathParam("userId") String userId, String message) {
        log.info("收到消息:" + message);
        Session session = WebSocketUtils.ONLINE_USER_SESSIONS.get(userId);
        WebSocketUtils.sendMessage(session, message);
//        sendMessageAll("用户[" + userid + "] : " + message);
        log.debug("收到消息:" + message);
        Map<String, Object> messageMap = JSONObject.parseObject(message, Map.class);
        if (messageMap.get("type")!=null &&messageMap.get("type").equals("callMessage")) {
            String msg = (String) messageMap.get("message");
            CallMessage callMessage = JSONObject.parseObject(msg, CallMessage.class);
            //单聊
            if (callMessage != null && callMessage.getType().equals(0)) {
                WebSocketUtils.sendMessagePrefix(callMessage.getTargetId(), message);
            }
            //群聊
            if (callMessage != null && callMessage.getType().equals(1)) {
                String step = callMessage.getStep();
                switch (step) {
                    case "joinRoom":
                        Set<String> userSet = WebSocketUtils.ROOM_USER_SET.getOrDefault(callMessage.getRoomId(), new HashSet<>());
                        userSet.add(callMessage.getUserId());
                        WebSocketUtils.ROOM_USER_SET.put(callMessage.getRoomId(), userSet);
                        WebSocketUtils.sendRoomMessage(callMessage.getRoomId(), message);
                        break;
                    case "inviteRoom":
                        List<String> targetIds = callMessage.getTargetIds();
                        targetIds.stream().forEach(targetId -> {
                            WebSocketUtils.sendMessagePrefix(targetId, message);
                        });
                        break;
                    case "leaveRoom":
                        userSet = WebSocketUtils.ROOM_USER_SET.getOrDefault(callMessage.getRoomId(), new HashSet<>());
                        if (userSet.size() > 0) {
                            userSet.remove(callMessage.getUserId());
                            WebSocketUtils.ROOM_USER_SET.put(callMessage.getRoomId(), userSet);
                            WebSocketUtils.sendRoomMessage(callMessage.getRoomId(), message);
                        }
                        break;
                    default:
                        WebSocketUtils.sendMessagePrefix(callMessage.getTargetId(), message);
                        break;
                }
            }
        }
        // 根据用户新的频率重新调整定时任务
        AppPositionPushService.messageHandler(userId,message);
        AppPositionPushService.messageHandler(userId, message);
    }
    @OnClose
    public void onClose(@PathParam("userId") String userId, Session session) {
        //当前的Session 移除
        WebSocketUtils.ONLINE_USER_SESSIONS.remove(userId);
        //并且通知其他人当前用户已经离开聊天室了
        String message = "用户[" + userId + "] 断开连接!";
        //sendMessage(session,message);
        log.info("消息:" + message);
        //从房间中移除用户
        WebSocketUtils.ROOM_USER_SET.values().stream().forEach(userSet -> userSet.remove(userId));
        try {
            session.close();
            AppPositionPushService.stopHandler(userId);
@@ -82,5 +114,4 @@
        }
        log.info("Throwable msg " + throwable.getMessage());
    }
}