yuan
2026-06-12 7726b6cdab80596d2e2f7dd3fe1ec3dfbdeee155
src/views/productionManagement/productionTraceability/index.vue
@@ -1,5 +1,7 @@
<template>
  <div class="app-container">
    <PageHeader v-if="showHeader"
                content="生产订单" />
    <el-card style="height:82vh;overflow:auto;">
      <template #header>
        <div class="card-header">
@@ -78,11 +80,17 @@
                  {{ row.workOrder.model || '-' }}
                </template>
              </el-table-column>
              <el-table-column label="工序"
                               prop="workOrder.operationName"
                               align="center" />
              <el-table-column prop="workOrder.planQuantity"
                               label="需求数量"
                               align="center" />
              <el-table-column prop="workOrder.completeQuantity"
                               label="完成数量"
                               align="center" />
              <el-table-column prop="workOrder.scrapQty"
                               label="报废数量"
                               align="center" />
              <el-table-column prop="workOrder.completionStatus"
                               label="完成进度"
@@ -152,13 +160,22 @@
                {{ parseTime(row.createTime) }}
              </template>
            </el-table-column>
            <el-table-column label="工时(h)"
                             prop="workHour"
                             align="center" />
            <el-table-column label="产出数量"
                             prop="quantity"
                             align="center" />
            <el-table-column label="报废数量"
                             prop="scrapQty"
                             align="center" />
            <el-table-column label="操作"
                             align="center"
                             width="200">
              <template #default="{ row }">
                <el-button type="primary"
                           link
                           @click="showInput(row.id)">查看投入</el-button>
                           @click="showInput(row.productionProductMainId)">查看投入</el-button>
                <el-button type="primary"
                           link
                           @click="showParamDetail(row.productionOperationParamList)">参数详情</el-button>
@@ -223,9 +240,9 @@
              <el-descriptions-item label="规格型号">{{ record.model || '-' }}</el-descriptions-item>
              <el-descriptions-item label="数量">{{ record.quantity || 0 }} {{ record.unit || '-' }}</el-descriptions-item>
              <el-descriptions-item label="检测单位">{{ record.checkCompany || '-' }}</el-descriptions-item>
              <el-descriptions-item label="检测结果">
                <el-tag :type="record.checkResult === '合格' ? 'success' : 'danger'">
                  {{ record.checkResult || '待检测' }}
              <el-descriptions-item label="合格率">
                <el-tag :type="getPassRateTagType(record)">
                  {{ getPassRateDisplay(record) }}
                </el-tag>
              </el-descriptions-item>
            </el-descriptions>
@@ -267,7 +284,7 @@
</template>
<script setup>
  import { ref, reactive, onMounted } from "vue";
  import { ref, reactive, onMounted, computed } from "vue";
  import { useRoute, useRouter } from "vue-router";
  import { ElMessage } from "element-plus";
  import { parseTime } from "@/utils/ruoyi";
@@ -279,6 +296,13 @@
  const route = useRoute();
  const router = useRouter();
  // 判断是否显示页头
  const showHeader = computed(() => {
    return (
      Object.keys(route.query).length > 0 || Object.keys(route.params).length > 0
    );
  });
  // 搜索相关
  const searchForm = reactive({
@@ -336,6 +360,28 @@
    return "#67c23a";
  };
  const getPassRate = (record) => {
    const qualified = Number(record.qualifiedQuantity) || 0;
    const unqualified = Number(record.unqualifiedQuantity) || 0;
    const total = qualified + unqualified;
    if (total === 0) return null;
    return Number(((qualified / total) * 100).toFixed(2));
  };
  const getPassRateDisplay = (record) => {
    const rate = getPassRate(record);
    if (rate === null) return '—';
    return `${rate}%`;
  };
  const getPassRateTagType = (record) => {
    const rate = getPassRate(record);
    if (rate === null) return 'info';
    if (rate >= 100) return 'success';
    if (rate >= 75) return 'primary';
    return 'danger';
  };
  // 模拟搜索方法
  const handleNpsNoSearch = async query => {
    npsNoLoading.value = true;
@@ -385,6 +431,7 @@
      workOrder: row.workOrder || {},
      reports: (row.reportList || []).map(r => ({
        ...r.reportMain,
        ...(r.reportOutputList[0] || {}),
        productionOperationParamList: r.reportParamList || [],
      })),
    };