helongyang
2025-11-17 291067c13bfe8fb9c876e3764a828dc3ddd22f99
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Client/src/views/deviceMonitoring/PpWarehouse.vue
@@ -1,197 +1,236 @@
<template>
  <div id="title">
    <div id="bkuang" style="border-top: none">
      <!-- PP仓堆垛机状态面板 -->
      <div class="skuang">
        <div class="zhuname">PP仓堆垛机</div>
        <div class="zhankuang">
          <div class="xname">堆垛机状态:</div>
          <div class="xzhi" :title="data.R_PP_Status">{{ data.R_PP_Status }}</div>
          <div class="xzhi" :title="ppData.R_PP_Status">{{ ppData.R_PP_Status }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">堆垛机手自动状态:</div>
          <div class="xzhi" :title="data.R_PP_AutoStatus">{{ data.R_PP_AutoStatus }}</div>
          <div class="xzhi" :title="ppData.R_PP_AutoStatus">{{ ppData.R_PP_AutoStatus }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">正在执行的任务号:</div>
          <div class="xzhi" :title="data.R_PP_TaskNum">{{ data.R_PP_TaskNum }}</div>
          <div class="xzhi" :title="ppData.R_PP_TaskNum">{{ ppData.R_PP_TaskNum }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">堆垛机工作状态:</div>
          <div class="xzhi" :title="data.R_PP_WorkStatus">{{ data.R_PP_WorkStatus }}</div>
          <div class="xzhi" :title="ppData.R_PP_WorkStatus">{{ ppData.R_PP_WorkStatus }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">作业类型:</div>
          <div class="xzhi" :title="data.R_PP_WorkType">{{ data.R_PP_WorkType }}</div>
          <div class="xzhi" :title="ppData.R_PP_WorkType">{{ ppData.R_PP_WorkType }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">托盘类型:</div>
          <div class="xzhi" :title="data.R_PP_TrayType">{{ data.R_PP_TrayType }}</div>
          <div class="xzhi" :title="ppData.R_PP_TrayType">{{ ppData.R_PP_TrayType }}</div>
        </div>
      </div>
      <!-- PP关联站台(入库2004+出库2005) -->
      <div class="skuang">
        <div class="zhuname">入库2004站台</div>
        <div class="zhankuang">
          <div class="xname">读取箱体码(读):</div>
          <div class="xzhi" :title="data.R_PP_Boxcode">{{ data.R_PP_Boxcode }}</div>
          <div class="xzhi" :title="ppData.R_PP_Boxcode">{{ ppData.R_PP_Boxcode || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">握手信号(读):</div>
          <div class="xzhi" :title="data.R_PP_HandShake4">{{ data.R_PP_HandShake4 }}</div>
          <div class="xzhi" :title="ppData.R_PP_HandShake4">{{ ppData.R_PP_HandShake4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否联机(读):</div>
          <div class="xzhi" :title="data.R_PP_Online4">{{ data.R_PP_Online4 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Online4">{{ ppData.R_PP_Online4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否空闲(读):</div>
          <div class="xzhi" :title="data.R_PP_Free4">{{ data.R_PP_Free4 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Free4">{{ ppData.R_PP_Free4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否有货(读):</div>
          <div class="xzhi" :title="data.R_PP_Goods4">{{ data.R_PP_Goods4 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Goods4">{{ ppData.R_PP_Goods4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否故障(读):</div>
          <div class="xzhi" :title="data.R_PP_Alarm4">{{ data.R_PP_Alarm4 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Alarm4">{{ ppData.R_PP_Alarm4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(读):</div>
          <div class="xzhi" :title="data.R_PP_STB4">{{ data.R_PP_STB4 }}</div>
          <div class="xzhi" :title="ppData.R_PP_STB4">{{ ppData.R_PP_STB4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(读):</div>
          <div class="xzhi" :title="data.R_PP_ACK4">{{ data.R_PP_ACK4 }}</div>
          <div class="xzhi" :title="ppData.R_PP_ACK4">{{ ppData.R_PP_ACK4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(写):</div>
          <div class="xzhi" :title="data.W_PP_STB4">{{ data.W_PP_STB4 }}</div>
          <div class="xzhi" :title="ppData.W_PP_STB4">{{ ppData.W_PP_STB4 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(写):</div>
          <div class="xzhi" :title="data.W_PP_ACK4">{{ data.W_PP_ACK4 }}</div>
          <div class="xzhi" :title="ppData.W_PP_ACK4">{{ ppData.W_PP_ACK4 || '-' }}</div>
        </div>
        <div class="zhuname">出库2005站台</div>
        <div class="zhankuang">
          <div class="xname">握手信号(读):</div>
          <div class="xzhi" :title="data.R_PP_HandShake5">{{ data.R_PP_HandShake5 }}</div>
          <div class="xzhi" :title="ppData.R_PP_HandShake5">{{ ppData.R_PP_HandShake5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否联机(读):</div>
          <div class="xzhi" :title="data.R_PP_Online5">{{ data.R_PP_Online5 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Online5">{{ ppData.R_PP_Online5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否空闲(读):</div>
          <div class="xzhi" :title="data.R_PP_Free5">{{ data.R_PP_Free5 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Free5">{{ ppData.R_PP_Free5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否有货(读):</div>
          <div class="xzhi" :title="data.R_PP_Goods5">{{ data.R_PP_Goods5 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Goods5">{{ ppData.R_PP_Goods5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否故障(读):</div>
          <div class="xzhi" :title="data.R_PP_Alarm5">{{ data.R_PP_Alarm5 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Alarm5">{{ ppData.R_PP_Alarm5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(读):</div>
          <div class="xzhi" :title="data.R_PP_STB5">{{ data.R_PP_STB5 }}</div>
          <div class="xzhi" :title="ppData.R_PP_STB5">{{ ppData.R_PP_STB5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(读):</div>
          <div class="xzhi" :title="data.R_PP_ACK5">{{ data.R_PP_ACK5 }}</div>
          <div class="xzhi" :title="ppData.R_PP_ACK5">{{ ppData.R_PP_ACK5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(写):</div>
          <div class="xzhi" :title="data.W_PP_STB5">{{ data.W_PP_STB5 }}</div>
          <div class="xzhi" :title="ppData.W_PP_STB5">{{ ppData.W_PP_STB5 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(写):</div>
          <div class="xzhi" :title="data.W_PP_ACK5">{{ data.W_PP_ACK5 }}</div>
          <div class="xzhi" :title="ppData.W_PP_ACK5">{{ ppData.W_PP_ACK5 || '-' }}</div>
        </div>
      </div>
      <!-- PP关联站台(出库2016+出库2017) -->
      <div class="skuang">
        <div class="zhuname">出库2016站台</div>
        <div class="zhankuang">
          <div class="xname">握手信号(读):</div>
          <div class="xzhi" :title="data.R_PP_HandShake6">{{ data.R_PP_HandShake6 }}</div>
          <div class="xzhi" :title="ppData.R_PP_HandShake6">{{ ppData.R_PP_HandShake6 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否联机(读):</div>
          <div class="xzhi" :title="data.R_PP_Online6">{{ data.R_PP_Online6 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Online6">{{ ppData.R_PP_Online6 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否空闲(读):</div>
          <div class="xzhi" :title="data.R_PP_Free6">{{ data.R_PP_Free6 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Free6">{{ ppData.R_PP_Free6 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否有货(读):</div>
          <div class="xzhi" :title="data.R_PP_Goods6">{{ data.R_PP_Goods6 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Goods6">{{ ppData.R_PP_Goods6 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否故障(读):</div>
          <div class="xzhi" :title="data.R_PP_Alarm6">{{ data.R_PP_Alarm6 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Alarm6">{{ ppData.R_PP_Alarm6 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(读):</div>
          <div class="xzhi" :title="data.R_PP_STB6">{{ data.R_PP_STB6 }}</div>
          <div class="xzhi" :title="ppData.R_PP_STB6">{{ ppData.R_PP_STB6 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(读):</div>
          <div class="xzhi" :title="data.R_PP_ACK6">{{ data.R_PP_ACK6 }}</div>
          <div class="xzhi" :title="ppData.R_PP_ACK6">{{ ppData.R_PP_ACK6 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(写):</div>
          <div class="xzhi" :title="data.W_PP_STB6">{{ data.W_PP_STB6 }}</div>
          <div class="xzhi" :title="ppData.W_PP_STB6">{{ ppData.W_PP_STB6 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(写):</div>
          <div class="xzhi" :title="data.W_PP_ACK6">{{ data.W_PP_ACK6 }}</div>
          <div class="xzhi" :title="ppData.W_PP_ACK6">{{ ppData.W_PP_ACK6 || '-' }}</div>
        </div>
        <div class="zhuname">出库2017站台</div>
        <div class="zhankuang">
          <div class="xname">握手信号(读):</div>
          <div class="xzhi" :title="data.R_PP_HandShake7">{{ data.R_PP_HandShake7 }}</div>
          <div class="xzhi" :title="ppData.R_PP_HandShake7">{{ ppData.R_PP_HandShake7 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否联机(读):</div>
          <div class="xzhi" :title="data.R_PP_Online7">{{ data.R_PP_Online7 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Online7">{{ ppData.R_PP_Online7 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否空闲(读):</div>
          <div class="xzhi" :title="data.R_PP_Free7">{{ data.R_PP_Free7 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Free7">{{ ppData.R_PP_Free7 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否有货(读):</div>
          <div class="xzhi" :title="data.R_PP_Goods7">{{ data.R_PP_Goods7 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Goods7">{{ ppData.R_PP_Goods7 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">是否故障(读):</div>
          <div class="xzhi" :title="data.R_PP_Alarm7">{{ data.R_PP_Alarm7 }}</div>
          <div class="xzhi" :title="ppData.R_PP_Alarm7">{{ ppData.R_PP_Alarm7 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(读):</div>
          <div class="xzhi" :title="data.R_PP_STB7">{{ data.R_PP_STB7 }}</div>
          <div class="xzhi" :title="ppData.R_PP_STB7">{{ ppData.R_PP_STB7 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(读):</div>
          <div class="xzhi" :title="data.R_PP_ACK7">{{ data.R_PP_ACK7 }}</div>
          <div class="xzhi" :title="ppData.R_PP_ACK7">{{ ppData.R_PP_ACK7 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">请求信号(写):</div>
          <div class="xzhi" :title="data.W_PP_STB7">{{ data.W_PP_STB7 }}</div>
          <div class="xzhi" :title="ppData.W_PP_STB7">{{ ppData.W_PP_STB7 || '-' }}</div>
        </div>
        <div class="zhankuang">
          <div class="xname">响应信号(写):</div>
          <div class="xzhi" :title="data.W_PP_ACK7">{{ data.W_PP_ACK7 }}</div>
          <div class="xzhi" :title="ppData.W_PP_ACK7">{{ ppData.W_PP_ACK7 || '-' }}</div>
        </div>
      </div>
    </div>
    <div id="nowcolumn" :class="{ 'abnormal-column': ppData.R_PP_Status !== '正常' }">
      <div>PP堆垛机当前所在列:
        <span :title="ppData.R_PP_Column">{{ ppData.R_PP_Column || '未知' }}</span>
      </div>
    </div>
    <div class="column-container" :class="{ 'pp-status-abnormal': ppData.R_PP_Status !== '正常' }">
    <!-- ä¸Šæ–¹1-24列 -->
    <div class="column-grid-container">
      <div
        v-for="num in 24"
        :key="num"
        class="column-grid-item"
        :class="{ 'active': num == ppData.R_PP_Column }"
        :title="`列号: ${num}`"
      >
        {{ num }}
      </div>
    </div>
    <!-- ä¸‹æ–¹25-47列 (23个) -->
    <div class="column-grid-container">
      <div
        v-for="i in 23"
        :key="'lower-' + i"
        class="column-grid-item"
        :class="{ 'active': (24 + i) == ppData.R_PP_Column }"
        :title="`列号: ${24 + i}`"
      >
        {{ 24 + i }}
      </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";
@@ -201,18 +240,21 @@
      xuan: 0
    };
  },
  methods: {
  },
  setup() {
    const store = useStore();
    const data = ref({});
    const ppData = ref({});
    // 1. å®šä¹‰æ™®é€šå­—段的映射规则
    // å»¶è¿Ÿæ›´æ–°é…ç½®
    const UPDATE_DELAY = 300;
    let updateTimer = null;
    // PP数据映射规则
    const statusMap = {
      R_PP_Status: {
        1: "正常",
        2: "故障",
        3: "急停",
        0: "正常",
        1: "故障",
        2: "急停",
        3: "未知"
      },
      R_PP_AutoStatus: {
        0: "ç»´ä¿®",
@@ -241,123 +283,110 @@
        2: "中托盘(2)",
        3: "大托盘(3)",
        4: "特大托盘(4)",
      },
      R_PP_Column: (val) => val !== undefined ? val : "未知"
    };
    // PP相关布尔字段分组
    const fieldGroups = {
      online: {
        fields: ["R_PP_Online6", "R_PP_Online4", "R_PP_Online5", "R_PP_Online7"],
        map: { true: "联机", false: "脱机" }
      },
      alarm: {
        fields: ["R_PP_Alarm6", "R_PP_Alarm4", "R_PP_Alarm5", "R_PP_Alarm7"],
        map: { true: "故障", false: "正常" }
      },
      free: {
        fields: ["R_PP_Free6", "R_PP_Free4", "R_PP_Free5", "R_PP_Free7"],
        map: { true: "空闲", false: "繁忙" }
      },
      goods: {
        fields: ["R_PP_Goods6", "R_PP_Goods4", "R_PP_Goods5", "R_PP_Goods7"],
        map: { true: "有货", false: "无货" }
      },
      signal: {
        fields: [
          "R_PP_HandShake4", "R_PP_STB4", "R_PP_ACK4", "W_PP_STB4", "W_PP_ACK4",
          "R_PP_HandShake5", "R_PP_STB5", "R_PP_ACK5", "W_PP_STB5", "W_PP_ACK5",
          "R_PP_HandShake6", "R_PP_STB6", "R_PP_ACK6", "W_PP_STB6", "W_PP_ACK6",
          "R_PP_HandShake7", "R_PP_STB7", "R_PP_ACK7", "W_PP_STB7", "W_PP_ACK7"
        ],
        map: { true: "是", false: "否" }
      }
    };
    const onlines = [
        "R_PP_Online6","R_PP_Online4",
        "R_PP_Online5","R_PP_Online7"
    ]
    const online = {
      true: "联机",
      false: "脱机"
    };
    const alarms = [
        "R_PP_Alarm6","R_PP_Alarm4",
        "R_PP_Alarm5","R_PP_Alarm7"
    ]
    const alarm = {
      true: "故障",
      false: "正常"
    };
    const frees = [
        "R_PP_Free6","R_PP_Free4",
        "R_PP_Free5","R_PP_Free7"
    ]
    const free = {
      true: "空闲",
      false: "繁忙"
    };
    const goods = [
        "R_PP_Goods6", "R_PP_Goods4",
        "R_PP_Goods5","R_PP_Goods7"
    ]
    const good = {
      true: "有货",
      false: "无货"
    };
    // 2. å®šä¹‰éœ€è¦å…±ç”¨æ˜ å°„规则的字段列表和对应的映射规则
    const booleanFields = [
      "R_PP_HandShake4", "R_PP_STB4",
      "R_PP_ACK4", "W_PP_STB4",
      "W_PP_ACK4",
      "R_PP_HandShake5", "R_PP_STB5",
      "R_PP_ACK5", "W_PP_STB5",
      "W_PP_ACK5",
      "R_PP_HandShake6", "R_PP_STB6",
      "R_PP_ACK6", "W_PP_STB6",
      "W_PP_ACK6",
      "R_PP_HandShake7", "R_PP_STB7",
      "R_PP_ACK7", "W_PP_STB7",
      "W_PP_ACK7",
    ];
    const booleanMap = {
      true: "是",
      false: "否"
    };
    // å¤„理数据,先处理普通映射,再批量处理共用映射的字段
    const processData = (rawData) => {
    // å¤„理PP原始数据
    const processPPData = (rawData) => {
      if (!rawData) return {};
      const processed = { ...rawData };
      // å¤„理普通字段映射
      // å¤„理状态字段映射
      Object.keys(statusMap).forEach(key => {
        if (processed.hasOwnProperty(key)) {
          const map = statusMap[key];
          processed[key] = map[processed[key]] || processed[key];
          const mapper = statusMap[key];
          processed[key] = typeof mapper === 'function'
            ? mapper(processed[key])
            : (mapper[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];
        }
      // å¤„理布尔型字段映射
      Object.values(fieldGroups).forEach(group => {
        group.fields.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].style.color = "yellow";
            } else if (xian[i].innerHTML === "否") {
              xian[i].style.color = "red";
    // å»¶è¿Ÿæ›´æ–°PP数据
    const delayedUpdatePPData = (newRawData) => {
      if (updateTimer) clearTimeout(updateTimer);
      updateTimer = setTimeout(() => {
        if (newRawData && newRawData.R_PP_Status !== undefined) {
          ppData.value = processPPData(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";
              }
            }
          });
        }
      }, UPDATE_DELAY);
    };
    onMounted(() => {
      const initialData = store.state.homedata;
      if (initialData && initialData.R_PP_Status !== undefined) {
        ppData.value = processPPData(initialData);
      }
      const unwatch = watch(
        () => store.state.homedata,
        (newData) => {
          if (newData && newData.R_PP_Status !== undefined) {
            delayedUpdatePPData(newData);
          }
        });
        },
        { deep: true }
      );
      onUnmounted(() => {
        unwatch();
        if (updateTimer) clearTimeout(updateTimer);
      });
    });
    return {
      data,
      ppData
    };
  }
};
@@ -499,5 +528,89 @@
  background: rgba(255, 255, 255, 0.2);
  margin-left: 1.7%;
  border-radius: 10px;
  padding-bottom: 20px;
}
</style>
/* å †åž›æœºå½“前列样式 */
#nowcolumn {
  width: 100%;
  height: 70px;
  float: left;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 1.5cqw;
  font-weight: bold;
  color: #00ff4c;
}
/* å †åž›æœºçŠ¶æ€å¼‚å¸¸æ—¶ï¼Œå½“å‰åˆ—æ–‡å­—å˜ä¸ºçº¢è‰² */
#nowcolumn.abnormal-column {
  color: red !important;
}
#nowcolumn.abnormal-column span {
  color: red !important;
}
/* åˆ—容器 */
.column-container {
  width: 95%;
  margin: 0 auto;
  position: relative;
  clear: both;
  padding-top: 15px;
}
/* è“è‰²åˆ†å‰²çº¿ */
.column-separator {
  width: 100%;
  height: 20px;
  background-color: #3bc0ed;
  position: absolute;
  top: 0; /* è°ƒæ•´åˆ°æ–¹æ ¼é¡¶éƒ¨å¯¹é½ */
  left: 0;
  z-index: 1; /* ç¡®ä¿åœ¨æ–¹æ ¼ä¸‹æ–¹ */
  border-radius: 4px 4px 0 0;
}
.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>