yuan
5 天以前 9ea5ff67655241271bdf04bb50ca3a8d60c4e22a
src/views/index.vue
@@ -120,35 +120,33 @@
              <el-radio-button :value="'paused'">已暂停({{ orderProgressMeta.pausedCount }})</el-radio-button>
            </el-radio-group>
          </div>
          <div class="order-table-wrap">
            <el-table :data="filteredOrders" stripe max-height="440">
              <el-table-column prop="orderNo" label="订单编号" min-width="150" />
              <el-table-column prop="productName" label="产品名称" min-width="120" />
              <el-table-column prop="planQty" label="计划数量" min-width="90" />
              <el-table-column prop="completedQty" label="已完成" min-width="90" />
              <el-table-column label="完成率" min-width="180">
                <template #default="{ row }">
                  <div class="table-progress">
                    <el-progress
                        :stroke-width="8"
                        :percentage="row.completionRate"
                        :show-text="false"
                        status="success"
                    />
                    <span>{{ row.completionRate }}%</span>
                  </div>
                </template>
              </el-table-column>
              <el-table-column prop="deliveryDate" label="交期" min-width="110" />
              <el-table-column label="状态" min-width="90">
                <template #default="{ row }">
                  <el-tag :type="getOrderStatusType(row.status)" effect="light">
                    {{ row.statusLabel || getOrderStatusText(row.status) }}
                  </el-tag>
                </template>
              </el-table-column>
            </el-table>
          </div>
          <el-table :data="filteredOrders" stripe>
            <el-table-column prop="orderNo" label="订单编号" min-width="150" />
            <el-table-column prop="productName" label="产品名称" min-width="120" />
            <el-table-column prop="planQty" label="计划数量" min-width="90" />
            <el-table-column prop="completedQty" label="已完成" min-width="90" />
            <el-table-column label="完成率" min-width="180">
              <template #default="{ row }">
                <div class="table-progress">
                  <el-progress
                      :stroke-width="8"
                      :percentage="row.completionRate"
                      :show-text="false"
                      status="success"
                  />
                  <span>{{ row.completionRate }}%</span>
                </div>
              </template>
            </el-table-column>
            <el-table-column prop="deliveryDate" label="交期" min-width="110" />
            <el-table-column label="状态" min-width="90">
              <template #default="{ row }">
                <el-tag :type="getOrderStatusType(row.status)" effect="light">
                  {{ row.statusLabel || getOrderStatusText(row.status) }}
                </el-tag>
              </template>
            </el-table-column>
          </el-table>
        </div>
        <div v-if="visiblePanels.contract" class="cockpit-panel contract-panel">
@@ -216,7 +214,7 @@
        <div v-if="visiblePanels.todo" class="cockpit-panel todo-panel">
          <div class="panel-title-row">
            <div class="panel-title">待办事项</div>
            <span class="panel-more">更多</span>
            <span class="panel-more" @click="goToApprovalProcess">更多</span>
          </div>
          <ul class="todo-list" v-if="todoList.length > 0">
            <li v-for="item in todoList" :key="item.id" class="todo-item">
@@ -234,7 +232,7 @@
        <div v-if="visiblePanels.realtime" class="cockpit-panel realtime-panel">
          <div class="panel-title-row">
            <div class="panel-title">生产实时看板</div>
            <span class="panel-more">更多</span>
            <span class="panel-more" @click="goToProductionOrder">更多</span>
          </div>
          <div class="realtime-grid">
            <div class="realtime-item" v-for="item in realtimeBoard" :key="item.key">
@@ -280,7 +278,7 @@
        <div v-if="visiblePanels.plan" class="cockpit-panel plan-panel">
          <div class="panel-title-row">
            <div class="panel-title">今日生产计划</div>
            <span class="panel-more">{{ todayPlanTotal }}项</span>
            <span class="panel-more" @click="goToProductionPlan">{{ todayPlanTotal }}项</span>
          </div>
          <ul class="plan-list">
            <li v-for="item in todayPlanList" :key="item.orderNo" class="plan-item">
@@ -451,7 +449,6 @@
});
const realtimeBoardData = ref({
  deviceOee: { value: 0, compareYesterday: 0 },
  orderAchievementRate: { value: 0, compareYesterday: 0 },
  defectRate: { value: 0, compareYesterday: 0 },
});
@@ -885,22 +882,11 @@
};
const realtimeBoard = computed(() => {
  const oee = Number(realtimeBoardData.value.deviceOee?.value || 0);
  const orderAchievement = Number(realtimeBoardData.value.orderAchievementRate?.value || 0);
  const defectRate = Number(realtimeBoardData.value.defectRate?.value || 0);
  const oeeCompare = Number(realtimeBoardData.value.deviceOee?.compareYesterday || 0);
  const orderCompare = Number(realtimeBoardData.value.orderAchievementRate?.compareYesterday || 0);
  const defectCompare = Number(realtimeBoardData.value.defectRate?.compareYesterday || 0);
  return [
    {
      key: "oee",
      label: "设备 OEE",
      percent: clampPercent(oee),
      display: `${oee.toFixed(2)}%`,
      delta: getCompareText(oeeCompare),
      trend: getCompareTrend(oeeCompare),
      color: "#2d8cff",
    },
    {
      key: "order",
      label: "订单达成率",
@@ -908,7 +894,7 @@
      display: `${orderAchievement.toFixed(2)}%`,
      delta: getCompareText(orderCompare),
      trend: getCompareTrend(orderCompare),
      color: "#31d2ff",
      color: "#2d8cff",
    },
    {
      key: "defect",
@@ -1207,10 +1193,6 @@
    const res = await productionRealtimeBoard();
    const data = res?.data || {};
    realtimeBoardData.value = {
      deviceOee: {
        value: Number(data.deviceOee?.value || 0),
        compareYesterday: Number(data.deviceOee?.compareYesterday || 0),
      },
      orderAchievementRate: {
        value: Number(data.orderAchievementRate?.value || 0),
        compareYesterday: Number(data.orderAchievementRate?.compareYesterday || 0),
@@ -1222,7 +1204,6 @@
    };
  } catch {
    realtimeBoardData.value = {
      deviceOee: { value: 0, compareYesterday: 0 },
      orderAchievementRate: { value: 0, compareYesterday: 0 },
      defectRate: { value: 0, compareYesterday: 0 },
    };
@@ -1234,8 +1215,8 @@
    const res = await productionOrderProgress({
      status: orderFilter.value,
      tab: orderFilter.value,
      pageNum: -1,
      pageSize: -1,
      pageNum: 1,
      pageSize: 10,
    });
    const data = res?.data || {};
    const statusValue = normalizeOrderFilter(data.status, orderFilter.value);
@@ -1398,6 +1379,18 @@
const goToQuick = (path) => {
  if (!path) return;
  router.push(path).catch(() => {});
};
const goToProductionOrder = () => {
  router.push('/productionManagement/productionOrder').catch(() => {});
};
const goToApprovalProcess = () => {
  router.push('/collaborativeApproval/approvalProcess').catch(() => {});
};
const goToProductionPlan = () => {
  router.push('/productionManagement/productionPlan').catch(() => {});
};
watch(orderFilter, () => {
@@ -2096,7 +2089,7 @@
.realtime-grid {
  margin-top: 10px;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
}
@@ -2104,12 +2097,12 @@
  border: 1px solid rgba(148, 163, 184, 0.2);
  border-radius: 12px;
  background: #f8fbff;
  padding: 10px 8px;
  padding: 16px 12px;
  text-align: center;
}
.realtime-value {
  font-size: 26px;
  font-size: 32px;
  color: #0f172a;
  font-weight: 700;
}
@@ -2195,13 +2188,6 @@
}
.order-panel {
  min-height: 0;
  display: flex;
  flex-direction: column;
}
.order-table-wrap {
  flex: 1;
  min-height: 0;
}
@@ -2441,7 +2427,7 @@
  }
  .realtime-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .quality-cards {