From 6a415a072a98d64d2f95d16eef73b6d7270b8d56 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期六, 30 五月 2026 15:14:25 +0800
Subject: [PATCH] 新疆马铃薯 1.首页问题:挪新系统ui,需要确认一下页面数据完整。 2.协同办公:挪新系统 3.营销管理:客户往来取消回款金额字段,改为点击左侧客户时显示与该客户的所有订单信息,以及发货情况。销售可以选好对应的采购订单方便质量追溯。 4.采购管理:供应商往来同上逻辑,显示是否收货,也加上采购退货和采购报表功能。 5.采购加上设备备件选项,设备备件入库到备件库存。设备,仓储不足时做采购提醒。 6.仓储物流:得区分成品库和原料库(不存在半成品,成品只有一个产品,很好确认),原材料需要有批号,采集原料库需要做好仓库字段,让他们可以区分哪个仓库,然后把数采设备信息做一个实时的显示。总库存显示好当前存在的批次信息。 7.质量:只有不通过才需要填写对应的数据信息。在外侧做好选择通过不通过。过程,出厂检验无法对应到生产订单,那就对应到销售订单。 8.决策分析:基础数据分析和进销存分析,质量数据分析需要重新设计

---
 src/views/inventoryManagement/stockManagement/New.vue                     |   11 
 src/views/equipmentManagement/spareParts/index.vue                        |   56 +
 src/api/procurementManagement/procurementInvoiceLedger.js                 |  132 +++
 src/views/qualityManagement/finalInspection/components/formDia.vue        |   41 +
 src/views/reportAnalysis/dataDashboard/index.vue                          |    3 
 src/views/salesManagement/receiptPaymentLedger/index.vue                  |  244 ++++--
 src/views/qualityManagement/rawMaterialInspection/index.vue               |   62 +
 src/views/salesManagement/salesLedger/index.vue                           |   98 +-
 src/views/qualityManagement/finalInspection/index.vue                     |   83 +
 src/api/procurementManagement/paymentEntry.js                             |   81 ++
 src/views/qualityManagement/processInspection/index.vue                   |   67 +
 src/views/procurementManagement/paymentLedger/index.vue                   |  204 ++--
 src/views/procurementManagement/procurementLedger/index.vue               |  289 +++++++
 src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue |  338 +++++++++
 src/api/qualityManagement/rawMaterialInspection.js                        |    9 
 src/views/procurementManagement/receivingManagement/index.vue             |  320 ++++++++
 src/api/procurementManagement/invoiceEntry.js                             |   69 +
 src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue    |   24 
 18 files changed, 1,792 insertions(+), 339 deletions(-)

diff --git a/src/api/procurementManagement/invoiceEntry.js b/src/api/procurementManagement/invoiceEntry.js
new file mode 100644
index 0000000..8325aa7
--- /dev/null
+++ b/src/api/procurementManagement/invoiceEntry.js
@@ -0,0 +1,69 @@
+// 閲囪喘-鏉ョエ鐧昏鎺ュ彛
+import request from "@/utils/request";
+
+// 鏌ヨ閲囪喘鍚堝悓鍙�
+export function getProduct(query) {
+  return request({
+    url: "/purchase/ledger/getProduct",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏌ヨid閲囪喘鍚堝悓鍙�
+export function getPurchaseNoById(query) {
+  return request({
+    url: "/purchase/ledger/getPurchaseNoById",
+    method: "get",
+    params: query,
+  });
+}
+// 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇㈣缁嗕俊鎭�
+export function getInfo(query) {
+  return request({
+    url: "/purchase/ledger/getInfo",
+    method: "get",
+    params: query,
+  });
+}
+// 涓诲垪琛ㄦ煡璇�
+export function gePurchaseList(query) {
+  return request({
+    url: "/purchase/ledger/list",
+    method: "get",
+    params: query,
+  });
+}
+// 涓诲垪琛ㄦ煡璇�
+export function getRegistrationById(query) {
+  return request({
+    url: "/purchase/registration/getRegistrationById",
+    method: "get",
+    params: query,
+  });
+}
+// 鏂板缂栬緫鏉ョエ鐧昏
+export function addOrUpdateRegistration(query) {
+  return request({
+    url: "/purchase/registration/addOrUpdateRegistration",
+    method: "post",
+    data: query,
+  });
+}
+// 鍒犻櫎鏉ョエ鐧昏
+export function delRegistration(query) {
+  return request({
+    url: "/purchase/registration/delRegistration",
+    method: "delete",
+    data: query,
+  });
+}
+
+// 涓诲垪琛ㄦ煡璇�
+export function gePurchaseListPage(query) {
+  return request({
+    url: "/purchase/ledger/listPage",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/api/procurementManagement/paymentEntry.js b/src/api/procurementManagement/paymentEntry.js
new file mode 100644
index 0000000..6ef0eb9
--- /dev/null
+++ b/src/api/procurementManagement/paymentEntry.js
@@ -0,0 +1,81 @@
+// 閲囪喘浠樻鐧昏椤甸潰鎺ュ彛
+import request from "@/utils/request";
+
+// 鍒嗛〉鏌ヨ
+export function registrationList(query) {
+  return request({
+    url: "/purchase/paymentRegistration/list",
+    method: "get",
+    params: query,
+  });
+}
+// 鏌ヨ璇︽儏
+export function registrationInfo(query) {
+  return request({
+    url: "/purchase/paymentRegistration/" + query,
+    method: "get",
+  });
+}
+// 鏍规嵁閲囪喘鍚堝悓鍙锋煡璇㈣鎯�
+export function byPurchaseId(query) {
+  return request({
+    url: "/purchase/paymentRegistration/byPurchaseId/" + query,
+    method: "get",
+  });
+}
+// 鏌ヨ閲囪喘鍚堝悓鍙�
+export function getPurchaseNo() {
+  return request({
+    url: "/purchase/ledger/getPurchaseNo",
+    method: "get",
+  });
+}
+// 鏂板
+export function paymentRegistrationAdd(query) {
+  return request({
+    url: "/purchase/paymentRegistration",
+    method: "post",
+    data: query,
+  });
+}
+// 淇敼
+export function paymentRegistrationEdit(query) {
+  return request({
+    url: "/purchase/paymentRegistration",
+    method: "put",
+    data: query,
+  });
+}
+// 鍒犻櫎
+export function paymentRegistrationDel(query) {
+  return request({
+    url: "/purchase/paymentRegistration/delete",
+    method: "delete",
+    data: query,
+  });
+}
+// 鑾峰彇鍙戠エ鍙峰拰鍙戠エ閲戦
+export function getTicketNo(query) {
+  return request({
+    url: "/purchase/registration/getTicketNo",
+    method: "get",
+    params: query,
+  });
+}
+// 鍒嗛〉鏌ヨ
+export function paymentHistoryList(query) {
+  return request({
+    url: "/purchase/paymentRegistration/paymentHistoryList",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鍒嗛〉鏌ヨ
+export function paymentHistoryListPage(query) {
+  return request({
+    url: "/purchase/paymentRegistration/paymentHistoryListPage",
+    method: "get",
+    params: query,
+  });
+}
diff --git a/src/api/procurementManagement/procurementInvoiceLedger.js b/src/api/procurementManagement/procurementInvoiceLedger.js
new file mode 100644
index 0000000..038e94f
--- /dev/null
+++ b/src/api/procurementManagement/procurementInvoiceLedger.js
@@ -0,0 +1,132 @@
+// 閲囪喘-鏉ョエ鍙拌处鎺ュ彛
+import request from "@/utils/request";
+
+// 鏌ヨ鍒楄〃
+export function invoiceList(query) {
+  return request({
+    url: "/purchase/registration/list",
+    method: "get",
+    params: query,
+  });
+}
+// 鏌ヨ璇︽儏
+// export function getInvoiceById(query) {
+//   return request({
+//     url: "/purchase/registration/getRegistrationById",
+//     method: "get",
+//     params: query,
+//   });
+// }
+// 鏂板銆佺紪杈�
+export function addOrUpdateInvoice(query) {
+  return request({
+    url: "/purchase/invoice/addOrUpdateInvoice",
+    method: "post",
+    data: query,
+  });
+}
+// 鍒犻櫎
+export function delInvoice(query) {
+  return request({
+    url: "/purchase/invoice/delInvoice",
+    method: "delete",
+    data: query,
+  });
+}
+// 鍒犻櫎鏉ョエ鍙拌处
+export function delRegistration(query) {
+  return request({
+    url: "/purchase/registration/delRegistration",
+    method: "delete",
+    data: query,
+  });
+}
+// 鍒犻櫎闄勪欢
+export function delCommonFile(query) {
+  return request({
+    url: "/commonFile/delCommonFile",
+    method: "delete",
+    data: query,
+  });
+}
+// 瀛愯〃鏍兼煡璇�
+export function productRecordList(query) {
+  return request({
+    url: "/purchase/registration/productRecordList",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏌ヨ鍒楄〃
+export function invoiceListPage(query) {
+  return request({
+    url: "/sales/product/listPagePurchaseLedger",
+    method: "get",
+    params: query,
+  });
+}
+
+export function productRecordPage(query) {
+  return request({
+    url: "/purchase/registration/productRecordPage",
+    method: "get",
+    params: query,
+  });
+}
+
+export function productUploadFile(data) {
+  return request({
+    url: "/file/uploadFile",
+    method: "post",
+    data: data,
+  });
+}
+
+// export function getProductRecordById(params) {
+//   return request({
+//     url: "/purchase/registration/getProductRecordById",
+//     method: "get",
+//     params: params,
+//   });
+// }
+export function getProductRecordById(data) {
+  return request({
+    url: "/purchase/registration/getProductRecordById",
+     method: "post",
+    data: data,
+  });
+}
+
+export function updateRegistration(data) {
+  return request({
+    url: "/purchase/registration/updateRegistration",
+    method: "post",
+    data: data,
+  });
+}
+
+// 鏌ヨ浠樻鐧昏瀛愬垪琛�
+export function registrationListPageGetById(query) {
+  return request({
+    url: "/purchase/registration/getById",
+    method: "get",
+    params: query,
+  });
+}
+// 淇敼浠樻娴佹按
+export function updatePaymentRegistration(query) {
+  return request({
+    url: "/purchase/registration/updatePaymentRegistration",
+    method: "put",
+    data: query,
+  });
+}
+// 鍒犻櫎浠樻娴佹按
+export function delPaymentRegistration(query) {
+  return request({
+    url: "/purchase/registration/delPaymentRegistration",
+    method: "delete",
+    data: query,
+  });
+}
diff --git a/src/api/qualityManagement/rawMaterialInspection.js b/src/api/qualityManagement/rawMaterialInspection.js
index dcb3869..f81a949 100644
--- a/src/api/qualityManagement/rawMaterialInspection.js
+++ b/src/api/qualityManagement/rawMaterialInspection.js
@@ -55,3 +55,12 @@
     })
 }
 
+// 鎵归噺蹇�熸楠�
+export function batchQuickInspect(data) {
+    return request({
+        url: '/quality/qualityInspect/batchQuickInspect',
+        method: 'post',
+        data: data,
+    })
+}
+
diff --git a/src/views/equipmentManagement/spareParts/index.vue b/src/views/equipmentManagement/spareParts/index.vue
index 45e0157..c297b63 100644
--- a/src/views/equipmentManagement/spareParts/index.vue
+++ b/src/views/equipmentManagement/spareParts/index.vue
@@ -75,6 +75,32 @@
             <el-form-item label="鎻忚堪" prop="description">
               <el-input v-model="form.description"></el-input>
             </el-form-item>
+            <el-form-item label="搴撳瓨棰勮鏁伴噺" prop="warnNum">
+              <el-input-number
+                v-model="form.warnNum"
+                placeholder="璇疯緭鍏ュ簱瀛橀璀︽暟閲�"
+                :min="0"
+                :step="0.1"
+                :precision="2"
+                style="width: 100%"
+              ></el-input-number>
+            </el-form-item>
+            <el-form-item label="棰勮閫氱煡浜�" prop="notifyPersonId">
+              <el-select
+                v-model="form.notifyPersonId"
+                placeholder="璇烽�夋嫨棰勮閫氱煡浜�"
+                filterable
+                clearable
+                style="width: 100%"
+              >
+                <el-option
+                  v-for="user in userOptions"
+                  :key="user.userId"
+                  :label="user.nickName || user.userName"
+                  :value="user.userId"
+                />
+              </el-select>
+            </el-form-item>
             <el-form-item label="浠锋牸" prop="price">
               <el-input-number
                 v-model="form.price"
@@ -88,8 +114,8 @@
           </el-form>
           <template #footer>
             <span class="dialog-footer">
-              <el-button @click="dialogVisible = false" :disabled="formLoading">鍙栨秷</el-button>
               <el-button type="primary" @click="submitForm" :loading="formLoading">纭畾</el-button>
+              <el-button @click="dialogVisible = false" :disabled="formLoading">鍙栨秷</el-button>
             </span>
           </template>
         </el-dialog>
@@ -134,6 +160,7 @@
 import { ElMessage, ElMessageBox } from 'element-plus';
 import { getSparePartsList, addSparePart, editSparePart, delSparePart } from "@/api/equipmentManagement/spareParts";
 import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
+import { userListNoPage } from "@/api/system/user.js";
 import PIMTable from "@/components/PIMTable/PIMTable.vue";
 import { getSparePartsUsagePage } from "@/api/equipmentManagement/sparePartsUsage";
 
@@ -153,6 +180,7 @@
 const operationType = ref('add')
 // 璁惧閫夐」
 const deviceOptions = ref([]);
+const userOptions = ref([]);
 // 琛ㄥ崟寮曠敤
 const formRef = ref(null);
 // 鏌ヨ鍙傛暟
@@ -222,6 +250,14 @@
     prop: "quantity",
   },
   {
+    label: "搴撳瓨棰勮鏁伴噺",
+    prop: "warnNum",
+  },
+  {
+    label: "棰勮閫氱煡浜�",
+    prop: "notifyPersonName",
+  },
+  {
     label: "鎻忚堪",
     prop: "description",
   },
@@ -256,7 +292,9 @@
   status: '',
   description: '',
   deviceLedgerIds: [],
-  price: null
+  price: null,
+  warnNum: null,
+  notifyPersonId: null
 });
 
 // 琛ㄥ崟楠岃瘉瑙勫垯
@@ -414,9 +452,20 @@
   }
 };
 
+// 鍔犺浇鐢ㄦ埛鍒楄〃
+const loadUserOptions = async () => {
+  try {
+    const res = await userListNoPage();
+    userOptions.value = res.data || [];
+  } catch (error) {
+    ElMessage.error('鑾峰彇鐢ㄦ埛鍒楄〃澶辫触');
+  }
+};
+
 // 鏂板鍒嗙被
 const addCategory = async () => {
   await loadDeviceName();
+  await loadUserOptions();
   form.id = '';
   form.name = '';
   form.sparePartsNo = '';
@@ -425,6 +474,8 @@
   form.deviceLedgerIds = [];
   form.quantity = undefined;
   form.price = null;
+  form.warnNum = null;
+  form.notifyPersonId = null;
   operationType.value = 'add'
   dialogVisible.value = true;
 };
@@ -432,6 +483,7 @@
 // 缂栬緫鍒嗙被
 const editCategory = async (row) => {
   await loadDeviceName();
+  await loadUserOptions();
   Object.assign(form, row);
   // 濡傛灉鍚庣杩斿洖鐨勬槸 deviceIds 瀛楃涓诧紝闇�瑕佽浆鎹负鏁扮粍
   if (row.deviceIds && typeof row.deviceIds === 'string') {
diff --git a/src/views/inventoryManagement/stockManagement/New.vue b/src/views/inventoryManagement/stockManagement/New.vue
index 2addb95..bc83a73 100644
--- a/src/views/inventoryManagement/stockManagement/New.vue
+++ b/src/views/inventoryManagement/stockManagement/New.vue
@@ -70,6 +70,15 @@
                            :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-form-item label="澶囨敞"
                       prop="remark">
           <el-input v-model="formState.remark"
@@ -123,6 +132,7 @@
     qualitity: 0,
     batchNo: null,
     warnNum: 0,
+    createTime: "",
     remark: "",
   });
 
@@ -161,6 +171,7 @@
       qualitity: 0,
       batchNo: null,
       warnNum: 0,
+      createTime: "",
       remark: "",
     };
     isShow.value = false;
diff --git a/src/views/procurementManagement/paymentLedger/index.vue b/src/views/procurementManagement/paymentLedger/index.vue
index 99b4b39..ba84a4c 100644
--- a/src/views/procurementManagement/paymentLedger/index.vue
+++ b/src/views/procurementManagement/paymentLedger/index.vue
@@ -17,7 +17,7 @@
       <div></div>
     </div>
     <el-row :gutter="20">
-      <el-col :span="14">
+      <el-col :span="8">
         <div class="table_list">
           <el-table ref="multipleTable"
                     border
@@ -42,10 +42,6 @@
                              prop="contractAmounts"
                              show-overflow-tooltip
                              :formatter="formattedNumber" />
-            <el-table-column label="浠樻閲戦(鍏�)"
-                             prop="paymentAmount"
-                             show-overflow-tooltip
-                             :formatter="formattedNumber" />
             <el-table-column label="搴斾粯閲戦(鍏�)"
                              prop="payableAmount"
                              show-overflow-tooltip>
@@ -64,25 +60,54 @@
                       :limit="page.size" />
         </div>
       </el-col>
-      <el-col :span="10">
+      <el-col :span="16">
         <div class="table_list">
-          <PIMTable rowKey="id"
-                    :column="tableColumnSon"
-                    :tableData="originalTableDataSon"
-                    :isSelection="false"
-                    :isShowPagination="true"
-                    :page="sonPage"
-                    :tableLoading="tableLoadingSon"
-                    :isShowSummary="isShowSummarySon"
-                    :summaryMethod="summarizeMainTable1"
-                    height="calc(100vh - 18.5em)"
-                    @pagination="sonPaginationSearch">
-            <template #payableAmountSlot="{ row }">
-              <el-text type="danger">
-                {{ parseFloat(row.payableAmount).toFixed(2) }}
-              </el-text>
-            </template>
-          </PIMTable>
+          <div class="table-header" v-if="selectedSupplierName">
+            <span class="supplier-title">渚涘簲鍟嗭細{{ selectedSupplierName }}</span>
+          </div>
+          <el-table border
+                    v-loading="tableLoadingSon"
+                    :data="originalTableDataSon"
+                    :header-cell-style="{ background: '#F0F1F5', color: '#333333' }"
+                    height="calc(100vh - 20em)"
+                    style="width: 100%"
+                    tooltip-effect="dark"
+                    :show-summary="isShowSummarySon"
+                    :summary-method="summarizeMainTable1">
+            <el-table-column align="center"
+                             label="搴忓彿"
+                             type="index"
+                             width="60" />
+            <el-table-column label="鍚堝悓绛捐鏃ユ湡"
+                             prop="executionDate"
+                             show-overflow-tooltip/>
+            <el-table-column label="閲囪喘鍚堝悓鍙�"
+                             prop="purchaseContractNumber"
+                             show-overflow-tooltip/>
+            <el-table-column label="椤圭洰鍚嶇О"
+                             prop="projectName"
+                             show-overflow-tooltip/>
+            <el-table-column label="鍚堝悓閲戦(鍏�)"
+                             prop="contractAmount"
+                             show-overflow-tooltip
+                             :formatter="formattedNumber" />
+            <el-table-column label="鏀惰揣鐘舵��"
+                             prop="status"
+                             show-overflow-tooltip
+                             width="100">
+              <template #default="{ row }">
+                <el-tag :type="getReceiptStatusType(row.status)" size="small">
+                  {{ receiptStatusText[row.status] || '鏈煡鐘舵��' }}
+                </el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
+          <pagination v-show="sonPage.total > 0"
+                      @pagination="sonPaginationSearch"
+                      :total="sonPage.total"
+                      :layout="sonPage.layout"
+                      :page="sonPage.current"
+                      :limit="sonPage.size" />
         </div>
       </el-col>
     </el-row>
@@ -90,12 +115,12 @@
 </template>
 
 <script setup>
-  import { ref, toRefs } from "vue";
+  import { ref, toRefs, reactive, getCurrentInstance } from "vue";
   import { Search } from "@element-plus/icons-vue";
   import {
     paymentLedgerList,
-    paymentRecordList,
   } from "@/api/procurementManagement/paymentLedger.js";
+  import { gePurchaseListPage } from "@/api/procurementManagement/invoiceEntry.js";
   import Pagination from "../../../components/PIMTable/Pagination.vue";
 
   const tableData = ref([]);
@@ -119,48 +144,13 @@
   const isShowSummary = ref(true);
   const { searchForm } = toRefs(data);
   const currentSupplierId = ref("");
+  const selectedSupplierName = ref("");
   const rowClick = row => {
     currentSupplierId.value = row.supplierId;
+    selectedSupplierName.value = row.supplierName;
     sonPage.current = 1;
-    getPaymenRecordtList(row.supplierId);
+    getPurchaseList(row.supplierName);
   };
-  // 瀛愭ā鍧�
-  const tableColumnSon = ref([
-    {
-      label: "鍚堝悓绛捐鏃ユ湡",
-      prop: "executionDate",
-      width: 110,
-    },
-    {
-      label: "閲囪喘鍚堝悓鍙�",
-      prop: "purchaseContractNumber",
-      width: 150,
-    },
-    {
-      label: "鍚堝悓閲戦(鍏�)",
-      prop: "contractAmount",
-      width: 200,
-      formatData: params => {
-        return params ? parseFloat(params).toFixed(2) : 0;
-      },
-    },
-    {
-      label: "浠樻閲戦(鍏�)",
-      prop: "paymentAmount",
-      width: 200,
-      formatData: params => {
-        return params ? parseFloat(params).toFixed(2) : 0;
-      },
-    },
-    {
-      label: "搴斾粯閲戦(鍏�)",
-      dataType: "slot",
-      width: 200,
-      prop: "payableAmount",
-      slot: "payableAmountSlot",
-    },
-  ]);
-  const tableDataSon = ref([]);
   const originalTableDataSon = ref([]);
   const tableLoadingSon = ref(false);
   const isShowSummarySon = ref(true);
@@ -170,32 +160,23 @@
   const summarizeMainTable = param => {
     return proxy.summarizeTable(
       param,
-      ["contractAmounts", "paymentAmount", "payableAmount"],
+      ["contractAmounts", "payableAmount"],
       {
-        ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-        futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+        ticketsNum: { noDecimal: true },
+        futureTickets: { noDecimal: true },
       }
     );
   };
   // 瀛愯〃鍚堣鏂规硶
   const summarizeMainTable1 = param => {
-    let summarizeTable = proxy.summarizeTable(
+    return proxy.summarizeTable(
       param,
-      ["contractAmount", "invoiceAmount", "paymentAmount"],
+      ["contractAmount"],
       {
-        ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-        futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+        ticketsNum: { noDecimal: true },
+        futureTickets: { noDecimal: true },
       }
     );
-    if (originalTableDataSon.value.length > 0) {
-      summarizeTable[summarizeTable.length - 1] =
-        originalTableDataSon.value[
-          originalTableDataSon.value.length - 1
-        ].payableAmount.toFixed(2);
-    } else {
-      summarizeTable[summarizeTable.length - 1] = 0.0;
-    }
-    return summarizeTable;
   };
   /** 鎼滅储鎸夐挳鎿嶄綔 */
   const handleQuery = () => {
@@ -219,16 +200,20 @@
       total.value = result.total || 0;
       if (tableData.value.length > 0) {
         currentSupplierId.value = tableData.value[0].supplierId;
+        selectedSupplierName.value = tableData.value[0].supplierName;
         sonPage.current = 1;
-        getPaymenRecordtList(tableData.value[0].supplierId);
+        getPurchaseList(tableData.value[0].supplierName);
+      } else {
+        originalTableDataSon.value = [];
+        selectedSupplierName.value = "";
       }
     });
   };
 
-  const getPaymenRecordtList = supplierId => {
+  const getPurchaseList = supplierName => {
     tableLoadingSon.value = true;
-    paymentRecordList({
-      supplierId: supplierId,
+    gePurchaseListPage({
+      supplierName: supplierName,
       current: sonPage.current,
       size: sonPage.size,
     })
@@ -236,9 +221,8 @@
         tableLoadingSon.value = false;
         let result = res.data;
         if (Array.isArray(result)) {
-          tableDataSon.value = result;
+          originalTableDataSon.value = result;
           sonPage.total = result.length;
-          handlePagination({ page: sonPage.current, limit: sonPage.size });
         } else {
           originalTableDataSon.value = result.records || [];
           sonPage.total = result.total || 0;
@@ -248,30 +232,37 @@
         tableLoadingSon.value = false;
       });
   };
-  const handlePagination = ({ page, limit }) => {
-    console.log(page, limit);
-    sonPage.current = page;
-    sonPage.size = limit;
-
-    const start = (page - 1) * limit;
-    const end = start + limit;
-
-    originalTableDataSon.value = tableDataSon.value.slice(start, end);
-  };
 
   const sonPaginationSearch = pagination => {
-    // 鎺ユ敹鍒嗛〉鍣ㄥ弬鏁� { page, limit }
     sonPage.current = pagination.page;
     sonPage.size = pagination.limit;
-    getPaymenRecordtList(currentSupplierId.value);
+    getPurchaseList(selectedSupplierName.value);
   };
+
   const formattedNumber = (row, column, cellValue) => {
-    if (column.property !== "supplierName") {
+    if (cellValue !== undefined && cellValue !== null && !isNaN(cellValue)) {
       return parseFloat(cellValue).toFixed(2);
-    } else {
-      return cellValue;
     }
+    return "0.00";
   };
+
+  // 鏀惰揣鐘舵�佹枃鏈槧灏�
+  const receiptStatusText = {
+    1: '寰呮敹璐�',
+    2: '鏀惰揣涓�',
+    3: '宸叉敹璐�'
+  };
+
+  // 鏀惰揣鐘舵�佹爣绛剧被鍨�
+  const getReceiptStatusType = (status) => {
+    const typeMap = {
+      1: 'info',
+      2: 'warning',
+      3: 'success'
+    };
+    return typeMap[status] || 'info';
+  };
+
   getList();
 </script>
 
@@ -291,4 +282,17 @@
   .pagination-container {
     margin-top: 0;
   }
+
+  .table-header {
+    margin-bottom: 10px;
+    padding: 10px;
+    background-color: #f5f7fa;
+    border-radius: 4px;
+
+    .supplier-title {
+      font-weight: bold;
+      font-size: 14px;
+      color: #303133;
+    }
+  }
 </style>
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 2d42b57..8a6c27d 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -66,9 +66,9 @@
     </div>
     <div class="table_list">
       <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
-        <el-button type="success"
-                   plain
-                   @click="handleBatchGenerate">鎵归噺鐢熸垚鏁版嵁</el-button>
+<!--        <el-button type="success"-->
+<!--                   plain-->
+<!--                   @click="handleBatchGenerate">鎵归噺鐢熸垚鏁版嵁</el-button>-->
         <el-button type="primary"
                    @click="openForm('add')">鏂板鍙拌处</el-button>
         <el-button type="primary"
@@ -103,12 +103,33 @@
                                label="搴忓彿"
                                type="index"
                                width="60" />
+              <el-table-column label="绫诲瀷"
+                               prop="productType"
+                               width="100">
+                <template #default="scope">
+                  <el-tag :type="scope.row.productType === 2 ? 'warning' : 'success'" size="small">
+                    {{ scope.row.productType === 2 ? '璁惧澶囦欢' : '浜у搧' }}
+                  </el-tag>
+                </template>
+              </el-table-column>
               <el-table-column label="浜у搧澶х被"
                                prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿"
-                               prop="specificationModel" />
+                               prop="specificationModel"
+                               width="120">
+                <template #default="scope">
+                  <span v-if="scope.row.productType === 2">/</span>
+                  <span v-else>{{ scope.row.specificationModel || '--' }}</span>
+                </template>
+              </el-table-column>
               <el-table-column label="鍗曚綅"
-                               prop="unit" />
+                               prop="unit"
+                               width="100">
+                <template #default="scope">
+                  <span v-if="scope.row.productType === 2">--</span>
+                  <span v-else>{{ scope.row.unit || '--' }}</span>
+                </template>
+              </el-table-column>
               <el-table-column label="鍏ュ簱瀹℃牳鐘舵��"
                                prop="stockInApprovalStatus"
                                width="120">
@@ -120,22 +141,59 @@
                 </template>
               </el-table-column>
               <el-table-column label="鏁伴噺"
-                               prop="quantity" />
+                               prop="quantity"
+                               width="100" />
               <el-table-column label="鍙敤鏁伴噺"
-                               prop="availableQuality" />
+                               prop="availableQuality"
+                               width="100">
+                <template #default="scope">
+                  <span v-if="scope.row.productType === 2">--</span>
+                  <span v-else>{{ scope.row.availableQuality }}</span>
+                </template>
+              </el-table-column>
               <el-table-column label="閫�璐ф暟閲�"
-                               prop="returnQuality" />
+                               prop="returnQuality"
+                               width="100">
+                <template #default="scope">
+                  <span v-if="scope.row.productType === 2">--</span>
+                  <span v-else>{{ scope.row.returnQuality }}</span>
+                </template>
+              </el-table-column>
               <el-table-column label="绋庣巼(%)"
-                               prop="taxRate" />
+                               prop="taxRate"
+                               width="100">
+                <template #default="scope">
+                  <span v-if="scope.row.productType === 2">--</span>
+                  <span v-else>{{ scope.row.taxRate }}</span>
+                </template>
+              </el-table-column>
               <el-table-column label="鍚◣鍗曚环(鍏�)"
                                prop="taxInclusiveUnitPrice"
-                               :formatter="formattedNumber" />
+                               :formatter="formattedNumber"
+                               width="130">
+                <template #default="scope">
+                  <span v-if="scope.row.productType === 2">--</span>
+                  <span v-else>{{ formattedNumber(null, null, scope.row.taxInclusiveUnitPrice) }}</span>
+                </template>
+              </el-table-column>
               <el-table-column label="鍚◣鎬讳环(鍏�)"
                                prop="taxInclusiveTotalPrice"
-                               :formatter="formattedNumber" />
+                               :formatter="formattedNumber"
+                               width="130">
+                <template #default="scope">
+                  <span v-if="scope.row.productType === 2">--</span>
+                  <span v-else>{{ formattedNumber(null, null, scope.row.taxInclusiveTotalPrice) }}</span>
+                </template>
+              </el-table-column>
               <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
                                prop="taxExclusiveTotalPrice"
-                               :formatter="formattedNumber" />
+                               :formatter="formattedNumber"
+                               width="140">
+                <template #default="scope">
+                  <span v-if="scope.row.productType === 2">--</span>
+                  <span v-else>{{ formattedNumber(null, null, scope.row.taxExclusiveTotalPrice) }}</span>
+                </template>
+              </el-table-column>
             </el-table>
           </template>
         </el-table-column>
@@ -403,40 +461,86 @@
                            label="搴忓彿"
                            type="index"
                            width="60" />
+          <el-table-column label="绫诲瀷"
+                           prop="productType"
+                           width="100">
+            <template #default="scope">
+              <el-tag :type="scope.row.productType === 2 ? 'warning' : 'success'" size="small">
+                {{ scope.row.productType === 2 ? '璁惧澶囦欢' : '浜у搧' }}
+              </el-tag>
+            </template>
+          </el-table-column>
           <el-table-column label="浜у搧澶х被"
                            prop="productCategory" />
           <el-table-column label="瑙勬牸鍨嬪彿"
-                           prop="specificationModel" />
+                           prop="specificationModel"
+                           width="120">
+            <template #default="scope">
+              <span v-if="scope.row.productType === 2">/</span>
+              <span v-else>{{ scope.row.specificationModel || '--' }}</span>
+            </template>
+          </el-table-column>
           <el-table-column label="鍗曚綅"
                            prop="unit"
-                           width="70" />
+                           width="70">
+            <template #default="scope">
+              <span v-if="scope.row.productType === 2">--</span>
+              <span v-else>{{ scope.row.unit || '--' }}</span>
+            </template>
+          </el-table-column>
           <el-table-column label="鏁伴噺"
                            prop="quantity"
                            width="70" />
           <el-table-column label="搴撳瓨棰勮鏁伴噺"
                            prop="warnNum"
                            width="120"
-                           show-overflow-tooltip />
+                           show-overflow-tooltip>
+            <template #default="scope">
+              <span v-if="scope.row.productType === 2">--</span>
+              <span v-else>{{ scope.row.warnNum }}</span>
+            </template>
+          </el-table-column>
           <el-table-column label="绋庣巼(%)"
                            prop="taxRate"
-                           width="80" />
+                           width="80">
+            <template #default="scope">
+              <span v-if="scope.row.productType === 2">--</span>
+              <span v-else>{{ scope.row.taxRate }}</span>
+            </template>
+          </el-table-column>
           <el-table-column label="鍚◣鍗曚环(鍏�)"
                            prop="taxInclusiveUnitPrice"
                            :formatter="formattedNumber"
-                           width="150" />
+                           width="130">
+            <template #default="scope">
+              <span v-if="scope.row.productType === 2">--</span>
+              <span v-else>{{ formattedNumber(null, null, scope.row.taxInclusiveUnitPrice) }}</span>
+            </template>
+          </el-table-column>
           <el-table-column label="鍚◣鎬讳环(鍏�)"
                            prop="taxInclusiveTotalPrice"
                            :formatter="formattedNumber"
-                           width="150" />
+                           width="130">
+            <template #default="scope">
+              <span v-if="scope.row.productType === 2">--</span>
+              <span v-else>{{ formattedNumber(null, null, scope.row.taxInclusiveTotalPrice) }}</span>
+            </template>
+          </el-table-column>
           <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
                            prop="taxExclusiveTotalPrice"
                            :formatter="formattedNumber"
-                           width="150" />
+                           width="140">
+            <template #default="scope">
+              <span v-if="scope.row.productType === 2">--</span>
+              <span v-else>{{ formattedNumber(null, null, scope.row.taxExclusiveTotalPrice) }}</span>
+            </template>
+          </el-table-column>
           <el-table-column label="鏄惁璐ㄦ"
                            prop="isChecked"
-                           width="150">
+                           width="100">
             <template #default="scope">
-              <el-tag :type="scope.row.isChecked ? 'success' : 'info'">
+              <span v-if="scope.row.productType === 2">--</span>
+              <el-tag v-else :type="scope.row.isChecked ? 'success' : 'info'">
                 {{ scope.row.isChecked ? '鏄�' : '鍚�' }}
               </el-tag>
             </template>
@@ -533,9 +637,21 @@
                ref="productFormRef">
         <el-row :gutter="30">
           <el-col :span="24">
+            <el-form-item label="绫诲瀷锛�"
+                          prop="productType">
+              <el-radio-group v-model="productForm.productType" @change="handleProductTypeChange">
+                <el-radio :label="1">浜у搧</el-radio>
+                <el-radio :label="2">璁惧澶囦欢</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
             <el-form-item label="浜у搧澶х被锛�"
                           prop="productId">
-              <el-tree-select v-model="productForm.productId"
+              <el-tree-select v-if="productForm.productType !== 2"
+                              v-model="productForm.productId"
                               placeholder="璇烽�夋嫨"
                               clearable
                               filterable
@@ -544,10 +660,22 @@
                               :data="productOptions"
                               :render-after-expand="false"
                               style="width: 100%" />
+              <el-select v-else
+                         v-model="productForm.productId"
+                         placeholder="璇烽�夋嫨璁惧澶囦欢"
+                         filterable
+                         clearable
+                         @change="handleSparePartsChange"
+                         style="width: 100%">
+                <el-option v-for="item in sparePartsOptions"
+                           :key="item.id"
+                           :label="item.name"
+                           :value="item.id" />
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row :gutter="30">
+        <el-row :gutter="30" v-if="productForm.productType !== 2">
           <el-col :span="24">
             <el-form-item label="瑙勬牸鍨嬪彿锛�"
                           prop="productModelId">
@@ -564,7 +692,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row :gutter="30">
+        <el-row :gutter="30" v-if="productForm.productType !== 2">
           <el-col :span="12">
             <el-form-item label="鍗曚綅锛�"
                           prop="unit">
@@ -588,7 +716,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row :gutter="30">
+        <el-row :gutter="30" v-if="productForm.productType !== 2">
           <el-col :span="12">
             <el-form-item label="鍚◣鍗曚环(鍏�)锛�"
                           prop="taxInclusiveUnitPrice">
@@ -615,7 +743,21 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row :gutter="30">
+        <el-row :gutter="30" v-if="productForm.productType === 2">
+          <el-col :span="24">
+            <el-form-item label="鏁伴噺锛�"
+                          prop="quantity">
+              <el-input-number :step="0.1"
+                               clearable
+                               :precision="2"
+                               :min="0"
+                               style="width: 100%"
+                               v-model="productForm.quantity"
+                               placeholder="璇疯緭鍏�" />
+            </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="taxInclusiveTotalPrice">
@@ -655,7 +797,7 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <el-col :span="12" v-if="productForm.productType !== 2">
             <el-form-item label="搴撳瓨棰勮鏁伴噺锛�"
                           prop="warnNum">
               <el-input-number v-model="productForm.warnNum"
@@ -667,7 +809,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row :gutter="30">
+        <el-row :gutter="30" v-if="productForm.productType !== 2">
           <el-col :span="12">
             <el-form-item label="鏄惁璐ㄦ锛�"
                           prop="isChecked">
@@ -740,6 +882,7 @@
   const modelOptions = ref([]);
   const userList = ref([]);
   const productOptions = ref([]);
+  const sparePartsOptions = ref([]);
   const salesContractList = ref([]);
   const supplierList = ref([]);
   const tableLoading = ref(false);
@@ -753,6 +896,7 @@
   const fileList = ref([]);
   import useUserStore from "@/store/modules/user";
   import { modelList, productTreeList } from "@/api/basicData/product.js";
+  import { getSparePartsList } from "@/api/equipmentManagement/spareParts.js";
   import dayjs from "dayjs";
   import FileUpload from "@/components/AttachmentUpload/file/index.vue";
 
@@ -956,6 +1100,7 @@
   const currentId = ref("");
   const productFormData = reactive({
     productForm: {
+      productType: 1,
       productId: "",
       productCategory: "",
       productModelId: "",
@@ -987,10 +1132,27 @@
         { required: true, message: "璇疯緭鍏�", trigger: "blur" },
       ],
       invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-      isChecked: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      // isChecked 榛樿浼犲惁锛屼笉闇�瑕侀獙璇�
     },
   });
-  const { productForm, productRules } = toRefs(productFormData);
+  const { productForm } = toRefs(productFormData);
+  
+  // 鍔ㄦ�佽绠楅獙璇佽鍒�
+  const productRules = computed(() => {
+    const isSpareParts = productForm.value.productType === 2;
+    return {
+      productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      productModelId: isSpareParts ? [] : [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      unit: isSpareParts ? [] : [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      taxInclusiveUnitPrice: isSpareParts ? [] : [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      taxRate: isSpareParts ? [] : [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      warnNum: isSpareParts ? [] : [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      taxInclusiveTotalPrice: isSpareParts ? [] : [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      taxExclusiveTotalPrice: isSpareParts ? [] : [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    };
+  });
   const upload = reactive({
     // 涓婁紶鐨勫湴鍧�
     url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
@@ -1472,16 +1634,27 @@
     await nextTick();
 
     if (type === "add") {
-      productForm.value.isChecked = false;
+      productForm.value.isChecked = false; // 鏄惁璐ㄦ榛樿浼犲惁
+      productForm.value.productType = "product";
     }
 
     if (type === "edit") {
       // 澶嶅埗琛屾暟鎹�
       productForm.value = { ...row };
 
+      // 濡傛灉娌℃湁 productType锛岄粯璁や负 product (1)
+      if (!productForm.value.productType) {
+        productForm.value.productType = 1;
+      }
+
+      // 濡傛灉鏄澶囧浠剁被鍨嬶紝鍔犺浇璁惧澶囦欢鍒楄〃
+      if (productForm.value.productType === 2) {
+        await getSparePartsOptions();
+      }
+
       // 濡傛灉鏄粠妯℃澘鍔犺浇鐨勬暟鎹紝鍙兘娌℃湁 productId 鍜� productModelId
       // 闇�瑕佹牴鎹� productCategory 鍜� specificationModel 鏉ユ煡鎵惧搴旂殑 ID
-      if (!productForm.value.productId && productForm.value.productCategory) {
+      if (!productForm.value.productId && productForm.value.productCategory && productForm.value.productType !== 2) {
         // 鏍规嵁 productCategory 鏌ユ壘 productId
         const findProductIdByCategory = (nodes, categoryName) => {
           for (let i = 0; i < nodes.length; i++) {
@@ -1549,6 +1722,45 @@
       return res;
     });
   };
+
+  // 鑾峰彇璁惧澶囦欢鍒楄〃
+  const getSparePartsOptions = () => {
+    return getSparePartsList({ current: -1, size: -1 }).then(res => {
+      if (res.data && Array.isArray(res.data.rows)) {
+        sparePartsOptions.value = res.data.rows;
+      } else if (res.data && Array.isArray(res.data.records)) {
+        sparePartsOptions.value = res.data.records;
+      } else {
+        sparePartsOptions.value = [];
+      }
+      return res;
+    });
+  };
+
+  // 澶勭悊绫诲瀷鍙樺寲
+  const handleProductTypeChange = (type) => {
+    productForm.value.productId = "";
+    productForm.value.productCategory = "";
+    productForm.value.productModelId = "";
+    productForm.value.specificationModel = "";
+    modelOptions.value = [];
+    
+    if (type === 2) {
+      getSparePartsOptions();
+    }
+  };
+
+  // 澶勭悊璁惧澶囦欢閫夋嫨
+  const handleSparePartsChange = (value) => {
+    const selectedSparePart = sparePartsOptions.value.find(item => item.id === value);
+    if (selectedSparePart) {
+      productForm.value.productCategory = selectedSparePart.name;
+      productForm.value.specificationModel = "/";
+    } else {
+      productForm.value.productCategory = "";
+      productForm.value.specificationModel = "";
+    }
+  };
   const getModels = value => {
     if (value) {
       productForm.value.productCategory =
@@ -1605,6 +1817,19 @@
 
   // 鎻愪氦浜у搧琛ㄥ崟
   const submitProduct = () => {
+    // 濡傛灉鏄澶囧浠讹紝鍏堣缃粯璁ゅ�硷紝鍐嶉獙璇�
+    if (productForm.value.productType === 2) {
+      productForm.value.specificationModel = "/";
+      productForm.value.productModelId = null;
+      productForm.value.unit = "";
+      productForm.value.taxRate = "";
+      productForm.value.taxInclusiveUnitPrice = 0;
+      productForm.value.taxInclusiveTotalPrice = 0;
+      productForm.value.taxExclusiveTotalPrice = 0;
+      productForm.value.warnNum = 0;
+      productForm.value.isChecked = false; // 鏄惁璐ㄦ榛樿浼犲惁
+    }
+    
     proxy.$refs["productFormRef"].validate(valid => {
       if (valid) {
         if (operationType.value === "edit") {
diff --git a/src/views/procurementManagement/receivingManagement/index.vue b/src/views/procurementManagement/receivingManagement/index.vue
new file mode 100644
index 0000000..a0d54a5
--- /dev/null
+++ b/src/views/procurementManagement/receivingManagement/index.vue
@@ -0,0 +1,320 @@
+<template>
+  <div class="app-container">
+    <div class="search_form">
+      <el-form :model="searchForm" :inline="true">
+        <el-form-item label="渚涘簲鍟嗗悕绉帮細">
+          <el-input
+            v-model="searchForm.supplierName"
+            placeholder="璇疯緭鍏�"
+            clearable
+            prefix-icon="Search"
+            @change="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="閲囪喘鍚堝悓鍙凤細">
+          <el-input
+            v-model="searchForm.purchaseContractNumber"
+            style="width: 240px"
+            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="璇疯緭鍏�"
+            clearable
+            prefix-icon="Search"
+            @change="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="褰曞叆鏃ユ湡锛�">
+          <el-date-picker
+            v-model="searchForm.entryDate"
+            value-format="YYYY-MM-DD"
+            format="YYYY-MM-DD"
+            type="daterange"
+            placeholder="璇烽�夋嫨"
+            clearable
+            @change="changeDaterange"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+
+    <div class="table_list">
+      <el-table
+        :data="tableData"
+        border
+        v-loading="tableLoading"
+        :expand-row-keys="expandedRowKeys"
+        :row-key="(row) => row.id"
+        show-summary
+        :summary-method="summarizeMainTable"
+        @expand-change="expandChange"
+        height="calc(100vh - 21.5em)"
+      >
+        <el-table-column type="expand">
+          <template #default="props">
+            <el-table
+              :data="props.row.children"
+              border
+              show-summary
+              :summary-method="summarizeChildrenTable"
+            >
+              <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="unit" />
+              <el-table-column label="鏁伴噺" prop="quantity" />
+              <el-table-column label="鍙敤鏁伴噺" prop="availableQuality" />
+              <el-table-column label="閫�璐ф暟閲�" prop="returnQuality" />
+              <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>
+          </template>
+        </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="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>
+          <template #default="scope">
+            <el-tag :type="getReceiptStatusType(scope.row.status)" size="small">
+              {{ receiptStatusText[scope.row.status] || '鏈煡鐘舵��' }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="瀹℃壒鐘舵��" prop="approvalStatus" width="100" show-overflow-tooltip>
+          <template #default="scope">
+            <el-tag :type="getApprovalStatusType(scope.row.approvalStatus)" size="small">
+              {{ approvalStatusText[scope.row.approvalStatus] || '鏈煡鐘舵��' }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="100" show-overflow-tooltip />
+        <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" width="100" show-overflow-tooltip />
+        <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="200" show-overflow-tooltip :formatter="formattedNumber" />
+        <el-table-column label="褰曞叆浜�" prop="recorderName" width="120" show-overflow-tooltip />
+        <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="100" show-overflow-tooltip />
+        <el-table-column label="澶囨敞" prop="remarks" width="200" show-overflow-tooltip />
+        <el-table-column fixed="right" label="鎿嶄綔" width="120" align="center">
+          <template #default="scope">
+            <el-button
+              link
+              type="primary"
+              :disabled="isConfirmed(scope.row)"
+              @click="confirmReceipt(scope.row)"
+            >
+              {{ isConfirmed(scope.row) ? '宸叉敹璐�' : '纭鏀惰揣' }}
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        layout="total, sizes, prev, pager, next, jumper"
+        :page="page.current"
+        :limit="page.size"
+        @pagination="paginationChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { onMounted, reactive, ref } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import dayjs from 'dayjs'
+import Pagination from '@/components/PIMTable/Pagination.vue'
+import { productList, purchaseListPage, updateApprovalStatus } from '@/api/procurementManagement/procurementLedger.js'
+
+const tableData = ref([])
+const tableLoading = ref(false)
+const total = ref(0)
+const expandedRowKeys = ref([])
+const receiptResultMap = ref({})
+
+const page = reactive({
+  current: 1,
+  size: 100
+})
+
+const searchForm = reactive({
+  supplierName: '',
+  purchaseContractNumber: '',
+  salesContractNo: '',
+  projectName: '',
+  entryDate: [],
+  entryDateStart: undefined,
+  entryDateEnd: undefined
+})
+
+const approvalStatusText = {
+  1: '寰呭鏍�',
+  2: '瀹℃壒涓�',
+  3: '瀹℃壒閫氳繃',
+  4: '瀹℃壒澶辫触'
+}
+
+const receiptStatusText = {
+  1: '寰呮敹璐�',
+  2: '鏀惰揣涓�',
+  3: '宸叉敹璐�'
+}
+
+const getApprovalStatusType = (status) => {
+  const typeMap = {
+    1: 'info',
+    2: 'warning',
+    3: 'success',
+    4: 'danger'
+  }
+  return typeMap[status]
+}
+
+const getReceiptStatusType = (status) => {
+  const typeMap = {
+    1: 'info',
+    2: 'warning',
+    3: 'success'
+  }
+  return typeMap[status]
+}
+
+const formattedNumber = (_row, _column, cellValue) => {
+  const value = Number(cellValue)
+  return Number.isFinite(value) ? value.toFixed(2) : '0.00'
+}
+
+const createSummary = (columns, data, sumFields) => {
+  const sums = []
+  columns.forEach((column, index) => {
+    if (index === 0) {
+      sums[index] = '鍚堣'
+      return
+    }
+    if (!sumFields.includes(column.property)) {
+      sums[index] = ''
+      return
+    }
+    const totalValue = data.reduce((sum, item) => sum + Number(item?.[column.property] || 0), 0)
+    sums[index] = Number.isFinite(totalValue) ? totalValue.toFixed(2) : '0.00'
+  })
+  return sums
+}
+
+const summarizeMainTable = ({ columns, data }) => createSummary(columns, data, ['contractAmount'])
+
+const summarizeChildrenTable = ({ columns, data }) =>
+  createSummary(columns, data, ['quantity', 'availableQuality', 'returnQuality', 'taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice'])
+
+const isConfirmed = (row) => Number(row?.status) === 3 || Boolean(receiptResultMap.value[row?.id])
+
+const handleQuery = () => {
+  page.current = 1
+  getList()
+}
+
+const changeDaterange = (value) => {
+  if (value) {
+    searchForm.entryDateStart = dayjs(value[0]).format('YYYY-MM-DD')
+    searchForm.entryDateEnd = dayjs(value[1]).format('YYYY-MM-DD')
+  } else {
+    searchForm.entryDateStart = undefined
+    searchForm.entryDateEnd = undefined
+  }
+  handleQuery()
+}
+
+const paginationChange = (obj) => {
+  page.current = obj.page
+  page.size = obj.limit
+  getList()
+}
+
+const expandChange = async (row, expandedRows) => {
+  if (expandedRows.length > 0) {
+    expandedRowKeys.value = []
+    try {
+      const res = await productList({ salesLedgerId: row.id, type: 2 })
+      const index = tableData.value.findIndex((item) => item.id === row.id)
+      if (index > -1) {
+        tableData.value[index].children = res.data || []
+        expandedRowKeys.value.push(row.id)
+      }
+    } catch (_error) {
+      ElMessage.error('鍔犺浇浜у搧鍒楄〃澶辫触')
+      const index = expandedRows.findIndex((item) => item.id === row.id)
+      if (index > -1) {
+        expandedRows.splice(index, 1)
+      }
+    }
+  } else {
+    expandedRowKeys.value = []
+  }
+}
+
+const getList = () => {
+  tableLoading.value = true
+  const { entryDate, ...rest } = searchForm
+  purchaseListPage({ ...rest, ...page, approvalStatus: 3 })
+    .then((res) => {
+      tableData.value = (res.data?.records || []).map((record) => ({
+        ...record,
+        children: []
+      }))
+      total.value = res.data?.total || 0
+      expandedRowKeys.value = []
+    })
+    .finally(() => {
+      tableLoading.value = false
+    })
+}
+
+const confirmReceipt = async (row) => {
+  try {
+    await ElMessageBox.confirm('鏄惁纭鏀惰揣锛�', '纭鏀惰揣', {
+      type: 'warning',
+      confirmButtonText: '纭',
+      cancelButtonText: '鍙栨秷'
+    })
+
+    await updateApprovalStatus({
+      id: row.id,
+      status: 3
+    })
+
+    receiptResultMap.value[row.id] = true
+    ElMessage.success('纭鏀惰揣鎴愬姛')
+    getList()
+  } catch (error) {
+    if (error !== 'cancel' && error !== 'close') {
+      ElMessage.error('纭鏀惰揣澶辫触')
+    }
+  }
+}
+
+onMounted(() => {
+  getList()
+})
+</script>
diff --git a/src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue b/src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue
new file mode 100644
index 0000000..345431c
--- /dev/null
+++ b/src/views/procurementManagement/receivingManagement/modal/ReceiptForm.vue
@@ -0,0 +1,338 @@
+<template>
+  <FormDialog
+    v-model="dialogVisible"
+    title="纭鏀惰揣"
+    width="70%"
+    operation-type="edit"
+    @close="handleClose"
+    @cancel="handleClose"
+    @confirm="handleConfirm"
+  >
+    <el-form ref="formRef" :model="detailData" label-width="140px" label-position="top">
+      <el-row :gutter="30">
+        <el-col :span="12">
+          <el-form-item label="閲囪喘鍚堝悓鍙凤細">
+            <el-input :model-value="detailData.purchaseContractNumber || ''" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="閿�鍞悎鍚屽彿锛�">
+            <el-input :model-value="detailData.salesContractNo || ''" disabled />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row :gutter="30">
+        <el-col :span="12">
+          <el-form-item label="渚涘簲鍟嗗悕绉帮細">
+            <el-input :model-value="detailData.supplierName || ''" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="椤圭洰鍚嶇О锛�">
+            <el-input :model-value="detailData.projectName || ''" disabled />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row :gutter="30">
+        <el-col :span="12">
+          <el-form-item label="浠樻鏂瑰紡锛�">
+            <el-input :model-value="detailData.paymentMethod || ''" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="绛捐鏃ユ湡锛�">
+            <el-input :model-value="detailData.executionDate || ''" disabled />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row :gutter="30">
+        <el-col :span="12">
+          <el-form-item label="褰曞叆浜猴細">
+            <el-input :model-value="detailData.recorderName || ''" disabled />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="褰曞叆鏃ユ湡锛�">
+            <el-input :model-value="detailData.entryDate || ''" disabled />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row :gutter="30">
+        <el-col :span="24">
+          <el-form-item label="瀹℃壒浜洪�夋嫨锛�">
+            <div class="approver-nodes-container">
+              <div v-for="(name, index) in approverNames" :key="`${name}-${index}`" class="approver-node-item">
+                <div class="approver-node-header">
+                  <span class="approver-node-label">瀹℃壒鑺傜偣 {{ index + 1 }}</span>
+                </div>
+                <el-input :model-value="name" disabled />
+              </div>
+              <el-empty v-if="!approverNames.length" description="鏆傛棤瀹℃壒浜轰俊鎭�" />
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-form-item label="浜у搧淇℃伅锛�">
+        <el-table :data="detailData.productData" border show-summary :summary-method="summarizeProductTable">
+          <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="unit" width="70" />
+          <el-table-column label="鏁伴噺" prop="quantity" width="90" />
+          <el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum" width="120" show-overflow-tooltip />
+          <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
+          <el-table-column label="鍚◣鍗曚环(鍏�)" prop="taxInclusiveUnitPrice" width="150" :formatter="formattedNumber" />
+          <el-table-column label="鍚◣鎬讳环(鍏�)" prop="taxInclusiveTotalPrice" width="150" :formatter="formattedNumber" />
+          <el-table-column label="涓嶅惈绋庢�讳环(鍏�)" prop="taxExclusiveTotalPrice" width="150" :formatter="formattedNumber" />
+          <el-table-column label="鏄惁璐ㄦ" prop="isChecked" width="100">
+            <template #default="scope">
+              <el-tag :type="scope.row.isChecked ? 'success' : 'info'">
+                {{ scope.row.isChecked ? '鏄�' : '鍚�' }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="鏄惁鍚堟牸" min-width="180">
+            <template #default="scope">
+              <el-form-item
+                :prop="`productData.${scope.$index}.isQualified`"
+                :rules="[{ required: true, message: '璇烽�夋嫨鏄惁鍚堟牸', trigger: 'change' }]"
+                class="inline-form-item"
+              >
+                <el-radio-group v-model="scope.row.isQualified">
+                  <el-radio :label="1">鍚堟牸</el-radio>
+                  <el-radio :label="2">涓嶅悎鏍�</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </template>
+          </el-table-column>
+          <el-table-column label="涓嶅悎鏍煎師鍥�" min-width="220">
+            <template #default="scope">
+              <el-form-item
+                :prop="`productData.${scope.$index}.reason`"
+                :rules="[{
+                  validator: (_rule, value, callback) => validateReason(scope.row, value, callback),
+                  trigger: 'blur'
+                }]"
+                class="inline-form-item"
+              >
+                <el-input
+                  v-model="scope.row.reason"
+                  :disabled="scope.row.isQualified !== 2"
+                  placeholder="涓嶅悎鏍兼椂璇峰~鍐欏師鍥�"
+                  clearable
+                />
+              </el-form-item>
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-form-item>
+
+      <el-row :gutter="30">
+        <el-col :span="24">
+          <el-form-item label="澶囨敞锛�">
+            <el-input :model-value="detailData.remarks || ''" type="textarea" :rows="2" disabled />
+          </el-form-item>
+        </el-col>
+      </el-row>
+
+      <el-row :gutter="30">
+        <el-col :span="24">
+          <el-form-item label="闄勪欢鏉愭枡锛�">
+            <div class="file-list">
+              <el-tag v-for="file in detailData.salesLedgerFiles" :key="file.id || file.fileName" class="file-tag">
+                {{ file.fileName || file.name }}
+              </el-tag>
+              <el-empty v-if="!detailData.salesLedgerFiles?.length" description="鏆傛棤闄勪欢" />
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+  </FormDialog>
+</template>
+
+<script setup>
+import { computed, reactive, ref, watch } from 'vue'
+import { ElMessage } from 'element-plus'
+import FormDialog from '@/components/Dialog/FormDialog.vue'
+
+const props = defineProps({
+  modelValue: {
+    type: Boolean,
+    default: false
+  },
+  record: {
+    type: Object,
+    default: () => ({})
+  }
+})
+
+const emit = defineEmits(['update:modelValue', 'submit'])
+
+const formRef = ref()
+
+const dialogVisible = computed({
+  get: () => props.modelValue,
+  set: (value) => emit('update:modelValue', value)
+})
+
+const createDefaultDetail = () => ({
+  id: '',
+  purchaseContractNumber: '',
+  salesContractNo: '',
+  supplierName: '',
+  projectName: '',
+  paymentMethod: '',
+  executionDate: '',
+  recorderName: '',
+  entryDate: '',
+  remarks: '',
+  approveUserIds: '',
+  approverNames: [],
+  salesLedgerFiles: [],
+  productData: []
+})
+
+const detailData = reactive(createDefaultDetail())
+
+const approverNames = computed(() => detailData.approverNames || [])
+
+const formattedNumber = (_row, _column, cellValue) => {
+  const value = Number(cellValue)
+  return Number.isFinite(value) ? value.toFixed(2) : '0.00'
+}
+
+const summarizeProductTable = ({ columns, data }) => {
+  const sumFields = ['quantity', 'taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']
+  const sums = []
+  columns.forEach((column, index) => {
+    if (index === 0) {
+      sums[index] = '鍚堣'
+      return
+    }
+    if (!sumFields.includes(column.property)) {
+      sums[index] = ''
+      return
+    }
+    const total = data.reduce((sum, item) => sum + Number(item?.[column.property] || 0), 0)
+    sums[index] = Number.isFinite(total) ? total.toFixed(2) : '0.00'
+  })
+  return sums
+}
+
+const validateReason = (row, value, callback) => {
+  if (row.isQualified === 2 && (!value || !value.trim())) {
+    callback(new Error('涓嶅悎鏍兼椂蹇呴』濉啓鍘熷洜'))
+    return
+  }
+  callback()
+}
+
+watch(
+  () => props.record,
+  (value) => {
+    const nextData = createDefaultDetail()
+    Object.assign(nextData, value || {})
+    nextData.productData = (value?.productData || []).map((item) => ({
+      ...item,
+      isQualified: item.isQualified ?? undefined,
+      reason: item.reason || ''
+    }))
+    nextData.salesLedgerFiles = value?.salesLedgerFiles || []
+    nextData.approverNames = value?.approverNames || []
+    Object.assign(detailData, nextData)
+  },
+  { immediate: true, deep: true }
+)
+
+const handleClose = () => {
+  dialogVisible.value = false
+}
+
+const handleConfirm = async () => {
+  if (!formRef.value) {
+    return
+  }
+  try {
+    await formRef.value.validate()
+    const unqualifiedRows = detailData.productData.filter((item) => item.isQualified === 2)
+    emit('submit', {
+      id: detailData.id,
+      purchaseContractNumber: detailData.purchaseContractNumber,
+      supplierName: detailData.supplierName,
+      projectName: detailData.projectName,
+      productData: detailData.productData.map((item) => ({
+        id: item.id,
+        specificationModel: item.specificationModel,
+        quantity: item.quantity,
+        isQualified: item.isQualified,
+        reason: item.reason || ''
+      })),
+      unqualifiedQuantity: unqualifiedRows.reduce((sum, item) => sum + Number(item.quantity || 0), 0)
+    })
+    dialogVisible.value = false
+  } catch (_error) {
+    ElMessage.warning('璇峰厛瀹屾垚姣忔潯浜у搧鐨勬敹璐у垽鏂�')
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.approver-nodes-container {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 16px;
+  width: 100%;
+}
+
+.approver-node-item {
+  flex: 0 0 calc(33.333% - 12px);
+  min-width: 220px;
+  padding: 12px;
+  background-color: #fff;
+  border-radius: 4px;
+  border: 1px solid #dcdfe6;
+}
+
+.approver-node-header {
+  margin-bottom: 8px;
+}
+
+.approver-node-label {
+  font-size: 13px;
+  font-weight: 500;
+  color: #606266;
+}
+
+.inline-form-item {
+  margin-bottom: 0;
+}
+
+.file-list {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 8px;
+  width: 100%;
+}
+
+.file-tag {
+  margin-right: 0;
+}
+
+@media (max-width: 1200px) {
+  .approver-node-item {
+    flex: 0 0 calc(50% - 8px);
+  }
+}
+
+@media (max-width: 768px) {
+  .approver-node-item {
+    flex: 0 0 100%;
+  }
+}
+</style>
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 10bfad9..458ab96 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -9,6 +9,28 @@
       <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-select
+                v-model="form.salesLedgerId"
+                placeholder="璇烽�夋嫨閿�鍞鍗�"
+                clearable
+                filterable
+                :disabled="isViewMode"
+                style="width: 100%"
+                @change="handleSalesLedgerChange"
+              >
+                <el-option
+                  v-for="item in salesLedgerOptions"
+                  :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">
             <el-form-item label="浜у搧鍚嶇О锛�" prop="productId">
               <el-tree-select
                   v-model="form.productId"
@@ -168,6 +190,7 @@
 import {userListNoPage} from "@/api/system/user.js";
 import {qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId} from "@/api/qualityManagement/metricMaintenance.js";
 import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
+import {ledgerListNoPage} from "@/api/salesManagement/salesLedger.js";
 const { proxy } = getCurrentInstance()
 const emit = defineEmits(['close'])
 
@@ -189,6 +212,8 @@
     unqualifiedQuantity: "",
     checkCompany: "",
     checkResult: "",
+    salesLedgerId: "",
+    salesContractNo: "",
   },
   rules: {
     checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
@@ -245,6 +270,7 @@
 const currentProductId = ref(0);
 const testStandardOptions = ref([]); // 鎸囨爣閫夋嫨涓嬫媺妗嗘暟鎹�
 const modelOptions = ref([]);
+const salesLedgerOptions = ref([]); // 閿�鍞鍗曚笅鎷夋鏁版嵁
 
 // 鎵撳紑寮规
 const openDialog = async (type, row) => {
@@ -255,11 +281,14 @@
   proxy.$refs.formRef?.clearValidate();
 
   // 骞惰鍔犺浇鍩虹鏁版嵁
-  const [userListsRes] = await Promise.all([
+  const [userListsRes, salesLedgerRes] = await Promise.all([
     userListNoPage(),
     getProductOptions(),
     getOptions().then((res) => {
       supplierList.value = res.data;
+    }),
+    ledgerListNoPage({ current: -1, size: -1 }).then((res) => {
+      salesLedgerOptions.value = res.data || [];
     })
   ]);
   userList.value = userListsRes.data;
@@ -357,6 +386,16 @@
   form.value.unit = modelOptions.value.find(item => item.id == value)?.unit || '';
 }
 
+// 閿�鍞鍗曢�夋嫨鍙樺寲澶勭悊
+const handleSalesLedgerChange = (value) => {
+  const selectedItem = salesLedgerOptions.value.find(item => item.id == value);
+  if (selectedItem) {
+    form.value.salesContractNo = selectedItem.salesContractNo || '';
+  } else {
+    form.value.salesContractNo = '';
+  }
+}
+
 const handleQualifiedQuantityChange = (value) => {
   if (value === null || value === undefined) {
     form.value.qualifiedQuantity = 0;
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
index 4a59fa4..81d5595 100644
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ b/src/views/qualityManagement/finalInspection/index.vue
@@ -5,16 +5,15 @@
                :model="searchForm"
                class="demo-form-inline">
         <el-row :gutter="20">
-          <el-col :span="4">
+          <el-col :span="6">
             <el-form-item label="浜у搧鍚嶇О"
                           prop="productName">
               <el-input v-model="searchForm.productName"
-                        style="width: 240px"
                         placeholder="璇疯緭鍏ヤ骇鍝佸悕绉版悳绱�"
                         clearable />
             </el-form-item>
           </el-col>
-          <el-col :span="6">
+          <el-col :span="8">
             <el-form-item label="妫�娴嬫棩鏈�"
                           prop="entryDate">
               <el-date-picker v-model="searchForm.entryDate"
@@ -26,21 +25,12 @@
                               @change="changeDaterange" />
             </el-form-item>
           </el-col>
-          <el-col :span="4">
+          <el-col :span="6">
             <el-form-item label="閿�鍞崟鍙�"
                           prop="salesContractNo">
               <el-input v-model="searchForm.salesContractNo"
                         style="width: 240px"
                         placeholder="璇疯緭鍏ラ攢鍞崟鍙锋悳绱�"
-                        clearable />
-            </el-form-item>
-          </el-col>
-          <el-col :span="4">
-            <el-form-item label="鐢熶骇宸ュ崟鍙�"
-                          prop="workOrderNo">
-              <el-input v-model="searchForm.workOrderNo"
-                        style="width: 240px"
-                        placeholder="璇疯緭鍏ョ敓浜у伐鍗曞彿鎼滅储"
                         clearable />
             </el-form-item>
           </el-col>
@@ -55,16 +45,14 @@
           </el-col>
         </el-row>
       </el-form>
-      <div class="actions">
-        <el-button type="primary"
-                   @click="openForm('add')">鏂板</el-button>
-        <el-button @click="handleOut">瀵煎嚭</el-button>
-        <el-button type="danger"
-                   plain
-                   @click="handleDelete">鍒犻櫎</el-button>
-      </div>
     </div>
     <div class="table_list">
+      <div style="margin-bottom: 20px; text-align: right;">
+      <el-button type="primary" @click="openQuickCheck">蹇�熸楠�</el-button>
+      <el-button type="primary" @click="openForm('add')">鏂板</el-button>
+      <el-button @click="handleOut">瀵煎嚭</el-button>
+      <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+    </div>
       <PIMTable rowKey="id"
                 :column="tableColumn"
                 :tableData="tableData"
@@ -110,6 +98,8 @@
         </div>
       </template>
     </el-dialog>
+
+
   </div>
 </template>
 
@@ -132,6 +122,7 @@
     qualityInspectListPage,
     qualityInspectUpdate,
     submitQualityInspect,
+    batchQuickInspect,
   } from "@/api/qualityManagement/rawMaterialInspection.js";
   import FilesDia from "@/views/qualityManagement/finalInspection/components/filesDia.vue";
   import dayjs from "dayjs";
@@ -152,6 +143,7 @@
     },
   });
   const { searchForm } = toRefs(data);
+
   const tableColumn = ref([
     {
       label: "妫�娴嬫棩鏈�",
@@ -161,11 +153,6 @@
     {
       label: "閿�鍞崟鍙�",
       prop: "salesContractNo",
-      width: 120,
-    },
-    {
-      label: "鐢熶骇宸ュ崟鍙�",
-      prop: "workOrderNo",
       width: 120,
     },
     {
@@ -399,6 +386,50 @@
       formDia.value?.openDialog(type, row);
     });
   };
+
+  // 鎵撳紑蹇�熸楠岀‘璁ゆ
+  const openQuickCheck = () => {
+    // 妫�鏌ユ槸鍚﹂�夋嫨浜嗘暟鎹�
+    if (!selectedRows.value || selectedRows.value.length === 0) {
+      proxy.$modal.msgWarning("璇峰厛閫夋嫨瑕佹楠岀殑鏁版嵁");
+      return;
+    }
+
+    // 杩囨护鍑烘湭鎻愪氦鐨勬暟鎹�
+    const unSubmittedRows = selectedRows.value.filter(item => item.inspectState !== 1);
+    if (unSubmittedRows.length === 0) {
+      proxy.$modal.msgWarning("閫変腑鐨勬暟鎹凡鍏ㄩ儴鎻愪氦锛屾棤闇�閲嶅妫�楠�");
+      return;
+    }
+
+    const totalCount = selectedRows.value.length;
+    const submittedCount = totalCount - unSubmittedRows.length;
+
+    let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
+    if (submittedCount > 0) {
+      confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
+    }
+    confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
+
+    ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+      dangerouslyUseHTMLString: false,
+    })
+      .then(() => {
+        // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
+        const ids = unSubmittedRows.map(item => item.id);
+        batchQuickInspect(ids).then(res => {
+          proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+          getList();
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
+
   // 鎵撳紑鏂板妫�楠屽脊妗�
   const openInspectionForm = (type, row) => {
     nextTick(() => {
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index 58d1a3a..85e3811 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -30,16 +30,14 @@
                    @click="handleQuery"
                    style="margin-left: 10px">鎼滅储</el-button>
       </div>
-      <div>
-        <el-button type="primary"
-                   @click="openForm('add')">鏂板</el-button>
-        <el-button @click="handleOut">瀵煎嚭</el-button>
-        <el-button type="danger"
-                   plain
-                   @click="handleDelete">鍒犻櫎</el-button>
-      </div>
     </div>
     <div class="table_list">
+       <div style="margin-bottom: 20px; text-align: right;">
+      <el-button type="primary" @click="openQuickCheck">蹇�熸楠�</el-button>
+      <el-button type="primary" @click="openForm('add')">鏂板</el-button>
+      <el-button @click="handleOut">瀵煎嚭</el-button>
+      <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+    </div>
       <PIMTable rowKey="id"
                 :column="tableColumn"
                 :tableData="tableData"
@@ -85,6 +83,8 @@
         </div>
       </template>
     </el-dialog>
+
+
   </div>
 </template>
 
@@ -107,6 +107,7 @@
     qualityInspectListPage,
     qualityInspectUpdate,
     submitQualityInspect,
+    batchQuickInspect,
   } from "@/api/qualityManagement/rawMaterialInspection.js";
   import FilesDia from "@/views/qualityManagement/processInspection/components/filesDia.vue";
   import dayjs from "dayjs";
@@ -126,15 +127,11 @@
     },
   });
   const { searchForm } = toRefs(data);
+
   const tableColumn = ref([
     {
       label: "妫�娴嬫棩鏈�",
       prop: "checkTime",
-      width: 120,
-    },
-    {
-      label: "鐢熶骇宸ュ崟鍙�",
-      prop: "workOrderNo",
       width: 120,
     },
     {
@@ -372,6 +369,50 @@
       formDia.value?.openDialog(type, row);
     });
   };
+
+  // 鎵撳紑蹇�熸楠岀‘璁ゆ
+  const openQuickCheck = () => {
+    // 妫�鏌ユ槸鍚﹂�夋嫨浜嗘暟鎹�
+    if (!selectedRows.value || selectedRows.value.length === 0) {
+      proxy.$modal.msgWarning("璇峰厛閫夋嫨瑕佹楠岀殑鏁版嵁");
+      return;
+    }
+
+    // 杩囨护鍑烘湭鎻愪氦鐨勬暟鎹�
+    const unSubmittedRows = selectedRows.value.filter(item => item.inspectState !== 1);
+    if (unSubmittedRows.length === 0) {
+      proxy.$modal.msgWarning("閫変腑鐨勬暟鎹凡鍏ㄩ儴鎻愪氦锛屾棤闇�閲嶅妫�楠�");
+      return;
+    }
+
+    const totalCount = selectedRows.value.length;
+    const submittedCount = totalCount - unSubmittedRows.length;
+
+    let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
+    if (submittedCount > 0) {
+      confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
+    }
+    confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
+
+    ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+      dangerouslyUseHTMLString: false,
+    })
+      .then(() => {
+        // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
+        const ids = unSubmittedRows.map(item => item.id);
+        batchQuickInspect(ids).then(res => {
+          proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+          getList();
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
+
   // 鎵撳紑鏂板妫�楠屽脊妗�
   const openInspectionForm = (type, row) => {
     nextTick(() => {
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index 6d2acd5..609176e 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -31,16 +31,14 @@
                    style="margin-left: 10px">鎼滅储
         </el-button>
       </div>
-      <div>
-        <el-button type="primary"
-                   @click="openForm('add')">鏂板</el-button>
-        <el-button @click="handleOut">瀵煎嚭</el-button>
-        <el-button type="danger"
-                   plain
-                   @click="handleDelete">鍒犻櫎</el-button>
-      </div>
     </div>
     <div class="table_list">
+       <div style="margin-bottom: 20px; text-align: right;">
+      <el-button type="primary" @click="openQuickCheck">蹇�熸楠�</el-button>
+      <el-button type="primary" @click="openForm('add')">鏂板</el-button>
+      <el-button @click="handleOut">瀵煎嚭</el-button>
+      <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+    </div>
       <PIMTable rowKey="id"
                 :column="tableColumn"
                 :tableData="tableData"
@@ -86,6 +84,8 @@
         </div>
       </template>
     </el-dialog>
+
+
   </div>
 </template>
 
@@ -108,6 +108,7 @@
     qualityInspectListPage,
     qualityInspectUpdate,
     submitQualityInspect,
+    batchQuickInspect,
   } from "@/api/qualityManagement/rawMaterialInspection.js";
   import FilesDia from "@/views/qualityManagement/rawMaterialInspection/components/filesDia.vue";
   import dayjs from "dayjs";
@@ -127,6 +128,7 @@
     },
   });
   const { searchForm, rules } = toRefs(data);
+
   const tableColumn = ref([
     {
       label: "妫�娴嬫棩鏈�",
@@ -378,6 +380,50 @@
       formDia.value?.openDialog(type, row);
     });
   };
+
+  // 鎵撳紑蹇�熸楠岀‘璁ゆ
+  const openQuickCheck = () => {
+    // 妫�鏌ユ槸鍚﹂�夋嫨浜嗘暟鎹�
+    if (!selectedRows.value || selectedRows.value.length === 0) {
+      proxy.$modal.msgWarning("璇峰厛閫夋嫨瑕佹楠岀殑鏁版嵁");
+      return;
+    }
+
+    // 杩囨护鍑烘湭鎻愪氦鐨勬暟鎹�
+    const unSubmittedRows = selectedRows.value.filter(item => item.inspectState !== 1);
+    if (unSubmittedRows.length === 0) {
+      proxy.$modal.msgWarning("閫変腑鐨勬暟鎹凡鍏ㄩ儴鎻愪氦锛屾棤闇�閲嶅妫�楠�");
+      return;
+    }
+
+    const totalCount = selectedRows.value.length;
+    const unSubmittedCount = unSubmittedRows.length;
+    const submittedCount = totalCount - unSubmittedCount;
+
+    let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
+    if (submittedCount > 0) {
+      confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
+    }
+    confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
+
+    ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+      dangerouslyUseHTMLString: false,
+    })
+      .then(() => {
+        // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
+        const ids = unSubmittedRows.map(item => item.id);
+        batchQuickInspect(ids).then(res => {
+          proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+          getList();
+        });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
   // 鎵撳紑闄勪欢寮规
   const openFilesFormDia = (type, row) => {
     nextTick(() => {
diff --git a/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue b/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue
index a7d0174..d795f50 100644
--- a/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue
+++ b/src/views/reportAnalysis/dataDashboard/components/basic/center-top.vue
@@ -5,18 +5,6 @@
       <div class="stat-card">
         <img src="@/assets/BI/icon@2x.png" alt="鍥炬爣" class="card-icon" />
         <div class="card-content">
-          <span class="card-label">鍛樺伐鎬绘暟</span>
-          <span class="card-value">{{ totalStaff }}</span>
-          <div class="card-compare" :class="compareClass(staffYoY)">
-            <span>鍚屾瘮</span>
-            <span class="compare-value">{{ formatPercent(staffYoY) }}</span>
-            <span class="compare-icon">{{ staffYoY >= 0 ? '鈫�' : '鈫�' }}</span>
-          </div>
-        </div>
-      </div>
-      <div class="stat-card">
-        <img src="@/assets/BI/icon@2x.png" alt="鍥炬爣" class="card-icon" />
-        <div class="card-content">
           <span class="card-label">瀹㈡埛鎬绘暟</span>
           <span class="card-value">{{ totalCustomers }}</span>
           <div class="card-compare" :class="compareClass(customersYoY)">
@@ -118,11 +106,9 @@
 import { measuringInstrumentListPage } from '@/api/equipmentManagement/measurementEquipment.js'
 
 // 缁熻鏁版嵁
-const totalStaff = ref(0)
 const totalCustomers = ref(0)
 const totalSuppliers = ref(0)
 // 鍚屾瘮
-const staffYoY = ref(0)
 const customersYoY = ref(0)
 const suppliersYoY = ref(0)
 const equipmentNum = ref(0)
@@ -141,11 +127,9 @@
 
 const compareClass = (val) => (val >= 0 ? 'compare-up' : 'compare-down')
 
-// 鑾峰彇鍛樺伐銆佸鎴枫�佷緵搴斿晢鏁伴噺
+// 鑾峰彇瀹㈡埛銆佷緵搴斿晢鏁伴噺
 const getNum = () => {
   summaryStatistics().then((res) => {
-    totalStaff.value = res.data.totalStaff
-    staffYoY.value = res.data.staffGrowthRate
     totalCustomers.value = res.data.totalCustomer
     customersYoY.value = res.data.customerGrowthRate
     totalSuppliers.value = res.data.totalSupplier
@@ -388,6 +372,7 @@
   padding: 18px;
   height: 240px;
   padding-top: 0px;
+  margin-bottom: 20px;
 }
 
 .equipment-header {
@@ -459,7 +444,8 @@
   background-repeat: no-repeat;
   padding: 20px;
   padding-top: 10px;
-  height: 186px;
+  height: 480px;
+  flex: 1;
 }
 
 .event-header {
@@ -483,7 +469,7 @@
   list-style: none;
   padding: 0;
   margin: 0;
-  height: 120px; /* 鎸夌敤鎴疯姹傝皟鏁撮珮搴� */
+  height: 210px;
   overflow: hidden;
   font-size: 15px;
 }
diff --git a/src/views/reportAnalysis/dataDashboard/index.vue b/src/views/reportAnalysis/dataDashboard/index.vue
index ff53a7b..9b46494 100644
--- a/src/views/reportAnalysis/dataDashboard/index.vue
+++ b/src/views/reportAnalysis/dataDashboard/index.vue
@@ -28,8 +28,6 @@
     <!-- 涓棿鍖哄煙 -->
     <div class="center-panel">
       <CenterTop />
-      
-      <CenterBottom />
     </div>
 
     <!-- 鍙充晶鍖哄煙 -->
@@ -49,7 +47,6 @@
 import LeftTop from './components/basic/left-top.vue'
 import LeftBottom from './components/basic/left-bottom.vue'
 import CenterTop from './components/basic/center-top.vue'
-import CenterBottom from './components/basic/center-bottom.vue'
 import RightTop from './components/basic/right-top.vue'
 import RightBottom from './components/basic/right-bottom.vue'
 import useUserStore from '@/store/modules/user'
diff --git a/src/views/salesManagement/receiptPaymentLedger/index.vue b/src/views/salesManagement/receiptPaymentLedger/index.vue
index f5a9d8f..abcef02 100644
--- a/src/views/salesManagement/receiptPaymentLedger/index.vue
+++ b/src/views/salesManagement/receiptPaymentLedger/index.vue
@@ -16,7 +16,8 @@
       </div>
     </div>
     <el-row :gutter="20">
-      <el-col :span="12">
+      <!-- 宸︿晶瀹㈡埛鍒楄〃 -->
+      <el-col :span="8">
         <div class="table_list"
              style="width: 100%">
           <el-table :data="tableData"
@@ -40,22 +41,17 @@
                              prop="contractAmounts"
                              show-overflow-tooltip
                              :formatter="formattedNumber"
-                             width="200" />
-            <el-table-column label="鍥炴閲戦(鍏�)"
-                             prop="receiptPaymentAmount"
-                             show-overflow-tooltip
-                             :formatter="formattedNumber"
-                             width="200" />
-            <el-table-column label="搴旀敹閲戦(鍏�)"
-                             prop="receiptableAmount"
-                             show-overflow-tooltip
-                             width="200">
-              <template #default="{ row, column }">
-                <el-text type="danger">
-                  {{ formattedNumber(row, column, row.receiptableAmount) }}
-                </el-text>
-              </template>
-            </el-table-column>
+                             width="150" />
+<!--            <el-table-column label="搴旀敹閲戦(鍏�)"-->
+<!--                             prop="receiptableAmount"-->
+<!--                             show-overflow-tooltip-->
+<!--                             width="150">-->
+<!--              <template #default="{ row, column }">-->
+<!--                <el-text type="danger">-->
+<!--                  {{ formattedNumber(row, column, row.receiptableAmount) }}-->
+<!--                </el-text>-->
+<!--              </template>-->
+<!--            </el-table-column>-->
           </el-table>
           <pagination v-show="total > 0"
                       :total="total"
@@ -65,57 +61,85 @@
                       @pagination="paginationChange" />
         </div>
       </el-col>
-      <el-col :span="12">
+      <!-- 鍙充晶璁㈠崟淇℃伅 -->
+      <el-col :span="16">
         <div class="table_list"
              style="width: 100%">
-          <el-table :data="receiptRecord"
+
+          <el-table :data="orderRecord"
                     border
                     :row-key="(row) => row.id"
-                    show-summary
-                    :summary-method="summarizeMainTable1"
-                    height="calc(100vh - 18.5em)">
+                    v-loading="orderLoading"
+                    height="calc(100vh - 20em)">
             <el-table-column align="center"
                              label="搴忓彿"
                              type="index"
                              width="60" />
-            <el-table-column label="鍚堝悓绛捐鏃ユ湡"
-                             prop="executionDate"
-                             show-overflow-tooltip
-                             width="110" />
-            <el-table-column label="閿�鍞悎鍚屽彿"
+            <el-table-column label="閿�鍞鍗�"
                              prop="salesContractNo"
                              show-overflow-tooltip
-                             width="200" />
-            <el-table-column label="鍚堝悓閲戦(鍏�)"
-                             prop="contractAmount"
+                             width="150" />
+            <!-- <el-table-column label="鍙戣揣璁㈠崟鍙�"
+                             prop="shippingNo"
                              show-overflow-tooltip
-                             :formatter="formattedNumber"
-                             width="200" />
-            <el-table-column label="鍥炴閲戦(鍏�)"
-                             prop="receiptPaymentAmount"
+                             width="150" /> -->
+            <el-table-column label="瀹㈡埛鍚嶇О"
+                             prop="customerName"
                              show-overflow-tooltip
-                             :formatter="formattedNumber"
-                             width="200" />
-            <el-table-column label="搴旀敹閲戦(鍏�)"
-                             prop="receiptableAmount"
+                             width="150" />
+            <el-table-column label="浜у搧鍚嶇О"
+                             prop="productName"
                              show-overflow-tooltip
-                             width="200">
-              <template #default="{ row, column }">
-                <el-text type="danger">
-                  {{ formattedNumber(row, column, row.receiptableAmount) }}
-                </el-text>
+                             width="150" />
+            <el-table-column label="瑙勬牸鍨嬪彿"
+                             prop="specificationModel"
+                             show-overflow-tooltip
+                             width="120" />
+            <el-table-column label="鍙戣揣鏃堕棿"
+                             prop="shippingDate"
+                             show-overflow-tooltip
+                             width="110" />
+            <el-table-column label="鍙戣揣鏁伴噺"
+                             prop="totalQuantity"
+                             show-overflow-tooltip
+                             width="100" />
+            <!-- <el-table-column label="鍙戣揣杞︾墝鍙�"
+                             prop="shippingCarNumber"
+                             show-overflow-tooltip
+                             width="120" />
+            <el-table-column label="蹇�掑叕鍙�"
+                             prop="expressCompany"
+                             show-overflow-tooltip
+                             width="120" />
+            <el-table-column label="蹇�掑崟鍙�"
+                             prop="expressNumber"
+                             show-overflow-tooltip
+                             width="150" /> -->
+            <el-table-column label="鍙戣揣鐘舵��"
+                             prop="status"
+                             align="center"
+                             width="100">
+              <template #default="{ row }">
+                <el-tag :type="getApprovalStatusType(row.status)">
+                  {{ getApprovalStatusText(row.status) }}
+                </el-tag>
               </template>
             </el-table-column>
+            <el-table-column label="鍑哄簱鍗曞彿"
+                             prop="outboundBatches"
+                             show-overflow-tooltip
+                             width="130" />
           </el-table>
-          <pagination v-show="recordTotal > 0"
-                      :total="recordTotal"
+          <pagination v-show="orderTotal > 0"
+                      :total="orderTotal"
                       layout="total, sizes, prev, pager, next, jumper"
-                      :page="recordPage.current"
-                      :limit="recordPage.size"
-                      @pagination="recordPaginationChange" />
+                      :page="orderPage.current"
+                      :limit="orderPage.size"
+                      @pagination="orderPaginationChange" />
         </div>
       </el-col>
     </el-row>
+
   </div>
 </template>
 
@@ -123,23 +147,25 @@
   import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue";
   import {
     customewTransactions,
-    customewTransactionsDetails,
   } from "@/api/salesManagement/indicatorStats.js";
+  import { deliveryLedgerListPage } from "@/api/salesManagement/deliveryLedger.js";
   import Pagination from "../../../components/PIMTable/Pagination.vue";
+
   const { proxy } = getCurrentInstance();
   const tableData = ref([]);
-  const receiptRecord = ref([]);
+  const orderRecord = ref([]);
   const tableLoading = ref(false);
+  const orderLoading = ref(false);
   const page = reactive({
     current: 1,
     size: 100,
   });
-  const recordPage = reactive({
+  const orderPage = reactive({
     current: 1,
     size: 100,
   });
   const total = ref(0);
-  const recordTotal = ref(0);
+  const orderTotal = ref(0);
   const data = reactive({
     searchForm: {
       searchText: "",
@@ -148,7 +174,7 @@
   });
   const customerId = ref("");
   const { searchForm } = toRefs(data);
-  const originReceiptRecord = ref([]);
+
   // 鏌ヨ鍒楄〃
   /** 鎼滅储鎸夐挳鎿嶄綔 */
   const handleQuery = () => {
@@ -167,9 +193,12 @@
       tableData.value = res.data.records;
       total.value = res.data.total;
       if (tableData.value.length > 0) {
-        recordPage.current = 1;
+        orderPage.current = 1;
         customerId.value = tableData.value[0].customerId;
-        receiptPaymentList(customerId.value);
+        getOrderList(customerId.value);
+      } else {
+        orderRecord.value = [];
+        customerId.value = "";
       }
     });
   };
@@ -180,64 +209,82 @@
   const summarizeMainTable = param => {
     return proxy.summarizeTable(
       param,
-      ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"],
+      ["contractAmounts", "receiptableAmount"],
       {
-        ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-        futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+        ticketsNum: { noDecimal: true },
+        futureTickets: { noDecimal: true },
       }
     );
   };
-  // 瀛愯〃鍚堣鏂规硶
-  const summarizeMainTable1 = param => {
-    var summarizeTable = proxy.summarizeTable(
-      param,
-      ["contractAmount", "receiptPaymentAmount", "receiptableAmount"],
-      {
-        ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-        futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+
+  // 鑾峰彇璁㈠崟鍒楄〃锛堟牴鎹鎴稩D鏌ヨ鍙戣揣鍙拌处锛�
+  const getOrderList = async (id) => {
+    orderLoading.value = true;
+    try {
+      // 浣跨敤 deliveryLedgerListPage 鎺ュ彛鏍规嵁 customerId 鏌ヨ
+      const res = await deliveryLedgerListPage({
+        customerId: id,
+        current: 1,
+        size: 1000,
+      });
+      let orders = [];
+      if (res.data) {
+        if (Array.isArray(res.data)) {
+          orders = res.data;
+        } else if (res.data.records && Array.isArray(res.data.records)) {
+          orders = res.data.records;
+        }
       }
-    );
-    return summarizeTable;
+
+      orderTotal.value = orders.length;
+      handleOrderPagination({ page: orderPage.current, limit: orderPage.size }, orders);
+    } catch (error) {
+      console.error('鑾峰彇璁㈠崟鍒楄〃澶辫触:', error);
+      orderRecord.value = [];
+    } finally {
+      orderLoading.value = false;
+    }
   };
 
-  const receiptPaymentList = id => {
-    const param = {
-      customerId: id,
-      current: recordPage.current,
-      size: recordPage.size,
-    };
-    customewTransactionsDetails(param).then(res => {
-      if (Array.isArray(res.data)) {
-        originReceiptRecord.value = res.data;
-        recordTotal.value = res.data.length;
-        handlePagination({ page: 1, limit: recordPage.size });
-      } else {
-        receiptRecord.value = res.data.records;
-        recordTotal.value = res.data.total;
-      }
-    });
+  // 璁㈠崟鍒楄〃鍒嗛〉
+  const orderPaginationChange = pagination => {
+    orderPage.current = pagination.page;
+    orderPage.size = pagination.limit;
+    getOrderList(customerId.value);
   };
 
-  // 姹囨璁板綍鍒楄〃鍒嗛〉
-  const recordPaginationChange = pagination => {
-    recordPage.current = pagination.page;
-    recordPage.size = pagination.limit;
-    receiptPaymentList(customerId.value);
+  const handleOrderPagination = ({ page, limit }, allOrders) => {
+    const start = (page - 1) * limit;
+    const end = start + limit;
+    orderRecord.value = allOrders.slice(start, end);
   };
 
   const rowClickMethod = row => {
     customerId.value = row.customerId;
-    receiptPaymentList(customerId.value);
+    orderPage.current = 1;
+    getOrderList(customerId.value);
   };
 
-  const handlePagination = ({ page, limit }) => {
-    recordPage.current = page;
-    recordPage.size = limit;
+  // 瀹℃牳鐘舵�佹爣绛剧被鍨�
+  const getApprovalStatusType = (status) => {
+    const statusMap = {
+      '宸插彂璐�': 'success',
+      '瀹℃牳閫氳繃': 'success',
+      '瀹℃牳涓�': 'warning',
+      '瀹℃牳涓嶉�氳繃': 'danger',
+    };
+    return statusMap[status] || 'info';
+  };
 
-    const start = (page - 1) * limit;
-    const end = start + limit;
-
-    receiptRecord.value = originReceiptRecord.value.slice(start, end);
+  // 瀹℃牳鐘舵�佹枃鏈�
+  const getApprovalStatusText = (status) => {
+    const statusMap = {
+      '宸插彂璐�': '宸插彂璐�',
+      '瀹℃牳閫氳繃': '瀹℃牳閫氳繃',
+      '瀹℃牳涓�': '瀹℃牳涓�',
+      '瀹℃牳涓嶉�氳繃': '瀹℃牳涓嶉�氳繃',
+    };
+    return statusMap[status] || status || '--';
   };
 
   onMounted(() => {
@@ -247,6 +294,7 @@
 
 <style scoped lang="scss">
   .table_list {
-    width: 50%;
+    width: 100%;
   }
+
 </style>
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 604ba82..e7300a4 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -419,6 +419,41 @@
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
+            <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
+              <el-select
+                v-model="form.purchaseContractNumber"
+                placeholder="璇烽�夋嫨閲囪喘鍚堝悓鍙�"
+                clearable
+                filterable
+                style="width: 100%"
+                :disabled="operationType === 'view'"
+              >
+                <el-option
+                  v-for="item in purchaseContractOptions"
+                  :key="item.purchaseContractNumber"
+                  :label="item.purchaseContractNumber + ' - ' + item.supplierName"
+                  :value="item.purchaseContractNumber"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="浜よ揣鏃ユ湡锛�" prop="entryDate">
+              <el-date-picker
+                style="width: 100%"
+                v-model="form.deliveryDate"
+                value-format="YYYY-MM-DD"
+                format="YYYY-MM-DD"
+                type="date"
+                placeholder="璇烽�夋嫨"
+                clearable
+                :disabled="operationType === 'view'"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
             <el-form-item label="褰曞叆浜猴細" prop="entryPerson">
               <el-select
                 v-model="form.entryPerson"
@@ -444,22 +479,6 @@
               <el-date-picker
                 style="width: 100%"
                 v-model="form.entryDate"
-                value-format="YYYY-MM-DD"
-                format="YYYY-MM-DD"
-                type="date"
-                placeholder="璇烽�夋嫨"
-                clearable
-                :disabled="operationType === 'view'"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="浜よ揣鏃ユ湡锛�" prop="entryDate">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.deliveryDate"
                 value-format="YYYY-MM-DD"
                 format="YYYY-MM-DD"
                 type="date"
@@ -527,13 +546,14 @@
             prop="taxExclusiveTotalPrice"
             :formatter="formattedNumber"
           />
-          <el-table-column label="鏄惁鐢熶骇" prop="isProduction" width="150">
+          <!-- 鏄惁鐢熶骇鍒楀凡闅愯棌锛岄粯璁ゅ�间负 false -->
+          <!-- <el-table-column label="鏄惁鐢熶骇" prop="isProduction" width="150">
             <template #default="scope">
               <el-tag :type="scope.row.isProduction ? 'success' : 'info'">
                 {{ scope.row.isProduction ? "鏄�" : "鍚�" }}
               </el-tag>
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <el-table-column
             fixed="right"
             label="鎿嶄綔"
@@ -823,14 +843,15 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
+          <!-- 鏄惁鐢熶骇瀛楁宸查殣钘忥紝榛樿鍊间负 false -->
+          <!-- <el-col :span="12">
             <el-form-item label="鏄惁鐢熶骇锛�" prop="isProduction">
               <el-radio-group v-model="productForm.isProduction">
                 <el-radio label="鏄�" :value="true" />
                 <el-radio label="鍚�" :value="false" />
               </el-radio-group>
             </el-form-item>
-          </el-col>
+          </el-col> -->
         </el-row>
       </el-form>
     </FormDialog>
@@ -1180,6 +1201,7 @@
 } from "@/api/salesManagement/salesLedger.js";
 import { getStockInventoryByModelId } from "@/api/inventoryManagement/stockInventory.js";
 import { modelList, productTreeList } from "@/api/basicData/product.js";
+import { purchaseList } from "@/api/procurementManagement/procurementLedger.js";
 import useFormData from "@/hooks/useFormData.js";
 import dayjs from "dayjs";
 import FileUpload from "@/components/AttachmentUpload/file/index.vue";
@@ -1204,6 +1226,7 @@
 const customerOption = ref([]);
 const productOptions = ref([]);
 const modelOptions = ref([]);
+const purchaseContractOptions = ref([]);
 const tableLoading = ref(false);
 const page = reactive({
   current: 1,
@@ -1237,6 +1260,7 @@
     executionDate: "",
     hasProductionRecord: false,
     createTime: "",
+    purchaseContractNumber: "",
   },
   rules: {
     salesman: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -1264,7 +1288,7 @@
     taxInclusiveTotalPrice: "",
     taxExclusiveTotalPrice: "",
     invoiceType: "",
-    isProduction: false,
+    isProduction: false, // 榛樿鍊间负 false锛堝惁锛�
   },
   productRules: {
     productCategory: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -1375,22 +1399,9 @@
 const getDeliveryBatchNoList = async (productModelId) => {
   if (!productModelId) return [];
   const res = await getStockInventoryByModelId(productModelId);
-  const rawList = Array.isArray(res?.data)
-    ? res.data
-    : res?.data?.records || res?.data?.rows || [];
+  const rawList = res.data || [];
   const seenIds = new Set();
   return rawList
-    .filter((item) => {
-      if (!item?.id || !item?.batchNo || seenIds.has(item.id)) {
-        return false;
-      }
-      seenIds.add(item.id);
-      return true;
-    })
-    .map((item) => ({
-      ...item,
-      deliveryQuantity: 0,
-    }));
 };
 const validateDeliveryShippingCarNumber = (_rule, value, callback) => {
   if (deliveryForm.value.type === "璐ц溅" && !value) {
@@ -1742,6 +1753,8 @@
   listCustomer({ current: -1, size: -1, type: 0 }).then((res) => {
     customerOption.value = res.data.records;
   });
+  // 鑾峰彇閲囪喘鍚堝悓鍒楄〃
+  await getPurchaseContractList();
   form.value.entryPerson = userStore.id;
   if (type === "add") {
     // 鏂板鏃惰缃綍鍏ユ棩鏈熶负褰撳ぉ
@@ -1871,7 +1884,7 @@
       taxInclusiveTotalPrice: taxInclusiveTotalPrice,
       taxExclusiveTotalPrice: taxExclusiveTotalPrice,
       invoiceType: "澧炴櫘绁�",
-      isProduction: true,
+      isProduction: false, // 榛樿鍊间负 false锛堝惁锛�
       productId: p.productId,
       productModelId: p.productModelId,
     };
@@ -1927,7 +1940,7 @@
   productOperationType.value = type;
   productForm.value = {};
   if (type === "add") {
-    productForm.value.isProduction = true;
+    productForm.value.isProduction = false; // 榛樿鍊间负 false锛堝惁锛�
   }
   proxy.resetForm("productFormRef");
   if (type === "edit") {
@@ -1963,6 +1976,17 @@
   }
   productFormVisible.value = true;
 };
+
+// 鑾峰彇閲囪喘鍚堝悓鍒楄〃
+const getPurchaseContractList = async () => {
+  try {
+    const res = await purchaseList({ current: -1, size: -1 });
+    purchaseContractOptions.value = res.rows;
+  } catch (error) {
+    console.error("鑾峰彇閲囪喘鍚堝悓鍒楄〃澶辫触", error);
+    purchaseContractOptions.value = [];
+  }
+};
 // 鎻愪氦浜у搧琛ㄥ崟
 const submitProduct = () => {
   proxy.$refs["productFormRef"].validate((valid) => {

--
Gitblit v1.9.3