RealTimeData.vue 3.08 KB
<template>
  <BasicTable @register="registerTable" />
</template>
<script lang="ts">
  import { defineComponent, reactive } from 'vue';
  import { BasicTable, useTable } from '/@/components/Table';
  import { realTimeDataColumns } from '../../config/detail.config';
  import { useWebSocket } from '@vueuse/core';
  import { JWT_TOKEN_KEY } from '/@/enums/cacheEnum';
  import { getAuthCache } from '/@/utils/auth';
  import type { socketDataType } from '../../types';
  import { useMessage } from '/@/hooks/web/useMessage';
  export default defineComponent({
    name: 'RealTimeData',
    components: {
      BasicTable,
    },
    props: {
      deviceDetail: {
        type: Object,
        required: true,
      },
    },
    setup(props) {
      const token = getAuthCache(JWT_TOKEN_KEY);
      const state = reactive({
        server: `ws://101.133.234.90:8080/api/ws/plugins/telemetry?token=${token}`,
        sendValue: JSON.stringify({
          attrSubCmds: [],
          tsSubCmds: [
            {
              entityType: 'DEVICE',
              entityId: props.deviceDetail.tbDeviceId,
              scope: 'LATEST_TELEMETRY',
              cmdId: 1,
            },
          ],
          historyCmds: [],
          entityDataCmds: [],
          entityDataUnsubscribeCmds: [],
          alarmDataCmds: [],
          alarmDataUnsubscribeCmds: [],
          entityCountCmds: [],
          entityCountUnsubscribeCmds: [],
        }),
        recordList: Array<socketDataType>(),
      });
      const { createMessage } = useMessage();
      const [registerTable] = useTable({
        columns: realTimeDataColumns,
        showTableSetting: false,
        bordered: true,
        showIndexColumn: false,
        dataSource: state.recordList,
      });

      const { send } = useWebSocket(state.server, {
        onConnected() {
          send(state.sendValue);
          console.log('建立连接了');
          console.log(props.deviceDetail.tbDeviceId);
        },
        onMessage(_, e) {
          const { data } = JSON.parse(e.data);
          console.log('来新消息了', 'data---', data);
          const newArray: any = [];
          for (const key in data) {
            const newData = data[key].flat(1);
            let obj = {
              key,
              time: newData[0],
              value: newData[1],
            };
            if (state.recordList.length === 0) {
              state.recordList.push(obj);
            } else {
              newArray.push(obj);
            }
          }
          newArray.forEach((item) => {
            let flag = false;
            state.recordList.forEach((item1) => {
              if (item.key === item1.key) {
                item1.time = item.time;
                item1.value = item.value;
                flag = true;
              }
            });
            if (!flag) {
              state.recordList.unshift(item);
            }
          });
        },
        onDisconnected() {},
        onError() {
          createMessage.error('webSocket连接超时,请联系管理员');
        },
      });

      return {
        registerTable,
      };
    },
  });
</script>