Browse Source

附近的人聊天,点对点发送,区别出诊问诊群组聊天

udream-cxs 4 năm trước cách đây
mục cha
commit
298890d7f4

+ 2 - 2
lift-ud-service/pom.xml

@@ -18,10 +18,10 @@
             <groupId>cn.com.xwy</groupId>
             <artifactId>xwy-spring-boot</artifactId>
         </dependency>
-        <!--<dependency>
+        <dependency>
               <groupId>cn.com.xwy</groupId>
               <artifactId>xwy-cloud-dependencies</artifactId>
-        </dependency>-->
+        </dependency>
 
         <!-- swagger -->
         <dependency>

+ 2 - 4
lift-ud-service/src/main/java/cn/com/ty/lift/ud/chat/service/impl/ChatSessionServiceImpl.java

@@ -125,8 +125,7 @@ public class ChatSessionServiceImpl extends ServiceImpl<ChatSessionMapper, ChatS
     public RestResponse createPrivateChatRoom(ChatSessionQuery request) {
         ChatSessionVo vo = new ChatSessionVo();
         // 使用我的用户id和将要聊天的用户id正反去数据库查询房间号是否存在
-        String sessionId =
-            sessionMapper.findOneByUserIdAndCreateUserIdAndDateTable(request.getUserId(), request.getCreateUserId(), 3);
+        String sessionId = sessionMapper.findOneByUserIdAndCreateUserIdAndDateTable(request.getUserId(), request.getCreateUserId(), 3);
         if (StringUtils.isBlank(sessionId)) {
             sessionId = UUIDUtil.getUuidByTime9();
             ChatSessionEntity record = new ChatSessionEntity();
@@ -158,8 +157,7 @@ public class ChatSessionServiceImpl extends ServiceImpl<ChatSessionMapper, ChatS
         
      // 推送消息
         UserInfoEntity byUserId = userInfoMapper.getByUserId(Long.parseLong(request.getUserId()));
-        PushUserInfo pushUserInfo =
-            iUserAccountService.getPushUserInfoByUserId(request.getCreateUserId().toString());
+        PushUserInfo pushUserInfo = iUserAccountService.getPushUserInfoByUserId(request.getCreateUserId().toString());
         PushMessage pushMessage = PushMessage.sayHelloToFriend(byUserId.getName());
         pushMessage.sendTokenOnPlatform(jmsMessagingTemplate, pushUserInfo);
         

+ 25 - 5
lift-ud-service/src/main/java/cn/com/ty/lift/ud/neety/process/ChatProcessor.java

@@ -47,17 +47,37 @@ public class ChatProcessor extends WebSoketSupport implements ProcessorInterface
 
         redis.setValue("ALLCHATS:" + sessionId, chats);
         //通过redis获取房间信息
-        List userLIst = redis.get("ROOM:"+sessionId, List.class);
-        for (int i = 0; i < userLIst.size(); i++) {
-            Map<String, String> user = (Map) userLIst.get(i);
-            String toUserId = user.get("userId");
-            Channel channel = userChannel.get(toUserId);
 
+
+        //用户正常登录的时候链接就会调用login协议,login会加载聊天室与用户关系到数据
+        //当用户已经登录了,附近的人聊天的时候,接收人是不知道自己已经有一个新的会话。
+        //出诊问诊时,专家没有接单的情况下是不能进入聊天室的。
+        //这种情况会造成,附近的人聊天,接收人不进入聊天室接收不到消息,
+        //通过标记类型,附近的人聊天,直接用userchannel变量中找到链接发送给接收人,并把聊天记录存入redis中
+        if (request.getDataTable() == 3){
+            //发给接收人
+            //如果接收人不在线,聊天记录存在redis中,等他上线之后进入聊天室同样也可以看到未读记录
+            Channel channel = userChannel.get(request.getReceiver());
             if(null != channel){
                 sendMessage(channel, request);
             }
+            //发给自己
+            sendMessage(client, request);
+        }else{
+            List userLIst = redis.get("ROOM:"+sessionId, List.class);
+            for (int i = 0; i < userLIst.size(); i++) {
+                Map<String, String> user = (Map) userLIst.get(i);
+                String toUserId = user.get("userId");
+                Channel channel = userChannel.get(toUserId);
+
+                if(null != channel){
+                    sendMessage(channel, request);
+                }
+            }
         }
 
+
+
         /*
         // 获取消息发送者
         String username = request.getName();

+ 11 - 3
lift-ud-service/src/main/java/cn/com/ty/lift/ud/neety/process/InitRoomProcessor.java

@@ -40,8 +40,16 @@ public class InitRoomProcessor extends WebSoketSupport implements ProcessorInter
 
         String SESSION_ID = request.getSessionid();
         String USER_ID = request.getUserId();
-
-        //如果当前用户没有在聊天室中,把用户添加到聊天室中
+        //如果聊天室不存在,就生成聊天室,并把当前用户放入到聊天室中
+        boolean roomExists = redis.exists("ROOM:" + SESSION_ID);
+        if(!roomExists){
+            List list1 = new ArrayList<>();
+            Map newUser = new HashMap();
+            newUser.put("userId", USER_ID);
+            list1.add(newUser);
+            redis.setValue("ROOM:" + SESSION_ID, list1);
+        }
+        //如果聊天室存在,并且当前用户没有在聊天室中,把用户添加到聊天室中
         List list = redis.get("ROOM:" + SESSION_ID, List.class);
         List<String> list1 = new ArrayList<>();
         for (int i = 0; list != null && i < list.size(); i++) {
@@ -57,7 +65,7 @@ public class InitRoomProcessor extends WebSoketSupport implements ProcessorInter
         }
 
 
-        //用户次进来把聊天记录通过后台全部推送过去
+        //用户每日次进来把聊天记录通过后台全部推送过去
         List charts = redis.get("ALLCHATS:" + SESSION_ID, List.class);
         IMMessage im = new IMMessage();
         im.setCmd(IMP.INITROOM.getName());

+ 0 - 5
lift-ud-service/src/main/java/cn/com/ty/lift/ud/neety/process/LoginProcessor.java

@@ -37,14 +37,11 @@ public class LoginProcessor extends WebSoketSupport implements ProcessorInterfac
      */
     @Override
     public void process(Channel client, IMMessage request) {
-
-        log.info("用户登录-------------------------------:{}", request.getName());
         // 获取用户登录信息并放入链接中,
         String USER_NAME = request.getName();
         String USER_ID = request.getUserId();
         String AVATAR_URL = request.getAvatarUrl();
 
-
         client.attr(USERID).getAndSet(USER_ID);
         client.attr(USERNAME).getAndSet(USER_NAME);
         client.attr(HEAD_PIC).getAndSet(AVATAR_URL);
@@ -71,8 +68,6 @@ public class LoginProcessor extends WebSoketSupport implements ProcessorInterfac
             redis.setValue("ROOM:"+session, users);
         }
 
-
-
         /*IMMessage msg= new IMMessage();
         msg.setCmd(IMP.UNREAD.getName());
         Map<String,RoomVo> allRoomChats = new HashMap<>();

+ 5 - 0
lift-ud-service/src/main/java/cn/com/ty/lift/ud/neety/protocol/IMMessage.java

@@ -26,6 +26,11 @@ public class IMMessage {
     private Integer type; // 发送消息类型
     private String fromUser; // 当前用户id
     private String sessionid; // 房间号
+    private int dataTable; // 消息来源1:问诊,2:出诊,3:附近的人
+
+    public void setMsg(String msg) {
+        this.msg = StringUtils.isNotBlank(msg) ?msg : null;
+    }
 
     public IMMessage() {}
 

+ 1 - 0
lift-ud-service/src/main/java/cn/com/ty/lift/ud/neety/protocol/IMP.java

@@ -7,6 +7,7 @@ package cn.com.ty.lift.ud.neety.protocol;
 public enum IMP {
     /** 系统消息 */
     SYSTEM("SYSTEM"),
+    LOOP("LOOP"),
     LOGIN("LOGIN"),
     /** 初始化房间指令 */
     INITROOM("INITROOM"),

+ 34 - 20
lift-ud-service/src/main/java/cn/com/ty/lift/ud/neety/server/handler/WebSocketHandler.java

@@ -120,29 +120,40 @@ public class WebSocketHandler extends SimpleChannelInboundHandler<Object> {
         if (null == messge) {
             return;
         }
-        String cmd = messge.getCmd();
 
+
+        if (messge.getUserId().equals(-1)){
+            log.info("游客关闭连接,结束下面的逻辑");
+            process.logout(ctx.channel());
+            handShaker.close(ctx.channel(), (CloseWebSocketFrame)frame.retain());
+            return;
+        }
+        String cmd = messge.getCmd();
+        String username = messge.getName();
         ProcessorInterface processor = null;
+
         // 发送消息业务处理类
-        if (IMP.INITROOM.getName().equals(cmd)) {
-            //附近的人加载
-            log.info("我在-初始化:{}", msg);
-            processor = new InitRoomProcessor();
-        } else if (IMP.LOGINALL.getName().equals(cmd)) {
-            log.info("我在-首次登陆:{}", msg);
+        if (IMP.LOGINALL.getName().equals(cmd)) {
+            log.info("[[{}]]登录-------------------->:{}", username, msg);
             processor = new LoginProcessor();
-        } else if (IMP.CHAT.getName().equals(cmd)) {
-            log.info("我在-发送消息:{}", msg);
+        }else if (IMP.INITROOM.getName().equals(cmd)) {
+            //加载聊天室,如果聊天室不存在,就创建。如果客户端不在聊天室假如聊天室
+            log.info("[[{}]]加载房间==========>:{}", username, msg);
+            processor = new InitRoomProcessor();
+        }  else if (IMP.CHAT.getName().equals(cmd)) {
+            log.info("[[{}]]发送消息----------------》:{}", username, msg);
             processor = new ChatProcessor();
         } else if (IMP.WEBLOGINALL.getName().equals(cmd)) {
-            log.info("我在-web端发送消息:{}", msg);
+            log.info("[[{}]]我在-web端发送消息:{}", username, msg);
+            processor = new WebLoginAllProcessor();
+        } else if (IMP.LOOP.getName().equals(cmd)) {
+            log.info("[[{}]] heartbeat :{}", username, msg);
             processor = new WebLoginAllProcessor();
         } else {
-            log.info("发送WebSoket协议异常:{}", msg);
+            log.info("[[{}]]发送WebSoket协议异常:{}", username, msg);
             return;
         }
         processor.process(ctx.channel(), messge);
-
     }
 
     @Override
@@ -157,24 +168,27 @@ public class WebSocketHandler extends SimpleChannelInboundHandler<Object> {
         if (evt instanceof IdleStateEvent){
             IdleStateEvent event = (IdleStateEvent)evt;
             if (event.state()== IdleState.READER_IDLE){
-                log.info("{}-----》客户端操作空闲",process.getNickName(ctx.channel()));
+                log.info("{}-----》客户端操作空闲",process.getNickName(ctx.channel()));
                 process.logout(ctx.channel());
+                CloseWebSocketFrame fram = new CloseWebSocketFrame();
+                handShaker.close(ctx.channel(), fram.retain());
             }
         }
     }
 
+        @Override
+    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
+        log.info("{}-----》客户端手动退出",process.getNickName(ctx.channel()));
+        process.logout(ctx.channel());
+        CloseWebSocketFrame fram = new CloseWebSocketFrame();
+        handShaker.close(ctx.channel(), fram.retain());
+    }
+
     @Override
     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
         log.info("{}-----》客户端不活跃",process.getNickName(ctx.channel()));
     }
 
-    @Override
-    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
-
-        log.info("{}-----》客户端手动退出",process.getNickName(ctx.channel()));
-        process.logout(ctx.channel());
-    }
-    // 这里是出现异常的话要进行的操作
     @Override
     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
 //        super.exceptionCaught(ctx, cause);