From 2941df634ce50c9f3ef0d62262079962dfa91780 Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期五, 26 六月 2026 17:26:29 +0800
Subject: [PATCH] 生产订单-来源弹窗多条数据样式问题修正

---
 src/views/productionManagement/productionOrder/index.vue | 1746 ++++++++++++++++++++++++++++-----------------------------
 1 files changed, 866 insertions(+), 880 deletions(-)

diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index 338c68f..9547002 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -1,169 +1,147 @@
 <template>
   <div class="app-container">
     <div class="search_form">
-      <el-form :model="searchForm" :inline="true">
+      <el-form :model="searchForm"
+               :inline="true">
         <el-form-item label="鐢熶骇璁㈠崟鍙�:">
-          <el-input
-            v-model="searchForm.npsNo"
-            placeholder="璇疯緭鍏�"
-            clearable
-            prefix-icon="Search"
-            style="width: 160px"
-            @change="handleQuery"
-          />
+          <el-input v-model="searchForm.npsNo"
+                    placeholder="璇疯緭鍏�"
+                    clearable
+                    prefix-icon="Search"
+                    style="width: 160px"
+                    @change="handleQuery" />
         </el-form-item>
         <el-form-item label="浜у搧鍚嶇О:">
-          <el-input
-            v-model="searchForm.productName"
-            placeholder="璇疯緭鍏�"
-            clearable
-            prefix-icon="Search"
-            style="width: 160px"
-            @change="handleQuery"
-          />
+          <el-input v-model="searchForm.productName"
+                    placeholder="璇疯緭鍏�"
+                    clearable
+                    prefix-icon="Search"
+                    style="width: 160px"
+                    @change="handleQuery" />
         </el-form-item>
         <el-form-item label="瑙勬牸:">
-          <el-input
-            v-model="searchForm.model"
-            placeholder="璇疯緭鍏�"
-            clearable
-            prefix-icon="Search"
-            style="width: 160px"
-            @change="handleQuery"
-          />
+          <el-input v-model="searchForm.model"
+                    placeholder="璇疯緭鍏�"
+                    clearable
+                    prefix-icon="Search"
+                    style="width: 160px"
+                    @change="handleQuery" />
         </el-form-item>
         <el-form-item label="鐘舵��:">
-          <el-select
-            v-model="searchForm.status"
-            placeholder="璇烽�夋嫨"
-            style="width: 160px"
-            @change="handleQuery"
-          >
-            <el-option label="寰呭紑濮�" value="1" />
-            <el-option label="杩涜涓�" value="2" />
-            <el-option label="宸插畬鎴�" value="3" />
+          <el-select v-model="searchForm.status"
+                     placeholder="璇烽�夋嫨"
+                     style="width: 160px"
+                     @change="handleQuery">
+            <el-option label="寰呭紑濮�"
+                       value="1" />
+            <el-option label="杩涜涓�"
+                       value="2" />
+            <el-option label="宸插畬鎴�"
+                       value="3" />
             <!--            <el-option label="宸插彇娑�"-->
             <!--                       value="4" />-->
-            <el-option label="宸茬粨鏉�" value="5" />
+            <el-option label="宸茬粨鏉�"
+                       value="5" />
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
-          <el-button type="info" @click="handleReset">閲嶇疆</el-button>
+          <el-button type="primary"
+                     @click="handleQuery">鎼滅储</el-button>
+          <el-button type="info"
+                     @click="handleReset">閲嶇疆</el-button>
         </el-form-item>
       </el-form>
       <div class="action-buttons">
         <!-- <el-button type="primary"
                    @click="isShowNewModal = true">鏂板</el-button> -->
-        <el-button type="danger" @click="handleDelete">閫�鍥�</el-button>
+        <el-button type="danger"
+                   @click="handleDelete">閫�鍥�</el-button>
         <el-button @click="handleOut">瀵煎嚭</el-button>
       </div>
     </div>
     <div class="table_list">
-      <PIMTable
-        rowKey="id"
-        :column="tableColumn"
-        :tableData="tableData"
-        :page="page"
-        :tableLoading="tableLoading"
-        :row-class-name="tableRowClassName"
-        :isSelection="true"
-        :selectable="(row) => !row.endOrder"
-        @selection-change="handleSelectionChange"
-        @pagination="pagination"
-      >
+      <PIMTable rowKey="id"
+                :column="tableColumn"
+                :tableData="tableData"
+                :page="page"
+                :tableLoading="tableLoading"
+                :row-class-name="tableRowClassName"
+                :isSelection="true"
+                :selectable="(row) => !row.endOrder"
+                @selection-change="handleSelectionChange"
+                @pagination="pagination">
         <template #completionStatus="{ row }">
-          <el-progress
-            :percentage="toProgressPercentage(row?.completionStatus)"
-            :color="progressColor(toProgressPercentage(row?.completionStatus))"
-            :status="
+          <el-progress :percentage="toProgressPercentage(row?.completionStatus)"
+                       :color="progressColor(toProgressPercentage(row?.completionStatus))"
+                       :status="
               toProgressPercentage(row?.completionStatus) >= 100
                 ? 'success'
                 : ''
-            "
-          />
+            " />
         </template>
         <template #processRouteStatus="{ row }">
-          <div
-            v-if="row.processRouteStatus && row.processRouteStatus.length"
-            class="process-progress-container"
-          >
-            <div
-              v-for="(item, index) in row.processRouteStatus"
-              :key="index"
-              class="process-step"
-            >
+          <div v-if="row.processRouteStatus && row.processRouteStatus.length"
+               class="process-progress-container">
+            <div v-for="(item, index) in row.processRouteStatus"
+                 :key="index"
+                 class="process-step">
               <div class="step-content">
-                <div
-                  class="step-circle"
-                  :class="{ 'is-completed': item.percentage >= 100 }"
-                >
-                  <span
-                    class="step-percentage"
-                    :style="{
+                <div class="step-circle"
+                     :class="{ 'is-completed': item.percentage >= 100 }">
+                  <span class="step-percentage"
+                        :style="{
                       color:
                         item.percentage >= 70
                           ? item.percentage >= 100
                             ? '#67c23a'
                             : '#f56c6c'
                           : '#000',
-                    }"
-                    >{{ item.percentage }}%</span
-                  >
+                    }">{{ item.percentage }}%</span>
                 </div>
                 <div class="step-name">{{ item.name }}</div>
               </div>
-              <div
-                v-if="index < row.processRouteStatus.length - 1"
-                class="step-line"
-              ></div>
+              <div v-if="index < row.processRouteStatus.length - 1"
+                   class="step-line"></div>
             </div>
           </div>
           <span v-else>-</span>
         </template>
       </PIMTable>
     </div>
-    <el-dialog
-      v-model="bindRouteDialogVisible"
-      title="缁戝畾宸ヨ壓璺嚎"
-      width="500px"
-    >
+    <el-dialog v-model="bindRouteDialogVisible"
+               title="缁戝畾宸ヨ壓璺嚎"
+               width="500px">
       <el-form label-width="90px">
         <el-form-item label="宸ヨ壓璺嚎">
-          <el-select
-            v-model="bindForm.routeId"
-            placeholder="璇烽�夋嫨宸ヨ壓璺嚎"
-            style="width: 100%"
-            :loading="bindRouteLoading"
-          >
-            <el-option
-              v-for="item in routeOptions"
-              :key="item.id"
-              :label="`${item.processRouteCode || ''}`"
-              :value="item.id"
-            />
+          <el-select v-model="bindForm.routeId"
+                     placeholder="璇烽�夋嫨宸ヨ壓璺嚎"
+                     style="width: 100%"
+                     :loading="bindRouteLoading">
+            <el-option v-for="item in routeOptions"
+                       :key="item.id"
+                       :label="`${item.processRouteCode || ''}`"
+                       :value="item.id" />
           </el-select>
         </el-form-item>
       </el-form>
       <template #footer>
         <span class="dialog-footer">
-          <el-button
-            type="primary"
-            :loading="bindRouteSaving"
-            @click="handleBindRouteConfirm"
-            >纭� 璁�</el-button
-          >
+          <el-button type="primary"
+                     :loading="bindRouteSaving"
+                     @click="handleBindRouteConfirm">纭� 璁�</el-button>
           <el-button @click="bindRouteDialogVisible = false">鍙� 娑�</el-button>
         </span>
       </template>
     </el-dialog>
     <!-- 鏉ユ簮鏁版嵁寮圭獥 -->
-    <el-dialog
-      v-model="sourceDataDialogVisible"
-      title="鏉ユ簮鏁版嵁"
-      width="1200px"
-    >
-      <div v-if="sourceRowData" class="applyno-summary1">
+    <el-dialog v-model="sourceDataDialogVisible"
+               title="鏉ユ簮鏁版嵁"
+               width="1200px"
+               top="5vh"
+               class="source-data-dialog"
+               append-to-body>
+      <div v-if="sourceRowData"
+           class="applyno-summary1">
         <div class="summary-item">
           <span class="summary-label">浜у搧鍚嶇О锛�</span>
           <span class="summary-value">
@@ -183,11 +161,9 @@
       </div>
       <div class="source-table-container">
         <div class="source-data-cards-container">
-          <div
-            v-for="(item, index) in sourceTableData"
-            :key="index"
-            class="source-data-card"
-          >
+          <div v-for="(item, index) in sourceTableData"
+               :key="index"
+               class="source-data-card">
             <div class="card-body">
               <div class="info-grid">
                 <div class="info-item">
@@ -197,9 +173,7 @@
                 <div class="info-item">
                   <div class="info-label">鏁版嵁鏉ユ簮</div>
                   <div class="info-value">
-                    <el-tag
-                      :type="item.source === '閿�鍞�' ? 'primary' : 'warning'"
-                    >
+                    <el-tag :type="item.source === '閿�鍞�' ? 'primary' : 'warning'">
                       {{ item.source || "鏈煡" }}
                     </el-tag>
                   </div>
@@ -244,844 +218,856 @@
         </div>
       </div>
     </el-dialog>
-    <MaterialLedgerDialog
-      v-model="materialDialogVisible"
-      :order-row="currentMaterialOrder"
-      @saved="getList"
-    />
-    <MaterialDetailDialog
-      v-model="materialDetailDialogVisible"
-      :order-row="currentMaterialDetailOrder"
-      @confirmed="getList"
-    />
-    <MaterialSupplementDialog
-      v-model="materialSupplementDialogVisible"
-      :order-row="currentMaterialSupplementOrder"
-      @saved="getList"
-    />
-    <new-product-order
-      v-if="isShowNewModal"
-      v-model:visible="isShowNewModal"
-      @completed="handleQuery"
-    />
+    <MaterialLedgerDialog v-model="materialDialogVisible"
+                          :order-row="currentMaterialOrder"
+                          @saved="getList" />
+    <MaterialDetailDialog v-model="materialDetailDialogVisible"
+                          :order-row="currentMaterialDetailOrder"
+                          @confirmed="getList" />
+    <MaterialSupplementDialog v-model="materialSupplementDialogVisible"
+                              :order-row="currentMaterialSupplementOrder"
+                              @saved="getList" />
+    <new-product-order v-if="isShowNewModal"
+                       v-model:visible="isShowNewModal"
+                       @completed="handleQuery" />
     <!-- 鎵撳嵃棰嗘枡鍗曠粍浠� -->
     <div class="print-requisition-wrapper">
-      <PrintMaterialRequisition
-        ref="printRef"
-        :order-row="printOrderRow"
-        :material-list="printMaterialList"
-      />
+      <PrintMaterialRequisition ref="printRef"
+                                :order-row="printOrderRow"
+                                :material-list="printMaterialList" />
     </div>
   </div>
 </template>
 
 <script setup>
-import {
-  computed,
-  defineAsyncComponent,
-  getCurrentInstance,
-  onMounted,
-  reactive,
-  ref,
-  toRefs,
-} from "vue";
-import { ElMessageBox } from "element-plus";
-import dayjs from "dayjs";
-import { useRouter } from "vue-router";
-import {
-  productOrderListPage,
-  listProcessRoute,
-  bindingRoute,
-  listProcessBom,
-  delProductOrder,
-  getProductOrderSource,
-  updateProductOrder,
-} from "@/api/productionManagement/productionOrder.js";
-import { productWorkOrderPage } from "@/api/productionManagement/workOrder.js";
-import { listMain as getOrderProcessRouteMain } from "@/api/productionManagement/productProcessRoute.js";
-import MaterialLedgerDialog from "@/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue";
-import MaterialDetailDialog from "@/views/productionManagement/productionOrder/components/MaterialDetailDialog.vue";
-import MaterialSupplementDialog from "@/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue";
-import PrintMaterialRequisition from "@/views/productionManagement/productionOrder/components/PrintMaterialRequisition.vue";
-import PIMTable from "@/components/PIMTable/PIMTable.vue";
-import { listPage } from "@/api/productionManagement/processRoute.js";
-import {
-  listMaterialPickingDetail,
-  listMaterialPickingBom,
-} from "@/api/productionManagement/productionOrder.js";
-const NewProductOrder = defineAsyncComponent(() =>
-  import("@/views/productionManagement/productionOrder/New.vue")
-);
-
-const { proxy } = getCurrentInstance();
-
-const router = useRouter();
-const isShowNewModal = ref(false);
-const sourceDataDialogVisible = ref(false);
-const sourceTableData = ref([]);
-const sourceRowData = ref(null);
-const sourcePage = reactive({
-  total: 0,
-});
-
-const processColumnWidth = computed(() => {
-  if (!tableData.value || tableData.value.length === 0) return "200px";
-  const maxProcesses = Math.max(
-    ...tableData.value.map((row) => row.processRouteStatus?.length || 0)
+  import {
+    computed,
+    defineAsyncComponent,
+    getCurrentInstance,
+    onMounted,
+    reactive,
+    ref,
+    toRefs,
+  } from "vue";
+  import { ElMessageBox } from "element-plus";
+  import dayjs from "dayjs";
+  import { useRouter } from "vue-router";
+  import {
+    productOrderListPage,
+    listProcessRoute,
+    bindingRoute,
+    listProcessBom,
+    delProductOrder,
+    getProductOrderSource,
+    updateProductOrder,
+  } from "@/api/productionManagement/productionOrder.js";
+  import { productWorkOrderPage } from "@/api/productionManagement/workOrder.js";
+  import { listMain as getOrderProcessRouteMain } from "@/api/productionManagement/productProcessRoute.js";
+  import MaterialLedgerDialog from "@/views/productionManagement/productionOrder/components/MaterialLedgerDialog.vue";
+  import MaterialDetailDialog from "@/views/productionManagement/productionOrder/components/MaterialDetailDialog.vue";
+  import MaterialSupplementDialog from "@/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue";
+  import PrintMaterialRequisition from "@/views/productionManagement/productionOrder/components/PrintMaterialRequisition.vue";
+  import PIMTable from "@/components/PIMTable/PIMTable.vue";
+  import { listPage } from "@/api/productionManagement/processRoute.js";
+  import {
+    listMaterialPickingDetail,
+    listMaterialPickingBom,
+  } from "@/api/productionManagement/productionOrder.js";
+  const NewProductOrder = defineAsyncComponent(() =>
+    import("@/views/productionManagement/productionOrder/New.vue")
   );
-  if (maxProcesses === 0) return "100px";
-  // 姣忎釜宸ュ簭鍦嗗湀 36px + 绾挎潯 30px = 66px锛岄澶栧姞 60px 杈硅窛鍜屾枃瀛楃┖闂�
-  return `${maxProcesses * 66 + 60}px`;
-});
 
-const tableColumn = computed(() => [
-  {
-    label: "鐢熶骇璁㈠崟鍙�",
-    prop: "npsNo",
-    width: "150px",
-  },
-  // 1.寰呭紑濮嬨��2.杩涜涓��3.宸插畬鎴愩��4.宸插彇娑堛��5.宸茬粨鏉�
-  {
-    label: "鐘舵��",
-    prop: "status",
-    width: "150px",
-    dataType: "tag",
-    formatData: (val) =>
-      val === 1
-        ? "寰呭紑濮�"
-        : val === 2
-        ? "杩涜涓�"
-        : val === 3
-        ? "宸插畬鎴�"
-        : val === 5
-        ? "宸茬粨鏉�"
-        : "宸插彇娑�",
-    formatType: (val) =>
-      val === 1
-        ? "primary"
-        : val === 2
-        ? "warning"
-        : val === 3
-        ? "success"
-        : val === 5
-        ? "danger"
-        : "info",
-  },
-  {
-    label: "浜у搧鍚嶇О",
-    prop: "productName",
-    width: "120px",
-  },
-  {
-    label: "瑙勬牸",
-    prop: "model",
-    width: "120px",
-  },
-  {
-    label: "宸ヨ壓璺嚎缂栧彿",
-    prop: "processRouteCode",
-    width: "200px",
-  },
-  {
-    label: "闇�姹傛暟閲�",
-    prop: "quantity",
-  },
-  {
-    label: "瀹屾垚鏁伴噺",
-    prop: "completeQuantity",
-  },
-  {
-    label: "宸ュ簭鐢熶骇杩涘害",
-    prop: "processRouteStatus",
-    dataType: "slot",
-    slot: "processRouteStatus",
-    width: processColumnWidth.value,
-  },
-  {
-    dataType: "slot",
-    label: "瀹屾垚杩涘害",
-    prop: "completionStatus",
-    slot: "completionStatus",
-    width: 180,
-  },
-  {
-    label: "寮�濮嬫棩鏈�",
-    prop: "startTime",
-    formatData: (val) => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
-    width: 120,
-  },
-  {
-    label: "缁撴潫鏃ユ湡",
-    prop: "endTime",
-    formatData: (val) => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
-    width: 120,
-  },
-  {
-    label: "璁″垝瀹屾垚鏃堕棿",
-    prop: "planCompleteTime",
-    formatData: (val) => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
-    width: 120,
-  },
-  {
-    dataType: "action",
-    label: "鎿嶄綔",
-    align: "center",
-    fixed: "right",
-    width: 280,
-    operation: [
-      {
-        name: "宸ヨ壓璺嚎",
-        type: "text",
-        showHide: (row) => row.processRouteCode,
-        clickFun: (row) => {
-          showRouteItemModal(row);
+  const { proxy } = getCurrentInstance();
+
+  const router = useRouter();
+  const isShowNewModal = ref(false);
+  const sourceDataDialogVisible = ref(false);
+  const sourceTableData = ref([]);
+  const sourceRowData = ref(null);
+  const sourcePage = reactive({
+    total: 0,
+  });
+
+  const processColumnWidth = computed(() => {
+    if (!tableData.value || tableData.value.length === 0) return "200px";
+    const maxProcesses = Math.max(
+      ...tableData.value.map(row => row.processRouteStatus?.length || 0)
+    );
+    if (maxProcesses === 0) return "100px";
+    // 姣忎釜宸ュ簭鍦嗗湀 36px + 绾挎潯 30px = 66px锛岄澶栧姞 60px 杈硅窛鍜屾枃瀛楃┖闂�
+    return `${maxProcesses * 66 + 60}px`;
+  });
+
+  const tableColumn = computed(() => [
+    {
+      label: "鐢熶骇璁㈠崟鍙�",
+      prop: "npsNo",
+      width: "150px",
+    },
+    // 1.寰呭紑濮嬨��2.杩涜涓��3.宸插畬鎴愩��4.宸插彇娑堛��5.宸茬粨鏉�
+    {
+      label: "鐘舵��",
+      prop: "status",
+      width: "150px",
+      dataType: "tag",
+      formatData: val =>
+        val === 1
+          ? "寰呭紑濮�"
+          : val === 2
+          ? "杩涜涓�"
+          : val === 3
+          ? "宸插畬鎴�"
+          : val === 5
+          ? "宸茬粨鏉�"
+          : "宸插彇娑�",
+      formatType: val =>
+        val === 1
+          ? "primary"
+          : val === 2
+          ? "warning"
+          : val === 3
+          ? "success"
+          : val === 5
+          ? "danger"
+          : "info",
+    },
+    {
+      label: "浜у搧鍚嶇О",
+      prop: "productName",
+      width: "120px",
+    },
+    {
+      label: "瑙勬牸",
+      prop: "model",
+      width: "120px",
+    },
+    {
+      label: "宸ヨ壓璺嚎缂栧彿",
+      prop: "processRouteCode",
+      width: "200px",
+    },
+    {
+      label: "闇�姹傛暟閲�",
+      prop: "quantity",
+    },
+    {
+      label: "瀹屾垚鏁伴噺",
+      prop: "completeQuantity",
+    },
+    {
+      label: "宸ュ簭鐢熶骇杩涘害",
+      prop: "processRouteStatus",
+      dataType: "slot",
+      slot: "processRouteStatus",
+      width: processColumnWidth.value,
+    },
+    {
+      dataType: "slot",
+      label: "瀹屾垚杩涘害",
+      prop: "completionStatus",
+      slot: "completionStatus",
+      width: 180,
+    },
+    {
+      label: "寮�濮嬫棩鏈�",
+      prop: "startTime",
+      formatData: val => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
+      width: 120,
+    },
+    {
+      label: "缁撴潫鏃ユ湡",
+      prop: "endTime",
+      formatData: val => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
+      width: 120,
+    },
+    {
+      label: "璁″垝瀹屾垚鏃堕棿",
+      prop: "planCompleteTime",
+      formatData: val => (val ? dayjs(val).format("YYYY-MM-DD") : ""),
+      width: 120,
+    },
+    {
+      dataType: "action",
+      label: "鎿嶄綔",
+      align: "center",
+      fixed: "right",
+      width: 280,
+      operation: [
+        {
+          name: "宸ヨ壓璺嚎",
+          type: "text",
+          showHide: row => row.processRouteCode,
+          clickFun: row => {
+            showRouteItemModal(row);
+          },
         },
-      },
-      {
-        name: "缁戝畾宸ヨ壓璺嚎",
-        type: "text",
-        showHide: (row) => !row.processRouteCode && !row.endOrder,
-        clickFun: (row) => {
-          openBindRouteDialog(row, "add");
+        {
+          name: "缁戝畾宸ヨ壓璺嚎",
+          type: "text",
+          showHide: row => !row.processRouteCode && !row.endOrder,
+          clickFun: row => {
+            openBindRouteDialog(row, "add");
+          },
         },
-      },
-      {
-        name: "鏇存崲宸ヨ壓璺嚎",
-        type: "text",
-        showHide: (row) => row.processRouteCode && !row.endOrder,
-        clickFun: (row) => {
-          openBindRouteDialog(row, "change");
+        {
+          name: "鏇存崲宸ヨ壓璺嚎",
+          type: "text",
+          showHide: row => row.processRouteCode && !row.endOrder,
+          clickFun: row => {
+            openBindRouteDialog(row, "change");
+          },
         },
-      },
-      {
-        name: "鏉ユ簮",
-        type: "text",
-        clickFun: (row) => {
-          showSourceData(row);
+        {
+          name: "鏉ユ簮",
+          type: "text",
+          clickFun: row => {
+            showSourceData(row);
+          },
         },
-      },
-      {
-        name: "棰嗘枡",
-        type: "text",
-        color: "#5EC7AB",
-        showHide: (row) => !row.endOrder && !row.returned,
-        clickFun: (row) => {
-          openMaterialDialog(row);
+        {
+          name: "棰嗘枡",
+          type: "text",
+          color: "#5EC7AB",
+          showHide: row => !row.endOrder && !row.returned,
+          clickFun: row => {
+            openMaterialDialog(row);
+          },
         },
-      },
-      {
-        name: "琛ユ枡",
-        type: "text",
-        color: "#5EC7AB",
-        showHide: (row) => !row.endOrder && !row.returned,
-        clickFun: (row) => {
-          openMaterialSupplementDialog(row);
+        {
+          name: "琛ユ枡",
+          type: "text",
+          color: "#5EC7AB",
+          showHide: row => !row.endOrder && !row.returned,
+          clickFun: row => {
+            openMaterialSupplementDialog(row);
+          },
         },
-      },
-      {
-        name: "棰嗘枡璇︽儏",
-        type: "text",
-        color: "#5EC7AB",
-        clickFun: (row) => {
-          openMaterialDetailDialog(row);
+        {
+          name: "棰嗘枡璇︽儏",
+          type: "text",
+          color: "#5EC7AB",
+          clickFun: row => {
+            openMaterialDetailDialog(row);
+          },
         },
-      },
-      {
-        name: "鎵撳嵃棰嗘枡鍗�",
-        type: "text",
-        color: "#5EC7AB",
-        showHide: (row) => !row.endOrder,
-        clickFun: (row) => {
-          handlePrint(row);
+        {
+          name: "鎵撳嵃棰嗘枡鍗�",
+          type: "text",
+          color: "#5EC7AB",
+          showHide: row => !row.endOrder,
+          clickFun: row => {
+            handlePrint(row);
+          },
         },
-      },
-      {
-        name: "鐢熶骇杩芥函",
-        type: "text",
-        color: "#409eff",
-        clickFun: (row) => {
-          router.push({
-            path: "/productionManagement/productionTraceability",
-            query: {
-              npsNo: row.npsNo,
-              productName: row.productName,
-              model: row.model,
-            },
-          });
-        },
-      },
-      {
-        name: "缁撴潫璁㈠崟",
-        type: "text",
-        color: "red",
-        showHide: (row) => !row.endOrder,
-        clickFun: (row) => {
-          handleEndOrder(row);
-        },
-      },
-    ],
-  },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
-  current: 1,
-  size: 100,
-  total: 0,
-});
-const selectedRows = ref([]);
-
-const data = reactive({
-  searchForm: {
-    npsNo: "",
-    customerName: "",
-    salesContractNo: "",
-    projectName: "",
-    productName: "",
-    model: "",
-    status: "",
-  },
-});
-const { searchForm } = toRefs(data);
-
-const toProgressPercentage = (val) => {
-  const n = Number(val);
-  if (!Number.isFinite(n)) return 0;
-  if (n <= 0) return 0;
-  if (n >= 100) return 100;
-  return parseFloat(n.toFixed(2));
-};
-
-// 30/50/80/100 鍒嗘棰滆壊锛氱孩/姗�/钃�/缁�
-const progressColor = (percentage) => {
-  const p = toProgressPercentage(percentage);
-  if (p < 30) return "#f56c6c";
-  if (p < 50) return "#e6a23c";
-  if (p < 80) return "#409eff";
-  return "#67c23a";
-};
-
-// 娣诲姞琛ㄨ绫诲悕鏂规硶
-const tableRowClassName = ({ row }) => {
-  if (!row.planCompleteTime) return "";
-  if (row.isFh) return "";
-
-  const diff = row.deliveryDaysDiff;
-  if (diff === 15) {
-    return "yellow";
-  } else if (diff === 10) {
-    return "pink";
-  } else if (diff === 2) {
-    return "purple";
-  } else if (diff < 2) {
-    return "red";
-  }
-};
-
-// 缁戝畾宸ヨ壓璺嚎寮规
-const bindRouteDialogVisible = ref(false);
-const bindRouteLoading = ref(false);
-const bindRouteSaving = ref(false);
-const routeOptions = ref([]);
-const bindForm = reactive({
-  orderId: null,
-  routeId: null,
-});
-const materialDialogVisible = ref(false);
-const currentMaterialOrder = ref(null);
-const materialDetailDialogVisible = ref(false);
-const currentMaterialDetailOrder = ref(null);
-const materialSupplementDialogVisible = ref(false);
-const currentMaterialSupplementOrder = ref(null);
-
-// 鎵撳嵃鐩稿叧
-const printOrderRow = ref(null);
-const printMaterialList = ref([]);
-const handlePrint = async (row) => {
-  printOrderRow.value = row;
-  proxy.$modal.loading("姝e湪鑾峰彇棰嗘枡鏁版嵁...");
-  try {
-    printMaterialList.value = [];
-    const detailRes = await listMaterialPickingDetail(row.id);
-    const detailList = Array.isArray(detailRes?.data)
-      ? detailRes.data
-      : detailRes?.data?.records || [];
-
-    if (detailList.length > 0) {
-      printMaterialList.value = detailList;
-    }
-
-    if (printMaterialList.value.length === 0) {
-      proxy.$modal.msgWarning("鏆傛棤棰嗘枡鏁版嵁");
-      return;
-    }
-
-    // 绛夊緟 DOM 鏇存柊鍚庢墽琛屾墦鍗�
-    proxy.$nextTick(() => {
-      setTimeout(() => {
-        window.print();
-      }, 800);
-    });
-  } catch (e) {
-    console.error("鑾峰彇棰嗘枡鏁版嵁澶辫触锛�", e);
-    proxy.$modal.msgError("鑾峰彇棰嗘枡鏁版嵁澶辫触");
-  } finally {
-    proxy.$modal.closeLoading();
-  }
-};
-
-const openBindRouteDialog = async (row, type) => {
-  bindForm.orderId = row.id;
-  bindForm.routeId = type === "add" ? null : row.technologyRoutingId;
-  bindRouteDialogVisible.value = true;
-  routeOptions.value = [];
-  if (!row.productModelId) {
-    proxy.$modal.msgWarning("褰撳墠璁㈠崟缂哄皯浜у搧鍨嬪彿锛屾棤娉曟煡璇㈠伐鑹鸿矾绾�");
-    bindRouteDialogVisible.value = false;
-    return;
-  }
-  bindRouteLoading.value = true;
-  try {
-    const res = await listPage({ productModelId: row.productModelId });
-    routeOptions.value = res.data.records || [];
-  } catch (e) {
-    console.error("鑾峰彇宸ヨ壓璺嚎鍒楄〃澶辫触锛�", e);
-    proxy.$modal.msgError("鑾峰彇宸ヨ壓璺嚎鍒楄〃澶辫触");
-  } finally {
-    bindRouteLoading.value = false;
-  }
-};
-
-const handleBindRouteConfirm = async () => {
-  if (!bindForm.routeId) {
-    proxy.$modal.msgWarning("璇烽�夋嫨宸ヨ壓璺嚎");
-    return;
-  }
-  bindRouteSaving.value = true;
-  try {
-    await bindingRoute({
-      id: bindForm.orderId,
-      technologyRoutingId: bindForm.routeId,
-    });
-    proxy.$modal.msgSuccess("缁戝畾鎴愬姛");
-    bindRouteDialogVisible.value = false;
-    getList();
-  } catch (e) {
-    console.error("缁戝畾宸ヨ壓璺嚎澶辫触锛�", e);
-    proxy.$modal.msgError("缁戝畾宸ヨ壓璺嚎澶辫触");
-  } finally {
-    bindRouteSaving.value = false;
-  }
-};
-
-const openMaterialDialog = (row) => {
-  currentMaterialOrder.value = row;
-  materialDialogVisible.value = true;
-};
-
-const openMaterialDetailDialog = async (row) => {
-  currentMaterialDetailOrder.value = row;
-  materialDetailDialogVisible.value = true;
-};
-
-const openMaterialSupplementDialog = (row) => {
-  currentMaterialSupplementOrder.value = row;
-  materialSupplementDialogVisible.value = true;
-};
-
-const handleReset = () => {
-  searchForm.value = {
-    ...searchForm.value,
-    npsNo: "",
-    customerName: "",
-    salesContractNo: "",
-    projectName: "",
-    productName: "",
-    model: "",
-    status: "",
-  };
-  handleQuery();
-};
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-const pagination = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const changeDaterange = (value) => {
-  if (value) {
-    searchForm.value.entryDateStart = value[0];
-    searchForm.value.entryDateEnd = value[1];
-  } else {
-    searchForm.value.entryDateStart = undefined;
-    searchForm.value.entryDateEnd = undefined;
-  }
-  handleQuery();
-};
-const getList = () => {
-  tableLoading.value = true;
-  // 鏋勯�犱竴涓柊鐨勫璞★紝涓嶅寘鍚玡ntryDate瀛楁
-  const params = { ...searchForm.value, ...page };
-  params.entryDate = undefined;
-  productOrderListPage(params)
-    .then(async (res) => {
-      const records = res.data.records || [];
-      // 涓烘瘡涓鍗曟煡璇㈠搴旂殑宸ュ簭杩涘害鏁版嵁
-      const processPromises = records.map(async (item) => {
-        if (item.npsNo) {
-          try {
-            const workOrderRes = await productWorkOrderPage({
-              npsNo: item.npsNo,
-              size: 100,
+        {
+          name: "鐢熶骇杩芥函",
+          type: "text",
+          color: "#409eff",
+          clickFun: row => {
+            router.push({
+              path: "/productionManagement/productionTraceability",
+              query: {
+                npsNo: row.npsNo,
+                productName: row.productName,
+                model: row.model,
+              },
             });
-            const workOrders = workOrderRes.data.records || [];
-            // 鎸夌収宸ュ簭椤哄簭鎺掑簭锛堝鏋滄湁椤哄簭瀛楁锛屽亣璁句负 orderNum 鎴栨寜杩斿洖椤哄簭锛�
-            // 杞崲涓� processRouteStatus 鏍煎紡
-            const processRouteStatus = workOrders.map((wo) => ({
-              name: wo.operationName || "鏈煡宸ュ簭",
-              percentage: wo.completionStatus > 100 ? 100 : wo.completionStatus,
-            }));
-            return { ...item, processRouteStatus };
-          } catch (error) {
-            console.error(`鑾峰彇宸ュ崟 ${item.npsNo} 杩涘害澶辫触:`, error);
-            return { ...item, processRouteStatus: [] };
-          }
-        }
-        return { ...item, processRouteStatus: [] };
-      });
+          },
+        },
+        {
+          name: "缁撴潫璁㈠崟",
+          type: "text",
+          color: "red",
+          showHide: row => !row.endOrder,
+          clickFun: row => {
+            handleEndOrder(row);
+          },
+        },
+      ],
+    },
+  ]);
+  const tableData = ref([]);
+  const tableLoading = ref(false);
+  const page = reactive({
+    current: 1,
+    size: 100,
+    total: 0,
+  });
+  const selectedRows = ref([]);
 
-      tableData.value = await Promise.all(processPromises);
-      page.total = res.data.total;
-      tableLoading.value = false;
-    })
-    .catch(() => {
-      tableLoading.value = false;
-    });
-};
-
-const showRouteItemModal = async (row) => {
-  const orderId = row.id;
-  try {
-    const res = await getOrderProcessRouteMain(orderId);
-    const data = res.data || {};
-    if (!data || !data.id) {
-      proxy.$modal.msgWarning("鏈壘鍒板叧鑱旂殑宸ヨ壓璺嚎");
-      return;
-    }
-    router.push({
-      path: "/productionManagement/processRouteItem",
-      query: {
-        id: data.id,
-        bomId: data.orderBomId,
-        processRouteCode: data.processRouteCode || "",
-        productName: row.productName || "",
-        model: row.model || "",
-        bomNo: row.bomNo || "",
-        description: data.description || "",
-        quantity: row.quantity || 0,
-        technologyRoutingId: data.technologyRoutingId,
-        orderId,
-        type: "order",
-        editable: !row.endOrder,
-      },
-    });
-  } catch (e) {
-    console.error("鑾峰彇宸ヨ壓璺嚎涓讳俊鎭け璐ワ細", e);
-    proxy.$modal.msgError("鑾峰彇宸ヨ壓璺嚎淇℃伅澶辫触");
-  }
-};
-
-const showProductStructure = (row) => {
-  router.push({
-    path: "/productionManagement/productStructureDetail",
-    query: {
-      id: row.id,
-      bomNo: row.bomNo || "",
-      productName: row.productName || "",
-      productModelName: row.model || "",
-      orderId: row.id,
-      type: "order",
+  const data = reactive({
+    searchForm: {
+      npsNo: "",
+      customerName: "",
+      salesContractNo: "",
+      projectName: "",
+      productName: "",
+      model: "",
+      status: "",
     },
   });
-};
+  const { searchForm } = toRefs(data);
 
-// 鏌ョ湅鏉ユ簮鐢熶骇璁″垝鏁版嵁
-const showSourceData = (row) => {
-  // 瀛樺偍鐐瑰嚮鏉ユ簮鎸夐挳鏃朵紶閫掔殑row鍙傛暟
-  sourceRowData.value = row;
-  // 璋冪敤API鑾峰彇鏉ユ簮鏁版嵁
-  getProductOrderSource(row.id)
-    .then((res) => {
-      if (res.code === 200) {
-        // 鐩存帴瀛樺偍杩斿洖鐨勬墎骞冲寲鏁版嵁
-        sourceTableData.value = res.data || [];
-        sourcePage.total = sourceTableData.value.length;
-        // 鎵撳紑寮圭獥
-        sourceDataDialogVisible.value = true;
-      } else {
-        proxy.$modal.msgError(res.msg || "鑾峰彇鏉ユ簮鏁版嵁澶辫触");
+  const toProgressPercentage = val => {
+    const n = Number(val);
+    if (!Number.isFinite(n)) return 0;
+    if (n <= 0) return 0;
+    if (n >= 100) return 100;
+    return parseFloat(n.toFixed(2));
+  };
+
+  // 30/50/80/100 鍒嗘棰滆壊锛氱孩/姗�/钃�/缁�
+  const progressColor = percentage => {
+    const p = toProgressPercentage(percentage);
+    if (p < 30) return "#f56c6c";
+    if (p < 50) return "#e6a23c";
+    if (p < 80) return "#409eff";
+    return "#67c23a";
+  };
+
+  // 娣诲姞琛ㄨ绫诲悕鏂规硶
+  const tableRowClassName = ({ row }) => {
+    if (!row.planCompleteTime) return "";
+    if (row.isFh) return "";
+
+    const diff = row.deliveryDaysDiff;
+    if (diff === 15) {
+      return "yellow";
+    } else if (diff === 10) {
+      return "pink";
+    } else if (diff === 2) {
+      return "purple";
+    } else if (diff < 2) {
+      return "red";
+    }
+  };
+
+  // 缁戝畾宸ヨ壓璺嚎寮规
+  const bindRouteDialogVisible = ref(false);
+  const bindRouteLoading = ref(false);
+  const bindRouteSaving = ref(false);
+  const routeOptions = ref([]);
+  const bindForm = reactive({
+    orderId: null,
+    routeId: null,
+  });
+  const materialDialogVisible = ref(false);
+  const currentMaterialOrder = ref(null);
+  const materialDetailDialogVisible = ref(false);
+  const currentMaterialDetailOrder = ref(null);
+  const materialSupplementDialogVisible = ref(false);
+  const currentMaterialSupplementOrder = ref(null);
+
+  // 鎵撳嵃鐩稿叧
+  const printOrderRow = ref(null);
+  const printMaterialList = ref([]);
+  const handlePrint = async row => {
+    printOrderRow.value = row;
+    proxy.$modal.loading("姝e湪鑾峰彇棰嗘枡鏁版嵁...");
+    try {
+      printMaterialList.value = [];
+      const detailRes = await listMaterialPickingDetail(row.id);
+      const detailList = Array.isArray(detailRes?.data)
+        ? detailRes.data
+        : detailRes?.data?.records || [];
+
+      if (detailList.length > 0) {
+        printMaterialList.value = detailList;
       }
-    })
-    .catch((err) => {
-      proxy.$modal.msgError("鑾峰彇鏉ユ簮鏁版嵁澶辫触");
-      console.error(err);
-    });
-};
 
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
-};
+      if (printMaterialList.value.length === 0) {
+        proxy.$modal.msgWarning("鏆傛棤棰嗘枡鏁版嵁");
+        return;
+      }
 
-const handleDelete = () => {
-  let ids = [];
-  if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map((item) => item.id);
-  } else {
-    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-    return;
-  }
-  ElMessageBox.confirm("鏄惁閫�鍥炶鐢熶骇璁㈠崟锛�", "閫�鍥�", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      console.log(ids, "ids");
-      delProductOrder(ids).then((res) => {
-        proxy.$modal.msgSuccess("閫�鍥炴垚鍔�");
-        getList();
+      // 绛夊緟 DOM 鏇存柊鍚庢墽琛屾墦鍗�
+      proxy.$nextTick(() => {
+        setTimeout(() => {
+          window.print();
+        }, 800);
       });
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
+    } catch (e) {
+      console.error("鑾峰彇棰嗘枡鏁版嵁澶辫触锛�", e);
+      proxy.$modal.msgError("鑾峰彇棰嗘枡鏁版嵁澶辫触");
+    } finally {
+      proxy.$modal.closeLoading();
+    }
+  };
 
-// 瀵煎嚭
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      proxy.download(
-        "/productionOrder/export",
-        { ...searchForm.value },
-        "鐢熶骇璁㈠崟鏁版嵁.xlsx"
-      );
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
+  const openBindRouteDialog = async (row, type) => {
+    bindForm.orderId = row.id;
+    bindForm.routeId = type === "add" ? null : row.technologyRoutingId;
+    bindRouteDialogVisible.value = true;
+    routeOptions.value = [];
+    if (!row.productModelId) {
+      proxy.$modal.msgWarning("褰撳墠璁㈠崟缂哄皯浜у搧鍨嬪彿锛屾棤娉曟煡璇㈠伐鑹鸿矾绾�");
+      bindRouteDialogVisible.value = false;
+      return;
+    }
+    bindRouteLoading.value = true;
+    try {
+      const res = await listPage({ productModelId: row.productModelId });
+      routeOptions.value = res.data.records || [];
+    } catch (e) {
+      console.error("鑾峰彇宸ヨ壓璺嚎鍒楄〃澶辫触锛�", e);
+      proxy.$modal.msgError("鑾峰彇宸ヨ壓璺嚎鍒楄〃澶辫触");
+    } finally {
+      bindRouteLoading.value = false;
+    }
+  };
 
-// 缁撴潫璁㈠崟
-const handleEndOrder = (row) => {
-  ElMessageBox.confirm(`鏄惁纭缁撴潫璁㈠崟锛�${row.npsNo}锛焋, "鎻愮ず", {
-    confirmButtonText: "纭畾",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      const params = {
+  const handleBindRouteConfirm = async () => {
+    if (!bindForm.routeId) {
+      proxy.$modal.msgWarning("璇烽�夋嫨宸ヨ壓璺嚎");
+      return;
+    }
+    bindRouteSaving.value = true;
+    try {
+      await bindingRoute({
+        id: bindForm.orderId,
+        technologyRoutingId: bindForm.routeId,
+      });
+      proxy.$modal.msgSuccess("缁戝畾鎴愬姛");
+      bindRouteDialogVisible.value = false;
+      getList();
+    } catch (e) {
+      console.error("缁戝畾宸ヨ壓璺嚎澶辫触锛�", e);
+      proxy.$modal.msgError("缁戝畾宸ヨ壓璺嚎澶辫触");
+    } finally {
+      bindRouteSaving.value = false;
+    }
+  };
+
+  const openMaterialDialog = row => {
+    currentMaterialOrder.value = row;
+    materialDialogVisible.value = true;
+  };
+
+  const openMaterialDetailDialog = async row => {
+    currentMaterialDetailOrder.value = row;
+    materialDetailDialogVisible.value = true;
+  };
+
+  const openMaterialSupplementDialog = row => {
+    currentMaterialSupplementOrder.value = row;
+    materialSupplementDialogVisible.value = true;
+  };
+
+  const handleReset = () => {
+    searchForm.value = {
+      ...searchForm.value,
+      npsNo: "",
+      customerName: "",
+      salesContractNo: "",
+      projectName: "",
+      productName: "",
+      model: "",
+      status: "",
+    };
+    handleQuery();
+  };
+
+  // 鏌ヨ鍒楄〃
+  /** 鎼滅储鎸夐挳鎿嶄綔 */
+  const handleQuery = () => {
+    page.current = 1;
+    getList();
+  };
+  const pagination = obj => {
+    page.current = obj.page;
+    page.size = obj.limit;
+    getList();
+  };
+  const changeDaterange = value => {
+    if (value) {
+      searchForm.value.entryDateStart = value[0];
+      searchForm.value.entryDateEnd = value[1];
+    } else {
+      searchForm.value.entryDateStart = undefined;
+      searchForm.value.entryDateEnd = undefined;
+    }
+    handleQuery();
+  };
+  const getList = () => {
+    tableLoading.value = true;
+    // 鏋勯�犱竴涓柊鐨勫璞★紝涓嶅寘鍚玡ntryDate瀛楁
+    const params = { ...searchForm.value, ...page };
+    params.entryDate = undefined;
+    productOrderListPage(params)
+      .then(async res => {
+        const records = res.data.records || [];
+        // 涓烘瘡涓鍗曟煡璇㈠搴旂殑宸ュ簭杩涘害鏁版嵁
+        const processPromises = records.map(async item => {
+          if (item.npsNo) {
+            try {
+              const workOrderRes = await productWorkOrderPage({
+                npsNo: item.npsNo,
+                size: 100,
+              });
+              const workOrders = workOrderRes.data.records || [];
+              // 鎸夌収宸ュ簭椤哄簭鎺掑簭锛堝鏋滄湁椤哄簭瀛楁锛屽亣璁句负 orderNum 鎴栨寜杩斿洖椤哄簭锛�
+              // 杞崲涓� processRouteStatus 鏍煎紡
+              const processRouteStatus = workOrders.map(wo => ({
+                name: wo.operationName || "鏈煡宸ュ簭",
+                percentage: wo.completionStatus > 100 ? 100 : wo.completionStatus,
+              }));
+              return { ...item, processRouteStatus };
+            } catch (error) {
+              console.error(`鑾峰彇宸ュ崟 ${item.npsNo} 杩涘害澶辫触:`, error);
+              return { ...item, processRouteStatus: [] };
+            }
+          }
+          return { ...item, processRouteStatus: [] };
+        });
+
+        tableData.value = await Promise.all(processPromises);
+        page.total = res.data.total;
+        tableLoading.value = false;
+      })
+      .catch(() => {
+        tableLoading.value = false;
+      });
+  };
+
+  const showRouteItemModal = async row => {
+    const orderId = row.id;
+    try {
+      const res = await getOrderProcessRouteMain(orderId);
+      const data = res.data || {};
+      if (!data || !data.id) {
+        proxy.$modal.msgWarning("鏈壘鍒板叧鑱旂殑宸ヨ壓璺嚎");
+        return;
+      }
+      router.push({
+        path: "/productionManagement/processRouteItem",
+        query: {
+          id: data.id,
+          bomId: data.orderBomId,
+          processRouteCode: data.processRouteCode || "",
+          productName: row.productName || "",
+          model: row.model || "",
+          bomNo: row.bomNo || "",
+          description: data.description || "",
+          quantity: row.quantity || 0,
+          technologyRoutingId: data.technologyRoutingId,
+          orderId,
+          type: "order",
+          editable: !row.endOrder,
+        },
+      });
+    } catch (e) {
+      console.error("鑾峰彇宸ヨ壓璺嚎涓讳俊鎭け璐ワ細", e);
+      proxy.$modal.msgError("鑾峰彇宸ヨ壓璺嚎淇℃伅澶辫触");
+    }
+  };
+
+  const showProductStructure = row => {
+    router.push({
+      path: "/productionManagement/productStructureDetail",
+      query: {
         id: row.id,
-        endOrder: true,
-      };
-      updateProductOrder(params).then(() => {
-        proxy.$modal.msgSuccess("缁撴潫璁㈠崟鎴愬姛");
-        getList();
+        bomNo: row.bomNo || "",
+        productName: row.productName || "",
+        productModelName: row.model || "",
+        orderId: row.id,
+        type: "order",
+      },
+    });
+  };
+
+  // 鏌ョ湅鏉ユ簮鐢熶骇璁″垝鏁版嵁
+  const showSourceData = row => {
+    // 瀛樺偍鐐瑰嚮鏉ユ簮鎸夐挳鏃朵紶閫掔殑row鍙傛暟
+    sourceRowData.value = row;
+    // 璋冪敤API鑾峰彇鏉ユ簮鏁版嵁
+    getProductOrderSource(row.id)
+      .then(res => {
+        if (res.code === 200) {
+          // 鐩存帴瀛樺偍杩斿洖鐨勬墎骞冲寲鏁版嵁
+          sourceTableData.value = res.data || [];
+          sourcePage.total = sourceTableData.value.length;
+          // 鎵撳紑寮圭獥
+          sourceDataDialogVisible.value = true;
+        } else {
+          proxy.$modal.msgError(res.msg || "鑾峰彇鏉ユ簮鏁版嵁澶辫触");
+        }
+      })
+      .catch(err => {
+        proxy.$modal.msgError("鑾峰彇鏉ユ簮鏁版嵁澶辫触");
+        console.error(err);
       });
+  };
+
+  // 琛ㄦ牸閫夋嫨鏁版嵁
+  const handleSelectionChange = selection => {
+    selectedRows.value = selection;
+  };
+
+  const handleDelete = () => {
+    let ids = [];
+    if (selectedRows.value.length > 0) {
+      ids = selectedRows.value.map(item => item.id);
+    } else {
+      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+      return;
+    }
+    ElMessageBox.confirm("鏄惁閫�鍥炶鐢熶骇璁㈠崟锛�", "閫�鍥�", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
     })
-    .catch(() => {});
-};
+      .then(() => {
+        console.log(ids, "ids");
+        delProductOrder(ids).then(res => {
+          proxy.$modal.msgSuccess("閫�鍥炴垚鍔�");
+          getList();
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
 
-const handleConfirmRoute = () => {};
+  // 瀵煎嚭
+  const handleOut = () => {
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        proxy.download(
+          "/productionOrder/export",
+          { ...searchForm.value },
+          "鐢熶骇璁㈠崟鏁版嵁.xlsx"
+        );
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
 
-onMounted(() => {
-  getList();
-});
+  // 缁撴潫璁㈠崟
+  const handleEndOrder = row => {
+    ElMessageBox.confirm(`鏄惁纭缁撴潫璁㈠崟锛�${row.npsNo}锛焋, "鎻愮ず", {
+      confirmButtonText: "纭畾",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        const params = {
+          id: row.id,
+          endOrder: true,
+        };
+        updateProductOrder(params).then(() => {
+          proxy.$modal.msgSuccess("缁撴潫璁㈠崟鎴愬姛");
+          getList();
+        });
+      })
+      .catch(() => {});
+  };
+
+  const handleConfirmRoute = () => {};
+
+  onMounted(() => {
+    getList();
+  });
 </script>
 
 <style scoped lang="scss">
-.search_form {
-  align-items: start;
-}
+  .search_form {
+    align-items: start;
+  }
 
-.action-buttons {
-  display: flex;
-  flex-wrap: nowrap;
-  gap: 8px;
-}
-
-:deep(.yellow) {
-  background-color: #faf0de;
-}
-
-:deep(.pink) {
-  background-color: #fae1de;
-}
-
-:deep(.red) {
-  background-color: #f80202;
-}
-
-:deep(.purple) {
-  background-color: #f4defa;
-}
-.table_list {
-  margin-top: unset;
-}
-
-.process-progress-container {
-  display: inline-flex;
-  align-items: center;
-  padding: 10px 0;
-  white-space: nowrap;
-
-  .process-step {
+  .action-buttons {
     display: flex;
+    flex-wrap: nowrap;
+    gap: 8px;
+  }
+
+  :deep(.yellow) {
+    background-color: #faf0de;
+  }
+
+  :deep(.pink) {
+    background-color: #fae1de;
+  }
+
+  :deep(.red) {
+    background-color: #f80202;
+  }
+
+  :deep(.purple) {
+    background-color: #f4defa;
+  }
+  .table_list {
+    margin-top: unset;
+  }
+
+  .process-progress-container {
+    display: inline-flex;
     align-items: center;
-    position: relative;
+    padding: 10px 0;
+    white-space: nowrap;
 
-    .step-content {
+    .process-step {
       display: flex;
-      flex-direction: column;
       align-items: center;
-      z-index: 1;
+      position: relative;
 
-      .step-circle {
-        width: 36px;
-        height: 36px;
-        border-radius: 50%;
-        border: 2px solid #409eff;
+      .step-content {
         display: flex;
+        flex-direction: column;
         align-items: center;
-        justify-content: center;
-        background-color: #fff;
-        margin-bottom: 4px;
+        z-index: 1;
 
-        .step-percentage {
-          font-size: 11px;
-          font-weight: bold;
-        }
+        .step-circle {
+          width: 36px;
+          height: 36px;
+          border-radius: 50%;
+          border: 2px solid #409eff;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          background-color: #fff;
+          margin-bottom: 4px;
 
-        &.is-completed {
-          border-color: #67c23a;
           .step-percentage {
-            color: #67c23a;
+            font-size: 11px;
+            font-weight: bold;
+          }
+
+          &.is-completed {
+            border-color: #67c23a;
+            .step-percentage {
+              color: #67c23a;
+            }
           }
         }
+
+        .step-name {
+          font-size: 12px;
+          color: #606266;
+          white-space: nowrap;
+        }
       }
 
-      .step-name {
-        font-size: 12px;
-        color: #606266;
-        white-space: nowrap;
+      .step-line {
+        width: 30px;
+        height: 1px;
+        background-color: #dcdfe6;
+        margin: 0 -2px;
+        margin-top: -20px; // 鍚戜笂鍋忕Щ浠ュ榻愬渾蹇�
       }
-    }
-
-    .step-line {
-      width: 30px;
-      height: 1px;
-      background-color: #dcdfe6;
-      margin: 0 -2px;
-      margin-top: -20px; // 鍚戜笂鍋忕Щ浠ュ榻愬渾蹇�
     }
   }
-}
 </style>
 <style lang="scss">
-.status-cell {
-  font-weight: 600;
-  color: #409eff;
-  font-family: "Courier New", monospace;
-  text-shadow: 0 1px 2px rgba(64, 158, 255, 0.2);
-}
+  .status-cell {
+    font-weight: 600;
+    color: #409eff;
+    font-family: "Courier New", monospace;
+    text-shadow: 0 1px 2px rgba(64, 158, 255, 0.2);
+  }
 
-.source-table-container {
-  margin-top: 20px;
-}
+  .source-table-container {
+    margin-top: 20px;
+    flex: 1;
+    min-height: 0;
+    max-height: 500px;
+    overflow: auto;
+  }
 
-.source-data-cards-container {
-  display: flex;
-  flex-direction: column;
-  gap: 16px;
-  max-height: 500px;
-  overflow-y: auto;
-  padding: 10px;
-  background-color: #f5f7fa;
-  border-radius: 4px;
-  padding-bottom: 20px;
+  .source-data-cards-container {
+    display: flex;
+    flex-direction: column;
+    gap: 16px;
+    flex: 1;
+    min-height: 0;
+    max-height: none;
+    overflow-y: auto;
+    padding: 10px;
+    background-color: #f5f7fa;
+    border-radius: 4px;
+    padding-bottom: 20px;
 
-  .source-data-card {
-    background: #fff;
-    border-radius: 8px;
-    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-    overflow: hidden;
+    .source-data-card {
+      background: #fff;
+      border-radius: 8px;
+      box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+      overflow: hidden;
 
-    .card-body {
-      padding: 20px;
+      .card-body {
+        padding: 20px;
 
-      .info-grid {
-        display: grid;
-        grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
-        gap: 16px;
+        .info-grid {
+          display: grid;
+          grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+          gap: 16px;
 
-        .info-item {
-          display: flex;
-          flex-direction: column;
+          .info-item {
+            display: flex;
+            flex-direction: column;
 
-          .info-label {
-            font-size: 12px;
-            color: #909399;
-            margin-bottom: 4px;
-            font-weight: 500;
-          }
+            .info-label {
+              font-size: 12px;
+              color: #909399;
+              margin-bottom: 4px;
+              font-weight: 500;
+            }
 
-          .info-value {
-            font-size: 14px;
-            color: #303133;
-            font-weight: 500;
+            .info-value {
+              font-size: 14px;
+              color: #303133;
+              font-weight: 500;
+            }
           }
         }
       }
     }
   }
-}
 
-.applyno-summary1 {
-  padding: 16px 20px;
-  background: #f5f7fa;
-  border-bottom: 1px solid #e4e7ed;
-  display: flex;
-  flex-wrap: wrap;
-  gap: 16px;
-
-  .summary-item {
+  .applyno-summary1 {
+    padding: 16px 20px;
+    background: #f5f7fa;
+    border-bottom: 1px solid #e4e7ed;
     display: flex;
-    align-items: center;
-    margin-right: 20px;
+    flex-wrap: wrap;
+    gap: 16px;
 
-    .summary-label {
-      font-size: 13px;
-      color: #909399;
-      margin-right: 8px;
-      font-weight: 500;
-    }
+    .summary-item {
+      display: flex;
+      align-items: center;
+      margin-right: 20px;
 
-    .summary-value {
-      font-size: 14px;
-      color: #303133;
-      font-weight: 500;
+      .summary-label {
+        font-size: 13px;
+        color: #909399;
+        margin-right: 8px;
+        font-weight: 500;
+      }
+
+      .summary-value {
+        font-size: 14px;
+        color: #303133;
+        font-weight: 500;
+      }
     }
   }
-}
+
+  .source-data-dialog {
+    .el-dialog {
+      display: flex;
+      flex-direction: column;
+      max-height: 90vh;
+    }
+
+    .el-dialog__body {
+      flex: 1;
+      min-height: 0;
+      display: flex;
+      flex-direction: column;
+      overflow: hidden;
+    }
+  }
 </style>

--
Gitblit v1.9.3