From 0841c0c2c24056d142af161ec814d757a8c826d9 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期三, 14 一月 2026 14:39:15 +0800
Subject: [PATCH] Merge branch 'dev_New' of http://114.132.189.42:9002/r/product-inventory-management into dev_New

---
 src/views/procurementManagement/qualityInspection/index.vue       |    9 
 src/views/basicData/product/index.vue                             |    2 
 src/views/procurementManagement/purchaseOrder/index.vue           |    9 
 src/views/procurementManagement/invoiceEntry/index.vue            |   24 
 src/views/procurementManagement/paymentEntry/index.vue            |  368 ++--
 src/views/salesManagement/salesLedger/index.vue                   |  161 +-
 src/views/salesManagement/paymentShipping/index.vue               |   23 
 src/views/salesManagement/salespersonManagement/index.vue         |   21 
 src/views/salesManagement/invoiceLedger/index.vue                 |   90 
 src/views/procurementManagement/procurementPlan/index.vue         |   52 
 src/views/procurementManagement/invoiceEntry/components/Modal.vue |  935 +++++++----
 src/views/procurementManagement/advancedPriceManagement/index.vue |   25 
 src/api/salesManagement/receiptPayment.js                         |    2 
 src/views/salesManagement/deliveryLedger/index.vue                |   13 
 src/views/salesManagement/receiptPayment/index.vue                |  384 ++--
 src/api/procurementManagement/procurementInvoiceLedger.js         |    2 
 src/views/procurementManagement/arrivalManagement/index.vue       |    9 
 src/components/PIMTable/PIMTable.vue                              |    2 
 src/views/salesManagement/salesQuotation/index.vue                |   98 -
 src/views/procurementManagement/priceManagement/index.vue         |    9 
 src/views/salesManagement/invoiceRegistration/index.vue           | 1254 ++++++++-------
 /dev/null                                                         |  727 ---------
 src/views/procurementManagement/procurementLedger/index.vue       |  456 -----
 src/views/salesManagement/orderManagement/index.vue               |   15 
 src/views/procurementManagement/transferManagement/index.vue      |    9 
 src/views/salesManagement/receiptPaymentHistory/index.vue         |   32 
 src/views/procurementManagement/returnManagement/index.vue        |    9 
 27 files changed, 1,800 insertions(+), 2,940 deletions(-)

diff --git a/src/api/procurementManagement/procurementInvoiceLedger.js b/src/api/procurementManagement/procurementInvoiceLedger.js
index 76f8410..2408bbd 100644
--- a/src/api/procurementManagement/procurementInvoiceLedger.js
+++ b/src/api/procurementManagement/procurementInvoiceLedger.js
@@ -61,7 +61,7 @@
 // 鏌ヨ鍒楄〃
 export function invoiceListPage(query) {
   return request({
-    url: "/purchase/registration/listPage",
+    url: "/sales/product/listPagePurchaseLedger",
     method: "get",
     params: query,
   });
diff --git a/src/api/salesManagement/receiptPayment.js b/src/api/salesManagement/receiptPayment.js
index b5d0cf5..0f0529d 100644
--- a/src/api/salesManagement/receiptPayment.js
+++ b/src/api/salesManagement/receiptPayment.js
@@ -40,7 +40,7 @@
 // 鏌ヨ宸茬粡缁戝畾鍙戠エ鐨勫紑绁ㄥ彴璐�
 export function bindInvoiceNoRegPage(query) {
     return request({
-        url: '/receiptPayment/bindInvoiceNoRegPage',
+        url: '/sales/product/listPageSalesLedger',
         method: 'get',
         params: query
     })
diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue
index ac4656d..4174151 100644
--- a/src/components/PIMTable/PIMTable.vue
+++ b/src/components/PIMTable/PIMTable.vue
@@ -40,7 +40,7 @@
       :fixed="item.fixed"
       :label="item.label"
       :prop="item.prop"
-      show-overflow-tooltip
+      :show-overflow-tooltip="item.dataType !== 'action'"
       :align="item.align"
       :sortable="!!item.sortable"
       :type="item.type"
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index b88d678..3f0921a 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -25,9 +25,7 @@
           :data="list"
           @node-click="handleNodeClick"
           :expand-on-click-node="false"
-          default-expand-all
           :default-expanded-keys="expandedKeys"
-          :draggable="true"
           :filter-node-method="filterNode"
           :props="{ children: 'children', label: 'label' }"
           highlight-current
diff --git a/src/views/procurementManagement/advancedPriceManagement/index.vue b/src/views/procurementManagement/advancedPriceManagement/index.vue
index 597b39b..84bd160 100644
--- a/src/views/procurementManagement/advancedPriceManagement/index.vue
+++ b/src/views/procurementManagement/advancedPriceManagement/index.vue
@@ -139,7 +139,7 @@
     </el-card>
 
     <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
-    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板浠锋牸' : '缂栬緫浠锋牸'" width="800px">
+    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板浠锋牸' : '缂栬緫浠锋牸'" :width="'800px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <el-form :model="formData" :rules="formRules" ref="formRef" label-width="120px">
         <el-row :gutter="20">
           <el-col :span="12">
@@ -266,14 +266,10 @@
           <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleSubmit" :loading="submitLoading">纭畾</el-button>
-      </template>
-    </el-dialog>
+    </FormDialog>
 
     <!-- 鎵归噺鎶樻墸瀵硅瘽妗� -->
-    <el-dialog v-model="batchDiscountVisible" title="鎵归噺璁剧疆鎶樻墸" width="600px">
+    <FormDialog v-model="batchDiscountVisible" title="鎵归噺璁剧疆鎶樻墸" :width="'600px'" @close="batchDiscountVisible = false" @confirm="handleBatchDiscount" @cancel="batchDiscountVisible = false">
       <el-form :model="batchDiscountForm" label-width="120px">
         <el-form-item label="鎶樻墸绫诲瀷">
           <el-select v-model="batchDiscountForm.discountType" placeholder="璇烽�夋嫨鎶樻墸绫诲瀷" style="width: 100%">
@@ -303,14 +299,10 @@
           </div>
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button @click="batchDiscountVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleBatchDiscount">纭畾</el-button>
-      </template>
-    </el-dialog>
+    </FormDialog>
 
     <!-- 浠锋牸鎺у埗瀵硅瘽妗� -->
-    <el-dialog v-model="priceControlVisible" title="浠锋牸鎺у埗璁剧疆" width="700px">
+    <FormDialog v-model="priceControlVisible" title="浠锋牸鎺у埗璁剧疆" :width="'700px'" @close="priceControlVisible = false" @confirm="handlePriceControl" @cancel="priceControlVisible = false">
       <el-form :model="priceControlForm" label-width="120px">
         <el-form-item label="榛樿鏈�浣庝环鏍�">
           <el-input-number v-model="priceControlForm.defaultMinPrice" :min="0" :precision="2" style="width: 200px" />
@@ -322,16 +314,13 @@
           <el-input-number v-model="priceControlForm.changeThreshold" :min="0" :max="100" :precision="1" style="width: 200px" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button @click="priceControlVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handlePriceControl">淇濆瓨璁剧疆</el-button>
-      </template>
-    </el-dialog>
+    </FormDialog>
 
   </div>
 </template>
 
 <script setup>
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import {ref, reactive, computed, onMounted, getCurrentInstance} from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import {
diff --git a/src/views/procurementManagement/arrivalManagement/index.vue b/src/views/procurementManagement/arrivalManagement/index.vue
index 060d2f1..a1b5eed 100644
--- a/src/views/procurementManagement/arrivalManagement/index.vue
+++ b/src/views/procurementManagement/arrivalManagement/index.vue
@@ -51,7 +51,7 @@
       />
     </el-card>
 
-    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板鍒拌揣' : '缂栬緫鍒拌揣'" width="600px">
+    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板鍒拌揣' : '缂栬緫鍒拌揣'" :width="'600px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <el-form :model="formData" label-width="120px">
         <el-form-item label="鍒拌揣鍗曞彿">
           <el-input v-model="formData.arrivalNo" placeholder="鍒拌揣鍗曞彿" />
@@ -69,15 +69,12 @@
           <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleSubmit">纭畾</el-button>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { ref, reactive,onMounted } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import {listPage,add,update,del} from "@/api/procurementManagement/arrivalManagement.js"
diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
index f29b78a..2288183 100644
--- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue
+++ b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
@@ -1,160 +1,202 @@
 <template>
-  <el-dialog :title="modalOptions.title" v-model="visible" width="70%">
-    <el-form
-      ref="formRef"
-      :model="form"
-      :rules="rules"
-      label-width="120px"
-      label-position="top"
-    >
-      <el-row :gutter="30">
-        <el-col :span="12">
-          <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo">
-            <el-input v-model="form.purchaseLedgerNo" disabled />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-            <el-input
-              v-model="form.salesContractNo"
-              placeholder="鑷姩濉厖"
-              clearable
-              disabled
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
-            <el-input
-              v-model="form.supplierName"
-              placeholder="鑷姩濉厖"
-              clearable
-              disabled
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-            <el-input
-              v-model="form.projectName"
-              placeholder="鑷姩濉厖"
-              clearable
-              disabled
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
-            <el-input
-              v-model="form.invoiceNumber"
-              placeholder="璇疯緭鍏�"
-              clearable
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
-            <el-input-number :step="0.01" :min="0" style="width: 100%"
-              v-model="form.invoiceAmount"
-              placeholder="鑷姩濉厖"
-              clearable
-              :disabled="true"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="褰曞叆浜猴細" prop="issUer">
-            <el-input
-              v-model="form.issUer"
-              placeholder="璇疯緭鍏�"
-              clearable
-              disabled
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="entryDate">
-            <el-date-picker
-              style="width: 100%"
-              v-model="form.entryDate"
-              type="date"
-              value-format="YYYY-MM-DD"
-              format="YYYY-MM-DD"
-              clearable
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="涓婁紶闄勪欢">
-            <FileUpload
-              :showTip="false"
-              accept="*"
-              :autoUpload="true"
-              :action="action"
-              :headers="{
+	<el-dialog :title="modalOptions.title" v-model="visible" width="70%" draggable>
+		<el-form
+			ref="formRef"
+			:model="form"
+			:rules="rules"
+			label-width="120px"
+			label-position="top"
+		>
+			<el-row :gutter="30">
+				<el-col :span="12">
+					<el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseLedgerNo">
+						<el-input v-model="form.purchaseLedgerNo" disabled placeholder="澶氬悎鍚屾壒閲忓鐞嗭紙鍏蜂綋鍚堝悓鍙疯浜у搧鍒楄〃锛�" />
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
+						<el-input
+							v-model="form.salesContractNo"
+							placeholder="鑷姩濉厖"
+							clearable
+							disabled
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
+						<el-input
+							v-model="form.supplierName"
+							placeholder="鑷姩濉厖"
+							clearable
+							disabled
+						/>
+					</el-form-item>
+				</el-col>
+<!--				<el-col :span="12">-->
+<!--					<el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">-->
+<!--						<el-input-->
+<!--							v-model="form.projectName"-->
+<!--							placeholder="鑷姩濉厖"-->
+<!--							clearable-->
+<!--							disabled-->
+<!--						/>-->
+<!--					</el-form-item>-->
+<!--				</el-col>-->
+				<el-col :span="12">
+					<el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
+						<el-input
+							v-model="form.invoiceNumber"
+							placeholder="璇疯緭鍏�"
+							clearable
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
+						<el-input-number :step="0.01" :min="0" style="width: 100%"
+														 v-model="form.invoiceAmount"
+														 placeholder="璇疯緭鍏ュ彂绁ㄩ噾棰�"
+														 clearable
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="褰曞叆浜猴細" prop="issUer">
+						<el-input
+							v-model="form.issUer"
+							placeholder="璇疯緭鍏�"
+							clearable
+							disabled
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="寮�绁ㄦ棩鏈燂細" prop="entryDate">
+						<el-date-picker
+							style="width: 100%"
+							v-model="form.entryDate"
+							type="date"
+							value-format="YYYY-MM-DD"
+							format="YYYY-MM-DD"
+							clearable
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="褰曞叆鏃ユ湡锛�" prop="enterDate">
+						<el-date-picker
+							style="width: 100%"
+							v-model="form.enterDate"
+							type="date"
+							value-format="YYYY-MM-DD"
+							format="YYYY-MM-DD"
+							clearable
+						/>
+					</el-form-item>
+				</el-col>
+				<el-col :span="12">
+					<el-form-item label="涓婁紶闄勪欢">
+						<FileUpload
+							:showTip="false"
+							accept="*"
+							:autoUpload="true"
+							:action="action"
+							:headers="{
                 Authorization: 'Bearer ' + getToken(),
               }"
-              :limit="10"
-              @success="uploadSuccess"
-              @remove="removeFile"
-            />
-          </el-form-item>
-        </el-col>
-        <el-col :span="12">
-          <el-form-item label="褰曞叆鏃ユ湡锛�" prop="enterDate">
-            <el-date-picker
-              style="width: 100%"
-              v-model="form.enterDate"
-              type="date"
-              value-format="YYYY-MM-DD"
-              format="YYYY-MM-DD"
-              clearable
-            />
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-form-item label="浜у搧淇℃伅锛�"> </el-form-item>
-      <PIMTable
-        rowKey="id"
-        :column="columns"
-        :tableData="form.productData"
-				:summaryMethod="summarizeChildrenTable"
-				:isShowSummary="true"
-        height="auto"
-      >
-        <template #ticketsNumRef="{ row }">
-          <el-input-number
-            v-model="row.ticketsNum"
-            placeholder="璇疯緭鍏�"
-            :min="0"
-            :step="0.1"
-						:precision="2"
-            clearable
-            style="width: 100%"
-            @change="invoiceNumBlur(row)"
-          />
-        </template>
-        <template #ticketsAmountRef="{ row }">
-          <el-input-number
-            v-model="row.ticketsAmount"
-            placeholder="璇疯緭鍏�"
-            :min="0"
-						:precision="2"
-            :step="0.1"
-            clearable
-            style="width: 100%"
-            @change="invoiceAmountBlur(row)"
-          />
-        </template>
-      </PIMTable>
-    </el-form>
-    <template #footer>
+							:limit="10"
+							@success="uploadSuccess"
+							@remove="removeFile"
+						/>
+					</el-form-item>
+				</el-col>
+			
+			</el-row>
+			<el-form-item label="浜у搧淇℃伅锛�"> </el-form-item>
+			<el-table
+				:data="form.productData"
+				border
+				show-summary
+				:summary-method="summarizeChildrenTable"
+			>
+				<el-table-column align="center" label="搴忓彿" type="index" width="60" />
+				<el-table-column label="鎵�灞炲悎鍚�" prop="purchaseLedgerNo" width="200">
+					<template #default="{ row }">
+						<el-tag type="primary">{{ row.purchaseLedgerNo }}</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column label="浜у搧澶х被" prop="productCategory" />
+				<el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="150" />
+				<el-table-column label="鍗曚綅" prop="unit" width="70" />
+				<el-table-column label="鏁伴噺" prop="quantity" width="70" />
+				<el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
+				<el-table-column
+					label="鍚◣鍗曚环(鍏�)"
+					prop="taxInclusiveUnitPrice"
+					:formatter="formattedNumber"
+				/>
+				<el-table-column
+					label="鍚◣鎬讳环(鍏�)"
+					prop="taxInclusiveTotalPrice"
+					:formatter="formattedNumber"
+				/>
+				<el-table-column
+					label="涓嶅惈绋庢�讳环(鍏�)"
+					prop="taxExclusiveTotalPrice"
+					:formatter="formattedNumber"
+				/>
+				<el-table-column label="鏈寮�绁ㄦ暟" prop="ticketsNum" width="180">
+					<template #default="scope">
+						<el-input-number :step="0.1" :min="0" style="width: 100%"
+														 :precision="2"
+														 v-model="scope.row.ticketsNum"
+														 @change="invoiceNumBlur(scope.row)"
+						/>
+					</template>
+				</el-table-column>
+				<el-table-column
+					label="鏈寮�绁ㄩ噾棰�(鍏�)"
+					prop="ticketsAmount"
+					width="180"
+				>
+					<template #default="scope">
+						<el-input-number :step="0.01" :min="0" style="width: 100%"
+														 :precision="2"
+														 v-model="scope.row.ticketsAmount"
+														 @change="invoiceAmountBlur(scope.row)"
+						/>
+					</template>
+				</el-table-column>
+				<el-table-column
+					label="鏈潵绁ㄦ暟"
+					prop="futureTickets"
+					:formatter="formattedNumber"
+				/>
+				<el-table-column
+					label="鏈鏉ョエ閲戦(鍏�)"
+					prop="ticketsAmount"
+					:formatter="formattedNumber"
+				/>
+				<el-table-column
+					label="鏈潵绁ㄦ暟"
+					prop="futureTickets"
+					:formatter="formattedNumber"
+				/>
+				<el-table-column
+					label="鏈潵绁ㄩ噾棰�(鍏�)"
+					prop="futureTicketsAmount"
+					:formatter="formattedNumber"
+				/>
+			</el-table>
+		</el-form>
+		<template #footer>
 			<el-button type="primary" :loading="modalLoading" @click="submitForm">
-				{{ modalOptions.confirmText }}
+				纭
 			</el-button>
-      <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
-    </template>
-  </el-dialog>
+			<el-button @click="closeModal">鍙栨秷</el-button>
+		</template>
+	</el-dialog>
 </template>
 
 <script setup>
@@ -164,9 +206,9 @@
 import useFormData from "@/hooks/useFormData";
 import FileUpload from "@/components/Upload/FileUpload.vue";
 import {
-  getPurchaseNoById,
-  getInfo,
-  addOrUpdateRegistration,
+	getPurchaseNoById,
+	getInfo,
+	addOrUpdateRegistration,
 } from "@/api/procurementManagement/invoiceEntry.js";
 import { getPurchaseById } from "@/api/procurementManagement/procurementLedger.js";
 import { getToken } from "@/utils/auth";
@@ -174,7 +216,7 @@
 import dayjs from "dayjs";
 
 defineOptions({
-  name: "鏉ョエ鐧昏妯℃�佹",
+	name: "鏉ョエ鐧昏妯℃�佹",
 });
 
 const userStore = useUserStore();
@@ -182,155 +224,237 @@
 const formRef = ref();
 const { proxy } = getCurrentInstance();
 const { form } = useFormData({
-  purchaseLedgerNo: undefined, // 閲囪喘鍚堝悓鍙�
-  salesContractNo: undefined, // 閿�鍞悎鍚屽彿
-  supplierName: undefined, // 渚涘簲鍟嗗悕绉�
-  projectName: undefined, // 椤圭洰鍚嶇О
-  invoiceNumber: undefined, // 鍙戠エ鍙�
-  invoiceAmount: undefined, // 鍙戠エ閲戦(鍏�)
-  issUerId: userStore.id, // 褰曞叆浜�
-  issUer: userStore.nickName, // 褰曞叆浜�
-  entryDate: undefined, // 寮�绁ㄦ棩鏈�
-  salesContractNoId: undefined, // 寮�绁ㄦ棩鏈�
-  enterDate: dayjs().format("YYYY-MM-DD"),
-  productData: [], // 琛ㄦ牸
-  tempFileIds: [], // 鏂囦欢
+	purchaseLedgerNo: undefined, // 閲囪喘鍚堝悓鍙�
+	salesContractNo: undefined, // 閿�鍞悎鍚屽彿
+	supplierName: undefined, // 渚涘簲鍟嗗悕绉�
+	projectName: undefined, // 椤圭洰鍚嶇О
+	invoiceNumber: undefined, // 鍙戠エ鍙�
+	invoiceAmount: undefined, // 鍙戠エ閲戦(鍏�)
+	issUerId: userStore.id, // 褰曞叆浜�
+	issUer: userStore.nickName, // 褰曞叆浜�
+	entryDate: undefined, // 寮�绁ㄦ棩鏈�
+	salesContractNoId: undefined, // 寮�绁ㄦ棩鏈�
+	enterDate: dayjs().format("YYYY-MM-DD"),
+	productData: [], // 琛ㄦ牸
+	tempFileIds: [], // 鏂囦欢
 });
 
+const selectedContracts = ref([]); // 瀛樺偍閫変腑鐨勫悎鍚屾暟鎹�
+
 const rules = ref({
-  invoiceNumber: [
-    { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" },
-    { type: "string" },
-  ],
-  invoiceAmount: [
-    { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" },
-  ],
-  entryDate: [{ required: true, message: "璇烽�夋嫨寮�绁ㄦ棩鏈�", trigger: "change" }],
-  enterDate: [{ required: true, message: "璇烽�夋嫨褰曞叆鏃ユ湡", trigger: "change" }],
+	invoiceNumber: [
+		{ required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" },
+		{ type: "string" },
+	],
+	invoiceAmount: [
+		{ required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" },
+	],
+	entryDate: [{ required: true, message: "璇烽�夋嫨寮�绁ㄦ棩鏈�", trigger: "change" }],
+	enterDate: [{ required: true, message: "璇烽�夋嫨褰曞叆鏃ユ湡", trigger: "change" }],
 });
 
 const {
-  id,
-  visible,
-  loading: modalLoading,
-  openModal,
-  modalOptions,
-  handleConfirm,
-  closeModal,
+	id,
+	visible,
+	loading: modalLoading,
+	openModal,
+	modalOptions,
+	handleConfirm,
+	closeModal,
 } = useModal({
-  title: "鏉ョエ鐧昏",
+	title: "鏉ョエ鐧昏",
 });
 
 const emit = defineEmits(['refreshList']);
 
 const columns = [
-  {
-    label: "浜у搧澶х被",
-    prop: "productCategory",
+	{
+		label: "浜у搧澶х被",
+		prop: "productCategory",
 		width: 120,
-  },
-  {
-    label: "瑙勬牸鍨嬪彿",
-    prop: "specificationModel",
+	},
+	{
+		label: "瑙勬牸鍨嬪彿",
+		prop: "specificationModel",
 		width: 120,
-  },
-  {
-    label: "鍗曚綅",
-    prop: "unit",
-    width: 80,
-  },
-  {
-    label: "鏁伴噺",
-    prop: "quantity",
-    width: 80,
-  },
-  {
-    label: "绋庣巼(%)",
-    prop: "taxRate",
-    width: 80,
-  },
-  {
-    label: "褰曞叆鏃ユ湡",
-    prop: "registerDate",
-    width: 120,
-  },
-  {
-    label: "鍚◣鍗曚环(鍏�)",
-    prop: "taxInclusiveUnitPrice",
-    width: 150,
-    formatData: (val) => {
-      return val ? parseFloat(val).toFixed(2) : 0;
-    },
-  },
-  {
-    label: "鍚◣鎬讳环(鍏�)",
-    prop: "taxInclusiveTotalPrice",
-    width: 150,
-    formatData: (val) => {
-      return parseFloat(val).toFixed(2) ?? 0;
-    },
-  },
-  {
-    label: "涓嶅惈绋庢�讳环(鍏�)",
-    prop: "taxExclusiveTotalPrice",
-    width: 150,
-    formatData: (val) => {
-      return parseFloat(val).toFixed(2) ?? 0;
-    },
-  },
-  {
-    label: "鏈鏉ョエ鏁�",
-    prop: "ticketsNum",
-    dataType: "slot",
-    slot: "ticketsNumRef",
-    width: 180,
-    align: "center",
-  },
-  {
-    label: "鏈鏉ョエ閲戦(鍏�)",
-    prop: "ticketsAmount",
-    dataType: "slot",
-    slot: "ticketsAmountRef",
-    width: 180,
-    align: "center",
-  },
-  {
-    label: "鏈潵绁ㄦ暟",
-    prop: "futureTickets",
+	},
+	{
+		label: "鍗曚綅",
+		prop: "unit",
+		width: 80,
+	},
+	{
+		label: "鏁伴噺",
+		prop: "quantity",
+		width: 80,
+	},
+	{
+		label: "绋庣巼(%)",
+		prop: "taxRate",
+		width: 80,
+	},
+	{
+		label: "褰曞叆鏃ユ湡",
+		prop: "registerDate",
+		width: 120,
+	},
+	{
+		label: "鍚◣鍗曚环(鍏�)",
+		prop: "taxInclusiveUnitPrice",
+		width: 150,
+		formatData: (val) => {
+			return val ? parseFloat(val).toFixed(2) : 0;
+		},
+	},
+	{
+		label: "鍚◣鎬讳环(鍏�)",
+		prop: "taxInclusiveTotalPrice",
+		width: 150,
+		formatData: (val) => {
+			return parseFloat(val).toFixed(2) ?? 0;
+		},
+	},
+	{
+		label: "涓嶅惈绋庢�讳环(鍏�)",
+		prop: "taxExclusiveTotalPrice",
+		width: 150,
+		formatData: (val) => {
+			return parseFloat(val).toFixed(2) ?? 0;
+		},
+	},
+	{
+		label: "鏈鏉ョエ鏁�",
+		prop: "ticketsNum",
+		dataType: "slot",
+		slot: "ticketsNumRef",
+		width: 180,
+		align: "center",
+	},
+	{
+		label: "鏈鏉ョエ閲戦(鍏�)",
+		prop: "ticketsAmount",
+		dataType: "slot",
+		slot: "ticketsAmountRef",
+		width: 180,
+		align: "center",
+	},
+	{
+		label: "鏈潵绁ㄦ暟",
+		prop: "futureTickets",
 		width: 100,
-  },
-  {
-    label: "鏈潵绁ㄩ噾棰�(鍏�)",
-    prop: "futureTicketsAmount",
+	},
+	{
+		label: "鏈潵绁ㄩ噾棰�(鍏�)",
+		prop: "futureTicketsAmount",
 		width: 200,
-  },
+	},
 ];
-
-const getTableData = async (type, id) => {
-  if (type == "add") {
-    const { data } = await getPurchaseNoById({ id });
-    form.purchaseLedgerNo = data.purchaseContractNumber;
-    form.invoiceAmount = data.invoiceAmount;
-    form.invoiceNumber = data.invoiceNumber;
-    form.entryDate = data.entryDate;
-    form.salesContractNoId = data.salesContractNoId;
-
-    const { data: infoData } = await getInfo({ id });
-    form.salesContractNo = infoData.salesContractNo;
-    form.projectName = infoData.projectName;
-    form.supplierName = infoData.supplierName;
-    form.productData = infoData.productData;
-  } else if (type == "edit") {
-    const data = await getPurchaseById({ id, type: 2 });
-    form.purchaseLedgerNo = data.purchaseContractNumber;
-    form.invoiceAmount = data.invoiceAmount;
-    form.invoiceNumber = data.invoiceNumber;
-    form.salesContractNo = data.salesContractNo;
-    form.projectName = data.projectName;
-    form.supplierName = data.supplierName;
-    form.entryDate = data.entryDate;
-    form.productData = data.productData;
-  }
+const formattedNumber = (row, column, cellValue) => {
+	if (cellValue == 0) {
+		return parseFloat(cellValue).toFixed(2);
+	}
+	if (cellValue) {
+		return parseFloat(cellValue).toFixed(2);
+	} else {
+		return cellValue;
+	}
+};
+const getTableData = async (type, selectedRows) => {
+	if (type == "add") {
+		// 妫�鏌ユ墍鏈夐�夋嫨鐨勫悎鍚屾槸鍚﹀叿鏈夌浉鍚岀殑渚涘簲鍟嗗悕绉�
+		const firstRow = selectedRows[0];
+		const isSameSupplier = selectedRows.every(row =>
+			row.supplierName === firstRow.supplierName
+		);
+		
+		if (!isSameSupplier) {
+			proxy.$modal.msgError("璇烽�夋嫨鐩稿悓渚涘簲鍟嗗悕绉扮殑鍚堝悓");
+			return;
+		}
+		
+		// 鍏佽涓嶅悓鐨勯噰璐悎鍚屽彿鎵归噺澶勭悊锛屾棤闇�妫�鏌ラ噸澶�
+		
+		// 娓呯┖琛ㄥ崟鏁版嵁
+		Object.keys(form).forEach(key => {
+			if (key !== 'productData') {
+				form[key] = undefined;
+			}
+		});
+		form.productData = [];
+		
+		// 鍔犺浇鎵�鏈夐�変腑鍚堝悓鐨勪骇鍝佹暟鎹�
+		const promises = selectedRows.map(row =>
+			getInfo({ id: row.id })
+		);
+		
+		Promise.all(promises).then(results => {
+			// 鍚堝苟鎵�鏈夊悎鍚岀殑浜у搧鏁版嵁锛屽苟涓烘瘡涓骇鍝佹坊鍔犲搴旂殑鍚堝悓淇℃伅
+			const allProductData = [];
+			results.forEach((result, index) => {
+				const contract = selectedRows[index];
+				const contractId = contract.id;
+				if (result.data && result.data.productData) {
+					result.data.productData.forEach(item => {
+						allProductData.push({
+							...item,
+							id: contractId, // 鏄庣‘璁剧疆鍚堝悓ID
+							purchaseLedgerNo: contract.purchaseContractNumber, // 娣诲姞閲囪喘鍚堝悓鍙�
+							supplierName: contract.supplierName, // 娣诲姞渚涘簲鍟嗗悕绉�
+							projectName: contract.projectName // 娣诲姞椤圭洰鍚嶇О
+						});
+					});
+				}
+			});
+			
+			// 璁剧疆琛ㄥ崟鏁版嵁锛堜娇鐢ㄧ涓�涓悎鍚岀殑鍩烘湰淇℃伅锛岄噰璐悎鍚屽彿鐣欑┖锛�
+			form.purchaseLedgerNo = ""; // 閲囪喘鍚堝悓鍙风暀绌猴紝鍥犱负浼氬湪浜у搧琛ㄦ牸涓垎鍒樉绀�
+			form.invoiceNumber = "";
+			form.entryDate = dayjs().format("YYYY-MM-DD");
+			form.enterDate = dayjs().format("YYYY-MM-DD");
+			form.salesContractNo = results[0].data.salesContractNo;
+			form.projectName = results[0].data.projectName;
+			form.supplierName = results[0].data.supplierName;
+			// 淇濈暀褰曞叆浜轰俊鎭�
+			form.issUerId = userStore.id;
+			form.issUer = userStore.nickName;
+			
+			// 璁剧疆浜у搧鏁版嵁锛屽苟鍒濆鍖栧紑绁ㄦ暟閲忓拰閲戦
+			allProductData.forEach(item => {
+				// 鏈寮�绁ㄦ暟榛樿涓烘�绘暟閲�
+				item.ticketsNum = Number(item.quantity || 0);
+				// 鏈寮�绁ㄩ噾棰濋粯璁や负鍚◣鎬讳环
+				item.ticketsAmount = Number(item.taxInclusiveTotalPrice || 0);
+				// 淇濆瓨鍘熷鏈潵绁ㄦ暟鍜岄噾棰濓紙鐢ㄤ簬璁$畻锛�
+				item.tempFutureTickets = Number(item.quantity || 0);
+				item.tempFutureTicketsAmount = Number(item.taxInclusiveTotalPrice || 0);
+				// 鏈潵绁ㄦ暟鍜岄噾棰濆垵濮嬩负0锛堝洜涓哄叏閮ㄥ紑绁級
+				item.futureTickets = 0;
+				item.futureTicketsAmount = 0;
+			});
+			
+			form.productData = allProductData;
+			
+			// 璁$畻鍙戠エ閲戦锛氭墍鏈変骇鍝佺殑鍚◣鎬讳环涔嬪拰
+			const totalAmount = allProductData.reduce((sum, item) => {
+				return sum + (Number(item.taxInclusiveTotalPrice) || 0);
+			}, 0);
+			form.invoiceAmount = totalAmount.toFixed(2);
+			
+			// 瀛樺偍閫変腑鐨勫悎鍚屾暟鎹�
+			selectedContracts.value = selectedRows;
+		});
+	} else if (type == "edit") {
+		const id = Array.isArray(selectedRows) ? selectedRows[0].id : selectedRows;
+		const data = await getPurchaseById({ id, type: 2 });
+		form.purchaseLedgerNo = data.purchaseContractNumber;
+		form.invoiceAmount = data.invoiceAmount;
+		form.invoiceNumber = data.invoiceNumber;
+		form.salesContractNo = data.salesContractNo;
+		form.projectName = data.projectName;
+		form.supplierName = data.supplierName;
+		form.entryDate = data.entryDate;
+		form.productData = data.productData;
+	}
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeChildrenTable = (param) => {
@@ -347,109 +471,186 @@
 };
 //鏈鏉ョエ鏁板け鐒︽搷浣�
 const invoiceNumBlur = (row) => {
-  if (!row.ticketsNum || row.ticketsNum === "") {
-    row.ticketsNum = 0;
-  }
-  if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
-    proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
-    row.ticketsNum = 0;
-    return;
-  }
-  // 璁$畻鏈鏉ョエ閲戦
-  row.ticketsAmount = (row.ticketsNum * row.taxInclusiveUnitPrice).toFixed(2)
-  // 璁$畻鏈潵绁ㄦ暟
-  row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2)
-  // 璁$畻鏈潵绁ㄩ噾棰�
-  row.futureTicketsAmount = (row.tempFutureTicketsAmount - row.ticketsAmount).toFixed(2)
-  calculateinvoiceAmount();
+	if (!row.ticketsNum || row.ticketsNum === "") {
+		row.ticketsNum = 0;
+	}
+	if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
+		proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
+		row.ticketsNum = 0;
+		return;
+	}
+	// 璁$畻鏈鏉ョエ閲戦
+	row.ticketsAmount = (row.ticketsNum * row.taxInclusiveUnitPrice).toFixed(2)
+	// 璁$畻鏈潵绁ㄦ暟
+	row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2)
+	// 璁$畻鏈潵绁ㄩ噾棰�
+	row.futureTicketsAmount = (row.tempFutureTicketsAmount - row.ticketsAmount).toFixed(2)
+	calculateinvoiceAmount();
 };
 
 // 鏈鏉ョエ閲戦澶辩劍鎿嶄綔
 const invoiceAmountBlur = (row) => {
-  if (!row.ticketsAmount) {
-    row.ticketsAmount = 0;
-  }
-  // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰�
-  if (row.ticketsAmount > row.tempFutureTicketsAmount) {
-    proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�");
-    row.ticketsAmount = 0;
-  }
-  // 璁$畻鏈鏉ョエ鏁�
-  row.ticketsNum = Number(
-    (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2)
-  );
-  // 璁$畻鏈潵绁ㄦ暟
-  row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2)
-  // 璁$畻鏈潵绁ㄩ噾棰�
-  row.futureTicketsAmount = (row.tempFutureTicketsAmount - row.ticketsAmount).toFixed(2)
-  calculateinvoiceAmount();
+	if (!row.ticketsAmount) {
+		row.ticketsAmount = 0;
+	}
+	// 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰�
+	if (row.ticketsAmount > row.tempFutureTicketsAmount) {
+		proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�");
+		row.ticketsAmount = 0;
+	}
+	// 璁$畻鏈鏉ョエ鏁�
+	row.ticketsNum = Number(
+		(row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2)
+	);
+	// 璁$畻鏈潵绁ㄦ暟
+	row.futureTickets = (row.tempFutureTickets - row.ticketsNum).toFixed(2)
+	// 璁$畻鏈潵绁ㄩ噾棰�
+	row.futureTicketsAmount = (row.tempFutureTicketsAmount - row.ticketsAmount).toFixed(2)
+	calculateinvoiceAmount();
 };
 
 const calculateinvoiceAmount = () => {
-  let invoiceAmountTotal = 0;
-  form.productData.forEach((item) => {
-    if (item.ticketsAmount) {
-      invoiceAmountTotal += Number(item.ticketsAmount);
-    }
-  });
-  form.invoiceAmount = invoiceAmountTotal.toFixed(2);
+	let invoiceAmountTotal = 0;
+	form.productData.forEach((item) => {
+		if (item.ticketsAmount) {
+			invoiceAmountTotal += Number(item.ticketsAmount);
+		}
+	});
+	form.invoiceAmount = invoiceAmountTotal.toFixed(2);
 };
 
-const open = (type, eid) => {
-  openModal();
-  getTableData(type, eid);
-  id.value = eid;
+const open = async (type, selectedRows) => {
+	visible.value = true;
+	
+	// 濡傛灉鏄壒閲忔搷浣滐紝璁剧疆鏍囬
+	if (Array.isArray(selectedRows) && selectedRows.length > 1) {
+		modalOptions.title = `鎵归噺鏂板 (${selectedRows.length}鏉�)`;
+	} else {
+		modalOptions.title = type === "add" ? "鏂板" : "缂栬緫";
+	}
+	
+	// 濡傛灉鏄崟涓搷浣滐紝鑾峰彇id
+	if (!Array.isArray(selectedRows) || selectedRows.length === 1) {
+		const idValue = Array.isArray(selectedRows) ? selectedRows[0].id : selectedRows;
+		id.value = idValue;
+	}
+	
+	await getTableData(type, selectedRows);
 };
 
 const uploadSuccess = (response) => {
-  form.tempFileIds.push(response.data.tempId);
-  console.log(form);
+	form.tempFileIds.push(response.data.tempId);
+	console.log(form);
 };
 
 const removeFile = (file) => {
-  const { tempId } = file.response.data;
-  form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId);
+	const { tempId } = file.response.data;
+	form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId);
 };
 
 const closeAndRefresh = () => {
-  closeModal();
-  emit('refreshList');
+	closeModal();
+	emit('refreshList');
 };
 
 const submitForm = () => {
-  formRef.value.validate(async (valid, fields) => {
-    if (valid) {
-      // modalLoading.value = true;
-      const { code } = await addOrUpdateRegistration({
-        purchaseLedgerId: id.value,
-        purchaseContractNumber: form.purchaseLedgerNo,
-        invoiceNumber: form.invoiceNumber,
-        invoiceAmount: form.invoiceAmount,
-        salesContractNo: form.salesContractNo,
-        projectName: form.projectName,
-        productData: form.productData,
-        issueDate: form.entryDate,
-        issUerId: form.issUerId, // 褰曞叆浜篿d
-        issUer: form.issUer, // 褰曞叆浜�
-        salesContractNoId: form.salesContractNoId,
-        supplierName: form.supplierName,
-        tempFileIds: form.tempFileIds,
-        enterDate: form.enterDate,
-        type: 4,
-      });
-      modalLoading.value = false;
-      if (code == 200) {
-        closeAndRefresh();
-      }
-    } else {
-      modalLoading.value = false;
-    }
-  });
+	proxy.$refs["formRef"].validate((valid) => {
+		if (valid) {
+			// 濡傛灉鏄壒閲忔搷浣滐紝灏嗘墍鏈夊悎鍚岀殑鏁版嵁鏀惧湪涓�涓暟缁勯噷锛屽彧璋冪敤涓�娆℃帴鍙�
+			if (selectedContracts.value.length > 1) {
+				// 鍒涘缓鍖呭惈鎵�鏈夊悎鍚屾暟鎹殑鏁扮粍
+				const batchData = selectedContracts.value.map(contract => {
+					// 绛涢�夊嚭灞炰簬褰撳墠鍚堝悓鐨勪骇鍝佹暟鎹�
+					const contractProductData = form.productData.filter(item =>
+						item.id === contract.id
+					);
+					
+					// 涓烘瘡涓噰璐悎鍚屽垱寤虹嫭绔嬬殑瀵硅薄
+					return {
+						// 鍩虹琛ㄥ崟鏁版嵁
+						invoiceNumber: form.invoiceNumber,
+						invoiceAmount: form.invoiceAmount,
+						entryDate: form.entryDate,
+						enterDate: form.enterDate,
+						issUerId: form.issUerId, // 褰曞叆浜篿d
+						issUer: form.issUer, // 褰曞叆浜�
+						tempFileIds: form.tempFileIds,
+						
+						// 鍚堝悓瀹為檯淇℃伅
+						purchaseLedgerId: contract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负purchaseLedgerId
+						purchaseContractNumber: contract.purchaseContractNumber, // 浣跨敤瀹為檯鐨勯噰璐悎鍚屽彿
+						salesContractNo: contract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
+						supplierName: contract.supplierName, // 浣跨敤瀹為檯鐨勪緵搴斿晢鍚嶇О
+						projectName: contract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
+						
+						// 浜у搧鏁版嵁
+						productData: proxy.HaveJson(contractProductData),
+						
+						// 鎵归噺鏍囪瘑
+						isBatch: true,
+						type: 4
+					};
+				});
+				
+				// 鍙皟鐢ㄤ竴娆℃帴鍙o紝浼犻�掑寘鍚墍鏈夊悎鍚屾暟鎹殑鏁扮粍
+				modalLoading.value = true;
+				addOrUpdateRegistration(batchData).then((res) => {
+					modalLoading.value = false;
+					if (res.code === 200) {
+						proxy.$modal.msgSuccess("鎵归噺鐧昏鎴愬姛");
+						closeAndRefresh();
+					}
+				}).catch(() => {
+					modalLoading.value = false;
+					proxy.$modal.msgError("鎵归噺鐧昏澶辫触");
+				});
+			} else {
+					// 鍗曚釜鍚堝悓鎻愪氦閫昏緫 - 浠ユ暟缁勬牸寮忎紶閫�
+					const singleContract = selectedContracts.value[0];
+					const singleFormArray = [{
+						// 鍩虹琛ㄥ崟鏁版嵁
+						invoiceNumber: form.invoiceNumber,
+						invoiceAmount: form.invoiceAmount,
+						entryDate: form.entryDate,
+						enterDate: form.enterDate,
+						issUerId: form.issUerId, // 褰曞叆浜篿d
+						issUer: form.issUer, // 褰曞叆浜�
+						tempFileIds: form.tempFileIds,
+						
+						// 鍚堝悓瀹為檯淇℃伅
+						purchaseLedgerId: singleContract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负purchaseLedgerId
+						purchaseContractNumber: singleContract.purchaseContractNumber, // 浣跨敤瀹為檯鐨勯噰璐悎鍚屽彿
+						salesContractNo: singleContract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
+						supplierName: singleContract.supplierName, // 浣跨敤瀹為檯鐨勪緵搴斿晢鍚嶇О
+						projectName: singleContract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
+						
+						// 浜у搧鏁版嵁
+						productData: proxy.HaveJson(form.productData),
+						
+						// 鎵归噺鏍囪瘑
+						isBatch: false,
+						type: 4
+					}];
+					
+					modalLoading.value = true;
+					addOrUpdateRegistration(singleFormArray).then((res) => {
+						modalLoading.value = false;
+						if (res.code === 200) {
+							proxy.$modal.msgSuccess("鐧昏鎴愬姛");
+							closeAndRefresh();
+						}
+					}).catch(() => {
+						modalLoading.value = false;
+						proxy.$modal.msgError("鐧昏澶辫触");
+					});
+				}
+		}
+	});
 };
 
 defineExpose({
-  open,
-  closeAndRefresh,
+	open,
+	closeAndRefresh,
 });
 </script>
 
diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue
index 87e08e9..3719ffe 100644
--- a/src/views/procurementManagement/invoiceEntry/index.vue
+++ b/src/views/procurementManagement/invoiceEntry/index.vue
@@ -28,13 +28,6 @@
               clearable
           />
         </el-form-item>
-        <el-form-item label="椤圭洰鍚嶇О">
-          <el-input
-              v-model="filters.projectName"
-              placeholder="璇疯緭鍏ラ」鐩悕绉�"
-              clearable
-          />
-        </el-form-item>
         <el-form-item>
           <el-button type="primary" @click="getTableData"> 鎼滅储 </el-button>
           <el-button @click="resetFilters"> 閲嶇疆 </el-button>
@@ -47,7 +40,7 @@
         <div>
           <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
           <el-button type="primary" @click="handleAdd('add')">
-            鏂板鐧昏
+            鏉ョエ鐧昏
           </el-button>
 <!--          <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
         </div>
@@ -143,11 +136,6 @@
       width:300
     },
     {
-      label: "椤圭洰鍚嶇О",
-      prop: "projectName",
-      width:400
-    },
-    {
       label: "褰曞叆浜�",
       prop: "recorderName",
     },
@@ -198,11 +186,11 @@
 };
 
 const handleAdd = (type) => {
-  if (selectedRows.value.length !== 1) {
-    proxy.$modal.msgWarning("璇峰厛閫変腑涓�鏉℃暟鎹�");
-    return;
-  }
-  modalRef.value.open(type, selectedRows.value[0].id);
+	if (selectedRows.value.length < 1) {
+		proxy.$modal.msgWarning("璇疯嚦灏戦�変腑涓�鏉℃暟鎹�");
+		return;
+	}
+	modalRef.value.open(type, selectedRows.value);
 };
 
 const handleEdit = (type, id) => {
diff --git a/src/views/procurementManagement/invoiceEntry/indexOld.vue b/src/views/procurementManagement/invoiceEntry/indexOld.vue
deleted file mode 100644
index 1b4c6b9..0000000
--- a/src/views/procurementManagement/invoiceEntry/indexOld.vue
+++ /dev/null
@@ -1,727 +0,0 @@
-<template>
-  <div class="app-container">
-    <div class="search_form">
-      <div>
-        <span class="search_title">閲囪喘鍚堝悓鍙凤細</span>
-        <el-input
-          v-model="searchForm.purchaseContractNumber"
-          style="width: 240px"
-          placeholder="璇疯緭鍏�"
-          @change="handleQuery"
-          clearable
-          prefix-icon="Search"
-        />
-        <el-button
-          type="primary"
-          @click="handleQuery"
-          style="margin-left: 10px"
-        >
-          鎼滅储
-        </el-button>
-      </div>
-      <div>
-        <el-button type="primary" @click="handleAdd">鏂板鐧昏</el-button>
-        <el-button @click="handleOut">瀵煎嚭</el-button>
-        <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
-      </div>
-    </div>
-    <div class="table_list">
-      <el-table
-        :data="tableData"
-        border
-        v-loading="tableLoading"
-        @selection-change="handleSelectionChange"
-        :expand-row-keys="expandedRowKeys"
-        :row-key="(row) => row.id"
-        show-summary
-        :summary-method="summarizeMainTable"
-        @expand-change="expandChange"
-        height="calc(100vh - 18.5em)"
-      >
-        <el-table-column align="center" type="selection" width="55" />
-        <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="taxRate" />
-              <el-table-column
-                label="鍚◣鍗曚环(鍏�)"
-                prop="taxInclusiveUnitPrice"
-                :formatter="formattedNumber"
-              />
-              <el-table-column
-                label="鍚◣鎬讳环(鍏�)"
-                prop="taxInclusiveTotalPrice"
-                :formatter="formattedNumber"
-              />
-              <el-table-column
-                label="涓嶅惈绋庢�讳环(鍏�)"
-                prop="taxExclusiveTotalPrice"
-                :formatter="formattedNumber"
-              />
-              <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" />
-              <el-table-column
-                label="鏈鏉ョエ閲戦(鍏�)"
-                prop="ticketsAmount"
-                :formatter="formattedNumber"
-              />
-              <el-table-column label="鏈潵绁ㄦ暟" prop="futureTickets" />
-              <el-table-column
-                label="鏈潵绁ㄩ噾棰�(鍏�)"
-                prop="futureTicketsAmount"
-                :formatter="formattedNumber"
-              />
-            </el-table>
-          </template>
-        </el-table-column>
-        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column
-          label="閲囪喘鍚堝悓鍙�"
-          prop="purchaseContractNumber"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="閿�鍞悎鍚屽彿"
-          prop="salesContractNo"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="渚涘簲鍟嗗悕绉�"
-          prop="supplierName"
-          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="receiptPaymentAmount"
-          show-overflow-tooltip
-          :formatter="formattedNumber"
-        />
-        <el-table-column
-          label="寰呭紑绁ㄩ噾棰�(鍏�)"
-          prop="unReceiptPaymentAmount"
-          show-overflow-tooltip
-          :formatter="formattedNumber"
-        />
-        <el-table-column
-          fixed="right"
-          label="鎿嶄綔"
-          min-width="60"
-          align="center"
-        >
-          <template #default="scope">
-            <el-button
-              text
-              type="primary"
-              size="small"
-              @click="openForm('edit', 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>
-    <el-dialog
-      v-model="dialogFormVisible"
-      :title="operationType === 'add' ? '鏂板鏉ョエ鐧昏' : '缂栬緫鏉ョエ鐧昏'"
-      width="80%"
-      @close="closeDia"
-    >
-      <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="purchaseLedgerNo">
-              <el-input v-model="form.purchaseLedgerNo" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input
-                v-model="form.salesContractNo"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
-              <el-input
-                v-model="form.supplierName"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input
-                v-model="form.projectName"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
-              <el-input
-                v-model="form.invoiceNumber"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
-              <el-input
-                type="number"
-                :step="0.01"
-                v-model="form.invoiceAmount"
-                placeholder="鑷姩濉厖"
-                clearable
-                :disabled="true"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="褰曞叆浜猴細" prop="issUer">
-              <el-input
-                v-model="form.issUer"
-                placeholder="璇疯緭鍏�"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="寮�绁ㄦ棩鏈燂細" prop="issueDate">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.issueDate"
-                type="date"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="涓婁紶闄勪欢">
-              <FileUpload :showTip="false" accept="*" :autoUpload="true" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <!-- <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.createTime"
-                type="date"
-                placeholder="璇烽�夋嫨"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row> -->
-        <el-row>
-          <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item>
-        </el-row>
-        <el-table
-          :data="productData"
-          border
-          @selection-change="productSelected"
-          show-summary
-          style="width: 100%"
-          :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" width="70" />
-          <el-table-column label="鏁伴噺" prop="quantity" width="70" />
-          <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
-          <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" width="120" />
-          <el-table-column
-            label="鍚◣鍗曚环(鍏�)"
-            width="200"
-            prop="taxInclusiveUnitPrice"
-            :formatter="formattedNumber"
-          />
-          <el-table-column
-            label="鍚◣鎬讳环(鍏�)"
-            width="200"
-            prop="taxInclusiveTotalPrice"
-            :formatter="formattedNumber"
-          />
-          <el-table-column
-            label="涓嶅惈绋庢�讳环(鍏�)"
-            width="200"
-            prop="taxExclusiveTotalPrice"
-            :formatter="formattedNumber"
-          />
-          <el-table-column label="鏈鏉ョエ鏁�" prop="ticketsNum" width="170">
-            <template #default="scope">
-              <el-input-number
-                v-model="scope.row.ticketsNum"
-                placeholder="璇烽�夋嫨"
-                :min="0"
-								:precision="2"
-                :step="0.1"
-                clearable
-                style="width: 100%"
-                @change="invoiceNumBlur(scope.row)"
-              />
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="鏈鏉ョエ閲戦(鍏�)"
-            prop="ticketsAmount"
-            :min="0"
-            :step="0.1"
-            :formatter="formattedNumber"
-            width="200"
-          >
-            <template #default="scope">
-              <el-input-number
-                v-model="scope.row.ticketsAmount"
-                placeholder="璇烽�夋嫨"
-                :min="0"
-								:precision="2"
-                :step="0.1"
-                clearable
-                style="width: 100%"
-                @change="invoiceAmountBlur(scope.row)"
-              />
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="鏈潵绁ㄦ暟"
-            prop="futureTickets"
-            :formatter="
-              (row) =>
-                row.futureTickets == null || row.futureTickets === ''
-                  ? row.quantity
-                  : row.futureTickets
-            "
-          >
-          </el-table-column>
-          <el-table-column
-            label="鏈潵绁ㄩ噾棰�(鍏�)"
-            prop="futureTicketsAmount"
-            :formatter="
-              (row) =>
-                row.futureTicketsAmount !== undefined &&
-                row.futureTicketsAmount !== null &&
-                row.futureTicketsAmount !== ''
-                  ? row.futureTicketsAmount
-                  : row.taxExclusiveTotalPrice
-            "
-          >
-          </el-table-column>
-        </el-table>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
-</template>
-
-<script setup>
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { onMounted, ref } from "vue";
-import { ElMessageBox } from "element-plus";
-import { userListNoPage } from "@/api/system/user.js";
-import { productList } from "@/api/procurementManagement/procurementLedger.js";
-import useUserStore from "@/store/modules/user";
-import FileUpload from "@/components/Upload/FileUpload.vue";
-
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const productSelectedRows = ref([]);
-const userList = ref([]);
-const purchaseLedgerList = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
-  current: 1,
-  size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-import {
-  addOrUpdateRegistration,
-  delRegistration,
-  gePurchaseListPage,
-  getInfo,
-  getProduct,
-  getPurchaseNoById,
-  getRegistrationById,
-} from "@/api/procurementManagement/invoiceEntry.js";
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
-  searchForm: {
-    purchaseContractNumber: "",
-  },
-  form: {
-    issueDate: "", // 寮�绁ㄦ棩鏈�
-    purchaseLedgerId: "",
-    purchaseLedgerNo: "",
-    issUerId: "", // 寮�绁ㄤ汉id
-    issUer: "", // 寮�绁ㄤ汉濮撳悕
-    invoiceNumber: "", // 鍙戠エ鍙�
-    invoiceAmount: "", // 鍙戠エ閲戦
-    createTime: "", // 褰曞叆鏃ユ湡
-  },
-  rules: {
-    invoiceNumber: [
-      { required: true, message: "璇疯緭鍏ュ彂绁ㄥ彿", trigger: "blur" },
-      { type: "string" },
-    ],
-    invoiceAmount: [
-      { required: true, message: "璇疯緭鍏ュ彂绁ㄩ噾棰�", trigger: "blur" },
-    ],
-  },
-});
-const { searchForm, form, rules } = toRefs(data);
-// 浜у搧琛ㄥ崟寮规鏁版嵁
-const productFormVisible = ref(false);
-const productOperationType = ref("");
-const currentId = ref("");
-
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-const paginationChange = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const getList = () => {
-  tableLoading.value = true;
-  gePurchaseListPage({ ...searchForm.value, ...page })
-    .then((res) => {
-      tableLoading.value = false;
-      tableData.value = res.records;
-      tableData.value.map((item) => {
-        item.children = [];
-      });
-      total.value = res.total;
-      expandedRowKeys.value = [];
-    })
-    .catch(() => {
-      tableLoading.value = false;
-    });
-};
-const formattedNumber = (row, column, cellValue) => {
-  return parseFloat(cellValue).toFixed(2) ?? 0;
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection.filter(
-    (item) => item.purchaseContractNumber !== undefined
-  );
-};
-const productSelected = (selectedRows) => {
-  productSelectedRows.value = selectedRows;
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = (row, expandedRows) => {
-  if (expandedRows.length > 0) {
-    expandedRowKeys.value = [];
-    try {
-      productList({ salesLedgerId: row.id, type: 2 }).then((res) => {
-        const index = tableData.value.findIndex((item) => item.id === row.id);
-        if (index > -1) {
-          tableData.value[index].children = res;
-        }
-        expandedRowKeys.value.push(row.id);
-      });
-    } catch (error) {
-      console.log(error);
-    }
-  } else {
-    expandedRowKeys.value = [];
-  }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(
-    param,
-    ["contractAmount", "receiptPaymentAmount", "unReceiptPaymentAmount"],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    }
-  );
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
-  return proxy.summarizeTable(
-    param,
-    [
-      "taxInclusiveUnitPrice",
-      "taxInclusiveTotalPrice",
-      "taxExclusiveTotalPrice",
-      "ticketsNum",
-      "ticketsAmount",
-      "futureTickets",
-      "futureTicketsAmount",
-    ],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    }
-  );
-};
-
-const handleAdd = () => {
-  if (selectedRows.value.length !== 1) {
-    proxy.$modal.msgWarning("璇峰厛閫変腑涓�鏉℃暟鎹�");
-    return;
-  }
-  openForm("add", selectedRows.value[0]);
-};
-
-// 鎵撳紑寮规
-const openForm = (type, row) => {
-  invoiceNumBlur(row);
-  operationType.value = type;
-  form.value = {};
-  productData.value = [];
-  fileList.value = [];
-  form.value.issUerId = userStore.id;
-  form.value.issUer = userStore.name;
-  form.value.issueDate = getNowFormatDate();
-  userListNoPage().then((res) => {
-    userList.value = res.data;
-  });
-  // 鏂板鏃朵紶鍏ュ綋鍓嶈id骞舵煡璇㈤噰璐悎鍚屽彿
-  if (type === "add" && row && row.id) {
-    form.value.purchaseLedgerId = row.id;
-    getPurchaseNoById({ id: row.id }).then((res) => {
-      let result = res.data;
-      purchaseLedgerList.value = result;
-      form.value.purchaseLedgerNo = result.purchaseContractNumber;
-      form.value.invoiceAmount = result.invoiceAmount;
-      form.value.invoiceNumber = result.invoiceNumber;
-      setInfo(result.id);
-    });
-  } else {
-    getProduct().then((res) => {
-      purchaseLedgerList.value = res;
-    });
-  }
-  if (type === "edit") {
-    currentId.value = row.id;
-    getRegistrationById({ id: row.id }).then((res) => {
-      const { code, data } = res;
-      if (code == 200) {
-        form.value.invoiceAmount = data.invoiceAmount;
-        productData.value = data.productData;
-        if (data.salesLedgerFiles) {
-          fileList.value = data.salesLedgerFiles;
-        } else {
-          fileList.value = [];
-        }
-      }
-    });
-  }
-  dialogFormVisible.value = true;
-};
-// 閫夋嫨閲囪喘鍚堝悓鍙疯祴鍊�
-const setInfo = (value) => {
-  getInfo({ id: value }).then((res) => {
-    let result = res.data;
-    form.value.salesContractNo = result.salesContractNo;
-    form.value.projectName = result.projectName;
-    productData.value = result.productData;
-    form.value.supplierName = result.supplierName;
-  });
-};
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
-  proxy.$refs["formRef"].validate((valid) => {
-    if (valid) {
-      form.value.productData = proxy.HaveJson(productData.value);
-      addOrUpdateRegistration(form.value).then((res) => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        closeDia();
-        getList();
-      });
-    }
-  });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
-  proxy.resetForm("formRef");
-  dialogFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      proxy.download("/purchase/registration/export", {}, "鏉ョエ鐧昏.xlsx");
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-// 鍒犻櫎
-const handleDelete = () => {
-  let ids = [];
-  if (selectedRows.value.length > 0) {
-    ids = selectedRows.value.map((item) => item.id);
-  } else {
-    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-    return;
-  }
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      delRegistration(ids).then((res) => {
-        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        getList();
-      });
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-//鏈鏉ョエ鏁板け鐒︽搷浣�
-const invoiceNumBlur = (row) => {
-  if (!row.ticketsNum || row.ticketsNum === "") {
-    row.ticketsNum = 0;
-  }
-  if (Number(row.ticketsNum) > Number(row.tempFutureTickets)) {
-    proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
-    row.ticketsNum = 0;
-    return;
-  }
-  // 璁$畻鏈鏉ョエ閲戦
-  row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice;
-  // 璁$畻鏈潵绁ㄦ暟
-  row.futureTickets = row.tempFutureTickets - row.ticketsNum;
-  // 璁$畻鏈潵绁ㄩ噾棰�
-  row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount;
-  calculateinvoiceAmount();
-};
-// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔
-const invoiceAmountBlur = (row) => {
-  if (!row.ticketsAmount) {
-    row.ticketsAmount = 0;
-  }
-  // 璁$畻鏄惁瓒呰繃鏉ョエ鎬婚噾棰�
-  if (row.ticketsAmount > row.tempFutureTicketsAmount) {
-    proxy.$modal.msgWarning("鏈鏉ョエ閲戦涓嶅緱澶т簬鏈潵绁ㄩ噾棰�");
-    row.ticketsAmount = 0;
-  }
-  // 璁$畻鏈鏉ョエ鏁�
-  row.ticketsNum = (row.ticketsAmount / row.taxInclusiveUnitPrice).toFixed(2);
-  // 璁$畻鏈潵绁ㄦ暟
-  row.futureTickets = row.tempFutureTickets - row.ticketsNum;
-  // 璁$畻鏈潵绁ㄩ噾棰�
-  row.futureTicketsAmount = row.tempFutureTicketsAmount - row.ticketsAmount;
-  calculateinvoiceAmount();
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡鍑芥暟
-function getNowFormatDate() {
-  let date = new Date(),
-    year = date.getFullYear(), //鑾峰彇瀹屾暣鐨勫勾浠�(4浣�)
-    month = date.getMonth() + 1, //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�)
-    strDate = date.getDate(); // 鑾峰彇褰撳墠鏃�(1-31)
-  if (month < 10) month = `0${month}`; // 濡傛灉鏈堜唤鏄釜浣嶆暟锛屽湪鍓嶉潰琛�0
-  if (strDate < 10) strDate = `0${strDate}`; // 濡傛灉鏃ユ槸涓綅鏁帮紝鍦ㄥ墠闈㈣ˉ0
-  return `${year}-${month}-${strDate}`;
-}
-
-function calculateinvoiceAmount() {
-  console.log("productData", productData.value);
-  var invoiceAmountTotal = 0;
-  productData.value.forEach((item) => {
-    if (item.ticketsAmount) {
-      invoiceAmountTotal += item.ticketsAmount;
-    }
-  });
-  form.value.invoiceAmount = invoiceAmountTotal.toFixed(2);
-}
-
-onMounted(() => {
-  getList();
-});
-</script>
-
-<style scoped lang="scss"></style>
diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
index 2f24fe9..89152bf 100644
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ b/src/views/procurementManagement/paymentEntry/index.vue
@@ -27,10 +27,10 @@
           </el-col>
           <el-col :span="4">
             <el-form-item style="float: right; margin-right: unset">
-              <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
               <el-button type="primary" @click="openForm('add')">
                 鏂板浠樻
               </el-button>
+              <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
 <!--              <el-button type="danger" plain @click="handleDelete">-->
 <!--                鍒犻櫎-->
 <!--              </el-button>-->
@@ -127,145 +127,100 @@
 				</template>
 			</PIMTable>
     </div>
-    <el-dialog
+    <FormDialog
       v-model="dialogFormVisible"
-      :title="operationType === 'add' ? '鏂板浠樻鐧昏' : '缂栬緫浠樻鐧昏'"
-      width="60%"
+      title="鏂板浠樻椤甸潰"
+      :width="'90%'"
       @close="closeDia"
+      @confirm="submitForm"
+      @cancel="closeDia"
     >
-      <el-form
-        :model="form"
-        label-width="140px"
-        label-position="top"
-        :rules="rules"
-        ref="formRef"
+      <el-table
+        v-if="forms.length"
+        :data="forms"
+        border
+        style="width: 100%"
+        size="small"
       >
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
-              <el-input
-                v-model="form.purchaseContractNumber"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input
-                v-model="form.salesContractNo"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
-              <el-input
-                v-model="form.supplierName"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNumber">
-              <el-input
-                v-model="form.invoiceNumber"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceAmount">
-              <el-input
-                v-model="form.invoiceAmount"
-                placeholder="鑷姩濉厖"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鏈浠樻閲戦锛�" prop="currentPaymentAmount">
-              <el-input-number :step="0.01" :min="0" style="width: 100%"
-															 :precision="2"
-                v-model="form.currentPaymentAmount"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="浠樻鏂瑰紡锛�" prop="paymentMethod">
-              <el-select
-                v-model="form.paymentMethod"
-                placeholder="璇烽�夋嫨"
-                clearable
-              >
-                <el-option label="鐢垫眹" value="鐢垫眹" />
-                <el-option label="鎵垮厬" value="鎵垮厬" />
-              </el-select>
-            </el-form-item>
-          </el-col>
-					<el-col :span="12">
-						<el-form-item label="浠樻鏃ユ湡锛�" prop="paymentDate">
-							<el-date-picker
-								style="width: 100%"
-								v-model="form.paymentDate"
-								value-format="YYYY-MM-DD"
-								format="YYYY-MM-DD"
-								type="date"
-								placeholder="璇烽�夋嫨"
-								clearable
-							/>
-						</el-form-item>
-					</el-col>
-        </el-row>
-        <el-row :gutter="30">
-					<el-col :span="12">
-						<el-form-item label="鐧昏浜猴細" prop="registrant">
-							<el-input
-								v-model="form.registrant"
-								placeholder="璇疯緭鍏�"
-								clearable
-								disabled
-							/>
-						</el-form-item>
-					</el-col>
-          <el-col :span="12">
-            <el-form-item label="鐧昏鏃ユ湡锛�" prop="registrationtDate">
-              <el-input
-                v-model="form.registrationtDate"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
+        <el-table-column type="index" label="搴忓彿" width="50" align="center"/>
+        <el-table-column label="閲囪喘鍚堝悓鍙�" prop="purchaseContractNumber" show-overflow-tooltip />
+        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip />
+        <el-table-column label="渚涘簲鍟嗗悕绉�" prop="supplierName" show-overflow-tooltip />
+        <el-table-column
+          label="浜у搧澶х被"
+          prop="productCategory"
+          show-overflow-tooltip
+          width="100"
+        />
+        <el-table-column
+          label="瑙勬牸鍨嬪彿"
+          prop="specificationModel"
+          show-overflow-tooltip
+          width="150"
+        />
+        <el-table-column
+          label="寰呬粯娆鹃噾棰�(鍏�)"
+          prop="pendingTicketsTotal"
+          show-overflow-tooltip
+          width="170"
+        >
+          <template #default="{ row, column }">
+            <el-text type="danger">
+              {{ formattedNumber(row, column, row.pendingTicketsTotal) }}
+            </el-text>
+          </template>
+        </el-table-column>
+        <el-table-column label="鏈浠樻閲戦(鍏�)" width="180">
+          <template #default="{ row }">
+            <el-input-number
+              v-model="row.currentPaymentAmount"
+              :step="0.01"
+              :min="0"
+              :max="Number(row.pendingTicketsTotal || 0)"
+              :precision="2"
+              style="width: 100%"
+              placeholder="璇疯緭鍏�"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="浠樻鏂瑰紡" width="160">
+          <template #default="{ row }">
+            <el-select v-model="row.paymentMethod" placeholder="璇烽�夋嫨" clearable>
+              <el-option label="鐢垫眹" value="鐢垫眹" />
+              <el-option label="鎵垮厬" value="鎵垮厬" />
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="浠樻鏃ユ湡" width="170">
+          <template #default="{ row }">
+            <el-date-picker
+              v-model="row.paymentDate"
+              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD"
+              type="date"
+              placeholder="璇烽�夋嫨"
+              style="width: 100%"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鐧昏浜�" width="140">
+          <template #default="{ row }">
+            <el-input v-model="row.registrant" disabled />
+          </template>
+        </el-table-column>
+        <el-table-column label="鐧昏鏃ユ湡" width="170">
+          <template #default="{ row }">
+            <el-input v-model="row.registrationtDate" />
+          </template>
+        </el-table-column>
+      </el-table>
+      <div v-else class="empty-tip">璇烽�夋嫨闇�瑕佷粯娆剧殑璁板綍</div>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { ref, reactive, toRefs, getCurrentInstance, nextTick, onMounted } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessageBox } from "element-plus";
@@ -296,10 +251,12 @@
   {
     label: "閲囪喘鍚堝悓鍙�",
     prop: "purchaseContractNumber",
+    width:160
   },
   {
     label: "閿�鍞悎鍚屽彿",
     prop: "salesContractNo",
+    width:160
   },
   {
     label: "渚涘簲鍟嗗悕绉�",
@@ -309,6 +266,7 @@
 	{
 		label: "浠樻鐘舵��",
 		prop: "statusName",
+    width:110,
 		dataType: "tag",
 		formatType: (params) => {
 			if (params == '鏈畬鎴愪粯娆�') {
@@ -320,35 +278,33 @@
 			}
 		},
 	},
-  {
-    label: "鍙戠エ鍙�",
-    prop: "invoiceNumber",
-    width:200
-  },
-  {
-    label: "鍙戠エ閲戦(鍏�)",
-    prop: "invoiceAmount",
-    formatData: (params) => {
-      return params ? parseFloat(params).toFixed(2) : 0;
-    },
-  },
+	{
+		label: "浜у搧澶х被",
+		prop: "productCategory",
+		showOverflowTooltip: true,
+		width: 100
+	},
+	{
+		label: "瑙勬牸鍨嬪彿",
+		prop: "specificationModel",
+		showOverflowTooltip: true,
+		width: 150
+	},
   {
     label: "宸蹭粯娆鹃噾棰�(鍏�)",
-    prop: "paymentAmountTotal",
+    prop: "ticketsTotal",
+    width: 120,
     formatData: (params) => {
       return params ? parseFloat(params).toFixed(2) : 0;
     },
   },
   {
     label: "寰呬粯娆鹃噾棰�(鍏�)",
-    prop: "unPaymentAmountTotal",
+    prop: "pendingTicketsTotal",
+    width: 120,
     formatData: (params) => {
       return params ? parseFloat(params).toFixed(2) : 0;
     },
-  },
-  {
-    label: "褰曞叆浜�",
-    prop: "issUer",
   },
 ]);
 const tableData = ref([]);
@@ -356,6 +312,7 @@
 const selectedRows = ref([]);
 const tableLoading = ref(false);
 const childrenLoading = ref(false);
+const forms = ref([]);
 const userStore = useUserStore();
 const page = reactive({
   current: 1,
@@ -376,8 +333,6 @@
     purchaseLedgerId: "",
     salesContractNo: "",
     supplierName: "",
-    invoiceNumber: "",
-    invoiceAmount: "",
     taxRate: "",
     currentPaymentAmount: "",
     paymentMethod: "",
@@ -394,9 +349,6 @@
       { required: true, message: "璇疯緭鍏�", trigger: "blur" },
     ],
     paymentMethod: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    invoiceNumber: [
-      { required: true, message: "璇烽�夋嫨閲囪喘鍚堝悓鍙�", trigger: "change" },
-    ],
   },
 });
 const { form, rules } = toRefs(data);
@@ -409,11 +361,16 @@
 	if (!normalized) return 'info';
 	return normalized === '鏈畬鎴愪粯娆�' ? 'danger' : 'success';
 };
+
+const formattedNumber = (row, column, cellValue) => {
+  const val = Number(cellValue ?? 0);
+  return Number.isFinite(val) ? val.toFixed(2) : "0.00";
+};
 // 瀛愯〃鍚堣鏂规硶
 const summarizeMainTable1 = (param) => {
   return proxy.summarizeTable(
     param,
-    ["invoiceAmount", "paymentAmountTotal", "unPaymentAmountTotal"],
+    ["ticketsTotal", "pendingTicketsTotal"],
     {
       ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
       futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -442,8 +399,8 @@
   tableLoading.value = true;
   invoiceListPage({ ...searchForm, ...page }).then((res) => {
     tableLoading.value = false;
-    tableData.value = res.records;
-		page.total = res.total;
+    tableData.value = res.data.records;
+		page.total = res.data.total;
 		if (expandedRowKeys.value.length > 0) {
 			const arr = []
 			const index = tableData.value.findIndex(item => item.id === expandedRowKeys.value[0]);
@@ -501,48 +458,66 @@
 };
 // 鎵撳紑寮规
 const openForm = (type, row) => {
-  if (selectedRows.value.length !== 1) {
-    proxy.$message.error("璇烽�夋嫨涓�鏉″彂绁ㄦ暟鎹�");
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgError("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
     return;
   }
-	if (selectedRows.value[0].unPaymentAmountTotal == 0) {
-		proxy.$message.warning("鏃犻渶鍐嶄粯娆�");
-		return;
-	}
-  operationType.value = type;
-  form.value = {};
-  form.value = { ...selectedRows.value[0] };
-  form.value.ticketRegistrationId = selectedRows.value[0].id;
-  form.value.id = null;
-  // 鏌ヨ閲囪喘鍚堝悓鍙�
-  form.value.registrationtDate = getCurrentDate();
-  form.value.paymentDate = getCurrentDate();
-  form.value.registrant = userStore.name;
+  const validRows = selectedRows.value.filter((item) => Number(item.pendingTicketsTotal || 0) !== 0);
+  if (validRows.length === 0) {
+    proxy.$modal.msgWarning("鎵�閫夎褰曞潎鏃犻渶浠樻");
+    return;
+  }
+  forms.value = validRows.map((row) => ({
+    purchaseContractNumber: row.purchaseContractNumber || "",
+    salesContractNo: row.salesContractNo || "",
+    supplierName: row.supplierName || "",
+    supplierId: row.supplierId,
+    productCategory: row.productCategory || "",
+    specificationModel: row.specificationModel || "",
+    pendingTicketsTotal: Number(row.pendingTicketsTotal || 0),
+    currentPaymentAmount: "",
+    paymentMethod: "",
+    paymentDate: "",
+    registrant: userStore.nickName,
+    registrationtDate: getCurrentDate(),
+    ticketRegistrationId: row.id,
+    purchaseLedgerId: row.salesLedgerId,
+    salesLedgerProductId: row.id,
+  }));
   dialogFormVisible.value = true;
 };
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate((valid) => {
-    if (valid) {
-      if (operationType.value === "edit") {
-        submitEdit();
-      } else {
-        submitAdd();
-      }
+  if (forms.value.length === 0) {
+    proxy.$modal.msgError("璇烽�夋嫨浠樻璁板綍");
+    return;
+  }
+  for (let i = 0; i < forms.value.length; i++) {
+    const item = forms.value[i];
+    const pendingAmount = Number(item.pendingTicketsTotal || 0);
+    const currentAmount = Number(item.currentPaymentAmount);
+    if (!item.currentPaymentAmount && item.currentPaymentAmount !== 0) {
+      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇峰~鍐欎粯娆鹃噾棰漙);
+      return;
     }
-  });
-};
-// 鎻愪氦鏂板
-const submitAdd = () => {
-  paymentRegistrationAdd(form.value).then((res) => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-    closeDia();
-    getList();
-  });
-};
-// 鎻愪氦淇敼
-const submitEdit = () => {
-  paymentRegistrationEdit(form.value).then((res) => {
+    if (currentAmount > pendingAmount) {
+      proxy.$modal.msgError(
+        `绗� ${i + 1} 鏉★細浠樻閲戦涓嶈兘瓒呰繃寰呬粯娆鹃噾棰濓紙寰呬粯娆撅細${pendingAmount.toFixed(
+          2
+        )}锛塦
+      );
+      return;
+    }
+    if (!item.paymentMethod) {
+      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇烽�夋嫨浠樻鏂瑰紡`);
+      return;
+    }
+    if (!item.paymentDate) {
+      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇烽�夋嫨浠樻鏃ユ湡`);
+      return;
+    }
+  }
+  paymentRegistrationAdd(forms.value).then(() => {
     proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
     closeDia();
     getList();
@@ -550,7 +525,7 @@
 };
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef");
+  forms.value = [];
   dialogFormVisible.value = false;
 };
 // 鍒犻櫎
@@ -602,4 +577,9 @@
 ::v-deep(.el-checkbox__label) {
   font-weight: bold;
 }
+.empty-tip {
+  text-align: center;
+  padding: 20px 0;
+  color: #909399;
+}
 </style>
diff --git a/src/views/procurementManagement/priceManagement/index.vue b/src/views/procurementManagement/priceManagement/index.vue
index 006ce3c..76a39ed 100644
--- a/src/views/procurementManagement/priceManagement/index.vue
+++ b/src/views/procurementManagement/priceManagement/index.vue
@@ -62,7 +62,7 @@
       </el-table>
     </el-card>
 
-    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板浠锋牸' : '缂栬緫浠锋牸'" width="600px">
+    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板浠锋牸' : '缂栬緫浠锋牸'" :width="'600px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <el-form :model="formData" label-width="120px">
         <el-form-item label="鍟嗗搧鍚嶇О">
           <el-select v-model="formData.productName" placeholder="璇烽�夋嫨鍟嗗搧" style="width: 100%">
@@ -102,15 +102,12 @@
           <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleSubmit">纭畾</el-button>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { ref, reactive, computed } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index a8ca5f7..da4266e 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -39,7 +39,6 @@
     <div class="table_list">
       <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
         <el-button type="primary" @click="openForm('add')">鏂板鍙拌处</el-button>
-        <el-button type="success" @click="openScanAddDialog">鎵爜鏂板</el-button>
         <el-button @click="handleOut">瀵煎嚭</el-button>
         <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
       </div>
@@ -167,7 +166,7 @@
         <el-table-column
             fixed="right"
             label="鎿嶄綔"
-            min-width="150"
+            width="100"
             align="center"
         >
           <template #default="scope">
@@ -177,13 +176,6 @@
                 size="small"
                 @click="openForm('edit', scope.row)"
             >缂栬緫</el-button
-            >
-            <el-button
-                link
-                type="success"
-                size="small"
-                @click="showQRCode(scope.row)"
-            >鐢熸垚浜岀淮鐮�</el-button
             >
 
           </template>
@@ -198,11 +190,14 @@
           @pagination="paginationChange"
       />
     </div>
-    <el-dialog
+    <FormDialog
         v-model="dialogFormVisible"
         :title="operationType === 'add' ? '鏂板閲囪喘鍙拌处椤甸潰' : '缂栬緫閲囪喘鍙拌处椤甸潰'"
-        width="70%"
+        :width="'70%'"
+        :operation-type="operationType"
         @close="closeDia"
+        @confirm="submitForm"
+        @cancel="closeDia"
     >
       <el-form
           :model="form"
@@ -474,18 +469,15 @@
           </el-col>
         </el-row>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
-    <el-dialog
+    </FormDialog>
+    <FormDialog
         v-model="productFormVisible"
         :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'"
-        width="40%"
+        :width="'40%'"
+        :operation-type="productOperationType"
         @close="closeProductDia"
+        @confirm="submitProduct"
+        @cancel="closeProductDia"
     >
       <el-form
           :model="productForm"
@@ -632,228 +624,7 @@
           </el-col>
         </el-row>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitProduct">纭</el-button>
-          <el-button @click="closeProductDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
-
-    <!-- 浜岀淮鐮佹樉绀哄璇濇 -->
-    <el-dialog
-        v-model="qrCodeDialogVisible"
-        title="閲囪喘鍚堝悓鍙蜂簩缁寸爜"
-        width="400px"
-        center
-    >
-      <div style="text-align: center;">
-        <img :src="qrCodeUrl" alt="浜岀淮鐮�" style="width:200px;height:200px;" />
-        <div style="margin: 20px;">
-          <el-button type="primary" @click="downloadQRCode">涓嬭浇浜岀淮鐮佸浘鐗�</el-button>
-        </div>
-      </div>
-    </el-dialog>
-
-    <!-- 鎵爜鏂板瀵硅瘽妗� -->
-    <el-dialog
-        v-model="scanAddDialogVisible"
-        title="鎵爜鏂板閲囪喘鍙拌处"
-        width="70%"
-        @close="closeScanAddDialog"
-    >
-      <el-form
-          :model="scanAddForm"
-          label-width="140px"
-          label-position="top"
-          :rules="scanAddRules"
-          ref="scanAddFormRef"
-      >
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="鎵爜鍐呭锛�">
-              <el-input
-                  v-model="scanAddForm.scanContent"
-                  type="textarea"
-                  :rows="3"
-                  placeholder="璇锋壂鎻忎簩缁寸爜鎴栨墜鍔ㄨ緭鍏ラ噰璐悎鍚屼俊鎭�"
-                  @input="parseScanContent"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="閲囪喘鍚堝悓鍙凤細" prop="purchaseContractNumber">
-              <el-input
-                  v-model="scanAddForm.purchaseContractNumber"
-                  placeholder="璇疯緭鍏�"
-                  clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierName">
-              <el-input
-                  v-model="scanAddForm.supplierName"
-                  placeholder="璇疯緭鍏�"
-                  clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input
-                  v-model="scanAddForm.projectName"
-                  placeholder="璇疯緭鍏�"
-                  clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍚堝悓閲戦(鍏�)锛�" prop="contractAmount">
-              <el-input-number
-                  v-model="scanAddForm.contractAmount"
-                  :precision="2"
-                  :step="0.1"
-                  clearable
-                  style="width: 100%"
-                  placeholder="璇疯緭鍏�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="浠樻鏂瑰紡锛�">
-              <el-input
-                  v-model="scanAddForm.paymentMethod"
-                  placeholder="璇疯緭鍏�"
-                  clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="褰曞叆浜猴細">
-              <el-input v-model="scanAddForm.recorderName" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="澶囨敞锛�">
-              <el-input
-                  v-model="scanAddForm.remark"
-                  type="textarea"
-                  :rows="2"
-                  placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
-                  clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitScanAdd">纭鏂板</el-button>
-          <el-button @click="closeScanAddDialog">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
-
-    <!-- 鎵爜鐧昏瀵硅瘽妗� -->
-    <el-dialog
-        v-model="scanDialogVisible"
-        title="鎵爜鐧昏"
-        width="60%"
-        @close="closeScanDialog"
-    >
-      <el-form
-          :model="scanForm"
-          label-width="120px"
-          label-position="left"
-          :rules="scanRules"
-          ref="scanFormRef"
-      >
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="閲囪喘鍚堝悓鍙凤細">
-              <el-input v-model="scanForm.purchaseContractNumber" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="渚涘簲鍟嗗悕绉帮細">
-              <el-input v-model="scanForm.supplierName" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О锛�">
-              <el-input v-model="scanForm.projectName" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鎵爜鏃堕棿锛�">
-              <el-input v-model="scanForm.scanTime" disabled />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <el-form-item label="鎵爜浜猴細">
-              <el-input v-model="scanForm.scannerName" disabled />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鎵爜鐘舵�侊細">
-              <el-tag :type="scanForm.scanStatus === '宸叉壂鐮�' ? 'success' : 'warning'">
-                {{ scanForm.scanStatus }}
-              </el-tag>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="鎵爜澶囨敞锛�">
-              <el-input
-                  v-model="scanForm.scanRemark"
-                  type="textarea"
-                  :rows="3"
-                  placeholder="璇疯緭鍏ユ壂鐮佸娉ㄤ俊鎭�"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="20">
-          <el-col :span="24">
-            <el-form-item label="鎵爜璁板綍锛�">
-              <el-table :data="scanRecords" border style="width: 100%">
-                <el-table-column label="搴忓彿" type="index" width="60" align="center" />
-                <el-table-column label="鎵爜鏃堕棿" prop="scanTime" width="180" />
-                <el-table-column label="鎵爜浜�" prop="scannerName" width="120" />
-                <el-table-column label="鎵爜鐘舵��" prop="scanStatus" width="100">
-                  <template #default="scope">
-                    <el-tag :type="scope.row.scanStatus === '宸叉壂鐮�' ? 'success' : 'warning'">
-                      {{ scope.row.scanStatus }}
-                    </el-tag>
-                  </template>
-                </el-table-column>
-                <el-table-column label="澶囨敞" prop="scanRemark" />
-              </el-table>
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitScan">纭鎵爜</el-button>
-          <el-button @click="closeScanDialog">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
 
   </div>
 </template>
@@ -861,6 +632,7 @@
 <script setup>
 import {getToken} from "@/utils/auth";
 import pagination from "@/components/PIMTable/Pagination.vue";
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import {getCurrentInstance, nextTick, onMounted, reactive, ref, toRefs} from "vue";
 import {Search} from "@element-plus/icons-vue";
 import {ElMessage, ElMessageBox} from "element-plus";
@@ -885,7 +657,6 @@
   purchaseListPage
 } from "@/api/procurementManagement/procurementLedger.js";
 import useFormData from "@/hooks/useFormData.js";
-import QRCode from "qrcode";
 import useUserStore from "@/store/modules/user";
 import {modelList, productTreeList} from "@/api/basicData/product.js";
 import dayjs from "dayjs";
@@ -910,10 +681,6 @@
 const fileList = ref([]);
 
 const userStore = useUserStore();
-
-// 浜岀淮鐮佺浉鍏冲彉閲�
-const qrCodeDialogVisible = ref(false);
-const qrCodeUrl = ref("");
 
 // 璁㈠崟瀹℃壒鐘舵�佹樉绀烘枃鏈�
 const approvalStatusText = {
@@ -1753,201 +1520,6 @@
     productData.value = data;
   }
 };
-
-// 鏄剧ず浜岀淮鐮�
-const showQRCode = async (row) => {
-  try {
-    // 鏋勫缓浜岀淮鐮佸唴瀹癸紝鍙寘鍚噰璐悎鍚屽彿锛堢函鏂囨湰锛�
-    const qrContent = row.purchaseContractNumber || '';
-    // 妫�鏌ュ唴瀹规槸鍚︿负绌�
-    if (!qrContent || qrContent.trim() === '') {
-      proxy.$modal.msgWarning("璇ヨ娌℃湁閲囪喘鍚堝悓鍙凤紝鏃犳硶鐢熸垚浜岀淮鐮�");
-      return;
-    }
-    qrCodeUrl.value = await QRCode.toDataURL(qrContent, {
-      width: 200,
-      margin: 2,
-      color: {
-        dark: '#000000',
-        light: '#FFFFFF'
-      }
-    });
-    qrCodeDialogVisible.value = true;
-  } catch (error) {
-    console.error('鐢熸垚浜岀淮鐮佸け璐�:', error);
-    proxy.$modal.msgError("鐢熸垚浜岀淮鐮佸け璐ワ細" + error.message);
-  }
-};
-
-// 涓嬭浇浜岀淮鐮�
-const downloadQRCode = () => {
-  if (!qrCodeUrl.value) {
-    proxy.$modal.msgWarning("浜岀淮鐮佹湭鐢熸垚");
-    return;
-  }
-
-  try {
-    const a = document.createElement('a');
-    a.href = qrCodeUrl.value;
-    a.download = `閲囪喘鍚堝悓鍙蜂簩缁寸爜_${dayjs().format('YYYYMMDDHHmmss')}.png`;
-    document.body.appendChild(a);
-    a.click();
-    document.body.removeChild(a);
-    proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
-  } catch (error) {
-    console.error('涓嬭浇浜岀淮鐮佸け璐�:', error);
-    proxy.$modal.msgError("涓嬭浇澶辫触锛岃绋嶅悗閲嶈瘯");
-  }
-};
-
-// 鎵爜鏂板瀵硅瘽妗嗙浉鍏冲彉閲�
-const scanAddDialogVisible = ref(false);
-const scanAddForm = reactive({
-  scanContent: "",
-  purchaseContractNumber: "",
-  supplierName: "",
-  projectName: "",
-  contractAmount: "",
-  paymentMethod: "",
-  recorderName: "",
-  scanRemark: "",
-});
-const scanAddRules = {
-  purchaseContractNumber: [{ required: true, message: "璇疯緭鍏ラ噰璐悎鍚屽彿", trigger: "blur" }],
-  supplierName: [{ required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }],
-  projectName: [{ required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur" }],
-};
-
-// 鎵爜鐧昏瀵硅瘽妗嗙浉鍏冲彉閲�
-const scanDialogVisible = ref(false);
-const scanForm = reactive({
-  purchaseContractNumber: "",
-  supplierName: "",
-  projectName: "",
-  scanTime: "",
-  scannerName: "",
-  scanStatus: "鏈壂鐮�",
-  scanRemark: "",
-});
-const scanRules = {
-  scanRemark: [{ required: true, message: "璇疯緭鍏ユ壂鐮佸娉�", trigger: "blur" }],
-};
-const scanRecords = ref([]);
-
-// 鎵撳紑鎵爜鏂板瀵硅瘽妗�
-const openScanAddDialog = () => {
-  scanAddForm.scanContent = "";
-  scanAddForm.purchaseContractNumber = "";
-  scanAddForm.supplierName = "";
-  scanAddForm.projectName = "";
-  scanAddForm.contractAmount = "";
-  scanAddForm.paymentMethod = "";
-  scanAddForm.recorderName = userStore.nickName;
-  scanAddForm.scanRemark = "";
-  scanAddDialogVisible.value = true;
-};
-
-// 瑙f瀽鎵爜鍐呭锛堟ā鎷熻В鏋愪簩缁寸爜鏁版嵁锛�
-const parseScanContent = (content) => {
-  if (!content) return;
-
-  // 妯℃嫙瑙f瀽浜岀淮鐮佸唴瀹癸紝杩欓噷鍙互鏍规嵁瀹為檯闇�姹傝皟鏁磋В鏋愰�昏緫
-  // 鍋囪鎵爜鍐呭鏍煎紡涓猴細鍚堝悓鍙穦渚涘簲鍟唡椤圭洰|閲戦|浠樻鏂瑰紡
-  const parts = content.split('|');
-  if (parts.length >= 3) {
-    scanAddForm.purchaseContractNumber = parts[0] || "";
-    scanAddForm.supplierName = parts[1] || "";
-    scanAddForm.projectName = parts[2] || "";
-    scanAddForm.contractAmount = parts[3] || "";
-    scanAddForm.paymentMethod = parts[4] || "";
-  }
-};
-
-// 鍏抽棴鎵爜鏂板瀵硅瘽妗�
-const closeScanAddDialog = () => {
-  scanAddDialogVisible.value = false;
-  proxy.resetForm("scanAddFormRef");
-};
-
-// 鎻愪氦鎵爜鏂板
-const submitScanAdd = async () => {
-  try {
-    const valid = await proxy.$refs["scanAddFormRef"].validate().catch(() => false);
-    if (!valid) {
-      return;
-    }
-    
-    // 鏋勫缓鏂板鏁版嵁
-    const newData = {
-      purchaseContractNumber: scanAddForm.purchaseContractNumber,
-      supplierName: scanAddForm.supplierName,
-      projectName: scanAddForm.projectName,
-      contractAmount: scanAddForm.contractAmount,
-      paymentMethod: scanAddForm.paymentMethod,
-      recorderName: scanAddForm.recorderName,
-      entryDate: getCurrentDate(),
-      remark: scanAddForm.scanRemark,
-      type: 2
-    };
-
-    // await addOrEditPurchase(newData);
-    
-    proxy.$modal.msgSuccess("鎵爜鏂板鎴愬姛锛�");
-    closeScanAddDialog();
-    getList(); // 鍒锋柊鍒楄〃
-  } catch (error) {
-    console.error('鎻愪氦鎵爜鏂板澶辫触:', error);
-    proxy.$modal.msgError("鎻愪氦澶辫触锛岃绋嶅悗閲嶈瘯");
-  }
-};
-
-// 鎵撳紑鎵爜鐧昏瀵硅瘽妗�
-const openScanDialog = (row) => {
-  scanForm.purchaseContractNumber = row.purchaseContractNumber;
-  scanForm.supplierName = row.supplierName;
-  scanForm.projectName = row.projectName;
-  scanForm.scanTime = getCurrentDateTime();
-  scanForm.scannerName = userStore.nickName;
-  scanForm.scanStatus = "鏈壂鐮�";
-  scanForm.scanRemark = "";
-  scanRecords.value = [];
-  scanDialogVisible.value = true;
-};
-
-// 鍏抽棴鎵爜鐧昏瀵硅瘽妗�
-const closeScanDialog = () => {
-  scanDialogVisible.value = false;
-  proxy.resetForm("scanFormRef");
-};
-
-// 鎻愪氦鎵爜鐧昏
-const submitScan = async () => {
-  try {
-    const valid = await proxy.$refs["scanFormRef"].validate().catch(() => false);
-    if (!valid) {
-      return;
-    }
-    
-    // 娣诲姞鎵爜璁板綍
-    scanRecords.value.push({
-      ...scanForm,
-      id: Date.now(), // 妯℃嫙ID
-      scanTime: getCurrentDateTime(),
-    });
-    scanForm.scanStatus = "宸叉壂鐮�";
-    scanForm.scanRemark = scanForm.scanRemark || "鏃�";
-    proxy.$modal.msgSuccess("鎵爜鐧昏鎴愬姛锛�");
-    closeScanDialog();
-  } catch (error) {
-    console.error('鎻愪氦鎵爜鐧昏澶辫触:', error);
-    proxy.$modal.msgError("鎻愪氦澶辫触锛岃绋嶅悗閲嶈瘯");
-  }
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡鏃堕棿
-function getCurrentDateTime() {
-  return dayjs().format("YYYY-MM-DD HH:mm:ss");
-}
 
 // 娣诲姞琛岀被鍚嶆柟娉�
 const tableRowClassName = ({ row }) => {
diff --git a/src/views/procurementManagement/procurementPlan/index.vue b/src/views/procurementManagement/procurementPlan/index.vue
index 14424cc..42a1bcf 100644
--- a/src/views/procurementManagement/procurementPlan/index.vue
+++ b/src/views/procurementManagement/procurementPlan/index.vue
@@ -88,11 +88,15 @@
     </el-card>
 
     <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
-    <el-dialog
+    <FormDialog
       v-model="dialogVisible"
       :title="dialogType === 'add' ? '鏂板閲囪喘璁″垝' : '缂栬緫閲囪喘璁″垝'"
-      width="1000px"
+      :width="'1000px'"
+      :operation-type="dialogType"
       :close-on-click-modal="false"
+      @close="dialogVisible = false"
+      @confirm="handleSubmit"
+      @cancel="dialogVisible = false"
     >
       <div class="form-container">
         <!-- 鍩烘湰淇℃伅 -->
@@ -202,21 +206,17 @@
           </div>
         </div>
       </div>
-
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="dialogVisible = false">鍙栨秷</el-button>
-          <el-button type="primary" @click="handleSubmit" :loading="submitLoading">纭畾</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
 
     <!-- 浜у搧閫夋嫨瀵硅瘽妗� -->
-    <el-dialog
+    <FormDialog
       v-model="productSelectDialogVisible"
       title="閫夋嫨浜у搧"
-      width="800px"
+      :width="'800px'"
       :close-on-click-modal="false"
+      @close="productSelectDialogVisible = false"
+      @confirm="handleConfirmProductSelection"
+      @cancel="productSelectDialogVisible = false"
     >
       <div class="product-select">
         <el-alert
@@ -247,23 +247,17 @@
           <el-table-column prop="inboundNum0" label="棰勮鍏ュ簱" width="100" align="right" />
         </el-table>
       </div>
-
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="productSelectDialogVisible = false">鍙栨秷</el-button>
-          <el-button type="primary" @click="handleConfirmProductSelection" :disabled="selectedProducts.length === 0">
-            纭璁$畻
-          </el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
 
     <!-- 璁$畻缁撴灉瀵硅瘽妗� -->
-    <el-dialog
+    <FormDialog
       v-model="calculateDialogVisible"
       title="閲囪喘璁$畻缁撴灉"
-      width="1000px"
+      :width="'1000px'"
       :close-on-click-modal="false"
+      @close="calculateDialogVisible = false"
+      @confirm="handleCreatePurchaseOrder"
+      @cancel="calculateDialogVisible = false"
     >
       <div class="calculate-result">
         <el-alert
@@ -300,18 +294,12 @@
           </el-table-column>
         </el-table>
       </div>
-
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="calculateDialogVisible = false">鍏抽棴</el-button>
-          <el-button type="primary" @click="handleCreatePurchaseOrder">纭</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import {ref, reactive, onMounted, getCurrentInstance} from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { Search, Refresh, Plus, Download } from '@element-plus/icons-vue'
diff --git a/src/views/procurementManagement/purchaseOrder/index.vue b/src/views/procurementManagement/purchaseOrder/index.vue
index 79ca2fe..7e56cb4 100644
--- a/src/views/procurementManagement/purchaseOrder/index.vue
+++ b/src/views/procurementManagement/purchaseOrder/index.vue
@@ -48,7 +48,7 @@
       </el-table>
     </el-card>
 
-    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板閲囪喘璁㈠崟' : '缂栬緫閲囪喘璁㈠崟'" width="800px">
+    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板閲囪喘璁㈠崟' : '缂栬緫閲囪喘璁㈠崟'" :width="'800px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <el-form :model="formData" ref="formRef" label-width="120px">
         <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
           <el-select v-model="formData.supplierName" placeholder="璇烽�夋嫨渚涘簲鍟�" style="width: 100%">
@@ -60,15 +60,12 @@
           <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleSubmit">纭畾</el-button>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { ref, reactive } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 
diff --git a/src/views/procurementManagement/qualityInspection/index.vue b/src/views/procurementManagement/qualityInspection/index.vue
index 8d90243..ab19d6f 100644
--- a/src/views/procurementManagement/qualityInspection/index.vue
+++ b/src/views/procurementManagement/qualityInspection/index.vue
@@ -49,7 +49,7 @@
       </el-table>
     </el-card>
 
-    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板璐ㄦ鍗�' : '缂栬緫璐ㄦ鍗�'" width="1000px">
+    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板璐ㄦ鍗�' : '缂栬緫璐ㄦ鍗�'" :width="'1000px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <el-form :model="formData" label-width="120px">
         <el-row :gutter="20">
           <el-col :span="12">
@@ -120,15 +120,12 @@
           <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleSubmit">纭畾</el-button>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { ref, reactive } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 
diff --git a/src/views/procurementManagement/returnManagement/index.vue b/src/views/procurementManagement/returnManagement/index.vue
index 2a54083..d44b588 100644
--- a/src/views/procurementManagement/returnManagement/index.vue
+++ b/src/views/procurementManagement/returnManagement/index.vue
@@ -60,7 +60,7 @@
       />
     </el-card>
 
-    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板閫�璐у崟' : '缂栬緫閫�璐у崟'" width="600px">
+    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '鏂板閫�璐у崟' : '缂栬緫閫�璐у崟'" :width="'600px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <el-form :model="formData" label-width="120px">
         <el-form-item label="閫�璐х被鍨�">
           <el-select v-model="formData.returnType" placeholder="璇烽�夋嫨閫�璐х被鍨�" style="width: 100%">
@@ -87,15 +87,12 @@
           <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" />
         </el-form-item>
       </el-form>
-      <template #footer>
-        <el-button @click="dialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="handleSubmit">纭畾</el-button>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { ref, reactive,onMounted } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import Pagination from '@/components/PIMTable/Pagination.vue'
diff --git a/src/views/procurementManagement/transferManagement/index.vue b/src/views/procurementManagement/transferManagement/index.vue
index 10ef52f..3646449 100644
--- a/src/views/procurementManagement/transferManagement/index.vue
+++ b/src/views/procurementManagement/transferManagement/index.vue
@@ -64,7 +64,7 @@
         @pagination="paginationChange"
     />
     <!-- 纭鏀惰揣瀵硅瘽妗� -->
-    <el-dialog v-model="receiptDialogVisible" title="纭鏀惰揣" width="70%">
+    <FormDialog v-model="receiptDialogVisible" title="纭鏀惰揣" :width="'70%'" @close="receiptDialogVisible = false" @confirm="submitReceipt" @cancel="receiptDialogVisible = false">
       <el-form :model="receiptForm" label-width="120px" ref="formRef">
         <el-form-item label="閲囪喘鍚堝悓鍙�">
           <el-input v-model="receiptForm.purchaseContractNumber" disabled />
@@ -130,15 +130,12 @@
           />
         </el-table>
       </el-form>
-      <template #footer>
-        <el-button @click="receiptDialogVisible = false">鍙栨秷</el-button>
-        <el-button type="primary" @click="submitReceipt">纭鏀惰揣</el-button>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import {ref, onMounted, getCurrentInstance} from 'vue'
 import {
   getPurchaseOrders,
diff --git a/src/views/salesManagement/deliveryLedger/index.vue b/src/views/salesManagement/deliveryLedger/index.vue
index ea81717..d838924 100644
--- a/src/views/salesManagement/deliveryLedger/index.vue
+++ b/src/views/salesManagement/deliveryLedger/index.vue
@@ -41,8 +41,8 @@
       <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
         :page="page.current" :limit="page.size" @pagination="paginationChange" />
     </div>
-    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板鍙戣揣鍙拌处' : '缂栬緫鍙戣揣鍙拌处'" width="50%"
-      @close="closeDia">
+    <FormDialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板鍙戣揣鍙拌处' : '缂栬緫鍙戣揣鍙拌处'" :width="'50%'"
+      :operation-type="operationType" @close="closeDia" @confirm="submitForm" @cancel="closeDia">
       <el-form :model="form" label-width="120px" label-position="top" :rules="rules" ref="formRef">
         <el-row :gutter="30">
           <el-col :span="24">
@@ -81,18 +81,13 @@
         </el-row>
         
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
 import pagination from "@/components/PIMTable/Pagination.vue";
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue";
 import { ElMessageBox } from "element-plus";
 import { getCurrentDate } from "@/utils/index.js";
diff --git a/src/views/salesManagement/invoiceLedger/index.vue b/src/views/salesManagement/invoiceLedger/index.vue
index cb8466e..eec3a26 100644
--- a/src/views/salesManagement/invoiceLedger/index.vue
+++ b/src/views/salesManagement/invoiceLedger/index.vue
@@ -31,9 +31,8 @@
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
         <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip width="180" />
-        <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" show-overflow-tooltip width="180" />
         <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip width="240" />
-        <el-table-column label="椤圭洰" prop="projectName" width="320" />
+<!--        <el-table-column label="椤圭洰" prop="projectName" width="320" />-->
         <el-table-column label="浜у搧澶х被" prop="productCategory" width="200" />
         <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" width="160" show-overflow-tooltip />
         <el-table-column label="鍙戠エ鍙�" prop="invoiceNo" width="200" show-overflow-tooltip />
@@ -43,7 +42,7 @@
         <el-table-column label="褰曞叆浜�" prop="invoicePerson" show-overflow-tooltip />
         <el-table-column label="褰曞叆鏃ユ湡" prop="createTime" show-overflow-tooltip :formatter="formatDate" width="180" />
         <el-table-column label="寮�绁ㄦ棩鏈�" prop="invoiceDate" show-overflow-tooltip width="120" />
-        <el-table-column label="鍙戠エ" prop="invoiceFileName" width="120" align="center" show-overflow-tooltip fixed="right">
+        <!-- <el-table-column label="鍙戠エ" prop="invoiceFileName" width="120" align="center" show-overflow-tooltip fixed="right">
           <template #default="scope">
             <el-button v-if="scope.row.invoiceFileName" text bg type="primary"
               @click="handleFile(scope.row.commonFiles)">
@@ -53,10 +52,11 @@
               涓婁紶
             </el-button>
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column fixed="right" label="鎿嶄綔" width="150" align="center">
           <template #default="scope">
             <el-button link type="primary" size="small" @click="openForm(scope.row)">缂栬緫</el-button>
+            <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">闄勪欢</el-button>
             <el-button link type="primary" size="small" @click="delInvoiceLedger(scope.row)">鍒犻櫎</el-button>
           </template>
         </el-table-column>
@@ -64,7 +64,7 @@
       <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
         :page="page.current" :limit="page.size" @pagination="paginationChange" />
     </div>
-    <el-dialog v-model="dialogFormVisible" title="寮�绁ㄥ彴璐﹂〉闈�" width="70%" @close="closeDia">
+    <FormDialog v-model="dialogFormVisible" title="寮�绁ㄥ彴璐﹂〉闈�" :width="'70%'" @close="closeDia" @confirm="submitForm" @cancel="closeDia">
       <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
         <el-row :gutter="30">
           <el-col :span="12">
@@ -108,7 +108,7 @@
             <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
               <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
                 :headers="upload.headers" accept=".pdf" :limit="10" :before-upload="handleBeforeUpload"
-                :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove">
+                :on-error="handleUploadError" :on-success="handleUploadSuccess">
                 <el-button type="primary">涓婁紶</el-button>
                 <template #tip>
                   <!--                  鏂囦欢鏍煎紡鏀寔 doc锛宒ocx锛寈ls锛寈lsx锛宲pt锛宲ptx锛宲df锛宼xt锛寈ml锛宩pg锛宩peg锛宲ng锛実if锛宐mp锛宺ar锛寊ip锛�7z-->
@@ -119,13 +119,7 @@
           </el-col>
         </el-row>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
     <el-dialog title="涓婁紶寮圭獥" width="50%" v-model="uploadModal">
       <el-row :gutter="30">
         <el-col :span="24">
@@ -149,11 +143,13 @@
         </div>
       </template>
     </el-dialog>
+    <FileListDialog ref="fileListRef" v-model="fileListDialogVisible" />
   </div>
 </template>
 
 <script setup>
 import pagination from "@/components/PIMTable/Pagination.vue";
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { ref } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessageBox } from "element-plus";
@@ -164,10 +160,11 @@
   commitFile,
   registrationProductPage,
   delInvoiceLedgerByRegProductId,
-} from "../../../api/salesManagement/invoiceLedger.js";
+} from "@/api/salesManagement/invoiceLedger.js";
 import useUserStore from "@/store/modules/user.js";
 import useFormData from "@/hooks/useFormData";
 import dayjs from "dayjs";
+import FileListDialog from '@/components/Dialog/FileListDialog.vue';
 import { getCurrentDate } from "@/utils/index.js";
 
 const { proxy } = getCurrentInstance();
@@ -246,7 +243,11 @@
 const getList = () => {
   tableLoading.value = true;
   const { invoiceDate, ...rest } = searchForm;
-  registrationProductPage({ ...rest, ...page }).then((res) => {
+  // 灏嗚寖鍥存棩鏈熷瓧娈典紶閫掔粰鍚庣
+  const params = { ...rest, ...page };
+  // 绉婚櫎寮�绁ㄦ棩鏈熺殑榛樿鍊艰缃紝鍙繚鐣欒寖鍥存棩鏈熷瓧娈�
+  delete params.invoiceDate;
+  registrationProductPage(params).then((res) => {
     tableLoading.value = false;
     tableData.value = res.data.records;
     total.value = res.data.total;
@@ -273,12 +274,12 @@
   invoiceLedgerProductInfo({ id: row.id }).then((res) => {
     form.value = { ...res.data };
     fileList.value = res.data.fileList;
+    // 淇濆瓨ticketRegistrationId鍒拌〃鍗曟暟鎹腑
+    if (row.ticketRegistrationId) {
+      form.value.ticketRegistrationId = row.ticketRegistrationId;
+    }
     if (!form.value.invoicePerson) {
       form.value.invoicePerson = userStore.nickName;
-      form.value.entryDate = getCurrentDate();
-    }
-    if (!form.value.invoiceDate) {
-      form.value.invoiceDate = getCurrentDate();
     }
   });
   dialogFormVisible.value = true;
@@ -292,7 +293,6 @@
 };
 // 涓婁紶鍓嶆牎妫�
 function handleBeforeUpload(file) {
-  console.log("file", file);
   // 鏍℃鏂囦欢澶у皬
   if (file.size > 1024 * 1024 * 10) {
     proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
@@ -316,19 +316,25 @@
 function handleUploadSuccess(res, file, uploadFiles) {
   proxy.$modal.closeLoading();
   if (res.code === 200) {
-    proxy.$refs["fileUpload"].handleRemove(file);
-    fileList.value.push(res.data);
     proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
+    // 灏嗕笂浼犳垚鍔熺殑鏂囦欢淇℃伅娣诲姞鍒癴ileList涓�
+    const fileInfo = {
+      name: file.name,
+      url: res.data.url || file.response?.data?.url || file.url,
+      response: file.response
+    };
+    // 妫�鏌ユ槸鍚﹀凡瀛樺湪鐩稿悓鏂囦欢锛岄伩鍏嶉噸澶嶆坊鍔�
+    const existingFileIndex = fileList.value.findIndex(f => f.name === fileInfo.name);
+    if (existingFileIndex === -1) {
+      fileList.value.push(fileInfo);
+    } else {
+      fileList.value[existingFileIndex] = fileInfo;
+    }
+    // 纭繚琛ㄥ崟鏁版嵁涓殑fileList涔熸洿鏂�
+    form.value.fileList = fileList.value;
   } else {
     proxy.$modal.msgError(res.msg);
     proxy.$refs.fileUpload.handleRemove(file);
-  }
-}
-// 绉婚櫎鏂囦欢
-function handleRemove(file) {
-  let index = fileList.value.findIndex((item) => item.url === file.url);
-  if (index > -1) {
-    fileList.value.splice(index, 1);
   }
 }
 // 鎻愪氦琛ㄥ崟
@@ -362,13 +368,6 @@
     .catch(() => {
       proxy.$modal.msg("宸插彇娑�");
     });
-};
-
-// 鎵撳紑闄勪欢涓婁紶寮圭獥
-const handleDownload = (val) => {
-  fileList.value = [];
-  uploadModal.value = true;
-  currentId.value = val.id;
 };
 
 // 纭鏂囦欢涓婁紶
@@ -426,7 +425,26 @@
   getList();
 };
 
+//闄勪欢鐩稿叧
+const fileListRef = ref(null)
+const fileListDialogVisible = ref(false)
+//鏌ョ湅闄勪欢
+const downLoadFile = (row) => {
+	invoiceLedgerProductInfo({ id: row.id }).then((res) => {
+		if (fileListRef.value) {
+			fileListRef.value.open(res.data.fileList)
+			fileListDialogVisible.value = true
+		}
+	});
+}
+
 onMounted(() => {
+  // 璁剧疆寮�绁ㄦ棩鏈熻寖鍥撮粯璁ゅ�间负褰撳ぉ
+  const today = dayjs().format('YYYY-MM-DD');
+  searchForm.invoiceDate = [today, today];
+  // 璁剧疆鑼冨洿鏃ユ湡瀛楁鐨勮捣濮嬪拰缁撴潫鏃堕棿
+  searchForm.invoiceDateStart = today;
+  searchForm.invoiceDateEnd = today;
   getList();
 });
 </script>
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
index 8bf1236..2cf92a8 100644
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ b/src/views/salesManagement/invoiceRegistration/index.vue
@@ -1,418 +1,388 @@
 <template>
-  <div class="app-container">
-    <div class="search_form">
-      <el-form :inline="true" :model="searchForm">
-        <el-form-item label="瀹㈡埛鍚嶇О">
-          <el-input
-            v-model="searchForm.customerName"
-            style="width: 240px"
-            placeholder="璇疯緭鍏ュ悕绉版悳绱�"
-            clearable
-            :prefix-icon="Search"
-            @change="handleQuery"
-          />
-        </el-form-item>
-        <el-form-item label="瀹㈡埛鍚堝悓鍙�">
-          <el-input
-            v-model="searchForm.customerContractNo"
-            placeholder="璇疯緭鍏ュ鎴峰悎鍚屽彿"
-            clearable
-          />
-        </el-form-item>
-        <el-form-item label="椤圭洰鍚嶇О">
-          <el-input
-            v-model="searchForm.projectName"
-            placeholder="璇疯緭鍏ラ」鐩悕绉�"
-            clearable
-          />
-        </el-form-item>
-        <el-form-item>
-          <el-checkbox
-            v-model="searchForm.status"
-            label="涓嶆樉绀烘湭寮�绁ㄩ噾棰濅负0"
-            @change="handleQuery"
-          />
-        </el-form-item>
-        <el-form-item>
-          <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
-          <el-button @click="resetForm"> 閲嶇疆 </el-button>
-          <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
-        </el-form-item>
-      </el-form>
-    </div>
-    <div class="table_list">
-      <div class="flex justify-between">
-        <div></div>
-        <div>
-        <el-button type="primary" @click="openForm" style="margin-bottom: 8px">
-          鏂板鐧昏
-        </el-button>
-        </div>
-      </div>
-      <el-table
-        :data="tableData"
-        :border="true"
-        height="calc(100vh - 21em)"
-        v-loading="tableLoading"
-        :expand-row-keys="expandedRowKeys"
-        :row-key="(row) => row.id"
-        show-summary
-        :summary-method="summarizeMainTable"
-        @expand-change="expandChange"
-        @selection-change="handleSelectionChange"
-      >
-        <el-table-column align="center" type="selection" width="55" />
-        <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"
-                width="150"
-              />
-              <el-table-column label="鍗曚綅" prop="unit" width="70" />
-              <el-table-column label="鏁伴噺" prop="quantity" width="70" />
-              <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
-              <el-table-column
-                label="鍚◣鍗曚环(鍏�)"
-                prop="taxInclusiveUnitPrice"
-                :formatter="formattedNumber"
-              />
-              <el-table-column
-                label="鍚◣鎬讳环(鍏�)"
-                prop="taxInclusiveTotalPrice"
-                :formatter="formattedNumber"
-              />
-              <el-table-column
-                label="涓嶅惈绋庢�讳环(鍏�)"
-                prop="taxExclusiveTotalPrice"
-                :formatter="formattedNumber"
-              />
-              <el-table-column
-                label="寮�绁ㄦ暟"
-                prop="invoiceNum"
-                :formatter="formattedNumber"
-              />
-              <el-table-column
-                label="寮�绁ㄩ噾棰�(鍏�)"
-                prop="invoiceAmount"
-                :formatter="formattedNumber"
-              />
-              <el-table-column
-                label="鏈紑绁ㄦ暟"
-                prop="noInvoiceNum"
-                :formatter="formattedNumber"
-              />
-              <el-table-column
-                label="鏈紑绁ㄩ噾棰�(鍏�)"
-                prop="noInvoiceAmount"
-                :formatter="formattedNumber"
-              />
-            </el-table>
-          </template>
-        </el-table-column>
-        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column
-          label="閿�鍞悎鍚屽彿"
-          prop="salesContractNo"
-          show-overflow-tooltip
-          width="200"
-        />
-        <el-table-column
-          label="瀹㈡埛鍚堝悓鍙�"
-          prop="customerContractNo"
-          width="200"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="瀹㈡埛鍚嶇О"
-          prop="customerName"
-          show-overflow-tooltip
-          width="240"
-        />
-        <el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip width="90"/>
-        <el-table-column
-          label="椤圭洰鍚嶇О"
-          prop="projectName"
-          show-overflow-tooltip
-          width="200"
-        />
-        <el-table-column
-          label="鍚堝悓閲戦(鍏�)"
-          prop="contractAmount"
-          show-overflow-tooltip
-          :formatter="formattedNumber"
-					width="220"
-
-        />
-        <el-table-column
-          label="宸插紑绁ㄩ噾棰�(鍏�)"
-          prop="invoiceTotal"
-          show-overflow-tooltip
-          :formatter="formattedNumber"
-          width="120"
-        />
-        <el-table-column
-          label="鏈紑绁ㄩ噾棰�(鍏�)"
-          prop="noInvoiceAmountTotal"
-          show-overflow-tooltip
-          width="120"
-        >
-          <template #default="{ row, column }">
-            <el-text type="danger">
-              {{ formattedNumber(row, column, row.noInvoiceAmountTotal) }}
-            </el-text>
-          </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>
-    <el-dialog
-      v-model="dialogFormVisible"
-      title="鏂板寮�绁ㄧ櫥璁伴〉闈�"
-      width="85%"
-      @close="closeDia"
-    >
-      <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="salesContractNo">
-              <el-input v-model="form.salesContractNo" disabled></el-input>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
-              <el-input
-                v-model="form.customerName"
-                placeholder="鑷姩濉厖"
-                disabled
-              ></el-input>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="涓氬姟鍛橈細" prop="salesman">
-              <el-input
-                v-model="form.salesman"
-                placeholder="鑷姩濉厖"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input
-                v-model="form.projectName"
-                placeholder="鑷姩濉厖"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="褰曞叆浜�" prop="createUer">
-              <el-input v-model="form.createUer" placeholder="璇疯緭鍏ュ綍鍏ヤ汉" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="寮�绁ㄦ棩鏈�" prop="issueDate">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.issueDate"
-                type="date"
-                placeholder="璇烽�夋嫨"
-                clearable
-                format="YYYY-MM-DD"
-                value-format="YYYY-MM-DD"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.createTime"
-                type="date"
-                placeholder="璇烽�夋嫨"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ鍙风爜锛�" prop="invoiceNo">
-              <el-input
-                v-model="form.invoiceNo"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item>
-        </el-row>
-        <el-table
-          :data="productData"
-          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"
-            width="150"
-          />
-          <el-table-column label="鍗曚綅" prop="unit" />
-          <el-table-column label="鏁伴噺" prop="quantity" width="70" />
-          <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
-          <el-table-column
-            label="鍚◣鍗曚环(鍏�)"
-            prop="taxInclusiveUnitPrice"
-            :formatter="formattedNumber"
+	<div class="app-container">
+		<div class="search_form">
+			<el-form :inline="true" :model="searchForm">
+				<el-form-item label="瀹㈡埛鍚嶇О">
+					<el-input
+						v-model="searchForm.customerName"
+						style="width: 240px"
+						placeholder="璇疯緭鍏ュ悕绉版悳绱�"
+						clearable
+						:prefix-icon="Search"
+						@change="handleQuery"
+					/>
+				</el-form-item>
+				<el-form-item>
+					<el-checkbox
+						v-model="searchForm.status"
+						label="涓嶆樉绀烘湭寮�绁ㄩ噾棰濅负0"
+						@change="handleQuery"
+					/>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
+					<el-button @click="resetForm"> 閲嶇疆 </el-button>
+					<el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="table_list">
+			<div class="flex justify-between">
+				<div></div>
+				<div>
+					<el-button type="primary" @click="openForm" style="margin-bottom: 8px">
+						寮�绁ㄧ櫥璁�
+					</el-button>
+				</div>
+			</div>
+			<el-table
+				:data="tableData"
+				:border="true"
+				height="calc(100vh - 21em)"
+				v-loading="tableLoading"
+				:expand-row-keys="expandedRowKeys"
+				:row-key="(row) => row.id"
+				show-summary
+				:summary-method="summarizeMainTable"
+				@expand-change="expandChange"
+				@selection-change="handleSelectionChange"
+			>
+				<el-table-column align="center" type="selection" width="55" />
+				<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"
+								width="150"
+							/>
+							<el-table-column label="鍗曚綅" prop="unit" width="70" />
+							<el-table-column label="鏁伴噺" prop="quantity" width="70" />
+							<el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
+							<el-table-column
+								label="鍚◣鍗曚环(鍏�)"
+								prop="taxInclusiveUnitPrice"
+								:formatter="formattedNumber"
+							/>
+							<el-table-column
+								label="鍚◣鎬讳环(鍏�)"
+								prop="taxInclusiveTotalPrice"
+								:formatter="formattedNumber"
+							/>
+							<el-table-column
+								label="涓嶅惈绋庢�讳环(鍏�)"
+								prop="taxExclusiveTotalPrice"
+								:formatter="formattedNumber"
+							/>
+							<el-table-column
+								label="寮�绁ㄦ暟"
+								prop="invoiceNum"
+								:formatter="formattedNumber"
+							/>
+							<el-table-column
+								label="寮�绁ㄩ噾棰�(鍏�)"
+								prop="invoiceAmount"
+								:formatter="formattedNumber"
+							/>
+							<el-table-column
+								label="鏈紑绁ㄦ暟"
+								prop="noInvoiceNum"
+								:formatter="formattedNumber"
+							/>
+							<el-table-column
+								label="鏈紑绁ㄩ噾棰�(鍏�)"
+								prop="noInvoiceAmount"
+								:formatter="formattedNumber"
+							/>
+						</el-table>
+					</template>
+				</el-table-column>
+				<el-table-column align="center" label="搴忓彿" type="index" width="60" />
+				<el-table-column
+					label="閿�鍞悎鍚屽彿"
+					prop="salesContractNo"
+					show-overflow-tooltip
+				/>
+<!--				<el-table-column-->
+<!--					label="瀹㈡埛鍚堝悓鍙�"-->
+<!--					prop="customerContractNo"-->
+<!--					width="200"-->
+<!--					show-overflow-tooltip-->
+<!--				/>-->
+				<el-table-column
+					label="瀹㈡埛鍚嶇О"
+					prop="customerName"
+					show-overflow-tooltip
+				/>
+				<el-table-column label="涓氬姟鍛�" prop="salesman" show-overflow-tooltip/>
+				<el-table-column
+					label="鍚堝悓閲戦(鍏�)"
+					prop="contractAmount"
+					show-overflow-tooltip
+					:formatter="formattedNumber"
+				
+				/>
+				<el-table-column
+					label="宸插紑绁ㄩ噾棰�(鍏�)"
+					prop="invoiceTotal"
+					show-overflow-tooltip
+					:formatter="formattedNumber"
+				/>
+				<el-table-column
+					label="鏈紑绁ㄩ噾棰�(鍏�)"
+					prop="noInvoiceAmountTotal"
+					show-overflow-tooltip
+					width="120"
+				>
+					<template #default="{ row, column }">
+						<el-text type="danger">
+							{{ formattedNumber(row, column, row.noInvoiceAmountTotal) }}
+						</el-text>
+					</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>
+		<FormDialog
+			v-model="dialogFormVisible"
+			title="鏂板寮�绁ㄧ櫥璁伴〉闈�"
+			:width="'85%'"
+			@close="closeDia"
+			@confirm="submitForm"
+			@cancel="closeDia"
+		>
+			<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="salesContractNo">
+							<el-input v-model="form.salesContractNo" disabled placeholder="澶氬悎鍚屾壒閲忓鐞嗭紙鍏蜂綋鍚堝悓鍙疯浜у搧鍒楄〃锛�"></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
+							<el-input
+								v-model="form.customerName"
+								placeholder="鑷姩濉厖"
+								disabled
+							></el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row :gutter="30">
+					<el-col :span="12">
+						<el-form-item label="涓氬姟鍛橈細" prop="salesman">
+							<el-input
+								v-model="form.salesman"
+								placeholder="鑷姩濉厖"
+								disabled
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="鍙戠エ鍙风爜锛�" prop="invoiceNo">
+							<el-input
+								v-model="form.invoiceNo"
+								placeholder="璇疯緭鍏�"
+								clearable
+							/>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row :gutter="30">
+					<el-col :span="12">
+						<el-form-item label="寮�绁ㄦ棩鏈�" prop="issueDate">
+							<el-date-picker
+								style="width: 100%"
+								v-model="form.issueDate"
+								type="date"
+								placeholder="璇烽�夋嫨"
+								clearable
+								format="YYYY-MM-DD"
+								value-format="YYYY-MM-DD"
+							/>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row :gutter="30">
+					<el-col :span="12">
+						<el-form-item label="褰曞叆浜�" prop="createUer">
+							<el-input v-model="form.createUer" placeholder="璇疯緭鍏ュ綍鍏ヤ汉" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="褰曞叆鏃ユ湡锛�" prop="createTime">
+							<el-date-picker
+								style="width: 100%"
+								v-model="form.createTime"
+								type="date"
+								placeholder="璇烽�夋嫨"
+								clearable
+							/>
+						</el-form-item>
+					</el-col>
+					
+				</el-row>
+				<el-row>
+					<el-form-item label="浜у搧淇℃伅锛�" prop="entryDate"> </el-form-item>
+				</el-row>
+				<el-table
+					:data="productData"
+					border
+					show-summary
+					:summary-method="summarizeChildrenTable"
+				>
+					<el-table-column
+						align="center"
+						label="搴忓彿"
+						type="index"
+						width="60"
+					/>
+					<el-table-column label="鎵�灞炲悎鍚�" prop="salesContractNo" width="200">
+						<template #default="{ row }">
+							<el-tag type="primary">{{ row.salesContractNo }}</el-tag>
+						</template>
+					</el-table-column>
+					<el-table-column label="浜у搧澶х被" prop="productCategory" />
+					<el-table-column
+						label="瑙勬牸鍨嬪彿"
+						prop="specificationModel"
+						width="150"
+					/>
+					<el-table-column label="鍗曚綅" prop="unit" />
+					<el-table-column label="鏁伴噺" prop="quantity" width="70" />
+					<el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
+					<el-table-column
+						label="鍚◣鍗曚环(鍏�)"
+						prop="taxInclusiveUnitPrice"
+						:formatter="formattedNumber"
 						width="200"
-          />
-          <el-table-column
-            label="鍚◣鎬讳环(鍏�)"
-            prop="taxInclusiveTotalPrice"
-            :formatter="formattedNumber"
+					/>
+					<el-table-column
+						label="鍚◣鎬讳环(鍏�)"
+						prop="taxInclusiveTotalPrice"
+						:formatter="formattedNumber"
 						width="200"
-          />
-          <el-table-column
-            label="涓嶅惈绋庢�讳环(鍏�)"
-            prop="taxExclusiveTotalPrice"
-            :formatter="formattedNumber"
-            width="150"
-          />
-          <el-table-column label="鏈寮�绁ㄦ暟" prop="currentInvoiceNum" width="180">
-            <template #default="scope">
-              <el-input-number :step="0.1" :min="0" style="width: 100%"
+					/>
+					<el-table-column
+						label="涓嶅惈绋庢�讳环(鍏�)"
+						prop="taxExclusiveTotalPrice"
+						:formatter="formattedNumber"
+						width="150"
+					/>
+					<el-table-column label="鏈寮�绁ㄦ暟" prop="currentInvoiceNum" width="180">
+						<template #default="scope">
+							<el-input-number :step="0.1" :min="0" style="width: 100%"
 															 :precision="2"
-                v-model="scope.row.currentInvoiceNum"
-                @change="invoiceNumBlur(scope.row)"
-              ></el-input-number>
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="鏈寮�绁ㄩ噾棰�(鍏�)"
-            prop="currentInvoiceAmount"
-            width="180"
-          >
-            <template #default="scope">
-              <el-input-number :step="0.01" :min="0" style="width: 100%"
+															 v-model="scope.row.currentInvoiceNum"
+															 @change="invoiceNumBlur(scope.row)"
+							></el-input-number>
+						</template>
+					</el-table-column>
+					<el-table-column
+						label="鏈寮�绁ㄩ噾棰�(鍏�)"
+						prop="currentInvoiceAmount"
+						width="180"
+					>
+						<template #default="scope">
+							<el-input-number :step="0.01" :min="0" style="width: 100%"
 															 :precision="2"
-                v-model="scope.row.currentInvoiceAmount"
-                @change="invoiceAmountBlur(scope.row)"
-              ></el-input-number>
-            </template>
-          </el-table-column>
-          <el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum" width="120">
-            <template #default="scope">
-              <el-input
-                type="number"
-                min="0"
-                disabled
-                v-model="scope.row.noInvoiceNum"
-              ></el-input>
-            </template>
-          </el-table-column>
-          <el-table-column
-            label="鏈紑绁ㄩ噾棰�(鍏�)"
-            prop="noInvoiceAmount"
-            width="200"
-          >
-            <template #default="scope">
-              <el-input
-                type="number"
-                min="0"
-                disabled
-                v-model="scope.row.noInvoiceAmount"
-                :formatter="formattedInputNumber"
-                :precision="2"
-                :step="0.01"
-              ></el-input>
-            </template>
-          </el-table-column>
-          <el-table-column label="鐧昏浜�" prop="register" width="100">
-            <!-- <template #default="{ row }">
-              <el-input
-                v-model="row.register"
-                placeholder="璇疯緭鍏ョ櫥璁颁汉"
-                disabled
-              />
-            </template> -->
-          </el-table-column>
-          <el-table-column label="鐧昏鏃ユ湡" prop="registerDate" width="150">
-            <!-- <template #default="{ row }">
-              <el-date-picker
-                style="width: 100%"
-                v-model="row.registerDate"
-                value-format="YYYY-MM-DD"
-                format="YYYY-MM-DD"
-                type="date"
-                placeholder="璇烽�夋嫨"
-                clearable
-                disabled
-              />
-            </template> -->
-          </el-table-column>
-        </el-table>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
+															 v-model="scope.row.currentInvoiceAmount"
+															 @change="invoiceAmountBlur(scope.row)"
+							></el-input-number>
+						</template>
+					</el-table-column>
+					<el-table-column label="鏈紑绁ㄦ暟" prop="noInvoiceNum" width="120">
+						<template #default="scope">
+							<el-input
+								type="number"
+								min="0"
+								disabled
+								v-model="scope.row.noInvoiceNum"
+							></el-input>
+						</template>
+					</el-table-column>
+					<el-table-column
+						label="鏈紑绁ㄩ噾棰�(鍏�)"
+						prop="noInvoiceAmount"
+						width="200"
+					>
+						<template #default="scope">
+							<el-input
+								type="number"
+								min="0"
+								disabled
+								v-model="scope.row.noInvoiceAmount"
+								:formatter="formattedInputNumber"
+								:precision="2"
+								:step="0.01"
+							></el-input>
+						</template>
+					</el-table-column>
+					<el-table-column label="鐧昏浜�" prop="register" width="100">
+						<!-- <template #default="{ row }">
+							<el-input
+								v-model="row.register"
+								placeholder="璇疯緭鍏ョ櫥璁颁汉"
+								disabled
+							/>
+						</template> -->
+					</el-table-column>
+					<el-table-column label="鐧昏鏃ユ湡" prop="registerDate" width="150">
+						<!-- <template #default="{ row }">
+							<el-date-picker
+								style="width: 100%"
+								v-model="row.registerDate"
+								value-format="YYYY-MM-DD"
+								format="YYYY-MM-DD"
+								type="date"
+								placeholder="璇烽�夋嫨"
+								clearable
+								disabled
+							/>
+						</template> -->
+					</el-table-column>
+				</el-table>
+			</el-form>
+		</FormDialog>
+	</div>
 </template>
 
 <script setup>
 import pagination from "@/components/PIMTable/Pagination.vue";
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import { onMounted, ref } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { ElMessageBox } from "element-plus";
 // import {userListNoPage} from "@/api/system/user.js";
 import {
-  getSalesLedgerWithProducts,
-  ledgerListPage,
-  productList,
+	getSalesLedgerWithProducts,
+	ledgerListPage,
+	productList,
 } from "@/api/salesManagement/salesLedger.js";
 import { invoiceRegistrationSave } from "@/api/salesManagement/invoiceRegistration.js";
 import useFormData from "@/hooks/useFormData";
@@ -426,261 +396,377 @@
 const selectedRows = ref([]);
 const tableLoading = ref(false);
 const page = reactive({
-  current: 1,
-  size: 100,
+	current: 1,
+	size: 100,
 });
 const total = ref(0);
 // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
 const operationType = ref("");
 const dialogFormVisible = ref(false);
 const data = reactive({
-  searchForm: {
-    customerName: "",
-    status: false,
-    customerContractNo: undefined, // 瀹㈡埛鍚堝悓鍙�
-    projectName: undefined, // 椤圭洰鍚嶇О
-    createUer: undefined, // 鐧昏浜�
-    issueDate: undefined, // 寮�绁ㄦ棩鏈�
-    createTime: undefined, // 褰曞叆鏃ユ湡锛�
-  },
-  form: {
-    salesLedgerId: "",
-    customerName: "",
-    salesman: "",
-    projectName: "",
-    productData: [],
-    invoiceNo: "",
-    createUer: userStore.nickName,
-    issueDate: dayjs().format("YYYY-MM-DD"),
-  },
-  rules: {
-    salesLedgerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    createUer: [{ required: true, message: "璇烽�夋嫨", trigger: "blur" }],
-    issueDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    invoiceNo: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
-    createTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-  },
+	searchForm: {
+		customerName: "",
+		status: false,
+		customerContractNo: undefined, // 瀹㈡埛鍚堝悓鍙�
+		projectName: undefined, // 椤圭洰鍚嶇О
+		createUer: undefined, // 鐧昏浜�
+		issueDate: undefined, // 寮�绁ㄦ棩鏈�
+		createTime: undefined, // 褰曞叆鏃ユ湡锛�
+		productCategory: "",
+		isInvoice: 1
+	},
+	form: {
+		salesLedgerId: "",
+		customerName: "",
+		salesman: "",
+		projectName: "",
+		productData: [],
+		invoiceNo: "",
+		createUer: userStore.nickName,
+		issueDate: dayjs().format("YYYY-MM-DD"),
+		selectedContractIds: [], // 鏂板锛氬瓨鍌ㄦ墍鏈夐�変腑鐨勫悎鍚孖D
+		isBatch: false // 鏂板锛氭爣璇嗘槸鍚︿负鎵归噺鎿嶄綔
+	},
+	rules: {
+		createUer: [{ required: true, message: "璇烽�夋嫨", trigger: "blur" }],
+		issueDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+		invoiceNo: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+		createTime: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+	},
 });
 const { form, rules } = toRefs(data);
 const { form: searchForm, resetForm } = useFormData(data.searchForm);
 
 const formattedNumber = (row, column, cellValue) => {
-  if (cellValue == 0) {
-    return parseFloat(cellValue).toFixed(2);
-  }
-  if (cellValue) {
-    return parseFloat(cellValue).toFixed(2);
-  } else {
-    return cellValue;
-  }
+	if (cellValue == 0) {
+		return parseFloat(cellValue).toFixed(2);
+	}
+	if (cellValue) {
+		return parseFloat(cellValue).toFixed(2);
+	} else {
+		return cellValue;
+	}
 };
 
 const formattedInputNumber = (value) => {
-  return value ? parseFloat(value).toFixed(2) : 0;
+	return value ? parseFloat(value).toFixed(2) : 0;
 };
 
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1;
-  getList();
+	page.current = 1;
+	getList();
 };
 const paginationChange = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
+	page.current = obj.page;
+	page.size = obj.limit;
+	getList();
 };
 const getList = () => {
-  tableLoading.value = true;
-  ledgerListPage({ ...searchForm, ...page }).then((res) => {
-    tableLoading.value = false;
-    tableData.value = res.records;
-    total.value = res.total;
-    expandedRowKeys.value = [];
-  });
+	tableLoading.value = true;
+	ledgerListPage({ ...searchForm, ...page }).then((res) => {
+		tableLoading.value = false;
+		tableData.value = res.records;
+		total.value = res.total;
+		expandedRowKeys.value = [];
+	});
 };
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
-  console.log("selection", selection);
-  selectedRows.value = selection.filter(
-    (item) => item.salesContractNo !== undefined
-  );
+	console.log("selection", selection);
+	selectedRows.value = selection.filter(
+		(item) => item.salesContractNo !== undefined
+	);
 };
 const expandedRowKeys = ref([]);
 // 灞曞紑琛�
 const expandChange = (row, expandedRows) => {
-  if (expandedRows.length > 0) {
-    expandedRowKeys.value = [];
-    try {
-      productList({ salesLedgerId: row.id, type: 1 }).then((res) => {
-        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) {
-      console.log(error);
-    }
-  } else {
-    expandedRowKeys.value = [];
-  }
+	if (expandedRows.length > 0) {
+		expandedRowKeys.value = [];
+		try {
+			productList({ salesLedgerId: row.id, type: 1 }).then((res) => {
+				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) {
+			console.log(error);
+		}
+	} else {
+		expandedRowKeys.value = [];
+	}
 };
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, [
-    "contractAmount",
-    "invoiceTotal",
-    "noInvoiceAmountTotal",
-  ]);
+	return proxy.summarizeTable(param, [
+		"contractAmount",
+		"invoiceTotal",
+		"noInvoiceAmountTotal",
+	]);
 };
 // 瀛愯〃鍚堣鏂规硶
 const summarizeChildrenTable = (param) => {
-  return proxy.summarizeTable(param, [
-    "taxInclusiveUnitPrice",
-    "taxInclusiveTotalPrice",
-    "taxExclusiveTotalPrice",
-    "invoiceNum",
-    "invoiceAmount",
-    "currentInvoiceAmount",
-    "noInvoiceNum",
-    "noInvoiceAmount",
-    "currentInvoiceNum",
-  ]);
+	return proxy.summarizeTable(param, [
+		"taxInclusiveUnitPrice",
+		"taxInclusiveTotalPrice",
+		"taxExclusiveTotalPrice",
+		"invoiceNum",
+		"invoiceAmount",
+		"currentInvoiceAmount",
+		"noInvoiceNum",
+		"noInvoiceAmount",
+		"currentInvoiceNum",
+	]);
 };
 // 鎵撳紑寮规
 const openForm = () => {
-  // 鍒ゆ柇鏄惁澶氶��
-  if (selectedRows.value.length != 1) {
-    proxy.$modal.msgError("璇烽�夋嫨涓�鏉″悎鍚�");
-    return;
-  }
-  form.value = {};
-  productData.value = [];
-  getSalesLedgerWithProducts({ id: selectedRows.value[0].id }).then((res) => {
-    form.value = { ...res };
-    form.value.createTime = dayjs().format("YYYY-MM-DD");
-    form.value.issueDate = dayjs().format("YYYY-MM-DD");
-    form.value.createUer = userStore.nickName;
-    productData.value = form.value.productData.map((item) => {
-      return item;
-    });
-    dialogFormVisible.value = true;
-    console.log("productData.value ", productData.value);
-  });
+	// 鍒ゆ柇鏄惁閫夋嫨浜嗗悎鍚�
+	if (selectedRows.value.length === 0) {
+		proxy.$modal.msgError("璇疯嚦灏戦�夋嫨涓�鏉″悎鍚�");
+		return;
+	}
+	
+	// 妫�鏌ユ墍鏈夐�夋嫨鐨勫悎鍚屾槸鍚﹀叿鏈夌浉鍚岀殑瀹㈡埛鍚嶇О
+	const firstRow = selectedRows.value[0];
+	const isSameCustomer = selectedRows.value.every(row =>
+		row.customerName === firstRow.customerName
+	);
+	
+	if (!isSameCustomer) {
+		proxy.$modal.msgError("璇烽�夋嫨鐩稿悓瀹㈡埛鍚嶇О鐨勫悎鍚�");
+		return;
+	}
+	
+	// 鍏佽涓嶅悓鐨勯攢鍞悎鍚屽彿鎵归噺澶勭悊锛屾棤闇�妫�鏌ラ噸澶�
+	
+	form.value = {};
+	productData.value = [];
+	
+	// 鍔犺浇鎵�鏈夐�変腑鍚堝悓鐨勪骇鍝佹暟鎹�
+	const promises = selectedRows.value.map(row =>
+		getSalesLedgerWithProducts({ id: row.id })
+	);
+	
+	Promise.all(promises).then(results => {
+		// 鍚堝苟鎵�鏈夊悎鍚岀殑浜у搧鏁版嵁锛屽苟涓烘瘡涓骇鍝佹坊鍔犲搴旂殑鍚堝悓淇℃伅
+		const allProductData = [];
+		results.forEach((result, index) => {
+			const contract = selectedRows.value[index];
+			const contractId = contract.id;
+			if (result.productData) {
+				result.productData.forEach(item => {
+					allProductData.push({
+						...item,
+						id: contractId, // 鏄庣‘璁剧疆鍚堝悓ID
+						salesContractNo: contract.salesContractNo, // 娣诲姞閿�鍞悎鍚屽彿
+						customerName: contract.customerName, // 娣诲姞瀹㈡埛鍚嶇О
+						customerContractNo: contract.customerContractNo // 娣诲姞瀹㈡埛鍚堝悓鍙�
+					});
+				});
+			}
+		});
+		
+		// 璁剧疆琛ㄥ崟鏁版嵁锛堜娇鐢ㄧ涓�涓悎鍚岀殑鍩烘湰淇℃伅锛岄攢鍞悎鍚屽彿鐣欑┖锛�
+		form.value = { ...results[0] };
+		form.value.createTime = dayjs().format("YYYY-MM-DD");
+		form.value.issueDate = dayjs().format("YYYY-MM-DD");
+		form.value.createUer = userStore.nickName;
+		form.value.selectedContractIds = selectedRows.value.map(row => row.id); // 瀛樺偍鎵�鏈夐�変腑鐨勫悎鍚孖D
+		form.value.salesContractNo = ""; // 閿�鍞悎鍚屽彿鐣欑┖锛屽洜涓轰細鍦ㄤ骇鍝佽〃鏍间腑鍒嗗埆鏄剧ず
+		
+		productData.value = allProductData;
+		
+		dialogFormVisible.value = true;
+		console.log("productData.value ", productData.value);
+	});
 };
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate((valid) => {
-    if (valid) {
-      form.value.productData = proxy.HaveJson(productData.value);
-      invoiceRegistrationSave(form.value).then((res) => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        closeDia();
-        getList();
-      });
-    }
-  });
+	proxy.$refs["formRef"].validate((valid) => {
+		if (valid) {
+			// 濡傛灉鏄壒閲忔搷浣滐紝灏嗘墍鏈夊悎鍚岀殑鏁版嵁鏀惧湪涓�涓暟缁勯噷锛屽彧璋冪敤涓�娆℃帴鍙�
+			if (selectedRows.value.length > 1) {
+				// 鍒涘缓鍖呭惈鎵�鏈夊悎鍚屾暟鎹殑鏁扮粍
+				const batchData = selectedRows.value.map(contract => {
+					// 绛涢�夊嚭灞炰簬褰撳墠鍚堝悓鐨勪骇鍝佹暟鎹�
+					const contractProductData = productData.value.filter(item =>
+						item.salesLedgerId === contract.id
+					);
+					
+					// 涓烘瘡涓攢鍞悎鍚屽彿鍒涘缓鐙珛鐨勫璞�
+					return {
+						// 鍩虹琛ㄥ崟鏁版嵁
+						issueDate: form.value.issueDate,
+						createTime: form.value.createTime,
+						createUer: form.value.createUer,
+						invoiceNo: form.value.invoiceNo,
+						
+						// 鍚堝悓瀹為檯淇℃伅
+						id: contract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负salesLedgerId
+						salesContractNo: contract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
+						customerName: contract.customerName, // 浣跨敤瀹為檯鐨勫鎴峰悕绉�
+						customerId: contract.customerId, // 娣诲姞瀹㈡埛ID
+						customerContractNo: contract.customerContractNo, // 浣跨敤瀹為檯鐨勫鎴峰悎鍚屽彿
+						projectName: contract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
+						salesman: contract.salesman, // 浣跨敤瀹為檯鐨勪笟鍔″憳
+						
+						// 浜у搧鏁版嵁
+						productData: proxy.HaveJson(contractProductData),
+						
+						// 鎵归噺鏍囪瘑
+						isBatch: true
+					};
+				});
+				
+				// 鍙皟鐢ㄤ竴娆℃帴鍙o紝浼犻�掑寘鍚墍鏈夊悎鍚屾暟鎹殑鏁扮粍
+				invoiceRegistrationSave(batchData).then(() => {
+					proxy.$modal.msgSuccess("鎵归噺鏂板鎴愬姛");
+					closeDia();
+					getList();
+				});
+			} else {
+				// 鍗曚釜鍚堝悓鎻愪氦閫昏緫 - 涔熶互鏁扮粍褰㈠紡浼犻��
+				const singleContract = selectedRows.value[0];
+				const singleFormArray = [
+					{
+						// 鍩虹琛ㄥ崟鏁版嵁
+						issueDate: form.value.issueDate,
+						createTime: form.value.createTime,
+						createUer: form.value.createUer,
+						invoiceNo: form.value.invoiceNo,
+						
+						// 鍚堝悓瀹為檯淇℃伅
+						id: singleContract.id, // 浣跨敤id浣滀负瀛楁鍚嶏紝鍊间负salesLedgerId
+						salesContractNo: singleContract.salesContractNo, // 浣跨敤瀹為檯鐨勯攢鍞悎鍚屽彿
+						customerName: singleContract.customerName, // 浣跨敤瀹為檯鐨勫鎴峰悕绉�
+						customerId: singleContract.customerId, // 娣诲姞瀹㈡埛ID
+						customerContractNo: singleContract.customerContractNo, // 浣跨敤瀹為檯鐨勫鎴峰悎鍚屽彿
+						projectName: singleContract.projectName, // 浣跨敤瀹為檯鐨勯」鐩悕绉�
+						salesman: singleContract.salesman, // 浣跨敤瀹為檯鐨勪笟鍔″憳
+						
+						// 浜у搧鏁版嵁
+						productData: proxy.HaveJson(productData.value),
+						
+						// 鎵归噺鏍囪瘑
+						isBatch: false
+					}
+				];
+				invoiceRegistrationSave(singleFormArray).then((res) => {
+					proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+					closeDia();
+					getList();
+				});
+			}
+		}
+	});
 };
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef");
-  dialogFormVisible.value = false;
+	proxy.resetForm("formRef");
+	dialogFormVisible.value = false;
 };
 // 瀵煎嚭
 const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      proxy.download("/invoiceRegistration/export", {}, "寮�绁ㄧ櫥璁颁俊鎭�.xlsx");
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
+	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+		confirmButtonText: "纭",
+		cancelButtonText: "鍙栨秷",
+		type: "warning",
+	})
+		.then(() => {
+			proxy.download("/invoiceRegistration/export", {}, "寮�绁ㄧ櫥璁颁俊鎭�.xlsx");
+		})
+		.catch(() => {
+			proxy.$modal.msg("宸插彇娑�");
+		});
 };
 
 // 瀵煎嚭閿�鍞彴璐�
 const handleExport = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      proxy.download("/sales/ledger/exportOne", { ...searchForm, ...page }, "寮�绁ㄧ櫥璁�.xlsx");
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
+	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+		confirmButtonText: "纭",
+		cancelButtonText: "鍙栨秷",
+		type: "warning",
+	})
+		.then(() => {
+			proxy.download("/sales/ledger/exportOne", { ...searchForm, ...page }, "寮�绁ㄧ櫥璁�.xlsx");
+		})
+		.catch(() => {
+			proxy.$modal.msg("宸插彇娑�");
+		});
 };
 
 //鏈寮�绁ㄥけ鐒︽搷浣�
 const invoiceNumBlur = (row) => {
-  if (!row.currentInvoiceNum) {
-    row.currentInvoiceNum = 0;
-  }
-  if (row.currentInvoiceNum > row.tempNoInvoiceNum) {
-    proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
-    row.currentInvoiceNum = 0;
-  }
-  // 璁$畻鏈寮�绁ㄩ噾棰�
-  row.currentInvoiceAmount = (
-    row.currentInvoiceNum * row.taxInclusiveUnitPrice
-  ).toFixed(2);
-  // 璁$畻鏈紑绁ㄦ暟
-  row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
-    2
-  );
-  // 璁$畻鏈紑绁ㄩ噾棰�
-  row.noInvoiceAmount = (
-    row.tempnoInvoiceAmount - row.currentInvoiceAmount
-  ).toFixed(2);
+	if (!row.currentInvoiceNum) {
+		row.currentInvoiceNum = 0;
+	}
+	if (row.currentInvoiceNum > row.tempNoInvoiceNum) {
+		proxy.$modal.msgWarning("鏈寮�绁ㄦ暟涓嶅緱澶т簬鏈紑绁ㄦ暟");
+		row.currentInvoiceNum = 0;
+	}
+	// 璁$畻鏈寮�绁ㄩ噾棰�
+	row.currentInvoiceAmount = (
+		row.currentInvoiceNum * row.taxInclusiveUnitPrice
+	).toFixed(2);
+	// 璁$畻鏈紑绁ㄦ暟
+	row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
+		2
+	);
+	// 璁$畻鏈紑绁ㄩ噾棰�
+	row.noInvoiceAmount = (
+		row.tempnoInvoiceAmount - row.currentInvoiceAmount
+	).toFixed(2);
 };
 // 鏈寮�绁ㄩ噾棰濆け鐒︽搷浣�
 const invoiceAmountBlur = (row) => {
-  if (!row.currentInvoiceAmount) {
-    row.currentInvoiceAmount = 0;
-  }
-  // 璁$畻鏄惁瓒呰繃寮�绁ㄦ�婚噾棰�
-  if (row.currentInvoiceAmount > row.tempnoInvoiceAmount) {
-    proxy.$modal.msgWarning("鏈寮�绁ㄩ噾棰濅笉寰楀ぇ浜庢湭寮�绁ㄩ噾棰�");
-    row.currentInvoiceAmount = 0;
-  }
-  // 璁$畻鏈寮�绁ㄦ暟
-  row.currentInvoiceNum = (
-    row.currentInvoiceAmount / row.taxInclusiveUnitPrice
-  ).toFixed(2);
-  console.log("row.currentInvoiceNum ", row.currentInvoiceNum);
-  console.log(" row.originalNoInvoiceNum  ", row.originalNoInvoiceNum);
-  // 璁$畻鏈紑绁ㄦ暟
-  row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
-    2
-  );
-  // 璁$畻鏈紑绁ㄩ噾棰�
-  row.noInvoiceAmount = (
-    row.tempnoInvoiceAmount - row.currentInvoiceAmount
-  ).toFixed(2);
+	if (!row.currentInvoiceAmount) {
+		row.currentInvoiceAmount = 0;
+	}
+	// 璁$畻鏄惁瓒呰繃寮�绁ㄦ�婚噾棰�
+	if (row.currentInvoiceAmount > row.tempnoInvoiceAmount) {
+		proxy.$modal.msgWarning("鏈寮�绁ㄩ噾棰濅笉寰楀ぇ浜庢湭寮�绁ㄩ噾棰�");
+		row.currentInvoiceAmount = 0;
+	}
+	// 璁$畻鏈寮�绁ㄦ暟
+	row.currentInvoiceNum = (
+		row.currentInvoiceAmount / row.taxInclusiveUnitPrice
+	).toFixed(2);
+	console.log("row.currentInvoiceNum ", row.currentInvoiceNum);
+	console.log(" row.originalNoInvoiceNum  ", row.originalNoInvoiceNum);
+	// 璁$畻鏈紑绁ㄦ暟
+	row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
+		2
+	);
+	// 璁$畻鏈紑绁ㄩ噾棰�
+	row.noInvoiceAmount = (
+		row.tempnoInvoiceAmount - row.currentInvoiceAmount
+	).toFixed(2);
 };
 
 onMounted(() => {
-  getList();
+	getList();
 });
 </script>
 
 <style scoped lang="scss">
 .table_list {
-  margin-top: unset;
+	margin-top: unset;
 }
 .flex {
-  display: flex;
+	display: flex;
 }
 .justify-between {
-  justify-content: space-between;
+	justify-content: space-between;
 }
 ::v-deep(.el-checkbox__label) {
-  font-weight: bold;
+	font-weight: bold;
 }
 </style>
+
+
+
+
+
diff --git a/src/views/salesManagement/orderManagement/index.vue b/src/views/salesManagement/orderManagement/index.vue
index aac840f..8bd157d 100644
--- a/src/views/salesManagement/orderManagement/index.vue
+++ b/src/views/salesManagement/orderManagement/index.vue
@@ -89,7 +89,7 @@
     </el-card>
 
     <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
-    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="700px">
+    <FormDialog v-model="dialogVisible" :title="dialogTitle" :width="'700px'" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
         <el-row :gutter="20">
           <el-col :span="12">
@@ -169,7 +169,7 @@
     </el-dialog>
 
     <!-- 璁㈠崟瀹℃牳瀵硅瘽妗� -->
-    <el-dialog v-model="reviewDialogVisible" title="璁㈠崟瀹℃牳" width="500px">
+    <FormDialog v-model="reviewDialogVisible" title="璁㈠崟瀹℃牳" :width="'500px'" @close="reviewDialogVisible = false" @confirm="saveReview" @cancel="reviewDialogVisible = false">
       <el-form label-width="100px">
         <el-form-item label="璁㈠崟鍙�">
           <span>{{ currentOrder.orderNo }}</span>
@@ -199,7 +199,7 @@
     </el-dialog>
 
     <!-- 璁㈠崟杞崟瀵硅瘽妗� -->
-    <el-dialog v-model="transferDialogVisible" title="璁㈠崟杞崟" width="500px">
+    <FormDialog v-model="transferDialogVisible" title="璁㈠崟杞崟" :width="'500px'" @close="transferDialogVisible = false" @confirm="saveTransfer" @cancel="transferDialogVisible = false">
       <el-form label-width="100px">
         <el-form-item label="璁㈠崟鍙�">
           <span>{{ currentOrder.orderNo }}</span>
@@ -218,13 +218,7 @@
           <el-input type="textarea" v-model="transferReason" rows="3" placeholder="璇疯緭鍏ヨ浆鍗曞師鍥�"></el-input>
         </el-form-item>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="transferDialogVisible = false">鍙� 娑�</el-button>
-          <el-button type="primary" @click="saveTransfer">纭� 瀹�</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
@@ -233,6 +227,7 @@
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { Plus, Search } from '@element-plus/icons-vue'
 import Pagination from '@/components/PIMTable/Pagination.vue'
+import FormDialog from '@/components/Dialog/FormDialog.vue'
 
 // 鍝嶅簲寮忔暟鎹�
 const loading = ref(false)
diff --git a/src/views/salesManagement/paymentShipping/index.vue b/src/views/salesManagement/paymentShipping/index.vue
index 0bcfd87..32edfde 100644
--- a/src/views/salesManagement/paymentShipping/index.vue
+++ b/src/views/salesManagement/paymentShipping/index.vue
@@ -98,7 +98,7 @@
     </el-card>
 
     <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
-    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="700px">
+    <FormDialog v-model="dialogVisible" :title="dialogTitle" :width="'700px'" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
         <el-row :gutter="20">
           <el-col :span="12">
@@ -188,7 +188,7 @@
     </el-dialog>
 
     <!-- 浠樻瀵硅瘽妗� -->
-    <el-dialog v-model="paymentDialogVisible" title="璁㈠崟浠樻" width="500px">
+    <FormDialog v-model="paymentDialogVisible" title="璁㈠崟浠樻" :width="'500px'" @close="paymentDialogVisible = false" @confirm="savePayment" @cancel="paymentDialogVisible = false">
       <el-form label-width="100px">
         <el-form-item label="璁㈠崟鍙�">
           <span>{{ currentRecord.orderNo }}</span>
@@ -214,16 +214,10 @@
           <el-input type="textarea" v-model="paymentRemark" rows="3" placeholder="璇疯緭鍏ヤ粯娆惧娉�"></el-input>
         </el-form-item>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="paymentDialogVisible = false">鍙� 娑�</el-button>
-          <el-button type="primary" @click="savePayment">纭� 瀹�</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
 
     <!-- 鍙戣揣瀵硅瘽妗� -->
-    <el-dialog v-model="shippingDialogVisible" title="璁㈠崟鍙戣揣" width="500px">
+    <FormDialog v-model="shippingDialogVisible" title="璁㈠崟鍙戣揣" :width="'500px'" @close="shippingDialogVisible = false" @confirm="saveShipping" @cancel="shippingDialogVisible = false">
       <el-form label-width="100px">
         <el-form-item label="璁㈠崟鍙�">
           <span>{{ currentRecord.orderNo }}</span>
@@ -257,13 +251,7 @@
           <el-input type="textarea" v-model="shippingRemark" rows="3" placeholder="璇疯緭鍏ュ彂璐у娉�"></el-input>
         </el-form-item>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="shippingDialogVisible = false">鍙� 娑�</el-button>
-          <el-button type="primary" @click="saveShipping">纭� 瀹�</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
@@ -273,6 +261,7 @@
 import { Plus, Search } from '@element-plus/icons-vue'
 import {listPage,add,update,deletePaymentShipping} from "@/api/salesManagement/paymentShipping.js"
 import Pagination from '@/components/PIMTable/Pagination.vue'
+import FormDialog from '@/components/Dialog/FormDialog.vue'
 
 const total = ref(0)
 onMounted(() => {
diff --git a/src/views/salesManagement/receiptPayment/index.vue b/src/views/salesManagement/receiptPayment/index.vue
index 26f089b..40e6f14 100644
--- a/src/views/salesManagement/receiptPayment/index.vue
+++ b/src/views/salesManagement/receiptPayment/index.vue
@@ -13,24 +13,6 @@
                 prefix-icon="Search"
               />
             </el-form-item>
-            <el-form-item label="瀹㈡埛鍚堝悓鍙�">
-              <el-input
-                v-model="searchForm.customerContractNo"
-                placeholder="璇疯緭鍏�"
-                @change="handleQuery"
-                clearable
-                prefix-icon="Search"
-              />
-            </el-form-item>
-            <el-form-item label="椤圭洰鍚嶇О">
-              <el-input
-                v-model="searchForm.projectName"
-                placeholder="璇疯緭鍏�"
-                @change="handleQuery"
-                clearable
-                prefix-icon="Search"
-              />
-            </el-form-item>
             <el-form-item>
               <el-checkbox
                 v-model="searchForm.status"
@@ -152,23 +134,10 @@
           width="240"
         />
         <el-table-column
-          label="瀹㈡埛鍚堝悓鍙�"
-          prop="customerContractNo"
-          show-overflow-tooltip
-          width="240"
-
-        />
-        <el-table-column
           label="瀹㈡埛鍚嶇О"
           prop="customerName"
           show-overflow-tooltip
           width="240"
-        />
-        <el-table-column
-          label="椤圭洰鍚嶇О"
-          prop="projectName"
-          show-overflow-tooltip
-          width="340"
         />
         <el-table-column
           label="鍥炴鐘舵��"
@@ -188,35 +157,28 @@
           width="100"
         />
         <el-table-column
-          label="鍙戠エ鍙�"
-          prop="invoiceNo"
+          label="瑙勬牸鍨嬪彿"
+          prop="specificationModel"
           show-overflow-tooltip
-          width="200"
-        />
-        <el-table-column
-          label="鍙戠エ閲戦(鍏�)"
-          prop="invoiceTotal"
-          show-overflow-tooltip
-          :formatter="formattedNumber"
           width="200"
         />
         <el-table-column label="绋庣巼(%)" prop="taxRate" show-overflow-tooltip />
         <el-table-column
-          label="鍥炴閲戦(鍏�)"
-          prop="receiptPaymentAmountTotal"
+          label="宸插洖娆鹃噾棰�(鍏�)"
+          prop="invoiceTotal"
           show-overflow-tooltip
           :formatter="formattedNumber"
           width="200"
         />
         <el-table-column
           label="寰呭洖娆鹃噾棰�(鍏�)"
-          prop="noReceiptAmount"
+          prop="pendingInvoiceTotal"
           show-overflow-tooltip
           width="200"
         >
           <template #default="{ row, column }">
             <el-text type="danger">
-              {{ formattedNumber(row, column, row.noReceiptAmount) }}
+              {{ formattedNumber(row, column, row.pendingInvoiceTotal) }}
             </el-text>
           </template>
         </el-table-column>
@@ -230,145 +192,108 @@
         @pagination="paginationChange"
       />
     </div>
-    <el-dialog
+    <FormDialog
       v-model="dialogFormVisible"
       title="鏂板鍥炴椤甸潰"
-      width="70%"
+      :width="'90%'"
       @close="closeDia"
+      @confirm="submitForm"
+      @cancel="closeDia"
     >
-      <el-form
-        :model="form"
-        label-width="140px"
-        label-position="top"
-        :rules="rules"
-        ref="formRef"
+      <el-table
+        v-if="forms.length"
+        :data="forms"
+        border
+        style="width: 100%"
+        size="small"
       >
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesContractNo">
-              <el-input
-                v-model="form.salesContractNo"
-                placeholder="鑷姩濉厖"
-                disabled
+        <el-table-column type="index" label="搴忓彿" width="50" align="center"/>
+        <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" show-overflow-tooltip />
+        <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" show-overflow-tooltip />
+				<el-table-column
+					label="浜у搧澶х被"
+					prop="productCategory"
+					show-overflow-tooltip
+					width="100"
+				/>
+				<el-table-column
+					label="瑙勬牸鍨嬪彿"
+					prop="specificationModel"
+					show-overflow-tooltip
+					width="200"
+				/>
+        <el-table-column label="绋庣巼(%)" width="110">
+          <template #default="{ row }">
+            <el-input v-model="row.taxRate" disabled />
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="寰呭洖娆鹃噾棰�(鍏�)"
+          prop="pendingInvoiceTotal"
+          show-overflow-tooltip
+          width="170"
+        >
+          <template #default="{ row, column }">
+            <el-text type="danger">
+              {{ formattedNumber(row, column, row.pendingInvoiceTotal) }}
+            </el-text>
+          </template>
+        </el-table-column>
+        <el-table-column label="鏈鍥炴閲戦(鍏�)" width="180">
+          <template #default="{ row }">
+            <el-input-number
+              v-model="row.receiptPaymentAmount"
+              :step="0.01"
+              :min="0"
+              :max="Number(row.pendingInvoiceTotal || 0)"
+              :precision="2"
+              style="width: 100%"
+              placeholder="璇疯緭鍏�"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鍥炴褰㈠紡" width="160">
+          <template #default="{ row }">
+            <el-select v-model="row.receiptPaymentType" placeholder="璇烽�夋嫨" clearable>
+              <el-option
+                v-for="opt in receipt_payment_type"
+                :key="opt.value"
+                :label="opt.label"
+                :value="opt.value"
               />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerName">
-              <el-input
-                v-model="form.customerName"
-                placeholder="鑷姩濉厖"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ鍙凤細" prop="invoiceNo">
-              <el-input
-                v-model="form.invoiceNo"
-                placeholder="鑷姩濉厖"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ閲戦(鍏�)锛�" prop="invoiceTotal">
-              <el-input
-                type="number"
-                v-model="form.invoiceTotal"
-                placeholder="鑷姩濉厖"
-                :step="0.01"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="绋庣巼锛�" prop="taxRate">
-              <el-input
-                type="number"
-                v-model="form.taxRate"
-                placeholder="鑷姩濉厖"
-                :step="0.01"
-                disabled
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鏈鍥炴閲戦锛�" prop="receiptPaymentAmount">
-              <el-input-number :step="0.01" :min="0" style="width: 100%"
-															 :precision="2"
-                v-model="form.receiptPaymentAmount"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍥炴褰㈠紡锛�" prop="receiptPaymentType">
-              <el-select
-                v-model="form.receiptPaymentType"
-                placeholder="璇烽�夋嫨"
-                clearable
-              >
-                <el-option
-                  v-for="item in receipt_payment_type"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
-					<el-col :span="12">
-						<el-form-item label="鍥炴鏃ユ湡锛�" prop="receiptPaymentDate">
-							<el-date-picker
-								style="width: 100%"
-								v-model="form.receiptPaymentDate"
-								value-format="YYYY-MM-DD"
-								format="YYYY-MM-DD"
-								type="date"
-								placeholder="璇烽�夋嫨"
-								clearable
-							/>
-						</el-form-item>
-					</el-col>
-        </el-row>
-        <el-row :gutter="30">
-					<el-col :span="12">
-						<el-form-item label="鐧昏浜猴細" prop="registrant">
-							<el-input
-								v-model="form.registrant"
-								placeholder="璇疯緭鍏�"
-								clearable
-								disabled
-							/>
-						</el-form-item>
-					</el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
+            </el-select>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍥炴鏃ユ湡" width="170">
+          <template #default="{ row }">
+            <el-date-picker
+              v-model="row.receiptPaymentDate"
+              value-format="YYYY-MM-DD"
+              format="YYYY-MM-DD"
+              type="date"
+              placeholder="璇烽�夋嫨"
+              style="width: 100%"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="鐧昏浜�" width="140">
+          <template #default="{ row }">
+            <el-input v-model="row.registrant" />
+          </template>
+        </el-table-column>
+      </el-table>
+      <div v-else class="empty-tip">璇烽�夋嫨闇�瑕佸洖娆剧殑璁板綍</div>
+    </FormDialog>
   </div>
 </template>
 
 <script setup>
 import pagination from "@/components/PIMTable/Pagination.vue";
-import { onMounted, ref } from "vue";
+import FormDialog from '@/components/Dialog/FormDialog.vue';
+import { onMounted, ref, reactive, getCurrentInstance } from "vue";
 import {
   receiptPaymentSaveOrUpdate,
   bindInvoiceNoRegPage,
-  invoiceInfo,
   receiptPaymentHistoryListNoPage,
   receiptPaymentDel,
 } from "../../../api/salesManagement/receiptPayment.js";
@@ -381,6 +306,7 @@
 const tableData = ref([]);
 const selectedRows = ref([]);
 const tableLoading = ref(false);
+const forms = ref([]);
 const page = reactive({
   current: 1,
   size: 100,
@@ -395,44 +321,15 @@
     searchText: "",
     status: true,
     customerName: "",
-    customerContractNo: "",
-    projectName: "",
-  },
-  form: {
-    salesContractNo: "",
-    customerName: "",
-    invoiceNo: "",
-    invoiceTotal: "",
-    taxRate: "",
-    receiptPaymentAmount: "",
-    receiptPaymentType: "",
-    registrant: "",
-    receiptPaymentDate: "",
-  },
-  rules: {
-    salesContractNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    customerName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    invoiceNo: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    invoiceTotal: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    receiptPaymentAmount: [
-      { required: true, message: "璇烽�夋嫨", trigger: "change" },
-    ],
-    receiptPaymentType: [
-      { required: true, message: "璇烽�夋嫨", trigger: "change" },
-    ],
-    registrant: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    receiptPaymentDate: [
-      { required: true, message: "璇烽�夋嫨", trigger: "change" },
-    ],
+    specificationModel: "",
   },
 });
-const { form, rules } = toRefs(data);
-const { form: searchForm, resetForm } = useFormData(data.searchForm);
+const { form: searchForm } = useFormData(data.searchForm);
 const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
 
 const formattedNumber = (row, column, cellValue) => {
-  return parseFloat(cellValue).toFixed(2);
+  const val = Number(cellValue ?? 0);
+  return Number.isFinite(val) ? val.toFixed(2) : "0.00";
 };
 
 const getStatusTagType = (statusName = '') => {
@@ -501,15 +398,13 @@
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
   console.log("selection", selection);
-  selectedRows.value = selection.filter(
-    (item) => item.customerContractNo !== null
-  );
+  selectedRows.value = selection;
 };
 // 涓昏〃鍚堣鏂规硶
 const summarizeMainTable = (param) => {
   return proxy.summarizeTable(
     param,
-    ["invoiceTotal", "receiptPaymentAmountTotal", "noReceiptAmount"],
+    ["receiptPaymentAmountTotal", "noReceiptAmount"],
     {
       ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
       futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
@@ -522,38 +417,72 @@
 };
 // 鎵撳紑寮规
 const openForm = () => {
-  form.value = {};
-  if (selectedRows.value.length !== 1) {
-    proxy.$modal.msgError("璇烽�夋嫨涓�鏉℃暟鎹�");
+  if (selectedRows.value.length === 0) {
+    proxy.$modal.msgError("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
     return;
   }
-  if (selectedRows.value[0].noReceiptAmount == 0) {
-    proxy.$modal.msgWarning("鏃犻渶鍐嶅洖娆�");
+  const validRows = selectedRows.value.filter((item) => item.noReceiptAmount !== 0);
+  if (validRows.length === 0) {
+    proxy.$modal.msgWarning("鎵�閫夎褰曞潎鏃犻渶鍥炴");
     return;
   }
-  invoiceInfo({ id: selectedRows.value[0].id }).then((res) => {
-    form.value = { ...res.data };
-    form.value.invoiceLedgerId = form.value.id;
-    form.value.id = "";
-    form.value.registrant = userStore.nickName;
-  });
+  forms.value = validRows.map((row) => ({
+    salesContractNo: row.salesContractNo || "",
+    customerName: row.customerName || "",
+    productCategory: row.productCategory || "",
+    specificationModel: row.specificationModel || "",
+    pendingInvoiceTotal: Number(row.pendingInvoiceTotal || 0),
+    taxRate: row.taxRate ?? "",
+    receiptPaymentAmount: "",
+    receiptPaymentType: "",
+    registrant: userStore.nickName,
+    receiptPaymentDate: "",
+    invoiceLedgerId: row.id,
+    salesLedgerId: row.salesLedgerId,
+    salesLedgerProductId: row.id,
+  }));
   dialogFormVisible.value = true;
 };
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate((valid) => {
-    if (valid) {
-      receiptPaymentSaveOrUpdate(form.value).then((res) => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        closeDia();
-        getList();
-      });
+  if (forms.value.length === 0) {
+    proxy.$modal.msgError("璇烽�夋嫨鍥炴璁板綍");
+    return;
+  }
+  for (let i = 0; i < forms.value.length; i++) {
+    const item = forms.value[i];
+    const pendingAmount = Number(item.pendingInvoiceTotal || 0);
+    const currentAmount = Number(item.receiptPaymentAmount);
+    if (!item.receiptPaymentAmount && item.receiptPaymentAmount !== 0) {
+      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇峰~鍐欏洖娆鹃噾棰漙);
+      return;
     }
+    if (currentAmount > pendingAmount) {
+      proxy.$modal.msgError(
+        `绗� ${i + 1} 鏉★細鍥炴閲戦涓嶈兘瓒呰繃寰呭洖娆鹃噾棰濓紙寰呭洖娆撅細${pendingAmount.toFixed(
+          2
+        )}锛塦
+      );
+      return;
+    }
+    if (!item.receiptPaymentType) {
+      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇烽�夋嫨鍥炴褰㈠紡`);
+      return;
+    }
+    if (!item.receiptPaymentDate) {
+      proxy.$modal.msgError(`绗� ${i + 1} 鏉★細璇烽�夋嫨鍥炴鏃ユ湡`);
+      return;
+    }
+  }
+  receiptPaymentSaveOrUpdate(forms.value).then(() => {
+    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+    closeDia();
+    getList();
   });
 };
 // 鍏抽棴寮规
 const closeDia = () => {
-  proxy.resetForm("formRef");
+  forms.value = [];
   dialogFormVisible.value = false;
 };
 
@@ -638,4 +567,9 @@
   justify-content: space-between;
   margin-bottom: 10px;
 }
+.empty-tip {
+  text-align: center;
+  padding: 20px 0;
+  color: #909399;
+}
 </style>
diff --git a/src/views/salesManagement/receiptPaymentHistory/index.vue b/src/views/salesManagement/receiptPaymentHistory/index.vue
index 589d567..7bcb433 100644
--- a/src/views/salesManagement/receiptPaymentHistory/index.vue
+++ b/src/views/salesManagement/receiptPaymentHistory/index.vue
@@ -10,24 +10,6 @@
           :prefix-icon="Search"
         />
       </el-form-item>
-      <el-form-item label="瀹㈡埛鍚堝悓鍙�">
-        <el-input
-          v-model="searchForm.customerContractNo"
-          placeholder="杈撳叆瀹㈡埛鍚堝悓鍙�"
-          @change="handleQuery"
-          clearable
-          :prefix-icon="Search"
-        />
-      </el-form-item>
-      <el-form-item label="椤圭洰鍚嶇О">
-        <el-input
-          v-model="searchForm.projectName"
-          placeholder="杈撳叆椤圭洰鍚嶇О"
-          @change="handleQuery"
-          clearable
-          :prefix-icon="Search"
-        />
-      </el-form-item>
       <el-form-item label="鍥炴鏃ユ湡">
         <el-date-picker
           v-model="searchForm.receiptPaymentDate"
@@ -66,7 +48,7 @@
 </template>
 
 <script setup>
-import { ref, reactive, getCurrentInstance } from "vue";
+import { ref, reactive, getCurrentInstance, onMounted } from "vue";
 import { Search } from "@element-plus/icons-vue";
 import { receiptPaymentHistoryListPage } from "@/api/salesManagement/receiptPayment.js";
 import useFormData from "@/hooks/useFormData";
@@ -80,11 +62,6 @@
     width:240
   },
   {
-    label: "瀹㈡埛鍚堝悓鍙�",
-    prop: "customerContractNo",
-    width:240
-  },
-  {
     label: "鍥炴鏃ユ湡",
     prop: "receiptPaymentDate",
     width:100
@@ -93,11 +70,6 @@
     label: "瀹㈡埛鍚嶇О",
     prop: "customerName",
     width:240
-  },
-  {
-    label: "椤圭洰鍚嶇О",
-    prop: "projectName",
-    width:200
   },
   {
     label: "鍥炴閲戦锛堝厓锛�",
@@ -149,8 +121,6 @@
   receiptPaymentDate: [],
   receiptPaymentDateStart: undefined,
   receiptPaymentDateEnd: undefined,
-  customerContractNo: undefined,
-  projectName: undefined,
 });
 const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
 const isShowSummarySon = ref(true);
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index 5b5268e..6fa5859 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -6,16 +6,8 @@
           <el-input v-model="searchForm.customerName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
             @change="handleQuery" />
         </el-form-item>
-        <el-form-item label="瀹㈡埛鍚堝悓鍙凤細">
-          <el-input v-model="searchForm.customerContractNo" 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="褰曞叆鏃ユ湡锛�">
@@ -41,7 +33,7 @@
       </div>
       <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
         :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" show-summary style="width: 100%"
-        :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)">
+        :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 21em)">
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column type="expand">
           <template #default="props">
@@ -60,14 +52,29 @@
         </el-table-column>
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
         <el-table-column label="閿�鍞悎鍚屽彿" prop="salesContractNo" width="180" show-overflow-tooltip />
-        <el-table-column label="瀹㈡埛鍚堝悓鍙�" prop="customerContractNo" width="180" show-overflow-tooltip />
         <el-table-column label="瀹㈡埛鍚嶇О" prop="customerName" width="300" show-overflow-tooltip />
         <el-table-column label="涓氬姟鍛�" prop="salesman" width="100" show-overflow-tooltip />
-        <el-table-column label="椤圭洰鍚嶇О" prop="projectName" width="180" show-overflow-tooltip />
-        <el-table-column label="浠樻鏂瑰紡" prop="paymentMethod" show-overflow-tooltip />
         <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="220" show-overflow-tooltip
           :formatter="formattedNumber" />
         <el-table-column label="褰曞叆浜�" prop="entryPersonName" width="100" show-overflow-tooltip />
+				<el-table-column label="鐢熶骇鐘舵��" prop="productionStatus" width="100" show-overflow-tooltip >
+					<template #default="scope">
+						<div>
+							<el-tag v-if="scope.row.productionStatus === '宸插畬鎴�'" type="success">宸插畬鎴�</el-tag>
+							<el-tag v-if="scope.row.productionStatus === '鐢熶骇涓�'" type="warning">鐢熶骇涓�</el-tag>
+							<el-tag v-if="scope.row.productionStatus === '鏈紑濮�'" type="danger">鏈紑濮�</el-tag>
+						</div>
+					</template>
+				</el-table-column>
+        <el-table-column label="鍙戣揣杞︾墝" prop="shippingCarNumber" width="120" show-overflow-tooltip>
+          <template #default="scope">
+            <div>
+              <div v-if="scope.row.shippingCarNumber">{{ scope.row.shippingCarNumber }}</div>
+              <el-tag v-else type="warning">鏈彂璐�</el-tag>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍙戣揣鏃ユ湡" prop="shippingDate" width="120" show-overflow-tooltip />
         <el-table-column label="褰曞叆鏃ユ湡" prop="entryDate" width="120" show-overflow-tooltip />
         <el-table-column label="绛捐鏃ユ湡" prop="executionDate" width="120" show-overflow-tooltip />
         <el-table-column fixed="right" label="鎿嶄綔" min-width="200" align="center">
@@ -75,15 +82,21 @@
             <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">缂栬緫</el-button>
 <!--            <el-button link type="primary" size="small" @click="openForm('view', scope.row)">璇︽儏</el-button>-->
             <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">闄勪欢</el-button>
-            <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)">鍙戣揣</el-button>
+            <el-button v-if="!scope.row.shippingCarNumber" link type="primary" size="small" @click="openDeliveryForm(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>
-    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'" width="70%"
-      @close="closeDia">
+    <FormDialog 
+      v-model="dialogFormVisible" 
+      :title="operationType === 'add' ? '鏂板閿�鍞彴璐﹂〉闈�' : '缂栬緫閿�鍞彴璐﹂〉闈�'" 
+      :width="'70%'"
+      :operation-type="operationType"
+      @close="closeDia"
+      @confirm="submitForm"
+      @cancel="closeDia">
       <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
         <el-row :gutter="30">
           <el-col :span="12">
@@ -93,7 +106,9 @@
           </el-col>
           <el-col :span="12">
             <el-form-item label="涓氬姟鍛橈細" prop="salesman">
-              <el-select v-model="form.salesman" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'">
+              <el-select v-model="form.salesman"
+												 filterable
+                         :reserve-keyword="false" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'">
                 <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
                   :value="item.nickName" />
               </el-select>
@@ -102,26 +117,14 @@
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="瀹㈡埛鍚堝悓鍙凤細" prop="customerContractNo">
-              <el-input v-model="form.customerContractNo" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'"/>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
             <el-form-item label="瀹㈡埛鍚嶇О锛�" prop="customerId">
-              <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'">
+              <el-select v-model="form.customerId" placeholder="璇烽�夋嫨" clearable :disabled="operationType === 'view'" filterable>
                 <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id">
                   {{
                     item.customerName + "鈥斺��" + item.taxpayerIdentificationNumber
                   }}
                 </el-option>
               </el-select>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О锛�" prop="projectName">
-              <el-input v-model="form.projectName" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
             </el-form-item>
           </el-col>
 					<el-col :span="12">
@@ -134,7 +137,10 @@
         <el-row :gutter="30">
 					<el-col :span="12">
 						<el-form-item label="褰曞叆浜猴細" prop="entryPerson">
-							<el-select v-model="form.entryPerson" placeholder="璇烽�夋嫨" clearable @change="changs" disabled>
+							<el-select v-model="form.entryPerson"
+												 filterable
+                         default-first-option
+                         :reserve-keyword="false" placeholder="璇烽�夋嫨" clearable @change="changs">
 								<el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
 							</el-select>
 						</el-form-item>
@@ -146,13 +152,7 @@
             </el-form-item>
           </el-col>
         </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="浠樻鏂瑰紡">
-              <el-input v-model="form.paymentMethod" placeholder="璇疯緭鍏�" clearable :disabled="operationType === 'view'" />
-            </el-form-item>
-          </el-col>
-        </el-row>
+
         <el-row>
           <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
             <el-button v-if="operationType !== 'view'" type="primary" @click="openProductForm('add')">娣诲姞</el-button>
@@ -202,15 +202,15 @@
           </el-col>
         </el-row>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
-          <el-button @click="closeDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
-    <el-dialog v-model="productFormVisible" :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'" width="40%"
-      @close="closeProductDia">
+    </FormDialog>
+    <FormDialog 
+      v-model="productFormVisible" 
+      :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'" 
+      :width="'40%'"
+      :operation-type="productOperationType"
+      @close="closeProductDia"
+      @confirm="submitProduct"
+      @cancel="closeProductDia">
       <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
         <el-row :gutter="30">
           <el-col :span="24">
@@ -226,7 +226,7 @@
         <el-row :gutter="30">
           <el-col :span="24">
             <el-form-item label="瑙勬牸鍨嬪彿锛�" prop="productModelId">
-              <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable @change="getProductModel">
+              <el-select v-model="productForm.productModelId" placeholder="璇烽�夋嫨" clearable @change="getProductModel" filterable>
                 <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
               </el-select>
             </el-form-item>
@@ -287,13 +287,7 @@
           </el-col>
         </el-row>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button type="primary" @click="submitProduct">纭</el-button>
-          <el-button @click="closeProductDia">鍙栨秷</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
 		<!-- 鎵撳嵃棰勮寮圭獥 -->
 		<el-dialog
 			v-model="printPreviewVisible"
@@ -328,12 +322,15 @@
 										<span class="value">{{ formatDate(item.createTime) }}</span>
 									</div>
 									<div>
-										
-										<span class="label">瀹㈡埛鍚嶇О锛�</span>
-										<span class="value">{{ item.customerName || '寮犵埍鏈�' }}</span>
+										<span class="label">鍙戣揣杞︾墝鍙凤細</span>
+										<span class="value">{{ item.shippingCarNumber }}</span>
 									</div>
 								</div>
 								<div class="info-row">
+									<div>
+										<span class="label">瀹㈡埛鍚嶇О锛�</span>
+										<span class="value">{{ item.customerName || '寮犵埍鏈�' }}</span>
+									</div>
 									<span class="label">鍗曞彿锛�</span>
 									<span class="value">{{ item.salesContractNo }}</span>
 								</div>
@@ -459,20 +456,21 @@
 import pagination from "@/components/PIMTable/Pagination.vue";
 import {onMounted, ref} from "vue";
 import { addShippingInfo } from "@/api/salesManagement/deliveryLedger.js";
-import {ElMessage, ElMessageBox} from "element-plus";
+import { ElMessageBox } from "element-plus";
 import useUserStore from "@/store/modules/user";
 import { userListNoPage } from "@/api/system/user.js";
 import FileListDialog from '@/components/Dialog/FileListDialog.vue';
+import FormDialog from '@/components/Dialog/FormDialog.vue';
 import {
-  ledgerListPage,
-  productList,
-  customerList,
-  addOrUpdateSalesLedger,
-  getSalesLedgerWithProducts,
-  delLedger,
-  addOrUpdateSalesLedgerProduct,
-  delProduct,
-  delLedgerFile, getProductInventory,
+	ledgerListPage,
+	productList,
+	customerList,
+	addOrUpdateSalesLedger,
+	getSalesLedgerWithProducts,
+	delLedger,
+	addOrUpdateSalesLedgerProduct,
+	delProduct,
+	delLedgerFile, getProductInventory,
 } from "@/api/salesManagement/salesLedger.js";
 import { modelList, productTreeList } from "@/api/basicData/product.js";
 import useFormData from "@/hooks/useFormData.js";
@@ -503,9 +501,7 @@
 const data = reactive({
   searchForm: {
     customerName: "", // 瀹㈡埛鍚嶇О
-    customerContractNo: "", // 瀹㈡埛鍚堝悓缂栧彿
     salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
-    projectName: "", // 椤圭洰鍚嶇О
     entryDate: null, // 褰曞叆鏃ユ湡
     entryDateStart: undefined,
     entryDateEnd: undefined,
@@ -513,23 +509,16 @@
   form: {
     salesContractNo: "",
     salesman: "",
-    customerContractNo: "",
     customerId: "",
-    projectName: "",
     entryPerson: "",
     entryDate: "",
     maintenanceTime: "",
     productData: [],
     executionDate: "",
-    paymentMethod: "",
   },
   rules: {
     salesman: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    customerContractNo: [
-      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-    ],
     customerId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    projectName: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
     entryPerson: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     entryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
     executionDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
@@ -620,7 +609,11 @@
 // 鏌ヨ鍒楄〃
 /** 鎼滅储鎸夐挳鎿嶄綔 */
 const handleQuery = () => {
-  page.current = 1;
+  // 鍙湁鍦ㄧ偣鍑绘悳绱㈡寜閽椂鎵嶉噸缃〉鐮佸埌绗竴椤�
+  // 閬垮厤琛ㄥ崟瀛楁change浜嬩欢骞叉壈鍒嗛〉
+  if (arguments.length === 0) {
+    page.current = 1;
+  }
 	expandedRowKeys.value = [];
   getList();
 };
@@ -632,7 +625,11 @@
 const getList = () => {
   tableLoading.value = true;
   const { entryDate, ...rest } = searchForm;
-  ledgerListPage({ ...rest, ...page })
+  // 灏嗚寖鍥存棩鏈熷瓧娈典紶閫掔粰鍚庣
+  const params = { ...rest, ...page };
+  // 绉婚櫎褰曞叆鏃ユ湡鐨勯粯璁ゅ�艰缃紝鍙繚鐣欒寖鍥存棩鏈熷瓧娈�
+  delete params.entryDate;
+  ledgerListPage(params)
     .then((res) => {
       tableLoading.value = false;
       tableData.value = res.records;
@@ -662,7 +659,6 @@
   });
 };
 const getProductModel = (value) => {
-  console.log("value", value);
   const index = modelOptions.value.findIndex((item) => item.id === value);
   if (index !== -1) {
     productForm.value.specificationModel = modelOptions.value[index].model;
@@ -756,7 +752,12 @@
     customerOption.value = res;
   });
   form.value.entryPerson = userStore.id;
-  if (type !== "add") {
+  if (type === "add") {
+    // 鏂板鏃惰缃綍鍏ユ棩鏈熶负褰撳ぉ
+    form.value.entryDate = getCurrentDate();
+    // 绛捐鏃ユ湡榛樿涓哄綋澶�
+    form.value.executionDate = getCurrentDate();
+  } else {
     currentId.value = row.id;
     getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
       form.value = { ...res };
diff --git a/src/views/salesManagement/salesQuotation/index.vue b/src/views/salesManagement/salesQuotation/index.vue
index cefc769..0296517 100644
--- a/src/views/salesManagement/salesQuotation/index.vue
+++ b/src/views/salesManagement/salesQuotation/index.vue
@@ -61,13 +61,6 @@
             楼{{ scope.row.totalAmount.toFixed(2) }}
           </template>
         </el-table-column>
-<!--        <el-table-column prop="status" label="鎶ヤ环鐘舵��" width="100">-->
-<!--          <template #default="scope">-->
-<!--            <el-tag :type="getStatusType(scope.row.status)">-->
-<!--              {{ scope.row.status }}-->
-<!--            </el-tag>-->
-<!--          </template>-->
-<!--        </el-table-column>-->
         <el-table-column label="鎿嶄綔" width="250" fixed="right" align="center">
           <template #default="scope">
             <el-button link type="primary" @click="handleView(scope.row)">鏌ョ湅</el-button>
@@ -88,7 +81,7 @@
     </el-card>
 
     <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
-    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="1300px" :close-on-click-modal="false">
+    <FormDialog v-model="dialogVisible" :title="dialogTitle" width="80%" :close-on-click-modal="false" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
         <!-- 鍩烘湰淇℃伅 -->
         <el-card class="form-card" shadow="never">
@@ -152,18 +145,6 @@
                 </el-select>
               </el-form-item>
             </el-col>
-            <el-col :span="12">
-              <el-form-item label="浜よ揣鏈�" prop="deliveryPeriod">
-                <el-date-picker
-                  v-model="form.deliveryPeriod"
-                  type="date"
-                  placeholder="閫夋嫨浜よ揣鏈�"
-                  style="width: 100%"
-                  format="YYYY-MM-DD"
-                  value-format="YYYY-MM-DD"
-                />
-              </el-form-item>
-            </el-col>
           </el-row>
         </el-card>
 
@@ -207,11 +188,6 @@
 								</el-select>
               </template>
             </el-table-column>
-            <el-table-column prop="quantity" label="鏁伴噺">
-              <template #default="scope">
-                <el-input-number v-model="scope.row.quantity" :min="1" :precision="0" style="width: 100%" />
-              </template>
-            </el-table-column>
             <el-table-column prop="unit" label="鍗曚綅">
               <template #default="scope">
                 <el-input v-model="scope.row.unit" placeholder="鍗曚綅" />
@@ -219,12 +195,7 @@
             </el-table-column>
             <el-table-column prop="unitPrice" label="鍗曚环">
               <template #default="scope">
-                <el-input-number v-model="scope.row.unitPrice" :min="0" :precision="2" style="width: 100%" @change="calculateAmount(scope.row)" />
-              </template>
-            </el-table-column>
-            <el-table-column prop="amount" label="閲戦" width="120">
-              <template #default="scope">
-                <span>楼{{ scope.row.amount.toFixed(2) }}</span>
+                <el-input-number v-model="scope.row.unitPrice" :min="0" :precision="2" style="width: 100%" />
               </template>
             </el-table-column>
             <el-table-column label="鎿嶄綔" width="80" align="center">
@@ -233,47 +204,6 @@
               </template>
             </el-table-column>
           </el-table>
-        </el-card>
-
-        <!-- 璐圭敤淇℃伅 -->
-        <el-card class="form-card" shadow="never">
-          <template #header>
-            <span class="card-title">璐圭敤淇℃伅</span>
-          </template>
-          <el-row :gutter="20">
-            <el-col :span="8">
-              <el-form-item label="浜у搧灏忚">
-                <el-input-number v-model="form.subtotal" :precision="2" :min="0" style="width: 100%" readonly />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="杩愯垂">
-                <el-input-number v-model="form.freight" :precision="2" :min="0" style="width: 100%" @change="calculateTotal" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="鍏朵粬璐圭敤">
-                <el-input-number v-model="form.otherFee" :precision="2" :min="0" style="width: 100%" @change="calculateTotal" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row :gutter="20">
-            <el-col :span="8">
-              <el-form-item label="鎶樻墸鐜�(%)">
-                <el-input-number v-model="form.discountRate" :precision="2" :min="0" :max="100" style="width: 100%" @change="calculateTotal" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="鎶樻墸閲戦">
-                <el-input-number v-model="form.discountAmount" :precision="2" :min="0" style="width: 100%" readonly />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="鎶ヤ环鎬婚">
-                <el-input-number v-model="form.totalAmount" :precision="2" :min="0" style="width: 100%" readonly />
-              </el-form-item>
-            </el-col>
-          </el-row>
         </el-card>
 
         <!-- 澶囨敞淇℃伅 -->
@@ -286,13 +216,7 @@
           </el-form-item>
         </el-card>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
-          <el-button type="primary" @click="handleSubmit">纭� 瀹�</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
 
     <!-- 鏌ョ湅璇︽儏瀵硅瘽妗� -->
     <el-dialog v-model="viewDialogVisible" title="鎶ヤ环璇︽儏" width="800px">
@@ -303,7 +227,6 @@
         <el-descriptions-item label="鎶ヤ环鏃ユ湡">{{ currentQuotation.quotationDate }}</el-descriptions-item>
         <el-descriptions-item label="鏈夋晥鏈熻嚦">{{ currentQuotation.validDate }}</el-descriptions-item>
         <el-descriptions-item label="浠樻鏂瑰紡">{{ currentQuotation.paymentMethod }}</el-descriptions-item>
-        <el-descriptions-item label="浜よ揣鏈�">{{ currentQuotation.deliveryPeriod }}</el-descriptions-item>
 <!--        <el-descriptions-item label="鎶ヤ环鐘舵��">-->
 <!--          <el-tag :type="getStatusType(currentQuotation.status)">{{ currentQuotation.status }}</el-tag>-->
 <!--        </el-descriptions-item>-->
@@ -317,16 +240,10 @@
         <el-table :data="currentQuotation.products" border style="width: 100%">
           <el-table-column prop="product" label="浜у搧鍚嶇О" />
           <el-table-column prop="specification" label="瑙勬牸鍨嬪彿" />
-          <el-table-column prop="quantity" label="鏁伴噺" />
           <el-table-column prop="unit" label="鍗曚綅" />
           <el-table-column prop="unitPrice" label="鍗曚环">
             <template #default="scope">
               楼{{ scope.row.unitPrice.toFixed(2) }}
-            </template>
-          </el-table-column>
-          <el-table-column prop="amount" label="閲戦">
-            <template #default="scope">
-              楼{{ scope.row.amount.toFixed(2) }}
             </template>
           </el-table-column>
         </el-table>
@@ -345,6 +262,7 @@
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { Search } from '@element-plus/icons-vue'
 import Pagination from '@/components/PIMTable/Pagination.vue'
+import FormDialog from '@/components/Dialog/FormDialog.vue'
 import {getQuotationList,addQuotation,updateQuotation,deleteQuotation} from '@/api/salesManagement/salesQuotation.js'
 import {userListNoPage} from "@/api/system/user.js";
 import {customerList} from "@/api/salesManagement/salesLedger.js";
@@ -377,7 +295,6 @@
   quotationDate: '',
   validDate: '',
   paymentMethod: '',
-  deliveryPeriod: '',
   status: '鑽夌',
   remark: '',
   products: [],
@@ -394,8 +311,7 @@
   salesperson: [{ required: true, message: '璇烽�夋嫨涓氬姟鍛�', trigger: 'change' }],
   quotationDate: [{ required: true, message: '璇烽�夋嫨鎶ヤ环鏃ユ湡', trigger: 'change' }],
   validDate: [{ required: true, message: '璇烽�夋嫨鏈夋晥鏈�', trigger: 'change' }],
-  paymentMethod: [{ required: true, message: '璇烽�夋嫨浠樻鏂瑰紡', trigger: 'change' }],
-  deliveryPeriod: [{ required: true, message: '璇烽�夋嫨浜よ揣鏈�', trigger: 'change' }]
+  paymentMethod: [{ required: true, message: '璇烽�夋嫨浠樻鏂瑰紡', trigger: 'change' }]
 }
 const userList = ref([]);
 const customerOption = ref([]);
@@ -545,7 +461,6 @@
     quotationDate: row.quotationDate || '',
     validDate: row.validDate || '',
     paymentMethod: row.paymentMethod || '',
-    deliveryPeriod: row.deliveryPeriod || '',
     status: row.status || '',
     remark: row.remark || '',
     products: row.products ? row.products.map(product => ({
@@ -574,7 +489,6 @@
   form.quotationDate = row.quotationDate || ''
   form.validDate = row.validDate || ''
   form.paymentMethod = row.paymentMethod || ''
-  form.deliveryPeriod = row.deliveryPeriod || ''
   form.status = row.status || '鑽夌'
   form.remark = row.remark || ''
   form.products = row.products ? row.products.map(product => ({
@@ -625,7 +539,6 @@
   form.quotationDate = ''
   form.validDate = ''
   form.paymentMethod = ''
-  form.deliveryPeriod = ''
   form.status = '鑽夌'
   form.remark = ''
   form.products = []
@@ -746,7 +659,6 @@
         quotationDate: item.quotationDate || '',
         validDate: item.validDate || '',
         paymentMethod: item.paymentMethod || '',
-        deliveryPeriod: item.deliveryPeriod || '',
         status: item.status || '鑽夌',
         remark: item.remark || '',
         products: item.products ? item.products.map(product => ({
diff --git a/src/views/salesManagement/salespersonManagement/index.vue b/src/views/salesManagement/salespersonManagement/index.vue
index e597538..e0094ec 100644
--- a/src/views/salesManagement/salespersonManagement/index.vue
+++ b/src/views/salesManagement/salespersonManagement/index.vue
@@ -86,7 +86,7 @@
     </el-card>
 
     <!-- 鏂板/缂栬緫瀵硅瘽妗� -->
-    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px">
+    <FormDialog v-model="dialogVisible" :title="dialogTitle" :width="'600px'" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
       <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
         <el-row :gutter="20">
           <el-col :span="12">
@@ -147,16 +147,10 @@
           </el-col>
         </el-row>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
-          <el-button type="primary" @click="handleSubmit">纭� 瀹�</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
 
     <!-- 鏉冮檺璁剧疆瀵硅瘽妗� -->
-    <el-dialog v-model="permissionDialogVisible" title="鏉冮檺璁剧疆" width="500px">
+    <FormDialog v-model="permissionDialogVisible" title="鏉冮檺璁剧疆" :width="'500px'" @close="permissionDialogVisible = false" @confirm="savePermissions" @cancel="permissionDialogVisible = false">
       <el-form label-width="100px">
         <el-form-item label="涓氬姟鍛樺鍚�">
           <span>{{ currentSalesperson.name }}</span>
@@ -172,13 +166,7 @@
           </el-checkbox-group>
         </el-form-item>
       </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="permissionDialogVisible = false">鍙� 娑�</el-button>
-          <el-button type="primary" @click="savePermissions">纭� 瀹�</el-button>
-        </div>
-      </template>
-    </el-dialog>
+    </FormDialog>
   </div>
 </template>
 
@@ -188,6 +176,7 @@
 import {listPage,add,update,deleteSalespersonManagement} from '@/api/salesManagement/salespersonManagement.js'
 import { Plus, Search } from '@element-plus/icons-vue'
 import Pagination from '@/components/PIMTable/Pagination.vue'
+import FormDialog from '@/components/Dialog/FormDialog.vue'
 
 const salespersonList = ref([])
 const total = ref(0)

--
Gitblit v1.9.3