Pārlūkot izejas kodu

钉钉会议接口连接webSocket

cr 4 nedēļas atpakaļ
vecāks
revīzija
59063a08e1

+ 1 - 0
blade-common/src/main/java/org/springblade/common/constant/ClientIdConstant.java

@@ -10,4 +10,5 @@ public interface ClientIdConstant {
     String METER_ID = "measure";
     String CLIENT_ID = "client";
     String ARCHIVE_ID = "archives";
+    String DINGDING_ID = "dingding";
 }

+ 12 - 0
blade-service-api/blade-websocket-api/src/main/java/org/springblade/websocket/vo/DingDingMsg.java

@@ -0,0 +1,12 @@
+package org.springblade.websocket.vo;
+
+import lombok.Data;
+import org.springblade.dingding.vo.MeetingVo;
+
+import java.util.List;
+
+@Data
+public class DingDingMsg {
+    private String msgType;
+    private List<MeetingVo> data;
+}

+ 5 - 0
blade-service-api/blade-websocket-api/src/main/java/org/springblade/websocket/vo/UserInfoVO.java

@@ -2,8 +2,10 @@ package org.springblade.websocket.vo;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import org.springblade.dingding.vo.MeetingVo;
 
 import java.io.Serializable;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -32,6 +34,9 @@ public class UserInfoVO implements Serializable {
     @ApiModelProperty("公告类型1维护2普通,拼接字符串")
     private String msgType;
 
+    @ApiModelProperty("数据信息")
+    private List<MeetingVo> object;
+
     public UserInfoVO() {
     }
 

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

@@ -6,6 +6,7 @@ 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;
@@ -20,6 +21,21 @@ public class MeetingController extends BladeController {
 
   private final MeetingService meetingService;
 
+
+
+  // 定时任务方法 - 排除日志切面拦截
+  @Scheduled(cron = "0 * * * * ?")
+  // 如果项目支持@Log注解,可以使用:
+  // @Log(ignore = true)
+  public void scheduledMeetingInfo() {
+    try {
+      meetingService.getMeetingInfo();
+      System.out.println("定时任务执行完成");
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+
   @GetMapping("/getMeetingInfo")
   public R<List<MeetingVo>> getMeetingInfo(){
     return R.data(meetingService.getMeetingInfo());

+ 1 - 0
blade-service/blade-dingding/src/main/java/org/springblade/dingding/service/MeetingService.java

@@ -1,5 +1,6 @@
 package org.springblade.dingding.service;
 
+import org.springblade.core.tool.api.R;
 import org.springblade.dingding.vo.MeetingVo;
 
 import java.util.List;

+ 12 - 1
blade-service/blade-dingding/src/main/java/org/springblade/dingding/service/impl/MeetingServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.dingding.service.impl;
 
+import cn.hutool.system.UserInfo;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -25,6 +26,7 @@ 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.springblade.websocket.vo.UserInfoVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.*;
 import org.springframework.scheduling.annotation.Async;
@@ -100,7 +102,16 @@ public class MeetingServiceImpl implements MeetingService {
             CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
                     .get(25, TimeUnit.SECONDS);
             // 25秒总超时
-            webSocketClient.sendDingDingMsg(null);
+            if(!vos.isEmpty()){
+                UserInfoVO vo = new UserInfoVO();
+                vo.setSystem("dingding");
+                vo.setContractId(1L);
+                vo.setMsgType("dingding");
+                vo.setUserId(1L);
+                vo.setProjectId(1L);
+                vo.setObject( vos);
+                webSocketClient.sendDingDingMsg(vo);
+            }
             return vos;
         } catch (Exception e) {
             throw new ServiceException("获取会议室信息失败: " + e.getMessage());

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

@@ -63,6 +63,10 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.codehaus.jackson</groupId>
+            <artifactId>jackson-mapper-asl</artifactId>
+        </dependency>
     </dependencies>
 
     <properties>

+ 38 - 2
blade-service/blade-websocket/src/main/java/org/springblade/websocket/service/WebSocketService.java

@@ -2,6 +2,8 @@ package org.springblade.websocket.service;
 
 import io.undertow.websockets.jsr.UndertowSession;
 import lombok.Data;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springblade.business.feign.BusinessWebSocketClient;
@@ -14,6 +16,7 @@ import org.springblade.feign.ArchiveWebSocketClient;
 import org.springblade.manager.feign.ManagerWebSocketClient;
 import org.springblade.meter.feign.MeterWebSocketClient;
 import org.springblade.websocket.entity.WebSocketClientInfo;
+import org.springblade.websocket.vo.DingDingMsg;
 import org.springblade.websocket.vo.MsgVO;
 import org.springblade.websocket.vo.SystMsgVO;
 import org.springblade.websocket.vo.UserInfoVO;
@@ -49,6 +52,8 @@ public class WebSocketService implements ApplicationContextAware {
     /** 后台*/
     private static ManagerWebSocketClient managerWebSocketClient;
 
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         WebSocketService.meterWebSocketClient = applicationContext.getBean(MeterWebSocketClient.class);
@@ -77,6 +82,8 @@ public class WebSocketService implements ApplicationContextAware {
     private static Set<Session> clientSystemSessions = new CopyOnWriteArraySet<>();
     /** 档案系统session集合*/
     private static Set<Session> archivesSystemSessions = new CopyOnWriteArraySet<>();
+    /** 档案系统session集合*/
+    private static Set<Session> dingdingSystemSessions = new CopyOnWriteArraySet<>();
 
 //    /** 更新公告推送记录*/
 //    private static Set<UserSingleVO> updateMsgPushUsers = new HashSet<>();
@@ -157,6 +164,9 @@ public class WebSocketService implements ApplicationContextAware {
                 case ClientIdConstant.CLIENT_ID:
                     clientSystemSessions.add(session);
                     break;
+                case ClientIdConstant.DINGDING_ID:
+                    dingdingSystemSessions.add(session);
+                    break;
                 default:
                     log.error("未知的系统登录:"+system);
             }
@@ -187,6 +197,9 @@ public class WebSocketService implements ApplicationContextAware {
                 case ClientIdConstant.ARCHIVE_ID:
                     archivesSystemSessions.remove(session);
                     break;
+                case ClientIdConstant.DINGDING_ID:
+                    dingdingSystemSessions.remove(session);
+                    break;
                 default:
                     log.error("未知的系统退出:"+system);
             }
@@ -419,12 +432,35 @@ public class WebSocketService implements ApplicationContextAware {
                  * 导致通道关闭,但是数组中使用的是快照,还存在这个连接,此时跳过推送给这个窗口*/
                 if (basicRemote != null){
                     try {
-                        basicRemote.sendText(vo.getMsg());
-                    } catch (IOException e) {
+                        DingDingMsg dingMsg = new DingDingMsg();
+                        dingMsg.setMsgType(vo.getMsgType());
+                        dingMsg.setData(vo.getObject());
+                        // 将对象序列化为JSON字符串再发送
+                        String message = toJsonMessage(R.data(dingMsg));
+                        basicRemote.sendText(message);
+                    } catch (Exception e) {
                         log.error(vo.getUserId()+"推送消息失败,消息内容["+ vo.getMsg()+"],原因:"+e.getMessage());
                     }
                 }
             }
         }
     }
+    public static String toJsonMessage(Object object) {
+        if (object == null) {
+            return "";
+        }
+
+        if (object instanceof String) {
+            return (String) object;
+        }
+
+        try {
+            return objectMapper.writeValueAsString(object);
+        } catch (JsonProcessingException e) {
+            log.error("对象序列化为JSON失败: {}", e.getMessage());
+            return object.toString();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }