From 388f10aa600b1c2459111aa97cf0947077620a63 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期三, 01 四月 2026 11:24:46 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_长治_健齿齿科器材' into dev_长治_健齿齿科器材

---
 src/views/qualityManagement/processInspection/components/formDia.vue                 |   27 +
 src/views/inventoryManagement/stockManagement/New.vue                                |   64 +++
 src/views/productionManagement/productionOrder/MaterialRequisitionDialog.vue         |   97 +++++
 src/views/productionManagement/workOrder/index.vue                                   |   35 +
 src/views/qualityManagement/finalInspection/components/formDia.vue                   |   38 ++
 src/views/qualityManagement/rawMaterialInspection/index.vue                          |    5 
 src/views/inventoryManagement/stockManagement/Qualified.vue                          |   52 ++
 src/views/salesManagement/salesLedger/index.vue                                      |  331 ++++++++++++++----
 src/views/productionManagement/productionReporting/Input.vue                         |    8 
 src/views/salesManagement/returnOrder/index.vue                                      |    2 
 src/api/inventoryManagement/stockInventory.js                                        |   11 
 src/views/qualityManagement/processInspection/index.vue                              |    5 
 src/views/inventoryManagement/dispatchLog/Record.vue                                 |   34 +
 src/views/procurementManagement/procurementLedger/index.vue                          |   54 ++-
 src/views/qualityManagement/nonconformingManagement/components/formDia.vue           |   31 +
 src/views/productionManagement/productionOrder/New.vue                               |    5 
 src/views/qualityManagement/rawMaterialInspection/components/formDia.vue             |   29 +
 src/views/productionManagement/productionOrder/index.vue                             |    6 
 src/views/inventoryManagement/stockManagement/Unqualified.vue                        |   20 +
 src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue |   10 
 src/api/qualityManagement/nonconformingManagement.js                                 |   10 
 src/views/inventoryManagement/stockReport/index.vue                                  |   28 +
 src/views/qualityManagement/nonconformingManagement/index.vue                        |   44 ++
 src/views/inventoryManagement/receiptManagement/Record.vue                           |   18 
 24 files changed, 801 insertions(+), 163 deletions(-)

diff --git a/src/api/inventoryManagement/stockInventory.js b/src/api/inventoryManagement/stockInventory.js
index 92b3892c..750f638 100644
--- a/src/api/inventoryManagement/stockInventory.js
+++ b/src/api/inventoryManagement/stockInventory.js
@@ -65,4 +65,13 @@
         url: "/stockInventory/getMaterials",
         method: "get",
     });
-}
\ No newline at end of file
+}
+
+// 鑾峰彇搴撳瓨鏍戯紙浜у搧->瑙勬牸/鍨嬪彿->鎵瑰彿->渚涘簲鍟嗭級
+export const getStockInventoryAll = (params = {}) => {
+    return request({
+        url: "/stockInventory/getStockInventoryAll",
+        method: "get",
+        params,
+    });
+};
\ No newline at end of file
diff --git a/src/api/qualityManagement/nonconformingManagement.js b/src/api/qualityManagement/nonconformingManagement.js
index 50a1b74..bcab3ec 100644
--- a/src/api/qualityManagement/nonconformingManagement.js
+++ b/src/api/qualityManagement/nonconformingManagement.js
@@ -48,3 +48,13 @@
     data: query,
   });
 }
+
+// 涓嬭浇杩斿伐闄勪欢
+export function downloadReturnRecord(id) {
+  return request({
+    url: "/quality/qualityUnqualified/downloadReturnRecord",
+    method: "get",
+    params: { id },
+    responseType: "blob",
+  });
+}
diff --git a/src/views/inventoryManagement/dispatchLog/Record.vue b/src/views/inventoryManagement/dispatchLog/Record.vue
index 57f1d04..3860bb2 100644
--- a/src/views/inventoryManagement/dispatchLog/Record.vue
+++ b/src/views/inventoryManagement/dispatchLog/Record.vue
@@ -29,7 +29,7 @@
 			<div>
 				<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="primary" plain @click="handlePrint">鎵撳嵃</el-button> -->
 			</div>
 		</div>
 		<div class="table_list">
@@ -45,12 +45,30 @@
 			>
 				<el-table-column align="center" type="selection" width="55" />
 				<el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column
+        <!-- <el-table-column
             label="鍑哄簱鎵规"
             prop="outboundBatches"
             min-width="100"
             show-overflow-tooltip
-        />
+        /> -->
+        <el-table-column
+            label="鎵瑰彿"
+            min-width="120"
+            show-overflow-tooltip
+        >
+          <template #default="scope">
+            {{ scope.row.batchNo || "" }}
+          </template>
+        </el-table-column>
+        <el-table-column
+            label="渚涘簲鍟�"
+            min-width="160"
+            show-overflow-tooltip
+        >
+          <template #default="scope">
+            {{ scope.row.supplierName || scope.row.customer || "" }}
+          </template>
+        </el-table-column>
 				<el-table-column
 					label="鍑哄簱鏃ユ湡"
 					prop="createTime"
@@ -424,8 +442,14 @@
               </div>
             </div>
             <div class="info-row">
-              <span class="label">鍗曞彿锛�</span>
-              <span class="value">${item.code || ''}</span>
+              <div>
+                <span class="label">鎵瑰彿锛�</span>
+                <span class="value">${item.batchNo || item.outboundBatches || ''}</span>
+              </div>
+              <div>
+                <span class="label">鍗曞彿锛�</span>
+                <span class="value">${item.code || ''}</span>
+              </div>
             </div>
           </div>
 
diff --git a/src/views/inventoryManagement/receiptManagement/Record.vue b/src/views/inventoryManagement/receiptManagement/Record.vue
index 6e904ec..3715fb5 100644
--- a/src/views/inventoryManagement/receiptManagement/Record.vue
+++ b/src/views/inventoryManagement/receiptManagement/Record.vue
@@ -54,10 +54,24 @@
                          label="搴忓彿"
                          type="index"
                          width="60"/>
-        <el-table-column label="鍏ュ簱鎵规"
+        <!-- <el-table-column label="鍏ュ簱鎵规"
                          prop="inboundBatches"
                          width="280"
-                         show-overflow-tooltip/>
+                         show-overflow-tooltip/> -->
+        <el-table-column label="鎵瑰彿"
+                         min-width="160"
+                         show-overflow-tooltip>
+          <template #default="scope">
+            {{ scope.row.batchNo || '' }}
+          </template>
+        </el-table-column>
+        <el-table-column label="渚涘簲鍟�"
+                         min-width="200"
+                         show-overflow-tooltip>
+          <template #default="scope">
+            {{ scope.row.supplierName || scope.row.customer || '' }}
+          </template>
+        </el-table-column>
         <el-table-column label="鍏ュ簱鏃堕棿"
                          prop="createTime"
                          show-overflow-tooltip/>
diff --git a/src/views/inventoryManagement/stockManagement/New.vue b/src/views/inventoryManagement/stockManagement/New.vue
index 1f86fd6..913c3fd 100644
--- a/src/views/inventoryManagement/stockManagement/New.vue
+++ b/src/views/inventoryManagement/stockManagement/New.vue
@@ -37,6 +37,35 @@
           <el-input v-model="formState.unit"  disabled />
         </el-form-item>
 
+        <el-form-item label="鎵瑰彿" prop="batchNo" :rules="[{ required: true, message: '璇疯緭鍏ユ壒鍙�', trigger: 'blur' }]">
+          <el-input v-model="formState.batchNo" placeholder="璇疯緭鍏ユ壒鍙�" clearable />
+        </el-form-item>
+
+        <el-form-item
+          label="渚涘簲鍟�"
+          prop="customer"
+          :rules="[{ required: true, message: '璇烽�夋嫨渚涘簲鍟�', trigger: 'change' }]"
+        >
+          <el-select
+            v-model="formState.customer"
+            placeholder="璇烽�夋嫨渚涘簲鍟�"
+            filterable
+            clearable
+            allow-create
+            :reserve-keyword="true"
+            :default-first-option="false"
+          >
+            <el-option
+              v-for="item in supplierList"
+              :key="item.id"
+              :label="item.supplierName"
+              :value="item.supplierName"
+            >
+              {{ item.supplierName}}
+            </el-option>
+          </el-select>
+        </el-form-item>
+
         <el-form-item
             label="搴撳瓨鏁伴噺"
             prop="qualitity"
@@ -74,10 +103,11 @@
 </template>
 
 <script setup>
-import {ref, computed, getCurrentInstance} from "vue";
+import {ref, computed, getCurrentInstance, watch} from "vue";
 import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
 import {createStockInventory} from "@/api/inventoryManagement/stockInventory.js";
 import {createStockUnInventory} from "@/api/inventoryManagement/stockUninventory.js";
+import {getOptions as getSupplierOptions} from "@/api/procurementManagement/procurementLedger.js";
 
 const props = defineProps({
   visible: {
@@ -101,6 +131,8 @@
   productName: "",
   productModelName: "",
   unit: "",
+  batchNo: "",
+  customer: "",
   qualitity: 0,
   warnNum: 0,
   remark: '',
@@ -126,11 +158,39 @@
     productModelId: undefined,
     productName: "",
     productModelName: "",
-    description: '',
+    unit: "",
+    batchNo: "",
+    customer: "",
+    qualitity: 0,
+    warnNum: 0,
+    remark: '',
   };
   isShow.value = false;
 };
 
+const supplierList = ref([]);
+
+const loadSuppliers = async () => {
+  try {
+    const res = await getSupplierOptions();
+    // 澶嶇敤閲囪喘鍙拌处绛涢�夐�昏緫锛歩sWhite=0 鐨勪緵搴斿晢
+    supplierList.value = (res?.data || []).filter(item => item.isWhite === 0);
+  } catch (e) {
+    console.error("鑾峰彇渚涘簲鍟嗗垪琛ㄥけ璐�:", e);
+    supplierList.value = [];
+  }
+};
+
+watch(
+  () => props.visible,
+  (val) => {
+    if (val) {
+      loadSuppliers();
+    }
+  },
+  { immediate: true }
+);
+
 // 浜у搧閫夋嫨澶勭悊
 const handleProductSelect = async (products) => {
   if (products && products.length > 0) {
diff --git a/src/views/inventoryManagement/stockManagement/Qualified.vue b/src/views/inventoryManagement/stockManagement/Qualified.vue
index e255778..eb91974 100644
--- a/src/views/inventoryManagement/stockManagement/Qualified.vue
+++ b/src/views/inventoryManagement/stockManagement/Qualified.vue
@@ -2,9 +2,29 @@
   <div class="app-container">
     <div class="search_form">
       <div>
-        <span class="search_title ml10">浜у搧澶х被锛�</span>
+        <span class="search_title ml10">浜у搧绫诲瀷锛�</span>
+        <el-radio-group v-model="productScope" class="qualified-product-scope" @change="onProductScopeChange">
+          <el-radio-button label="鎴愬搧">鎴愬搧</el-radio-button>
+          <el-radio-button label="鍏朵粬浜у搧">鍏朵粬浜у搧</el-radio-button>
+        </el-radio-group>
+        <!-- <span class="search_title ml10" style="margin-left: 20px">浜у搧澶х被锛�</span>
         <el-input v-model="searchForm.productName"
                   style="width: 240px"
+                  placeholder="璇疯緭鍏�"
+                  clearable/> -->
+        <span class="search_title ml10" style="margin-left: 20px">瑙勬牸鍨嬪彿锛�</span>
+        <el-input v-model="searchForm.model"
+                  style="width: 240px"
+                  placeholder="璇疯緭鍏�"
+                  clearable/>
+        <span class="search_title ml10" style="margin-left: 20px">UID鐮侊細</span>
+        <el-input v-model="searchForm.uidNo"
+                  style="width: 200px"
+                  placeholder="璇疯緭鍏�"
+                  clearable/>
+        <span class="search_title ml10" style="margin-left: 20px">鎵规鍙凤細</span>
+        <el-input v-model="searchForm.batchNo"
+                  style="width: 200px"
                   placeholder="璇疯緭鍏�"
                   clearable/>
         <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
@@ -26,6 +46,8 @@
         <el-table-column label="浜у搧澶х被" prop="productName" show-overflow-tooltip />
         <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
         <el-table-column label="UID鐮�" prop="uidNo" show-overflow-tooltip />
+        <el-table-column label="鎵瑰彿" prop="batchNo" show-overflow-tooltip />
+        <el-table-column label="渚涘簲鍟�" prop="customer" show-overflow-tooltip />
         <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
         <el-table-column label="搴撳瓨鏁伴噺" prop="qualitity" show-overflow-tooltip />
         <el-table-column label="鍐荤粨鏁伴噺" prop="lockedQuantity" show-overflow-tooltip />
@@ -70,7 +92,7 @@
 
 <script setup>
 import pagination from '@/components/PIMTable/Pagination.vue'
-import { ref, reactive, toRefs, onMounted, getCurrentInstance } from 'vue'
+import { ref, reactive, toRefs, onMounted, getCurrentInstance, defineAsyncComponent } from 'vue'
 import {ElMessage, ElMessageBox} from "element-plus";
 import { getStockInventoryListPage } from "@/api/inventoryManagement/stockInventory.js";
 const NewStockInventory = defineAsyncComponent(() => import("@/views/inventoryManagement/stockManagement/New.vue"));
@@ -100,9 +122,27 @@
 const data = reactive({
   searchForm: {
     productName: '',
+    model: '',
+    uidNo: '',
+    batchNo: '',
   }
 })
 const { searchForm } = toRefs(data)
+
+// 鎴愬搧(2) / 鍏朵粬浜у搧(鍘熸潗鏂�1銆佸崐鎴愬搧3)锛屼笌浜у搧绫诲瀷瀛楀吀涓�鑷达紱鍒嗛〉鎺ュ彛闇�鏀寔 productType 鎴� productTypes
+const productScope = ref('鎴愬搧')
+
+const getProductScopeParams = () => {
+  if (productScope.value === '鎴愬搧') {
+    return { productType: 2 }
+  }
+  return { productTypes: '1,3' }
+}
+
+const onProductScopeChange = () => {
+  page.current = 1
+  getList()
+}
 
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
@@ -117,7 +157,7 @@
 }
 const getList = () => {
   tableLoading.value = true
-  getStockInventoryListPage({ ...searchForm.value, ...page }).then(res => {
+  getStockInventoryListPage({ ...searchForm.value, ...page, ...getProductScopeParams() }).then(res => {
     tableLoading.value = false
     tableData.value = res.data.records
     total.value = res.data.total
@@ -187,7 +227,7 @@
     type: 'warning',
   }
   ).then(() => {
-    proxy.download("/stockInventory/exportStockInventory", {}, '鍚堟牸搴撳瓨淇℃伅.xlsx')
+    proxy.download("/stockInventory/exportStockInventory", { ...searchForm.value, ...getProductScopeParams() }, '鍚堟牸搴撳瓨淇℃伅.xlsx')
   }).catch(() => {
     proxy.$modal.msg("宸插彇娑�")
   })
@@ -199,6 +239,10 @@
 </script>
 
 <style scoped lang="scss">
+.qualified-product-scope {
+  vertical-align: middle;
+}
+
 :deep(.row-low-stock td) {
   background-color: #fde2e2;
   color: #c45656;
diff --git a/src/views/inventoryManagement/stockManagement/Unqualified.vue b/src/views/inventoryManagement/stockManagement/Unqualified.vue
index 6214f39..a5c22ba 100644
--- a/src/views/inventoryManagement/stockManagement/Unqualified.vue
+++ b/src/views/inventoryManagement/stockManagement/Unqualified.vue
@@ -7,6 +7,21 @@
                   style="width: 240px"
                   placeholder="璇疯緭鍏�"
                   clearable/>
+        <span class="search_title ml10" style="margin-left: 20px">瑙勬牸鍨嬪彿锛�</span>
+        <el-input v-model="searchForm.model"
+                  style="width: 240px"
+                  placeholder="璇疯緭鍏�"
+                  clearable/>
+        <span class="search_title ml10" style="margin-left: 20px">UID鐮侊細</span>
+        <el-input v-model="searchForm.uidNo"
+                  style="width: 200px"
+                  placeholder="璇疯緭鍏�"
+                  clearable/>
+        <span class="search_title ml10" style="margin-left: 20px">鎵规鍙凤細</span>
+        <el-input v-model="searchForm.batchNo"
+                  style="width: 200px"
+                  placeholder="璇疯緭鍏�"
+                  clearable/>
         <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鎼滅储</el-button>
       </div>
       <div>
@@ -23,6 +38,8 @@
         <el-table-column label="浜у搧澶х被" prop="productName" show-overflow-tooltip />
         <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
         <el-table-column label="UID鐮�" prop="uidNo" show-overflow-tooltip />
+        <el-table-column label="鎵瑰彿" prop="batchNo" show-overflow-tooltip />
+        <el-table-column label="渚涘簲鍟�" prop="customer" show-overflow-tooltip />
         <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
         <el-table-column label="搴撳瓨鏁伴噺" prop="qualitity" show-overflow-tooltip />
         <el-table-column label="鍐荤粨鏁伴噺" prop="lockedQuantity" show-overflow-tooltip />
@@ -89,6 +106,9 @@
 const data = reactive({
   searchForm: {
     productName: '',
+    model: '',
+    uidNo: '',
+    batchNo: '',
   }
 })
 const { searchForm } = toRefs(data)
diff --git a/src/views/inventoryManagement/stockReport/index.vue b/src/views/inventoryManagement/stockReport/index.vue
index 90198ef..86252a6 100644
--- a/src/views/inventoryManagement/stockReport/index.vue
+++ b/src/views/inventoryManagement/stockReport/index.vue
@@ -168,13 +168,27 @@
              show-overflow-tooltip
              v-if="searchForm.reportType !== 'inout'"
            />
-           <el-table-column
-             label="鍏ュ簱鎵规"
-             prop="inboundBatches"
-             width="240"
-             show-overflow-tooltip
-             v-if="searchForm.reportType !== 'inout'"
-           />
+          <el-table-column
+            label="鎵瑰彿"
+            width="240"
+            show-overflow-tooltip
+            v-if="searchForm.reportType !== 'inout'"
+          >
+            <template #default="scope">
+              {{ scope.row.batchNo || scope.row.inboundBatches || "" }}
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="渚涘簲鍟�"
+            prop="supplierName"
+            min-width="200"
+            show-overflow-tooltip
+            v-if="searchForm.reportType !== 'inout'"
+          >
+            <template #default="scope">
+              {{ scope.row.supplierName || scope.row.customer || "" }}
+            </template>
+          </el-table-column>
            <el-table-column
              label="浜у搧澶х被"
              prop="productName"
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index d69c73e..d29677a 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -86,6 +86,7 @@
                                prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿"
                                prop="specificationModel" />
+              <el-table-column label="UID鐮�" prop="uidNo" />
               <el-table-column label="鍗曚綅"
                                prop="unit" />
               <el-table-column label="鏁伴噺"
@@ -120,10 +121,10 @@
                          prop="supplierName"
                           width="160"
                          show-overflow-tooltip />
-        <el-table-column label="椤圭洰鍚嶇О"
+        <!-- <el-table-column label="椤圭洰鍚嶇О"
                          prop="projectName"
                          width="320"
-                         show-overflow-tooltip />
+                         show-overflow-tooltip /> -->
         <el-table-column label="瀹℃壒鐘舵��"
                          prop="approvalStatus"
                          width="100"
@@ -238,23 +239,6 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О"
-                          prop="projectName">
-              <el-input v-model="form.projectName"
-                        placeholder="璇疯緭鍏�"
-                        clearable />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="浠樻鏂瑰紡">
-              <el-input v-model="form.paymentMethod"
-                        placeholder="璇疯緭鍏�"
-                        clearable />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
             <el-form-item label="绛捐鏃ユ湡锛�"
                           prop="executionDate">
               <el-date-picker style="width: 100%"
@@ -266,6 +250,24 @@
                               clearable />
             </el-form-item>
           </el-col>
+          <!-- <el-col :span="12">
+            <el-form-item label="椤圭洰鍚嶇О"
+                          prop="projectName">
+              <el-input v-model="form.projectName"
+                        placeholder="璇疯緭鍏�"
+                        clearable />
+            </el-form-item>
+          </el-col> -->
+        </el-row>
+        <el-row :gutter="30">
+          <!-- <el-col :span="12">
+            <el-form-item label="浠樻鏂瑰紡">
+              <el-input v-model="form.paymentMethod"
+                        placeholder="璇疯緭鍏�"
+                        clearable />
+            </el-form-item>
+          </el-col> -->
+          
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
@@ -409,6 +411,7 @@
                            prop="unit"
                            width="70" />
           <el-table-column label="UID鐮�" prop="uidNo" />
+          <el-table-column label="鎵规鍙�" prop="batchNo" />
           <el-table-column label="鏁伴噺"
                            prop="quantity"
                            width="70" />
@@ -579,6 +582,17 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="鎵规鍙凤細"
+                          prop="batchNo">
+              <el-input v-model="productForm.batchNo"
+                        placeholder="璇疯緭鍏�"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="鍗曚綅锛�"
@@ -963,6 +977,7 @@
       productCategory: "",
       productModelId: "",
       uidNo: "",
+        batchNo: "",
       specificationModel: "",
       unit: "",
       quantity: "",
@@ -977,6 +992,7 @@
     productRules: {
       productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
       productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      batchNo: [{ required: true, message: "璇疯緭鍏ユ壒娆″彿", trigger: "blur" }],
       unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
       quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
       taxInclusiveUnitPrice: [
diff --git a/src/views/productionManagement/productionOrder/MaterialRequisitionDialog.vue b/src/views/productionManagement/productionOrder/MaterialRequisitionDialog.vue
index 4aa002b..497ea82 100644
--- a/src/views/productionManagement/productionOrder/MaterialRequisitionDialog.vue
+++ b/src/views/productionManagement/productionOrder/MaterialRequisitionDialog.vue
@@ -2,7 +2,7 @@
   <el-dialog
     v-model="visible"
     title="棰嗘枡"
-    width="1000px"
+    width="1400px"
     top="3vh"
     :close-on-click-modal="false"
     destroy-on-close
@@ -19,11 +19,8 @@
             <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="150" />
             <el-table-column prop="model" label="鍨嬪彿" min-width="150" />
             <el-table-column prop="unit" label="鍗曚綅" width="80" align="center" />
-            <!-- <el-table-column prop="qualitity" label="鍙鐢ㄦ暟閲�" width="100" align="center">
-              <template #default="{ row }">
-                {{ row.qualitity || 0 }}
-              </template>
-            </el-table-column> -->
+            <el-table-column prop="customer" label="渚涘簲鍟�" min-width="160" show-overflow-tooltip />
+            <el-table-column prop="batchNo" label="鎵瑰彿" min-width="180" show-overflow-tooltip />
             <el-table-column prop="requisitionQty" label="棰嗙敤鏁伴噺" width="120" align="center">
               <template #default="{ row }">
                 <el-input-number
@@ -61,13 +58,43 @@
     <el-dialog
       v-model="addDialogVisible"
       title="閫夋嫨鍘熸潗鏂�"
-      width="800px"
+      width="1000px"
       top="5vh"
       :close-on-click-modal="false"
       append-to-body
     >
+      <div class="material-filter" style="margin-bottom: 20px;">
+        <el-select
+          v-model="filterSupplier"
+          placeholder="渚涘簲鍟�"
+          clearable
+          filterable
+          style="width: 220px"
+        >
+          <el-option
+            v-for="opt in supplierFilterOptions"
+            :key="opt"
+            :label="opt"
+            :value="opt"
+          />
+        </el-select>
+        <el-select
+          v-model="filterBatchNo"
+          placeholder="鎵瑰彿"
+          clearable
+          filterable
+          style="width: 220px; margin-left: 12px"
+        >
+          <el-option
+            v-for="opt in batchFilterOptions"
+            :key="opt"
+            :label="opt"
+            :value="opt"
+          />
+        </el-select>
+      </div>
       <el-table
-        :data="availableMaterials"
+        :data="filteredMaterials"
         border
         style="width: 100%"
         height="50vh"
@@ -78,6 +105,8 @@
         <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="150" />
         <el-table-column prop="model" label="鍨嬪彿" min-width="150" />
         <el-table-column prop="unit" label="鍗曚綅" width="80" align="center" />
+        <el-table-column prop="customer" label="渚涘簲鍟�" min-width="160" show-overflow-tooltip />
+        <el-table-column prop="batchNo" label="鎵瑰彿" min-width="180" show-overflow-tooltip />
         <!-- <el-table-column prop="qualitity" label="鍙鐢ㄦ暟閲�" width="100" align="center">
           <template #default="{ row }">
             {{ row.qualitity || 0 }}
@@ -129,6 +158,45 @@
 const availableMaterials = ref([]);
 const selectedMaterials = ref([]);
 
+// 閫夋嫨寮圭獥绛涢�夋潯浠讹紙渚涘簲鍟�/鎵瑰彿锛�
+const filterSupplier = ref('');
+const filterBatchNo = ref('');
+
+// 灏嗗悗绔彲鑳借繑鍥炵殑瀛楁鍋氫竴涓嬪綊涓�鍖栵細渚涘簲鍟�/鎵瑰彿瀛楁鍚嶅彲鑳戒笉涓�鑷�
+const normalizeMaterial = (m) => {
+  return {
+    ...m,
+    customer: m.customer ?? m.supplierName ?? '',
+    batchNo: m.batchNo ?? m.batchNumber ?? m.batch_number ?? m.lotNo ?? '',
+  };
+};
+
+const supplierFilterOptions = computed(() => {
+  return Array.from(new Set(availableMaterials.value.map((m) => m.customer).filter(Boolean)));
+});
+
+const batchFilterOptions = computed(() => {
+  const list = filterSupplier.value
+    ? availableMaterials.value.filter((m) => m.customer === filterSupplier.value)
+    : availableMaterials.value;
+  return Array.from(new Set(list.map((m) => m.batchNo).filter(Boolean)));
+});
+
+const filteredMaterials = computed(() => {
+  return availableMaterials.value.filter((m) => {
+    if (filterSupplier.value && m.customer !== filterSupplier.value) return false;
+    if (filterBatchNo.value && m.batchNo !== filterBatchNo.value) return false;
+    return true;
+  });
+});
+
+watch(filterSupplier, () => {
+  // 濡傛灉褰撳墠鈥滄壒鍙封�濅笉灞炰簬鎵�閫変緵搴斿晢锛屽垯娓呯┖
+  if (filterBatchNo.value && !batchFilterOptions.value.includes(filterBatchNo.value)) {
+    filterBatchNo.value = '';
+  }
+});
+
 // 鐩戝惉寮规鎵撳紑锛屽姞杞芥暟鎹�
 watch(() => props.modelValue, (val) => {
   if (val && props.orderData) {
@@ -146,7 +214,7 @@
   if (bomId) {
     try {
       const res = await getMaterials({ bomId });
-      materialsFromApi = res.data || [];
+      materialsFromApi = (res.data || []).map(normalizeMaterial);
     } catch (error) {
       console.error('鏌ヨ鍘熸潗鏂欏垪琛ㄥけ璐�:', error);
     }
@@ -164,7 +232,9 @@
         return {
           ...savedItem,
           qualitity: apiItem?.qualitity ?? savedItem.qualitity ?? 0,
-          requisitionQty: savedItem.requisitionQty || 0
+          requisitionQty: savedItem.requisitionQty || 0,
+          customer: savedItem.customer ?? savedItem.supplierName ?? apiItem?.customer ?? '',
+          batchNo: savedItem.batchNo ?? savedItem.batchNumber ?? apiItem?.batchNo ?? '',
         };
       });
     } catch (e) {
@@ -190,7 +260,9 @@
     const res = await getMaterials({ bomId });
     console.log('getMaterials杩斿洖鏁版嵁:', res.data);
     // 鐩存帴灞曠ず鎵�鏈夋暟鎹紝涓嶈繃婊�
-    availableMaterials.value = res.data || [];
+    availableMaterials.value = (res.data || []).map(normalizeMaterial);
+    filterSupplier.value = '';
+    filterBatchNo.value = '';
     selectedMaterials.value = [];
     addDialogVisible.value = true;
   } catch (error) {
@@ -222,7 +294,7 @@
     .map(item => ({
       ...item,
       requisitionQty: 0,
-      remark: ''
+      remark: '',
     }));
 
   if (newItems.length === 0) {
@@ -270,6 +342,7 @@
     visible.value = false;
     materialList.value = [];
     activeTab.value = 'material';
+    emit('confirm');
   } catch (error) {
     console.error('淇濆瓨棰嗘枡澶辫触:', error);
     ElMessage.error('淇濆瓨棰嗘枡澶辫触');
diff --git a/src/views/productionManagement/productionOrder/New.vue b/src/views/productionManagement/productionOrder/New.vue
index 59c04bd..6ef6155 100644
--- a/src/views/productionManagement/productionOrder/New.vue
+++ b/src/views/productionManagement/productionOrder/New.vue
@@ -166,10 +166,7 @@
     const product = products[0];
     formState.value.productId = product.productId;
     formState.value.productName = product.productName;
-    const productNameArr = product.productName.split('-');
-    if (productNameArr.length === 3 && productNameArr[0] && productNameArr[1] !== '') {
-      formState.value.manufacturingTeam = productNameArr[1].charAt(0) + '绫昏溅闂�';
-    }
+    formState.value.manufacturingTeam = product.parentName.charAt(0) + '绫昏溅闂�';
 
     formState.value.productModelName = product.model;
     formState.value.productModelId = product.id;
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index 3b4adc7..788d5d6 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -107,6 +107,7 @@
     <material-requisition-dialog
       v-model="materialRequisitionVisible"
       :order-data="currentOrderData"
+      @confirm="handleQuery"
     />
   </div>
 </template>
@@ -158,6 +159,11 @@
     width: '120px',
   },
   {
+    label: "鎵瑰彿",
+    prop: "batchNo",
+    width: '120px',
+  },
+  {
     label: "宸ヨ壓璺嚎缂栧彿",
     prop: "processRouteCode",
     width: '200px',
diff --git a/src/views/productionManagement/productionReporting/Input.vue b/src/views/productionManagement/productionReporting/Input.vue
index 06c2d9d..7b0e10a 100644
--- a/src/views/productionManagement/productionReporting/Input.vue
+++ b/src/views/productionManagement/productionReporting/Input.vue
@@ -71,6 +71,14 @@
     prop: 'uidNo',
   },
   {
+    label: '渚涘簲鍟�',
+    prop: 'customer',
+  },
+  {
+    label: '鎵瑰彿',
+    prop: 'batchNo',
+  },
+  {
     label: '鎶曞叆鏁伴噺',
     prop: 'quantity',
   },
diff --git a/src/views/productionManagement/workOrder/index.vue b/src/views/productionManagement/workOrder/index.vue
index 1d3c8a5..eaceff1 100644
--- a/src/views/productionManagement/workOrder/index.vue
+++ b/src/views/productionManagement/workOrder/index.vue
@@ -173,6 +173,13 @@
                label-width="120px">
         <el-row :gutter="30">
           <el-col :span="12">
+            <el-form-item label="浜у搧鍚嶇О">
+              <el-input v-model="reportForm.productName"
+                        readonly
+                        style="width: 300px" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
             <el-form-item label="寰呯敓浜ф暟閲�">
               <el-input v-model="reportForm.planQuantity"
                         readonly
@@ -212,18 +219,6 @@
                     @input="handleScrapQtyInput" />
         </el-form-item></el-col>
         <el-col :span="12">
-          <el-form-item label="妫�鍝佹暟閲�"
-                      prop="inspectedQuantity">
-          <el-input v-model.number="reportForm.inspectedQuantity"
-                    type="number"
-                    min="0"
-                    step="1"
-                    style="width: 300px"
-                    placeholder="璇疯緭鍏ユ鍝佹暟閲�"
-                    @input="handleInspectedQuantity"/>
-        </el-form-item>
-        </el-col>
-        <el-col :span="12">
           <el-form-item label="鐝粍淇℃伅">
           <el-select v-model="reportForm.userId"
                      style="width: 300px"
@@ -262,6 +257,8 @@
             <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="160" />
             <el-table-column prop="model" label="鍨嬪彿" min-width="150" />
             <el-table-column prop="unit" label="鍗曚綅" width="90" align="center" />
+            <el-table-column prop="customer" label="渚涘簲鍟�" min-width="160" show-overflow-tooltip />
+            <el-table-column prop="batchNo" label="鎵瑰彿" min-width="180" show-overflow-tooltip />
             <el-table-column prop="reportQty" label="棰嗙敤鏁伴噺" width="160" align="center">
               <template #default="{ row }">
                 <el-input-number
@@ -269,8 +266,8 @@
                   :min="0"
                   :precision="2"
                   :controls="false"
-                  :max="row.qualitity || 0"
-                  :disabled="!row.qualitity"
+                  :max="row.requisitionQty || 0"
+                  :disabled="!row.requisitionQty"
                   style="width: 100%"
                 />
               </template>
@@ -300,7 +297,7 @@
     <el-dialog
       v-model="addMaterialDialogVisible"
       title="閫夋嫨鍘熸潗鏂�"
-      width="1000px"
+      width="1400px"
       top="5vh"
       :close-on-click-modal="false"
       append-to-body
@@ -320,7 +317,9 @@
           <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="160" />
           <el-table-column prop="model" label="鍨嬪彿" min-width="150" />
           <el-table-column prop="unit" label="鍗曚綅" width="90" align="center" />
-          <el-table-column prop="qualitity" label="鍙鐢ㄦ暟閲�" width="140" align="center" />
+          <el-table-column prop="customer" label="渚涘簲鍟�" min-width="160" show-overflow-tooltip />
+          <el-table-column prop="batchNo" label="鎵瑰彿" min-width="180" show-overflow-tooltip />
+          <el-table-column prop="requisitionQty" label="鍙鐢ㄦ暟閲�" width="140" align="center" />
         </el-table>
 
         <!-- 宸查�夋嫨鏄庣粏灞曠ず鏀惧湪鎶ュ伐寮规涓嬫柟鐨� reportForm.drawMaterialList 琛ㄦ牸閲� -->
@@ -488,6 +487,8 @@
   const userOptions = ref([]);
   const deviceOptions = ref([]);
   const reportForm = reactive({
+    // 鎶ュ伐寮规閲屸�滀骇鍝佸悕绉扳�濆彧璇诲洖鏄�
+    productName: "",
     planQuantity: 0,
     totalInvestment: 0,
     quantity: null,
@@ -901,6 +902,8 @@
   const showReportDialog = async row => {
     currentReportRowData.value = row;
     processParamList.value = await getProcessParamList(row)
+    // 鍏煎鍚庣/琛ㄦ牸瀛楁鍛藉悕锛氫紭鍏� row.productName锛屽叾娆� row.productCategory
+    reportForm.productName = row.productName ?? row.productCategory ?? ''
     reportForm.planQuantity = row.planQuantity;
     reportForm.totalInvestment = row.totalInvestment;
     reportForm.quantity =
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 7e2f9d3..6c91846 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -50,6 +50,23 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
+            <el-form-item label="鍗曚綅锛�" prop="unit">
+              <el-input v-model="form.unit" placeholder="璇疯緭鍏�" disabled/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鎵瑰彿锛�" prop="batchNo">
+              <el-input
+                v-model="form.batchNo"
+                placeholder="璇疯緭鍏�"
+                clearable
+                :disabled="operationType === 'edit'"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
             <el-form-item label="UID鐮侊細" prop="uidNo">
               <el-input v-model="form.uidNo" placeholder="璇疯緭鍏�" disabled/>
             </el-form-item>
@@ -57,8 +74,8 @@
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鍗曚綅锛�" prop="unit">
-              <el-input v-model="form.unit" placeholder="璇疯緭鍏�" disabled/>
+            <el-form-item label="妫�鍝佹暟閲忥細" prop="inspectedQuantity">
+              <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.inspectedQuantity" placeholder="璇疯緭鍏�" clearable :precision="2"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -66,6 +83,9 @@
               <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2" :disabled="quantityDisabled"/>
             </el-form-item>
           </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
@@ -227,6 +247,15 @@
 
 const dialogFormVisible = ref(false);
 const operationType = ref('')
+
+const validateBatchNo = (rule, value, callback) => {
+  if (value === undefined || value === null || String(value).trim() === '') {
+    callback(new Error('璇疯緭鍏ユ壒鍙�'));
+    return;
+  }
+  callback();
+};
+
 const data = reactive({
   form: {
     checkTime: "",
@@ -239,6 +268,8 @@
     testStandardId: "",
     unit: "",
     uidNo: "",
+    batchNo: "",
+    inspectedQuantity: "",
     quantity: "",
     inspectedQuantity: "",
     inspectMaterialCondition: "",
@@ -255,6 +286,7 @@
     productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     testStandardId: [{required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change"}],
     unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+    inspectedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     inspectedQuantity: [
       { required: true, message: "璇疯緭鍏ユ鍝佹暟閲�", trigger: "blur" },
@@ -276,6 +308,7 @@
       }
     ],
     checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+    batchNo: [{ required: true, validator: validateBatchNo, trigger: "blur" }],
     checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
   },
 });
@@ -439,6 +472,7 @@
   form.value.productModelId = undefined;
   form.value.unit = undefined;
   form.value.uidNo = undefined;
+  form.value.batchNo = "";
   modelOptions.value = [];
   currentProductId.value = value
   form.value.productName = findNodeById(productOptions.value, value);
diff --git a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
index 2301cee..06adf63 100644
--- a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
+++ b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
@@ -49,6 +49,18 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
+            <el-form-item label="鎵瑰彿锛�" prop="batchNo" :required="operationType === 'add'">
+              <el-input
+                v-model="form.batchNo"
+                placeholder="璇疯緭鍏�"
+                clearable
+                :disabled="operationType === 'edit'"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
             <el-form-item label="鍗曚綅锛�" prop="unit">
               <el-input v-model="form.unit" placeholder="璇疯緭鍏�" disabled/>
             </el-form-item>
@@ -125,7 +137,7 @@
 </template>
 
 <script setup>
-import {ref, reactive, toRefs} from "vue";
+import {ref, reactive, toRefs, getCurrentInstance} from "vue";
 import {modelList, productTreeList} from "@/api/basicData/product.js";
 import {
   getQualityUnqualifiedInfo,
@@ -140,6 +152,19 @@
 
 const dialogFormVisible = ref(false);
 const operationType = ref('')
+
+const validateBatchNo = (rule, value, callback) => {
+  if (operationType.value !== 'add') {
+    callback();
+    return;
+  }
+  if (value === undefined || value === null || String(value).trim() === '') {
+    callback(new Error('璇疯緭鍏ユ壒鍙�'));
+    return;
+  }
+  callback();
+};
+
 const { rejection_handling } = proxy.useDict("rejection_handling")
 const data = reactive({
   form: {
@@ -150,6 +175,7 @@
     productId: "",
     model: "",
     uidNo: "",
+    batchNo: "",
     unit: "",
     quantity: "",
     checkCompany: "",
@@ -171,6 +197,7 @@
     checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
     dealName: [{ required: true, message: "璇烽�夋嫨澶勭悊浜�", trigger: "change" }],
+    batchNo: [{ validator: validateBatchNo, trigger: "blur" }],
   },
 });
 const { form, rules } = toRefs(data);
@@ -201,6 +228,7 @@
       productId: '',
       model: '',
       uidNo: '',
+      batchNo: '',
       unit: '',
       quantity: '',
       productName: '',
@@ -233,6 +261,7 @@
   form.value.model = undefined;
   form.value.unit = undefined;
   form.value.uidNo = undefined;
+  form.value.batchNo = "";
   modelOptions.value = [];
   form.value.productName = findNodeById(productOptions.value, value);
   modelList({ id: value }).then((res) => {
diff --git a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue b/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
index 8f4492a..5e18b06 100644
--- a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
+++ b/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
@@ -54,6 +54,13 @@
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
+            <el-form-item label="鎵瑰彿锛�" prop="batchNo">
+              <el-input v-model="form.batchNo" placeholder="鈥�" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
             <el-form-item label="妫�楠屽憳锛�" prop="checkName">
               <el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable disabled/>
             </el-form-item>
@@ -121,7 +128,7 @@
 </template>
 
 <script setup>
-import {ref, reactive, toRefs, computed} from "vue";
+import {ref, reactive, toRefs, computed, getCurrentInstance} from "vue";
 import {productTreeList} from "@/api/basicData/product.js";
 import {
   getQualityUnqualifiedInfo,
@@ -142,6 +149,7 @@
     productName: "",
     productId: "",
     model: "",
+    batchNo: "",
     unit: "",
     quantity: "",
     checkCompany: "",
diff --git a/src/views/qualityManagement/nonconformingManagement/index.vue b/src/views/qualityManagement/nonconformingManagement/index.vue
index 8538fa4..3f3ac28 100644
--- a/src/views/qualityManagement/nonconformingManagement/index.vue
+++ b/src/views/qualityManagement/nonconformingManagement/index.vue
@@ -63,7 +63,7 @@
 import {onMounted, ref, reactive, toRefs, nextTick, getCurrentInstance} from "vue";
 import FormDia from "@/views/qualityManagement/nonconformingManagement/components/formDia.vue";
 import {ElMessageBox} from "element-plus";
-import {qualityUnqualifiedDel, qualityUnqualifiedListPage} from "@/api/qualityManagement/nonconformingManagement.js";
+import {qualityUnqualifiedDel, qualityUnqualifiedListPage, downloadReturnRecord} from "@/api/qualityManagement/nonconformingManagement.js";
 import InspectionFormDia from "@/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue";
 import dayjs from "dayjs";
 
@@ -148,6 +148,11 @@
     prop: "uidNo",
   },
   {
+    label: "鎵瑰彿",
+    prop: "batchNo",
+    width: 140,
+  },
+  {
     label: "鍗曚綅",
     prop: "unit",
   },
@@ -181,7 +186,7 @@
     label: "鎿嶄綔",
     align: "center",
     fixed: "right",
-    width: 100,
+    width: 180,
     operation: [
       {
         name: "澶勭悊",
@@ -190,6 +195,14 @@
           openInspectionForm("edit", row);
         },
         disabled: (row) => row.inspectState === 1,
+      },
+      {
+        name: "涓嬭浇杩斿伐闄勪欢",
+        type: "text",
+        clickFun: (row) => {
+          handleDownloadReturnRecord(row);
+        },
+        show: (row) => row.dealResult === "杩斿伐",
       },
     ],
   },
@@ -264,6 +277,33 @@
   })
 };
 
+// 涓嬭浇杩斿伐闄勪欢
+const handleDownloadReturnRecord = async (row) => {
+  try {
+    const blobData = await downloadReturnRecord(row.id);
+
+    // 鏋勫缓 Blob
+    const blob = new Blob([blobData], {
+      type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+    });
+
+    // 涓嬭浇
+    const url = window.URL.createObjectURL(blob);
+    const link = document.createElement("a");
+    link.href = url;
+    link.download = `杩斿伐闄勪欢.docx`;
+    document.body.appendChild(link);
+    link.click();
+    document.body.removeChild(link);
+    window.URL.revokeObjectURL(url);
+
+    proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
+  } catch (error) {
+    console.error("涓嬭浇杩斿伐闄勪欢澶辫触:", error);
+    proxy.$modal.msgError("涓嬭浇澶辫触");
+  }
+};
+
 // 鍒犻櫎
 const handleDelete = () => {
   let ids = [];
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
index ee3fde7..216ff14 100644
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ b/src/views/qualityManagement/processInspection/components/formDia.vue
@@ -122,6 +122,18 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
+            <el-form-item label="鎵瑰彿锛�" prop="batchNo">
+              <el-input
+                v-model="form.batchNo"
+                placeholder="璇疯緭鍏�"
+                clearable
+                :disabled="operationType === 'edit'"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
             <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
               <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
             </el-form-item>
@@ -134,6 +146,8 @@
               </el-select>
             </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>
@@ -237,6 +251,15 @@
 
 const dialogFormVisible = ref(false);
 const operationType = ref('')
+
+const validateBatchNo = (rule, value, callback) => {
+  if (value === undefined || value === null || String(value).trim() === '') {
+    callback(new Error('璇疯緭鍏ユ壒鍙�'));
+    return;
+  }
+  callback();
+};
+
 const data = reactive({
   form: {
     checkTime: "",
@@ -247,6 +270,7 @@
     productModelId: "",
     model: "",
     uidNo: "",
+    batchNo: "",
     testStandardId: "",
     unit: "",
     quantity: "",
@@ -286,6 +310,7 @@
       }
     ],
     checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+    batchNo: [{ required: true, validator: validateBatchNo, trigger: "blur" }],
     checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
   },
 });
@@ -381,6 +406,7 @@
 		testStandardId: "",
 		unit: "",
 		uidNo: "",
+		batchNo: "",
 		quantity: "",
 		inspectedQuantity: "",
 		inspectMaterialCondition: "",
@@ -470,6 +496,7 @@
   form.value.productModelId = undefined;
   form.value.unit = undefined;
   form.value.uidNo = undefined;
+  form.value.batchNo = "";
   modelOptions.value = [];
   currentProductId.value = value
   form.value.productName = findNodeById(productOptions.value, value);
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index 89185bf..0a86ccf 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -122,6 +122,11 @@
     prop: "uidNo",
   },
   {
+    label: "鎵瑰彿",
+    prop: "batchNo",
+    width: 140,
+  },
+  {
     label: "鍗曚綅",
     prop: "unit",
   },
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 596026d..fc527f3 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -134,12 +134,22 @@
             </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 label="鎵瑰彿锛�" prop="batchNo">
+              <el-input
+                v-model="form.batchNo"
+                placeholder="璇疯緭鍏�"
+                clearable
+                :disabled="operationType === 'edit'"
+              />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+              <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏�" clearable/>
+            </el-form-item>
+          </el-col>
           <el-col :span="12">
             <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
               <el-select v-model="form.checkResult">
@@ -148,6 +158,8 @@
               </el-select>
             </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%">
@@ -251,6 +263,15 @@
 
 const dialogFormVisible = ref(false);
 const operationType = ref('')
+
+const validateBatchNo = (rule, value, callback) => {
+  if (value === undefined || value === null || String(value).trim() === '') {
+    callback(new Error('璇疯緭鍏ユ壒鍙�'));
+    return;
+  }
+  callback();
+};
+
 const data = reactive({
   form: {
     checkTime: "",
@@ -261,6 +282,7 @@
     productModelId: "",
     model: "",
     uidNo: "",
+    batchNo: "",
     testStandardId: "",
     unit: "",
     quantity: "",
@@ -300,6 +322,7 @@
       }
     ],
     checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
+    batchNo: [{ required: true, validator: validateBatchNo, trigger: "blur" }],
     checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
   },
 });
@@ -393,6 +416,7 @@
     productModelId: "",
     model: "",
     uidNo: "",
+    batchNo: "",
     testStandardId: "",
     unit: "",
     quantity: "",
@@ -482,6 +506,7 @@
   form.value.productModelId = undefined;
   form.value.unit = undefined;
   form.value.uidNo = undefined;
+  form.value.batchNo = "";
   modelOptions.value = [];
   currentProductId.value = value
   form.value.productName = findNodeById(productOptions.value, value);
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index 16d6057..98b51a5 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -124,6 +124,11 @@
     prop: "uidNo",
   },
   {
+    label: "鎵瑰彿",
+    prop: "batchNo",
+    width: 140,
+  },
+  {
     label: "鍗曚綅",
     prop: "unit",
   },
diff --git a/src/views/salesManagement/returnOrder/index.vue b/src/views/salesManagement/returnOrder/index.vue
index a5aa019..7578288 100644
--- a/src/views/salesManagement/returnOrder/index.vue
+++ b/src/views/salesManagement/returnOrder/index.vue
@@ -145,7 +145,7 @@
   { label: "閿�鍞崟鍙�", prop: "salesContractNo", minWidth: 160 },
   { label: "涓氬姟鍛�", prop: "salesman", minWidth: 120 },
   { label: "鍏宠仈鍑哄簱鍗曞彿", prop: "shippingNo", minWidth: 170 },
-  { label: "椤圭洰鍚嶇О", prop: "projectName", minWidth: 180 },
+  // { label: "椤圭洰鍚嶇О", prop: "projectName", minWidth: 180 },
   { label: "椤圭洰闃舵", prop: "projectStage", minWidth: 120 },
   { label: "鍒跺崟浜�", prop: "maker", minWidth: 120 },
   { label: "缁撶畻浜�", prop: "settler", minWidth: 120 },
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index ca1530f..4f6d40a 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -47,6 +47,7 @@
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
               <el-table-column label="鎵瑰彿" prop="batchNo" />
+              <el-table-column label="UID鐮�" prop="uidNo" />
               <el-table-column label="鍗曚綅" prop="unit" />
 							<el-table-column label="浜у搧鐘舵��"
 															 width="100px"
@@ -111,8 +112,8 @@
         <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" width="180" show-overflow-tooltip />
         <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" width="300" show-overflow-tooltip />
         <el-table-column label="涓氬姟鍛�" prop="salesman" width="100" show-overflow-tooltip />
-        <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="180" show-overflow-tooltip />
-        <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip />
+        <!-- <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="180" show-overflow-tooltip />
+        <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip /> -->
         <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="220" show-overflow-tooltip
           :formatter="formattedNumber" />
         <el-table-column label="褰曞叆浜�" prop="entryPersonName" width="100" show-overflow-tooltip />
@@ -172,24 +173,12 @@
             </el-form-item>
           </el-col>
 					<el-col :span="12">
-						<el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-							<el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
-						</el-form-item>
-					</el-col>
-        </el-row>
-        <el-row :gutter="30">
-					<el-col :span="12">
 						<el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate">
 							<el-date-picker style="width: 100%" v-model="form.executionDate" value-format="YYYY-MM-DD"
 															format="YYYY-MM-DD" type="date" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" />
 						</el-form-item>
 					</el-col>
-					<el-col :span="12">
-						<el-form-item label="浠樻鏂瑰紡">
-							<el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
-						</el-form-item>
-					</el-col>
-				</el-row>
+        </el-row>
 				<el-row :gutter="30">
 					<el-col :span="12">
 						<el-form-item label="褰曞叆浜猴細" prop="entryPerson">
@@ -375,8 +364,25 @@
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="鎵瑰彿锛�" prop="batchNo">
-              <el-select v-model="productForm.batchNo" placeholder="璇烽�夋嫨" clearable filterable>
+              <el-select v-model="productForm.batchNo"
+                          placeholder="璇烽�夋嫨"
+                          clearable
+                          filterable
+                          @change="handleBatchNoChange">
                 <el-option v-for="item in batchNoOptions" :key="item.value" :label="item.label" :value="item.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="渚涘簲鍟嗭細" prop="customer">
+              <el-select v-model="productForm.customer"
+                          placeholder="璇烽�夋嫨"
+                          clearable
+                          filterable
+                          :disabled="!supplierOptions.length">
+                <el-option v-for="item in supplierOptions" :key="item.value" :label="item.label" :value="item.value" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -533,6 +539,7 @@
 										<th>浜у搧鍚嶇О</th>
 										<th>瑙勬牸鍨嬪彿</th>
 										<th>鍗曚綅</th>
+										<th>UID鐮�</th>
 										<th>鍗曚环</th>
 										<th>闆跺敭鏁伴噺</th>
 										<th>闆跺敭閲戦</th>
@@ -543,6 +550,7 @@
 										<td>{{ product.productCategory || '' }}</td>
 										<td>{{ product.specificationModel || '' }}</td>
 										<td>{{ product.unit || '' }}</td>
+										<td>{{ product.uidNo || '' }}</td>
 										<td>{{ product.taxInclusiveUnitPrice || '0' }}</td>
 										<td>{{ product.quantity || '0' }}</td>
 										<td>{{ product.taxInclusiveTotalPrice || '0' }}</td>
@@ -696,11 +704,11 @@
   delProduct,
   delLedgerFile, getProductInventory, saleOutboundExport,
 } from "@/api/salesManagement/salesLedger.js";
-import { modelList, productTreeList } from "@/api/basicData/product.js";
+import { getStockInventoryAll } from "@/api/inventoryManagement/stockInventory.js";
 import useFormData from "@/hooks/useFormData.js";
 import dayjs from "dayjs";
 import { getCurrentDate } from "@/utils/index.js";
-import {getProductOrderBatchNoOptions} from "@/api/productionManagement/productionOrder.js";
+// 鐢� /stockInventory/getStockInventoryAll 椹卞姩鈥滄壒鍙�/渚涘簲鍟嗏�濊仈鍔�
 import {safeTrainingExport} from "@/api/safeProduction/safetyTrainingAssessment.js";
 
 const userStore = useUserStore();
@@ -713,6 +721,7 @@
 const customerOption = ref([]);
 const productOptions = ref([]);
 const modelOptions = ref([]);
+const supplierOptions = ref([]);
 const tableLoading = ref(false);
 const page = reactive({
 	current: 1,
@@ -761,6 +770,7 @@
 const productFormData = reactive({
 	productForm: {
 		productCategory: "",
+		customer: "",
 		specificationModel: "",
     uidNo: "",
 		unit: "",
@@ -776,6 +786,7 @@
 		productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
 		productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     batchNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+		customer: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
 		specificationModel: [
 			{ required: true, message: "璇烽�夋嫨", trigger: "change" },
 		],
@@ -944,64 +955,203 @@
 			tableLoading.value = false;
 		});
 };
-// 鑾峰彇浜у搧澶х被tree鏁版嵁
-const getProductOptions = () => {
+let stockInventoryAllTree = [];
+let batchNodeByBatchNo = new Map();
+
+const normalizeStockInventoryTree = (nodes = []) => {
+	const normalizeNodeValue = (node) => {
+		// 鍚庣鏈夋椂浼氬嚭鐜� id=null 鐨勫眰绾э紝杩欓噷缁欎竴涓彲鐢ㄧ殑 key
+		if (node?.id !== null && node?.id !== undefined) return String(node.id);
+		if (node?.nodeType === "batch") return String(node.batchNo ?? node.label ?? "");
+		if (node?.nodeType === "customer") return String(node.customer ?? node.label ?? "");
+		if (node?.nodeType === "model") return String(node.productModelId ?? node.model ?? node.label ?? "");
+		return String(node.productName ?? node.label ?? "");
+	};
+
+	const normalized = (list) =>
+		(list || []).map((n) => {
+			const value = normalizeNodeValue(n);
+			const label = n.label ?? n.productName ?? n.model ?? n.batchNo ?? n.customer ?? "";
+			return {
+				...n,
+				value,
+				label,
+				children: normalized(n.children),
+			};
+		});
+
+	return normalized(nodes);
+};
+
+// 浠呭睍绀烘渶澶� 3 涓眰绾э細绗� 1 灞�(product) -> 绗� 2 灞�(model) -> 绗� 3 灞�(batch)锛屾洿娣辩殑鑺傜偣涓嶅睍绀�
+const filterStockInventoryFirst3Levels = (nodes = []) => {
+	const MAX_LEVEL = 3;
+
+	const cloneAndFilterByLevel = (list = [], level = 1) => {
+		return (list || [])
+			.map((n) => {
+				// 鍚庣画灞傜骇閲屽鏋滆繕鏈� customer锛岀洿鎺ュ墧闄�
+				if (n.nodeType === "customer") return null;
+
+				// 鍒拌揪灞曠ず娣卞害鍚庯紝涓嶅啀鍚戜笅鎸傚瓙鑺傜偣
+				if (level >= MAX_LEVEL) {
+					return { ...n, children: [] };
+				}
+
+				// 鐗逛緥锛歜atch 鑺傜偣鏈韩涔熶笉鍐嶅睍绀� children锛堜繚鎸佷笌鎺ュ彛鑺傜偣璇箟涓�鑷达級
+				if (n.nodeType === "batch") {
+					return { ...n, children: [] };
+				}
+
+				return { ...n, children: cloneAndFilterByLevel(n.children, level + 1) };
+			})
+			.filter(Boolean);
+	};
+
+	return cloneAndFilterByLevel(nodes, 1);
+};
+
+const findNodeObjByValue = (nodes = [], value) => {
+	for (let i = 0; i < (nodes || []).length; i++) {
+		const node = nodes[i];
+		if (String(node?.value) === String(value)) return node;
+		const children = node?.children || [];
+		if (children.length) {
+			const found = findNodeObjByValue(children, value);
+			if (found) return found;
+		}
+	}
+	return null;
+};
+
+// 鑾峰彇搴撳瓨鏍戯紙鐢ㄤ簬浜у搧澶х被/瑙勬牸鍨嬪彿鑱斿姩锛�
+const getProductOptions = async () => {
 	// 杩斿洖 Promise锛屼究浜庡湪缂栬緫浜у搧鏃剁瓑寰呭姞杞藉畬鎴�
-	return productTreeList().then((res) => {
-		productOptions.value = convertIdToValue(res);
-		return productOptions.value;
-	});
+	const res = await getStockInventoryAll();
+	const data = res?.data || [];
+	stockInventoryAllTree = normalizeStockInventoryTree(data);
+	productOptions.value = filterStockInventoryFirst3Levels(stockInventoryAllTree);
+	return productOptions.value;
 };
 const formattedNumber = (row, column, cellValue) => {
 	return parseFloat(cellValue).toFixed(2);
 };
-// 鑾峰彇tree瀛愭暟鎹�
+// 鑾峰彇tree瀛愭暟鎹紙鍏堥�変骇鍝侊紝鍐嶉�夎鏍煎瀷鍙凤級
 const getModels = (value) => {
-	productForm.value.productCategory = findNodeById(productOptions.value, value);
-	modelList({ id: value }).then((res) => {
-		modelOptions.value = res;
-	});
+	const node = findNodeObjByValue(stockInventoryAllTree, value);
+	if (!node) return;
+	if (node.nodeType !== "product") return;
+
+	// 閫夋嫨浜у搧鍚庯紝閲嶇疆涓嬫父瀛楁
+	productForm.value.productCategory = node.label;
+	modelOptions.value = (node.children || [])
+		.filter((c) => c.nodeType === "model")
+		.map((m) => ({
+			id: m.value,
+			model: m.model ?? m.label ?? "",
+			unit: m.unit ?? "",
+			uidNo: m.uidNo ?? m.identifierCode ?? "",
+		}));
+
+	productForm.value.productModelId = null;
+	productForm.value.specificationModel = "";
+	productForm.value.uidNo = "";
+	productForm.value.unit = "";
+	productForm.value.batchNo = "";
+	productForm.value.customer = "";
+	productForm.value.taxInclusiveUnitPrice = "";
+	productForm.value.taxInclusiveTotalPrice = "";
+	productForm.value.taxExclusiveTotalPrice = "";
+
+	modelOptions.value = modelOptions.value || [];
+	batchNoOptions.value = [];
+	supplierOptions.value = [];
+	batchNodeByBatchNo = new Map();
 };
+
+// 瑙勬牸鍨嬪彿閫夋嫨鍚庯細鍥炴樉 UID锛屽苟鐢熸垚鈥滄壒鍙蜂笅鎷夆��
 const getProductModel = (value) => {
-	const index = modelOptions.value.findIndex((item) => item.id === value);
-	if (index !== -1) {
-		productForm.value.specificationModel = modelOptions.value[index].model;
-		productForm.value.unit = modelOptions.value[index].unit;
-    productForm.value.uidNo = modelOptions.value[index].uidNo || "";
+	const modelNode = findNodeObjByValue(stockInventoryAllTree, value);
+	if (!modelNode || modelNode.nodeType !== "model") return;
+
+	const prevBatchNo = productForm.value.batchNo;
+	const prevCustomer = productForm.value.customer;
+
+	productForm.value.productModelId = modelNode.value;
+	productForm.value.specificationModel = modelNode.model ?? modelNode.label ?? "";
+	// 鏈変簺鎺ュ彛/鏍戞暟鎹噷鍙兘涓嶅寘鍚� unit锛岃繖绉嶆儏鍐典笅涓嶈瑕嗙洊缂栬緫鏃跺凡鍥炴樉鐨勫��
+	const nextUnit = modelNode.unit ?? "";
+	if (nextUnit !== null && nextUnit !== undefined && String(nextUnit).trim() !== "") {
+		productForm.value.unit = nextUnit;
+	}
+	// 鏈変簺鎺ュ彛/鏍戞暟鎹噷鍙兘涓嶅寘鍚� uidNo锛岃繖绉嶆儏鍐典笅涓嶈瑕嗙洊缂栬緫鏃跺凡鍥炴樉鐨勫��
+	const nextUidNo = modelNode.uidNo ?? modelNode.identifierCode ?? "";
+	if (nextUidNo !== null && nextUidNo !== undefined && String(nextUidNo).trim() !== "") {
+		productForm.value.uidNo = nextUidNo;
+	}
+
+	const batchNodes = (modelNode.children || []).filter((b) => b.nodeType === "batch");
+	batchNodeByBatchNo = new Map(
+		batchNodes.map((b) => {
+			const key = String(b.batchNo ?? b.value ?? b.label ?? "").trim();
+			return [key, b];
+		})
+	);
+	batchNoOptions.value = batchNodes.map((b) => ({
+		label: String(b.batchNo ?? b.label ?? "").trim(),
+		value: String(b.batchNo ?? b.value ?? b.label ?? "").trim(),
+	}));
+
+	// 鎵瑰彿涓嶅啀灞炰簬鏂拌鏍兼椂锛屾竻绌�
+	const batchValues = new Set(batchNoOptions.value.map((x) => x.value));
+	if (!prevBatchNo || !batchValues.has(prevBatchNo)) {
+		productForm.value.batchNo = "";
+	}
+
+	// 闇�瑕佷緵搴斿晢锛氭壒鍙峰洖鏄惧悗鍐嶇敓鎴�
+	productForm.value.customer = "";
+	supplierOptions.value = [];
+	if (productForm.value.batchNo) {
+		handleBatchNoChange(productForm.value.batchNo, prevCustomer);
+	}
+};
+
+const handleBatchNoChange = (batchNo, prevCustomer) => {
+	const safeBatchNo = String(batchNo ?? "").trim();
+	if (!safeBatchNo || !batchNodeByBatchNo.size) {
+		productForm.value.customer = "";
+		supplierOptions.value = [];
+		return;
+	}
+
+	const batchNode = batchNodeByBatchNo.get(String(safeBatchNo));
+	if (!batchNode) {
+		productForm.value.customer = "";
+		supplierOptions.value = [];
+		return;
+	}
+
+	// UID鐮佸彲鑳芥潵婧愪簬 batch 鑺傜偣锛堜笉鍚屾帴鍙e瓧娈靛悕涓嶄竴鑷存椂灏介噺鍏滃簳锛�
+	const nextUidNo = batchNode.uidNo ?? batchNode.identifierCode ?? batchNode.uid ?? "";
+	if (nextUidNo !== null && nextUidNo !== undefined && String(nextUidNo).trim() !== "") {
+		productForm.value.uidNo = nextUidNo;
+	}
+
+	const customers = (batchNode.children || [])
+		.filter((c) => c.nodeType === "customer")
+		.map((c) => c.customer ?? c.label ?? "")
+		.filter(Boolean);
+
+	const uniq = Array.from(new Set(customers));
+	supplierOptions.value = uniq.map((s) => ({ label: s, value: s }));
+
+	// 缂栬緫鍦烘櫙灏介噺鍥炴樉锛涙柊澧炲満鏅笉鍥炴樉
+	if (prevCustomer && uniq.includes(prevCustomer)) {
+		productForm.value.customer = prevCustomer;
 	} else {
-		productForm.value.specificationModel = null;
-		productForm.value.unit = null;
-		productForm.value.uidNo = null;
+		productForm.value.customer = "";
 	}
 };
-const findNodeById = (nodes, productId) => {
-	for (let i = 0; i < nodes.length; i++) {
-		if (nodes[i].value === productId) {
-			return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
-		}
-		if (nodes[i].children && nodes[i].children.length > 0) {
-			const foundNode = findNodeById(nodes[i].children, productId);
-			if (foundNode) {
-				return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
-			}
-		}
-	}
-	return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
-	return data.map((item) => {
-		const { id, children, ...rest } = item;
-		const newItem = {
-			...rest,
-			value: id, // 灏� id 鏀逛负 value
-		};
-		if (children && children.length > 0) {
-			newItem.children = convertIdToValue(children);
-		}
-		
-		return newItem;
-	});
-}
 // 鏍规嵁鍚嶇О鍙嶆煡浜у搧澶х被 id锛屼究浜庝粎瀛樺悕绉版椂鐨勫弽鏄�
 function findNodeIdByLabel(nodes, label) {
 	if (!label) return null;
@@ -1195,8 +1345,9 @@
 		return {
 			// 鍙拌处瀛楁
 			productCategory: p.product || p.productName || "",
+			productModelId: p.productModelId || "",
 			specificationModel: p.specification || "",
-      uidNo: p.uidNo || "",
+			uidNo: p.uidNo || "",
 			unit: p.unit || "",
 			quantity: quantity,
 			taxRate: taxRate,
@@ -1275,10 +1426,6 @@
 };
 
 const batchNoOptions = ref([]);
-const fetchBatchNoOptions = async () => {
-	const res = await getProductOrderBatchNoOptions();
-	batchNoOptions.value = res.data;
-};
 // 鍏抽棴寮规
 const closeDia = () => {
 	proxy.resetForm("formRef");
@@ -1302,25 +1449,44 @@
 		productIndex.value = index;
 		// 缂栬緫鏃舵牴鎹骇鍝佸ぇ绫诲悕绉板弽鏌� tree 鑺傜偣 id锛屽苟鍔犺浇瑙勬牸鍨嬪彿鍒楄〃
 		try {
-			const options = productOptions.value && productOptions.value.length > 0
-				? productOptions.value
-				: await getProductOptions();
-			const categoryId = findNodeIdByLabel(options, productForm.value.productCategory);
-			if (categoryId) {
-				const models = await modelList({ id: categoryId });
-				modelOptions.value = models || [];
-				// 鏍规嵁褰撳墠瑙勬牸鍨嬪彿鍚嶇О鍙嶆煡骞惰缃� productModelId锛屼究浜庝笅鎷夋鏄剧ず宸查�夊��
-				const currentModel = (modelOptions.value || []).find(
-					(m) => m.model === productForm.value.specificationModel
-				);
+			if (!productOptions.value || productOptions.value.length === 0) {
+				await getProductOptions();
+			}
+
+			// 鍥炴樉锛氭牴鎹�滀骇鍝佸ぇ绫烩�濆弽鏌ヤ骇鍝佽妭鐐�
+			const categoryKey = findNodeIdByLabel(productOptions.value, productForm.value.productCategory);
+			if (categoryKey) {
+				const categoryNode = findNodeObjByValue(stockInventoryAllTree, categoryKey);
+				const models = (categoryNode?.children || [])
+					.filter((n) => n.nodeType === "model")
+					.map((m) => ({
+						id: m.value,
+						model: m.model ?? m.label ?? "",
+						unit: m.unit ?? "",
+						uidNo: m.uidNo ?? m.identifierCode ?? "",
+					}));
+				modelOptions.value = models;
+
+				// 鏍规嵁褰撳墠瑙勬牸鍨嬪彿鍥炴樉
+				const targetSpec = String(productForm.value.specificationModel ?? "").trim();
+				const currentModel =
+					(models || []).find((m) => String(m.model ?? "").trim() === targetSpec) ||
+					(models || []).find((m) => String(m.model ?? "").trim().includes(targetSpec)) ||
+					(models || []).find((m) => targetSpec.includes(String(m.model ?? "").trim()));
 				if (currentModel) {
+					productForm.value.customer = productForm.value.customer || row.customer || row.supplierName || "";
 					productForm.value.productModelId = currentModel.id;
+					getProductModel(currentModel.id);
 				}
 			}
 		} catch (e) {
 			// 鍔犺浇澶辫触鏃朵繚鎸佸彲缂栬緫锛屼笉涓柇寮圭獥
 			console.error("鍔犺浇浜у搧瑙勬牸鍨嬪彿澶辫触", e);
 		}
+		// 鏈�缁堝厹搴曪細濡傛灉涓�旇閲嶇疆娓呯┖锛岃嚦灏戝洖鏄捐鏁版嵁閲岀殑 UID
+		productForm.value.uidNo = row.uidNo ?? productForm.value.uidNo ?? "";
+		// 鏈�缁堝厹搴曪細鍚屾牱淇濊瘉鍗曚綅涓嶄細鍥犳爲鏁版嵁缂哄け鑰岃瑕嗙洊涓虹┖
+		productForm.value.unit = row.unit ?? productForm.value.unit ?? "";
 	} else {
 		getProductOptions()
 	}
@@ -1732,6 +1898,7 @@
                   <th>浜у搧鍚嶇О</th>
                   <th>瑙勬牸鍨嬪彿</th>
                   <th>鍗曚綅</th>
+                  <th>UID鐮�</th>
                   <th>鍗曚环</th>
                   <th>闆跺敭鏁伴噺</th>
                   <th>闆跺敭閲戦</th>
@@ -1744,6 +1911,7 @@
                       <td>${product.productCategory || ''}</td>
                       <td>${product.specificationModel || ''}</td>
                       <td>${product.unit || ''}</td>
+                      <td>${product.uidNo || ''}</td>
                       <td>${product.taxInclusiveUnitPrice || '0'}</td>
                       <td>${product.quantity || '0'}</td>
                       <td>${product.taxInclusiveTotalPrice || '0'}</td>
@@ -2250,7 +2418,6 @@
 
 onMounted(() => {
 	getList();
-  fetchBatchNoOptions();
 	userListNoPage().then(res => {
 		userList.value = res.data;
 	})

--
Gitblit v1.9.3