From a563ea879ef5fb6897e76d2df661e465dce2ab9b Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 01 六月 2026 15:02:27 +0800
Subject: [PATCH] Merge branch 'dev_新疆_大罗素马铃薯new' of http://114.132.189.42:9002/r/product-inventory-management into dev_新疆_大罗素马铃薯new

---
 src/views/index.vue                                                                            |   37 
 src/views/qualityManagement/processInspection/components/formDia.vue                           |   68 
 src/views/qualityManagement/finalInspection/components/quickCheckDia.vue                       |  327 ++++++
 src/views/qualityManagement/processInspection/components/quickCheckDia.vue                     |  327 ++++++
 src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue                 |  327 ++++++
 src/views/qualityManagement/finalInspection/components/formDia.vue                             |   53 
 src/views/qualityManagement/rawMaterialInspection/index.vue                                    |   35 
 src/views/salesManagement/salesLedger/index.vue                                                |   15 
 src/views/qualityManagement/finalInspection/index.vue                                          |   34 
 src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue |  456 +++++---
 src/views/qualityManagement/processInspection/index.vue                                        |   60 -
 src/views/qualityManagement/metricBinding/index.vue                                            |   14 
 src/views/inventoryManagement/dispatchLog/Record.vue                                           | 1051 ++++++++++-----------
 src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js                 |    7 
 src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue                           |   12 
 src/views/systemArchitecture/index.vue                                                         |    2 
 src/views/qualityManagement/rawMaterialInspection/components/formDia.vue                       |   10 
 src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js           |    3 
 src/views/qualityManagement/metricMaintenance/index.vue                                        |   12 
 19 files changed, 1,949 insertions(+), 901 deletions(-)

diff --git a/src/views/index.vue b/src/views/index.vue
index ea7b4ff..e14da5e 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -419,6 +419,8 @@
   monthSaleHaveMoney: 0,
   monthSaleMoney: 0,
   todayInventoryNum: 0,
+  lastMonthSaleMoney: 0,
+  lastMonthPurchaseMoney: 0,
 });
 
 const qualityStatisticsObject = ref({
@@ -701,15 +703,29 @@
   });
 });
 
+// 璁$畻鐜瘮澧為暱鐜�
+const calculateGrowthRate = (current, last) => {
+  const currentVal = parseFloat(current) || 0;
+  const lastVal = parseFloat(last) || 0;
+  if (lastVal === 0) return currentVal > 0 ? 100 : 0;
+  return ((currentVal - lastVal) / lastVal * 100).toFixed(1);
+};
+
 const dashboardCards = computed(() => [
   {
     key: "sales",
     title: "閿�鍞暟鎹�",
     desc: "鏈湀閿�鍞(鍏�)",
     value: formatNumber(businessInfo.value.monthSaleMoney),
-    subLabel: "鏈紑绁ㄩ噾棰�",
-    subValue: formatNumber(businessInfo.value.monthSaleHaveMoney),
-    trend: `鍗犳瘮 ${ratioText(businessInfo.value.monthSaleHaveMoney, businessInfo.value.monthSaleMoney)}`,
+    subLabel: "涓婃湀閿�鍞�",
+    subValue: formatNumber(businessInfo.value.lastMonthSaleMoney),
+    trend: (() => {
+      const rate = calculateGrowthRate(businessInfo.value.monthSaleMoney, businessInfo.value.lastMonthSaleMoney);
+      const num = parseFloat(rate);
+      if (num > 0) return `鐜瘮 鈫� ${rate}%`;
+      if (num < 0) return `鐜瘮 鈫� ${Math.abs(num)}%`;
+      return "鐜瘮鎸佸钩";
+    })(),
     icon: DataLine,
     visible: visibleModules.value.sales,
   },
@@ -718,12 +734,15 @@
     title: "閲囪喘鏁版嵁",
     desc: "鏈湀閲囪喘棰�(鍏�)",
     value: formatNumber(businessInfo.value.monthPurchaseMoney),
-    subLabel: "寰呬粯娆鹃噾棰�",
-    subValue: formatNumber(businessInfo.value.monthPurchaseHaveMoney),
-    trend: `鍗犳瘮 ${ratioText(
-        businessInfo.value.monthPurchaseHaveMoney,
-        businessInfo.value.monthPurchaseMoney
-    )}`,
+    subLabel: "涓婃湀閲囪喘",
+    subValue: formatNumber(businessInfo.value.lastMonthPurchaseMoney),
+    trend: (() => {
+      const rate = calculateGrowthRate(businessInfo.value.monthPurchaseMoney, businessInfo.value.lastMonthPurchaseMoney);
+      const num = parseFloat(rate);
+      if (num > 0) return `鐜瘮 鈫� ${rate}%`;
+      if (num < 0) return `鐜瘮 鈫� ${Math.abs(num)}%`;
+      return "鐜瘮鎸佸钩";
+    })(),
     icon: ShoppingCartFull,
     visible: visibleModules.value.procurement,
   },
diff --git a/src/views/inventoryManagement/dispatchLog/Record.vue b/src/views/inventoryManagement/dispatchLog/Record.vue
index 2d7411d..431fd24 100644
--- a/src/views/inventoryManagement/dispatchLog/Record.vue
+++ b/src/views/inventoryManagement/dispatchLog/Record.vue
@@ -1,416 +1,411 @@
 <template>
   <div>
-    <div class="search_form"
-         style="margin-bottom: 10px">
-      <el-form ref="searchFormRef"
-               :model="searchForm"
-               class="demo-form-inline">
+    <div class="search_form" style="margin-bottom: 10px">
+      <el-form ref="searchFormRef" :model="searchForm" class="demo-form-inline">
         <el-row :gutter="20">
           <el-col :span="4">
-            <el-form-item label="鍑哄簱鏃ユ湡"
-                          prop="timeStr">
-              <el-date-picker v-model="searchForm.timeStr"
-                              type="date"
-                              placeholder="璇烽�夋嫨鏃ユ湡"
-                              value-format="YYYY-MM-DD"
-                              format="YYYY-MM-DD"
-                              clearable />
+            <el-form-item label="鍑哄簱鏃ユ湡" prop="timeStr">
+              <el-date-picker
+                v-model="searchForm.timeStr"
+                type="date"
+                placeholder="璇烽�夋嫨鏃ユ湡"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="4">
-            <el-form-item label="浜у搧澶х被"
-                          prop="productName">
-              <el-input v-model="searchForm.productName"
-                        style="width: 240px"
-                        placeholder="璇疯緭鍏�"
-                        clearable />
+            <el-form-item label="浜у搧澶х被" prop="productName">
+              <el-input
+                v-model="searchForm.productName"
+                style="width: 240px"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="4">
-            <el-form-item label="瑙勬牸鍨嬪彿"
-                          prop="model">
-              <el-input v-model="searchForm.model"
-                        style="width: 240px"
-                        placeholder="璇疯緭鍏�"
-                        clearable />
+            <el-form-item label="瑙勬牸鍨嬪彿" prop="model">
+              <el-input
+                v-model="searchForm.model"
+                style="width: 240px"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="4">
-            <el-form-item label="鎵瑰彿"
-                          prop="batchNo">
-              <el-input v-model="searchForm.batchNo"
-                        style="width: 240px"
-                        placeholder="璇疯緭鍏�"
-                        clearable />
+            <el-form-item label="鎵瑰彿" prop="batchNo">
+              <el-input
+                v-model="searchForm.batchNo"
+                style="width: 240px"
+                placeholder="璇疯緭鍏�"
+                clearable
+              />
             </el-form-item>
           </el-col>
           <el-col :span="4">
-            <el-form-item label="鏉ユ簮"
-                          prop="recordType">
-              <el-select v-model="searchForm.recordType"
-                         style="width: 240px"
-                         placeholder="璇烽�夋嫨"
-                         clearable>
-                <el-option v-for="item in stockRecordTypeOptions"
-                           :key="item.value"
-                           :label="item.label"
-                           :value="item.value" />
+            <el-form-item label="鏉ユ簮" prop="recordType">
+              <el-select
+                v-model="searchForm.recordType"
+                style="width: 240px"
+                placeholder="璇烽�夋嫨"
+                clearable
+              >
+                <el-option
+                  v-for="item in stockRecordTypeOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
               </el-select>
             </el-form-item>
           </el-col>
           <!-- 鎸夐挳 -->
           <el-col :span="4">
             <el-form-item>
-              <el-button type="primary"
-                         @click="getList">
-                鎼滅储
-              </el-button>
-              <el-button @click="resetSearch">
-                閲嶇疆
-              </el-button>
+              <el-button type="primary" @click="getList"> 鎼滅储 </el-button>
+              <el-button @click="resetSearch"> 閲嶇疆 </el-button>
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
     </div>
     <div class="actions">
-      <el-button type="primary"
-                 @click="handleBatchApprove">瀹℃壒</el-button>
+      <el-button type="primary" @click="handleBatchApprove">瀹℃壒</el-button>
       <el-button @click="handleOut">瀵煎嚭</el-button>
-      <el-button type="danger"
-                 plain
-                 @click="handleDelete">鍒犻櫎</el-button>
-      <el-button type="primary"
-                 plain
-                 @click="handlePrint">鎵撳嵃</el-button>
+      <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+      <el-button type="primary" plain @click="handlePrint">鎵撳嵃</el-button>
     </div>
     <div class="table_list">
-      <el-table :data="tableData"
-                border
-                v-loading="tableLoading"
-                @selection-change="handleSelectionChange"
-                :expand-row-keys="expandedRowKeys"
-                :row-key="(row) => row.id"
-                style="width: 100%"
-                height="calc(100vh - 18.5em)">
-        <el-table-column align="center"
-                         type="selection"
-                         width="55" />
-        <el-table-column align="center"
-                         label="搴忓彿"
-                         type="index"
-                         width="60" />
-        <el-table-column label="鍑哄簱鎵规"
-                         prop="outboundBatches"
-                         min-width="100"
-                         show-overflow-tooltip />
-        <el-table-column label="鍑哄簱鏃ユ湡"
-                         prop="createTime"
-                         show-overflow-tooltip />
-        <el-table-column label="浜у搧澶х被"
-                         prop="productName"
-                         show-overflow-tooltip />
-        <el-table-column label="瑙勬牸鍨嬪彿"
-                         prop="model"
-                         show-overflow-tooltip />
-        <el-table-column label="鎵瑰彿"
-                         prop="batchNo"
-                         show-overflow-tooltip />
-        <el-table-column label="鍗曚綅"
-                         prop="unit"
-                         show-overflow-tooltip />
-        <el-table-column label="鍑哄簱鏁伴噺"
-                         prop="stockOutNum"
-                         show-overflow-tooltip />
-        <el-table-column label="鍑哄簱浜�"
-                         prop="createBy"
-                         show-overflow-tooltip />
-        <el-table-column label="鏉ユ簮"
-                         prop="recordType"
-                         show-overflow-tooltip>
+      <el-table
+        :data="tableData"
+        border
+        v-loading="tableLoading"
+        @selection-change="handleSelectionChange"
+        :expand-row-keys="expandedRowKeys"
+        :row-key="(row) => row.id"
+        style="width: 100%"
+        height="calc(100vh - 18.5em)"
+      >
+        <el-table-column align="center" type="selection" width="55" />
+        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table-column
+          label="鍑哄簱鎵规"
+          prop="outboundBatches"
+          min-width="100"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鍑哄簱鏃ユ湡"
+          prop="updateTime"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="浜у搧澶х被"
+          prop="productName"
+          show-overflow-tooltip
+        />
+        <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
+        <el-table-column label="鎵瑰彿" prop="batchNo" show-overflow-tooltip />
+        <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
+        <el-table-column
+          label="鍑哄簱鏁伴噺"
+          prop="stockOutNum"
+          show-overflow-tooltip
+        />
+        <el-table-column label="鍑哄簱浜�" prop="createBy" show-overflow-tooltip />
+        <el-table-column label="鏉ユ簮" prop="recordType" show-overflow-tooltip>
           <template #default="scope">
             {{ getRecordType(scope.row.recordType) }}
           </template>
         </el-table-column>
-        <el-table-column label="瀹℃壒鐘舵��"
-                         prop="approvalStatus"
-                         show-overflow-tooltip>
+        <el-table-column
+          label="瀹℃壒鐘舵��"
+          prop="approvalStatus"
+          show-overflow-tooltip
+        >
           <template #default="scope">
-            <el-tag :type="getApprovalStatusTagType(scope.row.approvalStatus)"
-                    size="small">
+            <el-tag
+              :type="getApprovalStatusTagType(scope.row.approvalStatus)"
+              size="small"
+            >
               {{ getApprovalStatusLabel(scope.row.approvalStatus) }}
             </el-tag>
           </template>
         </el-table-column>
       </el-table>
-      <pagination v-show="total > 0"
-                  :total="total"
-                  layout="total, sizes, prev, pager, next, jumper"
-                  :page="page.current"
-                  :limit="page.size"
-                  @pagination="paginationChange" />
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current"
+        :limit="page.size"
+        @pagination="paginationChange"
+      />
     </div>
   </div>
 </template>
 
 <script setup>
-  import pagination from "@/components/PIMTable/Pagination.vue";
-  import { ref } from "vue";
-  import { ElMessageBox } from "element-plus";
-  import useUserStore from "@/store/modules/user";
-  import { getCurrentDate } from "@/utils/index.js";
-  import {
-    getStockOutPage,
-    delPendingStockOut,
-    batchApproveStockOutRecords,
-  } from "@/api/inventoryManagement/stockOut.js";
-  import {
-    findAllQualifiedStockOutRecordTypeOptions,
-    findAllUnQualifiedStockOutRecordTypeOptions,
-  } from "@/api/basicData/enum.js";
+import pagination from "@/components/PIMTable/Pagination.vue";
+import { ref } from "vue";
+import { ElMessageBox } from "element-plus";
+import useUserStore from "@/store/modules/user";
+import { getCurrentDate } from "@/utils/index.js";
+import {
+  getStockOutPage,
+  delPendingStockOut,
+  batchApproveStockOutRecords,
+} from "@/api/inventoryManagement/stockOut.js";
+import {
+  findAllQualifiedStockOutRecordTypeOptions,
+  findAllUnQualifiedStockOutRecordTypeOptions,
+} from "@/api/basicData/enum.js";
 
-  const userStore = useUserStore();
-  const { proxy } = getCurrentInstance();
-  const tableData = ref([]);
-  const selectedRows = ref([]);
-  const tableLoading = ref(false);
-  // 鏉ユ簮绫诲瀷閫夐」
-  const stockRecordTypeOptions = ref([]);
-  const page = reactive({
-    current: 1,
-    size: 100,
-  });
-  const total = ref(0);
+const userStore = useUserStore();
+const { proxy } = getCurrentInstance();
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+// 鏉ユ簮绫诲瀷閫夐」
+const stockRecordTypeOptions = ref([]);
+const page = reactive({
+  current: 1,
+  size: 100,
+});
+const total = ref(0);
 
-  const props = defineProps({
-    type: {
-      type: String,
-      required: true,
-      default: "0",
-    },
-    topParentProductId: {
-      type: [String, Number],
-      default: undefined,
-    },
-  });
+const props = defineProps({
+  type: {
+    type: String,
+    required: true,
+    default: "0",
+  },
+  topParentProductId: {
+    type: [String, Number],
+    default: undefined,
+  },
+});
 
-  // 鎵撳嵃鐩稿叧
-  const printPreviewVisible = ref(false);
-  const printData = ref([]);
+// 鎵撳嵃鐩稿叧
+const printPreviewVisible = ref(false);
+const printData = ref([]);
 
-  // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-  const data = reactive({
-    searchForm: {
-      supplierName: "",
-      timeStr: "",
-      recordType: "",
-    },
-  });
-  const { searchForm } = toRefs(data);
+// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
+const data = reactive({
+  searchForm: {
+    supplierName: "",
+    timeStr: "",
+    recordType: "",
+  },
+});
+const { searchForm } = toRefs(data);
 
-  const searchFormRef = ref(null);
+const searchFormRef = ref(null);
 
-  const resetSearch = () => {
-    searchFormRef.value?.resetFields();
-    page.current = 1;
-    getList();
-  };
+const resetSearch = () => {
+  searchFormRef.value?.resetFields();
+  page.current = 1;
+  getList();
+};
 
-  const paginationChange = obj => {
-    page.current = obj.page;
-    page.size = obj.limit;
-    getList();
-  };
-  const getList = () => {
-    tableLoading.value = true;
-    getStockOutPage({
-      ...searchForm.value,
-      ...page,
-      topParentProductId: props.topParentProductId,
+const paginationChange = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+const getList = () => {
+  tableLoading.value = true;
+  getStockOutPage({
+    ...searchForm.value,
+    ...page,
+    topParentProductId: props.topParentProductId,
+  })
+    .then((res) => {
+      tableLoading.value = false;
+      tableData.value = res.data.records;
+      tableData.value.map((item) => {
+        item.children = [];
+      });
+      total.value = res.data.total;
     })
-      .then(res => {
-        tableLoading.value = false;
-        tableData.value = res.data.records;
-        tableData.value.map(item => {
-          item.children = [];
-        });
-        total.value = res.data.total;
-      })
-      .catch(() => {
-        tableLoading.value = false;
-      });
-  };
+    .catch(() => {
+      tableLoading.value = false;
+    });
+};
 
-  const getRecordType = recordType => {
-    return (
-      stockRecordTypeOptions.value.find(item => item.value === recordType)
-        ?.label || ""
-    );
-  };
+const getRecordType = (recordType) => {
+  return (
+    stockRecordTypeOptions.value.find((item) => item.value === recordType)
+      ?.label || ""
+  );
+};
 
-  const approvalStatusLabelMap = {
-    0: "寰呭鎵�",
-    1: "閫氳繃",
-    2: "椹冲洖",
-    3: "寰呯‘璁�",
-    pending: "寰呭鎵�",
-    approved: "閫氳繃",
-    rejected: "椹冲洖",
-    PENDING: "寰呭鎵�",
-    APPROVED: "閫氳繃",
-    REJECTED: "椹冲洖",
-  };
+const approvalStatusLabelMap = {
+  0: "寰呭鎵�",
+  1: "閫氳繃",
+  2: "椹冲洖",
+  3: "寰呯‘璁�",
+  pending: "寰呭鎵�",
+  approved: "閫氳繃",
+  rejected: "椹冲洖",
+  PENDING: "寰呭鎵�",
+  APPROVED: "閫氳繃",
+  REJECTED: "椹冲洖",
+};
 
-  const getApprovalStatusLabel = status => {
-    if (status === null || status === undefined || status === "") {
-      return "寰呭鎵�";
-    }
-    return approvalStatusLabelMap[status] || "寰呭鎵�";
-  };
+const getApprovalStatusLabel = (status) => {
+  if (status === null || status === undefined || status === "") {
+    return "寰呭鎵�";
+  }
+  return approvalStatusLabelMap[status] || "寰呭鎵�";
+};
 
-  // 閫氳繃/椹冲洖鍥哄畾鑹诧紱鍏朵綑锛堝惈寰呭鎵广�佺┖鍊笺�佹湭鏄犲皠浣嗘枃妗堜负寰呭鎵癸級缁熶竴鐢� warning 棰勮鑹�
-  const getApprovalStatusTagType = status => {
-    if (
-      status === 1 ||
-      status === "1" ||
-      status === "approved" ||
-      status === "APPROVED"
-    )
-      return "success";
-    if (
-      status === 2 ||
-      status === "2" ||
-      status === "rejected" ||
-      status === "REJECTED"
-    )
-      return "danger";
-    return "warning";
-  };
+// 閫氳繃/椹冲洖鍥哄畾鑹诧紱鍏朵綑锛堝惈寰呭鎵广�佺┖鍊笺�佹湭鏄犲皠浣嗘枃妗堜负寰呭鎵癸級缁熶竴鐢� warning 棰勮鑹�
+const getApprovalStatusTagType = (status) => {
+  if (
+    status === 1 ||
+    status === "1" ||
+    status === "approved" ||
+    status === "APPROVED"
+  )
+    return "success";
+  if (
+    status === 2 ||
+    status === "2" ||
+    status === "rejected" ||
+    status === "REJECTED"
+  )
+    return "danger";
+  return "warning";
+};
 
-  // 鑾峰彇鏉ユ簮绫诲瀷閫夐」
-  const fetchStockRecordTypeOptions = () => {
-    if (props.type === "0") {
-      findAllQualifiedStockOutRecordTypeOptions().then(res => {
-        stockRecordTypeOptions.value = res.data;
-      });
-      return;
-    }
-    findAllUnQualifiedStockOutRecordTypeOptions().then(res => {
+// 鑾峰彇鏉ユ簮绫诲瀷閫夐」
+const fetchStockRecordTypeOptions = () => {
+  if (props.type === "0") {
+    findAllQualifiedStockOutRecordTypeOptions().then((res) => {
       stockRecordTypeOptions.value = res.data;
     });
-  };
+    return;
+  }
+  findAllUnQualifiedStockOutRecordTypeOptions().then((res) => {
+    stockRecordTypeOptions.value = res.data;
+  });
+};
 
-  // 琛ㄦ牸閫夋嫨鏁版嵁
-  const handleSelectionChange = selection => {
-    // 杩囨护鎺夊瓙鏁版嵁
-    selectedRows.value = selection.filter(item => item.id);
-    console.log("selection", selectedRows.value);
-  };
-  const expandedRowKeys = ref([]);
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  // 杩囨护鎺夊瓙鏁版嵁
+  selectedRows.value = selection.filter((item) => item.id);
+  console.log("selection", selectedRows.value);
+};
+const expandedRowKeys = ref([]);
 
-  const handleBatchApprove = () => {
-    if (selectedRows.value.length === 0) {
-      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-      return;
-    }
-    const ids = selectedRows.value.map(item => item.id);
-    ElMessageBox.confirm("璇烽�夋嫨瀹℃壒缁撴灉", "瀹℃壒", {
-      confirmButtonText: "閫氳繃",
-      cancelButtonText: "椹冲洖",
-      type: "warning",
-      distinguishCancelAndClose: true,
+const handleBatchApprove = () => {
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
+  }
+  const ids = selectedRows.value.map((item) => item.id);
+  ElMessageBox.confirm("璇烽�夋嫨瀹℃壒缁撴灉", "瀹℃壒", {
+    confirmButtonText: "閫氳繃",
+    cancelButtonText: "椹冲洖",
+    type: "warning",
+    distinguishCancelAndClose: true,
+  })
+    .then(() => {
+      batchApproveStockOutRecords({ ids, approvalStatus: 1 })
+        .then(() => {
+          proxy.$modal.msgSuccess("瀹℃壒閫氳繃鎴愬姛");
+          getList();
+        })
+        .catch(() => {
+          proxy.$modal.msgError("瀹℃壒閫氳繃澶辫触");
+        });
     })
-      .then(() => {
-        batchApproveStockOutRecords({ ids, approvalStatus: 1 })
+    .catch((action) => {
+      if (action === "cancel") {
+        batchApproveStockOutRecords({ ids, approvalStatus: 2 })
           .then(() => {
-            proxy.$modal.msgSuccess("瀹℃壒閫氳繃鎴愬姛");
+            proxy.$modal.msgSuccess("瀹℃壒椹冲洖鎴愬姛");
             getList();
           })
           .catch(() => {
-            proxy.$modal.msgError("瀹℃壒閫氳繃澶辫触");
+            proxy.$modal.msgError("瀹℃壒椹冲洖澶辫触");
           });
-      })
-      .catch(action => {
-        if (action === "cancel") {
-          batchApproveStockOutRecords({ ids, approvalStatus: 2 })
-            .then(() => {
-              proxy.$modal.msgSuccess("瀹℃壒椹冲洖鎴愬姛");
-              getList();
-            })
-            .catch(() => {
-              proxy.$modal.msgError("瀹℃壒椹冲洖澶辫触");
-            });
-          return;
-        }
-        proxy.$modal.msg("宸插彇娑�");
-      });
-  };
+        return;
+      }
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 
-  // 瀵煎嚭
-  const handleOut = () => {
-    ElMessageBox.confirm("鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
+// 瀵煎嚭
+const handleOut = () => {
+  ElMessageBox.confirm("鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+    .then(() => {
+      proxy.download(
+        "/stockOutRecord/exportStockOutRecord",
+        { type: props.type },
+        props.type === "0" ? "鍚堟牸鍑哄簱鍙拌处.xlsx" : "涓嶅悎鏍煎嚭搴撳彴璐�.xlsx"
+      );
     })
-      .then(() => {
-        proxy.download(
-          "/stockOutRecord/exportStockOutRecord",
-          { type: props.type },
-          props.type === "0" ? "鍚堟牸鍑哄簱鍙拌处.xlsx" : "涓嶅悎鏍煎嚭搴撳彴璐�.xlsx"
-        );
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
-  };
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 
-  // 鍒犻櫎
-  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",
+// 鍒犻櫎
+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(() => {
+      delPendingStockOut(ids).then((res) => {
+        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        getList();
+      });
     })
-      .then(() => {
-        delPendingStockOut(ids).then(res => {
-          proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-          getList();
-        });
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
-  };
+    .catch(() => {
+      proxy.$modal.msg("宸插彇娑�");
+    });
+};
 
-  // 鎵撳嵃鍔熻兘
-  const handlePrint = () => {
-    if (selectedRows.value.length === 0) {
-      proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
-      return;
-    }
-    printData.value = [...selectedRows.value];
-    console.log("鎵撳嵃鏁版嵁:", printData.value);
-    printPreviewVisible.value = true;
-  };
+// 鎵撳嵃鍔熻兘
+const handlePrint = () => {
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgWarning("璇烽�夋嫨瑕佹墦鍗扮殑鏁版嵁");
+    return;
+  }
+  printData.value = [...selectedRows.value];
+  console.log("鎵撳嵃鏁版嵁:", printData.value);
+  printPreviewVisible.value = true;
+};
 
-  // 鎵ц鎵撳嵃
-  const executePrint = () => {
-    console.log("寮�濮嬫墽琛屾墦鍗帮紝鏁版嵁鏉℃暟:", printData.value.length);
-    console.log("鎵撳嵃鏁版嵁:", printData.value);
+// 鎵ц鎵撳嵃
+const executePrint = () => {
+  console.log("寮�濮嬫墽琛屾墦鍗帮紝鏁版嵁鏉℃暟:", printData.value.length);
+  console.log("鎵撳嵃鏁版嵁:", printData.value);
 
-    // 鍒涘缓涓�涓柊鐨勬墦鍗扮獥鍙�
-    const printWindow = window.open("", "_blank", "width=800,height=600");
+  // 鍒涘缓涓�涓柊鐨勬墦鍗扮獥鍙�
+  const printWindow = window.open("", "_blank", "width=800,height=600");
 
-    // 鏋勫缓鎵撳嵃鍐呭
-    let printContent = `
+  // 鏋勫缓鎵撳嵃鍐呭
+  let printContent = `
       <!DOCTYPE html>
       <html>
       <head>
@@ -545,9 +540,9 @@
       <body>
     `;
 
-    // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
-    printData.value.forEach((item, index) => {
-      printContent += `
+  // 涓烘瘡鏉℃暟鎹敓鎴愭墦鍗伴〉闈�
+  printData.value.forEach((item, index) => {
+    printContent += `
         <div class="print-page">
           <div class="delivery-note">
             <div class="header">
@@ -637,233 +632,233 @@
           </div>
         </div>
       `;
-    });
+  });
 
-    printContent += `
+  printContent += `
       </body>
       </html>
     `;
 
-    // 鍐欏叆鍐呭鍒版柊绐楀彛
-    printWindow.document.write(printContent);
-    printWindow.document.close();
+  // 鍐欏叆鍐呭鍒版柊绐楀彛
+  printWindow.document.write(printContent);
+  printWindow.document.close();
 
-    // 绛夊緟鍐呭鍔犺浇瀹屾垚鍚庢墦鍗�
-    printWindow.onload = () => {
-      setTimeout(() => {
-        printWindow.print();
-        printWindow.close();
-        printPreviewVisible.value = false;
-      }, 500);
-    };
+  // 绛夊緟鍐呭鍔犺浇瀹屾垚鍚庢墦鍗�
+  printWindow.onload = () => {
+    setTimeout(() => {
+      printWindow.print();
+      printWindow.close();
+      printPreviewVisible.value = false;
+    }, 500);
   };
+};
 
-  // 鏍煎紡鍖栨棩鏈�
-  const formatDate = dateString => {
-    if (!dateString) return getCurrentDate();
-    const date = new Date(dateString);
-    const year = date.getFullYear();
-    const month = String(date.getMonth() + 1).padStart(2, "0");
-    const day = String(date.getDate()).padStart(2, "0");
-    return `${year}/${month}/${day}`;
-  };
+// 鏍煎紡鍖栨棩鏈�
+const formatDate = (dateString) => {
+  if (!dateString) return getCurrentDate();
+  const date = new Date(dateString);
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, "0");
+  const day = String(date.getDate()).padStart(2, "0");
+  return `${year}/${month}/${day}`;
+};
 
-  // 鏍煎紡鍖栨棩鏈熸椂闂�
-  const formatDateTime = date => {
-    const year = date.getFullYear();
-    const month = String(date.getMonth() + 1).padStart(2, "0");
-    const day = String(date.getDate()).padStart(2, "0");
-    const hours = String(date.getHours()).padStart(2, "0");
-    const minutes = String(date.getMinutes()).padStart(2, "0");
-    const seconds = String(date.getSeconds()).padStart(2, "0");
-    return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
-  };
-  onMounted(() => {
+// 鏍煎紡鍖栨棩鏈熸椂闂�
+const formatDateTime = (date) => {
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, "0");
+  const day = String(date.getDate()).padStart(2, "0");
+  const hours = String(date.getHours()).padStart(2, "0");
+  const minutes = String(date.getMinutes()).padStart(2, "0");
+  const seconds = String(date.getSeconds()).padStart(2, "0");
+  return `${year}/${month}/${day} ${hours}:${minutes}:${seconds}`;
+};
+onMounted(() => {
+  getList();
+  fetchStockRecordTypeOptions();
+});
+
+watch(
+  () => props.topParentProductId,
+  () => {
+    page.current = 1;
     getList();
-    fetchStockRecordTypeOptions();
-  });
-
-  watch(
-    () => props.topParentProductId,
-    () => {
-      page.current = 1;
-      getList();
-    }
-  );
+  }
+);
 </script>
 
 <style scoped lang="scss">
-  .print-preview-dialog {
-    .el-dialog__body {
-      padding: 0;
-      max-height: 80vh;
-      overflow-y: auto;
-    }
+.print-preview-dialog {
+  .el-dialog__body {
+    padding: 0;
+    max-height: 80vh;
+    overflow-y: auto;
   }
+}
 
-  .print-preview-container {
-    .print-preview-header {
-      padding: 15px;
-      border-bottom: 1px solid #e4e7ed;
-      text-align: center;
-
-      .el-button {
-        margin: 0 10px;
-      }
-    }
-
-    .print-preview-content {
-      padding: 20px;
-      background-color: #f5f5f5;
-      min-height: 400px;
-    }
-  }
-
-  .print-page {
-    width: 220mm;
-    height: 90mm;
-    padding: 10mm;
-    margin: 0 auto;
-    background: white;
-    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
-    margin-bottom: 10px;
-    box-sizing: border-box;
-  }
-
-  .delivery-note {
-    width: 100%;
-    height: 100%;
-    font-family: "SimSun", serif;
-    font-size: 10px;
-    line-height: 1.2;
-    display: flex;
-    flex-direction: column;
-  }
-
-  .header {
+.print-preview-container {
+  .print-preview-header {
+    padding: 15px;
+    border-bottom: 1px solid #e4e7ed;
     text-align: center;
-    margin-bottom: 8px;
 
-    .company-name {
-      font-size: 18px;
-      font-weight: bold;
-      margin-bottom: 4px;
-    }
-
-    .document-title {
-      font-size: 16px;
-      font-weight: bold;
+    .el-button {
+      margin: 0 10px;
     }
   }
 
-  .info-section {
-    margin-bottom: 8px;
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
+  .print-preview-content {
+    padding: 20px;
+    background-color: #f5f5f5;
+    min-height: 400px;
+  }
+}
 
-    .info-row {
-      line-height: 20px;
+.print-page {
+  width: 220mm;
+  height: 90mm;
+  padding: 10mm;
+  margin: 0 auto;
+  background: white;
+  box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
+  margin-bottom: 10px;
+  box-sizing: border-box;
+}
+
+.delivery-note {
+  width: 100%;
+  height: 100%;
+  font-family: "SimSun", serif;
+  font-size: 10px;
+  line-height: 1.2;
+  display: flex;
+  flex-direction: column;
+}
+
+.header {
+  text-align: center;
+  margin-bottom: 8px;
+
+  .company-name {
+    font-size: 18px;
+    font-weight: bold;
+    margin-bottom: 4px;
+  }
+
+  .document-title {
+    font-size: 16px;
+    font-weight: bold;
+  }
+}
+
+.info-section {
+  margin-bottom: 8px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+
+  .info-row {
+    line-height: 20px;
+
+    .label {
+      font-weight: bold;
+      width: 60px;
+      font-size: 14px;
+    }
+
+    .value {
+      margin-right: 20px;
+      min-width: 80px;
+      font-size: 14px;
+    }
+  }
+}
+
+.table-section {
+  margin-bottom: 4px;
+  flex: 1;
+
+  .product-table {
+    width: 100%;
+    border-collapse: collapse;
+    border: 1px solid #000;
+
+    th,
+    td {
+      border: 1px solid #000;
+      padding: 6px;
+      text-align: center;
+      font-size: 14px;
+      line-height: 1.4;
+    }
+
+    th {
+      font-weight: bold;
+    }
+
+    .total-label {
+      text-align: right;
+      font-weight: bold;
+    }
+
+    .total-value {
+      font-weight: bold;
+    }
+  }
+}
+
+.footer-section {
+  .footer-row {
+    display: flex;
+    margin-bottom: 3px;
+    line-height: 20px;
+    justify-content: space-between;
+
+    .footer-item {
+      display: flex;
+      margin-right: 20px;
 
       .label {
         font-weight: bold;
-        width: 60px;
+        width: 80px;
         font-size: 14px;
       }
 
       .value {
-        margin-right: 20px;
         min-width: 80px;
         font-size: 14px;
       }
-    }
-  }
 
-  .table-section {
-    margin-bottom: 4px;
-    flex: 1;
-
-    .product-table {
-      width: 100%;
-      border-collapse: collapse;
-      border: 1px solid #000;
-
-      th,
-      td {
-        border: 1px solid #000;
-        padding: 6px;
-        text-align: center;
-        font-size: 14px;
-        line-height: 1.4;
-      }
-
-      th {
-        font-weight: bold;
-      }
-
-      .total-label {
-        text-align: right;
-        font-weight: bold;
-      }
-
-      .total-value {
-        font-weight: bold;
-      }
-    }
-  }
-
-  .footer-section {
-    .footer-row {
-      display: flex;
-      margin-bottom: 3px;
-      line-height: 20px;
-      justify-content: space-between;
-
-      .footer-item {
-        display: flex;
-        margin-right: 20px;
-
-        .label {
-          font-weight: bold;
-          width: 80px;
-          font-size: 14px;
-        }
-
-        .value {
-          min-width: 80px;
-          font-size: 14px;
-        }
-
-        &.address-item {
-          .address-value {
-            min-width: 200px;
-          }
+      &.address-item {
+        .address-value {
+          min-width: 200px;
         }
       }
     }
   }
+}
 
-  @media print {
-    .app-container {
-      display: none;
-    }
-
-    .print-page {
-      box-shadow: none;
-      margin: 0;
-      padding: 10mm;
-      padding-left: 20mm;
-      page-break-inside: avoid;
-      page-break-after: always;
-    }
-    .print-page:last-child {
-      page-break-after: avoid;
-    }
+@media print {
+  .app-container {
+    display: none;
   }
 
-  .actions {
-    display: flex;
-    justify-content: flex-end;
-    margin-bottom: 10px;
+  .print-page {
+    box-shadow: none;
+    margin: 0;
+    padding: 10mm;
+    padding-left: 20mm;
+    page-break-inside: avoid;
+    page-break-after: always;
   }
+  .print-page:last-child {
+    page-break-after: avoid;
+  }
+}
+
+.actions {
+  display: flex;
+  justify-content: flex-end;
+  margin-bottom: 10px;
+}
 </style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
index 677e0bc..f983240 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/approveListConstants.js
@@ -474,13 +474,14 @@
 }
 
 /** 缁勮瀹℃壒鎻愪氦 DTO */
-export function buildApproveInstanceDto(row, uiResult, comment, warehouse) {
+export function buildApproveInstanceDto(row, uiResult, comment, warehouse, extraData = {}) {
   const opinion = (comment || "").trim();
   return {
     id: row?.id,
     approveAction: mapApproveActionToApi(uiResult),
     approveComment: opinion || (uiResult === "approved" ? "鍚屾剰" : ""),
     warehouse: warehouse || row?.warehouse || "",
+    ...extraData,
   };
 }
 
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
index ffa727e..9689be8 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -3,32 +3,44 @@
   <div class="approve-detail-panel">
     <div class="detail-block">
       <div class="detail-block-title">鍩烘湰淇℃伅</div>
-      <el-descriptions :column="2"
-                       border>
-        <el-descriptions-item label="涓氬姟鍗曞彿">{{ row.bizId || row.id || "鈥�" }}</el-descriptions-item>
+      <el-descriptions :column="2" border>
+        <el-descriptions-item label="涓氬姟鍗曞彿">{{
+          row.bizId || row.id || "鈥�"
+        }}</el-descriptions-item>
         <el-descriptions-item label="瀹℃壒鐘舵��">
-          <el-tag :type="approvalStatusTagType(row.approvalStatus)"
-                  size="small"
-                  effect="plain">
+          <el-tag
+            :type="approvalStatusTagType(row.approvalStatus)"
+            size="small"
+            effect="plain"
+          >
             {{ approvalStatusLabel(row.approvalStatus) }}
           </el-tag>
         </el-descriptions-item>
         <el-descriptions-item label="瀹℃壒绫诲瀷">
-          <span class="approve-type-cell"
-                :style="approvalTypeStyle(row.approvalType)">
+          <span
+            class="approve-type-cell"
+            :style="approvalTypeStyle(row.approvalType)"
+          >
             {{ approvalTypeLabel(row.approvalType) }}
           </span>
         </el-descriptions-item>
-        <el-descriptions-item label="鐢宠浜虹紪鍙�">{{ row.applicantNo || "鈥�" }}</el-descriptions-item>
-        <el-descriptions-item label="鐢宠浜哄悕绉�">{{ row.applicantName || "鈥�" }}</el-descriptions-item>
-        <el-descriptions-item label="鐢宠鎽樿">{{ row.summary || "鈥�" }}</el-descriptions-item>
-        <el-descriptions-item v-if="row.rejectReason"
-                              label="椹冲洖鍘熷洜"
-                              :span="2">
+        <el-descriptions-item label="鐢宠浜虹紪鍙�">{{
+          row.applicantNo || "鈥�"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鐢宠浜哄悕绉�">{{
+          row.applicantName || "鈥�"
+        }}</el-descriptions-item>
+        <el-descriptions-item label="鐢宠鎽樿">{{
+          row.summary || "鈥�"
+        }}</el-descriptions-item>
+        <el-descriptions-item
+          v-if="row.rejectReason"
+          label="椹冲洖鍘熷洜"
+          :span="2"
+        >
           <span class="reject-text">{{ row.rejectReason }}</span>
         </el-descriptions-item>
-        <el-descriptions-item label="鍒涘缓鏃堕棿"
-                              :span="2">
+        <el-descriptions-item label="鍒涘缓鏃堕棿" :span="2">
           {{ formatDisplayTime(row.createTime) }}
         </el-descriptions-item>
       </el-descriptions>
@@ -36,141 +48,226 @@
     <div class="detail-block">
       <div class="detail-block-title">濉姤鍐呭</div>
       <!-- 榛樿琛ㄥ崟灞曠ず -->
-      <FormPayloadFields v-if="!isSpecialApprovalType"
-                         :fields="formResolved.fields"
-                         :form-payload="formResolved.formPayload"
-                         readonly />
-      
+      <FormPayloadFields
+        v-if="!isSpecialApprovalType"
+        :fields="formResolved.fields"
+        :form-payload="formResolved.formPayload"
+        readonly
+      />
+
       <!-- 鍙戣揣瀹℃壒璇︽儏 -->
       <template v-else-if="row.businessType === 7">
         <div v-if="detailData.shippingInfo" class="shipment-detail">
           <el-divider content-position="left">鍙戣揣璇︽儏</el-divider>
           <el-descriptions :column="2" border>
-            <el-descriptions-item label="閿�鍞鍗�">{{ detailData.shippingInfo.salesContractNo || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="鍙戣揣璁㈠崟鍙�">{{ detailData.shippingInfo.shippingNo || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.shippingInfo.customerName || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="鍙戣揣绫诲瀷">{{ detailData.shippingInfo.type || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="鍙戣揣鏃ユ湡">{{ detailData.shippingInfo.shippingDateDate || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="瀹℃牳鐘舵��">{{ detailData.shippingInfo.status || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{ detailData.shippingInfo.shippingCarNumber || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="蹇�掑叕鍙�">{{ detailData.shippingInfo.expressCompany || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="蹇�掑崟鍙�" :span="2">{{ detailData.shippingInfo.expressNumber || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="閿�鍞鍗�">{{
+              detailData.shippingInfo.salesContractNo || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="鍑哄簱鎵瑰彿">{{
+              detailData.shippingInfo.outboundBatches || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="瀹㈡埛鍚嶇О">{{
+              detailData.shippingInfo.customerName || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣绫诲瀷">{{
+              detailData.shippingInfo.type || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣鏃ユ湡">{{
+              detailData.shippingInfo.shippingDateDate || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="瀹℃牳鐘舵��">{{
+              detailData.shippingInfo.status || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="鍙戣揣杞︾墝鍙�">{{
+              detailData.shippingInfo.shippingCarNumber || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="蹇�掑叕鍙�">{{
+              detailData.shippingInfo.expressCompany || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="蹇�掑崟鍙�" :span="2">{{
+              detailData.shippingInfo.expressNumber || "--"
+            }}</el-descriptions-item>
           </el-descriptions>
-          <div v-if="detailData.shippingProductDetailDtoList.length" style="margin-top: 20px;">
+          <div
+            v-if="detailData.shippingProductDetailDtoList.length"
+            style="margin-top: 20px"
+          >
             <h4>浜у搧鏄庣粏</h4>
-            <el-table :data="detailData.shippingProductDetailDtoList"
-                      border
-                      size="small"
-                      style="width: 100%">
-              <el-table-column label="鎵瑰彿" prop="batchNo" min-width="160" show-overflow-tooltip />
-              <el-table-column label="浜у搧鍚嶇О" prop="productName" min-width="160" show-overflow-tooltip />
-              <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" min-width="160" show-overflow-tooltip />
-              <el-table-column label="鍙戣揣鏁伴噺" prop="deliveryQuantity" min-width="120" align="center" />
+            <el-table
+              :data="detailData.shippingProductDetailDtoList"
+              border
+              size="small"
+              style="width: 100%"
+            >
+              <el-table-column
+                label="鎵瑰彿"
+                prop="batchNo"
+                min-width="160"
+                show-overflow-tooltip
+              />
+              <el-table-column
+                label="浜у搧鍚嶇О"
+                prop="productName"
+                min-width="160"
+                show-overflow-tooltip
+              />
+              <el-table-column
+                label="瑙勬牸鍨嬪彿"
+                prop="specificationModel"
+                min-width="160"
+                show-overflow-tooltip
+              />
+              <el-table-column
+                label="鍙戣揣鏁伴噺"
+                prop="deliveryQuantity"
+                min-width="120"
+                align="center"
+              />
             </el-table>
           </div>
         </div>
       </template>
-      
+
       <!-- 閲囪喘瀹℃壒璇︽儏 -->
       <template v-else-if="row.businessType === 5">
         <div v-if="detailData" class="procurement-detail">
           <el-divider content-position="left">閲囪喘璇︽儏</el-divider>
           <el-descriptions :column="2" border>
-            <el-descriptions-item label="閲囪喘鍚堝悓鍙�">{{ detailData.purchaseContractNumber || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="渚涘簲鍟嗗悕绉�">{{ detailData.supplierName || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="椤圭洰鍚嶇О">{{ detailData.projectName || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="閿�鍞悎鍚屽彿">{{ detailData.salesContractNo || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="绛捐鏃ユ湡">{{ detailData.executionDate || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="褰曞叆鏃ユ湡">{{ detailData.entryDate || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="浠樻鏂瑰紡">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="閲囪喘鍚堝悓鍙�">{{
+              detailData.purchaseContractNumber || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="渚涘簲鍟嗗悕绉�">{{
+              detailData.supplierName || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="椤圭洰鍚嶇О">{{
+              detailData.projectName || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="閿�鍞悎鍚屽彿">{{
+              detailData.salesContractNo || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="绛捐鏃ユ湡">{{
+              detailData.executionDate || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="褰曞叆鏃ユ湡">{{
+              detailData.entryDate || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="浠樻鏂瑰紡">{{
+              detailData.paymentMethod || "--"
+            }}</el-descriptions-item>
             <el-descriptions-item label="鍚堝悓閲戦" :span="2">
-              <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
+              <span style="font-size: 18px; color: #e6a23c; font-weight: bold">
                 楼{{ Number(detailData.contractAmount ?? 0).toFixed(2) }}
               </span>
             </el-descriptions-item>
           </el-descriptions>
-          <div v-if="detailData.productData.length" style="margin-top: 20px;">
+          <div v-if="detailData.productData.length" style="margin-top: 20px">
             <h4>浜у搧鏄庣粏</h4>
-            <el-table :data="detailData.productData"
-                      border
-                      style="width: 100%">
+            <el-table :data="detailData.productData" border style="width: 100%">
               <el-table-column prop="productCategory" label="浜у搧鍚嶇О" />
               <el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" />
               <el-table-column prop="unit" label="鍗曚綅" />
               <el-table-column prop="quantity" label="鏁伴噺" />
               <el-table-column prop="taxInclusiveUnitPrice" label="鍚◣鍗曚环">
-                <template #default="scope">楼{{ Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2) }}</template>
+                <template #default="scope"
+                  >楼{{
+                    Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2)
+                  }}</template
+                >
               </el-table-column>
               <el-table-column prop="taxInclusiveTotalPrice" label="鍚◣鎬讳环">
-                <template #default="scope">楼{{ Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2) }}</template>
+                <template #default="scope"
+                  >楼{{
+                    Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2)
+                  }}</template
+                >
               </el-table-column>
             </el-table>
           </div>
         </div>
       </template>
-      
+
       <!-- 鎶ヤ环瀹℃壒璇︽儏 -->
       <template v-else-if="row.businessType === 6">
         <div v-if="detailData" class="quotation-detail">
           <el-divider content-position="left">鎶ヤ环璇︽儏</el-divider>
           <el-descriptions :column="2" border>
-            <el-descriptions-item label="鎶ヤ环鍗曞彿">{{ detailData.quotationNo || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detailData.customer || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="涓氬姟鍛�">{{ detailData.salesperson || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="鎶ヤ环鏃ユ湡">{{ detailData.quotationDate || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="鏈夋晥鏈熻嚦">{{ detailData.validDate || "--" }}</el-descriptions-item>
-            <el-descriptions-item label="浠樻鏂瑰紡">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
+            <el-descriptions-item label="鎶ヤ环鍗曞彿">{{
+              detailData.quotationNo || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="瀹㈡埛鍚嶇О">{{
+              detailData.customer || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="涓氬姟鍛�">{{
+              detailData.salesperson || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="鎶ヤ环鏃ユ湡">{{
+              detailData.quotationDate || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="鏈夋晥鏈熻嚦">{{
+              detailData.validDate || "--"
+            }}</el-descriptions-item>
+            <el-descriptions-item label="浠樻鏂瑰紡">{{
+              detailData.paymentMethod || "--"
+            }}</el-descriptions-item>
             <el-descriptions-item label="鎶ヤ环鎬婚" :span="2">
-              <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
+              <span style="font-size: 18px; color: #e6a23c; font-weight: bold">
                 楼{{ Number(detailData.totalAmount ?? 0).toFixed(2) }}
               </span>
             </el-descriptions-item>
           </el-descriptions>
-          <div v-if="detailData.products?.length" style="margin-top: 20px;">
+          <div v-if="detailData.products?.length" style="margin-top: 20px">
             <h4>浜у搧鏄庣粏</h4>
-            <el-table :data="detailData.products"
-                      border
-                      style="width: 100%">
+            <el-table :data="detailData.products" border style="width: 100%">
               <el-table-column prop="product" label="浜у搧鍚嶇О" />
               <el-table-column prop="specification" label="瑙勬牸鍨嬪彿" />
               <el-table-column prop="unit" label="鍗曚綅" />
               <el-table-column prop="unitPrice" label="鍗曚环">
-                <template #default="scope">楼{{ Number(scope.row.unitPrice ?? 0).toFixed(2) }}</template>
+                <template #default="scope"
+                  >楼{{ Number(scope.row.unitPrice ?? 0).toFixed(2) }}</template
+                >
               </el-table-column>
             </el-table>
           </div>
-          <div v-if="detailData.remark" style="margin-top: 20px;">
+          <div v-if="detailData.remark" style="margin-top: 20px">
             <h4>澶囨敞</h4>
             <p>{{ detailData.remark }}</p>
           </div>
         </div>
       </template>
     </div>
-    <div v-if="attachmentList.length"
-         class="detail-block">
+    <div v-if="attachmentList.length" class="detail-block">
       <div class="detail-block-title">闄勪欢鍒楄〃</div>
       <div class="attachment-list">
-        <div v-for="file in attachmentList"
-             :key="file.id"
-             class="attachment-item">
+        <div
+          v-for="file in attachmentList"
+          :key="file.id"
+          class="attachment-item"
+        >
           <el-icon class="file-icon">
             <Paperclip />
           </el-icon>
-          <span class="file-name"
-                :title="file.name || file.originalFilename">
+          <span class="file-name" :title="file.name || file.originalFilename">
             {{ file.name || file.originalFilename }}
           </span>
           <div class="file-actions">
-            <el-link v-if="file.previewURL || file.url"
-                     type="primary"
-                     :underline="false"
-                     @click="openFile(file.previewURL || file.url)">棰勮</el-link>
-            <el-divider v-if="(file.previewURL || file.url) && file.downloadURL"
-                        direction="vertical" />
-            <el-link v-if="file.downloadURL"
-                     type="primary"
-                     :underline="false"
-                     @click="openFile(file.downloadURL)">涓嬭浇</el-link>
+            <el-link
+              v-if="file.previewURL || file.url"
+              type="primary"
+              :underline="false"
+              @click="openFile(file.previewURL || file.url)"
+              >棰勮</el-link
+            >
+            <el-divider
+              v-if="(file.previewURL || file.url) && file.downloadURL"
+              direction="vertical"
+            />
+            <el-link
+              v-if="file.downloadURL"
+              type="primary"
+              :underline="false"
+              @click="openFile(file.downloadURL)"
+              >涓嬭浇</el-link
+            >
           </div>
         </div>
       </div>
@@ -179,108 +276,107 @@
 </template>
 
 <script setup>
-  import { computed } from "vue";
-  import { Paperclip } from "@element-plus/icons-vue";
-  import { formatDisplayTime } from "../../approve-template/approveTemplateConstants.js";
-  import {
-    approvalTypeLabel,
-    approvalTypeStyle,
-    approvalStatusLabel,
-    approvalStatusTagType,
-    resolveInstanceFormFields,
-  } from "../approveListConstants.js";
-  import FormPayloadFields from "./FormPayloadFields.vue";
+import { computed } from "vue";
+import { Paperclip } from "@element-plus/icons-vue";
+import { formatDisplayTime } from "../../approve-template/approveTemplateConstants.js";
+import {
+  approvalTypeLabel,
+  approvalTypeStyle,
+  approvalStatusLabel,
+  approvalStatusTagType,
+  resolveInstanceFormFields,
+} from "../approveListConstants.js";
+import FormPayloadFields from "./FormPayloadFields.vue";
 
-  const props = defineProps({
-    row: { type: Object, default: () => ({}) },
-    detailData: { type: Object, default: () => ({}) },
-  });
+const props = defineProps({
+  row: { type: Object, default: () => ({}) },
+  detailData: { type: Object, default: () => ({}) },
+});
 
-  const formResolved = computed(() => resolveInstanceFormFields(props.row));
+const formResolved = computed(() => resolveInstanceFormFields(props.row));
 
+// 鏄惁涓虹壒娈婂鎵圭被鍨嬶紙閲囪喘銆佸彂璐с�佹姤浠凤級
+const isSpecialApprovalType = computed(() => {
+  return [5, 7, 6].includes(props.row.businessType);
+});
 
-  // 鏄惁涓虹壒娈婂鎵圭被鍨嬶紙閲囪喘銆佸彂璐с�佹姤浠凤級
-  const isSpecialApprovalType = computed(() => {
-    return [5, 7, 6].includes(props.row.businessType);
-  });
+// 璇︽儏鏁版嵁锛堢洿鎺ヤ娇鐢ㄤ紶鍏ョ殑 detail-data 鍙傛暟锛�
+const detailData = computed(() => {
+  return props.detailData || {};
+});
 
-  // 璇︽儏鏁版嵁锛堢洿鎺ヤ娇鐢ㄤ紶鍏ョ殑 detail-data 鍙傛暟锛�
-  const detailData = computed(() => {
-    return props.detailData || {};
-  });
+const attachmentList = computed(() => {
+  const list = props.row.storageBlobVOList || props.row.storageBlobDTOs || [];
+  return Array.isArray(list) ? list : [];
+});
 
-  const attachmentList = computed(() => {
-    const list = props.row.storageBlobVOList || props.row.storageBlobDTOs || [];
-    return Array.isArray(list) ? list : [];
-  });
-
-  function openFile(url) {
-    if (!url) return;
-    window.open(url, "_blank");
-  }
+function openFile(url) {
+  if (!url) return;
+  window.open(url, "_blank");
+}
 </script>
 
 <style scoped>
-  .approve-detail-panel {
-    display: flex;
-    flex-direction: column;
-    gap: 20px;
-  }
-  .detail-block-title {
-    font-size: 14px;
-    font-weight: 600;
-    color: var(--el-text-color-primary);
-    margin: 0 0 12px;
-    padding-left: 10px;
-    border-left: 3px solid var(--el-color-primary);
-    line-height: 1.4;
-  }
-  .approve-type-cell {
-    display: inline-block;
-    padding: 2px 10px;
-    border-radius: 4px;
-    font-size: 13px;
-    line-height: 1.5;
-  }
-  .reject-text {
-    color: var(--el-color-danger);
-  }
+.approve-detail-panel {
+  display: flex;
+  flex-direction: column;
+  gap: 20px;
+}
+.detail-block-title {
+  font-size: 14px;
+  font-weight: 600;
+  color: var(--el-text-color-primary);
+  margin: 0 0 12px;
+  padding-left: 10px;
+  border-left: 3px solid var(--el-color-primary);
+  line-height: 1.4;
+}
+.approve-type-cell {
+  display: inline-block;
+  padding: 2px 10px;
+  border-radius: 4px;
+  font-size: 13px;
+  line-height: 1.5;
+}
+.reject-text {
+  color: var(--el-color-danger);
+}
 
-  .attachment-list {
-    display: grid;
-    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
-    gap: 12px;
-  }
-  .attachment-item {
-    display: flex;
-    align-items: center;
-    padding: 10px 12px;
-    background-color: var(--el-fill-color-light);
-    border-radius: 6px;
-    border: 1px solid var(--el-border-color-lighter);
-    transition: all 0.3s;
-  }
-  .attachment-item:hover {
-    border-color: var(--el-color-primary-light-5);
-    background-color: var(--el-color-primary-light-9);
-  }
-  .file-icon {
-    font-size: 18px;
-    color: var(--el-text-color-secondary);
-    margin-right: 10px;
-  }
-  .file-name {
-    flex: 1;
-    font-size: 13px;
-    color: var(--el-text-color-primary);
-    white-space: nowrap;
-    overflow: hidden;
-    text-overflow: ellipsis;
-    margin-right: 12px;
-  }
-  .file-actions {
-    display: flex;
-    align-items: center;
-    flex-shrink: 0;
-  }
-</style>
\ No newline at end of file
+.attachment-list {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+  gap: 12px;
+}
+.attachment-item {
+  display: flex;
+  align-items: center;
+  padding: 10px 12px;
+  background-color: var(--el-fill-color-light);
+  border-radius: 6px;
+  border: 1px solid var(--el-border-color-lighter);
+  transition: all 0.3s;
+}
+.attachment-item:hover {
+  border-color: var(--el-color-primary-light-5);
+  background-color: var(--el-color-primary-light-9);
+}
+.file-icon {
+  font-size: 18px;
+  color: var(--el-text-color-secondary);
+  margin-right: 10px;
+}
+.file-name {
+  flex: 1;
+  font-size: 13px;
+  color: var(--el-text-color-primary);
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  margin-right: 12px;
+}
+.file-actions {
+  display: flex;
+  align-items: center;
+  flex-shrink: 0;
+}
+</style>
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
index 2dd2474..ae568b3 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/useApproveList.js
@@ -665,8 +665,13 @@
     if (approveSubmitting.value) return { ok: false };
     approveSubmitting.value = true;
     try {
+      // 鍙戣揣瀹℃壒鏃朵紶閫掑嚭搴撴壒鍙�
+      const extraData = {};
+      if (Number(row.businessType) === 7 && detailData.value?.shippingInfo?.outboundBatches) {
+        extraData.outboundBatches = detailData.value.shippingInfo.outboundBatches;
+      }
       await approveApprovalInstance(
-        buildApproveInstanceDto(row, result, approveOpinion.value, approveDialog.warehouse)
+        buildApproveInstanceDto(row, result, approveOpinion.value, approveDialog.warehouse, extraData)
       );
       approveDialog.visible = false;
       await fetchApprovalList();
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 458ab96..9fcb6b1 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -190,7 +190,7 @@
 import {userListNoPage} from "@/api/system/user.js";
 import {qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId} from "@/api/qualityManagement/metricMaintenance.js";
 import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ledgerListNoPage} from "@/api/salesManagement/salesLedger.js";
+import {ledgerListNoPage, productList} from "@/api/salesManagement/salesLedger.js";
 const { proxy } = getCurrentInstance()
 const emit = defineEmits(['close'])
 
@@ -216,18 +216,18 @@
     salesContractNo: "",
   },
   rules: {
-    checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+    process: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     testStandardId: [{ required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
     unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-    quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+    quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+    qualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+    unqualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-    checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+    checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "change" }],
   },
 });
 const { form, rules } = toRefs(data);
@@ -296,6 +296,30 @@
   form.value = {}
   testStandardOptions.value = [];
   tableData.value = [];
+
+  // 鏂板妯″紡涓嬶紝榛樿璁剧疆浜у搧鍚嶇О涓�"椹搩钖洩鑺辩矇"(id=320)
+  if (operationType.value === 'add') {
+    const defaultProductId = 320;
+    form.value.productId = defaultProductId;
+    currentProductId.value = defaultProductId;
+    form.value.productName = '椹搩钖洩鑺辩矇';
+    // 鍔犺浇瑙勬牸鍨嬪彿鍒楄〃
+    try {
+      const modelRes = await modelList({ id: defaultProductId });
+      modelOptions.value = modelRes || [];
+      // 榛樿閫変腑绗竴涓鏍煎瀷鍙�
+      if (modelOptions.value.length > 0) {
+        const firstModel = modelOptions.value[0];
+        form.value.productModelId = firstModel.id;
+        form.value.model = firstModel.model || '';
+        form.value.unit = firstModel.unit || '';
+      }
+      // 鍔犺浇鎸囨爣閫夐」
+      getList();
+    } catch (e) {
+      console.error('鍔犺浇榛樿浜у搧瑙勬牸鍨嬪彿澶辫触', e);
+    }
+  }
 
   if (operationType.value === 'edit' || operationType.value === 'view') {
     // 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
@@ -387,12 +411,25 @@
 }
 
 // 閿�鍞鍗曢�夋嫨鍙樺寲澶勭悊
-const handleSalesLedgerChange = (value) => {
+const handleSalesLedgerChange = async (value) => {
   const selectedItem = salesLedgerOptions.value.find(item => item.id == value);
   if (selectedItem) {
     form.value.salesContractNo = selectedItem.salesContractNo || '';
+    // 鏍规嵁閿�鍞鍗旾D鏌ヨ浜у搧淇℃伅锛屽彧璧嬪�兼暟閲�
+    try {
+      const res = await productList({ salesLedgerId: value, type: 1 });
+      const productData = res.data && res.data.length > 0 ? res.data[0] : null;
+      if (productData) {
+        // 鍙嚜鍔ㄥ甫鍏ユ暟閲�
+        form.value.quantity = productData.quantity || 0;
+      }
+    } catch (e) {
+      console.error('鏌ヨ閿�鍞鍗曚骇鍝佷俊鎭け璐�', e);
+      proxy.$modal.msgError('鏌ヨ閿�鍞鍗曚骇鍝佷俊鎭け璐�');
+    }
   } else {
     form.value.salesContractNo = '';
+    form.value.quantity = undefined;
   }
 }
 
diff --git a/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue b/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..cf78973
--- /dev/null
+++ b/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+  <div>
+    <el-dialog
+      v-model="dialogVisible"
+      title="蹇�熸楠�"
+      width="70%"
+      @close="closeDialog"
+    >
+      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
+              <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+                <el-option label="鍚堟牸" value="鍚堟牸" />
+                <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+                <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+              <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+                <el-option
+                  v-for="item in testStandardOptions"
+                  :key="item.id"
+                  :label="item.standardName || item.standardNo"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <template v-if="form.checkResult">
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鏁伴噺锛�" prop="quantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏ユ暟閲�" clearable :precision="2" @change="handleQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+                <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="妫�楠屽憳锛�" prop="checkName">
+                <el-select v-model="form.checkName" placeholder="璇烽�夋嫨妫�楠屽憳" clearable style="width: 100%">
+                  <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+                <el-date-picker
+                  v-model="form.checkTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </template>
+      </el-form>
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :tableLoading="tableLoading"
+        height="400"
+      >
+        <template #slot="{ row }">
+          <el-input v-model="row.testValue" clearable/>
+        </template>
+      </PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDialog">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(2); // 鍑哄巶妫�楠岀被鍨�
+
+const data = reactive({
+  form: {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  },
+  rules: {
+    checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+    testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+    quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+    qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+    unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+    checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+    checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+    checkTime: [{ required: true, message: "璇烽�夋嫨妫�娴嬫棩鏈�", trigger: "change" }],
+  },
+});
+const { form, rules } = toRefs(data);
+
+const tableColumn = ref([
+  {
+    label: "鎸囨爣",
+    prop: "parameterItem",
+  },
+  {
+    label: "鍗曚綅",
+    prop: "unit",
+  },
+  {
+    label: "鏍囧噯鍊�",
+    prop: "standardValue",
+  },
+  {
+    label: "鍐呮帶鍊�",
+    prop: "controlValue",
+  },
+  {
+    label: "妫�楠屽��",
+    prop: "testValue",
+    dataType: 'slot',
+    slot: 'slot',
+  },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = async (ids, rows) => {
+  selectedIds.value = ids;
+  selectedRows.value = rows;
+  dialogVisible.value = true;
+  
+  // 鍔犺浇鐢ㄦ埛鍒楄〃
+  const userListsRes = await userListNoPage();
+  userList.value = userListsRes.data;
+  
+  // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+  if (rows && rows.length > 0 && rows[0].productId) {
+    const params = {
+      productId: rows[0].productId,
+      inspectType: 2
+    };
+    const res = await qualityInspectDetailByProductId(params);
+    testStandardOptions.value = res.data || [];
+  } else {
+    testStandardOptions.value = [];
+  }
+  
+  // 閲嶇疆琛ㄥ崟
+  form.value = {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  };
+  tableData.value = [];
+  
+  await nextTick();
+  proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+  if (!testStandardId) {
+    tableData.value = [];
+    return;
+  }
+  tableLoading.value = true;
+  try {
+    const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+    tableData.value = (res.data || []).map(item => ({
+      ...item,
+      id: null,
+      testValue: ''
+    }));
+  } catch (error) {
+    console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+    tableData.value = [];
+  } finally {
+    tableLoading.value = false;
+  }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+  if (value === '鍚堟牸') {
+    // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+    form.value.qualifiedQuantity = form.value.quantity || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (value === '涓嶅悎鏍�') {
+    // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = form.value.quantity || 0;
+  }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+  if (form.value.checkResult === '鍚堟牸') {
+    form.value.qualifiedQuantity = value || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (form.value.checkResult === '涓嶅悎鏍�') {
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = value || 0;
+  }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+    form.value.qualifiedQuantity = quantity;
+    form.value.unqualifiedQuantity = 0;
+  } else {
+    form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+    form.value.unqualifiedQuantity = quantity;
+    form.value.qualifiedQuantity = 0;
+  } else {
+    form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+  const qualified = form.value.qualifiedQuantity || 0;
+  const unqualified = form.value.unqualifiedQuantity || 0;
+  const quantity = form.value.quantity || 0;
+  
+  if (qualified === quantity && unqualified === 0) {
+    form.value.checkResult = '鍚堟牸';
+  } else if (unqualified === quantity && qualified === 0) {
+    form.value.checkResult = '涓嶅悎鏍�';
+  } else if (qualified > 0 && unqualified > 0) {
+    form.value.checkResult = '閮ㄥ垎鍚堟牸';
+  }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs.formRef.validate((valid) => {
+    if (valid) {
+      const data = {
+        ids: selectedIds.value,
+        inspectType: inspectType.value,
+        ...form.value,
+        paramList: tableData.value
+      };
+      batchQuickInspect(data).then(res => {
+        proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+        emit('success');
+        closeDialog();
+      });
+    }
+  });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+  dialogVisible.value = false;
+  emit('close');
+};
+
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
index 81d5595..88ba755 100644
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ b/src/views/qualityManagement/finalInspection/index.vue
@@ -69,6 +69,9 @@
              @close="handleQuery"></FormDia>
     <files-dia ref="filesDia"
                @close="handleQuery"></files-dia>
+    <QuickCheckDia ref="quickCheckDia"
+                   @close="handleQuery"
+                   @success="getList"></QuickCheckDia>
     <el-dialog v-model="dialogFormVisible"
                title="缂栬緫妫�楠屽憳"
                width="30%"
@@ -115,6 +118,7 @@
   } from "vue";
   import InspectionFormDia from "@/views/qualityManagement/finalInspection/components/inspectionFormDia.vue";
   import FormDia from "@/views/qualityManagement/finalInspection/components/formDia.vue";
+  import QuickCheckDia from "@/views/qualityManagement/finalInspection/components/quickCheckDia.vue";
   import { ElMessageBox } from "element-plus";
   import {
     downloadQualityInspect,
@@ -122,7 +126,6 @@
     qualityInspectListPage,
     qualityInspectUpdate,
     submitQualityInspect,
-    batchQuickInspect,
   } from "@/api/qualityManagement/rawMaterialInspection.js";
   import FilesDia from "@/views/qualityManagement/finalInspection/components/filesDia.vue";
   import dayjs from "dayjs";
@@ -322,6 +325,7 @@
   const formDia = ref();
   const filesDia = ref();
   const inspectionFormDia = ref();
+  const quickCheckDia = ref();
   const { proxy } = getCurrentInstance();
   const userStore = useUserStore();
   const userList = ref([]);
@@ -402,32 +406,8 @@
       return;
     }
 
-    const totalCount = selectedRows.value.length;
-    const submittedCount = totalCount - unSubmittedRows.length;
-
-    let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
-    if (submittedCount > 0) {
-      confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
-    }
-    confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
-    ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-      dangerouslyUseHTMLString: false,
-    })
-      .then(() => {
-        // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
-        const ids = unSubmittedRows.map(item => item.id);
-        batchQuickInspect(ids).then(res => {
-          proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
-          getList();
-        });
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
+    const ids = unSubmittedRows.map(item => item.id);
+    quickCheckDia.value?.openDialog(ids, unSubmittedRows);
   };
 
   // 鎵撳紑鏂板妫�楠屽脊妗�
diff --git a/src/views/qualityManagement/metricBinding/index.vue b/src/views/qualityManagement/metricBinding/index.vue
index 1ac268a..5d115d6 100644
--- a/src/views/qualityManagement/metricBinding/index.vue
+++ b/src/views/qualityManagement/metricBinding/index.vue
@@ -141,8 +141,8 @@
       </el-form>
       <template #footer>
         <span class="dialog-footer">
-          <el-button @click="closeBindingDialog">鍙栨秷</el-button>
           <el-button type="primary" @click="submitBinding">纭畾</el-button>
+          <el-button @click="closeBindingDialog">鍙栨秷</el-button>
         </span>
       </template>
     </el-dialog>
@@ -215,18 +215,6 @@
     formatData: (val) => {
       const map = { 0: '鍘熸潗鏂欐楠�', 1: '杩囩▼妫�楠�', 2: '鍑哄巶妫�楠�' }
       return map[val] || val
-    }
-  },
-  {
-    label: '宸ュ簭',
-    prop: 'processId',
-    align: 'center',
-    dataType: 'tag',
-    formatData: (val) => {
-      const target = processOptions.value.find(
-        (item) => String(item.value) === String(val)
-      )
-      return target?.label || val
     }
   },
   {
diff --git a/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue b/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
index 38d535a..381dac4 100644
--- a/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
+++ b/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
@@ -27,16 +27,6 @@
           <el-option label="鍑哄巶妫�楠�" value="2" />
         </el-select>
       </el-form-item>
-      <el-form-item label="宸ュ簭" prop="processId">
-        <el-select v-model="form.processId" placeholder="璇烽�夋嫨宸ュ簭" style="width: 100%">
-          <el-option
-            v-for="item in processOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          />
-        </el-select>
-      </el-form-item>
       <el-form-item label="鐘舵��" prop="state">
         <el-select v-model="form.state" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
           <el-option label="鑽夌" value="0" />
@@ -96,7 +86,7 @@
 
 const formRef = ref(null)
 
-const computedTitle = computed(() => {
+  const computedTitle = computed(() => {
   if (props.operationType === 'edit') return '缂栬緫妫�娴嬫爣鍑�'
   if (props.operationType === 'copy') return '澶嶅埗妫�娴嬫爣鍑�'
   return '鏂板妫�娴嬫爣鍑�'
diff --git a/src/views/qualityManagement/metricMaintenance/index.vue b/src/views/qualityManagement/metricMaintenance/index.vue
index deb3e5f..8d1dd1c 100644
--- a/src/views/qualityManagement/metricMaintenance/index.vue
+++ b/src/views/qualityManagement/metricMaintenance/index.vue
@@ -310,18 +310,6 @@
     }
   },
   {
-    label: '宸ュ簭',
-    prop: 'processId',
-    align: 'center',
-    dataType: 'tag',
-    formatData: (val) => {
-      const target = processOptions.value.find(
-        (item) => String(item.value) === String(val)
-      )
-      return target?.label || val
-    }
-  },
-  {
     label: '鐘舵��',
     prop: 'state',
     headerSlot: 'stateHeader',
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
index 635360f..3dac79e 100644
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ b/src/views/qualityManagement/processInspection/components/formDia.vue
@@ -11,17 +11,18 @@
                ref="formRef">
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="宸ュ簭锛�"
-                          prop="process">
-              <el-select v-model="form.process"
-                         placeholder="璇烽�夋嫨宸ュ簭"
+            <el-form-item label="閲囪喘鍚堝悓鍙凤細"
+                          prop="purchaseContractNo">
+              <el-select v-model="form.purchaseContractNo"
+                         placeholder="璇烽�夋嫨"
                          clearable
-                         :disabled="isViewMode || processQuantityDisabled"
+                         filterable
+                         :disabled="isViewMode"
                          style="width: 100%">
-                <el-option v-for="item in processList"
-                           :key="item.name"
-                           :label="item.name"
-                           :value="item.name" />
+                <el-option v-for="item in purchaseContractList"
+                           :key="item.id"
+                           :label="item.purchaseContractNumber + ' - ' + item.supplierName"
+                           :value="item.purchaseContractNumber" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -216,7 +217,7 @@
     getCurrentInstance,
     nextTick,
   } from "vue";
-  import { getOptions } from "@/api/procurementManagement/procurementLedger.js";
+  import { getOptions, purchaseListPage } from "@/api/procurementManagement/procurementLedger.js";
   import { modelList, productTreeList } from "@/api/basicData/product.js";
   import {
     qualityInspectAdd,
@@ -228,7 +229,7 @@
   } from "@/api/qualityManagement/metricMaintenance.js";
   import { userListNoPage } from "@/api/system/user.js";
   import { qualityInspectParamInfo } from "@/api/qualityManagement/qualityInspectParam.js";
-  import { list } from "@/api/productionManagement/productionProcess";
+
   import qualified from "@/views/inventoryManagement/stockManagement/Qualified.vue";
   const { proxy } = getCurrentInstance();
   const emit = defineEmits(["close"]);
@@ -238,7 +239,6 @@
   const data = reactive({
     form: {
       checkTime: "",
-      process: "",
       checkName: "",
       productName: "",
       productId: "",
@@ -251,20 +251,21 @@
       unqualifiedQuantity: "",
       checkCompany: "",
       checkResult: "",
+      purchaseContractNo: "",
     },
     rules: {
-      checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-      process: [{ required: true, message: "璇烽�夋嫨宸ュ簭", trigger: "change" }],
+      checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
       checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
       productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
       productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
       testStandardId: [{ required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
       unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-      quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-      qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-      unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+      qualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+      unqualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
       checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
-      checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+      purchaseContractNo: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
+      checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "change" }],
     },
   });
   const userList = ref([]);
@@ -276,9 +277,10 @@
     const v = form.value || {};
     return !!(v.productMainId != null || v.purchaseLedgerId != null);
   });
-  const processList = ref([]); // 宸ュ簭涓嬫媺鍒楄〃锛堝伐搴忓悕绉� name锛�
+
   const supplierList = ref([]);
   const productOptions = ref([]);
+  const purchaseContractList = ref([]); // 閲囪喘鍚堝悓鍙峰垪琛�
   const tableColumn = ref([
     {
       label: "鎸囨爣",
@@ -315,20 +317,19 @@
     getOptions().then(res => {
       supplierList.value = res.data;
     });
-    // 鍔犺浇宸ュ簭涓嬫媺鍒楄〃
-    try {
-      const res = await list({ size: -1, current: -1 });
-      processList.value = res.data.records || [];
-    } catch (e) {
-      console.error("鍔犺浇宸ュ簭鍒楄〃澶辫触", e);
-      processList.value = [];
-    }
     let userLists = await userListNoPage();
     userList.value = userLists.data;
-    // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡鈥滈棯涓�涓嬧�濓級
+    // 鍔犺浇閲囪喘鍚堝悓鍙峰垪琛�
+    try {
+      const contractRes = await purchaseListPage({ pageNum: -1, pageSize: -1 });
+      purchaseContractList.value = contractRes.data?.records || [];
+    } catch (e) {
+      console.error("鍔犺浇閲囪喘鍚堝悓鍙峰け璐�", e);
+      purchaseContractList.value = [];
+    }
+    // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡"闂竴涓�"锛�
     form.value = {
       checkTime: "",
-      process: "",
       checkName: "",
       productName: "",
       productId: "",
@@ -339,6 +340,7 @@
       quantity: "",
       checkCompany: "",
       checkResult: "",
+      purchaseContractNo: "",
     };
     testStandardOptions.value = [];
     tableData.value = [];
@@ -370,7 +372,6 @@
         let params = {
           productId: currentProductId.value,
           inspectType: 1,
-          process: form.value.process || "",
         };
         qualityInspectDetailByProductId(params).then(res => {
           testStandardOptions.value = res.data || [];
@@ -518,9 +519,16 @@
           return;
         }
 
+        // 鏍规嵁閲囪喘鍚堝悓鍙锋煡鎵惧搴旂殑 purchaseLedgerId
+        const selectedContract = purchaseContractList.value.find(
+          item => item.purchaseContractNumber === form.value.purchaseContractNo
+        );
+        const purchaseLedgerId = selectedContract ? selectedContract.id : null;
+
         const data = {
           ...form.value,
           process: processName, // 淇濈暀 process 瀛楁浠ュ吋瀹瑰悗绔�
+          purchaseLedgerId: purchaseLedgerId, // 鎻愪氦 purchaseLedgerId
           qualityInspectParams: tableData.value,
         };
         if (operationType.value === "add") {
diff --git a/src/views/qualityManagement/processInspection/components/quickCheckDia.vue b/src/views/qualityManagement/processInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..0aa069b
--- /dev/null
+++ b/src/views/qualityManagement/processInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+  <div>
+    <el-dialog
+      v-model="dialogVisible"
+      title="蹇�熸楠�"
+      width="70%"
+      @close="closeDialog"
+    >
+      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
+              <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+                <el-option label="鍚堟牸" value="鍚堟牸" />
+                <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+                <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+              <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+                <el-option
+                  v-for="item in testStandardOptions"
+                  :key="item.id"
+                  :label="item.standardName || item.standardNo"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <template v-if="form.checkResult">
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鏁伴噺锛�" prop="quantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏ユ暟閲�" clearable :precision="2" @change="handleQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+                <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="妫�楠屽憳锛�" prop="checkName">
+                <el-select v-model="form.checkName" placeholder="璇烽�夋嫨妫�楠屽憳" clearable style="width: 100%">
+                  <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+                <el-date-picker
+                  v-model="form.checkTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </template>
+      </el-form>
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :tableLoading="tableLoading"
+        height="400"
+      >
+        <template #slot="{ row }">
+          <el-input v-model="row.testValue" clearable/>
+        </template>
+      </PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDialog">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(1); // 杩囩▼妫�楠岀被鍨�
+
+const data = reactive({
+  form: {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  },
+  rules: {
+    checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+    testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+    quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+    qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+    unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+    checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+    checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+    checkTime: [{ required: true, message: "璇烽�夋嫨妫�娴嬫棩鏈�", trigger: "change" }],
+  },
+});
+const { form, rules } = toRefs(data);
+
+const tableColumn = ref([
+  {
+    label: "鎸囨爣",
+    prop: "parameterItem",
+  },
+  {
+    label: "鍗曚綅",
+    prop: "unit",
+  },
+  {
+    label: "鏍囧噯鍊�",
+    prop: "standardValue",
+  },
+  {
+    label: "鍐呮帶鍊�",
+    prop: "controlValue",
+  },
+  {
+    label: "妫�楠屽��",
+    prop: "testValue",
+    dataType: 'slot',
+    slot: 'slot',
+  },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = async (ids, rows) => {
+  selectedIds.value = ids;
+  selectedRows.value = rows;
+  dialogVisible.value = true;
+  
+  // 鍔犺浇鐢ㄦ埛鍒楄〃
+  const userListsRes = await userListNoPage();
+  userList.value = userListsRes.data;
+  
+  // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+  if (rows && rows.length > 0 && rows[0].productId) {
+    const params = {
+      productId: rows[0].productId,
+      inspectType: 1
+    };
+    const res = await qualityInspectDetailByProductId(params);
+    testStandardOptions.value = res.data || [];
+  } else {
+    testStandardOptions.value = [];
+  }
+  
+  // 閲嶇疆琛ㄥ崟
+  form.value = {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  };
+  tableData.value = [];
+  
+  await nextTick();
+  proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+  if (!testStandardId) {
+    tableData.value = [];
+    return;
+  }
+  tableLoading.value = true;
+  try {
+    const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+    tableData.value = (res.data || []).map(item => ({
+      ...item,
+      id: null,
+      testValue: ''
+    }));
+  } catch (error) {
+    console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+    tableData.value = [];
+  } finally {
+    tableLoading.value = false;
+  }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+  if (value === '鍚堟牸') {
+    // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+    form.value.qualifiedQuantity = form.value.quantity || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (value === '涓嶅悎鏍�') {
+    // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = form.value.quantity || 0;
+  }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+  if (form.value.checkResult === '鍚堟牸') {
+    form.value.qualifiedQuantity = value || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (form.value.checkResult === '涓嶅悎鏍�') {
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = value || 0;
+  }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+    form.value.qualifiedQuantity = quantity;
+    form.value.unqualifiedQuantity = 0;
+  } else {
+    form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+    form.value.unqualifiedQuantity = quantity;
+    form.value.qualifiedQuantity = 0;
+  } else {
+    form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+  const qualified = form.value.qualifiedQuantity || 0;
+  const unqualified = form.value.unqualifiedQuantity || 0;
+  const quantity = form.value.quantity || 0;
+  
+  if (qualified === quantity && unqualified === 0) {
+    form.value.checkResult = '鍚堟牸';
+  } else if (unqualified === quantity && qualified === 0) {
+    form.value.checkResult = '涓嶅悎鏍�';
+  } else if (qualified > 0 && unqualified > 0) {
+    form.value.checkResult = '閮ㄥ垎鍚堟牸';
+  }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs.formRef.validate((valid) => {
+    if (valid) {
+      const data = {
+        ids: selectedIds.value,
+        inspectType: inspectType.value,
+        ...form.value,
+        paramList: tableData.value
+      };
+      batchQuickInspect(data).then(res => {
+        proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+        emit('success');
+        closeDialog();
+      });
+    }
+  });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+  dialogVisible.value = false;
+  emit('close');
+};
+
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index 85e3811..9fe630a 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -2,13 +2,6 @@
   <div class="app-container">
     <div class="search_form mb20">
       <div>
-        <span class="search_title">宸ュ簭锛�</span>
-        <el-input v-model="searchForm.process"
-                  style="width: 240px"
-                  placeholder="璇疯緭鍏ュ伐搴忔悳绱�"
-                  @change="handleQuery"
-                  clearable
-                  :prefix-icon="Search" />
         <span style="margin-left: 10px"
               class="search_title">妫�娴嬫棩鏈燂細</span>
         <el-date-picker v-model="searchForm.entryDate"
@@ -18,14 +11,6 @@
                         placeholder="璇烽�夋嫨"
                         clearable
                         @change="changeDaterange" />
-        <span style="margin-left: 10px"
-              class="search_title">鐢熶骇宸ュ崟鍙凤細</span>
-        <el-input v-model="searchForm.workOrderNo"
-                  style="width: 240px"
-                  placeholder="璇疯緭鍏ョ敓浜у伐鍗曞彿鎼滅储"
-                  @change="handleQuery"
-                  clearable
-                  :prefix-icon="Search" />
         <el-button type="primary"
                    @click="handleQuery"
                    style="margin-left: 10px">鎼滅储</el-button>
@@ -54,6 +39,9 @@
              @close="handleQuery"></FormDia>
     <files-dia ref="filesDia"
                @close="handleQuery"></files-dia>
+    <QuickCheckDia ref="quickCheckDia"
+                   @close="handleQuery"
+                   @success="getList"></QuickCheckDia>
     <el-dialog v-model="dialogFormVisible"
                title="缂栬緫妫�楠屽憳"
                width="30%"
@@ -100,6 +88,7 @@
   } from "vue";
   import InspectionFormDia from "@/views/qualityManagement/processInspection/components/inspectionFormDia.vue";
   import FormDia from "@/views/qualityManagement/processInspection/components/formDia.vue";
+  import QuickCheckDia from "@/views/qualityManagement/processInspection/components/quickCheckDia.vue";
   import { ElMessageBox } from "element-plus";
   import {
     downloadQualityInspect,
@@ -107,7 +96,6 @@
     qualityInspectListPage,
     qualityInspectUpdate,
     submitQualityInspect,
-    batchQuickInspect,
   } from "@/api/qualityManagement/rawMaterialInspection.js";
   import FilesDia from "@/views/qualityManagement/processInspection/components/filesDia.vue";
   import dayjs from "dayjs";
@@ -116,7 +104,6 @@
 
   const data = reactive({
     searchForm: {
-      process: "",
       entryDate: undefined, // 褰曞叆鏃ユ湡
       workOrderNo: "",
       entryDateStart: undefined,
@@ -135,13 +122,13 @@
       width: 120,
     },
     {
-      label: "宸ュ簭",
-      prop: "process",
-      width: 230,
-    },
-    {
       label: "妫�楠屽憳",
       prop: "checkName",
+    },
+    {
+      label: "閲囪喘鍚堝悓鍙�",
+      prop: "purchaseContractNo",
+			width: 150,
     },
     {
       label: "浜у搧鍚嶇О",
@@ -311,6 +298,7 @@
   const formDia = ref();
   const filesDia = ref();
   const inspectionFormDia = ref();
+  const quickCheckDia = ref();
   const { proxy } = getCurrentInstance();
   const userStore = useUserStore();
   const changeDaterange = value => {
@@ -385,32 +373,8 @@
       return;
     }
 
-    const totalCount = selectedRows.value.length;
-    const submittedCount = totalCount - unSubmittedRows.length;
-
-    let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
-    if (submittedCount > 0) {
-      confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
-    }
-    confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
-    ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-      dangerouslyUseHTMLString: false,
-    })
-      .then(() => {
-        // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
-        const ids = unSubmittedRows.map(item => item.id);
-        batchQuickInspect(ids).then(res => {
-          proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
-          getList();
-        });
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
+    const ids = unSubmittedRows.map(item => item.id);
+    quickCheckDia.value?.openDialog(ids, unSubmittedRows);
   };
 
   // 鎵撳紑鏂板妫�楠屽脊妗�
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 8bcc72b..8c91275 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -197,18 +197,18 @@
     checkResult: "",
   },
   rules: {
-    checkTime: [{required: true, message: "璇疯緭鍏�", trigger: "blur"},],
+    checkTime: [{required: false, message: "璇疯緭鍏�", trigger: "blur"},],
     supplier: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
     checkName: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
     productId: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
     productModelId: [{required: true, message: "璇烽�夋嫨浜у搧鍨嬪彿", trigger: "change"}],
     testStandardId: [{required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change"}],
     unit: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
-    quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
-    qualifiedQuantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
-    unqualifiedQuantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
+    quantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
+    qualifiedQuantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
+    unqualifiedQuantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
     checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
-    checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
+    checkResult: [{required: false, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
   },
 });
 const tableColumn = ref([
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..b8229ef
--- /dev/null
+++ b/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+  <div>
+    <el-dialog
+      v-model="dialogVisible"
+      title="蹇�熸楠�"
+      width="70%"
+      @close="closeDialog"
+    >
+      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
+              <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+                <el-option label="鍚堟牸" value="鍚堟牸" />
+                <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+                <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+              <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+                <el-option
+                  v-for="item in testStandardOptions"
+                  :key="item.id"
+                  :label="item.standardName || item.standardNo"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <template v-if="form.checkResult">
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鏁伴噺锛�" prop="quantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏ユ暟閲�" clearable :precision="2" @change="handleQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+                <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+                <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="30">
+            <el-col :span="12">
+              <el-form-item label="妫�楠屽憳锛�" prop="checkName">
+                <el-select v-model="form.checkName" placeholder="璇烽�夋嫨妫�楠屽憳" clearable style="width: 100%">
+                  <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+                <el-date-picker
+                  v-model="form.checkTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+                  value-format="YYYY-MM-DD"
+                  format="YYYY-MM-DD"
+                  clearable
+                  style="width: 100%"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </template>
+      </el-form>
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :tableLoading="tableLoading"
+        height="400"
+      >
+        <template #slot="{ row }">
+          <el-input v-model="row.testValue" clearable/>
+        </template>
+      </PIMTable>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDialog">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(0); // 鍘熸潗鏂欐楠岀被鍨�
+
+const data = reactive({
+  form: {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  },
+  rules: {
+    checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+    testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+    quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+    qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+    unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+    checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+    checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+    checkTime: [{ required: true, message: "璇烽�夋嫨妫�娴嬫棩鏈�", trigger: "change" }],
+  },
+});
+const { form, rules } = toRefs(data);
+
+const tableColumn = ref([
+  {
+    label: "鎸囨爣",
+    prop: "parameterItem",
+  },
+  {
+    label: "鍗曚綅",
+    prop: "unit",
+  },
+  {
+    label: "鏍囧噯鍊�",
+    prop: "standardValue",
+  },
+  {
+    label: "鍐呮帶鍊�",
+    prop: "controlValue",
+  },
+  {
+    label: "妫�楠屽��",
+    prop: "testValue",
+    dataType: 'slot',
+    slot: 'slot',
+  },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+
+// 鎵撳紑寮规
+const openDialog = async (ids, rows) => {
+  selectedIds.value = ids;
+  selectedRows.value = rows;
+  dialogVisible.value = true;
+  
+  // 鍔犺浇鐢ㄦ埛鍒楄〃
+  const userListsRes = await userListNoPage();
+  userList.value = userListsRes.data;
+  
+  // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+  if (rows && rows.length > 0 && rows[0].productId) {
+    const params = {
+      productId: rows[0].productId,
+      inspectType: 0
+    };
+    const res = await qualityInspectDetailByProductId(params);
+    testStandardOptions.value = res.data || [];
+  } else {
+    testStandardOptions.value = [];
+  }
+  
+  // 閲嶇疆琛ㄥ崟
+  form.value = {
+    checkResult: '',
+    testStandardId: '',
+    quantity: undefined,
+    qualifiedQuantity: undefined,
+    unqualifiedQuantity: undefined,
+    checkCompany: '',
+    checkName: '',
+    checkTime: '',
+  };
+  tableData.value = [];
+  
+  await nextTick();
+  proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+  if (!testStandardId) {
+    tableData.value = [];
+    return;
+  }
+  tableLoading.value = true;
+  try {
+    const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+    tableData.value = (res.data || []).map(item => ({
+      ...item,
+      id: null,
+      testValue: ''
+    }));
+  } catch (error) {
+    console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+    tableData.value = [];
+  } finally {
+    tableLoading.value = false;
+  }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+  if (value === '鍚堟牸') {
+    // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+    form.value.qualifiedQuantity = form.value.quantity || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (value === '涓嶅悎鏍�') {
+    // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = form.value.quantity || 0;
+  }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+  if (form.value.checkResult === '鍚堟牸') {
+    form.value.qualifiedQuantity = value || 0;
+    form.value.unqualifiedQuantity = 0;
+  } else if (form.value.checkResult === '涓嶅悎鏍�') {
+    form.value.qualifiedQuantity = 0;
+    form.value.unqualifiedQuantity = value || 0;
+  }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+    form.value.qualifiedQuantity = quantity;
+    form.value.unqualifiedQuantity = 0;
+  } else {
+    form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+  const quantity = form.value.quantity || 0;
+  if (value > quantity) {
+    proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+    form.value.unqualifiedQuantity = quantity;
+    form.value.qualifiedQuantity = 0;
+  } else {
+    form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+  }
+  updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+  const qualified = form.value.qualifiedQuantity || 0;
+  const unqualified = form.value.unqualifiedQuantity || 0;
+  const quantity = form.value.quantity || 0;
+  
+  if (qualified === quantity && unqualified === 0) {
+    form.value.checkResult = '鍚堟牸';
+  } else if (unqualified === quantity && qualified === 0) {
+    form.value.checkResult = '涓嶅悎鏍�';
+  } else if (qualified > 0 && unqualified > 0) {
+    form.value.checkResult = '閮ㄥ垎鍚堟牸';
+  }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs.formRef.validate((valid) => {
+    if (valid) {
+      const data = {
+        ids: selectedIds.value,
+        inspectType: inspectType.value,
+        ...form.value,
+        paramList: tableData.value
+      };
+      batchQuickInspect(data).then(res => {
+        proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+        emit('success');
+        closeDialog();
+      });
+    }
+  });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+  dialogVisible.value = false;
+  emit('close');
+};
+
+defineExpose({
+  openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index 609176e..df33f61 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -55,6 +55,9 @@
              @close="handleQuery"></FormDia>
     <files-dia ref="filesDia"
                @close="handleQuery"></files-dia>
+    <QuickCheckDia ref="quickCheckDia"
+                   @close="handleQuery"
+                   @success="getList"></QuickCheckDia>
     <el-dialog v-model="dialogFormVisible"
                title="缂栬緫妫�楠屽憳"
                width="30%"
@@ -101,6 +104,7 @@
   } from "vue";
   import InspectionFormDia from "@/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue";
   import FormDia from "@/views/qualityManagement/rawMaterialInspection/components/formDia.vue";
+  import QuickCheckDia from "@/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue";
   import { ElMessageBox } from "element-plus";
   import {
     downloadQualityInspect,
@@ -108,7 +112,6 @@
     qualityInspectListPage,
     qualityInspectUpdate,
     submitQualityInspect,
-    batchQuickInspect,
   } from "@/api/qualityManagement/rawMaterialInspection.js";
   import FilesDia from "@/views/qualityManagement/rawMaterialInspection/components/filesDia.vue";
   import dayjs from "dayjs";
@@ -322,6 +325,7 @@
   const formDia = ref();
   const filesDia = ref();
   const inspectionFormDia = ref();
+  const quickCheckDia = ref();
   const { proxy } = getCurrentInstance();
   const userStore = useUserStore();
   const changeDaterange = value => {
@@ -396,33 +400,8 @@
       return;
     }
 
-    const totalCount = selectedRows.value.length;
-    const unSubmittedCount = unSubmittedRows.length;
-    const submittedCount = totalCount - unSubmittedCount;
-
-    let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
-    if (submittedCount > 0) {
-      confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
-    }
-    confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
-    ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-      dangerouslyUseHTMLString: false,
-    })
-      .then(() => {
-        // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
-        const ids = unSubmittedRows.map(item => item.id);
-        batchQuickInspect(ids).then(res => {
-          proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
-          getList();
-        });
-      })
-      .catch(() => {
-        proxy.$modal.msg("宸插彇娑�");
-      });
+    const ids = unSubmittedRows.map(item => item.id);
+    quickCheckDia.value?.openDialog(ids, unSubmittedRows);
   };
   // 鎵撳紑闄勪欢寮规
   const openFilesFormDia = (type, row) => {
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index e7300a4..3f467cd 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -1083,6 +1083,15 @@
               />
             </el-form-item>
           </el-col>
+          <el-col :span="24" v-if="deliveryForm.type === '璐ц溅'">
+            <el-form-item label="鍑哄簱鎵瑰彿锛�" prop="outboundBatches">
+              <el-input
+                v-model="deliveryForm.outboundBatches"
+                placeholder="璇疯緭鍏ュ嚭搴撴壒鍙�"
+                clearable
+              />
+            </el-form-item>
+          </el-col>
           <el-col :span="24" v-else>
             <el-form-item label="蹇�掑叕鍙革細" prop="expressCompany">
               <el-input
@@ -1421,6 +1430,7 @@
     expressCompany: "",
     expressNumber: "",
     type: "璐ц溅", // 璐ц溅, 蹇��
+    outboundBatches: "",
   },
   deliveryRules: {
     shippingCarNumber: [
@@ -2880,6 +2890,7 @@
     type: "璐ц溅",
     batchNo: [],
     batchNoList,
+    outboundBatches: "",
   };
   deliveryFileList.value = [];
   deliveryFormVisible.value = true;
@@ -2923,6 +2934,10 @@
           deliveryForm.value.type === "璐ц溅"
             ? deliveryForm.value.shippingCarNumber
             : "",
+        outboundBatches:
+          deliveryForm.value.type === "璐ц溅"
+            ? deliveryForm.value.outboundBatches
+            : "",
         expressCompany:
           deliveryForm.value.type === "蹇��"
             ? deliveryForm.value.expressCompany
diff --git a/src/views/systemArchitecture/index.vue b/src/views/systemArchitecture/index.vue
index a070122..8e38c9d 100644
--- a/src/views/systemArchitecture/index.vue
+++ b/src/views/systemArchitecture/index.vue
@@ -107,6 +107,7 @@
         </div>
       </section>
 
+      <!-- 鐢熶骇妯″潡宸查殣钘�
       <section class="section-card section-card--bottom">
         <article class="module-title module-title--produce">
           <div class="module-title__icon">
@@ -132,6 +133,7 @@
           </template>
         </div>
       </section>
+      -->
 
       <section class="section-card section-card--bottom">
         <article class="module-title module-title--store">

--
Gitblit v1.9.3