helongyang
2025-11-17 291067c13bfe8fb9c876e3764a828dc3ddd22f99
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/InkWarehouse.vue
@@ -1,95 +1,127 @@
<template>
  <div id="title">
    <div id="bkuang" style="border-top: none">
      <!-- YM仓堆垛机状态面板 -->
      <div class="skuang">
        <div class="zhuname">油墨仓堆垛机</div>
        <div class="zhankuang">
          <div class="xname">堆垛机状态:</div>
          <div class="xzhi" :title="data.R_YM_Status">{{ data.R_YM_Status }}</div>
          <div class="xzhi" :title="ymData.R_YM_Status">{{ ymData.R_YM_Status || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">堆垛机手自动状态:</div>
          <div class="xzhi" :title="data.R_YM_AutoStatus">{{ data.R_YM_AutoStatus }}</div>
          <div class="xzhi" :title="ymData.R_YM_AutoStatus">{{ ymData.R_YM_AutoStatus || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">正在执行的任务号:</div>
          <div class="xzhi" :title="data.R_YM_TaskNum">{{ data.R_YM_TaskNum }}</div>
          <div class="xzhi" :title="ymData.R_YM_TaskNum">{{ ymData.R_YM_TaskNum || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">堆垛机工作状态:</div>
          <div class="xzhi" :title="data.R_YM_WorkStatus">{{ data.R_YM_WorkStatus }}</div>
          <div class="xzhi" :title="ymData.R_YM_WorkStatus">{{ ymData.R_YM_WorkStatus || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">作业类型:</div>
          <div class="xzhi" :title="data.R_YM_WorkType">{{ data.R_YM_WorkType }}</div>
          <div class="xzhi" :title="ymData.R_YM_WorkType">{{ ymData.R_YM_WorkType || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">托盘类型:</div>
          <div class="xzhi" :title="data.R_YM_TrayType">{{ data.R_YM_TrayType }}</div>
          <div class="xzhi" :title="ymData.R_YM_TrayType">{{ ymData.R_YM_TrayType || '-' }}</div>
        </div>
        <!-- æ–°å¢žï¼šå½“前所在列显示 -->
        <div class="zhankuang">
          <div class="xname">当前所在列:</div>
          <div class="xzhi" :title="ymData.R_YM_Column">{{ ymData.R_YM_Column || '未知' }}</div>
        </div>
      </div>
      <!-- YM关联站台(出入库9001) -->
      <div class="skuang">
        <div class="zhuname">出入库9001站台</div>
        <div class="zhankuang">
          <div class="xname">有货(读):</div>
          <div class="xzhi" :title="data.R_YM_Tray1">{{ data.R_YM_Tray1 }}</div>
          <div class="xzhi" :title="ymData.R_YM_Tray1">{{ ymData.R_YM_Tray1 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">入库执行中(读):</div>
          <div class="xzhi" :title="data.R_YM_Inbounding1">{{ data.R_YM_Inbounding1 }}</div>
          <div class="xzhi" :title="ymData.R_YM_Inbounding1">{{ ymData.R_YM_Inbounding1 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">提升机空闲(读):</div>
          <div class="xzhi" :title="data.R_YM_Leisure1">{{ data.R_YM_Leisure1 }}</div>
          <div class="xzhi" :title="ymData.R_YM_Leisure1">{{ ymData.R_YM_Leisure1 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">出库执行中(读):</div>
          <div class="xzhi" :title="data.R_YM_Outbounding1">{{ data.R_YM_Outbounding1 }}</div>
          <div class="xzhi" :title="ymData.R_YM_Outbounding1">{{ ymData.R_YM_Outbounding1 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">申请入库(写):</div>
          <div class="xzhi" :title="data.W_YM_RequestIn1">{{ data.W_YM_RequestIn1 }}</div>
          <div class="xzhi" :title="ymData.W_YM_RequestIn1">{{ ymData.W_YM_RequestIn1 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">申请出库(写):</div>
          <div class="xzhi" :title="data.W_YM_RequestOut1">{{ data.W_YM_RequestOut1 }}</div>
          <div class="xzhi" :title="ymData.W_YM_RequestOut1">{{ ymData.W_YM_RequestOut1 || '-' }}</div>
        </div> 
      </div>
      <!-- YM关联站台(出入库9002) -->
      <div class="skuang">
        <div class="zhuname">出入库9002站台</div>
        <div class="zhankuang">
          <div class="xname">有货(读):</div>
          <div class="xzhi" :title="data.R_YM_Tray2">{{ data.R_YM_Tray2 }}</div>
          <div class="xzhi" :title="ymData.R_YM_Tray2">{{ ymData.R_YM_Tray2 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">入库执行中(读):</div>
          <div class="xzhi" :title="data.R_YM_Inbounding2">{{ data.R_YM_Inbounding2 }}</div>
          <div class="xzhi" :title="ymData.R_YM_Inbounding2">{{ ymData.R_YM_Inbounding2 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">提升机空闲(读):</div>
          <div class="xzhi" :title="data.R_YM_Leisure2">{{ data.R_YM_Leisure2 }}</div>
          <div class="xzhi" :title="ymData.R_YM_Leisure2">{{ ymData.R_YM_Leisure2 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">出库执行中(读):</div>
          <div class="xzhi" :title="data.R_YM_Outbounding2">{{ data.R_YM_Outbounding2 }}</div>
          <div class="xzhi" :title="ymData.R_YM_Outbounding2">{{ ymData.R_YM_Outbounding2 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">申请入库(写):</div>
          <div class="xzhi" :title="data.W_YM_RequestIn2">{{ data.W_YM_RequestIn2 }}</div>
          <div class="xzhi" :title="ymData.W_YM_RequestIn2">{{ ymData.W_YM_RequestIn2 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">申请出库(写):</div>
          <div class="xzhi" :title="data.W_YM_RequestOut2">{{ data.W_YM_RequestOut2 }}</div>
          <div class="xzhi" :title="ymData.W_YM_RequestOut2">{{ ymData.W_YM_RequestOut2 || '-' }}</div>
        </div>
      </div>
    </div>
    <!-- æ–°å¢žï¼šå †åž›æœºå½“前列文字显示 -->
    <div id="ym-nowcolumn" :class="{ 'abnormal-column': ymData.R_YM_Status !== '正常' }">
      <div>油墨堆垛机当前所在列:
        <span :title="ymData.R_YM_Column">{{ ymData.R_YM_Column || '未知' }}</span>
      </div>
    </div>
    
    <!-- æ–°å¢žï¼šåˆ—方格展示区域 -->
    <div class="ym-column-container" :class="{ 'pp-status-abnormal': ymData.R_YM_Status !== '正常' }">
      <!-- ä¸Šæ–¹1-24列 -->
      <div class="column-grid-container">
        <div
          v-for="num in 32"
          :key="num"
          class="column-grid-item"
          :class="{ 'active': num == ymData.R_YM_Column }"
          :title="`列号: ${num}`"
        >
          {{ num }}
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import { ref, nextTick } from "vue";
import { ref, nextTick, watch, onUnmounted } from "vue";
import { useStore } from "vuex";
import { onMounted } from "vue";
@@ -99,18 +131,20 @@
      xuan: 0
    };
  },
  methods: {
  },
  setup() {
    const store = useStore();
    const data = ref({});
    const ymData = ref({});
    // 1. å®šä¹‰æ™®é€šå­—段的映射规则
    const statusMap = {
    const UPDATE_DELAY = 300;
    let updateTimer = null;
    // YM数据映射规则(新增列号处理)
    const ymStatusMap = {
      R_YM_Status: {
        1: "正常",
        2: "故障",
        3: "急停",
        0: "正常",
        1: "故障",
        2: "急停",
        3: "未知"
      },
      R_YM_AutoStatus: {
        0: "ç»´ä¿®",
@@ -139,71 +173,115 @@
        2: "中托盘(2)",
        3: "大托盘(3)",
        4: "特大托盘(4)",
      },
      // æ–°å¢žï¼šåˆ—号映射处理
      R_YM_Column: (val) => val !== undefined ? val : "未知"
    };
    // YM字段分组
    const ymFieldGroups = {
      statusFields: {
        keys: [
          "R_YM_Tray1", "R_YM_Inbounding1", "R_YM_Leisure1", "R_YM_Outbounding1",
          "R_YM_Tray2", "R_YM_Inbounding2", "R_YM_Leisure2", "R_YM_Outbounding2"
        ],
        map: { true: "是", false: "否" }
      },
      requestFields: {
        keys: [
          "W_YM_RequestIn1", "W_YM_RequestOut1",
          "W_YM_RequestIn2", "W_YM_RequestOut2"
        ],
        map: { true: "是", false: "否" }
      }
    };
    // 2. å®šä¹‰éœ€è¦å…±ç”¨æ˜ å°„规则的字段列表和对应的映射规则
    const booleanFields = [
      "R_YM_Tray1", "R_YM_Inbounding1",
      "R_YM_Leisure1", "R_YM_Outbounding1",
      "W_YM_RequestIn1", "W_YM_RequestOut1",
      "R_YM_Tray2", "R_YM_Inbounding2",
      "R_YM_Leisure2", "R_YM_Outbounding2",
      "W_YM_RequestIn2", "W_YM_RequestOut2",
    ];
    const booleanMap = {
      true: "是",
      false: "否"
    // å¤„理YM原始数据(包含列号处理)
    const processYMData = (rawData) => {
      if (!rawData) return {};
      const processedData = { ...rawData };
      // å¤„理核心状态字段
      Object.keys(ymStatusMap).forEach(key => {
        if (processedData.hasOwnProperty(key)) {
          const mapper = ymStatusMap[key];
          processedData[key] = typeof mapper === 'function'
            ? mapper(processedData[key])
            : (mapper[processedData[key]] || processedData[key]);
        }
      });
      // å¤„理分组字段
      Object.values(ymFieldGroups).forEach(group => {
        group.keys.forEach(key => {
          if (processedData.hasOwnProperty(key)) {
            processedData[key] = group.map[processedData[key]] || processedData[key];
          }
        });
      });
      return processedData;
    };
    // å¤„理数据,先处理普通映射,再批量处理共用映射的字段
    const processData = (rawData) => {
      if (!rawData) return {};
      const processed = { ...rawData };
    // å»¶è¿Ÿæ›´æ–°YM数据
    const delayedUpdateYMData = (newRawData) => {
      if (updateTimer) {
        clearTimeout(updateTimer);
      }
      // å¤„理普通字段映射
      Object.keys(statusMap).forEach(key => {
        if (processed.hasOwnProperty(key)) {
          const map = statusMap[key];
          processed[key] = map[processed[key]] || processed[key];
      updateTimer = setTimeout(() => {
        if (newRawData && newRawData.R_YM_Status !== undefined) {
          ymData.value = processYMData(newRawData);
          // æ›´æ–°æ ·å¼
          nextTick(() => {
            const valueElements = document.getElementsByClassName("xzhi");
            for (let i = 0; i < valueElements.length; i++) {
              if (valueElements[i].innerHTML === "是") {
                valueElements[i].style.color = "yellow";
              } else if (valueElements[i].innerHTML === "否") {
                valueElements[i].style.color = "red";
              }
            }
          });
        }
      });
      // æ‰¹é‡å¤„理共用映射规则的字段
      booleanFields.forEach(key => {
        if (processed.hasOwnProperty(key)) {
          processed[key] = booleanMap[processed[key]] || processed[key];
        }
      });
      return processed;
      }, UPDATE_DELAY);
    };
    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].style.color = "yellow";
            } else if (xian[i].innerHTML === "否") {
              xian[i].style.color = "red";
            }
      const initialData = store.state.homedata;
      if (initialData && initialData.R_YM_Status !== undefined) {
        ymData.value = processYMData(initialData);
      }
      const unwatch = watch(
        () => store.state.homedata,
        (newData) => {
          if (newData && newData.R_YM_Status !== undefined) {
            delayedUpdateYMData(newData);
          }
        });
        },
        { deep: true }
      );
      // ç»„件卸载时清理
      onUnmounted(() => {
        unwatch();
        if (updateTimer) {
          clearTimeout(updateTimer);
        }
      });
    });
    return {
      data,
      ymData
    };
  }
};
</script>
<style scoped>
/* åŽŸæœ‰æ ·å¼ä¿æŒä¸å˜ */
.ding {
  float: left;
  width: 20px;
@@ -340,4 +418,76 @@
  margin-left: 1.7%;
  border-radius: 10px;
}
</style>
/* æ–°å¢žï¼šYM堆垛机当前列样式 */
#ym-nowcolumn {
  width: 100%;
  height: 70px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.5cqw;
  font-weight: bold;
  color: #00ff4c;
}
/* å¼‚常状态文字变色 */
#ym-nowcolumn.abnormal-column {
  color: red !important;
}
#ym-nowcolumn.abnormal-column span {
  color: red !important;
}
/* åˆ—容器样式 */
.ym-column-container {
  width: 95%;
  margin: 0 auto;
  position: relative;
  clear: both;
  padding-top: 15px;
}
/* æ–¹æ ¼å®¹å™¨æ ·å¼ */
.column-grid-container {
  width: 100%;
  display: flex;
  flex-wrap: nowrap;
  justify-content: space-between;
  align-items: center;
  gap: 2px;
  position: relative;
  z-index: 2;
  margin-bottom: 10px;
  padding: 0 2px;
}
/* æ–¹æ ¼æ ·å¼ */
.column-grid-item {
  flex: 1;
  min-width: 24px;
  max-width: 60px;
  height: 30px;
  border: 1px solid #fff;
  border-radius: 8px 8px 0 0;
  color: white;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: clamp(8px, 1vw, 14px);
  box-sizing: border-box;
  transition: background-color 0.3s ease;
}
/* å½“前列高亮 */
.column-grid-item.active {
  background-color: green;
  font-weight: bold;
}
/* å¼‚常状态下当前列红色高亮 */
.pp-status-abnormal .column-grid-item.active {
  background-color: red !important;
}
</style>