From 2d95cc0f94335eee717406e7a777c1193a42081c Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期六, 25 四月 2026 15:00:34 +0800
Subject: [PATCH] 天津宝东 1.销售台账填完信息后,可以导出模版供客户直接盖章 2.销售台账打印报价单,可以多选销售订单,得相同公司名称,样式随意发挥 3.销售台账子表格产品的库存状态改为库存数量

---
 src/views/financialManagement/accounting/index.vue                                   |    2 
 src/api/basicData/product.js                                                         |    6 
 src/views/basicData/product/index.vue                                                |   18 
 src/views/qualityManagement/metricMaintenance/index0.vue                             |    2 
 src/views/qualityManagement/rawMaterialInspection/index.vue                          |    2 
 src/views/inventoryManagement/stockWarning/index.vue                                 |    6 
 src/views/productionManagement/productionDispatching/index.vue                       |    2 
 src/views/energyManagement/energyPower/index.vue                                     |    2 
 src/views/qualityManagement/finalInspection/index.vue                                |    2 
 src/views/equipmentManagement/ledger/Form.vue                                        |    6 
 src/views/qualityManagement/processInspection/index.vue                              |    2 
 src/views/productionManagement/productStructure/index.vue                            |    2 
 src/views/salesManagement/invoiceLedger/index.vue                                    |    2 
 src/views/collaborativeApproval/purchaseApproval/index.vue                           |    2 
 src/api/salesManagement/salesQuotationProduct.js                                     |   48 ++
 src/views/collaborativeApproval/shipmentReview/index.vue                             |    2 
 src/views/equipmentManagement/calibration/index.vue                                  |    2 
 src/views/equipmentManagement/ledger/index.vue                                       |    6 
 src/views/procurementManagement/purchaseReturnOrder/ProductList.vue                  |    2 
 src/views/procurementManagement/invoiceEntry/components/Modal.vue                    |    4 
 src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue |    2 
 src/views/procurementManagement/advancedPriceManagement/index.vue                    |    4 
 src/views/inventoryManagement/receiptManagement/Record.vue                           |    2 
 src/views/equipmentManagement/upkeep/index.vue                                       |    4 
 src/views/qualityManagement/processInspection/components/formDia.vue                 |    8 
 src/views/salesManagement/deliveryLedger/index.vue                                   |    2 
 src/views/equipmentManagement/operationManagement/index.vue                          |    2 
 src/views/energyManagement/waterManagement/waterBill.vue                             |    2 
 src/views/energyManagement/energyArea/index.vue                                      |    8 
 src/views/equipmentManagement/repair/Modal/RepairModal.vue                           |    6 
 src/views/salesManagement/strategyControl/index.vue                                  |    6 
 src/views/inventoryManagement/issueManagement/index.vue                              |    2 
 src/views/safeProduction/safeWorkApproval/components/approvalDia.vue                 |    4 
 src/views/salesManagement/salesQuotation/index.vue                                   |  543 +++++++++++++------------
 src/views/productionManagement/operationScheduling/index.vue                         |    2 
 src/views/energyManagement/gasManagement/index.vue                                   |    8 
 src/views/productionManagement/productStructure/StructureEdit.vue                    |    2 
 src/views/procurementManagement/procurementLedger/index.vue                          |    8 
 src/views/qualityManagement/nonconformingManagement/components/formDia.vue           |    2 
 src/views/productionManagement/productionDispatching/components/autoDispatchDia.vue  |    2 
 src/views/productionManagement/productionReporting/index.vue                         |    2 
 src/views/qualityManagement/rawMaterialInspection/components/formDia.vue             |    8 
 src/views/procurementManagement/purchaseReturnOrder/New.vue                          |    2 
 src/views/inventoryManagement/stockReport/index.vue                                  |    2 
 src/views/qualityManagement/nonconformingManagement/index.vue                        |    2 
 src/views/procurementManagement/procurementInvoiceLedger/index.vue                   |    2 
 src/views/customerService/feedbackRegistration/components/formDia.vue                |    2 
 src/views/equipmentManagement/measurementEquipment/components/rowClickData.vue       |    2 
 src/views/procurementManagement/qualityInspection/index.vue                          |    4 
 src/views/equipmentManagement/upkeep/Form/PlanModal.vue                              |    6 
 src/views/salesManagement/returnOrder/components/detailDia.vue                       |    2 
 src/views/productionManagement/productionDispatching/components/formDia.vue          |    4 
 src/views/procurementManagement/paymentEntry/index.vue                               |    4 
 src/views/salesManagement/salesLedger/index.vue                                      |  370 +++++++++++++----
 src/views/energyManagement/energyTrends/index.vue                                    |    2 
 src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue           |    4 
 src/views/inventoryManagement/dispatchLog/Record.vue                                 |    4 
 src/views/salesManagement/returnOrder/components/formDia.vue                         |    4 
 src/views/financialManagement/inventoryAccounting/index.vue                          |    2 
 src/views/projectManagement/Management/components/formDia.vue                        |    4 
 src/views/procurementManagement/purchaseReturnOrder/index.vue                        |    2 
 src/views/inventoryManagement/stockManagement/Record.vue                             |    2 
 src/views/inventoryManagement/stockManagement/Unqualified.vue                        |    2 
 src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue              |    2 
 src/views/procurementManagement/procurementReport/index.vue                          |    2 
 src/views/salesManagement/receiptPayment/index.vue                                   |    4 
 src/views/energyManagement/waterManagement/index.vue                                 |    2 
 src/views/energyManagement/waterManagement/waterTrends.vue                           |    2 
 src/views/qualityManagement/finalInspection/components/formDia.vue                   |    8 
 src/views/productionManagement/productionCosting/index.vue                           |    2 
 src/views/equipmentManagement/repair/index.vue                                       |    6 
 src/views/inventoryManagement/stockManagement/Qualified.vue                          |    2 
 src/views/procurementManagement/priceManagement/index.vue                            |    6 
 src/views/salesManagement/invoiceRegistration/index.vue                              |    4 
 src/utils/request.js                                                                 |   23 
 src/views/productionManagement/productStructure/Detail/index.vue                     |    2 
 src/views/equipmentManagement/deviceInfo/index.vue                                   |    2 
 src/views/projectManagement/Management/projectDetail.vue                             |    2 
 src/views/equipmentManagement/upkeep/Form/formDia.vue                                |    8 
 src/views/procurementManagement/transferManagement/index.vue                         |    2 
 80 files changed, 765 insertions(+), 491 deletions(-)

diff --git a/src/api/basicData/product.js b/src/api/basicData/product.js
index d29a064..8e6636f 100644
--- a/src/api/basicData/product.js
+++ b/src/api/basicData/product.js
@@ -17,7 +17,7 @@
         data: query
     })
 }
-// 瑙勬牸鍨嬪彿鏂板淇敼
+// 灏哄鏂板淇敼
 export function addOrEditProductModel(query) {
     return request({
         url: '/basic/product/addOrEditProductModel',
@@ -33,7 +33,7 @@
         data: query
     })
 }
-// 瑙勬牸鍨嬪彿鍒犻櫎
+// 灏哄鍒犻櫎
 export function delProductModel(query) {
     return request({
         url: '/basic/product/delProductModel',
@@ -41,7 +41,7 @@
         data: query
     })
 }
-// 瑙勬牸鍨嬪彿鏌ヨ
+// 灏哄鏌ヨ
 export function modelList(query) {
     return request({
         url: '/basic/product/modelList',
diff --git a/src/api/salesManagement/salesQuotationProduct.js b/src/api/salesManagement/salesQuotationProduct.js
new file mode 100644
index 0000000..99d60e0
--- /dev/null
+++ b/src/api/salesManagement/salesQuotationProduct.js
@@ -0,0 +1,48 @@
+import request from "@/utils/request";
+
+export function quotationProductListPage(query) {
+  return request({
+    url: "/sales/quotationProduct/listPage",
+    method: "get",
+    params: query,
+  });
+}
+
+export function quotationProductList(query) {
+  return request({
+    url: "/sales/quotationProduct/list",
+    method: "get",
+    params: query,
+  });
+}
+
+export function getQuotationProductInfo(id) {
+  return request({
+    url: `/sales/quotationProduct/${id}`,
+    method: "get",
+  });
+}
+
+export function addOrUpdateQuotationProduct(data) {
+  return request({
+    url: "/sales/quotationProduct/addOrUpdate",
+    method: "post",
+    data,
+  });
+}
+
+export function editQuotationProduct(data) {
+  return request({
+    url: "/sales/quotationProduct/edit",
+    method: "post",
+    data,
+  });
+}
+
+export function deleteQuotationProduct(ids) {
+  return request({
+    url: "/sales/quotationProduct/delete",
+    method: "delete",
+    data: ids,
+  });
+}
diff --git a/src/utils/request.js b/src/utils/request.js
index 9cfcf5b..ba31649 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -125,16 +125,25 @@
 // 閫氱敤涓嬭浇鏂规硶
 export function download(url, params, filename, config) {
   downloadLoadingInstance = ElLoading.service({ text: "姝e湪涓嬭浇鏁版嵁锛岃绋嶅��", background: "rgba(0, 0, 0, 0.7)", })
-  return service.post(url, params, {
-    transformRequest: [(params) => { return tansParams(params) }],
-    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
-    responseType: 'blob',
-    ...config
-  }).then(async (data) => {
+  const downloadName = config?.filename || filename
+  const requestMethod = (config?.method || 'post').toLowerCase()
+  const requestPromise = requestMethod === 'get'
+    ? service.get(url, {
+      params,
+      responseType: 'blob',
+      ...config
+    })
+    : service.post(url, params, {
+      transformRequest: [(params) => { return tansParams(params) }],
+      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+      responseType: 'blob',
+      ...config
+    })
+  return requestPromise.then(async (data) => {
     const isBlob = blobValidate(data)
     if (isBlob) {
       const blob = new Blob([data])
-      saveAs(blob, filename)
+      saveAs(blob, downloadName)
     } else {
       const resText = await data.text()
       const rspObj = JSON.parse(resText)
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index 10b51bf..85add2a 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -77,7 +77,7 @@
     <div class="right">
       <div style="margin-bottom: 10px" v-if="isShowButton">
         <el-button type="primary" @click="openModelDia('add')">
-          鏂板瑙勬牸鍨嬪彿
+          鏂板灏哄
         </el-button>
         <ImportExcel :product-id="currentId" @uploadSuccess="getModelList" />
         <el-button
@@ -132,7 +132,7 @@
     </el-dialog>
     <el-dialog
       v-model="modelDia"
-      title="瑙勬牸鍨嬪彿"
+      title="灏哄"
       width="400px"
       @close="closeModelDia"
       @keydown.enter.prevent
@@ -146,10 +146,10 @@
       >
         <el-row>
           <el-col :span="24">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
+            <el-form-item label="灏哄锛�" prop="model">
               <el-input
                 v-model="modelForm.model"
-                placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+                placeholder="璇疯緭鍏ュ昂瀵�"
                 clearable
                 @keydown.enter.prevent
               />
@@ -294,7 +294,7 @@
 const expandedKeys = ref([]);
 const tableColumn = ref([
   {
-    label: "瑙勬牸鍨嬪彿",
+    label: "灏哄",
     prop: "model",
   },
   {
@@ -397,7 +397,7 @@
     form.value.productName = data.productName;
   }
 };
-// 鎵撳紑瑙勬牸鍨嬪彿寮规
+// 鎵撳紑灏哄寮规
 const openModelDia = (type, data) => {
   modelOperationType.value = type;
   modelDia.value = true;
@@ -474,7 +474,7 @@
   getModelList();
 };
 
-// 鎻愪氦瑙勬牸鍨嬪彿淇敼
+// 鎻愪氦灏哄淇敼
 const submitModelForm = () => {
   proxy.$refs.modelFormRef.validate((valid) => {
     if (valid) {
@@ -497,7 +497,7 @@
   selectedRows.value = selection;
 };
 
-// 鏌ヨ瑙勬牸鍨嬪彿
+// 鏌ヨ灏哄
 const pagination = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
@@ -516,7 +516,7 @@
     tableLoading.value = false;
   });
 };
-// 鍒犻櫎瑙勬牸鍨嬪彿
+// 鍒犻櫎灏哄
 const handleDelete = () => {
   let ids = [];
   if (selectedRows.value.length > 0) {
diff --git a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
index 1269621..2b1f16a 100644
--- a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
+++ b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
@@ -71,7 +71,7 @@
                 <h4>浜у搧鏄庣粏</h4>
                 <el-table :data="currentQuotation.products || []" border style="width: 100%">
                   <el-table-column prop="product" label="浜у搧鍚嶇О" />
-                  <el-table-column prop="specification" 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>
@@ -119,7 +119,7 @@
                 <h4>浜у搧鏄庣粏</h4>
                 <el-table :data="currentPurchase.productData || []" border style="width: 100%">
                   <el-table-column prop="productCategory" label="浜у搧鍚嶇О" />
-                  <el-table-column prop="specificationModel" 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="鍚◣鍗曚环">
diff --git a/src/views/collaborativeApproval/purchaseApproval/index.vue b/src/views/collaborativeApproval/purchaseApproval/index.vue
index af17bbe..4b6b042 100644
--- a/src/views/collaborativeApproval/purchaseApproval/index.vue
+++ b/src/views/collaborativeApproval/purchaseApproval/index.vue
@@ -66,7 +66,7 @@
                 width="60"
               />
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
-              <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+              <el-table-column label="灏哄" prop="specificationModel" />
               <el-table-column label="鍗曚綅" prop="unit" />
               <el-table-column label="鏁伴噺" prop="quantity" />
               <el-table-column label="绋庣巼(%)" prop="taxRate" />
diff --git a/src/views/collaborativeApproval/shipmentReview/index.vue b/src/views/collaborativeApproval/shipmentReview/index.vue
index ac2b790..3121b1f 100644
--- a/src/views/collaborativeApproval/shipmentReview/index.vue
+++ b/src/views/collaborativeApproval/shipmentReview/index.vue
@@ -125,7 +125,7 @@
     width: 200
   },
   {
-    label: "瑙勬牸鍨嬪彿",
+    label: "灏哄",
     prop: "specificationModel",
     width: 220
   },
diff --git a/src/views/customerService/feedbackRegistration/components/formDia.vue b/src/views/customerService/feedbackRegistration/components/formDia.vue
index 1fe4eb6..994ee34 100644
--- a/src/views/customerService/feedbackRegistration/components/formDia.vue
+++ b/src/views/customerService/feedbackRegistration/components/formDia.vue
@@ -217,7 +217,7 @@
 
 const tableColumn = ref([
   { label: "浜у搧澶х被", prop: "productCategory" },
-  { label: "瑙勬牸鍨嬪彿", prop: "specificationModel" },
+  { label: "灏哄", prop: "specificationModel" },
   { label: "鍗曚綅", prop: "unit" },
   {
     label: "浜у搧鐘舵��",
diff --git a/src/views/energyManagement/energyArea/index.vue b/src/views/energyManagement/energyArea/index.vue
index 63feff8..6d24350 100644
--- a/src/views/energyManagement/energyArea/index.vue
+++ b/src/views/energyManagement/energyArea/index.vue
@@ -281,7 +281,7 @@
     form.value.areaName = data.areaName;
   }
 };
-// 鎵撳紑瑙勬牸鍨嬪彿寮规
+// 鎵撳紑灏哄寮规
 const openModelDia = (type, data,fatherId) => {
   modelOperationType.value = type;
   modelDia.value = true;
@@ -356,7 +356,7 @@
   getModelList(true);
 };
 
-// 鎻愪氦瑙勬牸鍨嬪彿淇敼
+// 鎻愪氦灏哄淇敼
 const submitModelForm = () => {
   proxy.$refs.modelFormRef.validate((valid) => {
     if (valid) {
@@ -380,7 +380,7 @@
   selectedRows.value = selection;
 };
 
-// 鏌ヨ瑙勬牸鍨嬪彿
+// 鏌ヨ灏哄
 const pagination = (obj) => {
   page.current = obj.page;
   page.size = obj.limit;
@@ -406,7 +406,7 @@
     tableLoading.value = false;
   });
 };
-// 鍒犻櫎瑙勬牸鍨嬪彿
+// 鍒犻櫎灏哄
 const handleDelete = () => {
   let ids = [];
   if (selectedRows.value.length > 0) {
diff --git a/src/views/energyManagement/energyPower/index.vue b/src/views/energyManagement/energyPower/index.vue
index 6311019..3b6eab6 100644
--- a/src/views/energyManagement/energyPower/index.vue
+++ b/src/views/energyManagement/energyPower/index.vue
@@ -106,7 +106,7 @@
 		width: 200,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "code",
 		width: 200,
 	},
diff --git a/src/views/energyManagement/energyTrends/index.vue b/src/views/energyManagement/energyTrends/index.vue
index 7f67be7..34b04ba 100644
--- a/src/views/energyManagement/energyTrends/index.vue
+++ b/src/views/energyManagement/energyTrends/index.vue
@@ -55,7 +55,7 @@
 		width: 220,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "code",
 		width: 220,
 	},
diff --git a/src/views/energyManagement/gasManagement/index.vue b/src/views/energyManagement/gasManagement/index.vue
index a9b9abe..8bed1f5 100644
--- a/src/views/energyManagement/gasManagement/index.vue
+++ b/src/views/energyManagement/gasManagement/index.vue
@@ -148,7 +148,7 @@
           <el-table-column label="璁惧缂栧彿" prop="deviceCode" width="120" show-overflow-tooltip />
           <el-table-column label="璁惧鍚嶇О" prop="deviceName" width="150" show-overflow-tooltip />
           <el-table-column label="璁惧绫诲瀷" prop="deviceType" width="120" show-overflow-tooltip />
-          <el-table-column label="瑙勬牸鍨嬪彿" prop="specification" width="150" show-overflow-tooltip />
+          <el-table-column label="灏哄" prop="specification" width="150" show-overflow-tooltip />
           <el-table-column label="褰撳墠鍘嬪姏(MPa)" prop="currentPressure" width="130" show-overflow-tooltip>
             <template #default="scope">
               <span :class="getPressureClass(scope.row.currentPressure)">
@@ -217,8 +217,8 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿" prop="specification">
-              <el-input v-model="deviceForm.specification" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
+            <el-form-item label="灏哄" prop="specification">
+              <el-input v-model="deviceForm.specification" placeholder="璇疯緭鍏ュ昂瀵�" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -284,7 +284,7 @@
   deviceCode: [{ required: true, message: '璇疯緭鍏ヨ澶囩紪鍙�', trigger: 'blur' }],
   deviceName: [{ required: true, message: '璇疯緭鍏ヨ澶囧悕绉�', trigger: 'blur' }],
   deviceType: [{ required: true, message: '璇烽�夋嫨璁惧绫诲瀷', trigger: 'change' }],
-  specification: [{ required: true, message: '璇疯緭鍏ヨ鏍煎瀷鍙�', trigger: 'blur' }],
+  specification: [{ required: true, message: '璇疯緭鍏ュ昂瀵�', trigger: 'blur' }],
   designPressure: [{ required: true, message: '璇疯緭鍏ヨ璁″帇鍔�', trigger: 'blur' }],
   volume: [{ required: true, message: '璇疯緭鍏ュ绉�', trigger: 'blur' }]
 }
diff --git a/src/views/energyManagement/waterManagement/index.vue b/src/views/energyManagement/waterManagement/index.vue
index 4ada029..24fac74 100644
--- a/src/views/energyManagement/waterManagement/index.vue
+++ b/src/views/energyManagement/waterManagement/index.vue
@@ -106,7 +106,7 @@
 		width: 200,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "deviceModel",
 		width: 200,
 	},
diff --git a/src/views/energyManagement/waterManagement/waterBill.vue b/src/views/energyManagement/waterManagement/waterBill.vue
index ea382f0..4bf5f47 100644
--- a/src/views/energyManagement/waterManagement/waterBill.vue
+++ b/src/views/energyManagement/waterManagement/waterBill.vue
@@ -59,7 +59,7 @@
 		width: 200,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "code",
 		width: 200,
 	},
diff --git a/src/views/energyManagement/waterManagement/waterTrends.vue b/src/views/energyManagement/waterManagement/waterTrends.vue
index 12e45fc..859cda4 100644
--- a/src/views/energyManagement/waterManagement/waterTrends.vue
+++ b/src/views/energyManagement/waterManagement/waterTrends.vue
@@ -51,7 +51,7 @@
 		width: 220,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "code",
 		width: 220,
 	},
diff --git a/src/views/equipmentManagement/calibration/index.vue b/src/views/equipmentManagement/calibration/index.vue
index e3eaef6..955013a 100644
--- a/src/views/equipmentManagement/calibration/index.vue
+++ b/src/views/equipmentManagement/calibration/index.vue
@@ -114,7 +114,7 @@
 		width: 200,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "model",
 		width:200
 	},
diff --git a/src/views/equipmentManagement/deviceInfo/index.vue b/src/views/equipmentManagement/deviceInfo/index.vue
index de162cc..5c17e68 100644
--- a/src/views/equipmentManagement/deviceInfo/index.vue
+++ b/src/views/equipmentManagement/deviceInfo/index.vue
@@ -15,7 +15,7 @@
           <span class="value">{{ deviceInfo.deviceName }}</span>
         </div>
         <div class="info-row">
-          <span class="label">瑙勬牸鍨嬪彿锛�</span>
+          <span class="label">灏哄锛�</span>
           <span class="value">{{ deviceInfo.deviceModel }}</span>
         </div>
         <div class="info-row">
diff --git a/src/views/equipmentManagement/ledger/Form.vue b/src/views/equipmentManagement/ledger/Form.vue
index 72d594e..2dbf6a9 100644
--- a/src/views/equipmentManagement/ledger/Form.vue
+++ b/src/views/equipmentManagement/ledger/Form.vue
@@ -7,8 +7,8 @@
         </el-form-item>
       </el-col>
       <el-col :span="12">
-        <el-form-item label="瑙勬牸鍨嬪彿" prop="deviceModel">
-          <el-input v-model="form.deviceModel" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
+        <el-form-item label="灏哄" prop="deviceModel">
+          <el-input v-model="form.deviceModel" placeholder="璇疯緭鍏ュ昂瀵�" />
         </el-form-item>
       </el-col>
       <el-col :span="12">
@@ -215,7 +215,7 @@
 
 const { form, resetForm } = useFormData({
   deviceName: undefined, // 璁惧鍚嶇О
-  deviceModel: undefined, // 瑙勬牸鍨嬪彿
+  deviceModel: undefined, // 灏哄
   deviceBrand: undefined, // 璁惧鍝佺墝
   type: undefined, // 璁惧绫诲瀷
   supplierName: undefined, // 渚涘簲鍟�
diff --git a/src/views/equipmentManagement/ledger/index.vue b/src/views/equipmentManagement/ledger/index.vue
index 7ba9401..e64bb6d 100644
--- a/src/views/equipmentManagement/ledger/index.vue
+++ b/src/views/equipmentManagement/ledger/index.vue
@@ -10,11 +10,11 @@
           @change="getTableData"
         />
       </el-form-item>
-      <el-form-item label="瑙勬牸鍨嬪彿">
+      <el-form-item label="灏哄">
         <el-input
             v-model="filters.deviceModel"
             style="width: 200px"
-            placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+            placeholder="璇疯緭鍏ュ昂瀵�"
             clearable
             @change="getTableData"
         />
@@ -174,7 +174,7 @@
       prop: "deviceName",
     },
     {
-      label: "瑙勬牸鍨嬪彿",
+      label: "灏哄",
       prop: "deviceModel",
     },
     {
diff --git a/src/views/equipmentManagement/measurementEquipment/components/rowClickData.vue b/src/views/equipmentManagement/measurementEquipment/components/rowClickData.vue
index 6604587..8a199a0 100644
--- a/src/views/equipmentManagement/measurementEquipment/components/rowClickData.vue
+++ b/src/views/equipmentManagement/measurementEquipment/components/rowClickData.vue
@@ -62,7 +62,7 @@
     width: 200,
   },
   {
-    label: "瑙勬牸鍨嬪彿",
+    label: "灏哄",
     prop: "model",
     width:200
   },
diff --git a/src/views/equipmentManagement/operationManagement/index.vue b/src/views/equipmentManagement/operationManagement/index.vue
index 008cc2c..97d57ff 100644
--- a/src/views/equipmentManagement/operationManagement/index.vue
+++ b/src/views/equipmentManagement/operationManagement/index.vue
@@ -34,7 +34,7 @@
           show-overflow-tooltip
         />
         <el-table-column
-          label="瑙勬牸鍨嬪彿"
+          label="灏哄"
           prop="deviceModel"
           show-overflow-tooltip
         />
diff --git a/src/views/equipmentManagement/repair/Modal/RepairModal.vue b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
index 1728b37..d6121a8 100644
--- a/src/views/equipmentManagement/repair/Modal/RepairModal.vue
+++ b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
@@ -22,10 +22,10 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="瑙勬牸鍨嬪彿">
+          <el-form-item label="灏哄">
             <el-input
               v-model="form.deviceModel"
-              placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+              placeholder="璇疯緭鍏ュ昂瀵�"
               disabled
             />
           </el-form-item>
@@ -115,7 +115,7 @@
 const { form, resetForm } = useFormData({
   deviceLedgerId: undefined, // 璁惧Id
   deviceName: undefined, // 璁惧鍚嶇О
-  deviceModel: undefined, // 瑙勬牸鍨嬪彿
+  deviceModel: undefined, // 灏哄
   repairTime: dayjs().format("YYYY-MM-DD"), // 鎶ヤ慨鏃ユ湡锛岄粯璁ゅ綋澶�
   repairName: userStore.nickName, // 鎶ヤ慨浜�
   remark: undefined, // 鏁呴殰鐜拌薄
diff --git a/src/views/equipmentManagement/repair/index.vue b/src/views/equipmentManagement/repair/index.vue
index 27d0acb..3e5c359 100644
--- a/src/views/equipmentManagement/repair/index.vue
+++ b/src/views/equipmentManagement/repair/index.vue
@@ -11,11 +11,11 @@
             @change="getTableData"
         />
       </el-form-item>
-      <el-form-item label="瑙勬牸鍨嬪彿">
+      <el-form-item label="灏哄">
         <el-input
             v-model="filters.deviceModel"
             style="width: 240px"
-            placeholder="璇烽�夋嫨瑙勬牸鍨嬪彿"
+            placeholder="璇烽�夋嫨灏哄"
             clearable
             :prefix-icon="Search"
             @change="getTableData"
@@ -183,7 +183,7 @@
         prop: "deviceName",
       },
       {
-        label: "瑙勬牸鍨嬪彿",
+        label: "灏哄",
         align: "center",
         prop: "deviceModel",
       },
diff --git a/src/views/equipmentManagement/upkeep/Form/PlanModal.vue b/src/views/equipmentManagement/upkeep/Form/PlanModal.vue
index 6fa6595..6164e00 100644
--- a/src/views/equipmentManagement/upkeep/Form/PlanModal.vue
+++ b/src/views/equipmentManagement/upkeep/Form/PlanModal.vue
@@ -25,10 +25,10 @@
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="瑙勬牸鍨嬪彿">
+      <el-form-item label="灏哄">
         <el-input
           v-model="form.deviceModel"
-          placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+          placeholder="璇疯緭鍏ュ昂瀵�"
           disabled
         />
       </el-form-item>
@@ -110,7 +110,7 @@
 const { form, resetForm } = useFormData({
   deviceLedgerId: undefined, // 璁惧Id
   deviceName: undefined, // 璁惧鍚嶇О
-  deviceModel: undefined, // 瑙勬牸鍨嬪彿
+  deviceModel: undefined, // 灏哄
   maintenancePlanTime: undefined, // 璁″垝淇濆吇鏃ユ湡
   createUser: undefined, // 褰曞叆浜�
   status: 0, //淇濅慨鐘舵��
diff --git a/src/views/equipmentManagement/upkeep/Form/formDia.vue b/src/views/equipmentManagement/upkeep/Form/formDia.vue
index 66bf067..b8354c8 100644
--- a/src/views/equipmentManagement/upkeep/Form/formDia.vue
+++ b/src/views/equipmentManagement/upkeep/Form/formDia.vue
@@ -23,10 +23,10 @@
 					</el-form-item>
 				</el-col>
 				<el-col :span="12">
-					<el-form-item label="瑙勬牸鍨嬪彿">
+					<el-form-item label="灏哄">
 						<el-input
 							v-model="form.deviceModel"
-							placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+							placeholder="璇疯緭鍏ュ昂瀵�"
 							disabled
 						/>
 					</el-form-item>
@@ -159,7 +159,7 @@
 		frequencyDetail: '',
 		week: '',
 		time: '',
-		deviceModel: undefined, // 瑙勬牸鍨嬪彿
+		deviceModel: undefined, // 灏哄
 		registrationDate: ''
 	},
 	rules: {
@@ -176,7 +176,7 @@
 	deviceOptions.value = data;
 };
 
-// 閫夋嫨璁惧鏃讹紝鍥炲~璁惧鍚嶇О(taskName)鍜岃鏍煎瀷鍙�(deviceModel)
+// 閫夋嫨璁惧鏃讹紝鍥炲~璁惧鍚嶇О(taskName)鍜屽昂瀵�(deviceModel)
 const setDeviceModel = (id) => {
 	const option = deviceOptions.value.find((item) => item.id === id);
 	if (option) {
diff --git a/src/views/equipmentManagement/upkeep/index.vue b/src/views/equipmentManagement/upkeep/index.vue
index 1e65663..4f239a3 100644
--- a/src/views/equipmentManagement/upkeep/index.vue
+++ b/src/views/equipmentManagement/upkeep/index.vue
@@ -301,7 +301,7 @@
 const scheduledColumns = ref([
 	{ prop: "taskName", label: "璁惧鍚嶇О"},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "deviceModel",
 	},
 	{
@@ -357,7 +357,7 @@
 		prop: "deviceName",
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		align: "center",
 		prop: "deviceModel",
 	},
diff --git a/src/views/financialManagement/accounting/index.vue b/src/views/financialManagement/accounting/index.vue
index ea858e1..b1803c8 100644
--- a/src/views/financialManagement/accounting/index.vue
+++ b/src/views/financialManagement/accounting/index.vue
@@ -157,7 +157,7 @@
         >
           <el-table-column type="index" label="搴忓彿" width="60" :index="(index) => (pagination.currentPage - 1) * pagination.pageSize + index + 1" />
           <el-table-column prop="deviceName" label="璁惧鍚嶇О" width="250" />
-          <el-table-column prop="deviceModel" label="瑙勬牸鍨嬪彿" min-width="150" />
+          <el-table-column prop="deviceModel" label="灏哄" min-width="150" />
           <el-table-column prop="supplierName" label="渚涘簲鍟�" min-width="120" />
           <el-table-column prop="unit" label="鍗曚綅" width="120" />
           <el-table-column prop="number" label="鏁伴噺" width="120" />
diff --git a/src/views/financialManagement/inventoryAccounting/index.vue b/src/views/financialManagement/inventoryAccounting/index.vue
index 3acf5d9..6125c0f 100644
--- a/src/views/financialManagement/inventoryAccounting/index.vue
+++ b/src/views/financialManagement/inventoryAccounting/index.vue
@@ -103,7 +103,7 @@
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
         <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="240" show-overflow-tooltip />
         <el-table-column label="浜у搧" prop="productCategory" min-width="100" show-overflow-tooltip />
-        <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" min-width="200" show-overflow-tooltip />
+        <el-table-column label="灏哄" prop="specificationModel" min-width="200" show-overflow-tooltip />
         <el-table-column label="鍗曚綅" prop="unit" width="70" show-overflow-tooltip />
         <el-table-column label="鍏ュ簱鏁伴噺" prop="inboundNum" width="90" show-overflow-tooltip />
         <el-table-column label="搴撳瓨鏁伴噺" prop="inboundNum0" width="90" show-overflow-tooltip />
diff --git a/src/views/inventoryManagement/dispatchLog/Record.vue b/src/views/inventoryManagement/dispatchLog/Record.vue
index a7a8a4b..c2b29cc 100644
--- a/src/views/inventoryManagement/dispatchLog/Record.vue
+++ b/src/views/inventoryManagement/dispatchLog/Record.vue
@@ -62,7 +62,7 @@
 					show-overflow-tooltip
 				/>
 				<el-table-column
-					label="瑙勬牸鍨嬪彿"
+					label="灏哄"
 					prop="model"
 					show-overflow-tooltip
 				/>
@@ -430,7 +430,7 @@
               <thead>
                 <tr>
                   <th>浜у搧鍚嶇О</th>
-                  <th>瑙勬牸鍨嬪彿</th>
+                  <th>灏哄</th>
                   <th>鍗曚綅</th>
                   <th>鍗曚环</th>
                   <th>闆跺敭鏁伴噺</th>
diff --git a/src/views/inventoryManagement/issueManagement/index.vue b/src/views/inventoryManagement/issueManagement/index.vue
index 2bba7d0..5d20726 100644
--- a/src/views/inventoryManagement/issueManagement/index.vue
+++ b/src/views/inventoryManagement/issueManagement/index.vue
@@ -33,7 +33,7 @@
         <el-table-column label="鍏ュ簱鎵规" prop="inboundBatches" width="160" show-overflow-tooltip />
         <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="240" show-overflow-tooltip />
         <el-table-column label="浜у搧澶х被" prop="productCategory" width="100" show-overflow-tooltip />
-        <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="200" show-overflow-tooltip />
+        <el-table-column label="灏哄" prop="specificationModel" width="200" show-overflow-tooltip />
         <el-table-column label="鍗曚綅" prop="unit" width="70" show-overflow-tooltip />
         <el-table-column label="鍏ュ簱鏁伴噺" prop="inboundNum" width="90" show-overflow-tooltip />
         <el-table-column label="搴撳瓨鏁伴噺" prop="inboundNum0" width="90" show-overflow-tooltip />
diff --git a/src/views/inventoryManagement/receiptManagement/Record.vue b/src/views/inventoryManagement/receiptManagement/Record.vue
index 3f90edf..446a31b 100644
--- a/src/views/inventoryManagement/receiptManagement/Record.vue
+++ b/src/views/inventoryManagement/receiptManagement/Record.vue
@@ -64,7 +64,7 @@
         <el-table-column label="浜у搧澶х被"
                          prop="productName"
                          show-overflow-tooltip/>
-        <el-table-column label="瑙勬牸鍨嬪彿"
+        <el-table-column label="灏哄"
                          prop="model"
                          show-overflow-tooltip/>
         <el-table-column label="鍗曚綅"
diff --git a/src/views/inventoryManagement/stockManagement/Qualified.vue b/src/views/inventoryManagement/stockManagement/Qualified.vue
index a958f42..f620987 100644
--- a/src/views/inventoryManagement/stockManagement/Qualified.vue
+++ b/src/views/inventoryManagement/stockManagement/Qualified.vue
@@ -24,7 +24,7 @@
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
         <el-table-column label="浜у搧澶х被" prop="productName" show-overflow-tooltip />
-        <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
+        <el-table-column label="灏哄" prop="model" 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 />
diff --git a/src/views/inventoryManagement/stockManagement/Record.vue b/src/views/inventoryManagement/stockManagement/Record.vue
index 4f9537f..ee9102e 100644
--- a/src/views/inventoryManagement/stockManagement/Record.vue
+++ b/src/views/inventoryManagement/stockManagement/Record.vue
@@ -24,7 +24,7 @@
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
         <el-table-column label="浜у搧澶х被" prop="productName" show-overflow-tooltip />
-        <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
+        <el-table-column label="灏哄" prop="model" show-overflow-tooltip />
         <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
         <el-table-column label="鍚堟牸搴撳瓨鏁伴噺" prop="qualifiedQuantity" show-overflow-tooltip />
         <el-table-column label="涓嶅悎鏍煎簱瀛樻暟閲�" prop="unQualifiedQuantity" show-overflow-tooltip />
diff --git a/src/views/inventoryManagement/stockManagement/Unqualified.vue b/src/views/inventoryManagement/stockManagement/Unqualified.vue
index 55662be..8c5150c 100644
--- a/src/views/inventoryManagement/stockManagement/Unqualified.vue
+++ b/src/views/inventoryManagement/stockManagement/Unqualified.vue
@@ -21,7 +21,7 @@
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
         <el-table-column label="浜у搧澶х被" prop="productName" show-overflow-tooltip />
-        <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
+        <el-table-column label="灏哄" prop="model" 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 />
diff --git a/src/views/inventoryManagement/stockReport/index.vue b/src/views/inventoryManagement/stockReport/index.vue
index 89773cf..b20cb7d 100644
--- a/src/views/inventoryManagement/stockReport/index.vue
+++ b/src/views/inventoryManagement/stockReport/index.vue
@@ -181,7 +181,7 @@
              show-overflow-tooltip
            />
            <el-table-column
-             label="瑙勬牸鍨嬪彿"
+             label="灏哄"
              prop="model"
              show-overflow-tooltip
            />
diff --git a/src/views/inventoryManagement/stockWarning/index.vue b/src/views/inventoryManagement/stockWarning/index.vue
index b5216cb..cccb67a 100644
--- a/src/views/inventoryManagement/stockWarning/index.vue
+++ b/src/views/inventoryManagement/stockWarning/index.vue
@@ -59,7 +59,7 @@
         <el-table-column label="鍌ㄦ皵缃愮紪鐮�" prop="tankCode" width="120" show-overflow-tooltip />
         <el-table-column label="鍌ㄦ皵缃愬悕绉�" prop="tankName" width="200" show-overflow-tooltip />
         <el-table-column label="鍌ㄦ皵缃愮被鍨�" prop="tankType" width="120" show-overflow-tooltip />
-        <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="150" show-overflow-tooltip />
+        <el-table-column label="灏哄" prop="specificationModel" width="150" show-overflow-tooltip />
         <el-table-column label="瀹圭Н(m鲁)" prop="volume" width="100" show-overflow-tooltip />
 
         <!-- 搴撳瓨鐩稿叧瀛楁 -->
@@ -171,8 +171,8 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="specificationModel">
-              <el-input v-model="form.specificationModel" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
+            <el-form-item label="灏哄锛�" prop="specificationModel">
+              <el-input v-model="form.specificationModel" placeholder="璇疯緭鍏ュ昂瀵�" />
             </el-form-item>
           </el-col>
         </el-row>
diff --git a/src/views/procurementManagement/advancedPriceManagement/index.vue b/src/views/procurementManagement/advancedPriceManagement/index.vue
index 84bd160..864b151 100644
--- a/src/views/procurementManagement/advancedPriceManagement/index.vue
+++ b/src/views/procurementManagement/advancedPriceManagement/index.vue
@@ -157,8 +157,8 @@
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿" prop="specification">
-              <el-input v-model="formData.specification" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
+            <el-form-item label="灏哄" prop="specification">
+              <el-input v-model="formData.specification" placeholder="璇疯緭鍏ュ昂瀵�" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
diff --git a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue b/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
index d329768..1ef94bd 100644
--- a/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
+++ b/src/views/procurementManagement/invoiceEntry/components/ExpandTable.vue
@@ -42,7 +42,7 @@
       prop: "productCategory",
     },
     {
-      label: "瑙勬牸鍨嬪彿",
+      label: "灏哄",
       prop: "specificationModel",
     },
     {
diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
index 33d5144..1ddfc16 100644
--- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue
+++ b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
@@ -112,7 +112,7 @@
 					</template>
 				</el-table-column>
 				<el-table-column label="浜у搧澶х被" prop="productCategory" />
-				<el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="150" />
+				<el-table-column label="灏哄" prop="specificationModel" width="150" />
 				<el-table-column label="鍗曚綅" prop="unit" width="70" />
 				<el-table-column label="鏁伴噺" prop="quantity" width="70" />
 				<el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
@@ -264,7 +264,7 @@
 		width: 120,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "specificationModel",
 		width: 120,
 	},
diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
index 73c5a1a..f283dff 100644
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ b/src/views/procurementManagement/paymentEntry/index.vue
@@ -150,7 +150,7 @@
           width="100"
         />
         <el-table-column
-          label="瑙勬牸鍨嬪彿"
+          label="灏哄"
           prop="specificationModel"
           show-overflow-tooltip
           width="150"
@@ -280,7 +280,7 @@
 		showOverflowTooltip: true,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "specificationModel",
 		showOverflowTooltip: true,
 		width: 150
diff --git a/src/views/procurementManagement/priceManagement/index.vue b/src/views/procurementManagement/priceManagement/index.vue
index 76a39ed..2856fee 100644
--- a/src/views/procurementManagement/priceManagement/index.vue
+++ b/src/views/procurementManagement/priceManagement/index.vue
@@ -31,7 +31,7 @@
       <el-table :data="tableData" border v-loading="loading" @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55" align="center" />
         <el-table-column label="鍟嗗搧鍚嶇О" prop="productName" />
-        <el-table-column label="瑙勬牸鍨嬪彿" prop="specification" />
+        <el-table-column label="灏哄" prop="specification" />
         <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" />
         <el-table-column label="鍘熶环鏍�" prop="oldPrice" width="120">
           <template #default="{ row }">楼{{ row.oldPrice.toFixed(2) }}</template>
@@ -71,8 +71,8 @@
             <el-option label="鍟嗗搧C" value="鍟嗗搧C" />
           </el-select>
         </el-form-item>
-        <el-form-item label="瑙勬牸鍨嬪彿">
-          <el-input v-model="formData.specification" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
+        <el-form-item label="灏哄">
+          <el-input v-model="formData.specification" placeholder="璇疯緭鍏ュ昂瀵�" />
         </el-form-item>
         <el-form-item label="渚涘簲鍟嗗悕绉�">
           <el-select v-model="formData.supplierName" placeholder="璇烽�夋嫨渚涘簲鍟�" style="width: 100%">
diff --git a/src/views/procurementManagement/procurementInvoiceLedger/index.vue b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
index d82e3e7..1578429 100644
--- a/src/views/procurementManagement/procurementInvoiceLedger/index.vue
+++ b/src/views/procurementManagement/procurementInvoiceLedger/index.vue
@@ -171,7 +171,7 @@
       width: 150,
     },
     {
-      label: "瑙勬牸鍨嬪彿",
+      label: "灏哄",
       prop: "specificationModel",
       width: 150,
     },
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 1c8f564..924e2a9 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -84,7 +84,7 @@
                                width="60" />
               <el-table-column label="浜у搧澶х被"
                                prop="productCategory" />
-              <el-table-column label="瑙勬牸鍨嬪彿"
+              <el-table-column label="灏哄"
                                prop="specificationModel" />
               <el-table-column label="鍗曚綅"
                                prop="unit" />
@@ -362,7 +362,7 @@
                            width="60" />
           <el-table-column label="浜у搧澶х被"
                            prop="productCategory" />
-          <el-table-column label="瑙勬牸鍨嬪彿"
+          <el-table-column label="灏哄"
                            prop="specificationModel" />
           <el-table-column label="鍗曚綅"
                            prop="unit"
@@ -513,7 +513,7 @@
         </el-row>
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�"
+            <el-form-item label="灏哄锛�"
                           prop="productModelId">
               <el-select v-model="productForm.productModelId"
                          placeholder="璇烽�夋嫨"
@@ -1422,7 +1422,7 @@
             );
             if (modelItem) {
               productForm.value.productModelId = modelItem.id;
-              // 璁剧疆瑙勬牸鍨嬪彿鍜屽崟浣�
+              // 璁剧疆灏哄鍜屽崟浣�
               getProductModel(modelItem.id);
             }
           }
diff --git a/src/views/procurementManagement/procurementReport/index.vue b/src/views/procurementManagement/procurementReport/index.vue
index 4ba1802..25998fe 100644
--- a/src/views/procurementManagement/procurementReport/index.vue
+++ b/src/views/procurementManagement/procurementReport/index.vue
@@ -111,7 +111,7 @@
     prop: 'productCategory',
   },
   {
-    label: '瑙勬牸鍨嬪彿',
+    label: '灏哄',
     prop: 'specificationModel',
   },
   {
diff --git a/src/views/procurementManagement/purchaseReturnOrder/New.vue b/src/views/procurementManagement/purchaseReturnOrder/New.vue
index dffdeea..ca0ebe9 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/New.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/New.vue
@@ -242,7 +242,7 @@
                                width="60" />
               <el-table-column label="浜у搧澶х被"
                                prop="productCategory" />
-              <el-table-column label="瑙勬牸鍨嬪彿"
+              <el-table-column label="灏哄"
                                prop="specificationModel" />
               <el-table-column label="鍗曚綅"
                                prop="unit"
diff --git a/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue b/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
index 3eeb167..f018047 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/ProductList.vue
@@ -19,7 +19,7 @@
                            width="60" />
           <el-table-column label="浜у搧澶х被"
                            prop="productCategory" />
-          <el-table-column label="瑙勬牸鍨嬪彿"
+          <el-table-column label="灏哄"
                            prop="specificationModel" />
           <el-table-column label="鍗曚綅"
                            prop="unit"
diff --git a/src/views/procurementManagement/purchaseReturnOrder/index.vue b/src/views/procurementManagement/purchaseReturnOrder/index.vue
index cd2c7f4..bae6dd7 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/index.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/index.vue
@@ -79,7 +79,7 @@
         >
           <el-table-column align="center" label="搴忓彿" type="index" width="60" />
           <el-table-column label="浜у搧澶х被" prop="productCategory" min-width="120" show-overflow-tooltip />
-          <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" min-width="140" show-overflow-tooltip />
+          <el-table-column label="灏哄" prop="specificationModel" min-width="140" show-overflow-tooltip />
           <el-table-column label="鍗曚綅" prop="unit" width="80" />
           <el-table-column label="鏁伴噺" prop="quantity" width="80" />
           <el-table-column label="閫�璐ф暟閲�" prop="returnQuantity" width="100" />
diff --git a/src/views/procurementManagement/qualityInspection/index.vue b/src/views/procurementManagement/qualityInspection/index.vue
index ab19d6f..d4a2c54 100644
--- a/src/views/procurementManagement/qualityInspection/index.vue
+++ b/src/views/procurementManagement/qualityInspection/index.vue
@@ -75,9 +75,9 @@
                   <el-input v-model="row.productName" placeholder="璇疯緭鍏ュ晢鍝佸悕绉�" />
                 </template>
               </el-table-column>
-              <el-table-column label="瑙勬牸鍨嬪彿" width="150">
+              <el-table-column label="灏哄" width="150">
                 <template #default="{ row }">
-                  <el-input v-model="row.specification" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" />
+                  <el-input v-model="row.specification" placeholder="璇疯緭鍏ュ昂瀵�" />
                 </template>
               </el-table-column>
               <el-table-column label="鍒拌揣鏁伴噺" width="150">
diff --git a/src/views/procurementManagement/transferManagement/index.vue b/src/views/procurementManagement/transferManagement/index.vue
index 3646449..50ee885 100644
--- a/src/views/procurementManagement/transferManagement/index.vue
+++ b/src/views/procurementManagement/transferManagement/index.vue
@@ -90,7 +90,7 @@
               width="60"
           />
           <el-table-column label="浜у搧澶х被" prop="productCategory" />
-          <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+          <el-table-column label="灏哄" prop="specificationModel" />
           <el-table-column label="鍗曚綅" prop="unit" width="70" />
           <el-table-column label="渚涘簲鍟�" prop="supplierName" width="100" />
           <el-table-column label="閲囪喘鏁伴噺" prop="quantity" width="100" />
diff --git a/src/views/productionManagement/operationScheduling/index.vue b/src/views/productionManagement/operationScheduling/index.vue
index a9c06fb..4244bc2 100644
--- a/src/views/productionManagement/operationScheduling/index.vue
+++ b/src/views/productionManagement/operationScheduling/index.vue
@@ -133,7 +133,7 @@
 		width: 150,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "specificationModel",
 		width: 150,
 	},
diff --git a/src/views/productionManagement/productStructure/Detail/index.vue b/src/views/productionManagement/productStructure/Detail/index.vue
index 832c121..86ea952 100644
--- a/src/views/productionManagement/productStructure/Detail/index.vue
+++ b/src/views/productionManagement/productStructure/Detail/index.vue
@@ -143,7 +143,7 @@
                        prop="bomNo" />
       <el-table-column label="浜у搧鍚嶇О"
                        prop="productName" />
-      <el-table-column label="瑙勬牸鍨嬪彿"
+      <el-table-column label="灏哄"
                        prop="model" />
     </el-table>
     <product-select-dialog v-if="dataValue.showProductDialog"
diff --git a/src/views/productionManagement/productStructure/StructureEdit.vue b/src/views/productionManagement/productStructure/StructureEdit.vue
index 4d07f5d..40e9cf5 100644
--- a/src/views/productionManagement/productStructure/StructureEdit.vue
+++ b/src/views/productionManagement/productStructure/StructureEdit.vue
@@ -156,7 +156,7 @@
       </el-table-column>
       <el-table-column label="浜у搧缂栫爜" prop="productCode" />
       <el-table-column label="浜у搧鍚嶇О" prop="productName" />
-      <el-table-column label="瑙勬牸鍨嬪彿" prop="model" />
+      <el-table-column label="灏哄" prop="model" />
       <el-table-column label="鍗曚綅" prop="unit" />
     </el-table>
 
diff --git a/src/views/productionManagement/productStructure/index.vue b/src/views/productionManagement/productStructure/index.vue
index bc5a538..d6ec9a1 100644
--- a/src/views/productionManagement/productStructure/index.vue
+++ b/src/views/productionManagement/productStructure/index.vue
@@ -80,7 +80,7 @@
     minWidth: 160
   },
   {
-    label: "瑙勬牸鍨嬪彿",
+    label: "灏哄",
     prop: "productModelName",
     minWidth: 140
   },
diff --git a/src/views/productionManagement/productionCosting/index.vue b/src/views/productionManagement/productionCosting/index.vue
index fc93570..3376970 100644
--- a/src/views/productionManagement/productionCosting/index.vue
+++ b/src/views/productionManagement/productionCosting/index.vue
@@ -100,7 +100,7 @@
     minWidth: 100,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "productModelName",
     minWidth: 100,
 	},
diff --git a/src/views/productionManagement/productionDispatching/components/autoDispatchDia.vue b/src/views/productionManagement/productionDispatching/components/autoDispatchDia.vue
index b4a76f6..a3a838e 100644
--- a/src/views/productionManagement/productionDispatching/components/autoDispatchDia.vue
+++ b/src/views/productionManagement/productionDispatching/components/autoDispatchDia.vue
@@ -20,7 +20,7 @@
           <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" width="200" />
           <!-- <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="250" /> -->
           <el-table-column label="浜у搧澶х被" prop="productCategory" width="150" />
-          <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="200" />
+          <el-table-column label="灏哄" prop="specificationModel" width="200" />
           <el-table-column label="缁戝畾鏈哄櫒" prop="speculativeTradingName" width="120" />
           <el-table-column label="鎬绘暟閲�" prop="quantity" width="100" align="right" />
           <el-table-column label="宸叉帓浜�" prop="schedulingNum" width="100" align="right" fixed="right" />
diff --git a/src/views/productionManagement/productionDispatching/components/formDia.vue b/src/views/productionManagement/productionDispatching/components/formDia.vue
index a514d9a..e5e5908 100644
--- a/src/views/productionManagement/productionDispatching/components/formDia.vue
+++ b/src/views/productionManagement/productionDispatching/components/formDia.vue
@@ -21,7 +21,7 @@
         </el-row> -->
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="specificationModel">
+            <el-form-item label="灏哄锛�" prop="specificationModel">
               <el-input v-model="form.specificationModel" placeholder="璇疯緭鍏�" clearable disabled/>
             </el-form-item>
           </el-col>
@@ -125,7 +125,7 @@
   form: {
 		projectName: "",
 		productCategory: "",
-		specificationModel: "", // 瑙勬牸鍨嬪彿
+		specificationModel: "", // 灏哄
 		quantity: "",
 		schedulingNum: "",
 		schedulingUserId: "",
diff --git a/src/views/productionManagement/productionDispatching/index.vue b/src/views/productionManagement/productionDispatching/index.vue
index 2d39890..7f6cdf4 100644
--- a/src/views/productionManagement/productionDispatching/index.vue
+++ b/src/views/productionManagement/productionDispatching/index.vue
@@ -128,7 +128,7 @@
 		width: 160,
 	},
 	{
-		label: "瑙勬牸鍨嬪彿",
+		label: "灏哄",
 		prop: "specificationModel",
 		width: 120,
 	},
diff --git a/src/views/productionManagement/productionReporting/index.vue b/src/views/productionManagement/productionReporting/index.vue
index 8490b85..c0e661b 100644
--- a/src/views/productionManagement/productionReporting/index.vue
+++ b/src/views/productionManagement/productionReporting/index.vue
@@ -183,7 +183,7 @@
       width: 120,
     },
     {
-      label: "浜у搧瑙勬牸鍨嬪彿",
+      label: "浜у搧灏哄",
       prop: "productModelName",
       width: 120,
     },
diff --git a/src/views/projectManagement/Management/components/formDia.vue b/src/views/projectManagement/Management/components/formDia.vue
index f29512b..e84ae64 100644
--- a/src/views/projectManagement/Management/components/formDia.vue
+++ b/src/views/projectManagement/Management/components/formDia.vue
@@ -192,7 +192,7 @@
             <el-table-column v-if="!isView" align="center" type="selection" width="55" />
             <el-table-column align="center" label="搴忓彿" type="index" width="60" />
             <el-table-column label="浜у搧澶х被" prop="productCategory" />
-            <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+            <el-table-column label="灏哄" prop="specificationModel" />
             <el-table-column label="鍗曚綅" prop="unit" />
             <el-table-column label="鏁伴噺" prop="quantity" />
             <el-table-column label="绋庣巼(%)" prop="taxRate" />
@@ -555,7 +555,7 @@
       </el-row>
       <el-row :gutter="30">
         <el-col :span="24">
-          <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
+          <el-form-item label="灏哄锛�" prop="productModelId">
             <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable filterable @change="getProductModel">
               <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
             </el-select>
diff --git a/src/views/projectManagement/Management/projectDetail.vue b/src/views/projectManagement/Management/projectDetail.vue
index c54a389..bb0bbcb 100644
--- a/src/views/projectManagement/Management/projectDetail.vue
+++ b/src/views/projectManagement/Management/projectDetail.vue
@@ -64,7 +64,7 @@
           <el-table :data="productRows" border show-summary :summary-method="summarizeProductTable">
             <el-table-column align="center" label="搴忓彿" type="index" width="60" />
             <el-table-column label="浜у搧澶х被" prop="productCategory" show-overflow-tooltip />
-            <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" show-overflow-tooltip />
+            <el-table-column label="灏哄" prop="specificationModel" show-overflow-tooltip />
             <el-table-column label="鍗曚綅" prop="unit" width="90" />
             <el-table-column label="鏁伴噺" prop="quantity" width="90" />
             <el-table-column label="绋庣巼(%)" prop="taxRate" width="90" />
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 5f4c975..91abf02 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -24,7 +24,7 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
+            <el-form-item label="灏哄锛�" prop="productModelId">
               <el-select v-model="form.productModelId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'edit'"
                          filterable readonly @change="handleChangeModel">
                 <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
@@ -235,12 +235,12 @@
       proxy.$refs.formRef?.clearValidate();
     });
     
-    // 缂栬緫妯″紡涓嬶紝骞惰鍔犺浇瑙勬牸鍨嬪彿鍜屾寚鏍囬�夐」
+    // 缂栬緫妯″紡涓嬶紝骞惰鍔犺浇灏哄鍜屾寚鏍囬�夐」
     if (currentProductId.value) {
       // 璁剧疆浜у搧鍚嶇О
       form.value.productName = findNodeById(productOptions.value, currentProductId.value);
       
-      // 骞惰鍔犺浇瑙勬牸鍨嬪彿鍜屾寚鏍囬�夐」
+      // 骞惰鍔犺浇灏哄鍜屾寚鏍囬�夐」
       const params = {
         productId: currentProductId.value,
         inspectType: 2
@@ -250,7 +250,7 @@
         modelList({ id: currentProductId.value }),
         qualityInspectDetailByProductId(params)
       ]).then(([modelRes, testStandardRes]) => {
-        // 璁剧疆瑙勬牸鍨嬪彿閫夐」
+        // 璁剧疆灏哄閫夐」
         modelOptions.value = modelRes || [];
         // 濡傛灉琛ㄥ崟涓凡鏈� productModelId锛岃缃搴旂殑 model 鍜� unit
         if (form.value.productModelId && modelOptions.value.length > 0) {
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
index eaed2e9..461f1e3 100644
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ b/src/views/qualityManagement/finalInspection/index.vue
@@ -115,7 +115,7 @@
     prop: "productName",
   },
   {
-    label: "瑙勬牸鍨嬪彿",
+    label: "灏哄",
     prop: "model",
   },
   {
diff --git a/src/views/qualityManagement/metricMaintenance/index0.vue b/src/views/qualityManagement/metricMaintenance/index0.vue
index 016a4c1..0d34d45 100644
--- a/src/views/qualityManagement/metricMaintenance/index0.vue
+++ b/src/views/qualityManagement/metricMaintenance/index0.vue
@@ -350,7 +350,7 @@
   });
 };
 
-// 鎻愪氦瑙勬牸鍨嬪彿淇敼
+// 鎻愪氦灏哄淇敼
 const submitModelForm = () => {
   proxy.$refs.modelFormRef.validate((valid) => {
     if (valid) {
diff --git a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
index 0c6562c..7fab7a6 100644
--- a/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
+++ b/src/views/qualityManagement/nonconformingManagement/components/formDia.vue
@@ -34,7 +34,7 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
+            <el-form-item label="灏哄锛�" prop="model">
               <el-select v-model="form.model" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'edit'"
                           filterable readonly @change="handleChangeModel">
               <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
diff --git a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue b/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
index 8f4492a..97e9c7a 100644
--- a/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
+++ b/src/views/qualityManagement/nonconformingManagement/components/inspectionFormDia.vue
@@ -35,7 +35,7 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="model">
+            <el-form-item label="灏哄锛�" prop="model">
               <el-input v-model="form.model" placeholder="璇疯緭鍏�" clearable disabled/>
             </el-form-item>
           </el-col>
diff --git a/src/views/qualityManagement/nonconformingManagement/index.vue b/src/views/qualityManagement/nonconformingManagement/index.vue
index 55d2472..bbef6ef 100644
--- a/src/views/qualityManagement/nonconformingManagement/index.vue
+++ b/src/views/qualityManagement/nonconformingManagement/index.vue
@@ -140,7 +140,7 @@
     prop: "productName",
   },
   {
-    label: "瑙勬牸鍨嬪彿",
+    label: "灏哄",
     prop: "model",
   },
   {
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
index c1185d2..44a072e 100644
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ b/src/views/qualityManagement/processInspection/components/formDia.vue
@@ -33,7 +33,7 @@
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
+            <el-form-item label="灏哄锛�" prop="productModelId">
               <el-select v-model="form.productModelId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'edit'"
                          filterable readonly @change="handleChangeModel">
                 <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
@@ -248,7 +248,7 @@
 	}
 	testStandardOptions.value = [];
 	tableData.value = [];
-	// 鍏堢‘淇濅骇鍝佹爲宸插姞杞斤紝鍚﹀垯缂栬緫鏃朵骇鍝�/瑙勬牸鍨嬪彿鏃犳硶鍙嶆樉
+	// 鍏堢‘淇濅骇鍝佹爲宸插姞杞斤紝鍚﹀垯缂栬緫鏃朵骇鍝�/灏哄鏃犳硶鍙嶆樉
 	await getProductOptions();
 	if (operationType.value === 'edit') {
 		// 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
@@ -256,7 +256,7 @@
 		// 鍏堣缃〃鍗曟暟鎹紝浣嗘殏鏃舵竻绌� testStandardId锛岀瓑閫夐」鍔犺浇瀹屾垚鍚庡啀璁剧疆
 		form.value = {...row, testStandardId: ''}
 		currentProductId.value = row.productId || 0
-		// 鍏抽敭锛氱紪杈戞椂鍔犺浇瑙勬牸鍨嬪彿涓嬫媺閫夐」锛屾墠鑳藉弽鏄� productModelId
+		// 鍏抽敭锛氱紪杈戞椂鍔犺浇灏哄涓嬫媺閫夐」锛屾墠鑳藉弽鏄� productModelId
 		if (currentProductId.value) {
 			try {
 				const res = await modelList({ id: currentProductId.value });
@@ -266,7 +266,7 @@
 					handleChangeModel(form.value.productModelId);
 				}
 			} catch (e) {
-				console.error("鍔犺浇瑙勬牸鍨嬪彿澶辫触", e);
+				console.error("鍔犺浇灏哄澶辫触", e);
 				modelOptions.value = [];
 			}
 		}
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index cbeab71..2cb567f 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -114,7 +114,7 @@
     prop: "productName",
   },
   {
-    label: "瑙勬牸鍨嬪彿",
+    label: "灏哄",
     prop: "model",
   },
   {
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 7e373bf..9dd920d 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -43,7 +43,7 @@
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
+            <el-form-item label="灏哄锛�" prop="productModelId">
               <el-select v-model="form.productModelId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'edit'"
                          filterable readonly @change="handleChangeModel">
                 <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
@@ -258,14 +258,14 @@
   }
   testStandardOptions.value = [];
   tableData.value = [];
-  // 鍏堢‘淇濅骇鍝佹爲宸插姞杞斤紝鍚﹀垯缂栬緫鏃朵骇鍝�/瑙勬牸鍨嬪彿鏃犳硶鍙嶆樉
+  // 鍏堢‘淇濅骇鍝佹爲宸插姞杞斤紝鍚﹀垯缂栬緫鏃朵骇鍝�/灏哄鏃犳硶鍙嶆樉
   await getProductOptions();
   if (operationType.value === 'edit') {
     // 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
     const savedTestStandardId = row.testStandardId;
     form.value = {...row}
     currentProductId.value = row.productId || 0
-    // 鍏抽敭锛氱紪杈戞椂鍔犺浇瑙勬牸鍨嬪彿涓嬫媺閫夐」锛屾墠鑳藉弽鏄� productModelId
+    // 鍏抽敭锛氱紪杈戞椂鍔犺浇灏哄涓嬫媺閫夐」锛屾墠鑳藉弽鏄� productModelId
     if (currentProductId.value) {
       try {
         const res = await modelList({ id: currentProductId.value });
@@ -275,7 +275,7 @@
           handleChangeModel(form.value.productModelId);
         }
       } catch (e) {
-        console.error("鍔犺浇瑙勬牸鍨嬪彿澶辫触", e);
+        console.error("鍔犺浇灏哄澶辫触", e);
         modelOptions.value = [];
       }
     }
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index 26504b0..09d36ce 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -116,7 +116,7 @@
     prop: "productName",
   },
   {
-    label: "瑙勬牸鍨嬪彿",
+    label: "灏哄",
     prop: "model",
   },
   {
diff --git a/src/views/safeProduction/safeWorkApproval/components/approvalDia.vue b/src/views/safeProduction/safeWorkApproval/components/approvalDia.vue
index 8d40a2e..a7132af 100644
--- a/src/views/safeProduction/safeWorkApproval/components/approvalDia.vue
+++ b/src/views/safeProduction/safeWorkApproval/components/approvalDia.vue
@@ -116,7 +116,7 @@
                   <el-table-column prop="product"
                                    label="浜у搧鍚嶇О" />
                   <el-table-column prop="specification"
-                                   label="瑙勬牸鍨嬪彿" />
+                                   label="灏哄" />
                   <el-table-column prop="unit"
                                    label="鍗曚綅" />
                   <el-table-column prop="unitPrice"
@@ -176,7 +176,7 @@
                   <el-table-column prop="productCategory"
                                    label="浜у搧鍚嶇О" />
                   <el-table-column prop="specificationModel"
-                                   label="瑙勬牸鍨嬪彿" />
+                                   label="灏哄" />
                   <el-table-column prop="unit"
                                    label="鍗曚綅" />
                   <el-table-column prop="quantity"
diff --git a/src/views/salesManagement/deliveryLedger/index.vue b/src/views/salesManagement/deliveryLedger/index.vue
index d8fc265..d0fea74 100644
--- a/src/views/salesManagement/deliveryLedger/index.vue
+++ b/src/views/salesManagement/deliveryLedger/index.vue
@@ -31,7 +31,7 @@
         <el-table-column label="鍙戣揣璁㈠崟鍙�" prop="shippingNo" show-overflow-tooltip />
         <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip />
         <el-table-column label="浜у搧鍚嶇О" prop="productCategory" show-overflow-tooltip />
-        <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" show-overflow-tooltip />
+        <el-table-column label="灏哄" prop="specificationModel" show-overflow-tooltip />
 				<el-table-column label="鍙戣揣杩涘害" align="center" width="150">
 					<template #default="scope">
 						<el-progress
diff --git a/src/views/salesManagement/invoiceLedger/index.vue b/src/views/salesManagement/invoiceLedger/index.vue
index 3827854..153554c 100644
--- a/src/views/salesManagement/invoiceLedger/index.vue
+++ b/src/views/salesManagement/invoiceLedger/index.vue
@@ -33,7 +33,7 @@
         <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip width="180" />
         <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip width="240" />
         <el-table-column label="浜у搧澶х被" prop="productCategory" width="200" />
-        <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="160" show-overflow-tooltip />
+        <el-table-column label="灏哄" prop="specificationModel" width="160" show-overflow-tooltip />
         <el-table-column label="鍙戠エ鍙�" prop="invoiceNo" width="200" show-overflow-tooltip />
         <el-table-column label="鍙戠エ閲戦(鍏�)" prop="invoiceTotal" show-overflow-tooltip :formatter="formattedNumber"
           width="200" />
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
index 44e1c4e..7a21e34 100644
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ b/src/views/salesManagement/invoiceRegistration/index.vue
@@ -69,7 +69,7 @@
 							/>
 							<el-table-column label="浜у搧澶х被" prop="productCategory" />
 							<el-table-column
-								label="瑙勬牸鍨嬪彿"
+								label="灏哄"
 								prop="specificationModel"
 								width="150"
 							/>
@@ -274,7 +274,7 @@
 					</el-table-column>
 					<el-table-column label="浜у搧澶х被" prop="productCategory" />
 					<el-table-column
-						label="瑙勬牸鍨嬪彿"
+						label="灏哄"
 						prop="specificationModel"
 						width="150"
 					/>
diff --git a/src/views/salesManagement/receiptPayment/index.vue b/src/views/salesManagement/receiptPayment/index.vue
index 25bd280..521cee1 100644
--- a/src/views/salesManagement/receiptPayment/index.vue
+++ b/src/views/salesManagement/receiptPayment/index.vue
@@ -155,7 +155,7 @@
           width="100"
         />
         <el-table-column
-          label="瑙勬牸鍨嬪彿"
+          label="灏哄"
           prop="specificationModel"
           show-overflow-tooltip
           width="200"
@@ -215,7 +215,7 @@
 					width="100"
 				/>
 				<el-table-column
-					label="瑙勬牸鍨嬪彿"
+					label="灏哄"
 					prop="specificationModel"
 					show-overflow-tooltip
 					width="200"
diff --git a/src/views/salesManagement/returnOrder/components/detailDia.vue b/src/views/salesManagement/returnOrder/components/detailDia.vue
index 9ff4e89..619fabb 100644
--- a/src/views/salesManagement/returnOrder/components/detailDia.vue
+++ b/src/views/salesManagement/returnOrder/components/detailDia.vue
@@ -43,7 +43,7 @@
 
 const tableColumn = [
   {align: "center", label: "浜у搧澶х被", prop: "productCategory"},
-  {align: "center", label: "瑙勬牸鍨嬪彿", prop: "specificationModel"},
+  {align: "center", label: "灏哄", prop: "specificationModel"},
   {align: "center", label: "鍗曚綅", prop: "unit", width: 80},
   {align: "center", label: "鎬绘暟閲�", prop: "quantity", width: 120},
   {align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120},
diff --git a/src/views/salesManagement/returnOrder/components/formDia.vue b/src/views/salesManagement/returnOrder/components/formDia.vue
index 27bbb0d..af30b77 100644
--- a/src/views/salesManagement/returnOrder/components/formDia.vue
+++ b/src/views/salesManagement/returnOrder/components/formDia.vue
@@ -146,7 +146,7 @@
       >
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column align="center" prop="productCategory" label="浜у搧澶х被" />
-        <el-table-column align="center" prop="specificationModel" label="瑙勬牸鍨嬪彿" />
+        <el-table-column align="center" prop="specificationModel" label="灏哄" />
         <el-table-column align="center" prop="unit" label="鍗曚綅" />
         <el-table-column align="center" prop="quantity" label="鎬绘暟閲�" />
         <el-table-column align="center" prop="unQuantity" label="鏈��璐ф暟閲�" />
@@ -216,7 +216,7 @@
 
 const tableColumn = ref([
   {align: "center", label: "浜у搧澶х被", prop: "productCategory" },
-  {align: "center", label: "瑙勬牸鍨嬪彿", prop: "specificationModel" },
+  {align: "center", label: "灏哄", prop: "specificationModel" },
   {align: "center", label: "鍗曚綅", prop: "unit", width: 80 },
   {align: "center", label: "鎬绘暟閲�", prop: "quantity", width: 120 },
   {align: "center", label: "宸查��璐ф暟閲�", prop: "totalReturnNum", width: 120 },
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 57ecb7f..86e03a3 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -30,6 +30,9 @@
           <el-button type="primary" @click="openForm('add')">
             鏂板鍙拌处
           </el-button>
+          <el-button type="primary" plain :disabled="selectedRows.length === 0" @click="handleBatchExportContract">
+            瀵煎嚭鍚堝悓
+          </el-button>
           <el-button type="primary" plain @click="handleImport">瀵煎叆</el-button>
           <el-button @click="handleOut">瀵煎嚭</el-button>
           <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
@@ -45,18 +48,10 @@
             <el-table :data="props.row.children" border show-summary :summary-method="(param) => summarizeChildrenTable(param, props.row)">
               <el-table-column align="center" label="搴忓彿" type="index"/>
               <el-table-column label="浜у搧澶х被" prop="productCategory" />
-              <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+              <el-table-column label="灏哄" prop="specificationModel" />
+              <el-table-column label="绾稿紶" prop="paper" />
               <el-table-column label="鍗曚綅" prop="unit" />
-							<el-table-column label="浜у搧鐘舵��"
-															 width="100px"
-															 align="center">
-                <template #default="scope">
-									<el-tag v-if="scope.row.approveStatus === 1"
-													type="success">鍏呰冻</el-tag>
-									<el-tag v-else
-													type="danger">涓嶈冻</el-tag>
-                </template>
-              </el-table-column>
+							<el-table-column label="浜у搧鏁伴噺" width="100px" align="center" prop="productNum"></el-table-column>
 							<el-table-column label="鍙戣揣鐘舵��" width="140" align="center">
 								<template #default="scope">
 									<el-tag :type="getShippingStatusType(scope.row)" size="small">
@@ -121,13 +116,13 @@
       :operation-type="operationType" @close="closeDia" @confirm="submitForm" @cancel="closeDia">
       <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
 				<!-- 鎶ヤ环鍗曞鍏ュ叆鍙o細鏀惧湪琛ㄥ崟椤堕儴锛岄�夋嫨鍚庡弽鏄惧鎴�/涓氬姟鍛樼瓑 -->
-				<el-row v-if="operationType === 'add'" style="margin-bottom: 10px;">
-					<el-col :span="24" style="text-align: right;">
-						<el-button type="primary" plain @click="openQuotationDialog">
-							浠庨攢鍞姤浠峰鍏�
-						</el-button>
-					</el-col>
-				</el-row>
+<!--				<el-row v-if="operationType === 'add'" style="margin-bottom: 10px;">-->
+<!--					<el-col :span="24" style="text-align: right;">-->
+<!--						<el-button type="primary" plain @click="openQuotationDialog">-->
+<!--							浠庨攢鍞姤浠峰鍏�-->
+<!--						</el-button>-->
+<!--					</el-col>-->
+<!--				</el-row>-->
         <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
@@ -147,11 +142,7 @@
           <el-col :span="12">
             <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerId">
               <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" filterable>
-                <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id">
-                  {{
-                    item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber
-                  }}
-                </el-option>
+                <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id"></el-option>
               </el-select>
             </el-form-item>
           </el-col>
@@ -161,7 +152,7 @@
 						</el-form-item>
 					</el-col>
         </el-row>
-        <el-row :gutter="30">
+				<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"
@@ -171,6 +162,36 @@
 					<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 :gutter="30">
+					<el-col :span="12">
+						<el-form-item label="浠锋牸绫诲瀷锛�">
+							<el-input v-model="form.priceType" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="6">
+						<el-form-item label="瀹氶噾姣斾緥(%)锛�">
+							<el-input-number v-model="form.depositRatio" :min="0" :max="100" :precision="2" :step="0.1" style="width: 100%" :disabled="operationType === 'view'" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="6">
+						<el-form-item label="瀹氶噾閲戦(鍏�)锛�">
+							<el-input-number v-model="form.depositAmount" :min="0" :precision="2" :step="0.01" style="width: 100%" :disabled="operationType === 'view'" />
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row :gutter="30">
+					<el-col :span="12">
+						<el-form-item label="閫佽揣鍦板潃锛�">
+							<el-input v-model="form.deliveryAddress" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="鍙戣揣鍛ㄦ湡锛�">
+							<el-input-number v-model="form.deliveryCycle" :min="0" :precision="0" style="width: calc(100% - 68px)" :disabled="operationType === 'view'" />
+							<span style="margin-left: 8px; color: #606266;">宸ヤ綔鏃�</span>
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -212,13 +233,15 @@
 						:selectable="(row) => !isProductShipped(row)" />
 					<el-table-column align="center" label="搴忓彿" type="index" width="60" />
 					<el-table-column label="浜у搧澶х被" prop="productCategory" />
-					<el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
+					<el-table-column label="灏哄" prop="specificationModel" />
+					<el-table-column label="绾稿紶" prop="paper" />
 					<el-table-column label="鍗曚綅" prop="unit" />
 					<el-table-column label="鏁伴噺" prop="quantity" />
 					<el-table-column label="绋庣巼(%)" prop="taxRate" />
 					<el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
 					<el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
 					<el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" />
+					<el-table-column label="澶囨敞" prop="remark" show-overflow-tooltip />
 					<el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center" v-if="operationType !== 'view'">
 						<template #default="scope">
 							<el-button link type="primary" size="small" 
@@ -263,13 +286,6 @@
 		>
 			<div style="margin-bottom: 12px; display:flex; gap: 12px; align-items:center;">
 				<el-input
-					v-model="quotationSearchForm.quotationNo"
-					placeholder="璇疯緭鍏ユ姤浠峰崟鍙�"
-					clearable
-					style="max-width: 260px;"
-					@change="fetchQuotationList"
-				/>
-				<el-input
 					v-model="quotationSearchForm.customer"
 					placeholder="璇疯緭鍏ュ鎴峰悕绉�"
 					clearable
@@ -288,10 +304,46 @@
 				height="420px"
 			>
 				<el-table-column align="center" label="搴忓彿" type="index" width="60" />
-				<el-table-column prop="quotationNo" label="鎶ヤ环鍗曞彿" width="180" show-overflow-tooltip />
-				<el-table-column prop="customer" label="瀹㈡埛鍚嶇О" min-width="220" show-overflow-tooltip />
-				<el-table-column prop="salesperson" label="涓氬姟鍛�" width="120" show-overflow-tooltip />
-				<el-table-column prop="quotationDate" label="鎶ヤ环鏃ユ湡" width="140" />
+				<el-table-column label="浜у搧鍚嶇О" min-width="180" show-overflow-tooltip>
+					<template #default="{ row }">
+						{{ getPrimaryQuotationProductField(row, "product") }}
+					</template>
+				</el-table-column>
+				<el-table-column label="灏哄" min-width="140" show-overflow-tooltip>
+					<template #default="{ row }">
+						{{ getPrimaryQuotationProductField(row, "specification") }}
+					</template>
+				</el-table-column>
+				<el-table-column label="绾稿紶" min-width="120" show-overflow-tooltip>
+					<template #default="{ row }">
+						{{ getPrimaryQuotationProductField(row, "paper") }}
+					</template>
+				</el-table-column>
+				<el-table-column label="瀹氶噺" min-width="100" show-overflow-tooltip>
+					<template #default="{ row }">
+						{{ getPrimaryQuotationProductField(row, "grammage") }}
+					</template>
+				</el-table-column>
+				<el-table-column label="鍗曚环(鍏�)" width="120" align="right">
+					<template #default="{ row }">
+						{{ formatQuotationMoney(getPrimaryQuotationProductValue(row, "unitPrice")) }}
+					</template>
+				</el-table-column>
+				<el-table-column label="鍗扮増璐�(鍏�)" width="120" align="right">
+					<template #default="{ row }">
+						{{ formatQuotationMoney(getPrimaryQuotationProductValue(row, "printingPlateFee")) }}
+					</template>
+				</el-table-column>
+				<el-table-column label="鍒�鐗堣垂(鍏�)" width="120" align="right">
+					<template #default="{ row }">
+						{{ formatQuotationMoney(getPrimaryQuotationProductValue(row, "diePlateFee")) }}
+					</template>
+				</el-table-column>
+				<el-table-column label="纾ㄥ叿璐�(鍏�)" width="120" align="right">
+					<template #default="{ row }">
+						{{ formatQuotationMoney(getPrimaryQuotationProductValue(row, "moldFee")) }}
+					</template>
+				</el-table-column>
 				<el-table-column prop="status" label="瀹℃壒鐘舵��" width="120" align="center" />
 				<el-table-column prop="totalAmount" label="鎶ヤ环閲戦(鍏�)" width="160" align="right">
 					<template #default="scope">
@@ -337,10 +389,17 @@
 				</el-row>
 				<el-row :gutter="30">
 					<el-col :span="24">
-						<el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
+						<el-form-item label="灏哄锛�" prop="productModelId">
 							<el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable @change="getProductModel" filterable>
 								<el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
 							</el-select>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row :gutter="30">
+					<el-col :span="24">
+						<el-form-item label="绾稿紶锛�">
+							<el-input v-model="productForm.paper" placeholder="璇疯緭鍏�" clearable />
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -351,7 +410,7 @@
 						</el-form-item>
 					</el-col>
 					<el-col :span="12">
-						<el-form-item label="绋庣巼(%)锛�" prop="taxRate">
+						<el-form-item label="绋庣巼(%)锛堥�夊~锛夛細" prop="taxRate">
 							<el-select v-model="productForm.taxRate" placeholder="璇烽�夋嫨" clearable @change="calculateFromTaxRate">
 								<el-option label="1" value="1" />
 								<el-option label="6" value="6" />
@@ -395,6 +454,13 @@
 								<el-option label="澧炴櫘绁�" value="澧炴櫘绁�" />
 								<el-option label="澧炰笓绁�" value="澧炰笓绁�" />
 							</el-select>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row :gutter="30">
+					<el-col :span="24">
+						<el-form-item label="澶囨敞锛�">
+							<el-input v-model="productForm.remark" placeholder="璇疯緭鍏�" clearable type="textarea" :rows="2" />
 						</el-form-item>
 					</el-col>
 				</el-row>
@@ -493,7 +559,7 @@
 									<thead>
 									<tr>
 										<th>浜у搧鍚嶇О</th>
-										<th>瑙勬牸鍨嬪彿</th>
+										<th>灏哄</th>
 										<th>鍗曚綅</th>
 										<th>鍗曚环</th>
 										<th>闆跺敭鏁伴噺</th>
@@ -647,12 +713,19 @@
 		salesContractNo: "",
 		salesman: "",
 		customerId: "",
+		projectName: "",
+		priceType: "",
+		depositRatio: null,
+		depositAmount: null,
+		deliveryAddress: "",
+		deliveryCycle: null,
 		entryPerson: "",
 		entryDate: "",
     deliveryDate: "",
 		maintenanceTime: "",
 		productData: [],
 		executionDate: "",
+		remarks: "",
     hasProductionRecord: false,
 	},
 	rules: {
@@ -674,6 +747,7 @@
 	productForm: {
 		productCategory: "",
 		specificationModel: "",
+		paper: "",
 		unit: "",
 		quantity: "",
 		taxInclusiveUnitPrice: "",
@@ -681,6 +755,7 @@
 		taxInclusiveTotalPrice: "",
 		taxExclusiveTotalPrice: "",
 		invoiceType: "",
+		remark: "",
 	},
 	productRules: {
 		productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -693,7 +768,6 @@
 		taxInclusiveUnitPrice: [
 			{ required: true, message: "璇疯緭鍏�", trigger: "blur" },
 		],
-		taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
 		taxInclusiveTotalPrice: [
 			{ required: true, message: "璇疯緭鍏�", trigger: "blur" },
 		],
@@ -704,6 +778,27 @@
 	},
 });
 const { productForm, productRules } = toRefs(productFormData);
+const createDefaultProductForm = () => ({
+	productCategory: "",
+	specificationModel: "",
+	paper: "",
+	unit: "",
+	quantity: "",
+	taxInclusiveUnitPrice: "",
+	taxRate: "",
+	taxInclusiveTotalPrice: "",
+	taxExclusiveTotalPrice: "",
+	invoiceType: "",
+	remark: "",
+});
+const normalizeProductItem = (target) => {
+	if (!target) return target;
+	const remark = target.remark ?? "";
+	return {
+		...target,
+		remark: remark,
+	};
+};
 // 闃叉寰幆璁$畻鐨勬爣蹇�
 const isCalculating = ref(false);
 const upload = reactive({
@@ -1022,6 +1117,25 @@
 		"taxExclusiveTotalPrice",
 	]);
 };
+const createDefaultForm = () => ({
+	salesContractNo: "",
+	salesman: "",
+	customerId: "",
+	projectName: "",
+	priceType: "",
+	depositRatio: null,
+	depositAmount: null,
+	deliveryAddress: "",
+	deliveryCycle: null,
+	entryPerson: userStore.id,
+	entryDate: getCurrentDate(),
+	deliveryDate: "",
+	maintenanceTime: "",
+	productData: [],
+	executionDate: getCurrentDate(),
+	remarks: "",
+	hasProductionRecord: false,
+});
 // 鎵撳紑寮规
 const openForm = async (type, row) => {
 	if (type === "edit" && row && !canEditLedger(row)) {
@@ -1029,7 +1143,7 @@
 		return;
 	}
 	operationType.value = type;
-	form.value = {};
+	form.value = createDefaultForm();
 	productData.value = [];
 	selectedQuotation.value = null;
 	let userLists = await userListNoPage();
@@ -1037,18 +1151,16 @@
 	listCustomerPrivatePool({current: -1,size:-1}).then((res) => {
 		customerOption.value = res.data.records;
 	});
-	form.value.entryPerson = userStore.id;
 	if (type === "add") {
-		// 鏂板鏃惰缃綍鍏ユ棩鏈熶负褰撳ぉ
-		form.value.entryDate = getCurrentDate();
-		// 绛捐鏃ユ湡榛樿涓哄綋澶�
-		form.value.executionDate = getCurrentDate();
+		// 榛樿鍊煎凡鍦� createDefaultForm 涓缃�
 	} else {
 		currentId.value = row.id;
 		getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
-			form.value = { ...res };
+			form.value = { ...createDefaultForm(), ...res };
 			form.value.entryPerson = Number(res.entryPerson);
-			productData.value = form.value.productData;
+			productData.value = (form.value.productData || []).map((item) =>
+				normalizeProductItem(item)
+			);
 			fileList.value = form.value.salesLedgerFiles;
 		});
 	}
@@ -1058,7 +1170,6 @@
 	//     form.value.entryPerson = userAll.user.userId // 璁剧疆榛樿涓氬姟鍛樹负褰撳墠鐢ㄦ埛
 	//   }
 	// });
-	form.value.entryDate = getCurrentDate(); // 璁剧疆榛樿褰曞叆鏃ユ湡涓哄綋鍓嶆棩鏈�
 	dialogFormVisible.value = true;
 };
 
@@ -1113,6 +1224,28 @@
 	fetchQuotationList();
 };
 
+const getPrimaryQuotationProduct = (row) => {
+	if (!Array.isArray(row?.products) || row.products.length === 0) return null;
+	return row.products[0];
+};
+
+const getPrimaryQuotationProductField = (row, field) => {
+	const primary = getPrimaryQuotationProduct(row);
+	const value = primary?.[field];
+	if (value === undefined || value === null || value === "") return "--";
+	if ((field === "product" || field === "specification") && Array.isArray(row?.products) && row.products.length > 1) {
+		return `${value} 绛�${row.products.length}椤筦;
+	}
+	return value;
+};
+
+const getPrimaryQuotationProductValue = (row, field) => {
+	const primary = getPrimaryQuotationProduct(row);
+	return Number(primary?.[field] || 0);
+};
+
+const formatQuotationMoney = (value) => Number(value || 0).toFixed(2);
+
 // 閫変腑鎶ヤ环鍗曞悗鍥炲~鍒板彴璐﹁〃鍗�
 const applyQuotation = (row) => {
 	if (!row) return;
@@ -1139,13 +1272,18 @@
 	productData.value = products.map((p) => {
 		const quantity = Number(p.quantity ?? 0) || 0;
 		const unitPrice = Number(p.unitPrice ?? 0) || 0;
-		const taxRate = "13"; // 榛樿 13%锛屼究浜庣洿鎺ユ彁浜わ紙濡傞渶鍙湪浜у搧涓嚜琛屼慨鏀癸級
+		const taxRate = p.taxRate !== undefined && p.taxRate !== null && p.taxRate !== ""
+			? String(p.taxRate)
+			: "";
 		const taxInclusiveTotalPrice = (unitPrice * quantity).toFixed(2);
-		const taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(taxInclusiveTotalPrice, taxRate);
+		const taxExclusiveTotalPrice = taxRate
+			? proxy.calculateTaxExclusiveTotalPrice(taxInclusiveTotalPrice, taxRate)
+			: taxInclusiveTotalPrice;
 		return {
 			// 鍙拌处瀛楁
 			productCategory: p.product || p.productName || "",
 			specificationModel: p.specification || "",
+			paper: p.paper || "",
 			unit: p.unit || "",
 			quantity: quantity,
 			taxRate: taxRate,
@@ -1153,6 +1291,7 @@
 			taxInclusiveTotalPrice: taxInclusiveTotalPrice,
 			taxExclusiveTotalPrice: taxExclusiveTotalPrice,
 			invoiceType: "澧炴櫘绁�",
+			remark: p.remark || "",
 		};
 	});
 	
@@ -1203,7 +1342,10 @@
 		if (valid) {
 			console.log('productData.value--', productData.value)
 			if (productData.value !== null && productData.value.length > 0) {
-				form.value.productData = proxy.HaveJson(productData.value);
+				const normalizedProductData = productData.value.map((item) =>
+					normalizeProductItem(item)
+				);
+				form.value.productData = proxy.HaveJson(normalizedProductData);
 			} else {
 				proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
 				return;
@@ -1239,12 +1381,12 @@
 	}
 	
 	productOperationType.value = type;
-	productForm.value = {};
+	productForm.value = createDefaultProductForm();
 	proxy.resetForm("productFormRef");
 	if (type === "edit") {
-		productForm.value = { ...row };
+		productForm.value = { ...createDefaultProductForm(), ...normalizeProductItem(row) };
 		productIndex.value = index;
-		// 缂栬緫鏃舵牴鎹骇鍝佸ぇ绫诲悕绉板弽鏌� tree 鑺傜偣 id锛屽苟鍔犺浇瑙勬牸鍨嬪彿鍒楄〃
+		// 缂栬緫鏃舵牴鎹骇鍝佸ぇ绫诲悕绉板弽鏌� tree 鑺傜偣 id锛屽苟鍔犺浇灏哄鍒楄〃
 		try {
 			const options = productOptions.value && productOptions.value.length > 0
 				? productOptions.value
@@ -1253,7 +1395,7 @@
 			if (categoryId) {
 				const models = await modelList({ id: categoryId });
 				modelOptions.value = models || [];
-				// 鏍规嵁褰撳墠瑙勬牸鍨嬪彿鍚嶇О鍙嶆煡骞惰缃� productModelId锛屼究浜庝笅鎷夋鏄剧ず宸查�夊��
+				// 鏍规嵁褰撳墠灏哄鍚嶇О鍙嶆煡骞惰缃� productModelId锛屼究浜庝笅鎷夋鏄剧ず宸查�夊��
 				const currentModel = (modelOptions.value || []).find(
 					(m) => m.model === productForm.value.specificationModel
 				);
@@ -1263,17 +1405,28 @@
 			}
 		} catch (e) {
 			// 鍔犺浇澶辫触鏃朵繚鎸佸彲缂栬緫锛屼笉涓柇寮圭獥
-			console.error("鍔犺浇浜у搧瑙勬牸鍨嬪彿澶辫触", e);
+			console.error("鍔犺浇浜у搧灏哄澶辫触", e);
 		}
 	} else {
 		getProductOptions()
 	}
 	productFormVisible.value = true;
 };
+const normalizeProductTaxFields = (target) => {
+	if (!target) return;
+	const inclusiveTotalPrice = Number(target.taxInclusiveTotalPrice || 0);
+	const taxRate = target.taxRate;
+	if (taxRate) {
+		target.taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(inclusiveTotalPrice, taxRate);
+	} else {
+		target.taxExclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
+	}
+};
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitProduct = () => {
 	proxy.$refs["productFormRef"].validate((valid) => {
 		if (valid) {
+			normalizeProductTaxFields(productForm.value);
 			if (operationType.value === "edit") {
 				submitProductEdit();
 			} else {
@@ -1290,11 +1443,11 @@
 const submitProductEdit = () => {
 	productForm.value.salesLedgerId = currentId.value;
 	productForm.value.type = 1
-	addOrUpdateSalesLedgerProduct(productForm.value).then((res) => {
+	addOrUpdateSalesLedgerProduct(normalizeProductItem(productForm.value)).then((res) => {
 		proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
 		closeProductDia();
 		getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then((res) => {
-			productData.value = res.productData;
+			productData.value = (res.productData || []).map((item) => normalizeProductItem(item));
 		});
 	});
 };
@@ -1337,7 +1490,7 @@
 					closeProductDia();
 					getSalesLedgerWithProducts({ id: currentId.value, type: 1 }).then(
 						(res) => {
-							productData.value = res.productData;
+							productData.value = (res.productData || []).map((item) => normalizeProductItem(item));
 						}
 					);
 				});
@@ -1678,7 +1831,7 @@
               <thead>
                 <tr>
                   <th>浜у搧鍚嶇О</th>
-                  <th>瑙勬牸鍨嬪彿</th>
+                  <th>灏哄</th>
                   <th>鍗曚綅</th>
                   <th>鍗曚环</th>
                   <th>闆跺敭鏁伴噺</th>
@@ -1837,6 +1990,8 @@
 				productForm.value.taxInclusiveTotalPrice,
 				productForm.value.taxRate
 			);
+	} else {
+		productForm.value.taxExclusiveTotalPrice = Number(productForm.value.taxInclusiveTotalPrice || 0).toFixed(2);
 	}
 };
 
@@ -1863,6 +2018,8 @@
 				totalPrice,
 				productForm.value.taxRate
 			);
+	} else {
+		productForm.value.taxExclusiveTotalPrice = totalPrice.toFixed(2);
 	}
 	
 	isCalculating.value = false;
@@ -1870,25 +2027,24 @@
 
 // 鏍规嵁涓嶅惈绋庢�讳环璁$畻鍚◣鍗曚环鍜屾暟閲�
 const calculateFromExclusiveTotalPrice = () => {
-	if (!productForm.value.taxRate) {
-		proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
-		return;
-	}
 	if (isCalculating.value) return;
 	
 	const exclusiveTotalPrice = parseFloat(productForm.value.taxExclusiveTotalPrice);
 	const quantity = parseFloat(productForm.value.quantity);
 	const taxRate = parseFloat(productForm.value.taxRate);
 	
-	if (!exclusiveTotalPrice || !quantity || quantity <= 0 || !taxRate) {
+	if (!exclusiveTotalPrice || !quantity || quantity <= 0) {
 		return;
 	}
 	
 	isCalculating.value = true;
 	
-	// 鍏堣绠楀惈绋庢�讳环 = 涓嶅惈绋庢�讳环 / (1 - 绋庣巼/100)
-	const taxRateDecimal = taxRate / 100;
-	const inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal);
+	let inclusiveTotalPrice = exclusiveTotalPrice;
+	if (taxRate) {
+		// 鍏堣绠楀惈绋庢�讳环 = 涓嶅惈绋庢�讳环 / (1 - 绋庣巼/100)
+		const taxRateDecimal = taxRate / 100;
+		inclusiveTotalPrice = exclusiveTotalPrice / (1 - taxRateDecimal);
+	}
 	productForm.value.taxInclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
 	
 	// 璁$畻鍚◣鍗曚环 = 鍚◣鎬讳环 / 鏁伴噺
@@ -1899,10 +2055,6 @@
 
 // 鏍规嵁鏁伴噺鍙樺寲璁$畻鎬讳环
 const calculateFromQuantity = () => {
-	if (!productForm.value.taxRate) {
-		proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
-		return;
-	}
 	if (isCalculating.value) return;
 	
 	const quantity = parseFloat(productForm.value.quantity);
@@ -1924,6 +2076,8 @@
 				productForm.value.taxInclusiveTotalPrice,
 				productForm.value.taxRate
 			);
+	} else {
+		productForm.value.taxExclusiveTotalPrice = Number(productForm.value.taxInclusiveTotalPrice || 0).toFixed(2);
 	}
 	
 	isCalculating.value = false;
@@ -1931,10 +2085,6 @@
 
 // 鏍规嵁鍚◣鍗曚环鍙樺寲璁$畻鎬讳环
 const calculateFromUnitPrice = () => {
-	if (!productForm.value.taxRate) {
-		proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
-		return;
-	}
 	if (isCalculating.value) return;
 	
 	const quantity = parseFloat(productForm.value.quantity);
@@ -1956,6 +2106,8 @@
 				productForm.value.taxInclusiveTotalPrice,
 				productForm.value.taxRate
 			);
+	} else {
+		productForm.value.taxExclusiveTotalPrice = Number(productForm.value.taxInclusiveTotalPrice || 0).toFixed(2);
 	}
 	
 	isCalculating.value = false;
@@ -1963,27 +2115,27 @@
 
 // 鏍规嵁绋庣巼鍙樺寲璁$畻涓嶅惈绋庢�讳环
 const calculateFromTaxRate = () => {
-	if (!productForm.value.taxRate) {
-		proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
-		return;
-	}
 	if (isCalculating.value) return;
 	
 	const inclusiveTotalPrice = parseFloat(productForm.value.taxInclusiveTotalPrice);
 	const taxRate = parseFloat(productForm.value.taxRate);
 	
-	if (!inclusiveTotalPrice || !taxRate) {
+	if (!inclusiveTotalPrice) {
 		return;
 	}
 	
 	isCalculating.value = true;
 	
-	// 璁$畻涓嶅惈绋庢�讳环
-	productForm.value.taxExclusiveTotalPrice =
-		proxy.calculateTaxExclusiveTotalPrice(
-			inclusiveTotalPrice,
-			taxRate
-		);
+	if (taxRate) {
+		// 璁$畻涓嶅惈绋庢�讳环
+		productForm.value.taxExclusiveTotalPrice =
+			proxy.calculateTaxExclusiveTotalPrice(
+				inclusiveTotalPrice,
+				taxRate
+			);
+	} else {
+		productForm.value.taxExclusiveTotalPrice = inclusiveTotalPrice.toFixed(2);
+	}
 	
 	isCalculating.value = false;
 };
@@ -2063,6 +2215,11 @@
  * @param row 琛屾暟鎹�
  */
 const canShip = (row) => {
+	const productNum = Number(row.productNum);
+	const quantity = Number(row.quantity);
+	if (!Number.isFinite(productNum) || !Number.isFinite(quantity) || productNum < quantity) {
+		return false;
+	}
 	// 浜у搧鐘舵�佸繀椤绘槸鍏呰冻锛坅pproveStatus === 1锛�
 	if (row.approveStatus !== 1) {
 		return false;
@@ -2138,11 +2295,46 @@
 	});
 }
 
+const handleBatchExportContract = () => {
+	if (selectedRows.value.length === 0) {
+		proxy.$modal.msgWarning("璇烽�夋嫨瑕佸鍑虹殑鍙拌处");
+		return;
+	}
+	const firstCustomerKey =
+		selectedRows.value[0].customerId ?? selectedRows.value[0].customerName ?? "";
+	const hasDifferentCustomer = selectedRows.value.some((row) => {
+		const customerKey = row.customerId ?? row.customerName ?? "";
+		return String(customerKey) !== String(firstCustomerKey);
+	});
+	if (hasDifferentCustomer) {
+		proxy.$modal.msgWarning("浠呮敮鎸佸悓涓�瀹㈡埛鍚屾椂瀵煎嚭鍚堝悓");
+		return;
+	}
+	const ids = selectedRows.value
+		.map((row) => row.id)
+		.filter((id) => id !== null && id !== undefined);
+	if (ids.length === 0) {
+		proxy.$modal.msgWarning("鏈幏鍙栧埌鍚堝悓ID");
+		return;
+	}
+	proxy.download(
+		"/sales/ledger/exportContract",
+		ids,
+		`閿�鍞悎鍚宊鎵归噺_${dayjs().format("YYYYMMDDHHmmss")}.docx`,
+		{
+			method: "post",
+			filename: `閿�鍞悎鍚宊鎵归噺_${dayjs().format("YYYYMMDDHHmmss")}.docx`,
+			headers: { "Content-Type": "application/json;charset=utf-8" },
+			transformRequest: [(data) => JSON.stringify(data)],
+		}
+	);
+}
+
 // 鎵撳紑鍙戣揣寮规
 const openDeliveryForm = (row) => {
 	// 妫�鏌ユ槸鍚﹀彲浠ュ彂璐�
 	if (!canShip(row)) {
-		proxy.$modal.msgWarning("鍙湁鍦ㄤ骇鍝佺姸鎬佹槸鍏呰冻锛屽彂璐х姸鎬佹槸寰呭彂璐ф垨瀹℃牳鎷掔粷鐨勬椂鍊欐墠鍙互鍙戣揣");
+		proxy.$modal.msgWarning("浜у搧鏁伴噺蹇呴』澶т簬绛変簬鏁伴噺锛屼笖鐘舵�佹弧瓒冲彂璐ф潯浠跺悗鎵嶅彲浠ュ彂璐�");
 		return;
 	}
 	
diff --git a/src/views/salesManagement/salesQuotation/index.vue b/src/views/salesManagement/salesQuotation/index.vue
index ee93e46..075c19b 100644
--- a/src/views/salesManagement/salesQuotation/index.vue
+++ b/src/views/salesManagement/salesQuotation/index.vue
@@ -5,35 +5,18 @@
       <el-row :gutter="20" class="search-row">
         <el-col :span="8">
           <el-input
-            v-model="searchForm.quotationNo"
-            placeholder="璇疯緭鍏ユ姤浠峰崟鍙�"
+            v-model="searchForm.product"
+            placeholder="璇疯緭鍏ヤ骇鍝佸悕绉�"
             clearable
-            @keyup.enter="handleSearch"
+            @keyup.enter="handleSearch(true)"
           >
             <template #prefix>
               <el-icon><Search /></el-icon>
             </template>
           </el-input>
         </el-col>
-        <el-col :span="8">
-          <el-select v-model="searchForm.customer" placeholder="璇烽�夋嫨瀹㈡埛" clearable>
-						<el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.customerName">
-							{{
-								item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber
-							}}
-						</el-option>
-          </el-select>
-        </el-col>
-<!--        <el-col :span="6">-->
-<!--          <el-select v-model="searchForm.status" placeholder="璇烽�夋嫨鎶ヤ环鐘舵��" clearable>-->
-<!--            <el-option label="鑽夌" value="鑽夌"></el-option>-->
-<!--            <el-option label="宸插彂閫�" value="宸插彂閫�"></el-option>-->
-<!--            <el-option label="瀹㈡埛纭" value="瀹㈡埛纭"></el-option>-->
-<!--            <el-option label="宸茶繃鏈�" value="宸茶繃鏈�"></el-option>-->
-<!--          </el-select>-->
-<!--        </el-col>-->
-        <el-col :span="8">
-          <el-button type="primary" @click="handleSearch">鎼滅储</el-button>
+        <el-col :span="4">
+          <el-button type="primary" @click="handleSearch(true)">鎼滅储</el-button>
           <el-button @click="resetSearch">閲嶇疆</el-button>
           <el-button style="float: right;" type="primary" @click="handleAdd">
             鏂板鎶ヤ环
@@ -50,27 +33,27 @@
         stripe
         height="calc(100vh - 22em)"
       >
-				<el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column prop="quotationNo" label="鎶ヤ环鍗曞彿" />
-        <el-table-column prop="customer" label="瀹㈡埛鍚嶇О" />
-        <el-table-column prop="salesperson" label="涓氬姟鍛�" width="100" />
-        <el-table-column prop="quotationDate" label="鎶ヤ环鏃ユ湡" width="120" />
-        <el-table-column prop="validDate" label="鏈夋晥鏈熻嚦" width="120" />
-        <el-table-column prop="status" label="瀹℃壒鐘舵��" width="120" align="center">
-          <template #default="{ row }">
-            <el-tag :type="getStatusType(row.status)" disable-transitions>
-              {{ row.status || '--' }}
-            </el-tag>
-          </template>
+        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table-column prop="product" label="浜у搧鍚嶇О" min-width="180" show-overflow-tooltip />
+        <el-table-column prop="specification" label="灏哄" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="paper" label="绾稿紶" min-width="120" show-overflow-tooltip />
+        <el-table-column prop="paperWeight" label="瀹氶噺" min-width="100" show-overflow-tooltip />
+        <el-table-column prop="unitPrice" label="鍗曚环" width="120" align="right">
+          <template #default="{ row }">{{ formatMoney(row.unitPrice) }}</template>
         </el-table-column>
-        <el-table-column prop="totalAmount" label="鎶ヤ环閲戦" width="120">
-          <template #default="scope">
-            楼{{ scope.row.totalAmount.toFixed(2) }}
-          </template>
+        <el-table-column prop="printingFee" label="鍗扮増璐�" width="120" align="right">
+          <template #default="{ row }">{{ formatMoney(row.printingFee) }}</template>
         </el-table-column>
+        <el-table-column prop="dieCuttingFee" label="鍒�鐗堣垂" width="120" align="right">
+          <template #default="{ row }">{{ formatMoney(row.dieCuttingFee) }}</template>
+        </el-table-column>
+        <el-table-column prop="grindingFee" label="纾ㄥ叿璐�" width="120" align="right">
+          <template #default="{ row }">{{ formatMoney(row.grindingFee) }}</template>
+        </el-table-column>
+        <el-table-column prop="quantity" label="鏁伴噺" width="90" align="right" />
         <el-table-column label="鎿嶄綔" width="200" fixed="right" align="center">
           <template #default="scope">
-            <el-button link type="primary" @click="handleEdit(scope.row)" :disabled="!['寰呭鎵�','鎷掔粷'].includes(scope.row.status)">缂栬緫</el-button>
+            <el-button link type="primary" @click="handleEdit(scope.row)">缂栬緫</el-button>
             <el-button link type="primary" @click="handleView(scope.row)" style="color: #67C23A">鏌ョ湅</el-button>
             <el-button link type="danger" @click="handleDelete(scope.row)">鍒犻櫎</el-button>
           </template>
@@ -91,77 +74,13 @@
     <FormDialog v-model="dialogVisible" :title="dialogTitle" width="85%" :close-on-click-modal="false" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <div class="quotation-form-container">
         <el-form :model="form" :rules="rules" ref="formRef" label-width="120px" class="quotation-form">
-        <!-- 鍩烘湰淇℃伅 -->
-        <el-card class="form-card" shadow="hover">
-          <template #header>
-            <div class="card-header-wrapper">
-              <el-icon class="card-icon"><Document /></el-icon>
-              <span class="card-title">鍩烘湰淇℃伅</span>
-            </div>
-          </template>
-          <div class="form-content">
-            <el-row :gutter="24">
-              <el-col :span="12">
-                <el-form-item label="瀹㈡埛鍚嶇О" prop="customer">
-                  <el-select v-model="form.customer" placeholder="璇烽�夋嫨瀹㈡埛" style="width: 100%" clearable filterable>
-                    <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id"></el-option>
-                  </el-select>
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item label="涓氬姟鍛�" prop="salesperson">
-                  <el-select v-model="form.salesperson" placeholder="璇烽�夋嫨涓氬姟鍛�" style="width: 100%" clearable filterable>
-                    <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
-                      :value="item.nickName" />
-                  </el-select>
-                </el-form-item>
-              </el-col>
-            </el-row>
-            <el-row :gutter="24">
-              <el-col :span="12">
-                <el-form-item label="鎶ヤ环鏃ユ湡" prop="quotationDate">
-                  <el-date-picker
-                    v-model="form.quotationDate"
-                    type="date"
-                    placeholder="閫夋嫨鎶ヤ环鏃ユ湡"
-                    style="width: 100%"
-                    format="YYYY-MM-DD"
-                    value-format="YYYY-MM-DD"
-                    clearable
-                  />
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item label="鏈夋晥鏈熻嚦" prop="validDate">
-                  <el-date-picker
-                    v-model="form.validDate"
-                    type="date"
-                    placeholder="閫夋嫨鏈夋晥鏈�"
-                    style="width: 100%"
-                    format="YYYY-MM-DD"
-                    value-format="YYYY-MM-DD"
-                    clearable
-                  />
-                </el-form-item>
-              </el-col>
-            </el-row>
-            <el-row :gutter="24">
-              <el-col :span="12">
-                <el-form-item label="浠樻鏂瑰紡" prop="paymentMethod">
-                  <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏ヤ粯娆炬柟寮�" clearable />
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </div>
-        </el-card>
-
         <!-- 浜у搧淇℃伅 -->
         <el-card class="form-card" shadow="hover">
           <template #header>
             <div class="card-header-wrapper">
               <el-icon class="card-icon"><Box /></el-icon>
               <span class="card-title">浜у搧淇℃伅</span>
-              <el-button type="primary" size="small" @click="addProduct" class="header-btn">
+              <el-button type="primary" size="small" @click="addProduct" class="header-btn" :disabled="isEdit">
                 <el-icon><Plus /></el-icon>
                 娣诲姞浜у搧
               </el-button>
@@ -185,7 +104,7 @@
                 </el-form-item>
               </template>
             </el-table-column>
-            <el-table-column prop="specification" label="瑙勬牸鍨嬪彿" width="200">
+            <el-table-column prop="specification" label="灏哄" width="200">
               <template #default="scope">
                 <el-form-item :prop="`products.${scope.$index}.specificationId`" class="product-table-form-item">
                   <el-select
@@ -212,10 +131,45 @@
                 </el-form-item>
               </template>
             </el-table-column>
+            <el-table-column prop="paper" label="绾稿紶" width="180">
+              <template #default="scope">
+                <el-form-item :prop="`products.${scope.$index}.paper`" class="product-table-form-item">
+                  <el-input v-model="scope.row.paper" placeholder="绾稿紶" clearable />
+                </el-form-item>
+              </template>
+            </el-table-column>
+            <el-table-column prop="paperWeight" label="瀹氶噺" width="140">
+              <template #default="scope">
+                <el-form-item :prop="`products.${scope.$index}.paperWeight`" class="product-table-form-item">
+                  <el-input v-model="scope.row.paperWeight" placeholder="瀹氶噺" clearable />
+                </el-form-item>
+              </template>
+            </el-table-column>
             <el-table-column prop="unitPrice" label="鍗曚环">
               <template #default="scope">
                 <el-form-item :prop="`products.${scope.$index}.unitPrice`" class="product-table-form-item">
                   <el-input-number v-model="scope.row.unitPrice" :min="0" :precision="2" style="width: 100%" />
+                </el-form-item>
+              </template>
+            </el-table-column>
+            <el-table-column prop="printingFee" label="鍗扮増璐�" width="140">
+              <template #default="scope">
+                <el-form-item :prop="`products.${scope.$index}.printingFee`" class="product-table-form-item">
+                  <el-input-number v-model="scope.row.printingFee" :min="0" :precision="2" style="width: 100%" />
+                </el-form-item>
+              </template>
+            </el-table-column>
+            <el-table-column prop="dieCuttingFee" label="鍒�鐗堣垂" width="140">
+              <template #default="scope">
+                <el-form-item :prop="`products.${scope.$index}.dieCuttingFee`" class="product-table-form-item">
+                  <el-input-number v-model="scope.row.dieCuttingFee" :min="0" :precision="2" style="width: 100%" />
+                </el-form-item>
+              </template>
+            </el-table-column>
+            <el-table-column prop="grindingFee" label="纾ㄥ叿璐�" width="140">
+              <template #default="scope">
+                <el-form-item :prop="`products.${scope.$index}.grindingFee`" class="product-table-form-item">
+                  <el-input-number v-model="scope.row.grindingFee" :min="0" :precision="2" style="width: 100%" />
                 </el-form-item>
               </template>
             </el-table-column>
@@ -256,36 +210,37 @@
 
     <!-- 鏌ョ湅璇︽儏瀵硅瘽妗� -->
     <el-dialog v-model="viewDialogVisible" title="鎶ヤ环璇︽儏" width="800px">
-      <el-descriptions :column="2" border>
-        <el-descriptions-item label="鎶ヤ环鍗曞彿">{{ currentQuotation.quotationNo }}</el-descriptions-item>
-        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ currentQuotation.customer }}</el-descriptions-item>
-        <el-descriptions-item label="涓氬姟鍛�">{{ currentQuotation.salesperson }}</el-descriptions-item>
-        <el-descriptions-item label="鎶ヤ环鏃ユ湡">{{ currentQuotation.quotationDate }}</el-descriptions-item>
-        <el-descriptions-item label="鏈夋晥鏈熻嚦">{{ currentQuotation.validDate }}</el-descriptions-item>
-        <el-descriptions-item label="浠樻鏂瑰紡">{{ currentQuotation.paymentMethod }}</el-descriptions-item>
-<!--        <el-descriptions-item label="鎶ヤ环鐘舵��">-->
-<!--          <el-tag :type="getStatusType(currentQuotation.status)">{{ currentQuotation.status }}</el-tag>-->
-<!--        </el-descriptions-item>-->
-        <el-descriptions-item label="鎶ヤ环鎬婚" :span="2">
-          <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">楼{{ currentQuotation.totalAmount?.toFixed(2) }}</span>
-        </el-descriptions-item>
-      </el-descriptions>
-      
       <div style="margin: 20px 0;">
         <h4>浜у搧鏄庣粏</h4>
         <el-table :data="currentQuotation.products" border style="width: 100%">
           <el-table-column prop="product" label="浜у搧鍚嶇О" />
-          <el-table-column prop="specification" label="瑙勬牸鍨嬪彿" />
+          <el-table-column prop="specification" label="灏哄" />
           <el-table-column prop="unit" label="鍗曚綅" />
+          <el-table-column prop="paper" label="绾稿紶" />
+          <el-table-column prop="paperWeight" label="瀹氶噺" />
           <el-table-column prop="unitPrice" label="鍗曚环">
             <template #default="scope">
               楼{{ scope.row.unitPrice.toFixed(2) }}
             </template>
           </el-table-column>
+          <el-table-column prop="printingFee" label="鍗扮増璐�">
+            <template #default="scope">
+              楼{{ Number(scope.row.printingFee || 0).toFixed(2) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="dieCuttingFee" label="鍒�鐗堣垂">
+            <template #default="scope">
+              楼{{ Number(scope.row.dieCuttingFee || 0).toFixed(2) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="grindingFee" label="纾ㄥ叿璐�">
+            <template #default="scope">
+              楼{{ Number(scope.row.grindingFee || 0).toFixed(2) }}
+            </template>
+          </el-table-column>
         </el-table>
       </div>
-
-      <div v-if="currentQuotation.remark" style="margin-top: 20px;">
+      <div v-if="currentQuotation.remark" style="margin-top: 12px;">
         <h4>澶囨敞</h4>
         <p>{{ currentQuotation.remark }}</p>
       </div>
@@ -296,11 +251,16 @@
 <script setup>
 import { ref, reactive, computed, onMounted, markRaw, shallowRef } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
-import { Search, Document, Box, EditPen, Plus } from '@element-plus/icons-vue'
+import { Search, Box, EditPen, Plus } from '@element-plus/icons-vue'
 import Pagination from '@/components/PIMTable/Pagination.vue'
 import FormDialog from '@/components/Dialog/FormDialog.vue'
-import {getQuotationList,addQuotation,updateQuotation,deleteQuotation} from '@/api/salesManagement/salesQuotation.js'
-import {customerList} from "@/api/salesManagement/salesLedger.js";
+import {
+  quotationProductListPage,
+  getQuotationProductInfo,
+  addOrUpdateQuotationProduct,
+  editQuotationProduct,
+  deleteQuotationProduct
+} from '@/api/salesManagement/salesQuotationProduct.js'
 import {modelList, productTreeList} from "@/api/basicData/product.js";
 import {listCustomerPrivatePool} from "@/api/basicData/customerFile.js";
 import { userListNoPage } from "@/api/system/user.js";
@@ -308,9 +268,7 @@
 // 鍝嶅簲寮忔暟鎹�
 const loading = ref(false)
 const searchForm = reactive({
-  quotationNo: '',
-  customer: '',
-  status: ''
+  product: ''
 })
 
 const quotationList = ref([])
@@ -344,17 +302,11 @@
   totalAmount: 0
 })
 
-const baseRules = {
-  customer: [{ required: true, message: '璇烽�夋嫨瀹㈡埛', trigger: 'change' }],
-  salesperson: [{ required: true, message: '璇烽�夋嫨涓氬姟鍛�', trigger: 'change' }],
-  quotationDate: [{ required: true, message: '璇烽�夋嫨鎶ヤ环鏃ユ湡', trigger: 'change' }],
-  validDate: [{ required: true, message: '璇烽�夋嫨鏈夋晥鏈�', trigger: 'change' }],
-  paymentMethod: [{ required: true, message: '璇疯緭鍏ヤ粯娆炬柟寮�', trigger: 'blur' }]
-}
+const baseRules = {}
 
 const productRowRules = {
   productId: [{ required: true, message: '璇烽�夋嫨浜у搧鍚嶇О', trigger: 'change' }],
-  specificationId: [{ required: true, message: '璇烽�夋嫨瑙勬牸鍨嬪彿', trigger: 'change' }],
+  specificationId: [{ required: true, message: '璇烽�夋嫨灏哄', trigger: 'change' }],
   unit: [{ required: true, message: '璇峰~鍐欏崟浣�', trigger: 'blur' }],
   unitPrice: [{ required: true, message: '璇峰~鍐欏崟浠�', trigger: 'change' }]
 }
@@ -377,25 +329,19 @@
 
 // 璁$畻灞炴��
 const filteredList = computed(() => {
-  let list = quotationList.value
-  return list
+  const keyword = String(searchForm.product || '').trim()
+  if (!keyword) return quotationList.value
+  return quotationList.value.filter((row) => {
+    const p = String(row?.product || '').toLowerCase()
+    return p.includes(keyword.toLowerCase())
+  })
 })
 
 // 鏂规硶
-const getStatusType = (status) => {
-  const statusMap = {
-    '寰呭鎵�': 'info',
-    '瀹℃牳涓�': 'primary',
-    '閫氳繃': 'success',
-    '鎷掔粷': 'danger'
-  }
-  return statusMap[status] || 'info'
-}
+const formatMoney = (value) => `楼${Number(value || 0).toFixed(2)}`
 
 const resetSearch = () => {
-  searchForm.quotationNo = ''
-  searchForm.customer = ''
-  searchForm.status = ''
+  searchForm.product = ''
   // 閲嶇疆鍒扮涓�椤靛苟閲嶆柊鏌ヨ
   pagination.currentPage = 1
   handleSearch()
@@ -464,7 +410,7 @@
 	if (label) {
 		row.product = label;
 	}
-	// 鑾峰彇瑙勬牸鍨嬪彿鍒楄〃锛岃缃埌褰撳墠琛岀殑 modelOptions
+	// 鑾峰彇灏哄鍒楄〃锛岃缃埌褰撳墠琛岀殑 modelOptions
 	modelList({ id: value }).then((res) => {
 		row.modelOptions = res || [];
 	});
@@ -504,29 +450,105 @@
 	}
 	return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
 };
-const handleView = (row) => {
-  // 鍙鍒堕渶瑕佺殑瀛楁锛岄伩鍏嶅皢缁勪欢寮曠敤鏀惧叆鍝嶅簲寮忓璞�
-  currentQuotation.value = {
-    quotationNo: row.quotationNo || '',
-    customer: row.customer || '',
-    salesperson: row.salesperson || '',
-    quotationDate: row.quotationDate || '',
-    validDate: row.validDate || '',
-    paymentMethod: row.paymentMethod || '',
-    status: row.status || '',
-    remark: row.remark || '',
-    products: row.products ? row.products.map(product => ({
-      productId: product.productId || '',
-      product: product.product || product.productName || '',
-      specificationId: product.specificationId || '',
-      specification: product.specification || '',
-      quantity: product.quantity || 0,
-      unit: product.unit || '',
-      unitPrice: product.unitPrice || 0,
-      amount: product.amount || 0
-    })) : [],
-    totalAmount: row.totalAmount || 0
+const mapProductItem = (product) => ({
+  id: product?.id || '',
+  salesQuotationId: product?.salesQuotationId || '',
+  productId: product?.productId || '',
+  product: product?.product || product?.productName || '',
+  specificationId: product?.specificationId || '',
+  specification: product?.specification || '',
+  quantity: product?.quantity || 0,
+  unit: product?.unit || '',
+  paper: product?.paper || '',
+  paperWeight: product?.paperWeight || '',
+  unitPrice: product?.unitPrice || 0,
+  printingFee: Number(product?.printingFee || 0),
+  dieCuttingFee: Number(product?.dieCuttingFee || 0),
+  grindingFee: Number(product?.grindingFee || 0),
+  amount: product?.amount || 0
+})
+
+const mapQuotationItem = (item) => ({
+  id: item?.id,
+  salesQuotationId: item?.salesQuotationId || '',
+  product: item?.product || '',
+  specification: item?.specification || '',
+  unit: item?.unit || '',
+  paper: item?.paper || '',
+  paperWeight: item?.paperWeight || '',
+  unitPrice: Number(item?.unitPrice || 0),
+  printingFee: Number(item?.printingFee || 0),
+  dieCuttingFee: Number(item?.dieCuttingFee || 0),
+  grindingFee: Number(item?.grindingFee || 0),
+  quantity: Number(item?.quantity || 0),
+  amount: Number(item?.amount || 0),
+  createTime: item?.createTime || '',
+  quotationNo: item?.quotationNo || '',
+  customer: item?.customer || '',
+  salesperson: item?.salesperson || '',
+  quotationDate: item?.quotationDate || '',
+  validDate: item?.validDate || '',
+  paymentMethod: item?.paymentMethod || '',
+  status: item?.status || '鑽夌',
+  approveUserIds: item?.approveUserIds || '',
+  remark: item?.remark || '',
+  products: Array.isArray(item?.products) && item.products.length > 0
+    ? item.products.map(mapProductItem)
+    : [mapProductItem(item)],
+  subtotal: item?.subtotal || 0,
+  freight: item?.freight || 0,
+  otherFee: item?.otherFee || 0,
+  discountRate: item?.discountRate || 0,
+  discountAmount: item?.discountAmount || 0,
+  totalAmount: item?.totalAmount || 0
+})
+
+const calcTotalAmountFromProducts = (products) => {
+  return (products || []).reduce((sum, product) => {
+    const price = Number(product.unitPrice) || 0
+    const printingFee = Number(product.printingFee) || 0
+    const dieCuttingFee = Number(product.dieCuttingFee) || 0
+    const grindingFee = Number(product.grindingFee) || 0
+    return sum + price + printingFee + dieCuttingFee + grindingFee
+  }, 0)
+}
+
+const buildProductPayload = (product) => {
+  const quantity = Number(product?.quantity || 0)
+  const unitPrice = Number(product?.unitPrice || 0)
+  const printingFee = Number(product?.printingFee || 0)
+  const dieCuttingFee = Number(product?.dieCuttingFee || 0)
+  const grindingFee = Number(product?.grindingFee || 0)
+  return {
+    id: product?.id || undefined,
+    salesQuotationId: product?.salesQuotationId || form.salesQuotationId || null,
+    product: product?.product || '',
+    specification: product?.specification || '',
+    unit: product?.unit || '',
+    paper: product?.paper || '',
+    paperWeight: product?.paperWeight || '',
+    unitPrice,
+    printingFee,
+    dieCuttingFee,
+    grindingFee,
+    quantity,
+    amount: Number(product?.amount ?? quantity * unitPrice),
+    remark: product?.remark ?? form.remark ?? ''
   }
+}
+
+const handleView = async (row) => {
+  let source = row
+  if (row?.id) {
+    try {
+      const res = await getQuotationProductInfo(row.id)
+      source = res?.data || row
+    } catch (error) {
+      source = row
+    }
+  }
+  source.totalAmount = source.totalAmount || calcTotalAmountFromProducts(source?.products || [source])
+  currentQuotation.value = mapQuotationItem(source)
   viewDialogVisible.value = true
 }
 
@@ -537,24 +559,38 @@
   form.id = row.id || form.id || null
   // 鍏堝姞杞戒骇鍝佹爲鏁版嵁锛屽惁鍒� el-tree-select 鏃犳硶鍙嶆樉浜у搧鍚嶇О
   await getProductOptions()
+  let source = row
+  if (row?.id) {
+    try {
+      const res = await getQuotationProductInfo(row.id)
+      source = res?.data || row
+    } catch (error) {
+      source = row
+    }
+  }
+  source.totalAmount = source.totalAmount || calcTotalAmountFromProducts(source?.products || [source])
+
+  const sourceProducts = Array.isArray(source?.products) && source.products.length > 0
+    ? source.products
+    : [source]
 
   // 鍙鍒堕渶瑕佺殑瀛楁锛岄伩鍏嶅皢缁勪欢寮曠敤鏀惧叆鍝嶅簲寮忓璞�
-  form.quotationNo = row.quotationNo || ''
-  form.customer = row.customer || ''
-  form.salesperson = row.salesperson || ''
-  form.quotationDate = row.quotationDate || ''
-  form.validDate = row.validDate || ''
-  form.paymentMethod = row.paymentMethod || ''
-  form.status = row.status || '鑽夌'
-  form.remark = row.remark || ''
-  form.products = row.products ? await Promise.all(row.products.map(async (product) => {
+  form.quotationNo = source.quotationNo || ''
+  form.customer = source.customer || ''
+  form.salesperson = source.salesperson || ''
+  form.quotationDate = source.quotationDate || ''
+  form.validDate = source.validDate || ''
+  form.paymentMethod = source.paymentMethod || ''
+  form.status = source.status || '鑽夌'
+  form.remark = source.remark || ''
+  form.products = await Promise.all(sourceProducts.map(async (product) => {
     const productName = product.product || product.productName || ''
     // 浼樺厛鐢� productId锛涘鏋滃彧鏈夊悕绉帮紝灏濊瘯鍙嶆煡 id 浠ヤ究鏍戦�夋嫨鍣ㄥ弽鏄�
     const resolvedProductId = product.productId
       ? Number(product.productId)
       : findNodeIdByLabel(productOptions.value, productName) || ''
     
-    // 濡傛灉鏈変骇鍝両D锛屽姞杞藉搴旂殑瑙勬牸鍨嬪彿鍒楄〃
+    // 濡傛灉鏈変骇鍝両D锛屽姞杞藉搴旂殑灏哄鍒楄〃
     let modelOptions = [];
     let resolvedSpecificationId = product.specificationId || '';
     
@@ -571,7 +607,7 @@
           }
         }
       } catch (error) {
-        console.error('鍔犺浇瑙勬牸鍨嬪彿澶辫触:', error);
+        console.error('鍔犺浇灏哄澶辫触:', error);
       }
     }
     
@@ -582,17 +618,22 @@
       specification: product.specification || '',
       quantity: product.quantity || 0,
       unit: product.unit || '',
+      paper: product.paper || '',
+      paperWeight: product.paperWeight || '',
       unitPrice: product.unitPrice || 0,
+      printingFee: Number(product.printingFee || 0),
+      dieCuttingFee: Number(product.dieCuttingFee || 0),
+      grindingFee: Number(product.grindingFee || 0),
       amount: product.amount || 0,
-      modelOptions: modelOptions // 涓烘瘡琛屾坊鍔犵嫭绔嬬殑瑙勬牸鍨嬪彿鍒楄〃
+      modelOptions: modelOptions // 涓烘瘡琛屾坊鍔犵嫭绔嬬殑灏哄鍒楄〃
     }
-  })) : []
-  form.subtotal = row.subtotal || 0
-  form.freight = row.freight || 0
-  form.otherFee = row.otherFee || 0
-  form.discountRate = row.discountRate || 0
-  form.discountAmount = row.discountAmount || 0
-  form.totalAmount = row.totalAmount || 0
+  }))
+  form.subtotal = source.subtotal || 0
+  form.freight = source.freight || 0
+  form.otherFee = source.otherFee || 0
+  form.discountRate = source.discountRate || 0
+  form.discountAmount = source.discountAmount || 0
+  form.totalAmount = source.totalAmount || 0
 
   dialogVisible.value = true
 }
@@ -604,23 +645,21 @@
     cancelButtonText: '鍙栨秷',
     type: 'warning'
   }).then(() => {
-    const index = quotationList.value.findIndex(item => item.id === row.id)
-    if (index > -1) {
-      deleteQuotation(row.id).then(res=>{
-        // console.log(res)
-        if(res.code===200){
-          ElMessage.success('鍒犻櫎鎴愬姛')
-          handleSearch()
-        }
-      })
-      // quotationList.value.splice(index, 1)
-      // pagination.total--
-      // ElMessage.success('鍒犻櫎鎴愬姛')
+    if (!row?.id) {
+      ElMessage.warning('鏈幏鍙栧埌鍙垹闄ょ殑浜у搧ID')
+      return
     }
+    deleteQuotationProduct([row.id]).then(res=>{
+      if(res.code===200){
+        ElMessage.success('鍒犻櫎鎴愬姛')
+        handleSearch()
+      }
+    })
   })
 }
 
 const resetForm = () => {
+  form.id = null
   form.customer = ''
   form.salesperson = ''
   form.quotationDate = ''
@@ -638,6 +677,10 @@
 }
 
 const addProduct = () => {
+  if (isEdit.value) {
+    ElMessage.warning('缂栬緫鏃朵笉鍏佽鏂板浜у搧')
+    return
+  }
   form.products.push({
     productId: '',
     product: '',
@@ -646,9 +689,14 @@
     specification: '',
     quantity: 1,
     unit: '',
+    paper: '',
+    paperWeight: '',
     unitPrice: 0,
+    printingFee: 0,
+    dieCuttingFee: 0,
+    grindingFee: 0,
     amount: 0,
-    modelOptions: [] // 涓烘瘡琛屾坊鍔犵嫭绔嬬殑瑙勬牸鍨嬪彿鍒楄〃
+    modelOptions: [] // 涓烘瘡琛屾坊鍔犵嫭绔嬬殑灏哄鍒楄〃
   })
 }
 
@@ -683,26 +731,28 @@
       // 璁$畻鎵�鏈変骇鍝佺殑鍗曚环鎬诲拰
       form.totalAmount = form.products.reduce((sum, product) => {
         const price = Number(product.unitPrice) || 0
-        return sum + price
+        const printingFee = Number(product.printingFee) || 0
+        const dieCuttingFee = Number(product.dieCuttingFee) || 0
+        const grindingFee = Number(product.grindingFee) || 0
+        return sum + price + printingFee + dieCuttingFee + grindingFee
       }, 0)
-
       if (isEdit.value) {
-        // 缂栬緫
-        const index = quotationList.value.findIndex(item => item.id === editId.value)
-        if (index > -1) {
-          updateQuotation(form).then(res=>{
-            // console.log(res)
-            if(res.code===200){
-              ElMessage.success('缂栬緫鎴愬姛')
-              dialogVisible.value = false
-              handleSearch()
-            }
-          })
-        }
+        const editingItem = form.products[0] || {}
+        const payload = buildProductPayload({
+          ...editingItem,
+          id: editingItem.id || form.id
+        })
+        editQuotationProduct(payload).then((res) => {
+          if (res?.code === 200) {
+            ElMessage.success('缂栬緫鎴愬姛')
+            dialogVisible.value = false
+            handleSearch()
+          }
+        })
       } else {
-        // 鏂板
-        addQuotation(form).then(res=>{
-          if(res.code===200){
+        const payloadList = form.products.map((item) => buildProductPayload(item))
+        addOrUpdateQuotationProduct(payloadList).then((res) => {
+          if (res?.code === 200) {
             ElMessage.success('鏂板鎴愬姛')
             dialogVisible.value = false
             handleSearch()
@@ -720,52 +770,27 @@
   // 鍒嗛〉鍙樺寲鏃堕噸鏂版煡璇㈠垪琛�
   handleSearch()
 }
-const handleSearch = ()=>{
+const handleSearch = (resetPage = false)=>{
+  if (resetPage) {
+    pagination.currentPage = 1
+  }
   const params = {
     // 鍚庣鍒嗛〉鍙傛暟锛歝urrent / size
     current: pagination.currentPage,
     size: pagination.pageSize,
     ...searchForm
   }
-  getQuotationList(params).then(res=>{
-    // console.log(res)
+  quotationProductListPage(params).then(res=>{
     if(res.code===200){
-      // 鍙鍒堕渶瑕佺殑瀛楁锛岄伩鍏嶅皢缁勪欢寮曠敤鎴栧叾浠栧璞℃斁鍏ュ搷搴斿紡瀵硅薄
-      quotationList.value = (res.data.records || []).map(item => ({
-        id: item.id,
-        quotationNo: item.quotationNo || '',
-        customer: item.customer || '',
-        salesperson: item.salesperson || '',
-        quotationDate: item.quotationDate || '',
-        validDate: item.validDate || '',
-        paymentMethod: item.paymentMethod || '',
-        status: item.status || '鑽夌',
-        // 瀹℃壒浜猴紙鐢ㄤ簬缂栬緫鏃跺弽鏄撅級
-        approveUserIds: item.approveUserIds || '',
-        remark: item.remark || '',
-        products: item.products ? item.products.map(product => ({
-          productId: product.productId || '',
-          product: product.product || product.productName || '',
-          specificationId: product.specificationId || '',
-          specification: product.specification || '',
-          quantity: product.quantity || 0,
-          unit: product.unit || '',
-          unitPrice: product.unitPrice || 0,
-          amount: product.amount || 0
-        })) : [],
-        subtotal: item.subtotal || 0,
-        freight: item.freight || 0,
-        otherFee: item.otherFee || 0,
-        discountRate: item.discountRate || 0,
-        discountAmount: item.discountAmount || 0,
-        totalAmount: item.totalAmount || 0
-      }))
+      const records = res.data.records || []
+      quotationList.value = records.map((item) => {
+        const mapped = mapQuotationItem(item)
+        mapped.totalAmount = calcTotalAmountFromProducts(mapped.products)
+        return mapped
+      })
       pagination.total = res.data.total
     }
   })
-	// customerList().then((res) => {
-	// 	customerOption.value = res;
-	// });
 }
 
 const getUserList = async () => {
diff --git a/src/views/salesManagement/strategyControl/index.vue b/src/views/salesManagement/strategyControl/index.vue
index dbdae38..ecff9c7 100644
--- a/src/views/salesManagement/strategyControl/index.vue
+++ b/src/views/salesManagement/strategyControl/index.vue
@@ -48,7 +48,7 @@
             </el-table-column>
             <el-table-column prop="customerName" label="瀹㈡埛鍚嶇О" width="180"/>
             <el-table-column prop="productName" label="浜у搧鍚嶇О" width="200"/>
-            <el-table-column prop="specification" label="瑙勬牸鍨嬪彿" width="120"/>
+            <el-table-column prop="specification" label="灏哄" width="120"/>
             <el-table-column prop="basePrice" label="鍩虹浠锋牸" width="100">
               <template #default="scope">
                 楼{{ scope.row.basePrice }}/鍚�
@@ -628,8 +628,8 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="瑙勬牸鍨嬪彿" prop="specification">
-              <el-input v-model="priceStrategyForm.specification" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" :disabled="priceStrategyDialogMode === 'view'" />
+            <el-form-item label="灏哄" prop="specification">
+              <el-input v-model="priceStrategyForm.specification" placeholder="璇疯緭鍏ュ昂瀵�" :disabled="priceStrategyDialogMode === 'view'" />
             </el-form-item>
           </el-col>
         </el-row>

--
Gitblit v1.9.3