Bladeren bron

预警消息推送更新

lxh 1 dag geleden
bovenliggende
commit
aabc72eec1

+ 7 - 0
.hbuilderx/launch.json

@@ -9,6 +9,13 @@
             "app-plus" : {
                 "launchtype" : "local"
             },
+            "default" : {
+                "launchtype" : "local"
+            },
+            "h5" : {
+                "launchtype" : "local"
+            },
+            "provider" : "aliyun",
             "type" : "uniCloud"
         },
         {

+ 51 - 27
App.vue

@@ -6,27 +6,32 @@
 import Vue from "vue";
 import appUpdate from "common/util/appUpdate.js";
 import configService from "@/common/service/config.service.js";
+import { connectWebSocket, sendWebSocketMessage, closeWebSocket } from '@/common/util/websocket'
 export default {
+  data() {
+    return {
+      socketTask: null,//websocket对象
+    }
+  },
   onLaunch: function () {
     //消息推送
-    	uni.getPushClientId({
-        //获取客户端推送标识
-				success: (res) => {
-					console.log(res.cid,'cid---');
-          uni.setStorageSync('push_cid', res.cid); // 存储CID供后续使用
-				},
-				fail(err) {
-					console.log(err)
-				}
-			});
-			uni.onPushMessage((res) => {
-        //客户端监听推送消息
-				console.log("收到推送消息:",res) //监听推送消息
-				if(res.data){
-				    console.log(res.data)
-				    uni.createPushMessage(res.data)  //收到消息推送,创建系统状态栏及锁屏通 知
-				}
-		    })
+    uni.getPushClientId({
+      //获取客户端推送标识
+      success: (res) => {
+        console.log(res.cid, 'cid---');
+        uni.setStorageSync('push_cid', res.cid); // 存储CID供后续使用
+      },
+      fail(err) {
+        console.log(err)
+      }
+    });
+    uni.onPushMessage((res) => {
+      //客户端监听推送消息
+      console.log("收到推送消息:", res) //监听推送消息
+      if (res.data) {
+        uni.createPushMessage(res.data)  //收到消息推送,创建系统状态栏及锁屏通 知
+      }
+    })
 
     const savedIP = uni.getStorageSync("selectedIP");
     if (configService.apiUrl !== "") {
@@ -298,23 +303,22 @@ export default {
   },
   onShow: function () {
     console.log("App Show");
-   this.times= setInterval(()=>this.getInfoInit(),10000)  
+    this.getConnect()
   },
   onHide: function () {
     console.log("App Hide");
     clearInterval(this.$store.state.timer); // 假设定时器存储在 Vuex 的状态管理中
   },
-  methods:{
+  methods: {
+
     //获取推送消息,标题
-    getInfoInit(){
-      console.log('获取推送消息,标题---')
-      console.log(uni.getStorageSync('push_cid'), '111')
-       uni.request({
+    getInfoInit(title, message) {
+      uni.request({
         url: 'https://fc-mp-2578c13f-eaaa-45e9-a01e-6a48b45fb7a0.next.bspapp.com/testPush', //云函数url
         data: {
           cid: uni.getStorageSync('push_cid'),
-          title: '报警信息通知', //可按需传入动态参数,在云函数index.js接收参数
-          content: '测试通知信息',
+          title: title, //可按需传入动态参数,在云函数index.js接收参数
+          content: message,
         },
         method: 'get',
         success(result) {
@@ -324,7 +328,26 @@ export default {
           console.log('request fail', errMsg)
         }
       })
-    }
+    },
+
+    //连接websocket
+    async getConnect() {
+      let that = this
+      try {
+        that.socketTask = await connectWebSocket();
+        that.socketTask.onMessage((res) => {
+          console.log('收到消息:websocket已连接 ', res)
+          let message = JSON.parse(res.data)
+          //报警信息推送
+          if (message.warndata) {
+            that.getInfoInit(message.msgTitle, message.warndata)
+          }
+        });
+      } catch (err) {
+        console.log('连接失败: ' + err)
+      }
+    },
+
   }
 };
 </script>
@@ -333,6 +356,7 @@ export default {
 @import "plugin/colorui/main.css";
 @import "plugin/colorui/icon.css";
 @import "plugin/colorui/animation.css";
+
 .nav-list {
   display: flex;
   flex-wrap: wrap;

+ 111 - 0
common/util/websocket.js

@@ -0,0 +1,111 @@
+// websocket.js
+let socketTask = null;
+let reconnectAttempts = 0;
+const maxReconnectAttempts = 5;
+
+let heartbeatTimer = null;
+
+
+export function connectWebSocket() {
+  return new Promise((resolve, reject) => {
+    const token = uni.getStorageSync('Access-Token');
+    const Ids = uni.getStorageSync('login_user_info')['id'];
+    const userId = Ids + '_app?token=' + token;
+
+    // const url = 'http://' + window.location.hostname + ':9999'?.replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;
+    const url =  uni.getStorageSync("apiUrl").replace('https://', 'wss://').replace('http://', 'ws://') + '/websocket/' + userId;
+    console.log(url, 'url======')
+    // 创建连接
+    socketTask = uni.connectSocket({
+      url: url,
+      success: () => {
+        console.log('WebSocket 连接创建中...');
+      },
+      fail: (err) => {
+        console.error('连接创建失败:', err);
+        reject(err);
+      }
+    });
+
+    // 监听打开事件
+    socketTask.onOpen((res) => {
+      console.log('WebSocket 连接已打开');
+      startHeartbeat();
+      reconnectAttempts = 0;
+      resolve(socketTask);
+    });
+
+    // 监听错误事件
+    socketTask.onError((err) => {
+      console.error('WebSocket 错误:', err);
+      handleReconnection();
+      reject(err);
+    });
+
+    // 监听关闭事件
+    socketTask.onClose((res) => {
+      console.log('WebSocket 连接已关闭', res);
+      clearInterval(heartbeatTimer);
+      if (!res.code === 1000) { // 非正常关闭
+        handleReconnection();
+      }
+    });
+  });
+}
+
+function handleReconnection() {
+  if (reconnectAttempts < maxReconnectAttempts) {
+    reconnectAttempts++;
+    const delay = Math.min(1000 * reconnectAttempts, 5000);
+
+    console.log(`尝试第 ${reconnectAttempts} 次重连,${delay}ms后执行`);
+
+    setTimeout(() => {
+      connectWebSocket().catch(console.error);
+    }, delay);
+  } else {
+    console.error(`已达到最大重连次数 ${maxReconnectAttempts}`);
+  }
+}
+
+// 发送消息
+export function sendWebSocketMessage(message) {
+  return new Promise((resolve, reject) => {
+    if (!socketTask || socketTask.readyState !== 1) {
+      reject('WebSocket 未连接');
+      return;
+    }
+
+    socketTask.send({
+      data: JSON.stringify(message),
+      success: () => resolve(),
+      fail: (err) => reject(err)
+    });
+  });
+}
+
+// 关闭连接
+export function closeWebSocket() {
+  if (socketTask) {
+    socketTask.close({
+      code: 1000,
+      reason: '用户主动关闭'
+    });
+  }
+}
+
+
+
+
+function startHeartbeat() {
+  // 每30秒发送一次心跳
+  heartbeatTimer = setInterval(() => {
+    sendWebSocketMessage({
+      type: 'heartbeat',
+      timestamp: Date.now()
+    }).catch(() => {
+      clearInterval(heartbeatTimer);
+    });
+  }, 3*60000);
+}
+

+ 2 - 2
pages/gasreport/components/taskBoard.vue

@@ -52,8 +52,8 @@ export default {
             searchTime: '',//检测时间
             showCalendar: false,//控制日期选型下拉开启
             // timeRan: Number(new Date()),
-            // minDate: moment().subtract(30, 'days').format('YYYY-MM-DD'),
-            minDate: moment().subtract(120, 'days').format('YYYY-MM-DD'),
+            minDate: moment().subtract(30, 'days').format('YYYY-MM-DD'),
+            // minDate: moment().subtract(125, 'days').format('YYYY-MM-DD'),
             maxDate:moment().add(30, 'days').format('YYYY-MM-DD'),
             isShow: true,
             loadComponent: '',

+ 1 - 0
pages/gasreport/components/taskBoardAddress.vue

@@ -169,6 +169,7 @@ export default {
             this.showBtn = true
             this.sbShow = false
             this.toComponent = ''
+            this.urlData=''
             this.topH = 39 * this.activeIndex
             this.taskDetailsLists()
         },

+ 4 - 0
pages/index/index.vue

@@ -96,6 +96,7 @@
 <script>
 import { nextTick } from "vue";
 import Device from "../device/index.vue";
+
 export default {
   components: {
     Device,
@@ -201,6 +202,7 @@ export default {
   },
   onLoad() {
     this.changeWV();
+     
   },
   mounted() {},
   onShow() {
@@ -210,6 +212,8 @@ export default {
     this.changeWV();
   },
   methods: {
+  
+
     NavChange: function (e) {
       this.PageCur = e;
       if (e == "tun2D") {