From 9c1e0958af114e4ae2bfaaade28d49753268e9f1 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期一, 06 七月 2026 13:54:54 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_新疆_大罗素马铃薯new' into dev_新疆_大罗素马铃薯new

---
 src/views/officeProcessAutomation/AttendManage/compensatory-leave/index.vue                    |  314 +++++++++++++++++
 src/views/customerService/feedbackRegistration/components/formDia.vue                          |    6 
 src/views/financialManagement/receivable/salesOut.vue                                          |    2 
 src/views/salesManagement/receiptPaymentLedger/index.vue                                       |    6 
 src/views/salesManagement/returnOrder/components/detailDia.vue                                 |    2 
 src/views/salesManagement/salesLedger/index.vue                                                |   14 
 src/api/customerService/index.js                                                               |    4 
 src/views/qualityManagement/finalInspection/index.vue                                          |   11 
 src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue |    5 
 src/views/salesManagement/returnOrder/index.vue                                                |    7 
 src/views/productionManagement/workOrderManagement/index.vue                                   |    5 
 src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue                     |    4 
 src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalModuleRegistry.js       |    8 
 src/views/collaborativeApproval/purchaseApproval/index.vue                                     |    4 
 src/views/salesManagement/returnOrder/components/formDia.vue                                   |    2 
 src/views/collaborativeApproval/shipmentReview/index.vue                                       |    6 
 src/views/procurementManagement/purchaseReturnOrder/index.vue                                  |    5 
 src/api/salesManagement/returnOrder.js                                                         |    2 
 src/views/inventoryManagement/stockManagement/Record.vue                                       |    3 
 src/views/customerService/afterSalesHandling/index.vue                                         |    4 
 src/views/inventoryManagement/receiptManagement/Record.vue                                     |    3 
 src/views/qualityManagement/afterSalesTraceability/index.vue                                   |    8 
 src/views/inventoryManagement/stockManagement/New.vue                                          |  266 ++++++++++----
 src/views/salesManagement/deliveryLedger/index.vue                                             |   37 +
 src/views/equipmentManagement/spareParts/index.vue                                             |   32 
 src/views/reportAnalysis/projectProfit/index.vue                                               |    2 
 src/views/qualityManagement/finalInspection/components/formDia.vue                             |   14 
 src/views/financialManagement/receivable/receipt.vue                                           |    2 
 src/views/safeProduction/safeWorkApproval/components/approvalDia.vue                           |    2 
 src/components/AIChatSidebar/index.vue                                                         |   14 
 src/views/financialManagement/receivable/invoiceApply.vue                                      |    2 
 src/api/equipmentManagement/ledger.js                                                          |    7 
 src/views/financialManagement/receivable/salesReturn.vue                                       |    2 
 src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js         |    1 
 src/views/procurementManagement/paymentLedger/index.vue                                        |    3 
 src/views/procurementManagement/procurementLedger/index.vue                                    |  145 ++++++-
 src/api/salesManagement/salesLedger.js                                                         |    2 
 src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue                      |    2 
 doc/20260618_customer_transactions_optimization.md                                             |    4 
 src/views/productionManagement/productionReporting/index.vue                                   |    2 
 src/views/personnelManagement/classsSheduling/index.vue                                        |   55 ++
 src/views/customerService/feedbackRegistration/index.vue                                       |    4 
 src/views/inventoryManagement/stockManagement/BatchNoQtyDetail.vue                             |    1 
 src/views/productionManagement/productionOrder/index.vue                                       |    5 
 src/views/productionPlan/productionPlan/index.vue                                              |   10 
 doc/20260618_shipping_info_for_return.md                                                       |    4 
 src/views/procurementManagement/receivingManagement/index.vue                                  |    5 
 src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue                     |   22 -
 48 files changed, 833 insertions(+), 237 deletions(-)

diff --git a/doc/20260618_customer_transactions_optimization.md b/doc/20260618_customer_transactions_optimization.md
index b228183..0636265 100644
--- a/doc/20260618_customer_transactions_optimization.md
+++ b/doc/20260618_customer_transactions_optimization.md
@@ -113,7 +113,7 @@
 | 瀛楁 | 绫诲瀷 | 璇存槑 |
 |------|------|------|
 | salesLedgerId | Long | 閿�鍞彴璐D |
-| salesContractNo | String | 閿�鍞悎鍚屽彿 |
+| salesContractNo | String | 璁㈠崟鍙� |
 | productId | Long | 浜у搧ID |
 | productName | String | 浜у搧鍚嶇О |
 | model | String | 瑙勬牸鍨嬪彿 |
@@ -179,7 +179,7 @@
 | 瀛楁 | 绫诲瀷 | 璇存槑 |
 |------|------|------|
 | salesLedgerId | Long | 閿�鍞彴璐D |
-| salesContractNo | String | 閿�鍞悎鍚屽彿 |
+| salesContractNo | String | 璁㈠崟鍙� |
 | shippingId | Long | 鍙戣揣鍗旾D |
 | shippingNo | String | 鍙戣揣鍗曞彿 |
 | productName | String | 浜у搧鍚嶇О |
diff --git a/doc/20260618_shipping_info_for_return.md b/doc/20260618_shipping_info_for_return.md
index 5568361..4f0d175 100644
--- a/doc/20260618_shipping_info_for_return.md
+++ b/doc/20260618_shipping_info_for_return.md
@@ -27,7 +27,7 @@
 |------|------|------|
 | shippingId | Long | 鍙戣揣鍗旾D |
 | shippingNo | String | 鍙戣揣鍗曞彿 |
-| salesContractNo | String | 閿�鍞悎鍚屽彿 |
+| salesContractNo | String | 璁㈠崟鍙� |
 | customerName | String | 瀹㈡埛鍚嶇О |
 | productName | String | 浜у搧鍚嶇О |
 | model | String | 瑙勬牸鍨嬪彿 |
@@ -257,7 +257,7 @@
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="閿�鍞悎鍚屽彿">
+          <el-form-item label="璁㈠崟鍙�">
             <el-input v-model="form.salesContractNo" disabled />
           </el-form-item>
         </el-col>
diff --git a/src/api/customerService/index.js b/src/api/customerService/index.js
index 571601a..0dc4292 100644
--- a/src/api/customerService/index.js
+++ b/src/api/customerService/index.js
@@ -111,7 +111,7 @@
     })
 }
 
-// 鏍规嵁瀹㈡埛鏌ヨ閿�鍞鍗曞彿
+// 鏍规嵁瀹㈡埛鏌ヨ璁㈠崟鍙峰彿
 // afterSalesService/listSalesLedger
 export function getSalesLedger(query) {
     return request({
@@ -121,7 +121,7 @@
     })
 }
 
-// 鏍规嵁閿�鍞鍗曞彿鏌ヨ閿�鍞鍗曡鎯�
+// 鏍规嵁璁㈠崟鍙峰彿鏌ヨ璁㈠崟鍙疯鎯�
 // afterSalesService/count
 export function getSalesLedgerDetail(query) {
     return request({
diff --git a/src/api/equipmentManagement/ledger.js b/src/api/equipmentManagement/ledger.js
index d1b65b0..445d60d 100644
--- a/src/api/equipmentManagement/ledger.js
+++ b/src/api/equipmentManagement/ledger.js
@@ -42,3 +42,10 @@
     method: "get",
   });
 };
+
+export const getIotDeviceList = () => {
+  return request({
+    url: "/device/ledger/iotDeviceList",
+    method: "get",
+  });
+};
diff --git a/src/api/salesManagement/returnOrder.js b/src/api/salesManagement/returnOrder.js
index b809aa7..fccd015 100644
--- a/src/api/salesManagement/returnOrder.js
+++ b/src/api/salesManagement/returnOrder.js
@@ -51,7 +51,7 @@
   });
 }
 
-// 閿�鍞��璐�-鏍规嵁鍑哄簱鍗曟煡璇㈤攢鍞鍗曚互鍙婁骇鍝佷俊鎭�
+// 閿�鍞��璐�-鏍规嵁鍑哄簱鍗曟煡璇㈣鍗曞彿浠ュ強浜у搧淇℃伅
 // /returnManagement/getByShippingId
 export function returnManagementGetByShippingId(query) {
   return request({
diff --git a/src/api/salesManagement/salesLedger.js b/src/api/salesManagement/salesLedger.js
index 6548927..4b2c1c3 100644
--- a/src/api/salesManagement/salesLedger.js
+++ b/src/api/salesManagement/salesLedger.js
@@ -101,7 +101,7 @@
   });
 }
 
-// 鏍规嵁閿�鍞悎鍚屽彿鏌ヤ骇鍝佷俊鎭�
+// 鏍规嵁璁㈠崟鍙锋煡浜у搧淇℃伅
 export function getProductInfoByContractNo(query) {
   return request({
     url: "/purchase/ledger/getProductBySalesNo",
diff --git a/src/components/AIChatSidebar/index.vue b/src/components/AIChatSidebar/index.vue
index 7b22d7b..5c21d17 100644
--- a/src/components/AIChatSidebar/index.vue
+++ b/src/components/AIChatSidebar/index.vue
@@ -1147,7 +1147,7 @@
   collectionStrategy: '鍥炴绛栫暐',
   quotationStrategy: '鎶ヤ环绛栫暐',
   nextAction: '涓嬩竴姝ュ姩浣�',
-  salesContractNo: '閿�鍞悎鍚屽彿',
+  salesContractNo: '璁㈠崟鍙�',
   revenue: '鏀跺叆',
   materialCost: '鏉愭枡鎴愭湰',
   laborCost: '浜哄伐鎴愭湰',
@@ -1188,9 +1188,9 @@
   purchaseContractNumber: '閲囪喘鍚堝悓鍙�',
   purchaseContractNo: '閲囪喘鍚堝悓鍙�',
   purchaseOrderNumber: '閲囪喘鍚堝悓鍙�',
-  salesContractNo: '閿�鍞悎鍚屽彿',
-  salesContractNumber: '閿�鍞悎鍚屽彿',
-  salesOrderNumber: '閿�鍞悎鍚屽彿',
+  salesContractNo: '璁㈠崟鍙�',
+  salesContractNumber: '璁㈠崟鍙�',
+  salesOrderNumber: '璁㈠崟鍙�',
   salesContractNoId: '閿�鍞悎鍚孖D',
   approveUserIds: '瀹℃壒鐢ㄦ埛ID鍒楄〃',
   entryDateStart: '褰曞叆寮�濮嬫棩鏈�',
@@ -1253,9 +1253,9 @@
   閲囪喘鍚堝悓鍙�: 'purchaseContractNumber',
   閲囪喘鍗曞彿: 'purchaseContractNumber',
   閲囪喘璁㈠崟鍙�: 'purchaseContractNumber',
-  閿�鍞悎鍚屽彿: 'salesContractNo',
-  閿�鍞崟鍙�: 'salesContractNo',
-  閿�鍞鍗曞彿: 'salesContractNo',
+  璁㈠崟鍙�: 'salesContractNo',
+  璁㈠崟鍙�: 'salesContractNo',
+  璁㈠崟鍙峰彿: 'salesContractNo',
   閿�鍞悎鍚孖D: 'salesContractNoId',
   瀹℃壒鐢ㄦ埛ID鍒楄〃: 'approveUserIds',
   褰曞叆寮�濮嬫棩鏈�: 'entryDateStart',
diff --git a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
index 0605fe5..78680c4 100644
--- a/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
+++ b/src/views/collaborativeApproval/approvalProcess/components/approvalDia.vue
@@ -128,7 +128,7 @@
                 <el-descriptions-item label="閲囪喘鍚堝悓鍙�">{{ currentPurchase.purchaseContractNumber }}</el-descriptions-item>
                 <el-descriptions-item label="渚涘簲鍟嗗悕绉�">{{ currentPurchase.supplierName }}</el-descriptions-item>
                 <el-descriptions-item label="椤圭洰鍚嶇О">{{ currentPurchase.projectName }}</el-descriptions-item>
-                <el-descriptions-item label="閿�鍞悎鍚屽彿">{{ currentPurchase.salesContractNo }}</el-descriptions-item>
+                <el-descriptions-item label="璁㈠崟鍙�">{{ currentPurchase.salesContractNo }}</el-descriptions-item>
                 <el-descriptions-item label="绛捐鏃ユ湡">{{ currentPurchase.executionDate }}</el-descriptions-item>
                 <el-descriptions-item label="褰曞叆鏃ユ湡">{{ currentPurchase.entryDate }}</el-descriptions-item>
                 <el-descriptions-item label="浠樻鏂瑰紡">{{ currentPurchase.paymentMethod }}</el-descriptions-item>
@@ -186,7 +186,7 @@
             <template v-else>
               <el-descriptions :column="2"
                                border>
-                <el-descriptions-item label="閿�鍞鍗�">{{ currentDelivery.shippingInfo.salesContractNo || '--' }}</el-descriptions-item>
+                <el-descriptions-item label="璁㈠崟鍙�">{{ currentDelivery.shippingInfo.salesContractNo || '--' }}</el-descriptions-item>
                 <el-descriptions-item label="鍙戣揣璁㈠崟鍙�">{{ currentDelivery.shippingInfo.shippingNo || '--' }}</el-descriptions-item>
                 <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ currentDelivery.shippingInfo.customerName || '--' }}</el-descriptions-item>
                 <el-descriptions-item label="鍙戣揣绫诲瀷">{{ currentDelivery.shippingInfo.type || '--' }}</el-descriptions-item>
diff --git a/src/views/collaborativeApproval/purchaseApproval/index.vue b/src/views/collaborativeApproval/purchaseApproval/index.vue
index bdd4182..3a07436 100644
--- a/src/views/collaborativeApproval/purchaseApproval/index.vue
+++ b/src/views/collaborativeApproval/purchaseApproval/index.vue
@@ -19,7 +19,7 @@
                       clearable
                       :prefix-icon="Search" />
           </el-form-item>
-          <el-form-item label="閿�鍞悎鍚屽彿锛�">
+          <el-form-item label="璁㈠崟鍙凤細">
             <el-input v-model="searchForm.salesContractNo"
                       placeholder="璇疯緭鍏�"
                       clearable
@@ -101,7 +101,7 @@
                          prop="purchaseContractNumber"
                          width="200"
                          show-overflow-tooltip />
-        <el-table-column label="閿�鍞悎鍚屽彿"
+        <el-table-column label="璁㈠崟鍙�"
                          prop="salesContractNo"
                          width="200"
                          show-overflow-tooltip />
diff --git a/src/views/collaborativeApproval/shipmentReview/index.vue b/src/views/collaborativeApproval/shipmentReview/index.vue
index ac2b790..c8ab5d8 100644
--- a/src/views/collaborativeApproval/shipmentReview/index.vue
+++ b/src/views/collaborativeApproval/shipmentReview/index.vue
@@ -2,11 +2,11 @@
   <div class="app-container">
     <div class="search_form">
       <div>
-        <span class="search_title">閿�鍞悎鍚屽彿锛�</span>
+        <span class="search_title">璁㈠崟鍙凤細</span>
         <el-input
             v-model="searchForm.salesContractNo"
             style="width: 240px"
-            placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿鎼滅储"
+            placeholder="璇疯緭鍏ヨ鍗曞彿鎼滅储"
             @change="handleQuery"
             clearable
             :prefix-icon="Search"
@@ -110,7 +110,7 @@
     },
   },
   {
-    label: "閿�鍞悎鍚屽彿",
+    label: "璁㈠崟鍙�",
     prop: "salesContractNo",
     width: 170
   },
diff --git a/src/views/customerService/afterSalesHandling/index.vue b/src/views/customerService/afterSalesHandling/index.vue
index a42337d..c2f84dd 100644
--- a/src/views/customerService/afterSalesHandling/index.vue
+++ b/src/views/customerService/afterSalesHandling/index.vue
@@ -67,7 +67,7 @@
               <el-form-item>
                 <el-input
                     v-model="searchForm.orderNo"
-                    placeholder="璇疯緭鍏ラ攢鍞崟鍙�"
+                    placeholder="璇疯緭鍏ヨ鍗曞彿"
                     clearable
                 />
               </el-form-item>
@@ -146,7 +146,7 @@
     align: "center"
   },
   {
-    label: "閿�鍞崟鍙�",
+    label: "璁㈠崟鍙�",
     prop:"salesContractNo",
     width: 150,
     align: "center"
diff --git a/src/views/customerService/feedbackRegistration/components/formDia.vue b/src/views/customerService/feedbackRegistration/components/formDia.vue
index d0ba87b..280f2a1 100644
--- a/src/views/customerService/feedbackRegistration/components/formDia.vue
+++ b/src/views/customerService/feedbackRegistration/components/formDia.vue
@@ -38,7 +38,7 @@
               </el-form-item>
             </el-col>
             <el-col :span="4">
-              <el-form-item label="鍏宠仈閿�鍞崟鍙凤細"
+              <el-form-item label="鍏宠仈璁㈠崟鍙凤細"
                             prop="salesContractNo">
                 <el-select v-model="form.salesContractNo"
                            @change="associatedSalesOrderNumberChange"
@@ -231,8 +231,8 @@
       dataType: "slot",
       slot: "shippingStatus",
     },
-    { label: "蹇�掑叕鍙�", prop: "expressCompany", width: 140 },
-    { label: "蹇�掑崟鍙�", prop: "expressNumber", width: 160 },
+    // { label: "蹇�掑叕鍙�", prop: "expressCompany", width: 140 },
+    // { label: "蹇�掑崟鍙�", prop: "expressNumber", width: 160 },
     {
       label: "鍙戣揣杞︾墝",
       prop: "shippingCarNumber",
diff --git a/src/views/customerService/feedbackRegistration/index.vue b/src/views/customerService/feedbackRegistration/index.vue
index bdec0f2..1df1c3e 100644
--- a/src/views/customerService/feedbackRegistration/index.vue
+++ b/src/views/customerService/feedbackRegistration/index.vue
@@ -67,7 +67,7 @@
           <el-col :span="4">
             <el-form-item>
               <el-input v-model="searchForm.orderNo"
-                        placeholder="璇疯緭鍏ラ攢鍞崟鍙�"
+                        placeholder="璇疯緭鍏ヨ鍗曞彿"
                         clearable />
             </el-form-item>
           </el-col>
@@ -182,7 +182,7 @@
       align: "center",
     },
     {
-      label: "閿�鍞崟鍙�",
+      label: "璁㈠崟鍙�",
       prop: "salesContractNo",
       width: 150,
       align: "center",
diff --git a/src/views/equipmentManagement/spareParts/index.vue b/src/views/equipmentManagement/spareParts/index.vue
index a060a85..da77df5 100644
--- a/src/views/equipmentManagement/spareParts/index.vue
+++ b/src/views/equipmentManagement/spareParts/index.vue
@@ -241,26 +241,26 @@
     slot: "status",
     dataType: "slot",
   },
-  {
-    label: "浠锋牸",
-    prop: "price",
-  },
+  // {
+  //   label: "浠锋牸",
+  //   prop: "price",
+  // },
   {
     label: "鏁伴噺",
     prop: "quantity",
   },
-  {
-    label: "搴撳瓨棰勮鏁伴噺",
-    prop: "warnNum",
-  },
-  {
-    label: "棰勮閫氱煡浜�",
-    prop: "notifyPersonName",
-  },
-  {
-    label: "鎻忚堪",
-    prop: "description",
-  },
+  // {
+  //   label: "搴撳瓨棰勮鏁伴噺",
+  //   prop: "warnNum",
+  // },
+  // {
+  //   label: "棰勮閫氱煡浜�",
+  //   prop: "notifyPersonName",
+  // },
+  // {
+  //   label: "鎻忚堪",
+  //   prop: "description",
+  // },
   {
     label: "鎿嶄綔",
     prop: "operation",
diff --git a/src/views/financialManagement/receivable/invoiceApply.vue b/src/views/financialManagement/receivable/invoiceApply.vue
index 528c887..41f8c70 100644
--- a/src/views/financialManagement/receivable/invoiceApply.vue
+++ b/src/views/financialManagement/receivable/invoiceApply.vue
@@ -240,7 +240,7 @@
         <el-table-column prop="customerName" label="瀹㈡埛鍚嶇О" min-width="120" show-overflow-tooltip />
         <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="120" show-overflow-tooltip />
         <el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" min-width="140" show-overflow-tooltip />
-        <el-table-column prop="salesContractNo" label="閿�鍞悎鍚屽彿" min-width="140" show-overflow-tooltip />
+        <el-table-column prop="salesContractNo" label="璁㈠崟鍙�" min-width="140" show-overflow-tooltip />
         <el-table-column prop="shippingNo" label="鍙戣揣鍗曞彿" min-width="130" show-overflow-tooltip />
         <el-table-column prop="shippingDate" label="鍙戣揣鏃ユ湡" width="110" align="center" />
         <el-table-column prop="outboundAmount" label="鍑哄簱閲戦" width="110" align="right">
diff --git a/src/views/financialManagement/receivable/receipt.vue b/src/views/financialManagement/receivable/receipt.vue
index 3b200c8..693d25c 100644
--- a/src/views/financialManagement/receivable/receipt.vue
+++ b/src/views/financialManagement/receivable/receipt.vue
@@ -257,7 +257,7 @@
                          min-width="140"
                          show-overflow-tooltip />
         <el-table-column prop="salesContractNo"
-                         label="閿�鍞悎鍚屽彿"
+                         label="璁㈠崟鍙�"
                          min-width="140"
                          show-overflow-tooltip />
         <el-table-column prop="shippingNo"
diff --git a/src/views/financialManagement/receivable/salesOut.vue b/src/views/financialManagement/receivable/salesOut.vue
index 0e24b37..2b0b66b 100644
--- a/src/views/financialManagement/receivable/salesOut.vue
+++ b/src/views/financialManagement/receivable/salesOut.vue
@@ -96,7 +96,7 @@
             }),
     },
     { label: "鍙戣揣缂栧彿", prop: "shippingNo", minWidth: "140" },
-    { label: "閿�鍞鍗曞彿", prop: "salesContractNo", minWidth: "150" },
+    { label: "璁㈠崟鍙峰彿", prop: "salesContractNo", minWidth: "150" },
   ];
 
   const dataList = ref([]);
diff --git a/src/views/financialManagement/receivable/salesReturn.vue b/src/views/financialManagement/receivable/salesReturn.vue
index f57f4ab..eada751 100644
--- a/src/views/financialManagement/receivable/salesReturn.vue
+++ b/src/views/financialManagement/receivable/salesReturn.vue
@@ -87,7 +87,7 @@
         : Number(val).toLocaleString("zh-CN", { minimumFractionDigits: 2, maximumFractionDigits: 2 }),
   },
   { label: "閫�璐у師鍥�", prop: "returnReason", minWidth: "150", showOverflowTooltip: true },
-  { label: "閿�鍞鍗曞彿", prop: "salesContractNo", minWidth: "150" },
+  { label: "璁㈠崟鍙峰彿", prop: "salesContractNo", minWidth: "150" },
 ];
 
 const dataList = ref([]);
diff --git a/src/views/inventoryManagement/receiptManagement/Record.vue b/src/views/inventoryManagement/receiptManagement/Record.vue
index de2b2f0..c89b6fe 100644
--- a/src/views/inventoryManagement/receiptManagement/Record.vue
+++ b/src/views/inventoryManagement/receiptManagement/Record.vue
@@ -122,6 +122,9 @@
         <el-table-column label="鍗曚綅"
                          prop="unit"
                          show-overflow-tooltip />
+        <el-table-column label="搴撲綅"
+                         prop="warehouse"
+                         show-overflow-tooltip />
         <el-table-column label="鍏ュ簱鏁伴噺"
                          prop="stockInNum"
                          show-overflow-tooltip />
diff --git a/src/views/inventoryManagement/stockManagement/BatchNoQtyDetail.vue b/src/views/inventoryManagement/stockManagement/BatchNoQtyDetail.vue
index a835ef4..f37c639 100644
--- a/src/views/inventoryManagement/stockManagement/BatchNoQtyDetail.vue
+++ b/src/views/inventoryManagement/stockManagement/BatchNoQtyDetail.vue
@@ -24,6 +24,7 @@
           <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
           <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
           <el-table-column label="鎵瑰彿" prop="batchNo" show-overflow-tooltip />
+          <el-table-column label="搴撲綅" prop="warehouse" show-overflow-tooltip />
           <el-table-column
             label="鍚堟牸搴撳瓨鏁伴噺"
             prop="qualifiedQuantity"
diff --git a/src/views/inventoryManagement/stockManagement/New.vue b/src/views/inventoryManagement/stockManagement/New.vue
index d49fc5a..ee03f68 100644
--- a/src/views/inventoryManagement/stockManagement/New.vue
+++ b/src/views/inventoryManagement/stockManagement/New.vue
@@ -8,77 +8,147 @@
                :model="formState"
                label-position="top"
                ref="formRef">
-        <el-form-item label="浜у搧鍚嶇О"
-                      prop="productModelId"
-                      :rules="[
-                {
-                required: true,
-                message: '璇烽�夋嫨浜у搧',
-                trigger: 'change',
-              }
-            ]">
-          <el-button type="primary"
-                     @click="showProductSelectDialog = true">
-            {{ formState.productName ? formState.productName : '閫夋嫨浜у搧' }}
-          </el-button>
-        </el-form-item>
-        <el-form-item label="瑙勬牸"
-                      prop="productModelName">
-          <el-input v-model="formState.productModelName"
-                    disabled />
-        </el-form-item>
-        <el-form-item label="鍗曚綅"
-                      prop="unit">
-          <el-input v-model="formState.unit"
-                    disabled />
-        </el-form-item>
-        <el-form-item label="搴撳瓨绫诲瀷"
-                      prop="type"
-                      :rules="[
-                {
-                required: true,
-                message: '璇烽�夋嫨搴撳瓨绫诲瀷',
-                trigger: 'change',
-              }
-            ]">
-          <el-select v-model="formState.type"
-                     placeholder="璇烽�夋嫨搴撳瓨绫诲瀷">
-            <el-option label="鍚堟牸搴撳瓨"
-                       value="qualified" />
-            <el-option label="涓嶅悎鏍煎簱瀛�"
-                       value="unqualified" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="搴撳瓨鏁伴噺"
-                      prop="qualitity">
-          <el-input-number v-model="formState.qualitity"
-                           :step="1"
-                           :min="1"
-                           style="width: 100%" />
-        </el-form-item>
-        <el-form-item label="鎵瑰彿"
-                      prop="batchNo">
-          <el-input v-model="formState.batchNo"
-                    placeholder="璇疯緭鍏ユ壒鍙�" />
-        </el-form-item>
-        <el-form-item v-if="formState.type === 'qualified'"
-                      label="搴撳瓨棰勮鏁伴噺"
-                      prop="warnNum">
-          <el-input-number v-model="formState.warnNum"
-                           :step="1"
-                           :min="0"
-                           :max="formState.qualitity"
-                           style="width: 100%" />
-        </el-form-item>
-        <el-form-item label="鍏ュ簱鏃堕棿"
-                      prop="createTime">
-          <el-date-picker v-model="formState.createTime"
-                          type="datetime"
-                          placeholder="璇烽�夋嫨鍏ュ簱鏃堕棿"
-                          value-format="YYYY-MM-DD HH:mm:ss"
-                          format="YYYY-MM-DD HH:mm:ss"
-                          style="width: 100%" />
-        </el-form-item>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="浜у搧鍚嶇О"
+                          prop="productModelId"
+                          :rules="[
+                    {
+                    required: true,
+                    message: '璇烽�夋嫨浜у搧',
+                    trigger: 'change',
+                  }
+                ]">
+              <el-button type="primary"
+                         @click="showProductSelectDialog = true">
+                {{ formState.productName ? formState.productName : '閫夋嫨浜у搧' }}
+              </el-button>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="瑙勬牸"
+                          prop="productModelName">
+              <el-input v-model="formState.productModelName"
+                        disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍗曚綅"
+                          prop="unit">
+              <el-input v-model="formState.unit"
+                        disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="搴撳瓨绫诲瀷"
+                          prop="type"
+                          :rules="[
+                    {
+                    required: true,
+                    message: '璇烽�夋嫨搴撳瓨绫诲瀷',
+                    trigger: 'change',
+                  }
+                ]">
+              <el-select v-model="formState.type"
+                         placeholder="璇烽�夋嫨搴撳瓨绫诲瀷">
+                <el-option label="鍚堟牸搴撳瓨"
+                           value="qualified" />
+                <el-option label="涓嶅悎鏍煎簱瀛�"
+                           value="unqualified" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="搴撳瓨鏁伴噺"
+                          prop="qualitity">
+              <el-input-number v-model="formState.qualitity"
+                               :step="1"
+                               :min="1"
+                               style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎵瑰彿"
+                          prop="batchNo">
+              <el-input v-model="formState.batchNo"
+                        placeholder="璇疯緭鍏ユ壒鍙�" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鍏ュ簱鏃堕棿"
+                          prop="createTime">
+              <el-date-picker v-model="formState.createTime"
+                              type="datetime"
+                              placeholder="璇烽�夋嫨鍏ュ簱鏃堕棿"
+                              value-format="YYYY-MM-DD HH:mm:ss"
+                              format="YYYY-MM-DD HH:mm:ss"
+                              style="width: 100%" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item v-if="formState.type === 'qualified'"
+                          label="搴撳瓨棰勮鏁伴噺"
+                          prop="warnNum">
+              <el-input-number v-model="formState.warnNum"
+                               :step="1"
+                               :min="0"
+                               :max="formState.qualitity"
+                               style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="鏄惁璐ㄦ"
+                          prop="needInspect">
+              <el-switch v-model="formState.needInspect"
+                         active-text="闇�瑕佽川妫�"
+                         inactive-text="鐩存帴鍏ュ簱" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item v-if="formState.needInspect"
+                          label="璐ㄦ绫诲瀷"
+                          prop="inspectType">
+              <el-radio-group v-model="formState.inspectType">
+                <el-radio :value="0">鍘熸潗鏂欐楠�</el-radio>
+                <el-radio :value="1">杩囩▼妫�楠�</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="閫夋嫨璁惧"
+                          prop="deviceId">
+              <el-select v-model="formState.deviceId"
+                         placeholder="璇烽�夋嫨璁惧"
+                         filterable
+                         clearable
+                         style="width: 100%"
+                         @change="handleDeviceChange">
+                <el-option v-for="device in iotDeviceList"
+                           :key="device.id"
+                           :label="device.deviceName"
+                           :value="device.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="搴撲綅"
+                          prop="warehouse">
+              <el-input v-model="formState.warehouse"
+                        placeholder="閫夋嫨璁惧鍚庤嚜鍔ㄨ幏鍙�"
+                        disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-form-item label="澶囨敞"
                       prop="remark">
           <el-input v-model="formState.remark"
@@ -102,10 +172,11 @@
 </template>
 
 <script setup>
-  import { ref, computed, watch, getCurrentInstance } from "vue";
+  import { ref, computed, watch, getCurrentInstance, onMounted } from "vue";
   import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
   import { addStockInRecordOnly } from "@/api/inventoryManagement/stockInventory.js";
   import { createStockUnInventory } from "@/api/inventoryManagement/stockUninventory.js";
+  import { getIotDeviceList as getIotDeviceListApi } from "@/api/equipmentManagement/ledger.js";
 
   const props = defineProps({
     visible: {
@@ -134,7 +205,14 @@
     warnNum: 0,
     createTime: "",
     remark: "",
+    needInspect: false,
+    inspectType: 0,
+    deviceId: "",
+    warehouse: "",
   });
+
+  // IoT璁惧鍒楄〃
+  const iotDeviceList = ref([]);
 
   const isShow = computed({
     get() {
@@ -173,6 +251,10 @@
       warnNum: 0,
       createTime: "",
       remark: "",
+      needInspect: false,
+      inspectType: 0,
+      deviceId: "",
+      warehouse: "",
     };
     isShow.value = false;
   };
@@ -192,6 +274,32 @@
     }
   };
 
+  // 鑾峰彇IoT璁惧鍒楄〃
+  const getIotDeviceList = async () => {
+    try {
+      const res = await getIotDeviceListApi();
+      if (res.data) {
+        iotDeviceList.value = res.data;
+      }
+    } catch (error) {
+      console.error("鑾峰彇IoT璁惧鍒楄〃澶辫触:", error);
+    }
+  };
+
+  // 璁惧閫夋嫨鍙樻洿鏃讹紝鑷姩濉厖搴撲綅
+  const handleDeviceChange = (deviceId) => {
+    const device = iotDeviceList.value.find(d => d.id === deviceId);
+    if (device) {
+      formState.value.warehouse = device.storageLocation || '';
+    } else {
+      formState.value.warehouse = '';
+    }
+  };
+
+  onMounted(() => {
+    getIotDeviceList();
+  });
+
   const handleSubmit = () => {
     proxy.$refs["formRef"].validate(valid => {
       if (valid) {
@@ -204,17 +312,21 @@
           proxy.$modal.msgError("璇烽�夋嫨瑙勬牸");
           return;
         }
+        // 鏋勫缓璇锋眰鍙傛暟
+        const params = {
+          ...formState.value,
+          // 濡傛灉涓嶉渶瑕佽川妫�锛屼笉浼� inspectType
+          inspectType: formState.value.needInspect ? formState.value.inspectType : undefined,
+        };
         if (formState.value.type === "qualified") {
-          addStockInRecordOnly(formState.value).then(res => {
-            // 鍏抽棴妯℃�佹
+          addStockInRecordOnly(params).then(res => {
             isShow.value = false;
-            // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
             emit("completed");
             proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
           });
         } else {
-          formState.value.warnNum = 0;
-          createStockUnInventory(formState.value).then(res => {
+          params.warnNum = 0;
+          createStockUnInventory(params).then(res => {
             // 鍏抽棴妯℃�佹
             isShow.value = false;
             // 鍛婄煡鐖剁粍浠跺凡瀹屾垚
diff --git a/src/views/inventoryManagement/stockManagement/Record.vue b/src/views/inventoryManagement/stockManagement/Record.vue
index 1263dad..b25c570 100644
--- a/src/views/inventoryManagement/stockManagement/Record.vue
+++ b/src/views/inventoryManagement/stockManagement/Record.vue
@@ -87,6 +87,9 @@
         <el-table-column label="鎵瑰彿"
                          prop="batchNo"
                          show-overflow-tooltip />
+        <el-table-column label="搴撲綅"
+                         prop="warehouse"
+                         show-overflow-tooltip />
         <el-table-column label="鐗╄仈璁惧"
                          prop="warehouse"
                          show-overflow-tooltip
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
index 9689be8..d71941a 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -60,7 +60,7 @@
         <div v-if="detailData.shippingInfo" class="shipment-detail">
           <el-divider content-position="left">鍙戣揣璇︽儏</el-divider>
           <el-descriptions :column="2" border>
-            <el-descriptions-item label="閿�鍞鍗�">{{
+            <el-descriptions-item label="璁㈠崟鍙�">{{
               detailData.shippingInfo.salesContractNo || "--"
             }}</el-descriptions-item>
             <el-descriptions-item label="鍑哄簱鎵瑰彿">{{
@@ -142,7 +142,7 @@
             <el-descriptions-item label="椤圭洰鍚嶇О">{{
               detailData.projectName || "--"
             }}</el-descriptions-item>
-            <el-descriptions-item label="閿�鍞悎鍚屽彿">{{
+            <el-descriptions-item label="璁㈠崟鍙�">{{
               detailData.salesContractNo || "--"
             }}</el-descriptions-item>
             <el-descriptions-item label="绛捐鏃ユ湡">{{
@@ -167,6 +167,7 @@
               <el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" />
               <el-table-column prop="unit" label="鍗曚綅" />
               <el-table-column prop="quantity" label="鏁伴噺" />
+              <el-table-column prop="storageLocation" label="搴撲綅" />
               <el-table-column prop="taxInclusiveUnitPrice" label="鍚◣鍗曚环">
                 <template #default="scope"
                   >楼{{
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalModuleRegistry.js b/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalModuleRegistry.js
index fd56eca..dbc4c31 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalModuleRegistry.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-shared/approvalModuleRegistry.js
@@ -8,6 +8,7 @@
   RESIGN: "resign",
   WORK_HANDOVER: "work_handover",
   LEAVE: "leave",
+  COMPENSATORY: "compensatory",
   OVERTIME: "overtime",
   TRAVEL_REIMBURSE: "travel_reimburse",
   COST_REIMBURSE: "cost_reimburse",
@@ -20,6 +21,7 @@
   [APPROVAL_MODULE_KEYS.TRANSFER]: 11,
   [APPROVAL_MODULE_KEYS.WORK_HANDOVER]: 13,
   [APPROVAL_MODULE_KEYS.LEAVE]: 14,
+  [APPROVAL_MODULE_KEYS.COMPENSATORY]: 19,
   [APPROVAL_MODULE_KEYS.OVERTIME]: 15,
   [APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE]: 16,
   [APPROVAL_MODULE_KEYS.COST_REIMBURSE]: 17,
@@ -57,6 +59,12 @@
     businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.LEAVE],
     typeLabels: ["璇峰亣", "璇峰亣鐢宠", "璇峰亣瀹℃壒"],
   },
+  [APPROVAL_MODULE_KEYS.COMPENSATORY]: {
+    label: "璋冧紤鐢宠",
+    approvalType: "compensatory",
+    businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.COMPENSATORY],
+    typeLabels: ["璋冧紤", "璋冧紤鐢宠", "璋冧紤瀹℃壒"],
+  },
   [APPROVAL_MODULE_KEYS.OVERTIME]: {
     label: "鍔犵彮鐢宠",
     approvalType: "overtime",
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue b/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
index d094c13..4830157 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/index.vue
@@ -167,26 +167,6 @@
 
         </el-row>
 
-        <el-form-item label="妯℃澘璇存槑">
-
-          <el-input
-
-            v-model="form.description"
-
-            type="textarea"
-
-            :rows="2"
-
-            placeholder="绠�瑕佽鏄庤妯℃澘鐨勯�傜敤鍦烘櫙"
-
-            maxlength="200"
-
-            show-word-limit
-
-          />
-
-        </el-form-item>
-
         <el-form-item label="濉姤閰嶇疆">
 
           <FormConfigEditor
@@ -259,8 +239,6 @@
           </el-tag>
 
         </el-descriptions-item>
-
-        <el-descriptions-item label="璇存槑" :span="2">{{ detailRow.description || "鈥�" }}</el-descriptions-item>
 
         <el-descriptions-item label="濉姤鎻愮ず" :span="2">
 
diff --git a/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js b/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js
index 8622e8b..6883cfd 100644
--- a/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js
+++ b/src/views/officeProcessAutomation/ApproveManage/approve-template/useApproveTemplate.js
@@ -94,7 +94,6 @@
       align: "center",
       formatData: (v) => templateTypeLabel(v),
     },
-    { label: "璇存槑", prop: "description", minWidth: 160, showOverflowTooltip: true },
     {
       label: "鑺傜偣鏁�",
       prop: "flowNodes",
diff --git a/src/views/officeProcessAutomation/AttendManage/compensatory-leave/index.vue b/src/views/officeProcessAutomation/AttendManage/compensatory-leave/index.vue
new file mode 100644
index 0000000..5eea7a3
--- /dev/null
+++ b/src/views/officeProcessAutomation/AttendManage/compensatory-leave/index.vue
@@ -0,0 +1,314 @@
+<!--OA妯″潡锛氳皟浼戠敵璇�-->
+<template>
+  <div class="app-container">
+    <div class="search_form mb20">
+      <div>
+        <span class="search_title">瀹℃壒鍗曞彿锛�</span>
+        <el-input
+          v-model="searchForm.instanceNo"
+          style="width: 220px"
+          placeholder="璇疯緭鍏ュ鎵瑰崟鍙�"
+          clearable
+          @keyup.enter="onSearch"
+        />
+        <span class="search_title" style="margin-left: 12px">鐢宠浜猴細</span>
+        <el-input
+          v-model="searchForm.applicantKeyword"
+          style="width: 220px"
+          placeholder="濮撳悕鎴栫紪鍙�"
+          clearable
+          :prefix-icon="Search"
+          @keyup.enter="onSearch"
+        />
+        <el-button type="primary" style="margin-left: 10px" @click="onSearch">鎼滅储</el-button>
+        <el-button @click="resetSearch">閲嶇疆</el-button>
+      </div>
+      <div>
+        <el-button type="primary" @click="openAddWithTemplate">鏂板璋冧紤鐢宠</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable
+        rowKey="id"
+        :column="tableColumn"
+        :tableData="tableData"
+        :page="page"
+        :isSelection="false"
+        :tableLoading="tableLoading"
+        @pagination="onPagination"
+        :total="page.total"
+      />
+    </div>
+
+    <ApprovalInstanceSubmitDialog
+      v-model="submitDialog.visible"
+      :title="submitDialogTitle"
+      :form="submitForm"
+      :rules="submitFormRules"
+      :fields="submitFormFields"
+      :active-template="activeTemplate"
+      :user-options="flowUserOptions"
+      :is-edit="isSubmitEdit"
+      :saving="submitSaving"
+      :form-ref="submitFormRef"
+      flow-attachments-only
+      @submit="onSubmit"
+    >
+      <template #before="{ form, fields }">
+        <FormPayloadFields :fields="displayTemplateFields(fields)" :form-payload="form.formPayload" />
+        <el-row :gutter="24">
+          <el-col :span="12">
+            <el-form-item label="璋冧紤浣欓" prop="compensatoryBalanceHours">
+              <el-input-number
+                v-model="form.compensatoryBalanceHours"
+                :min="0"
+                :max="9999"
+                :precision="2"
+                :step="1"
+                controls-position="right"
+                placeholder="灏忔椂"
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璋冧紤鏃堕暱">
+              <el-input :model-value="compensatoryDurationDisplay(form)" readonly placeholder="鏍规嵁妯℃澘涓皟浼戞椂闂磋嚜鍔ㄨ绠�">
+                <template #append>灏忔椂</template>
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </template>
+    </ApprovalInstanceSubmitDialog>
+
+    <ApprovalTemplateBindDialog
+      v-model:visible="templateBindVisible"
+      :module-key="APPROVAL_MODULE_KEYS.COMPENSATORY"
+      skip-form-confirm
+      @confirm="onTemplateBound"
+      @closed="onTemplateBindClosed"
+    />
+
+    <ApprovalInstanceDetailDialog
+      v-model="detailDialog.visible"
+      title="璋冧紤鐢宠璇︽儏"
+      :row="detailRow"
+      @edit="openEditFromDetail"
+    />
+  </div>
+</template>
+
+<script setup>
+import { Search } from "@element-plus/icons-vue";
+import dayjs from "dayjs";
+import { userListNoPageByTenantId } from "@/api/system/user.js";
+import { ElMessage } from "element-plus";
+import { computed, onMounted, reactive, ref, watch } from "vue";
+import FormPayloadFields from "../../ApproveManage/approve-list/components/FormPayloadFields.vue";
+import ApprovalInstanceDetailDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue";
+import ApprovalInstanceSubmitDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue";
+import ApprovalTemplateBindDialog from "../../ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue";
+import { buildInstanceTableColumns } from "../../ApproveManage/approve-shared/approvalInstanceFormConfigTable.js";
+import { APPROVAL_MODULE_KEYS } from "../../ApproveManage/approve-shared/approvalModuleRegistry.js";
+import { useApprovalInstanceModule } from "../../ApproveManage/approve-shared/useApprovalInstanceModule.js";
+import { useFlowUserOptions } from "../../ApproveManage/approve-shared/useFlowUserOptions.js";
+import { SELECT_OPTION_SOURCE } from "../../ApproveManage/approve-template/selectOptionSource.js";
+
+function isCompensatoryBalanceField(field) {
+  const label = String(field?.label || "");
+  return label.includes("璋冧紤浣欓") || field?.key === "compensatoryBalanceHours";
+}
+
+function isCompensatoryDurationField(field) {
+  const label = String(field?.label || "");
+  return label.includes("璋冧紤鏃堕暱") || field?.key === "compensatoryDurationHours";
+}
+
+function displayTemplateFields(fields = []) {
+  return (fields || []).filter((f) => !isCompensatoryBalanceField(f) && !isCompensatoryDurationField(f));
+}
+
+function findCompensatoryTimeTemplateField(fields = []) {
+  return (
+    fields.find((f) => f?.type === "datetimerange" && String(f?.label || "").includes("璋冧紤鏃堕棿")) ||
+    fields.find((f) => f?.type === "datetimerange" && f?.key === "dateRange") ||
+    fields.find((f) => f?.type === "datetimerange") ||
+    null
+  );
+}
+
+function findApplicantTemplateField(fields = []) {
+  return (
+    fields.find((f) => String(f?.label || "").includes("鐢宠浜�")) ||
+    fields.find((f) => f?.type === "select" && f?.optionSource === SELECT_OPTION_SOURCE.USER) ||
+    null
+  );
+}
+
+function resolveCompensatoryTimeRange(payload, compensatoryTimeField) {
+  if (!compensatoryTimeField?.key) return { start: "", end: "" };
+  const val = payload?.[compensatoryTimeField.key];
+  if (!Array.isArray(val) || val.length < 2) return { start: "", end: "" };
+  return { start: val[0] || "", end: val[1] || "" };
+}
+
+function computeCompensatoryHours(startStr, endStr) {
+  if (!startStr || !endStr) return null;
+  const t0 = dayjs(startStr);
+  const t1 = dayjs(endStr);
+  if (!t0.isValid() || !t1.isValid() || !t1.isAfter(t0)) return null;
+  const hours = t1.diff(t0, "millisecond") / (60 * 60 * 1000);
+  return Math.round(hours * 100) / 100;
+}
+
+function compensatoryDurationDisplay(form) {
+  const compensatoryTimeField = findCompensatoryTimeTemplateField(form.formFieldDefs);
+  const { start, end } = resolveCompensatoryTimeRange(form.formPayload, compensatoryTimeField);
+  const h = computeCompensatoryHours(start, end);
+  return h == null ? "" : String(h);
+}
+
+const searchForm = reactive({
+  instanceNo: "",
+  applicantKeyword: "",
+});
+
+function validateCompensatoryBeforeSave() {
+  const compensatoryTimeField = findCompensatoryTimeTemplateField(submitForm.formFieldDefs);
+  const { start, end } = resolveCompensatoryTimeRange(submitForm.formPayload, compensatoryTimeField);
+  if (computeCompensatoryHours(start, end) == null) {
+    ElMessage.warning("璇锋鏌ユā鏉夸腑鐨勮皟浼戞椂闂达紝缁撴潫鏃堕棿椤绘櫄浜庡紑濮嬫椂闂�");
+    throw new Error("invalid compensatory time");
+  }
+}
+
+const mod = useApprovalInstanceModule({
+  moduleKey: APPROVAL_MODULE_KEYS.COMPENSATORY,
+  beforeSave: validateCompensatoryBeforeSave,
+  extraFormRules: {
+    compensatoryBalanceHours: [{ required: true, message: "璇峰~鍐欒皟浼戜綑棰�", trigger: "blur" }],
+  },
+});
+
+const {
+  tableData,
+  tableLoading,
+  page,
+  detailDialog,
+  detailRow,
+  submitDialog,
+  submitEditRow,
+  submitForm,
+  submitFormRef,
+  submitSaving,
+  isSubmitEdit,
+  activeTemplate,
+  submitFormFields,
+  submitFormRules,
+  submitDialogTitle,
+  templateBindVisible,
+  handleQuery,
+  initModuleList,
+  pagination,
+  openAddWithTemplate,
+  onTemplateBound,
+  onTemplateBindClosed,
+  openEditFromDetail,
+  submitInstanceForm,
+  buildTableActions,
+} = mod;
+
+const { flowUserOptions, loadFlowUsers } = useFlowUserOptions();
+const allUsersCache = ref([]);
+
+const applicantTemplateField = computed(() =>
+  findApplicantTemplateField(submitForm.formFieldDefs)
+);
+
+function unwrapArray(payload) {
+  if (Array.isArray(payload)) return payload;
+  if (payload && Array.isArray(payload.data)) return payload.data;
+  return [];
+}
+
+async function loadUserPool() {
+  try {
+    const res = await userListNoPageByTenantId();
+    allUsersCache.value = unwrapArray(res);
+  } catch {
+    allUsersCache.value = [];
+  }
+}
+
+watch(
+  () => submitDialog.visible,
+  (v) => {
+    if (!v) return;
+    if (submitForm.compensatoryBalanceHours == null && isSubmitEdit.value) {
+      submitForm.compensatoryBalanceHours =
+        submitEditRow.value?.formPayload?.compensatoryBalanceHours ??
+        submitEditRow.value?.compensatoryBalanceHours;
+    }
+    if (submitForm.compensatoryBalanceHours == null && !isSubmitEdit.value) {
+      submitForm.compensatoryBalanceHours = undefined;
+    }
+  }
+);
+
+watch(
+  () => {
+    const key = applicantTemplateField.value?.key;
+    return key ? submitForm.formPayload[key] : undefined;
+  },
+  async (uid) => {
+    if (!applicantTemplateField.value || !uid) return;
+    if (!allUsersCache.value.length) await loadUserPool();
+  }
+);
+
+const tableColumn = buildInstanceTableColumns(tableData, buildTableActions, {
+  moduleKey: APPROVAL_MODULE_KEYS.COMPENSATORY,
+});
+
+function onSearch() {
+  handleQuery(searchForm);
+}
+
+function resetSearch() {
+  searchForm.instanceNo = "";
+  searchForm.applicantKeyword = "";
+  onSearch();
+}
+
+function onPagination(obj) {
+  pagination(obj, searchForm);
+}
+
+async function onSubmit() {
+  const ok = await submitInstanceForm({ skipValidate: true });
+  if (ok) ElMessage.success(isSubmitEdit.value ? "淇敼鎴愬姛" : "鎻愪氦鎴愬姛");
+}
+
+onMounted(async () => {
+  loadFlowUsers();
+  await initModuleList(searchForm);
+});
+</script>
+
+<style scoped>
+.mb20 {
+  margin-bottom: 20px;
+}
+.search_form {
+  display: flex;
+  flex-wrap: wrap;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+.search_title {
+  font-size: 14px;
+  color: var(--el-text-color-regular);
+}
+</style>
diff --git a/src/views/personnelManagement/classsSheduling/index.vue b/src/views/personnelManagement/classsSheduling/index.vue
index 140ffba..8b88c92 100644
--- a/src/views/personnelManagement/classsSheduling/index.vue
+++ b/src/views/personnelManagement/classsSheduling/index.vue
@@ -101,14 +101,16 @@
             </div>
             <div class="user-details">
               <h4 class="user-name">{{ item.name }}</h4>
-              <!-- <div class="user-stats">
-                <span class="stat-item">鏃�:{{ item.day0 }}</span>
-                <span class="stat-item">涓�:{{ item.day1 }}</span>
-                <span class="stat-item">澶�:{{ item.day2 }}</span>
-                <span class="stat-item">浼�:{{ item.day3 }}</span>
-                <span class="stat-item">鍋�:{{ item.day4 }}</span>
-                <span class="stat-item">宸�:{{ item.day6 }}</span>
-              </div> -->
+              <div class="user-stats">
+                <span v-if="item.monthlyAttendance?.['浼戞伅']" class="stat-item stat-rest">浼�:{{ item.monthlyAttendance['浼戞伅'] }}</span>
+                <el-tooltip v-if="item.holidayDates?.length > 0" placement="top">
+                  <template #content>
+                    <div>璇峰亣鏃ユ湡锛�</div>
+                    <div v-for="date in item.holidayDates" :key="date">{{ date }}</div>
+                  </template>
+                  <span class="stat-item stat-holiday">鍋�:{{ item.holidayDates.length }}</span>
+                </el-tooltip>
+              </div>
               <div class="user-total">
                 <span class="total-label">鍚堣鍑哄嫟:</span>
                 <span class="total-value">{{ item.monthlyAttendance.totalAttendance }}澶�</span>
@@ -153,6 +155,7 @@
                       'shift-box-leave': m.shift === '璇峰亣',
                       'shift-box-other': m.shift === '澶�11',
                       'shift-box-business': m.shift === '澶�12',
+                      'holiday-cell': m.isHoliday,
                     }">
                       <span class="shift-text">{{ getShiftNameByValue(m.shift) || '鈥�' }}</span>
                     </div>
@@ -1280,4 +1283,40 @@
     margin-bottom: 8px;
     margin-top: 12px;
   }
+
+  /* 璇峰亣浼戞伅鏃ユ湡鐗规畩鏍峰紡 */
+  .holiday-cell {
+    background-color: #fff3cd !important;
+    color: #856404 !important;
+    border: 1px solid #ffc107 !important;
+  }
+
+  /* 鐢ㄦ埛缁熻鍖哄煙 */
+  .user-stats {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 4px;
+    margin-bottom: 4px;
+  }
+
+  .stat-item {
+    font-size: 12px;
+    color: #666;
+    padding-right: 4px;
+  }
+
+  .stat-rest {
+    color: #10b981;
+    background-color: rgba(16, 185, 129, 0.1);
+    padding: 1px 6px;
+    border-radius: 10px;
+  }
+
+  .stat-holiday {
+    color: #f59e0b;
+    background-color: rgba(245, 158, 11, 0.1);
+    padding: 1px 6px;
+    border-radius: 10px;
+    cursor: pointer;
+  }
 </style>
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 8ec0dd9..d42c93c 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -84,6 +84,9 @@
             <el-table-column label="閲囪喘鍚堝悓鍙�"
                              prop="purchaseContractNumber"
                              show-overflow-tooltip/>
+            <el-table-column label="閲囪喘鎬诲悎鍚屽彿"
+                             prop="masterContractNo"
+                             show-overflow-tooltip/>
             <el-table-column label="椤圭洰鍚嶇О"
                              prop="projectName"
                              show-overflow-tooltip/>
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 83089cf..47ec1e4 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -27,13 +27,13 @@
                       clearable
                       :prefix-icon="Search" />
           </el-form-item>
-          <el-form-item label="閿�鍞悎鍚屽彿锛�">
-            <el-input v-model="searchForm.salesContractNo"
-                      placeholder="璇疯緭鍏�"
-                      clearable
-                      prefix-icon="Search"
-                      @change="handleQuery" />
-          </el-form-item>
+<!--          <el-form-item label="璁㈠崟鍙凤細">-->
+<!--            <el-input v-model="searchForm.salesContractNo"-->
+<!--                      placeholder="璇疯緭鍏�"-->
+<!--                      clearable-->
+<!--                      prefix-icon="Search"-->
+<!--                      @change="handleQuery" />-->
+<!--          </el-form-item>-->
           <el-form-item label="椤圭洰鍚嶇О锛�">
             <el-input v-model="searchForm.projectName"
                       placeholder="璇疯緭鍏�"
@@ -217,10 +217,10 @@
                          prop="purchaseContractNumber"
                          width="160"
                          show-overflow-tooltip />
-        <el-table-column label="閿�鍞悎鍚屽彿"
-                         prop="salesContractNo"
-                         width="160"
-                         show-overflow-tooltip />
+<!--        <el-table-column label="璁㈠崟鍙�"-->
+<!--                         prop="salesContractNo"-->
+<!--                         width="160"-->
+<!--                         show-overflow-tooltip />-->
         <el-table-column label="渚涘簲鍟嗗悕绉�"
                          prop="supplierName"
                          width="160"
@@ -324,21 +324,21 @@
                         clearable />
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�"
-                          prop="salesLedgerId">
-              <el-select v-model="form.salesLedgerId"
-                         placeholder="璇烽�夋嫨"
-                         filterable
-                         clearable
-                         @change="salesLedgerChange">
-                <el-option v-for="item in salesContractList"
-                           :key="item.id"
-                           :label="item.salesContractNo"
-                           :value="item.id" />
-              </el-select>
-            </el-form-item>
-          </el-col>
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="璁㈠崟鍙凤細"-->
+<!--                          prop="salesLedgerId">-->
+<!--              <el-select v-model="form.salesLedgerId"-->
+<!--                         placeholder="璇烽�夋嫨"-->
+<!--                         filterable-->
+<!--                         clearable-->
+<!--                         @change="salesLedgerChange">-->
+<!--                <el-option v-for="item in salesContractList"-->
+<!--                           :key="item.id"-->
+<!--                           :label="item.salesContractNo"-->
+<!--                           :value="item.id" />-->
+<!--              </el-select>-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
@@ -585,6 +585,35 @@
               <el-tag v-else :type="scope.row.isChecked ? 'success' : 'info'">
                 {{ scope.row.isChecked ? '鏄�' : '鍚�' }}
               </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="閫夋嫨璁惧"
+                           prop="deviceId"
+                           width="150">
+            <template #default="scope">
+              <span v-if="scope.row.productType === 2">--</span>
+              <el-select v-else
+                         v-model="scope.row.deviceId"
+                         placeholder="璇烽�夋嫨璁惧"
+                         filterable
+                         clearable
+                         @change="handleDeviceChange(scope.row, scope.$index)">
+                <el-option v-for="device in iotDeviceList"
+                           :key="device.id"
+                           :label="device.deviceName"
+                           :value="device.id" />
+              </el-select>
+            </template>
+          </el-table-column>
+          <el-table-column label="搴撲綅"
+                           prop="storageLocation"
+                           width="120">
+            <template #default="scope">
+              <span v-if="scope.row.productType === 2">--</span>
+              <el-input v-else
+                        v-model="scope.row.storageLocation"
+                        placeholder="鑷姩鑾峰彇"
+                        disabled />
             </template>
           </el-table-column>
           <el-table-column label="鍏ュ簱瀹℃牳鐘舵��"
@@ -853,6 +882,32 @@
         </el-row>
         <el-row :gutter="30" v-if="productForm.productType !== 2">
           <el-col :span="12">
+            <el-form-item label="閫夋嫨璁惧锛�"
+                          prop="deviceId">
+              <el-select v-model="productForm.deviceId"
+                         placeholder="璇烽�夋嫨璁惧"
+                         filterable
+                         clearable
+                         style="width: 100%"
+                         @change="handleProductDeviceChange">
+                <el-option v-for="device in iotDeviceList"
+                           :key="device.id"
+                           :label="device.deviceName"
+                           :value="device.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="搴撲綅锛�"
+                          prop="storageLocation">
+              <el-input v-model="productForm.storageLocation"
+                        placeholder="閫夋嫨璁惧鍚庤嚜鍔ㄨ幏鍙�"
+                        disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30" v-if="productForm.productType !== 2">
+          <el-col :span="12">
             <el-form-item label="鏄惁璐ㄦ锛�"
                           prop="isChecked">
               <el-radio-group v-model="productForm.isChecked">
@@ -950,6 +1005,7 @@
   const salesContractList = ref([]);
   const supplierList = ref([]);
   const contractList = ref([]); // 渚涘簲鍟嗗悎鍚屽垪琛�
+  const iotDeviceList = ref([]); // IoT璁惧鍒楄〃
   const contractFileDialogVisible = ref(false);
   const contractFileList = ref([]);
   const tableLoading = ref(false);
@@ -965,6 +1021,7 @@
   import { modelList, productTreeList } from "@/api/basicData/product.js";
   import { getSparePartsList } from "@/api/equipmentManagement/spareParts.js";
   import { getSupplierContractList, getSupplierContractFilesByNo } from "@/api/basicData/supplierContract.js";
+  import { getIotDeviceList as getIotDeviceListApi } from "@/api/equipmentManagement/ledger.js";
   import dayjs from "dayjs";
   import FileUpload from "@/components/AttachmentUpload/file/index.vue";
 
@@ -1185,6 +1242,8 @@
       invoiceType: "",
       warnNum: "",
       isChecked: false,
+      deviceId: "",
+      storageLocation: "",
     },
     productRules: {
       productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -2284,6 +2343,39 @@
     }
   };
 
+  // 鑾峰彇IoT璁惧鍒楄〃
+  // 鑾峰彇IoT璁惧鍒楄〃
+  const getIotDeviceList = async () => {
+    try {
+      const res = await getIotDeviceListApi();
+      if (res.data) {
+        iotDeviceList.value = res.data;
+      }
+    } catch (error) {
+      console.error("鑾峰彇IoT璁惧鍒楄〃澶辫触:", error);
+    }
+  };
+
+  // 璁惧閫夋嫨鍙樻洿鏃讹紝鑷姩濉厖搴撲綅
+  const handleDeviceChange = (row, index) => {
+    const device = iotDeviceList.value.find(d => d.id === row.deviceId);
+    if (device) {
+      row.storageLocation = device.storageLocation || '';
+    } else {
+      row.storageLocation = '';
+    }
+  };
+
+  // 浜у搧寮圭獥涓澶囬�夋嫨鍙樻洿鏃讹紝鑷姩濉厖搴撲綅
+  const handleProductDeviceChange = (deviceId) => {
+    const device = iotDeviceList.value.find(d => d.id === deviceId);
+    if (device) {
+      productForm.value.storageLocation = device.storageLocation || '';
+    } else {
+      productForm.value.storageLocation = '';
+    }
+  };
+
   // 鏍煎紡鍖栨枃浠跺ぇ灏�
   const formatFileSize = (bytes) => {
     if (!bytes) return '0 B';
@@ -2296,6 +2388,7 @@
   onMounted(() => {
     getList();
     getTemplateList();
+    getIotDeviceList();
   });
 </script>
 
diff --git a/src/views/procurementManagement/purchaseReturnOrder/index.vue b/src/views/procurementManagement/purchaseReturnOrder/index.vue
index 018f8e3..3b3dd90 100644
--- a/src/views/procurementManagement/purchaseReturnOrder/index.vue
+++ b/src/views/procurementManagement/purchaseReturnOrder/index.vue
@@ -275,6 +275,11 @@
     width: 160,
   },
   {
+    label: "閲囪喘鎬诲悎鍚屽彿",
+    prop: "masterContractNo",
+    width: 160,
+  },
+  {
     label: "鍒朵綔鏃ユ湡",
     prop: "preparedAt",
     width: 130,
diff --git a/src/views/procurementManagement/receivingManagement/index.vue b/src/views/procurementManagement/receivingManagement/index.vue
index a0d54a5..c53915c 100644
--- a/src/views/procurementManagement/receivingManagement/index.vue
+++ b/src/views/procurementManagement/receivingManagement/index.vue
@@ -21,7 +21,7 @@
             @change="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="閿�鍞悎鍚屽彿锛�">
+        <el-form-item label="璁㈠崟鍙凤細">
           <el-input
             v-model="searchForm.salesContractNo"
             placeholder="璇疯緭鍏�"
@@ -92,7 +92,8 @@
         </el-table-column>
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
         <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" width="160" show-overflow-tooltip />
-        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" width="160" show-overflow-tooltip />
+        <el-table-column label="閲囪喘鎬诲悎鍚屽彿" prop="masterContractNo" width="160" show-overflow-tooltip />
+        <el-table-column label="璁㈠崟鍙�" prop="salesContractNo" width="160" show-overflow-tooltip />
         <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" width="160" show-overflow-tooltip />
         <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="320" show-overflow-tooltip />
         <el-table-column label="鏀惰揣鐘舵��" prop="status" width="100" show-overflow-tooltip>
diff --git a/src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue b/src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue
index 345431c..fc2e702 100644
--- a/src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue
+++ b/src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue
@@ -16,7 +16,7 @@
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="閿�鍞悎鍚屽彿锛�">
+          <el-form-item label="璁㈠崟鍙凤細">
             <el-input :model-value="detailData.salesContractNo || ''" disabled />
           </el-form-item>
         </el-col>
diff --git a/src/views/productionManagement/productionOrder/index.vue b/src/views/productionManagement/productionOrder/index.vue
index 9c7682b..eef215f 100644
--- a/src/views/productionManagement/productionOrder/index.vue
+++ b/src/views/productionManagement/productionOrder/index.vue
@@ -278,6 +278,11 @@
       prop: "npsNo",
       width: "150px",
     },
+    {
+      label: "閿�鍞�诲悎鍚屽彿",
+      prop: "masterContractNo",
+      width: "150px",
+    },
     // 1.寰呭紑濮嬨��2.杩涜涓��3.宸插畬鎴愩��4.宸插彇娑堛��5.宸茬粨鏉�
     {
       label: "鐘舵��",
diff --git a/src/views/productionManagement/productionReporting/index.vue b/src/views/productionManagement/productionReporting/index.vue
index f4e9deb..c671ea7 100644
--- a/src/views/productionManagement/productionReporting/index.vue
+++ b/src/views/productionManagement/productionReporting/index.vue
@@ -202,7 +202,7 @@
       width: 120,
     },
     {
-      label: "閿�鍞悎鍚屽彿",
+      label: "璁㈠崟鍙�",
       prop: "salesContractNo",
       width: 120,
     },
diff --git a/src/views/productionManagement/workOrderManagement/index.vue b/src/views/productionManagement/workOrderManagement/index.vue
index 8bc6dc2..efe231b 100644
--- a/src/views/productionManagement/workOrderManagement/index.vue
+++ b/src/views/productionManagement/workOrderManagement/index.vue
@@ -302,6 +302,11 @@
       width: "140",
     },
     {
+      label: "閿�鍞�诲悎鍚屽彿",
+      prop: "masterContractNo",
+      width: "140",
+    },
+    {
       label: "浜у搧鍚嶇О",
       prop: "productName",
       width: "140",
diff --git a/src/views/productionPlan/productionPlan/index.vue b/src/views/productionPlan/productionPlan/index.vue
index fe4dd7c..6ad0505 100644
--- a/src/views/productionPlan/productionPlan/index.vue
+++ b/src/views/productionPlan/productionPlan/index.vue
@@ -13,7 +13,7 @@
                     style="width: 160px;"
                     @keyup.enter="handleQuery" />
         </el-form-item>
-        <el-form-item label="閿�鍞悎鍚屽彿:"
+        <el-form-item label="璁㈠崟鍙�:"
                       prop="salesContractNo">
           <el-input v-model="searchForm.salesContractNo"
                     placeholder="璇疯緭鍏�"
@@ -318,13 +318,17 @@
       },
     },
     {
-      label: "閿�鍞悎鍚屽彿",
+      label: "璁㈠崟鍙�",
       prop: "salesContractNo",
       width: "200px",
       dataType: "slot",
       slot: "salesContractNo",
     },
-
+    {
+      label: "閿�鍞�诲悎鍚屽彿",
+      prop: "masterContractNo",
+      width: "150px",
+    },
     {
       label: "浜у搧鍚嶇О",
       prop: "productName",
diff --git a/src/views/qualityManagement/afterSalesTraceability/index.vue b/src/views/qualityManagement/afterSalesTraceability/index.vue
index 8cd4856..b58011c 100644
--- a/src/views/qualityManagement/afterSalesTraceability/index.vue
+++ b/src/views/qualityManagement/afterSalesTraceability/index.vue
@@ -116,7 +116,7 @@
     >
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="搴忓彿" type="index" width="55" align="center" />
-      <el-table-column label="閿�鍞悎鍚屽彿" prop="contractNo" width="160" />
+      <el-table-column label="璁㈠崟鍙�" prop="contractNo" width="160" />
       <el-table-column label="浜у搧缂栧彿" prop="productCode" width="140" />
       <el-table-column label="浜у搧鍨嬪彿" prop="productModel" width="140" />
       <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" width="160" />
@@ -172,10 +172,10 @@
       >
         <el-row>
           <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿" prop="contractNo">
+            <el-form-item label="璁㈠崟鍙�" prop="contractNo">
               <el-input
                 v-model="form.contractNo"
-                placeholder="璇烽�夋嫨鍏宠仈閿�鍞悎鍚屽彿"
+                placeholder="璇烽�夋嫨鍏宠仈璁㈠崟鍙�"
               />
             </el-form-item>
           </el-col>
@@ -387,7 +387,7 @@
   },
   rules: {
     contractNo: [
-      { required: true, message: "閿�鍞悎鍚屽彿涓嶈兘涓虹┖", trigger: "blur" },
+      { required: true, message: "璁㈠崟鍙蜂笉鑳戒负绌�", trigger: "blur" },
     ],
     productCode: [
       { required: true, message: "浜у搧缂栧彿涓嶈兘涓虹┖", trigger: "blur" },
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index b315c93..e0abbd6 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -9,10 +9,10 @@
       <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="閿�鍞鍗曪細" prop="salesLedgerId">
+            <el-form-item label="璁㈠崟鍙凤細" prop="salesLedgerId">
               <el-select
                 v-model="form.salesLedgerId"
-                placeholder="璇烽�夋嫨閿�鍞鍗�"
+                placeholder="璇烽�夋嫨璁㈠崟鍙�"
                 clearable
                 filterable
                 :disabled="isViewMode"
@@ -330,7 +330,7 @@
 const currentProductId = ref(0);
 const testStandardOptions = ref([]); // 鎸囨爣閫夋嫨涓嬫媺妗嗘暟鎹�
 const modelOptions = ref([]);
-const salesLedgerOptions = ref([]); // 閿�鍞鍗曚笅鎷夋鏁版嵁
+const salesLedgerOptions = ref([]); // 璁㈠崟鍙蜂笅鎷夋鏁版嵁
 
 // 鎵撳紑寮规
 const openDialog = async (type, row) => {
@@ -471,12 +471,12 @@
   form.value.unit = modelOptions.value.find(item => item.id == value)?.unit || '';
 }
 
-// 閿�鍞鍗曢�夋嫨鍙樺寲澶勭悊
+// 璁㈠崟鍙烽�夋嫨鍙樺寲澶勭悊
 const handleSalesLedgerChange = async (value) => {
   const selectedItem = salesLedgerOptions.value.find(item => item.id == value);
   if (selectedItem) {
     form.value.salesContractNo = selectedItem.salesContractNo || '';
-    // 鏍规嵁閿�鍞鍗旾D鏌ヨ浜у搧淇℃伅锛屽彧璧嬪�兼暟閲�
+    // 鏍规嵁璁㈠崟鍙稩D鏌ヨ浜у搧淇℃伅锛屽彧璧嬪�兼暟閲�
     try {
       const res = await productList({ salesLedgerId: value, type: 1 });
       const productData = res.data && res.data.length > 0 ? res.data[0] : null;
@@ -486,8 +486,8 @@
         calcSampleQuantity();
       }
     } catch (e) {
-      console.error('鏌ヨ閿�鍞鍗曚骇鍝佷俊鎭け璐�', e);
-      proxy.$modal.msgError('鏌ヨ閿�鍞鍗曚骇鍝佷俊鎭け璐�');
+      console.error('鏌ヨ璁㈠崟鍙蜂骇鍝佷俊鎭け璐�', e);
+      proxy.$modal.msgError('鏌ヨ璁㈠崟鍙蜂骇鍝佷俊鎭け璐�');
     }
   } else {
     form.value.salesContractNo = '';
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
index c4c33fb..a78f97c 100644
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ b/src/views/qualityManagement/finalInspection/index.vue
@@ -26,11 +26,11 @@
             </el-form-item>
           </el-col>
           <el-col :span="6">
-            <el-form-item label="閿�鍞崟鍙�"
+            <el-form-item label="璁㈠崟鍙�"
                           prop="salesContractNo">
               <el-input v-model="searchForm.salesContractNo"
                         style="width: 240px"
-                        placeholder="璇疯緭鍏ラ攢鍞崟鍙锋悳绱�"
+                        placeholder="璇疯緭鍏ヨ鍗曞彿鎼滅储"
                         clearable />
             </el-form-item>
           </el-col>
@@ -154,11 +154,16 @@
       width: 120,
     },
     {
-      label: "閿�鍞崟鍙�",
+      label: "璁㈠崟鍙�",
       prop: "salesContractNo",
       width: 120,
     },
     {
+      label: "閿�鍞�诲悎鍚屽彿",
+      prop: "masterContractNo",
+      width: 120,
+    },
+    {
       label: "妫�楠屽憳",
       prop: "checkName",
     },
diff --git a/src/views/reportAnalysis/projectProfit/index.vue b/src/views/reportAnalysis/projectProfit/index.vue
index f61cbe5..990e4be 100644
--- a/src/views/reportAnalysis/projectProfit/index.vue
+++ b/src/views/reportAnalysis/projectProfit/index.vue
@@ -57,7 +57,7 @@
 	},
 	[
 		{
-			label: "閿�鍞悎鍚屽彿",
+			label: "璁㈠崟鍙�",
 			align: "center",
 			prop: "customerContractNo",
 		},
diff --git a/src/views/safeProduction/safeWorkApproval/components/approvalDia.vue b/src/views/safeProduction/safeWorkApproval/components/approvalDia.vue
index 8d40a2e..8e5a93e 100644
--- a/src/views/safeProduction/safeWorkApproval/components/approvalDia.vue
+++ b/src/views/safeProduction/safeWorkApproval/components/approvalDia.vue
@@ -157,7 +157,7 @@
                 <el-descriptions-item label="閲囪喘鍚堝悓鍙�">{{ currentPurchase.purchaseContractNumber }}</el-descriptions-item>
                 <el-descriptions-item label="渚涘簲鍟嗗悕绉�">{{ currentPurchase.supplierName }}</el-descriptions-item>
                 <el-descriptions-item label="椤圭洰鍚嶇О">{{ currentPurchase.projectName }}</el-descriptions-item>
-                <el-descriptions-item label="閿�鍞悎鍚屽彿">{{ currentPurchase.salesContractNo }}</el-descriptions-item>
+                <el-descriptions-item label="璁㈠崟鍙�">{{ currentPurchase.salesContractNo }}</el-descriptions-item>
                 <el-descriptions-item label="绛捐鏃ユ湡">{{ currentPurchase.executionDate }}</el-descriptions-item>
                 <el-descriptions-item label="褰曞叆鏃ユ湡">{{ currentPurchase.entryDate }}</el-descriptions-item>
                 <el-descriptions-item label="浠樻鏂瑰紡">{{ currentPurchase.paymentMethod }}</el-descriptions-item>
diff --git a/src/views/salesManagement/deliveryLedger/index.vue b/src/views/salesManagement/deliveryLedger/index.vue
index f8f1539..080ae20 100644
--- a/src/views/salesManagement/deliveryLedger/index.vue
+++ b/src/views/salesManagement/deliveryLedger/index.vue
@@ -2,7 +2,7 @@
   <div class="app-container">
     <div class="search_form">
       <el-form :model="searchForm" :inline="true">
-        <el-form-item label="閿�鍞鍗曞彿锛�">
+        <el-form-item label="璁㈠崟鍙峰彿锛�">
           <el-input
             v-model="searchForm.salesContractNo"
             placeholder="璇疯緭鍏�"
@@ -57,8 +57,13 @@
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
         <el-table-column
-          label="閿�鍞鍗�"
+          label="璁㈠崟鍙�"
           prop="salesContractNo"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="閿�鍞�诲悎鍚屽彿"
+          prop="masterContractNo"
           show-overflow-tooltip
         />
         <el-table-column
@@ -101,16 +106,16 @@
           prop="shippingCarNumber"
           show-overflow-tooltip
         />
-        <el-table-column
-          label="蹇�掑叕鍙�"
-          prop="expressCompany"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="蹇�掑崟鍙�"
-          prop="expressNumber"
-          show-overflow-tooltip
-        />
+<!--        <el-table-column-->
+<!--          label="蹇�掑叕鍙�"-->
+<!--          prop="expressCompany"-->
+<!--          show-overflow-tooltip-->
+<!--        />-->
+<!--        <el-table-column-->
+<!--          label="蹇�掑崟鍙�"-->
+<!--          prop="expressNumber"-->
+<!--          show-overflow-tooltip-->
+<!--        />-->
         <el-table-column
           label="瀹℃牳鐘舵��"
           prop="status"
@@ -287,7 +292,7 @@
     >
       <div v-if="detailRow" class="detail-wrapper">
         <el-descriptions :column="2" border>
-          <el-descriptions-item label="閿�鍞鍗�">{{
+          <el-descriptions-item label="璁㈠崟鍙�">{{
             detailRow.salesContractNo || "--"
           }}</el-descriptions-item>
           <el-descriptions-item label="鍙戣揣璁㈠崟鍙�">{{
@@ -403,7 +408,7 @@
 const dialogFormVisible = ref(false);
 const data = reactive({
   searchForm: {
-    salesContractNo: "", // 閿�鍞鍗曞彿
+    salesContractNo: "", // 璁㈠崟鍙峰彿
     shippingCarNumber: "", // 杞︾墝鍙�
     expressNumber: "", // 蹇�掑崟鍙�
   },
@@ -421,7 +426,7 @@
   },
   rules: {
     salesContractNo: [
-      { required: true, message: "璇烽�夋嫨閿�鍞鍗�", trigger: "change" },
+      { required: true, message: "璇烽�夋嫨璁㈠崟鍙�", trigger: "change" },
     ],
     customerName: [
       { required: true, message: "璇疯緭鍏ュ鎴峰悕绉�", trigger: "blur" },
@@ -474,7 +479,7 @@
     });
 };
 
-// 閿�鍞鍗曞彉鍖栨椂鑷姩濉厖瀹㈡埛鍚嶇О
+// 璁㈠崟鍙峰彉鍖栨椂鑷姩濉厖瀹㈡埛鍚嶇О
 const handleSalesOrderChange = (value) => {
   const selectedOrder = salesOrderOptions.value.find(
     (item) => item.salesContractNo === value
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index ec81d9a..4c55846 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -95,10 +95,14 @@
                              label="搴忓彿"
                              type="index"
                              width="60" />
-            <el-table-column label="閿�鍞鍗�"
+            <el-table-column label="璁㈠崟鍙�"
                              prop="salesContractNo"
                              show-overflow-tooltip
                              width="150" />
+            <el-table-column label="閿�鍞�诲悎鍚屽彿"
+                             prop="masterContractNo"
+                             show-overflow-tooltip
+                             width="150" />
             <!-- <el-table-column label="鍙戣揣璁㈠崟鍙�"
                              prop="shippingNo"
                              show-overflow-tooltip
diff --git a/src/views/salesManagement/returnOrder/components/detailDia.vue b/src/views/salesManagement/returnOrder/components/detailDia.vue
index 586e5c1..ee94764 100644
--- a/src/views/salesManagement/returnOrder/components/detailDia.vue
+++ b/src/views/salesManagement/returnOrder/components/detailDia.vue
@@ -8,7 +8,7 @@
           <el-tag :type="getStatusType(detail.status)">{{ getStatusText(detail.status) }}</el-tag>
         </el-descriptions-item>
         <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ detail.customerName }}</el-descriptions-item>
-        <el-descriptions-item label="閿�鍞崟鍙�">{{ detail.salesContractNo }}</el-descriptions-item>
+        <el-descriptions-item label="璁㈠崟鍙�">{{ detail.salesContractNo }}</el-descriptions-item>
         <el-descriptions-item label="涓氬姟鍛�">{{ detail.salesman }}</el-descriptions-item>
         <el-descriptions-item label="鍏宠仈鎵瑰彿">{{ detail.shippingNo }}</el-descriptions-item>
         <!-- <el-descriptions-item label="椤圭洰鍚嶇О">{{ detail.projectName }}</el-descriptions-item> -->
diff --git a/src/views/salesManagement/returnOrder/components/formDia.vue b/src/views/salesManagement/returnOrder/components/formDia.vue
index 802407c..f8e0eb0 100644
--- a/src/views/salesManagement/returnOrder/components/formDia.vue
+++ b/src/views/salesManagement/returnOrder/components/formDia.vue
@@ -120,7 +120,7 @@
               </el-form-item>
             </el-col>
             <el-col :span="4">
-              <el-form-item label="閿�鍞悎鍚屽彿锛�">
+              <el-form-item label="璁㈠崟鍙凤細">
                 <el-input v-model="form.salesContractNo" disabled placeholder="--" />
               </el-form-item>
             </el-col>
diff --git a/src/views/salesManagement/returnOrder/index.vue b/src/views/salesManagement/returnOrder/index.vue
index 99fa334..9ef90b8 100644
--- a/src/views/salesManagement/returnOrder/index.vue
+++ b/src/views/salesManagement/returnOrder/index.vue
@@ -8,8 +8,8 @@
 				<el-form-item label="瀹㈡埛鍚嶇О">
 					<el-input v-model="searchForm.customerName" placeholder="瀹㈡埛鍚嶇О" clearable />
 				</el-form-item>
-				<el-form-item label="閿�鍞崟鍙�">
-					<el-input v-model="searchForm.salesContractNo" placeholder="閿�鍞崟鍙�" clearable />
+				<el-form-item label="璁㈠崟鍙�">
+					<el-input v-model="searchForm.salesContractNo" placeholder="璁㈠崟鍙�" clearable />
 				</el-form-item>
 				<el-form-item label="鍏宠仈鎵瑰彿">
 					<el-input v-model="searchForm.shippingNo" placeholder="鍏宠仈鎵瑰彿" clearable />
@@ -122,7 +122,8 @@
   { label: "閫�璐х姸鎬�", prop: "returnStatus", minWidth: 100, dataType: "slot", slot: "returnStatus" },
   { label: "鍒跺崟鏃堕棿", prop: "makeTime", minWidth: 170 },
   { label: "瀹㈡埛鍚嶇О", prop: "customerName", minWidth: 220 },
-  { label: "閿�鍞崟鍙�", prop: "salesContractNo", minWidth: 160 },
+  { label: "璁㈠崟鍙�", prop: "salesContractNo", minWidth: 160 },
+  { label: "閿�鍞�诲悎鍚屽彿", prop: "masterContractNo", minWidth: 160 },
   { label: "涓氬姟鍛�", prop: "salesman", minWidth: 120 },
   { label: "鍏宠仈鎵瑰彿", prop: "shippingNo", minWidth: 170 },
   { label: "椤圭洰鍚嶇О", prop: "projectName", minWidth: 180 },
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index bbeef59..83a0597 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -20,7 +20,7 @@
             @change="handleQuery"
           />
         </el-form-item>
-        <el-form-item label="閿�鍞悎鍚屽彿锛�">
+        <el-form-item label="璁㈠崟鍙凤細">
           <el-input
             v-model="searchForm.salesContractNo"
             placeholder="璇疯緭鍏�"
@@ -198,7 +198,7 @@
           show-overflow-tooltip
         />
         <el-table-column
-          label="閿�鍞悎鍚屽彿"
+          label="璁㈠崟鍙�"
           prop="salesContractNo"
           width="180"
           show-overflow-tooltip
@@ -349,7 +349,7 @@
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
+            <el-form-item label="璁㈠崟鍙凤細" prop="salesContractNo">
               <div
                 style="
                   display: flex;
@@ -1863,7 +1863,7 @@
     form.value.executionDate = getCurrentDate();
     // 鍒涘缓鏃堕棿榛樿涓哄綋澶�
     form.value.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss");
-    // 榛樿鑷姩鐢熸垚閿�鍞悎鍚屽彿
+    // 榛樿鑷姩鐢熸垚璁㈠崟鍙�
     form.value.autoGenerateContractNo = true;
   } else {
     currentId.value = row.id;
@@ -2220,7 +2220,7 @@
   return status === "宸插彂璐�" || status === "瀹℃牳閫氳繃";
 };
 
-/** 鍒ゆ柇閿�鍞鍗曚笅鏄惁瀛樺湪宸插彂璐�/鍙戣揣瀹屾垚鐨勪骇鍝侊紙涓嶅彲鍒犻櫎锛� */
+/** 鍒ゆ柇璁㈠崟鍙蜂笅鏄惁瀛樺湪宸插彂璐�/鍙戣揣瀹屾垚鐨勪骇鍝侊紙涓嶅彲鍒犻櫎锛� */
 const hasShippedProducts = (products) => {
   if (!products || !products.length) return false;
   return products.some((p) => {
@@ -2249,7 +2249,7 @@
   }
   const ids = selectedRows.value.map((item) => item.id);
 
-  // 妫�鏌ユ槸鍚︽湁宸茶繘琛屽彂璐ф垨鍙戣揣瀹屾垚鐨勯攢鍞鍗曪紝鑻ユ湁鍒欎笉鍏佽鍒犻櫎
+  // 妫�鏌ユ槸鍚︽湁宸茶繘琛屽彂璐ф垨鍙戣揣瀹屾垚鐨勮鍗曞彿锛岃嫢鏈夊垯涓嶅厑璁稿垹闄�
   const cannotDeleteNames = [];
   for (const row of selectedRows.value) {
     let products =
@@ -2268,7 +2268,7 @@
   }
   if (cannotDeleteNames.length > 0) {
     proxy.$modal.msgWarning(
-      "宸茶繘琛屽彂璐ф垨鍙戣揣瀹屾垚鐨勯攢鍞鍗曚笉鑳藉垹闄わ細" + cannotDeleteNames.join("銆�")
+      "宸茶繘琛屽彂璐ф垨鍙戣揣瀹屾垚鐨勮鍗曞彿涓嶈兘鍒犻櫎锛�" + cannotDeleteNames.join("銆�")
     );
     return;
   }

--
Gitblit v1.9.3