helongyang
9 小时以前 3cd89b88edd913530062e13e20e7d6b866fd190f
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/DryFilmWarehouse.vue
@@ -1,151 +1,156 @@
<template>
  <div id="title">
    <div id="bkuang" style="border-top: none">
      <!-- GM仓堆垛机状态面板 -->
      <div class="skuang">
        <div class="zhuname">干膜仓堆垛机</div>
        <div class="zhankuang">
          <div class="xname">堆垛机状态:</div>
          <div class="xzhi" :title="data.R_GM_Status">{{ data.R_GM_Status }}</div>
          <div class="xzhi" :title="gmData.R_GM_Status">{{ gmData.R_GM_Status || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">堆垛机手自动状态:</div>
          <div class="xzhi" :title="data.R_GM_AutoStatus">{{ data.R_GM_AutoStatus }}</div>
          <div class="xzhi" :title="gmData.R_GM_AutoStatus">{{ gmData.R_GM_AutoStatus || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">正在执行的任务号:</div>
          <div class="xzhi" :title="data.R_GM_TaskNum">{{ data.R_GM_TaskNum }}</div>
          <div class="xzhi" :title="gmData.R_GM_TaskNum">{{ gmData.R_GM_TaskNum || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">堆垛机工作状态:</div>
          <div class="xzhi" :title="data.R_GM_WorkStatus">{{ data.R_GM_WorkStatus }}</div>
          <div class="xzhi" :title="gmData.R_GM_WorkStatus">{{ gmData.R_GM_WorkStatus || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">作业类型:</div>
          <div class="xzhi" :title="data.R_GM_WorkType">{{ data.R_GM_WorkType }}</div>
          <div class="xzhi" :title="gmData.R_GM_WorkType">{{ gmData.R_GM_WorkType || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">托盘类型:</div>
          <div class="xzhi" :title="data.R_GM_TrayType">{{ data.R_GM_TrayType }}</div>
          <div class="xzhi" :title="gmData.R_GM_TrayType">{{ gmData.R_GM_TrayType || '-' }}</div>
        </div>
      </div>
      <!-- GM关联站台(入库7003) -->
      <div class="skuang">
        <div class="zhuname">入库7003站台</div>
        <div class="zhankuang">
          <div class="xname">读取箱体码(读):</div>
          <div class="xzhi" :title="data.R_GM_Boxcode">{{ data.R_GM_Boxcode }}</div>
          <div class="xzhi" :title="gmData.R_GM_Boxcode">{{ gmData.R_GM_Boxcode || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">握手信号(读):</div>
          <div class="xzhi" :title="data.R_GM_HandShake3">{{ data.R_GM_HandShake3 }}</div>
          <div class="xzhi" :title="gmData.R_GM_HandShake3">{{ gmData.R_GM_HandShake3 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否联机(读):</div>
          <div class="xzhi" :title="data.R_GM_Online3">{{ data.R_GM_Online3 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Online3">{{ gmData.R_GM_Online3 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否空闲(读):</div>
          <div class="xzhi" :title="data.R_GM_Free3">{{ data.R_GM_Free3 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Free3">{{ gmData.R_GM_Free3 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否有货(读):</div>
          <div class="xzhi" :title="data.R_GM_Goods3">{{ data.R_GM_Goods3 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Goods3">{{ gmData.R_GM_Goods3 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否故障(读):</div>
          <div class="xzhi" :title="data.R_GM_Alarm3">{{ data.R_GM_Alarm3 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Alarm3">{{ gmData.R_GM_Alarm3 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(读):</div>
          <div class="xzhi" :title="data.R_GM_STB3">{{ data.R_GM_STB3 }}</div>
          <div class="xzhi" :title="gmData.R_GM_STB3">{{ gmData.R_GM_STB3 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(读):</div>
          <div class="xzhi" :title="data.R_GM_ACK3">{{ data.R_GM_ACK3 }}</div>
          <div class="xzhi" :title="gmData.R_GM_ACK3">{{ gmData.R_GM_ACK3 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(写):</div>
          <div class="xzhi" :title="data.W_GM_STB3">{{ data.W_GM_STB3 }}</div>
          <div class="xzhi" :title="gmData.W_GM_STB3">{{ gmData.W_GM_STB3 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(写):</div>
          <div class="xzhi" :title="data.W_GM_ACK3">{{ data.W_GM_ACK3 }}</div>
          <div class="xzhi" :title="gmData.W_GM_ACK3">{{ gmData.W_GM_ACK3 || '-' }}</div>
        </div>
      </div>
      <!-- GM关联站台(出库7004+7005) -->
      <div class="skuang">
        <div class="zhuname">出库终点7004站台</div>
        <div class="zhankuang">
          <div class="xname">握手信号(读):</div>
          <div class="xzhi" :title="data.R_GM_HandShake4">{{ data.R_GM_HandShake4 }}</div>
          <div class="xzhi" :title="gmData.R_GM_HandShake4">{{ gmData.R_GM_HandShake4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否联机(读):</div>
          <div class="xzhi" :title="data.R_GM_Online4">{{ data.R_GM_Online4 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Online4">{{ gmData.R_GM_Online4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否空闲(读):</div>
          <div class="xzhi" :title="data.R_GM_Free4">{{ data.R_GM_Free4 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Free4">{{ gmData.R_GM_Free4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否有货(读):</div>
          <div class="xzhi" :title="data.R_GM_Goods4">{{ data.R_GM_Goods4 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Goods4">{{ gmData.R_GM_Goods4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否故障(读):</div>
          <div class="xzhi" :title="data.R_GM_Alarm4">{{ data.R_GM_Alarm4 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Alarm4">{{ gmData.R_GM_Alarm4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(读):</div>
          <div class="xzhi" :title="data.R_GM_STB4">{{ data.R_GM_STB4 }}</div>
          <div class="xzhi" :title="gmData.R_GM_STB4">{{ gmData.R_GM_STB4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(读):</div>
          <div class="xzhi" :title="data.R_GM_ACK4">{{ data.R_GM_ACK4 }}</div>
          <div class="xzhi" :title="gmData.R_GM_ACK4">{{ gmData.R_GM_ACK4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(写):</div>
          <div class="xzhi" :title="data.W_GM_STB4">{{ data.W_GM_STB4 }}</div>
          <div class="xzhi" :title="gmData.W_GM_STB4">{{ gmData.W_GM_STB4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(写):</div>
          <div class="xzhi" :title="data.W_GM_ACK4">{{ data.W_GM_ACK4 }}</div>
          <div class="xzhi" :title="gmData.W_GM_ACK4">{{ gmData.W_GM_ACK4 || '-' }}</div>
        </div>
        <div class="zhuname">出库7005站台</div>
        <div class="zhankuang">
          <div class="xname">握手信号(读):</div>
          <div class="xzhi" :title="data.R_GM_HandShake5">{{ data.R_GM_HandShake5 }}</div>
          <div class="xzhi" :title="gmData.R_GM_HandShake5">{{ gmData.R_GM_HandShake5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否联机(读):</div>
          <div class="xzhi" :title="data.R_GM_Online5">{{ data.R_GM_Online5 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Online5">{{ gmData.R_GM_Online5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否空闲(读):</div>
          <div class="xzhi" :title="data.R_GM_Free5">{{ data.R_GM_Free5 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Free5">{{ gmData.R_GM_Free5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否有货(读):</div>
          <div class="xzhi" :title="data.R_GM_Goods5">{{ data.R_GM_Goods5 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Goods5">{{ gmData.R_GM_Goods5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否故障(读):</div>
          <div class="xzhi" :title="data.R_GM_Alarm5">{{ data.R_GM_Alarm5 }}</div>
          <div class="xzhi" :title="gmData.R_GM_Alarm5">{{ gmData.R_GM_Alarm5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(读):</div>
          <div class="xzhi" :title="data.R_GM_STB5">{{ data.R_GM_STB5 }}</div>
          <div class="xzhi" :title="gmData.R_GM_STB5">{{ gmData.R_GM_STB5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(读):</div>
          <div class="xzhi" :title="data.R_GM_ACK5">{{ data.R_GM_ACK5 }}</div>
          <div class="xzhi" :title="gmData.R_GM_ACK5">{{ gmData.R_GM_ACK5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(写):</div>
          <div class="xzhi" :title="data.W_GM_STB5">{{ data.W_GM_STB5 }}</div>
          <div class="xzhi" :title="gmData.W_GM_STB5">{{ gmData.W_GM_STB5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(写):</div>
          <div class="xzhi" :title="data.W_GM_ACK5">{{ data.W_GM_ACK5 }}</div>
          <div class="xzhi" :title="gmData.W_GM_ACK5">{{ gmData.W_GM_ACK5 || '-' }}</div>
        </div>
      </div>
    </div>
@@ -153,7 +158,7 @@
</template>
<script>
import { ref, nextTick } from "vue";
import { ref, nextTick, watch, onUnmounted } from "vue";
import { useStore } from "vuex";
import { onMounted } from "vue";
@@ -163,162 +168,132 @@
      xuan: 0
    };
  },
  methods: {
  },
  setup() {
    const store = useStore();
    const data = ref({});
    // ä»…存储GM数据,与其他仓数据隔离
    const gmData = ref({});
    // 1. å®šä¹‰æ™®é€šå­—段的映射规则
    const statusMap = {
      R_GM_Status: {
        1: "正常",
        2: "故障",
        3: "急停",
    // å»¶è¿Ÿæ›´æ–°é…ç½®ï¼Œè§£å†³é—ªçƒé—®é¢˜
    const UPDATE_DELAY = 300; // 300ms延迟,平衡实时性和界面稳定性
    let updateTimer = null;   // å®šæ—¶å™¨å®žä¾‹
    // GM数据映射规则配置(按功能分组)
    const gmStatusConfig = {
      coreStatus: {
        R_GM_Status: { 1: "正常", 2: "故障", 3: "急停" },
        R_GM_AutoStatus: { 0: "ç»´ä¿®", 1: "手动", 2: "半自动", 3: "自动" },
        R_GM_WorkStatus: { 0: "待机", 1: "取货中", 2: "取货完成", 4: "放货中", 5: "放货完成", 6: "任务完成" },
        R_GM_WorkType: { 0: "无作业任务(0)", 1: "取放货作业(1)", 2: "只取货作业(2)", 3: "只放货作业(3)", 4: "移动到指定位置" },
        R_GM_TrayType: { "-1": "空箱(-1)", 1: "小托盘(1)", 2: "中托盘(2)", 3: "大托盘(3)", 4: "特大托盘(4)" }
      },
      R_GM_AutoStatus: {
        0: "ç»´ä¿®",
        1: "手动",
        2: "半自动",
        3: "自动",
      onlineStatus: {
        keys: ["R_GM_Online3", "R_GM_Online4", "R_GM_Online5"],
        map: { true: "联机", false: "脱机" }
      },
      R_GM_WorkStatus: {
        0: "待机",
        1: "取货中",
        2: "取货完成",
        4: "放货中",
        5: "放货完成",
        6: "任务完成",
      alarmStatus: {
        keys: ["R_GM_Alarm3", "R_GM_Alarm4", "R_GM_Alarm5"],
        map: { true: "故障", false: "正常" }
      },
      R_GM_WorkType: {
        0: "无作业任务(0)",
        1: "取放货作业(1)",
        2: "只取货作业(2)",
        3: "只放货作业(3)",
        4: "移动到指定位置"
      freeStatus: {
        keys: ["R_GM_Free3", "R_GM_Free4", "R_GM_Free5"],
        map: { true: "空闲", false: "繁忙" }
      },
      R_GM_TrayType: {
        "-1": "空箱(-1)",
        1: "小托盘(1)",
        2: "中托盘(2)",
        3: "大托盘(3)",
        4: "特大托盘(4)",
      goodsStatus: {
        keys: ["R_GM_Goods3", "R_GM_Goods4", "R_GM_Goods5"],
        map: { true: "有货", false: "无货" }
      },
      signalFields: {
        keys: [
          "R_GM_HandShake3", "R_GM_STB3", "R_GM_ACK3", "W_GM_STB3", "W_GM_ACK3",
          "R_GM_HandShake4", "R_GM_STB4", "R_GM_ACK4", "W_GM_STB4", "W_GM_ACK4",
          "R_GM_HandShake5", "R_GM_STB5", "R_GM_ACK5", "W_GM_STB5", "W_GM_ACK5"
        ],
        map: { true: "是", false: "否" }
      }
    };
    const onlines = [
        "R_GM_Online3","R_GM_Online4",
        "R_GM_Online5",
    ]
    const online = {
      1: "联机",
      0: "脱机"
    };
    const alarms = [
        "R_GM_Alarm3","R_GM_Alarm4",
        "R_GM_Alarm5",
    ]
    const alarm = {
      1: "故障",
      0: "正常"
    };
    const frees = [
        "R_GM_Free3","R_GM_Free4",
        "R_GM_Free5",
    ]
    const free = {
      1: "空闲",
      0: "繁忙"
    };
    const goods = [
        "R_GM_Goods3", "R_GM_Goods4",
        "R_GM_Goods5",
    ]
    const good = {
      1: "有货",
      0: "无货"
    };
    // 2. å®šä¹‰éœ€è¦å…±ç”¨æ˜ å°„规则的字段列表和对应的映射规则
    const booleanFields = [
      "R_GM_HandShake3",
       "R_GM_STB3",
      "R_GM_ACK3", "W_GM_STB3",
      "W_GM_ACK3",
      "R_GM_HandShake4",
       "R_GM_STB4",
      "R_GM_ACK4", "W_GM_STB4",
      "W_GM_ACK4",
      "R_GM_HandShake5",
       "R_GM_STB5",
      "R_GM_ACK5", "W_GM_STB5",
      "W_GM_ACK5",
    ];
    const booleanMap = {
      true: "是",
      false: "否"
    };
    // å¤„理数据,先处理普通映射,再批量处理共用映射的字段
    const processData = (rawData) => {
    // å¤„理GM原始数据
    const processGMData = (rawData) => {
      if (!rawData) return {};
      const processed = { ...rawData };
      // å¤„理普通字段映射
      Object.keys(statusMap).forEach(key => {
      // å¤„理核心状态字段
      Object.entries(gmStatusConfig.coreStatus).forEach(([key, map]) => {
        if (processed.hasOwnProperty(key)) {
          const map = statusMap[key];
          processed[key] = map[processed[key]] || processed[key];
        }
      });
      // æ‰¹é‡å¤„理共用映射规则的字段
      booleanFields.forEach(key => {
        if (processed.hasOwnProperty(key)) {
          processed[key] = booleanMap[processed[key]] || processed[key];
        }
      });
      onlines.forEach(key => {
        if (processed.hasOwnProperty(key)) {
          processed[key] = online[processed[key]] || processed[key];
        }
      });
      alarms.forEach(key => {
        if (processed.hasOwnProperty(key)) {
          processed[key] = alarm[processed[key]] || processed[key];
        }
      });
      frees.forEach(key => {
        if (processed.hasOwnProperty(key)) {
          processed[key] = free[processed[key]] || processed[key];
        }
      });
      goods.forEach(key => {
        if (processed.hasOwnProperty(key)) {
          processed[key] = good[processed[key]] || processed[key];
        }
      // æ‰¹é‡å¤„理分组字段
      [
        gmStatusConfig.onlineStatus,
        gmStatusConfig.alarmStatus,
        gmStatusConfig.freeStatus,
        gmStatusConfig.goodsStatus,
        gmStatusConfig.signalFields
      ].forEach(group => {
        group.keys.forEach(key => {
          if (processed.hasOwnProperty(key)) {
            processed[key] = group.map[processed[key]] || processed[key];
          }
        });
      });
      return processed;
    };
    onMounted(() => {
      nextTick(() => {
        setInterval(() => {
          const rawData = store.state.homedata;
          data.value = processData(rawData);
          const xian = document.getElementsByClassName("xzhi");
          for (let i = 0; i < xian.length; i++) {
            if (xian[i].innerHTML === "是" || xian[i].innerHTML === "联机") {
              xian[i].style.color = "yellow";
            } else if (xian[i].innerHTML === "否") {
              xian[i].style.color = "red";
    // å»¶è¿Ÿæ›´æ–°GM数据,避免高频刷新导致的闪烁
    const delayedUpdateGMData = (newRawData) => {
      if (updateTimer) clearTimeout(updateTimer);
      updateTimer = setTimeout(() => {
        // ä»…处理包含GM特征字段的数据
        if (newRawData && newRawData.R_GM_Status !== undefined) {
          gmData.value = processGMData(newRawData);
          // æ›´æ–°æ ·å¼
          nextTick(() => {
            const valueElements = document.getElementsByClassName("xzhi");
            for (let i = 0; i < valueElements.length; i++) {
              const text = valueElements[i].innerHTML;
              if (text === "是" || text === "联机") {
                valueElements[i].style.color = "yellow";
              } else if (text === "否") {
                valueElements[i].style.color = "red";
              }
            }
          });
        }
      }, UPDATE_DELAY);
    };
    onMounted(() => {
      // åˆå§‹åŠ è½½æ•°æ®
      const initialData = store.state.homedata;
      if (initialData && initialData.R_GM_Status !== undefined) {
        gmData.value = processGMData(initialData);
      }
      // ç›‘听数据变化,只处理GM数据
      const unwatch = watch(
        () => store.state.homedata,
        (newData) => {
          if (newData && newData.R_GM_Status !== undefined) {
            delayedUpdateGMData(newData);
          }
        });
        },
        { deep: true }
      );
      // ç»„件卸载时清理资源
      onUnmounted(() => {
        unwatch();
        if (updateTimer) clearTimeout(updateTimer);
      });
    });
    return {
      data,
      gmData
    };
  }
};
@@ -462,3 +437,4 @@
  border-radius: 10px;
}
</style>