Jelajahi Sumber

钉钉会议webSock

cr 1 bulan lalu
induk
melakukan
9a4abb4668

+ 2 - 1
blade-common/src/main/java/org/springblade/common/constant/WebsocketMsgConstant.java

@@ -18,7 +18,8 @@ public interface WebsocketMsgConstant {
     String MSG_COUNT_DOWN = "msgCountDown";
     //客户端从服务器获取公告
     String GET_MSG = "getMsg";
-
+    //获取会议列表
+    String MSG_MEETING_LIST = "meetingList";
     /**
      * 单个系统标识
      */

+ 23 - 0
blade-service-api/blade-dingding-api/pom.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>blade-service-api</artifactId>
+        <groupId>org.springblade</groupId>
+        <version>2.9.1.RELEASE</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>blade-dingding-api</artifactId>
+    <name>${project.artifactId}</name>
+    <version>${bladex.project.version}</version>
+    <dependencies>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-common</artifactId>
+        </dependency>
+    </dependencies>
+    <packaging>jar</packaging>
+
+</project>

+ 1 - 2
blade-service/blade-dingding/src/main/java/org/springblade/dingding/vo/MeetingSchedule.java → blade-service-api/blade-dingding-api/src/main/java/org/springblade/dingding/vo/MeetingSchedule.java

@@ -7,9 +7,8 @@ import lombok.NoArgsConstructor;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-//今日预定场次
 public class MeetingSchedule {
     private String meetingId;
     private String reservationTime; //预约时间
-    private String reservationDept; //预约部门
+    private String reservationDept;
 }

+ 0 - 2
blade-service/blade-dingding/src/main/java/org/springblade/dingding/vo/MeetingVo.java → blade-service-api/blade-dingding-api/src/main/java/org/springblade/dingding/vo/MeetingVo.java

@@ -5,7 +5,6 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.util.List;
-
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
@@ -20,5 +19,4 @@ public class MeetingVo {
     private Integer status; //会议时间 1空闲中 2会议中
     private Integer meetingSession; //今日会议场次
     private List<MeetingSchedule> meetings; //今日预定会议场次详情
-
 }

+ 4 - 0
blade-service/blade-dingding/src/main/java/org/springblade/dingding/vo/ScheduleItem.java → blade-service-api/blade-dingding-api/src/main/java/org/springblade/dingding/vo/ScheduleItem.java

@@ -1,8 +1,12 @@
 package org.springblade.dingding.vo;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 @Data
+@AllArgsConstructor
+@NoArgsConstructor
 public class ScheduleItem {
     private String eventId;
     private String status;

+ 6 - 0
blade-service-api/blade-websocket-api/pom.xml

@@ -20,6 +20,12 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-dingding-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <properties>

+ 7 - 0
blade-service-api/blade-websocket-api/src/main/java/org/springblade/websocket/feign/WebSocketClient.java

@@ -1,11 +1,15 @@
 package org.springblade.websocket.feign;
 
 import org.springblade.common.constant.LauncherConstant;
+import org.springblade.dingding.vo.MeetingVo;
+import org.springblade.websocket.vo.MsgVO;
 import org.springblade.websocket.vo.SystMsgVO;
 import org.springblade.websocket.vo.UserInfoVO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * @Param
  * @Author wangwl
@@ -25,4 +29,7 @@ public interface WebSocketClient {
      */
     @PostMapping(value = "/socket/sendSystemMsg")
     void sendSystemMsg(@RequestBody SystMsgVO vo);
+
+    @PostMapping(value = "/socket/sendDingDingMsg")
+    void sendDingDingMsg(@RequestBody UserInfoVO vo);
 }

+ 12 - 0
blade-service/blade-dingding/pom.xml

@@ -30,6 +30,18 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-swagger</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-dingding-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-websocket-api</artifactId>
+            <version>2.9.1.RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
 </project>

+ 0 - 2
blade-service/blade-dingding/src/main/java/org/springblade/dingding/controller/MeetingController.java

@@ -2,12 +2,10 @@ package org.springblade.dingding.controller;
 
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
-import lombok.extern.java.Log;
 import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.tool.api.R;
 import org.springblade.dingding.service.MeetingService;
 import org.springblade.dingding.vo.MeetingVo;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;

+ 11 - 6
blade-service/blade-dingding/src/main/java/org/springblade/dingding/service/impl/MeetingServiceImpl.java

@@ -7,7 +7,6 @@ import com.alibaba.nacos.shaded.com.google.gson.JsonElement;
 import com.alibaba.nacos.shaded.com.google.gson.JsonObject;
 import com.alibaba.nacos.shaded.com.google.gson.JsonParser;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.commons.lang.StringUtils;
 import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpGet;
@@ -15,18 +14,21 @@ import org.apache.http.client.methods.HttpPost;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
+import org.springblade.common.constant.WebsocketMsgConstant;
 import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.jackson.JsonUtil;
 import org.springblade.dingding.service.MeetingService;
 import org.springblade.dingding.vo.MeetingSchedule;
 import org.springblade.dingding.vo.MeetingVo;
 import org.springblade.dingding.vo.ScheduleItem;
+import org.springblade.websocket.feign.WebSocketClient;
+import org.springblade.websocket.vo.MsgVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.*;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.client.HttpServerErrorException;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.util.UriComponentsBuilder;
 
@@ -52,6 +54,8 @@ public class MeetingServiceImpl implements MeetingService {
     private static final String APP_KEY = "ding6mvrzcxcbdggel0h";
     private static final String APP_SECRET = "TctTp-Qmyh9r20bdeHcLWZ8qfxSEP8R29qo53GZH2elWV-yDZMqgqFKEjp5PtlXZ";
     private static final String USER_ID = "01141506681633389467";
+    @Autowired
+    private  WebSocketClient webSocketClient;
 
     // 缓存用户信息,避免重复调用
     private final Map<String, Object> userInfoCache = new ConcurrentHashMap<>();
@@ -94,8 +98,9 @@ public class MeetingServiceImpl implements MeetingService {
 
             // 等待所有完成,设置超时
             CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
-                    .get(25, TimeUnit.SECONDS); // 25秒总超时
-
+                    .get(25, TimeUnit.SECONDS);
+            // 25秒总超时
+            webSocketClient.sendDingDingMsg(null);
             return vos;
         } catch (Exception e) {
             throw new ServiceException("获取会议室信息失败: " + e.getMessage());

+ 5 - 0
blade-service/blade-websocket/pom.xml

@@ -35,6 +35,11 @@
             <artifactId>blade-manager-api</artifactId>
             <version>${bladex.project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.springblade</groupId>
+            <artifactId>blade-dingding-api</artifactId>
+            <version>${bladex.project.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.springblade</groupId>
             <artifactId>blade-business-api</artifactId>

+ 12 - 0
blade-service/blade-websocket/src/main/java/org/springblade/websocket/feign/WebSocketClientImpl.java

@@ -1,11 +1,16 @@
 package org.springblade.websocket.feign;
 
 import lombok.AllArgsConstructor;
+import org.springblade.dingding.vo.MeetingVo;
 import org.springblade.websocket.service.WebSocketService;
+import org.springblade.websocket.vo.MsgVO;
 import org.springblade.websocket.vo.SystMsgVO;
 import org.springblade.websocket.vo.UserInfoVO;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.List;
+
 /**
  * @Param
  * @Author wangwl
@@ -25,4 +30,11 @@ public class WebSocketClientImpl implements WebSocketClient{
     public void sendSystemMsg(SystMsgVO vo) {
         socketService.sendSystemMsg(vo);
     }
+
+    @Override
+    public void sendDingDingMsg(UserInfoVO vo) {
+        socketService.sendDingDingMsg(vo);
+    }
+
+
 }

+ 26 - 0
blade-service/blade-websocket/src/main/java/org/springblade/websocket/service/WebSocketService.java

@@ -9,6 +9,7 @@ import org.springblade.common.constant.ClientIdConstant;
 import org.springblade.common.constant.WebsocketMsgConstant;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.jackson.JsonUtil;
+import org.springblade.dingding.vo.MeetingVo;
 import org.springblade.feign.ArchiveWebSocketClient;
 import org.springblade.manager.feign.ManagerWebSocketClient;
 import org.springblade.meter.feign.MeterWebSocketClient;
@@ -253,6 +254,10 @@ public class WebSocketService implements ApplicationContextAware {
         }
     }
 
+
+
+
+
     /**
      *  推送指定的系统的所有在线用户
      */
@@ -401,4 +406,25 @@ public class WebSocketService implements ApplicationContextAware {
         WebSocketService.onlineLinkCount--;
     }
 
+    public void sendDingDingMsg(UserInfoVO vo) {
+        List<Session> sessions = userInfoMap.get(vo);
+        if(sessions != null && sessions.size() > 0){
+            /** 此处不能使用普通集合,否则在推送消息时,当前用户又开启一个页面,集合发生变化迭代器会报错ConcurrentModificationException*/
+            for (Session s : sessions) {
+                if (s == null){
+                    continue;
+                }
+                RemoteEndpoint.Basic basicRemote = s.getBasicRemote();
+                /** 推送消息时可能因为nginx配置的连接时间,或者用户刚好断开连接,
+                 * 导致通道关闭,但是数组中使用的是快照,还存在这个连接,此时跳过推送给这个窗口*/
+                if (basicRemote != null){
+                    try {
+                        basicRemote.sendText(vo.getMsg());
+                    } catch (IOException e) {
+                        log.error(vo.getUserId()+"推送消息失败,消息内容["+ vo.getMsg()+"],原因:"+e.getMessage());
+                    }
+                }
+            }
+        }
+    }
 }

+ 1 - 0
pom.xml

@@ -42,6 +42,7 @@
         <module>blade-service-api</module>
         <module>blade-service/blade-repair</module>
         <module>blade-service/blade-dingding</module>
+        <module>blade-service-api/blade-dingding-api</module>
     </modules>
 
     <dependencyManagement>