#
Junjie
1 天以前 909164aa1859fdf25330eb130bc90b8bd22e540b
src/main/webapp/components/DevpCard.js
@@ -1,9 +1,11 @@
var stationTracePageVersion = "20260319_station_trace_layout_v2";
Vue.component("devp-card", {
  template: `
    <div class="mc-root">
      <div class="mc-toolbar">
        <div class="mc-title">输送监控</div>
        <div class="mc-search">
        <div v-if="!readOnly" class="mc-search">
          <input class="mc-input" v-model="searchStationId" placeholder="请输入站号" />
          <button type="button" class="mc-btn mc-btn-ghost" @click="getDevpStateInfo">查询</button>
        </div>
@@ -32,6 +34,8 @@
          <div class="mc-action-row">
            <button type="button" class="mc-btn" @click="controlCommand">下发</button>
            <button type="button" class="mc-btn mc-btn-soft" @click="resetCommand">复位</button>
            <button type="button" class="mc-btn mc-btn-ghost" @click="openStationTracePage">运行轨迹</button>
            <button v-if="showFakeTraceEntry" type="button" class="mc-btn mc-btn-ghost" @click="openFakeTracePage">仿真轨迹</button>
          </div>
        </div>
      </div>
@@ -88,7 +92,7 @@
        <div v-if="displayStationList.length === 0" class="mc-empty">当前没有可展示的站点数据</div>
      </div>
      <div class="mc-footer">
      <div v-if="!readOnly || totalPages > 1" class="mc-footer">
        <button type="button" class="mc-page-btn" :disabled="currentPage <= 1" @click="handlePageChange(currentPage - 1)">上一页</button>
        <span>{{ currentPage }} / {{ totalPages }}</span>
        <button type="button" class="mc-page-btn" :disabled="currentPage >= totalPages" @click="handlePageChange(currentPage + 1)">下一页</button>
@@ -113,7 +117,8 @@
        targetStationId: ""
      },
      barcodePreviewCache: {},
      pageSize: 12,
      showFakeTraceEntry: false,
      pageSize: this.readOnly ? 24 : 12,
      currentPage: 1,
      timer: null
    };
@@ -155,6 +160,7 @@
  },
  created: function () {
    MonitorCardKit.ensureStyles();
    this.loadFakeProcessStatus();
    if (this.autoRefresh) {
      this.timer = setInterval(this.getDevpStateInfo, 1000);
    }
@@ -223,8 +229,34 @@
        this.afterDataRefresh();
      }
    },
    loadFakeProcessStatus: function () {
      if (this.readOnly || !window.$ || typeof baseUrl === "undefined") {
        this.showFakeTraceEntry = false;
        return;
      }
      $.ajax({
        url: baseUrl + "/openapi/getFakeSystemRunStatus",
        method: "get",
        success: function (res) {
          var data = res && res.data ? res.data : null;
          this.showFakeTraceEntry = !!(data && data.isFake);
        }.bind(this),
        error: function () {
          this.showFakeTraceEntry = false;
        }.bind(this)
      });
    },
    openControl: function () {
      this.showControl = !this.showControl;
    },
    openFakeTracePage: function () {
      if (!this.showFakeTraceEntry) {
        return;
      }
      window.open(baseUrl + "/views/watch/fakeTrace.html", "_blank");
    },
    openStationTracePage: function () {
      window.open(baseUrl + "/views/watch/stationTrace.html?v=" + stationTracePageVersion, "_blank");
    },
    buildDetailEntries: function (item) {
      return [
@@ -243,11 +275,27 @@
        { label: "条码", value: this.orDash(item.barcode), code: true, type: "barcode" },
        { label: "重量", value: this.orDash(item.weight) },
        { label: "任务可写区", value: this.orDash(item.taskWriteIdx) },
        { label: "缓存区数据", value: this.formatTaskBufferItems(item.taskBufferItems), code: true },
        { label: "故障代码", value: this.orDash(item.error) },
        { label: "故障信息", value: this.orDash(item.errorMsg) },
        { label: "系统告警", value: this.orDash(item.systemWarning) },
        { label: "扩展数据", value: this.orDash(item.extend) }
      ];
    },
    formatTaskBufferItems: function (items) {
      if (!Array.isArray(items) || items.length === 0) {
        return "--";
      }
      return items.map(function (item) {
        var slotIdx = item && item.slotIdx != null ? item.slotIdx : "?";
        var taskNo = item && item.taskNo != null ? item.taskNo : 0;
        var targetStaNo = item && item.targetStaNo != null ? item.targetStaNo : 0;
        if (!taskNo && !targetStaNo) {
          return slotIdx + ": 空";
        }
        return slotIdx + ": " + taskNo + " -> " + targetStaNo;
      }).join(" | ");
    },
    postControl: function (url, payload) {
      $.ajax({
        url: baseUrl + url,