From 9b0aed26bc400fdb1b6d62084346df06993a6ebf Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期二, 13 一月 2026 17:53:27 +0800
Subject: [PATCH] 开票登记后,下拉框展示的数据有误

---
 src/views/procurementManagement/procurementLedger/index.vue       | 3263 ++++++++++++++++----------------
 src/views/inventoryManagement/issueManagement/index.vue           |    3 
 src/views/procurementManagement/invoiceEntry/components/Modal.vue | 1259 ++++++------
 src/views/salesManagement/invoiceRegistration/index.vue           | 1485 +++++++-------
 4 files changed, 3,016 insertions(+), 2,994 deletions(-)

diff --git a/src/views/inventoryManagement/issueManagement/index.vue b/src/views/inventoryManagement/issueManagement/index.vue
index 719f072..fa130b8 100644
--- a/src/views/inventoryManagement/issueManagement/index.vue
+++ b/src/views/inventoryManagement/issueManagement/index.vue
@@ -376,6 +376,9 @@
     if (num <= 0 || num > currentRowNum.value) {
       return proxy.$modal.msgWarning("璇峰~鍏ユ湁鏁堟暟瀛�");
     }
+    if (!form.value.nickName) {
+      return proxy.$modal.msgWarning("璇烽�夋嫨鎿嶄綔浜�");
+    }
     proxy.$refs["formRef"].validate(valid => {
       if (valid && currentRowId.value) {
         const typeMap = { production: 2, purchase: 1 };
diff --git a/src/views/procurementManagement/invoiceEntry/components/Modal.vue b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
index 475eabc..2282f01 100644
--- a/src/views/procurementManagement/invoiceEntry/components/Modal.vue
+++ b/src/views/procurementManagement/invoiceEntry/components/Modal.vue
@@ -1,638 +1,669 @@
 <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 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="{
+  <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
+                      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-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">
-				纭
-			</el-button>
-			<el-button @click="closeModal">鍙栨秷</el-button>
-		</template>
-	</el-dialog>
+                        :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">
+        纭
+      </el-button>
+      <el-button @click="closeModal">鍙栨秷</el-button>
+    </template>
+  </el-dialog>
 </template>
 
 <script setup>
-import { ref, getCurrentInstance } from "vue";
-import { defineEmits } from 'vue';
-import { useModal } from "@/hooks/useModal";
-import useFormData from "@/hooks/useFormData";
-import FileUpload from "@/components/Upload/FileUpload.vue";
-import {
-	getPurchaseNoById,
-	getInfo,
-	addOrUpdateRegistration,
-} from "@/api/procurementManagement/invoiceEntry.js";
-import { getPurchaseById } from "@/api/procurementManagement/procurementLedger.js";
-import { getToken } from "@/utils/auth";
-import useUserStore from "@/store/modules/user";
-import dayjs from "dayjs";
+  import { ref, getCurrentInstance } from "vue";
+  import { defineEmits } from "vue";
+  import { useModal } from "@/hooks/useModal";
+  import useFormData from "@/hooks/useFormData";
+  import FileUpload from "@/components/Upload/FileUpload.vue";
+  import {
+    getPurchaseNoById,
+    getInfo,
+    addOrUpdateRegistration,
+  } from "@/api/procurementManagement/invoiceEntry.js";
+  import { getPurchaseById } from "@/api/procurementManagement/procurementLedger.js";
+  import { getToken } from "@/utils/auth";
+  import useUserStore from "@/store/modules/user";
+  import dayjs from "dayjs";
 
-defineOptions({
-	name: "鏉ョエ鐧昏妯℃�佹",
-});
+  defineOptions({
+    name: "鏉ョエ鐧昏妯℃�佹",
+  });
 
-const userStore = useUserStore();
-const action = import.meta.env.VITE_APP_BASE_API + "/file/upload";
-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: [], // 鏂囦欢
-});
+  const userStore = useUserStore();
+  const action = import.meta.env.VITE_APP_BASE_API + "/file/upload";
+  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: [], // 鏂囦欢
+  });
 
-const selectedContracts = ref([]); // 瀛樺偍閫変腑鐨勫悎鍚屾暟鎹�
+  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" }],
-});
+  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" }],
+  });
 
-const {
-	id,
-	visible,
-	loading: modalLoading,
-	openModal,
-	modalOptions,
-	handleConfirm,
-	closeModal,
-} = useModal({
-	title: "鏉ョエ鐧昏",
-});
+  const {
+    id,
+    visible,
+    loading: modalLoading,
+    openModal,
+    modalOptions,
+    handleConfirm,
+    closeModal,
+  } = useModal({
+    title: "鏉ョエ鐧昏",
+  });
 
-const emit = defineEmits(['refreshList']);
+  const emit = defineEmits(["refreshList"]);
 
-const columns = [
-	{
-		label: "浜у搧澶х被",
-		prop: "productCategory",
-		width: 120,
-	},
-	{
-		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",
-		width: 100,
-	},
-	{
-		label: "鏈潵绁ㄩ噾棰�(鍏�)",
-		prop: "futureTicketsAmount",
-		width: 200,
-	},
-];
-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.invoiceAmount = 0;
-			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;
-			
-			form.productData = allProductData;
-			
-			// 瀛樺偍閫変腑鐨勫悎鍚屾暟鎹�
-			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) => {
-	return proxy.summarizeTable(param, [
-		"taxInclusiveUnitPrice",
-		"taxInclusiveTotalPrice",
-		"taxExclusiveTotalPrice",
-		"ticketsNum",
-		"ticketsAmount",
-		"ticketsAmountRef",
-		"futureTickets",
-		"futureTicketsAmount",
-	]);
-};
-//鏈鏉ョエ鏁板け鐒︽搷浣�
-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();
-};
+  const columns = [
+    {
+      label: "浜у搧澶х被",
+      prop: "productCategory",
+      width: 120,
+    },
+    {
+      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",
+      width: 100,
+    },
+    {
+      label: "鏈潵绁ㄩ噾棰�(鍏�)",
+      prop: "futureTicketsAmount",
+      width: 200,
+    },
+  ];
+  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
+      );
 
-// 鏈鏉ョエ閲戦澶辩劍鎿嶄綔
-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 (!isSameSupplier) {
+        proxy.$modal.msgError("璇烽�夋嫨鐩稿悓渚涘簲鍟嗗悕绉扮殑鍚堝悓");
+        return;
+      }
 
-const calculateinvoiceAmount = () => {
-	let invoiceAmountTotal = 0;
-	form.productData.forEach((item) => {
-		if (item.ticketsAmount) {
-			invoiceAmountTotal += Number(item.ticketsAmount);
-		}
-	});
-	form.invoiceAmount = invoiceAmountTotal.toFixed(2);
-};
+      // 鍏佽涓嶅悓鐨勯噰璐悎鍚屽彿鎵归噺澶勭悊锛屾棤闇�妫�鏌ラ噸澶�
 
-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);
-};
+      // 娓呯┖琛ㄥ崟鏁版嵁
+      Object.keys(form).forEach(key => {
+        if (key !== "productData") {
+          form[key] = undefined;
+        }
+      });
+      form.productData = [];
 
-const uploadSuccess = (response) => {
-	form.tempFileIds.push(response.data.tempId);
-	console.log(form);
-};
+      // 鍔犺浇鎵�鏈夐�変腑鍚堝悓鐨勪骇鍝佹暟鎹�
+      const promises = selectedRows.map(row => getInfo({ id: row.id }));
 
-const removeFile = (file) => {
-	const { tempId } = file.response.data;
-	form.tempFileIds = form.tempFileIds.filter((item) => item !== tempId);
-};
+      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, // 娣诲姞椤圭洰鍚嶇О
+              });
+            });
+          }
+        });
 
-const closeAndRefresh = () => {
-	closeModal();
-	emit('refreshList');
-};
+        // 璁剧疆琛ㄥ崟鏁版嵁锛堜娇鐢ㄧ涓�涓悎鍚岀殑鍩烘湰淇℃伅锛岄噰璐悎鍚屽彿鐣欑┖锛�
+        form.purchaseLedgerNo = ""; // 閲囪喘鍚堝悓鍙风暀绌猴紝鍥犱负浼氬湪浜у搧琛ㄦ牸涓垎鍒樉绀�
+        form.invoiceAmount = 0;
+        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;
 
-const submitForm = () => {
-	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("鐧昏澶辫触");
-					});
-				}
-		}
-	});
-};
+        form.productData = allProductData;
 
-defineExpose({
-	open,
-	closeAndRefresh,
-});
+        // 瀛樺偍閫変腑鐨勫悎鍚屾暟鎹�
+        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 => {
+    return proxy.summarizeTable(param, [
+      "taxInclusiveUnitPrice",
+      "taxInclusiveTotalPrice",
+      "taxExclusiveTotalPrice",
+      "ticketsNum",
+      "ticketsAmount",
+      "ticketsAmountRef",
+      "futureTickets",
+      "futureTicketsAmount",
+    ]);
+  };
+  //鏈鏉ョエ鏁板け鐒︽搷浣�
+  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();
+  };
+
+  // 鏈鏉ョエ閲戦澶辩劍鎿嶄綔
+  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();
+  };
+
+  const calculateinvoiceAmount = () => {
+    let invoiceAmountTotal = 0;
+    form.productData.forEach(item => {
+      if (item.ticketsAmount) {
+        invoiceAmountTotal += Number(item.ticketsAmount);
+      }
+    });
+    form.invoiceAmount = invoiceAmountTotal.toFixed(2);
+  };
+
+  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);
+  };
+
+  const removeFile = file => {
+    const { tempId } = file.response.data;
+    form.tempFileIds = form.tempFileIds.filter(item => item !== tempId);
+  };
+
+  const closeAndRefresh = () => {
+    closeModal();
+    emit("refreshList");
+  };
+  const processProductData = products => {
+    return products.map(product => {
+      return {
+        ...product,
+        futureTickets: product.futureTickets
+          ? Number(Number(product.futureTickets).toFixed(2))
+          : 0,
+        futureTicketsAmount: product.futureTicketsAmount
+          ? Number(Number(product.futureTicketsAmount).toFixed(2))
+          : 0,
+        ticketsNum: product.ticketsNum
+          ? Number(Number(product.ticketsNum).toFixed(2))
+          : 0,
+        ticketsAmount: product.ticketsAmount
+          ? Number(Number(product.ticketsAmount).toFixed(2))
+          : 0,
+      };
+    });
+  };
+  const submitForm = () => {
+    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
+            );
+            const processedProductData = processProductData(contractProductData);
+            // 涓烘瘡涓噰璐悎鍚屽垱寤虹嫭绔嬬殑瀵硅薄
+            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(processedProductData),
+
+              // 鎵归噺鏍囪瘑
+              isBatch: true,
+              type: 4,
+            };
+          });
+
+          // 鍙皟鐢ㄤ竴娆℃帴鍙o紝浼犻�掑寘鍚墍鏈夊悎鍚屾暟鎹殑鏁扮粍
+          modalLoading.value = true;
+          console.log(batchData, "batchData");
+
+          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 processedProductData = processProductData(form.productData);
+          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(processedProductData),
+
+              // 鎵归噺鏍囪瘑
+              isBatch: false,
+              type: 4,
+            },
+          ];
+
+          modalLoading.value = true;
+          console.log(singleFormArray, "singleFormArray");
+
+          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,
+  });
 </script>
 
 <style lang="scss" scoped></style>
diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 80e0cc7..191dfe1 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -2,477 +2,433 @@
   <div class="app-container">
     <div class="search_form">
       <div>
-        <el-form :model="searchForm" :inline="true">
+        <el-form :model="searchForm"
+                 :inline="true">
           <el-form-item label="渚涘簲鍟嗗悕绉帮細">
-            <el-input v-model="searchForm.supplierName" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+            <el-input v-model="searchForm.supplierName"
+                      placeholder="璇疯緭鍏�"
+                      clearable
+                      prefix-icon="Search"
                       @change="handleQuery" />
           </el-form-item>
           <el-form-item label="閲囪喘鍚堝悓鍙凤細">
-            <el-input
-                v-model="searchForm.purchaseContractNumber"
-                style="width: 240px"
-                placeholder="璇疯緭鍏�"
-                @change="handleQuery"
-                clearable
-                :prefix-icon="Search"
-            />
+            <el-input v-model="searchForm.purchaseContractNumber"
+                      style="width: 240px"
+                      placeholder="璇疯緭鍏�"
+                      @change="handleQuery"
+                      clearable
+                      :prefix-icon="Search" />
           </el-form-item>
           <el-form-item label="閿�鍞悎鍚屽彿锛�">
-            <el-input v-model="searchForm.salesContractNo" placeholder="璇疯緭鍏�" clearable prefix-icon="Search"
+            <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"
+            <el-input v-model="searchForm.projectName"
+                      placeholder="璇疯緭鍏�"
+                      clearable
+                      prefix-icon="Search"
                       @change="handleQuery" />
           </el-form-item>
           <el-form-item label="褰曞叆鏃ユ湡锛�">
-            <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange"
-                            placeholder="璇烽�夋嫨" clearable @change="changeDaterange" />
+            <el-date-picker v-model="searchForm.entryDate"
+                            value-format="YYYY-MM-DD"
+                            format="YYYY-MM-DD"
+                            type="daterange"
+                            placeholder="璇烽�夋嫨"
+                            clearable
+                            @change="changeDaterange" />
           </el-form-item>
           <el-form-item>
-            <el-button type="primary" @click="handleQuery"> 鎼滅储 </el-button>
+            <el-button type="primary"
+                       @click="handleQuery"> 鎼滅储 </el-button>
           </el-form-item>
         </el-form>
       </div>
-
     </div>
     <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 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>
+        <el-button type="danger"
+                   plain
+                   @click="handleDelete">鍒犻櫎</el-button>
       </div>
-      <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 - 19em)"
-        :row-class-name="tableRowClassName"
-      >
-        <el-table-column align="center" type="selection" width="55" />
+      <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 - 19em)"
+                :row-class-name="tableRowClassName">
+        <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 :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>
           </template>
         </el-table-column>
-        <el-table-column align="center" label="搴忓彿" type="index" width="60" />
-        <el-table-column
-          label="閲囪喘鍚堝悓鍙�"
-          prop="purchaseContractNumber"
-          width="200"
-          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="璁㈠崟鐘舵��" width="100" align="center">
+        <el-table-column align="center"
+                         label="搴忓彿"
+                         type="index"
+                         width="60" />
+        <el-table-column label="閲囪喘鍚堝悓鍙�"
+                         prop="purchaseContractNumber"
+                         width="200"
+                         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="璁㈠崟鐘舵��"
+                         width="100"
+                         align="center">
           <template #default="scope">
-            <el-tag v-if="scope.row.isInvalid" type="danger" size="small">澶辨晥</el-tag>
-            <el-tag v-else type="success" size="small">姝e父</el-tag>
+            <el-tag v-if="scope.row.isInvalid"
+                    type="danger"
+                    size="small">澶辨晥</el-tag>
+            <el-tag v-else
+                    type="success"
+                    size="small">姝e父</el-tag>
           </template>
         </el-table-column>
-        <el-table-column
-            label="椤圭洰鍚嶇О"
-            prop="projectName"
-            width="420"
-            show-overflow-tooltip
-        />
-        <el-table-column
-            label="瀹℃壒鐘舵��"
-            prop="approvalStatus"
-            width="200"
-            show-overflow-tooltip
-        >
+        <el-table-column label="椤圭洰鍚嶇О"
+                         prop="projectName"
+                         width="420"
+                         show-overflow-tooltip />
+        <el-table-column label="瀹℃壒鐘舵��"
+                         prop="approvalStatus"
+                         width="200"
+                         show-overflow-tooltip>
           <template #default="scope">
-            <el-tag
-                size="small"
-            >
+            <el-tag size="small">
               {{ approvalStatusText[scope.row.approvalStatus] || '鏈煡鐘舵��' }}
             </el-tag>
           </template>
         </el-table-column>
-				<el-table-column
-					label="绛捐鏃ユ湡"
-					prop="executionDate"
-					width="100"
-					show-overflow-tooltip
-				/>
-        <el-table-column
-          label="浠樻鏂瑰紡"
-          width="100"
-          prop="paymentMethod"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="鍚堝悓閲戦(鍏�)"
-          prop="contractAmount"
-           width="200"
-          show-overflow-tooltip
-          :formatter="formattedNumber"
-        />
-        <el-table-column
-          label="褰曞叆浜�"
-          prop="recorderName"
-           width="120"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          label="褰曞叆鏃ユ湡"
-          prop="entryDate"
-           width="100"
-          show-overflow-tooltip
-        />
-        <el-table-column
-          fixed="right"
-          label="鎿嶄綔"
-          width="180"
-          align="center"
-        >
+        <el-table-column label="绛捐鏃ユ湡"
+                         prop="executionDate"
+                         width="100"
+                         show-overflow-tooltip />
+        <el-table-column label="浠樻鏂瑰紡"
+                         width="100"
+                         prop="paymentMethod"
+                         show-overflow-tooltip />
+        <el-table-column label="鍚堝悓閲戦(鍏�)"
+                         prop="contractAmount"
+                         width="200"
+                         show-overflow-tooltip
+                         :formatter="formattedNumber" />
+        <el-table-column label="褰曞叆浜�"
+                         prop="recorderName"
+                         width="120"
+                         show-overflow-tooltip />
+        <el-table-column label="褰曞叆鏃ユ湡"
+                         prop="entryDate"
+                         width="100"
+                         show-overflow-tooltip />
+        <el-table-column fixed="right"
+                         label="鎿嶄綔"
+                         width="180"
+                         align="center">
           <template #default="scope">
-            <el-button
-              link
-              type="primary"
-              size="small"
-              @click="openForm('edit', scope.row)"
-              >缂栬緫</el-button
-            >
-            <el-button
-              link
-              type="success"
-              size="small"
-              @click="showQRCode(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="openForm('edit', scope.row)">缂栬緫</el-button>
+            <el-button link
+                       type="success"
+                       size="small"
+                       @click="showQRCode(scope.row)">鐢熸垚浜岀淮鐮�</el-button>
+            <el-button link
+                       type="primary"
+                       size="small"
+                       @click="downLoadFile(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"
-      />
+      <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"
-    >
-      <el-form
-        :model="form"
-        label-width="140px"
-        label-position="top"
-        :rules="rules"
-        ref="formRef"
-      >
+    <el-dialog v-model="dialogFormVisible"
+               :title="operationType === 'add' ? '鏂板閲囪喘鍙拌处椤甸潰' : '缂栬緫閲囪喘鍙拌处椤甸潰'"
+               width="70%"
+               @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="purchaseContractNumber">
-              <el-input
-                v-model="form.purchaseContractNumber"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
+            <el-form-item label="閲囪喘鍚堝悓鍙凤細"
+                          prop="purchaseContractNumber">
+              <el-input v-model="form.purchaseContractNumber"
+                        placeholder="璇疯緭鍏�"
+                        clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="閿�鍞悎鍚屽彿锛�" prop="salesLedgerId">
-              <el-select
-                v-model="form.salesLedgerId"
-                placeholder="璇烽�夋嫨"
-								filterable
-                clearable
-                @change="salesLedgerChange"
-              >
-                <el-option
-                  v-for="item in salesContractList"
-                  :key="item.id"
-                  :label="item.salesContractNo"
-                  :value="item.id"
-                />
+            <el-form-item label="閿�鍞悎鍚屽彿锛�"
+                          prop="salesLedgerId">
+              <el-select v-model="form.salesLedgerId"
+                         placeholder="璇烽�夋嫨"
+                         filterable
+                         clearable
+                         @change="salesLedgerChange">
+                <el-option v-for="item in salesContractList"
+                           :key="item.id"
+                           :label="item.salesContractNo"
+                           :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="渚涘簲鍟嗗悕绉帮細" prop="supplierId">
-              <el-select
-                v-model="form.supplierId"
-                placeholder="璇烽�夋嫨"
-								filterable
-                clearable
-              >
-                <el-option
-                  v-for="item in supplierList"
-                  :key="item.id"
-                  :label="item.supplierName"
-                  :value="item.id"
-                />
+            <el-form-item label="渚涘簲鍟嗗悕绉帮細"
+                          prop="supplierId">
+              <el-select v-model="form.supplierId"
+                         placeholder="璇烽�夋嫨"
+                         filterable
+                         clearable>
+                <el-option v-for="item in supplierList"
+                           :key="item.id"
+                           :label="item.supplierName"
+                           :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
-					<el-col :span="12">
-            <el-form-item label="椤圭洰鍚嶇О" prop="projectName">
-              <el-input
-                  v-model="form.projectName"
-                  placeholder="璇疯緭鍏�"
-                  clearable
-              />
+          <el-col :span="12">
+            <el-form-item label="椤圭洰鍚嶇О"
+                          prop="projectName">
+              <el-input v-model="form.projectName"
+                        placeholder="璇疯緭鍏�"
+                        clearable />
             </el-form-item>
-					</el-col>
+          </el-col>
         </el-row>
-				<el-row :gutter="30">
+        <el-row :gutter="30">
           <el-col :span="12">
             <el-form-item label="浠樻鏂瑰紡">
-              <el-input
-                  v-model="form.paymentMethod"
-                  placeholder="璇疯緭鍏�"
-                  clearable
-              />
+              <el-input v-model="form.paymentMethod"
+                        placeholder="璇疯緭鍏�"
+                        clearable />
             </el-form-item>
           </el-col>
-					<el-col :span="12">
-						<el-form-item label="绛捐鏃ユ湡锛�" prop="executionDate">
-							<el-date-picker
-								style="width: 100%"
-								v-model="form.executionDate"
-								value-format="YYYY-MM-DD"
-								format="YYYY-MM-DD"
-								type="date"
-								placeholder="璇烽�夋嫨"
-								clearable
-							/>
-						</el-form-item>
-					</el-col>
-				</el-row>
+          <el-col :span="12">
+            <el-form-item label="绛捐鏃ユ湡锛�"
+                          prop="executionDate">
+              <el-date-picker style="width: 100%"
+                              v-model="form.executionDate"
+                              value-format="YYYY-MM-DD"
+                              format="YYYY-MM-DD"
+                              type="date"
+                              placeholder="璇烽�夋嫨"
+                              clearable />
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="瀹℃壒浜猴細" prop="approverId">
-              <el-select
-                  v-model="form.approverId"
-                  placeholder="璇烽�夋嫨瀹℃壒浜�"
-                  clearable
-              >
-                <el-option
-                    v-for="item in userList"
-                    :key="item.userId"
-                    :label="item.nickName"
-                    :value="item.userId"
-                />
+            <el-form-item label="瀹℃壒浜猴細"
+                          prop="approverId">
+              <el-select v-model="form.approverId"
+                         placeholder="璇烽�夋嫨瀹℃壒浜�"
+                         clearable>
+                <el-option v-for="item in userList"
+                           :key="item.userId"
+                           :label="item.nickName"
+                           :value="item.userId" />
               </el-select>
             </el-form-item>
-            <el-form-item label="褰曞叆浜猴細" prop="recorderId" v-show="false">
-              <el-select
-                  v-model="form.recorderId"
-                  placeholder="璇烽�夋嫨"
-                  clearable
-                  disabled
-              >
-                <el-option
-                  v-for="item in userList"
-                  :key="item.userId"
-                  :label="item.nickName"
-                  :value="item.userId"
-                />
+            <el-form-item label="褰曞叆浜猴細"
+                          prop="recorderId"
+                          v-show="false">
+              <el-select v-model="form.recorderId"
+                         placeholder="璇烽�夋嫨"
+                         clearable
+                         disabled>
+                <el-option v-for="item in userList"
+                           :key="item.userId"
+                           :label="item.nickName"
+                           :value="item.userId" />
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="褰曞叆鏃ユ湡锛�" prop="entryDate">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.entryDate"
-                value-format="YYYY-MM-DD"
-                format="YYYY-MM-DD"
-                type="date"
-                placeholder="璇烽�夋嫨"
-                clearable
-              />
+            <el-form-item label="褰曞叆鏃ユ湡锛�"
+                          prop="entryDate">
+              <el-date-picker style="width: 100%"
+                              v-model="form.entryDate"
+                              value-format="YYYY-MM-DD"
+                              format="YYYY-MM-DD"
+                              type="date"
+                              placeholder="璇烽�夋嫨"
+                              clearable />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
-          <el-form-item label="浜у搧淇℃伅锛�" prop="entryDate">
-            <el-button type="primary" @click="openProductForm('add')"
-              >娣诲姞</el-button
-            >
-            <el-button plain type="danger" @click="deleteProduct"
-              >鍒犻櫎</el-button
-            >
+          <el-form-item label="浜у搧淇℃伅锛�"
+                        prop="entryDate">
+            <el-button type="primary"
+                       @click="openProductForm('add')">娣诲姞</el-button>
+            <el-button plain
+                       type="danger"
+                       @click="deleteProduct">鍒犻櫎</el-button>
           </el-form-item>
-          <div class="select-button-group" style="width: 220px; margin: 20px 0;" v-if="operationType === 'add'">
-            <el-select
-                filterable
-                allow-create
-                :reserve-keyword="true"
-                :default-first-option="false"
-                v-model="templateName"
-                :input-value="filterInputValue"
-                @filter-change="onTemplateFilterChange"
-                @change="onTemplateChange"
-                style="width: 180px; border-right: none; border-radius: 4px 0 0 4px;"
-                placeholder="璇烽�夋嫨"
-                class="no-arrow-select"
-            >
-              <el-option
-                  v-for="item in templateList"
-                  :key="item.value"
-                  :label="item.templateName"
-                  :value="item.templateName"
-              ></el-option>
+          <div class="select-button-group"
+               style="width: 220px; margin: 20px 0;"
+               v-if="operationType === 'add'">
+            <el-select filterable
+                       allow-create
+                       :reserve-keyword="true"
+                       :default-first-option="false"
+                       v-model="templateName"
+                       :input-value="filterInputValue"
+                       @filter-change="onTemplateFilterChange"
+                       @change="onTemplateChange"
+                       style="width: 180px; border-right: none; border-radius: 4px 0 0 4px;"
+                       placeholder="璇烽�夋嫨"
+                       class="no-arrow-select">
+              <el-option v-for="item in templateList"
+                         :key="item.value"
+                         :label="item.templateName"
+                         :value="item.templateName"></el-option>
             </el-select>
             <!-- 鎸夐挳锛氫笌 Select 楂樺害鍖归厤锛屽幓鎺夊乏渚ц竟妗嗭紝鏃犵紳琛旀帴 -->
-            <el-button
-                size="small"
-                style="height: 32px; border-radius: 0 4px 4px 0; margin-left: -1px;"
-                @click="handleButtonClick"
-                :disabled="!templateName || templateName.trim() === '' || isTemplateNameDuplicate"
-            >
+            <el-button size="small"
+                       style="height: 32px; border-radius: 0 4px 4px 0; margin-left: -1px;"
+                       @click="handleButtonClick"
+                       :disabled="!templateName || templateName.trim() === '' || isTemplateNameDuplicate">
               淇濆瓨
             </el-button>
           </div>
         </el-row>
-        <el-table
-          :data="productData"
-          border
-          @selection-change="productSelected"
-          show-summary
-          :summary-method="summarizeProTable"
-        >
-          <el-table-column align="center" type="selection" width="55" />
-          <el-table-column
-            align="center"
-            label="搴忓彿"
-            type="index"
-            width="60"
-          />
-          <el-table-column label="浜у搧澶х被" prop="productCategory" />
-          <el-table-column label="瑙勬牸鍨嬪彿" prop="specificationModel" />
-          <el-table-column label="鍗曚綅" prop="unit" width="70" />
-          <el-table-column label="鏁伴噺" prop="quantity" width="70" />
-					<el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum" width="120" show-overflow-tooltip />
-          <el-table-column label="绋庣巼(%)" prop="taxRate" width="80" />
-          <el-table-column
-            label="鍚◣鍗曚环(鍏�)"
-            prop="taxInclusiveUnitPrice"
-            :formatter="formattedNumber"
-            width="150"
-          />
-          <el-table-column
-            label="鍚◣鎬讳环(鍏�)"
-            prop="taxInclusiveTotalPrice"
-            :formatter="formattedNumber"
-            width="150"
-          />
-          <el-table-column
-            label="涓嶅惈绋庢�讳环(鍏�)"
-            prop="taxExclusiveTotalPrice"
-            :formatter="formattedNumber"
-            width="150"
-          />
-          <el-table-column
-            fixed="right"
-            label="鎿嶄綔"
-            min-width="60"
-            align="center"
-          >
+        <el-table :data="productData"
+                  border
+                  @selection-change="productSelected"
+                  show-summary
+                  :summary-method="summarizeProTable">
+          <el-table-column align="center"
+                           type="selection"
+                           width="55" />
+          <el-table-column align="center"
+                           label="搴忓彿"
+                           type="index"
+                           width="60" />
+          <el-table-column label="浜у搧澶х被"
+                           prop="productCategory" />
+          <el-table-column label="瑙勬牸鍨嬪彿"
+                           prop="specificationModel" />
+          <el-table-column label="鍗曚綅"
+                           prop="unit"
+                           width="70" />
+          <el-table-column label="鏁伴噺"
+                           prop="quantity"
+                           width="70" />
+          <el-table-column label="搴撳瓨棰勮鏁伴噺"
+                           prop="warnNum"
+                           width="120"
+                           show-overflow-tooltip />
+          <el-table-column label="绋庣巼(%)"
+                           prop="taxRate"
+                           width="80" />
+          <el-table-column label="鍚◣鍗曚环(鍏�)"
+                           prop="taxInclusiveUnitPrice"
+                           :formatter="formattedNumber"
+                           width="150" />
+          <el-table-column label="鍚◣鎬讳环(鍏�)"
+                           prop="taxInclusiveTotalPrice"
+                           :formatter="formattedNumber"
+                           width="150" />
+          <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
+                           prop="taxExclusiveTotalPrice"
+                           :formatter="formattedNumber"
+                           width="150" />
+          <el-table-column fixed="right"
+                           label="鎿嶄綔"
+                           min-width="60"
+                           align="center">
             <template #default="scope">
-              <el-button
-                link
-                type="primary"
-                size="small"
-                @click="openProductForm('edit', scope.row, scope.$index)"
-                >缂栬緫</el-button
-              >
+              <el-button link
+                         type="primary"
+                         size="small"
+                         @click="openProductForm('edit', scope.row, scope.$index)">缂栬緫</el-button>
             </template>
           </el-table-column>
         </el-table>
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="澶囨敞路锛�" prop="remark">
-              <el-input
-                v-model="form.remark"
-                placeholder="璇疯緭鍏�"
-                clearable
-                type="textarea"
-                :rows="2"
-              />
+            <el-form-item label="澶囨敞路锛�"
+                          prop="remark">
+              <el-input v-model="form.remark"
+                        placeholder="璇疯緭鍏�"
+                        clearable
+                        type="textarea"
+                        :rows="2" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="闄勪欢鏉愭枡锛�" prop="remark">
-              <el-upload
-                v-model:file-list="fileList"
-                :action="upload.url"
-                multiple
-                ref="fileUpload"
-                auto-upload
-                :headers="upload.headers"
-                :before-upload="handleBeforeUpload"
-                :on-error="handleUploadError"
-                :on-success="handleUploadSuccess"
-                :on-remove="handleRemove"
-              >
+            <el-form-item label="闄勪欢鏉愭枡锛�"
+                          prop="remark">
+              <el-upload v-model:file-list="fileList"
+                         :action="upload.url"
+                         multiple
+                         ref="fileUpload"
+                         auto-upload
+                         :headers="upload.headers"
+                         :before-upload="handleBeforeUpload"
+                         :on-error="handleUploadError"
+                         :on-success="handleUploadSuccess"
+                         :on-remove="handleRemove">
                 <el-button type="primary">涓婁紶</el-button>
                 <template #tip>
                   <div class="el-upload__tip">
@@ -487,335 +443,310 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitForm">纭</el-button>
+          <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"
-    >
-      <el-form
-        :model="productForm"
-        label-width="140px"
-        label-position="top"
-        :rules="productRules"
-        ref="productFormRef"
-      >
+    <el-dialog v-model="productFormVisible"
+               :title="productOperationType === 'add' ? '鏂板浜у搧' : '缂栬緫浜у搧'"
+               width="40%"
+               @close="closeProductDia">
+      <el-form :model="productForm"
+               label-width="140px"
+               label-position="top"
+               :rules="productRules"
+               ref="productFormRef">
         <el-row :gutter="30">
           <el-col :span="24">
-            <el-form-item label="浜у搧澶х被锛�" prop="productId">
-              <el-tree-select
-                v-model="productForm.productId"
-                placeholder="璇烽�夋嫨"
-                clearable
-                check-strictly
-                @change="getModels"
-                :data="productOptions"
-                :render-after-expand="false"
-                style="width: 100%"
-              />
+            <el-form-item label="浜у搧澶х被锛�"
+                          prop="productId">
+              <el-tree-select v-model="productForm.productId"
+                              placeholder="璇烽�夋嫨"
+                              clearable
+                              check-strictly
+                              @change="getModels"
+                              :data="productOptions"
+                              :render-after-expand="false"
+                              style="width: 100%" />
             </el-form-item>
           </el-col>
         </el-row>
         <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-option
-                  v-for="item in modelOptions"
-                  :key="item.id"
-                  :label="item.model"
-                  :value="item.id"
-                />
+            <el-form-item label="瑙勬牸鍨嬪彿锛�"
+                          prop="productModelId">
+              <el-select v-model="productForm.productModelId"
+                         placeholder="璇烽�夋嫨"
+                         clearable
+                         @change="getProductModel">
+                <el-option v-for="item in modelOptions"
+                           :key="item.id"
+                           :label="item.model"
+                           :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="30">
           <el-col :span="12">
-            <el-form-item label="鍗曚綅锛�" prop="unit">
-              <el-input
-                v-model="productForm.unit"
-                placeholder="璇疯緭鍏�"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
-					<el-col :span="12">
-						<el-form-item label="绋庣巼(%)锛�" prop="taxRate">
-							<el-select
-								v-model="productForm.taxRate"
-								placeholder="璇烽�夋嫨"
-								clearable
-								@change="mathNum"
-							>
-								<el-option label="1" value="1" />
-								<el-option label="6" value="6" />
-								<el-option label="13" value="13" />
-							</el-select>
-						</el-form-item>
-					</el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍚◣鍗曚环(鍏�)锛�" prop="taxInclusiveUnitPrice">
-              <el-input-number
-                v-model="productForm.taxInclusiveUnitPrice"
-                :precision="2"
-                :step="0.1"
-                clearable
-                style="width: 100%"
-                @change="mathNum"
-              />
-            </el-form-item>
-          </el-col>
-					<el-col :span="12">
-						<el-form-item label="鏁伴噺锛�" prop="quantity">
-							<el-input-number
-								:step="0.1"
-								clearable
-								:precision="2"
-								style="width: 100%"
-								v-model="productForm.quantity"
-								placeholder="璇疯緭鍏�"
-								@change="mathNum"
-							/>
-						</el-form-item>
-					</el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍚◣鎬讳环(鍏�)锛�" prop="taxInclusiveTotalPrice">
-              <el-input-number
-                v-model="productForm.taxInclusiveTotalPrice"
-                :precision="2"
-                :step="0.1"
-                clearable
-                style="width: 100%"
-                @change="reverseMathNum('taxInclusiveTotalPrice')"
-              />
+            <el-form-item label="鍗曚綅锛�"
+                          prop="unit">
+              <el-input v-model="productForm.unit"
+                        placeholder="璇疯緭鍏�"
+                        clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item
-              label="涓嶅惈绋庢�讳环(鍏�)锛�"
-              prop="taxExclusiveTotalPrice"
-            >
-              <el-input 
-                v-model="productForm.taxExclusiveTotalPrice"
-                @change="reverseMathNum('taxExclusiveTotalPrice')"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鍙戠エ绫诲瀷锛�" prop="invoiceType">
-              <el-select
-                v-model="productForm.invoiceType"
-                placeholder="璇烽�夋嫨"
-                clearable
-              >
-                <el-option label="澧炴櫘绁�" value="澧炴櫘绁�" />
-                <el-option label="澧炰笓绁�" value="澧炰笓绁�" />
+            <el-form-item label="绋庣巼(%)锛�"
+                          prop="taxRate">
+              <el-select v-model="productForm.taxRate"
+                         placeholder="璇烽�夋嫨"
+                         clearable
+                         @change="mathNum">
+                <el-option label="1"
+                           value="1" />
+                <el-option label="6"
+                           value="6" />
+                <el-option label="13"
+                           value="13" />
               </el-select>
             </el-form-item>
           </el-col>
-					<el-col :span="12">
-						<el-form-item label="搴撳瓨棰勮鏁伴噺锛�" prop="warnNum">
-							<el-input-number
-								v-model="productForm.warnNum"
-								:precision="2"
-								:step="0.1"
-								clearable
-								style="width: 100%"
-							/>
-						</el-form-item>
-					</el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鍚◣鍗曚环(鍏�)锛�"
+                          prop="taxInclusiveUnitPrice">
+              <el-input-number v-model="productForm.taxInclusiveUnitPrice"
+                               :precision="2"
+                               :step="0.1"
+                               clearable
+                               style="width: 100%"
+                               @change="mathNum" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏁伴噺锛�"
+                          prop="quantity">
+              <el-input-number :step="0.1"
+                               clearable
+                               :precision="2"
+                               style="width: 100%"
+                               v-model="productForm.quantity"
+                               placeholder="璇疯緭鍏�"
+                               @change="mathNum" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鍚◣鎬讳环(鍏�)锛�"
+                          prop="taxInclusiveTotalPrice">
+              <el-input-number v-model="productForm.taxInclusiveTotalPrice"
+                               :precision="2"
+                               :step="0.1"
+                               clearable
+                               style="width: 100%"
+                               @change="reverseMathNum('taxInclusiveTotalPrice')" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="涓嶅惈绋庢�讳环(鍏�)锛�"
+                          prop="taxExclusiveTotalPrice">
+              <el-input v-model="productForm.taxExclusiveTotalPrice"
+                        @change="reverseMathNum('taxExclusiveTotalPrice')" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鍙戠エ绫诲瀷锛�"
+                          prop="invoiceType">
+              <el-select v-model="productForm.invoiceType"
+                         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="warnNum">
+              <el-input-number v-model="productForm.warnNum"
+                               :precision="2"
+                               :step="0.1"
+                               clearable
+                               style="width: 100%" />
+            </el-form-item>
+          </el-col>
         </el-row>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitProduct">纭</el-button>
+          <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
-    >
+    <el-dialog v-model="qrCodeDialogVisible"
+               title="閲囪喘鍚堝悓鍙蜂簩缁寸爜"
+               width="400px"
+               center>
       <div style="text-align: center;">
-        <img :src="qrCodeUrl" alt="浜岀淮鐮�" style="width:200px;height:200px;" />
+        <img :src="qrCodeUrl"
+             alt="浜岀淮鐮�"
+             style="width:200px;height:200px;" />
         <div style="margin: 20px;">
-          <el-button type="primary" @click="downloadQRCode">涓嬭浇浜岀淮鐮佸浘鐗�</el-button>
+          <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-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-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 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 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 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 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-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-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-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 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-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-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-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-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-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-input v-model="scanForm.scannerName"
+                        disabled />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -829,30 +760,40 @@
         <el-row :gutter="20">
           <el-col :span="24">
             <el-form-item label="鎵爜澶囨敞锛�">
-              <el-input
-                v-model="scanForm.scanRemark"
-                type="textarea"
-                :rows="3"
-                placeholder="璇疯緭鍏ユ壂鐮佸娉ㄤ俊鎭�"
-              />
+              <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">
+              <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-column label="澶囨敞"
+                                 prop="scanRemark" />
               </el-table>
             </el-form-item>
           </el-col>
@@ -860,706 +801,783 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="submitScan">纭鎵爜</el-button>
+          <el-button type="primary"
+                     @click="submitScan">纭鎵爜</el-button>
           <el-button @click="closeScanDialog">鍙栨秷</el-button>
         </div>
       </template>
     </el-dialog>
-		<FileList ref="fileListRef" />
+    <FileList ref="fileListRef" />
   </div>
 </template>
 
 <script setup>
-import {getToken} from "@/utils/auth";
-import pagination from "@/components/PIMTable/Pagination.vue";
-import { ref, onMounted, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
-import { Search } from "@element-plus/icons-vue";
-import { ElMessageBox,ElMessage } from "element-plus";
-import { userListNoPage } from "@/api/system/user.js";
-import FileList from "./fileList.vue";
-import {
-  getSalesLedgerWithProducts,
-  addOrUpdateSalesLedgerProduct,
-  delProduct,
-  delLedgerFile,
-  getProductInfoByContractNo,
-} from "@/api/salesManagement/salesLedger.js";
-import {
-  addOrEditPurchase,
-  addPurchaseTemplate,
-  createPurchaseNo,
-  delPurchase,
-  getSalesNo,
-  purchaseListPage,
-  productList,
-  getPurchaseById,
-  getOptions,
-  getPurchaseTemplateList
-} from "@/api/procurementManagement/procurementLedger.js";
-import useFormData from "@/hooks/useFormData.js";
-import QRCode from "qrcode";
+  import { getToken } from "@/utils/auth";
+  import pagination from "@/components/PIMTable/Pagination.vue";
+  import {
+    ref,
+    onMounted,
+    reactive,
+    toRefs,
+    getCurrentInstance,
+    nextTick,
+  } from "vue";
+  import { Search } from "@element-plus/icons-vue";
+  import { ElMessageBox, ElMessage } from "element-plus";
+  import { userListNoPage } from "@/api/system/user.js";
+  import FileList from "./fileList.vue";
+  import {
+    getSalesLedgerWithProducts,
+    addOrUpdateSalesLedgerProduct,
+    delProduct,
+    delLedgerFile,
+    getProductInfoByContractNo,
+  } from "@/api/salesManagement/salesLedger.js";
+  import {
+    addOrEditPurchase,
+    addPurchaseTemplate,
+    createPurchaseNo,
+    delPurchase,
+    getSalesNo,
+    purchaseListPage,
+    productList,
+    getPurchaseById,
+    getOptions,
+    getPurchaseTemplateList,
+  } from "@/api/procurementManagement/procurementLedger.js";
+  import useFormData from "@/hooks/useFormData.js";
+  import QRCode from "qrcode";
 
+  const { proxy } = getCurrentInstance();
+  const tableData = ref([]);
+  const productData = ref([]);
+  const selectedRows = ref([]);
+  const productSelectedRows = ref([]);
+  const modelOptions = ref([]);
+  const userList = ref([]);
+  const productOptions = ref([]);
+  const salesContractList = ref([]);
+  const supplierList = ref([]);
+  const tableLoading = ref(false);
+  const page = reactive({
+    current: 1,
+    size: 100,
+  });
+  const total = ref(0);
+  const fileList = ref([]);
+  import useUserStore from "@/store/modules/user";
+  import { modelList, productTreeList } from "@/api/basicData/product.js";
+  import dayjs from "dayjs";
 
-const { proxy } = getCurrentInstance();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const productSelectedRows = ref([]);
-const modelOptions = ref([]);
-const userList = ref([]);
-const productOptions = ref([]);
-const salesContractList = ref([]);
-const supplierList = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
-  current: 1,
-  size: 100,
-});
-const total = ref(0);
-const fileList = ref([]);
-import useUserStore from "@/store/modules/user";
-import { modelList, productTreeList } from "@/api/basicData/product.js";
-import dayjs from "dayjs";
+  const userStore = useUserStore();
 
-const userStore = useUserStore();
+  // 浜岀淮鐮佺浉鍏冲彉閲�
+  const qrCodeDialogVisible = ref(false);
+  const qrCodeUrl = ref("");
 
-// 浜岀淮鐮佺浉鍏冲彉閲�
-const qrCodeDialogVisible = ref(false);
-const qrCodeUrl = ref("");
+  // 璁㈠崟瀹℃壒鐘舵�佹樉绀烘枃鏈�
+  const approvalStatusText = {
+    0: "瀹℃壒涓�",
+    1: "瀹℃壒閫氳繃",
+    2: "瀹℃壒澶辫触",
+  };
 
-// 璁㈠崟瀹℃壒鐘舵�佹樉绀烘枃鏈�
-const approvalStatusText = {
-  0: '瀹℃壒涓�',
-  1: '瀹℃壒閫氳繃',
-  2: '瀹℃壒澶辫触'
-};
-
-
-const templateName = ref('');
-const filterInputValue = ref('');
-const templateList = ref([]);
-const isTemplateNameDuplicate = ref(false); // 鏍囪妯℃澘鍚嶇О鏄惁閲嶅
-
-// 妫�鏌ユā鏉垮悕绉版槸鍚﹂噸澶�
-const checkTemplateNameDuplicate = (name) => {
-  if (!name || name.trim() === '') {
-    isTemplateNameDuplicate.value = false;
-    return false;
-  }
-  const isDuplicate = templateList.value.some(item => item.templateName === name.trim());
-  isTemplateNameDuplicate.value = isDuplicate;
-  return isDuplicate;
-};
-
-// 闃叉姈瀹氭椂鍣�
-let duplicateCheckTimer = null;
-const onTemplateFilterChange = (val) => {
-  filterInputValue.value = val ?? '';
-  // 娓呴櫎涔嬪墠鐨勫畾鏃跺櫒
-  if (duplicateCheckTimer) {
-    clearTimeout(duplicateCheckTimer);
-  }
-  // 瀹炴椂妫�鏌ユā鏉垮悕绉版槸鍚﹂噸澶嶏紙闃叉姈澶勭悊锛岄伩鍏嶉绻佹彁绀猴級
-  if (val && val.trim()) {
-    duplicateCheckTimer = setTimeout(() => {
-      const isDuplicate = checkTemplateNameDuplicate(val);
-      if (isDuplicate) {
-        ElMessage({
-          message: '妯℃澘鍚嶇О宸插瓨鍦紝璇锋洿鎹㈡ā鏉垮悕绉�',
-          type: 'warning',
-          duration: 2000
-        });
-      }
-    }, 300); // 300ms 闃叉姈
-  } else {
-    isTemplateNameDuplicate.value = false;
-  }
-};
-
-// allow-create 鏃讹紝杈撳叆涓嶅瓨鍦ㄧ殑鍐呭浼氫綔涓� string 鍊艰繑鍥烇紱杩欓噷鍚屾鍥炶緭鍏ユ浠ョ‘淇濇枃瀛椾笉涓�
-const onTemplateChange = async (val) => {
-  if (typeof val === 'string') {
-    filterInputValue.value = val;
-    // 閫夋嫨鎴栬緭鍏ユ椂妫�鏌ラ噸澶�
-    checkTemplateNameDuplicate(val);
-  }
-
-  // 杩囨护鏁版嵁锛屾煡鎵惧尮閰嶇殑妯℃澘
-  const matchedTemplate = templateList.value.find(item => item.templateName === val);
-
-  if (matchedTemplate?.id) {
-    // 濡傛灉鎵惧埌妯℃澘锛屽姞杞芥ā鏉挎暟鎹�
-    form.value = {
-      ...form.value,
-      ...matchedTemplate,
-    };
-    productData.value = matchedTemplate.productData || [];
-    // 鐢熸垚鏂扮殑閲囪喘鍚堝悓鍙�
-    try {
-      const res = await createPurchaseNo();
-      if (res?.data) {
-        form.value.purchaseContractNumber = res.data;
-      }
-    } catch (error) {
-      console.error('鐢熸垚閲囪喘鍚堝悓鍙峰け璐�:', error);
-    }
-  } else {
-    // 濡傛灉娌℃湁鎵惧埌妯℃澘锛岄噸缃〃鍗曪紙淇濇寔褰撳墠琛ㄥ崟鐘舵�侊級
-    const currentFormData = { ...form.value };
-    const currentProductData = [...productData.value];
-
-    // 濡傛灉瀵硅瘽妗嗘湭鎵撳紑锛屽厛鎵撳紑
-    if (!dialogFormVisible.value) {
-      operationType.value = 'add';
-      dialogFormVisible.value = true;
-    }
-
-    // 绛夊緟涓嬩竴涓� tick 鍚庢仮澶嶆暟鎹�
-    await nextTick();
-    form.value = {
-      ...form.value,
-      ...currentFormData,
-    };
-    productData.value = currentProductData;
-  }
-};
-
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-const operationType = ref("");
-const dialogFormVisible = ref(false);
-const data = reactive({
-  searchForm: {
-    supplierName: "", // 渚涘簲鍟嗗悕绉�
-    purchaseContractNumber: "", // 閲囪喘鍚堝悓缂栧彿
-    salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
-    projectName: "", // 椤圭洰鍚嶇О
-    entryDate: null, // 褰曞叆鏃ユ湡
-    entryDateStart: undefined,
-    entryDateEnd: undefined,
-  },
-  form: {
-    purchaseContractNumber: "",
-    salesLedgerId: "",
-    projectName: "",
-    recorderId: "",
-    entryDate: "",
-    productData: [],
-    supplierName: "",
-    supplierId: "",
-    paymentMethod: "",
-		executionDate: "",
-  },
-  rules: {
-    purchaseContractNumber: [
-      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-    ],
-    approverId:[{ required: true, message: "璇烽�夋嫨瀹℃壒浜�", trigger: "change" }],
-    projectName:[{ required:true, message:"璇疯緭鍏ラ」鐩悕绉�", trigger:"blur"}],
-    supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-		entryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-		executionDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-  },
-});
-const {  form, rules } = toRefs(data);
-const { form: searchForm } = useFormData({
-  ...data.searchForm,
-  // 璁剧疆褰曞叆鏃ユ湡鑼冨洿涓哄綋澶�
-  entryDate: [dayjs().startOf('day').format('YYYY-MM-DD'), dayjs().endOf('day').format('YYYY-MM-DD')],
-  entryDateStart: dayjs().startOf('day').format('YYYY-MM-DD'),
-  entryDateEnd: dayjs().endOf('day').format('YYYY-MM-DD')
-});
-
-// 浜у搧琛ㄥ崟寮规鏁版嵁
-const productFormVisible = ref(false);
-const productOperationType = ref("");
-const productOperationIndex = ref("");
-const currentId = ref("");
-const productFormData = reactive({
-  productForm: {
-    productId: "",
-    productCategory: "",
-    productModelId: "",
-    specificationModel: "",
-    unit: "",
-    quantity: "",
-    taxInclusiveUnitPrice: "",
-    taxRate: "",
-    taxInclusiveTotalPrice: "",
-    taxExclusiveTotalPrice: "",
-    invoiceType: "",
-		warnNum: "",
-  },
-  productRules: {
-    productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
-    taxInclusiveUnitPrice: [
-      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-    ],
-    taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-		warnNum: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-    taxInclusiveTotalPrice: [
-      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-    ],
-    taxExclusiveTotalPrice: [
-      { required: true, message: "璇疯緭鍏�", trigger: "blur" },
-    ],
-    invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
-  },
-});
-const { productForm, productRules } = toRefs(productFormData);
-const upload = reactive({
-  // 涓婁紶鐨勫湴鍧�
-  url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
-  // 璁剧疆涓婁紶鐨勮姹傚ご閮�
-  headers: { Authorization: "Bearer " + getToken() },
-});
-
-const changeDaterange = (value) => {
-  if (value) {
-    searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
-    searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
-  } else {
-    searchForm.entryDateStart = undefined;
-    searchForm.entryDateEnd = undefined;
-  }
-  handleQuery();
-};
-
-const formattedNumber = (row, column, cellValue) => {
-  return parseFloat(cellValue).toFixed(2);
-};
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-  page.current = 1;
-  getList();
-};
-
-// 淇濆瓨妯℃澘
-const handleButtonClick = async () => {
-  // 妫�鏌ユā鏉垮悕绉版槸鍚︿负绌�
-  if (!templateName.value || templateName.value.trim() === '') {
-    ElMessage({
-      message: '璇疯緭鍏ユā鏉垮悕绉�',
-      type: 'warning',
-    });
-    return;
-  }
+  const templateName = ref("");
+  const filterInputValue = ref("");
+  const templateList = ref([]);
+  const isTemplateNameDuplicate = ref(false); // 鏍囪妯℃澘鍚嶇О鏄惁閲嶅
 
   // 妫�鏌ユā鏉垮悕绉版槸鍚﹂噸澶�
-  const isDuplicate = checkTemplateNameDuplicate(templateName.value);
-  if (isDuplicate) {
-    ElMessage({
-      message: '妯℃澘鍚嶇О宸插瓨鍦紝璇锋洿鎹㈡ā鏉垮悕绉�',
-      type: 'warning',
-    });
-    return;
-  }
-
-  // 妫�鏌ヤ緵搴斿晢鏄惁閫夋嫨
-  if (!form.value.supplierId) {
-    ElMessage({
-      message: '璇峰厛閫夋嫨渚涘簲鍟�',
-      type: 'warning',
-    });
-    return;
-  }
-
-  // 妫�鏌ユ槸鍚︽湁浜у搧鏁版嵁
-  // if (!productData.value || productData.value.length === 0) {
-  //   ElMessage({
-  //     message: '璇峰厛娣诲姞浜у搧淇℃伅',
-  //     type: 'warning',
-  //   });
-  //   return;
-  // }
-
-  try {
-    let params = {
-      productData: proxy.HaveJson(productData.value),
-      supplierId: form.value.supplierId,
-      paymentMethod: form.value.paymentMethod,
-      recorderId: form.value.recorderId,
-      approverId: form.value.approverId,
-      templateName: templateName.value.trim()
-    };
-    console.log(params);
-    let res = await addPurchaseTemplate(params);
-
-    if (res && res.code === 200) {
-      ElMessage({
-        message: '妯℃澘淇濆瓨鎴愬姛',
-        type: 'success',
-      });
-      // 淇濆瓨鎴愬姛鍚庨噸鏂拌幏鍙栨ā鏉垮垪琛�
-      await getTemplateList();
-      // 娓呯┖妯℃澘鍚嶇О杈撳叆
-      templateName.value = '';
-      filterInputValue.value = '';
+  const checkTemplateNameDuplicate = name => {
+    if (!name || name.trim() === "") {
       isTemplateNameDuplicate.value = false;
+      return false;
+    }
+    const isDuplicate = templateList.value.some(
+      item => item.templateName === name.trim()
+    );
+    isTemplateNameDuplicate.value = isDuplicate;
+    return isDuplicate;
+  };
+
+  // 闃叉姈瀹氭椂鍣�
+  let duplicateCheckTimer = null;
+  const onTemplateFilterChange = val => {
+    filterInputValue.value = val ?? "";
+    // 娓呴櫎涔嬪墠鐨勫畾鏃跺櫒
+    if (duplicateCheckTimer) {
+      clearTimeout(duplicateCheckTimer);
+    }
+    // 瀹炴椂妫�鏌ユā鏉垮悕绉版槸鍚﹂噸澶嶏紙闃叉姈澶勭悊锛岄伩鍏嶉绻佹彁绀猴級
+    if (val && val.trim()) {
+      duplicateCheckTimer = setTimeout(() => {
+        const isDuplicate = checkTemplateNameDuplicate(val);
+        if (isDuplicate) {
+          ElMessage({
+            message: "妯℃澘鍚嶇О宸插瓨鍦紝璇锋洿鎹㈡ā鏉垮悕绉�",
+            type: "warning",
+            duration: 2000,
+          });
+        }
+      }, 300); // 300ms 闃叉姈
     } else {
+      isTemplateNameDuplicate.value = false;
+    }
+  };
+
+  // allow-create 鏃讹紝杈撳叆涓嶅瓨鍦ㄧ殑鍐呭浼氫綔涓� string 鍊艰繑鍥烇紱杩欓噷鍚屾鍥炶緭鍏ユ浠ョ‘淇濇枃瀛椾笉涓�
+  const onTemplateChange = async val => {
+    if (typeof val === "string") {
+      filterInputValue.value = val;
+      // 閫夋嫨鎴栬緭鍏ユ椂妫�鏌ラ噸澶�
+      checkTemplateNameDuplicate(val);
+    }
+
+    // 杩囨护鏁版嵁锛屾煡鎵惧尮閰嶇殑妯℃澘
+    const matchedTemplate = templateList.value.find(
+      item => item.templateName === val
+    );
+
+    if (matchedTemplate?.id) {
+      // 濡傛灉鎵惧埌妯℃澘锛屽姞杞芥ā鏉挎暟鎹�
+      form.value = {
+        ...form.value,
+        ...matchedTemplate,
+      };
+      productData.value = matchedTemplate.productData || [];
+      // 鐢熸垚鏂扮殑閲囪喘鍚堝悓鍙�
+      try {
+        const res = await createPurchaseNo();
+        if (res?.data) {
+          form.value.purchaseContractNumber = res.data;
+        }
+      } catch (error) {
+        console.error("鐢熸垚閲囪喘鍚堝悓鍙峰け璐�:", error);
+      }
+    } else {
+      // 濡傛灉娌℃湁鎵惧埌妯℃澘锛岄噸缃〃鍗曪紙淇濇寔褰撳墠琛ㄥ崟鐘舵�侊級
+      const currentFormData = { ...form.value };
+      const currentProductData = [...productData.value];
+
+      // 濡傛灉瀵硅瘽妗嗘湭鎵撳紑锛屽厛鎵撳紑
+      if (!dialogFormVisible.value) {
+        operationType.value = "add";
+        dialogFormVisible.value = true;
+      }
+
+      // 绛夊緟涓嬩竴涓� tick 鍚庢仮澶嶆暟鎹�
+      await nextTick();
+      form.value = {
+        ...form.value,
+        ...currentFormData,
+      };
+      productData.value = currentProductData;
+    }
+  };
+
+  // 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
+  const operationType = ref("");
+  const dialogFormVisible = ref(false);
+  const data = reactive({
+    searchForm: {
+      supplierName: "", // 渚涘簲鍟嗗悕绉�
+      purchaseContractNumber: "", // 閲囪喘鍚堝悓缂栧彿
+      salesContractNo: "", // 閿�鍞悎鍚岀紪鍙�
+      projectName: "", // 椤圭洰鍚嶇О
+      entryDate: null, // 褰曞叆鏃ユ湡
+      entryDateStart: undefined,
+      entryDateEnd: undefined,
+    },
+    form: {
+      purchaseContractNumber: "",
+      salesLedgerId: "",
+      projectName: "",
+      recorderId: "",
+      entryDate: "",
+      productData: [],
+      supplierName: "",
+      supplierId: "",
+      paymentMethod: "",
+      executionDate: "",
+    },
+    rules: {
+      purchaseContractNumber: [
+        { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+      ],
+      approverId: [
+        { required: true, message: "璇烽�夋嫨瀹℃壒浜�", trigger: "change" },
+      ],
+      projectName: [
+        { required: true, message: "璇疯緭鍏ラ」鐩悕绉�", trigger: "blur" },
+      ],
+      supplierId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      entryDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      executionDate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    },
+  });
+  const { form, rules } = toRefs(data);
+  const { form: searchForm } = useFormData({
+    ...data.searchForm,
+    // 璁剧疆褰曞叆鏃ユ湡鑼冨洿涓哄綋澶�
+    entryDate: [
+      dayjs().startOf("day").format("YYYY-MM-DD"),
+      dayjs().endOf("day").format("YYYY-MM-DD"),
+    ],
+    entryDateStart: dayjs().startOf("day").format("YYYY-MM-DD"),
+    entryDateEnd: dayjs().endOf("day").format("YYYY-MM-DD"),
+  });
+
+  // 浜у搧琛ㄥ崟寮规鏁版嵁
+  const productFormVisible = ref(false);
+  const productOperationType = ref("");
+  const productOperationIndex = ref("");
+  const currentId = ref("");
+  const productFormData = reactive({
+    productForm: {
+      productId: "",
+      productCategory: "",
+      productModelId: "",
+      specificationModel: "",
+      unit: "",
+      quantity: "",
+      taxInclusiveUnitPrice: "",
+      taxRate: "",
+      taxInclusiveTotalPrice: "",
+      taxExclusiveTotalPrice: "",
+      invoiceType: "",
+      warnNum: "",
+    },
+    productRules: {
+      productId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      unit: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+      taxInclusiveUnitPrice: [
+        { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+      ],
+      taxRate: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      warnNum: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+      taxInclusiveTotalPrice: [
+        { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+      ],
+      taxExclusiveTotalPrice: [
+        { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+      ],
+      invoiceType: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
+    },
+  });
+  const { productForm, productRules } = toRefs(productFormData);
+  const upload = reactive({
+    // 涓婁紶鐨勫湴鍧�
+    url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
+    // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+    headers: { Authorization: "Bearer " + getToken() },
+  });
+
+  const changeDaterange = value => {
+    if (value) {
+      searchForm.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD");
+      searchForm.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD");
+    } else {
+      searchForm.entryDateStart = undefined;
+      searchForm.entryDateEnd = undefined;
+    }
+    handleQuery();
+  };
+
+  const formattedNumber = (row, column, cellValue) => {
+    return parseFloat(cellValue).toFixed(2);
+  };
+  // 鏌ヨ鍒楄〃
+  /** 鎼滅储鎸夐挳鎿嶄綔 */
+  const handleQuery = () => {
+    page.current = 1;
+    getList();
+  };
+
+  // 淇濆瓨妯℃澘
+  const handleButtonClick = async () => {
+    // 妫�鏌ユā鏉垮悕绉版槸鍚︿负绌�
+    if (!templateName.value || templateName.value.trim() === "") {
       ElMessage({
-        message: res?.msg || '妯℃澘淇濆瓨澶辫触',
-        type: 'error',
+        message: "璇疯緭鍏ユā鏉垮悕绉�",
+        type: "warning",
+      });
+      return;
+    }
+
+    // 妫�鏌ユā鏉垮悕绉版槸鍚﹂噸澶�
+    const isDuplicate = checkTemplateNameDuplicate(templateName.value);
+    if (isDuplicate) {
+      ElMessage({
+        message: "妯℃澘鍚嶇О宸插瓨鍦紝璇锋洿鎹㈡ā鏉垮悕绉�",
+        type: "warning",
+      });
+      return;
+    }
+
+    // 妫�鏌ヤ緵搴斿晢鏄惁閫夋嫨
+    if (!form.value.supplierId) {
+      ElMessage({
+        message: "璇峰厛閫夋嫨渚涘簲鍟�",
+        type: "warning",
+      });
+      return;
+    }
+
+    // 妫�鏌ユ槸鍚︽湁浜у搧鏁版嵁
+    // if (!productData.value || productData.value.length === 0) {
+    //   ElMessage({
+    //     message: '璇峰厛娣诲姞浜у搧淇℃伅',
+    //     type: 'warning',
+    //   });
+    //   return;
+    // }
+
+    try {
+      let params = {
+        productData: proxy.HaveJson(productData.value),
+        supplierId: form.value.supplierId,
+        paymentMethod: form.value.paymentMethod,
+        recorderId: form.value.recorderId,
+        approverId: form.value.approverId,
+        templateName: templateName.value.trim(),
+      };
+      console.log(params);
+      let res = await addPurchaseTemplate(params);
+
+      if (res && res.code === 200) {
+        ElMessage({
+          message: "妯℃澘淇濆瓨鎴愬姛",
+          type: "success",
+        });
+        // 淇濆瓨鎴愬姛鍚庨噸鏂拌幏鍙栨ā鏉垮垪琛�
+        await getTemplateList();
+        // 娓呯┖妯℃澘鍚嶇О杈撳叆
+        templateName.value = "";
+        filterInputValue.value = "";
+        isTemplateNameDuplicate.value = false;
+      } else {
+        ElMessage({
+          message: res?.msg || "妯℃澘淇濆瓨澶辫触",
+          type: "error",
+        });
+      }
+    } catch (error) {
+      console.error("淇濆瓨妯℃澘澶辫触:", error);
+      ElMessage({
+        message: "妯℃澘淇濆瓨澶辫触锛岃绋嶅悗閲嶈瘯",
+        type: "error",
       });
     }
-  } catch (error) {
-    console.error('淇濆瓨妯℃澘澶辫触:', error);
-    ElMessage({
-      message: '妯℃澘淇濆瓨澶辫触锛岃绋嶅悗閲嶈瘯',
-      type: 'error',
-    });
-  }
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
-  return proxy.summarizeTable(
-    param,
-    [
+  };
+  // 瀛愯〃鍚堣鏂规硶
+  const summarizeChildrenTable = param => {
+    return proxy.summarizeTable(
+      param,
+      [
+        "taxInclusiveUnitPrice",
+        "taxInclusiveTotalPrice",
+        "taxExclusiveTotalPrice",
+        "ticketsNum",
+        "ticketsAmount",
+        "futureTickets",
+        "futureTicketsAmount",
+      ],
+      {
+        ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+        futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
+      }
+    );
+  };
+  const paginationChange = obj => {
+    page.current = obj.page;
+    page.size = obj.limit;
+    getList();
+  };
+  const getList = () => {
+    tableLoading.value = true;
+    const { entryDate, ...rest } = searchForm;
+    purchaseListPage({ ...rest, ...page })
+      .then(res => {
+        tableLoading.value = false;
+        // tableData.value = res.data.records;
+        tableData.value = res.data.records.map(record => ({
+          ...record,
+          isInvalid: record.isWhite === 1,
+        }));
+        // 鍒濆鍖栧瓙鏁版嵁鏁扮粍
+        tableData.value.forEach(item => {
+          item.children = [];
+        });
+        total.value = res.data.total;
+        expandedRowKeys.value = [];
+      })
+      .catch(() => {
+        tableLoading.value = false;
+      });
+  };
+  // 琛ㄦ牸閫夋嫨鏁版嵁
+  const handleSelectionChange = selection => {
+    selectedRows.value = selection;
+  };
+  const productSelected = selectedRows => {
+    productSelectedRows.value = selectedRows;
+  };
+  const expandedRowKeys = ref([]);
+  // 灞曞紑琛�
+  const expandChange = async (row, expandedRows) => {
+    if (expandedRows.length > 0) {
+      expandedRowKeys.value = [];
+      try {
+        const res = await productList({ salesLedgerId: row.id, type: 2 });
+        const index = tableData.value.findIndex(item => item.id === row.id);
+        if (index > -1) {
+          tableData.value[index].children = res.data || [];
+          expandedRowKeys.value.push(row.id);
+        }
+      } catch (error) {
+        console.error("鍔犺浇浜у搧鍒楄〃澶辫触:", error);
+        proxy.$modal.msgError("鍔犺浇浜у搧鍒楄〃澶辫触");
+        // 灞曞紑澶辫触鏃讹紝绉婚櫎灞曞紑鐘舵��
+        const index = expandedRows.findIndex(item => item.id === row.id);
+        if (index > -1) {
+          expandedRows.splice(index, 1);
+        }
+      }
+    } else {
+      expandedRowKeys.value = [];
+    }
+  };
+  // 涓昏〃鍚堣鏂规硶
+  const summarizeMainTable = param => {
+    return proxy.summarizeTable(param, ["contractAmount"]);
+  };
+  // 瀛愯〃鍚堣鏂规硶
+  const summarizeProTable = param => {
+    return proxy.summarizeTable(param, [
       "taxInclusiveUnitPrice",
       "taxInclusiveTotalPrice",
       "taxExclusiveTotalPrice",
-      "ticketsNum",
-      "ticketsAmount",
-      "futureTickets",
-      "futureTicketsAmount",
-    ],
-    {
-      ticketsNum: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-      futureTickets: { noDecimal: true }, // 涓嶄繚鐣欏皬鏁�
-    }
-  );
-};
-const paginationChange = (obj) => {
-  page.current = obj.page;
-  page.size = obj.limit;
-  getList();
-};
-const getList = () => {
-  tableLoading.value = true;
-  const { entryDate, ...rest } = searchForm;
-  purchaseListPage({ ...rest, ...page })
-    .then((res) => {
-      tableLoading.value = false;
-      // tableData.value = res.data.records;
-      tableData.value = res.data.records.map(record => ({
-        ...record,
-        isInvalid: record.isWhite === 1
-      }));
-      // 鍒濆鍖栧瓙鏁版嵁鏁扮粍
-      tableData.value.forEach((item) => {
-        item.children = [];
-      });
-      total.value = res.data.total;
-      expandedRowKeys.value = [];
-    })
-    .catch(() => {
-      tableLoading.value = false;
-    });
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
-};
-const productSelected = (selectedRows) => {
-  productSelectedRows.value = selectedRows;
-};
-const expandedRowKeys = ref([]);
-// 灞曞紑琛�
-const expandChange = async (row, expandedRows) => {
-  if (expandedRows.length > 0) {
-    expandedRowKeys.value = [];
-    try {
-      const res = await productList({ salesLedgerId: row.id, type: 2 });
-      const index = tableData.value.findIndex((item) => item.id === row.id);
-      if (index > -1) {
-        tableData.value[index].children = res.data || [];
-        expandedRowKeys.value.push(row.id);
-      }
-    } catch (error) {
-      console.error('鍔犺浇浜у搧鍒楄〃澶辫触:', error);
-      proxy.$modal.msgError('鍔犺浇浜у搧鍒楄〃澶辫触');
-      // 灞曞紑澶辫触鏃讹紝绉婚櫎灞曞紑鐘舵��
-      const index = expandedRows.findIndex(item => item.id === row.id);
-      if (index > -1) {
-        expandedRows.splice(index, 1);
-      }
-    }
-  } else {
-    expandedRowKeys.value = [];
-  }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
-  return proxy.summarizeTable(param, ["contractAmount"]);
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeProTable = (param) => {
-  return proxy.summarizeTable(param, [
-    "taxInclusiveUnitPrice",
-    "taxInclusiveTotalPrice",
-    "taxExclusiveTotalPrice",
-  ]);
-};
-// 鎵撳紑寮规
-const openForm = async (type, row) => {
-  await getTemplateList()
-  operationType.value = type;
-  form.value = {};
-  productData.value = [];
-  fileList.value = [];
-  templateName.value = '';
-  filterInputValue.value = '';
-  isTemplateNameDuplicate.value = false;
-  try {
-    // 骞惰鍔犺浇鍩虹鏁版嵁
-    const [userRes, salesRes, supplierRes] = await Promise.all([
-      userListNoPage(),
-      getSalesNo(),
-      getOptions()
     ]);
-
-    userList.value = userRes.data || [];
-    salesContractList.value = salesRes || [];
-    // 渚涘簲鍟嗚繃婊ゅ嚭isWhite=0 鐨勬暟鎹�
-    supplierList.value = (supplierRes.data || []).filter((item) => item.isWhite === 0);
-
-    // 璁剧疆榛樿鍊�
-    form.value.recorderId = userStore.id;
-    form.value.entryDate = getCurrentDate();
-
-    if (type === "add") {
-      // 鏂板鏃剁敓鎴愰噰璐悎鍚屽彿
-      try {
-        const purchaseNoRes = await createPurchaseNo();
-        if (purchaseNoRes?.data) {
-          form.value.purchaseContractNumber = purchaseNoRes.data;
-        }
-      } catch (error) {
-        console.error('鐢熸垚閲囪喘鍚堝悓鍙峰け璐�:', error);
-        proxy.$modal.msgWarning('鐢熸垚閲囪喘鍚堝悓鍙峰け璐�');
-      }
-    } else if (type === "edit" && row?.id) {
-      // 缂栬緫鏃跺姞杞芥暟鎹�
-      currentId.value = row.id;
-      try {
-        const purchaseRes = await getPurchaseById({ id: row.id, type: 2 });
-        form.value = { ...purchaseRes };
-        productData.value = purchaseRes.productData || [];
-        fileList.value = purchaseRes.salesLedgerFiles || [];
-      } catch (error) {
-        console.error('鍔犺浇閲囪喘鍙拌处鏁版嵁澶辫触:', error);
-        proxy.$modal.msgError('鍔犺浇鏁版嵁澶辫触');
-        return;
-      }
-    }
-
-    dialogFormVisible.value = true;
-  } catch (error) {
-    console.error('鎵撳紑琛ㄥ崟澶辫触:', error);
-    proxy.$modal.msgError('鍔犺浇鍩虹鏁版嵁澶辫触');
-  }
-};
-// 涓婁紶鍓嶆牎妫�
-function handleBeforeUpload(file) {
-  // 鏍℃鏂囦欢澶у皬
-  if (file.size > 1024 * 1024 * 10) {
-    proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
-    return false;
-  }
-  proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
-  return true;
-}
-// 涓婁紶澶辫触
-function handleUploadError(err) {
-  proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
-  proxy.$modal.closeLoading();
-}
-// 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file, uploadFiles) {
-  proxy.$modal.closeLoading();
-  if (res.code === 200) {
-    file.tempId = res.data.tempId;
-    proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
-  } else {
-    proxy.$modal.msgError(res.msg);
-    proxy.$refs.fileUpload.handleRemove(file);
-  }
-}
-// 绉婚櫎鏂囦欢
-async function handleRemove(file) {
-  if (!file?.id) {
-    return;
-  }
-  console.log("handleRemove", file.id);
-  if (file.size > 1024 * 1024 * 10) { 
-    // 浠呭墠绔竻鐞嗭紝涓嶈皟鐢ㄥ垹闄ゆ帴鍙e拰鎻愮ず
-    return;
-  }
-
-  if (operationType.value === "edit" && file.id) {
+  };
+  // 鎵撳紑寮规
+  const openForm = async (type, row) => {
+    await getTemplateList();
+    operationType.value = type;
+    form.value = {};
+    productData.value = [];
+    fileList.value = [];
+    templateName.value = "";
+    filterInputValue.value = "";
+    isTemplateNameDuplicate.value = false;
     try {
-      await delLedgerFile([file.id]);
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      // 骞惰鍔犺浇鍩虹鏁版嵁
+      const [userRes, salesRes, supplierRes] = await Promise.all([
+        userListNoPage(),
+        getSalesNo(),
+        getOptions(),
+      ]);
+
+      userList.value = userRes.data || [];
+      salesContractList.value = salesRes || [];
+      // 渚涘簲鍟嗚繃婊ゅ嚭isWhite=0 鐨勬暟鎹�
+      supplierList.value = (supplierRes.data || []).filter(
+        item => item.isWhite === 0
+      );
+
+      // 璁剧疆榛樿鍊�
+      form.value.recorderId = userStore.id;
+      form.value.entryDate = getCurrentDate();
+
+      if (type === "add") {
+        // 鏂板鏃剁敓鎴愰噰璐悎鍚屽彿
+        try {
+          const purchaseNoRes = await createPurchaseNo();
+          if (purchaseNoRes?.data) {
+            form.value.purchaseContractNumber = purchaseNoRes.data;
+          }
+        } catch (error) {
+          console.error("鐢熸垚閲囪喘鍚堝悓鍙峰け璐�:", error);
+          proxy.$modal.msgWarning("鐢熸垚閲囪喘鍚堝悓鍙峰け璐�");
+        }
+      } else if (type === "edit" && row?.id) {
+        // 缂栬緫鏃跺姞杞芥暟鎹�
+        currentId.value = row.id;
+        try {
+          const purchaseRes = await getPurchaseById({ id: row.id, type: 2 });
+          form.value = { ...purchaseRes };
+          productData.value = purchaseRes.productData || [];
+          fileList.value = purchaseRes.salesLedgerFiles || [];
+        } catch (error) {
+          console.error("鍔犺浇閲囪喘鍙拌处鏁版嵁澶辫触:", error);
+          proxy.$modal.msgError("鍔犺浇鏁版嵁澶辫触");
+          return;
+        }
+      }
+
+      dialogFormVisible.value = true;
     } catch (error) {
-      console.error('鍒犻櫎鏂囦欢澶辫触:', error);
-      proxy.$modal.msgError("鍒犻櫎鏂囦欢澶辫触");
+      console.error("鎵撳紑琛ㄥ崟澶辫触:", error);
+      proxy.$modal.msgError("鍔犺浇鍩虹鏁版嵁澶辫触");
+    }
+  };
+  // 涓婁紶鍓嶆牎妫�
+  function handleBeforeUpload(file) {
+    // 鏍℃鏂囦欢澶у皬
+    if (file.size > 1024 * 1024 * 10) {
+      proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃10MB!");
+      return false;
+    }
+    proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
+    return true;
+  }
+  // 涓婁紶澶辫触
+  function handleUploadError(err) {
+    proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
+    proxy.$modal.closeLoading();
+  }
+  // 涓婁紶鎴愬姛鍥炶皟
+  function handleUploadSuccess(res, file, uploadFiles) {
+    proxy.$modal.closeLoading();
+    if (res.code === 200) {
+      file.tempId = res.data.tempId;
+      proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
+    } else {
+      proxy.$modal.msgError(res.msg);
+      proxy.$refs.fileUpload.handleRemove(file);
     }
   }
-}
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
-  proxy.$refs["formRef"].validate((valid) => {
-    if (valid) {
-      if (productData.value.length > 0) {
-        form.value.productData = proxy.HaveJson(productData.value);
-      } else {
-        proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
-        return;
-      }
-      let tempFileIds = [];
-      if (fileList.value.length > 0) {
-        tempFileIds = fileList.value.map((item) => item.tempId);
-      }
-      form.value.tempFileIds = tempFileIds;
-      form.value.type = 2;
-      
-      // 濡傛灉salesLedgerId涓虹┖锛屽垯涓嶄紶閫抯alesContractNo
-      if (!form.value.salesLedgerId) {
-        form.value.salesContractNo = ''
-      }
-      
-      addOrEditPurchase(form.value).then((res) => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        closeDia();
-        getList();
-      });
+  // 绉婚櫎鏂囦欢
+  async function handleRemove(file) {
+    if (!file?.id) {
+      return;
     }
-  });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
-  proxy.resetForm("formRef");
-  dialogFormVisible.value = false;
-};
-// 鎵撳紑浜у搧寮规
-const openProductForm = (type, row, index) => {
-  productOperationType.value = type;
-  productOperationIndex.value = index;
-  productForm.value = {};
-  proxy.resetForm("productFormRef");
-  if (type === "edit") {
-    productForm.value = { ...row };
-  }
-  productFormVisible.value = true;
-  getProductOptions();
-};
-const getProductOptions = () => {
-  productTreeList().then((res) => {
-    productOptions.value = convertIdToValue(res);
-  });
-};
-const getModels = (value) => {
-  if (value) {
-    productForm.value.productCategory = findNodeById(productOptions.value, value) || "";
-    modelList({ id: value }).then((res) => {
-      modelOptions.value = res;
-    });
-  } else {
-    productForm.value.productCategory = "";
-    modelOptions.value = [];
-  }
-};
-const getProductModel = (value) => {
-  const index = modelOptions.value.findIndex((item) => item.id === value);
-  if (index !== -1) {
-    productForm.value.specificationModel = modelOptions.value[index].model;
-    productForm.value.unit = modelOptions.value[index].unit;
-  } else {
-    productForm.value.specificationModel = null;
-    productForm.value.unit = null;
-  }
-};
-const findNodeById = (nodes, productId) => {
-  for (let i = 0; i < nodes.length; i++) {
-    if (nodes[i].value === productId) {
-      return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣鐨刲abel
-    }
-    if (nodes[i].children && nodes[i].children.length > 0) {
-      const foundNode = findNodeById(nodes[i].children, productId);
-      if (foundNode) {
-        return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝鐩存帴杩斿洖锛堝凡缁忔槸label瀛楃涓诧級
-      }
-    }
-  }
-  return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
-};
-function convertIdToValue(data) {
-  return data.map((item) => {
-    const { id, children, ...rest } = item;
-    const newItem = {
-      ...rest,
-      value: id, // 灏� id 鏀逛负 value
-    };
-    if (children && children.length > 0) {
-      newItem.children = convertIdToValue(children);
+    console.log("handleRemove", file.id);
+    if (file.size > 1024 * 1024 * 10) {
+      // 浠呭墠绔竻鐞嗭紝涓嶈皟鐢ㄥ垹闄ゆ帴鍙e拰鎻愮ず
+      return;
     }
 
-    return newItem;
-  });
-}
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitProduct = () => {
-  proxy.$refs["productFormRef"].validate((valid) => {
-    if (valid) {
-      if (operationType.value === "edit") {
-        submitProductEdit();
-      } else {
-        if (productOperationType.value === "add") {
-          productData.value.push({ ...productForm.value });
-          console.log("productData.value---", productData.value);
-        } else {
-          productData.value[productOperationIndex.value] = {
-            ...productForm.value,
-          };
-        }
-        closeProductDia();
+    if (operationType.value === "edit" && file.id) {
+      try {
+        await delLedgerFile([file.id]);
+        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      } catch (error) {
+        console.error("鍒犻櫎鏂囦欢澶辫触:", error);
+        proxy.$modal.msgError("鍒犻櫎鏂囦欢澶辫触");
       }
     }
-  });
-};
-const submitProductEdit = () => {
-  productForm.value.salesLedgerId = currentId.value;
-  productForm.value.type = 2;
-  addOrUpdateSalesLedgerProduct(productForm.value).then((res) => {
-    proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-    closeProductDia();
-    getPurchaseById({ id: currentId.value, type: 2 }).then((res) => {
-      productData.value = res.productData;
-    });
-  });
-};
-// 鍒犻櫎浜у搧
-const deleteProduct = () => {
-  if (productSelectedRows.value.length === 0) {
-    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-    return;
   }
-  if (operationType.value === "add") {
-    productSelectedRows.value.forEach((selectedRow) => {
-      const index = productData.value.findIndex(
-        (product) => product.id === selectedRow.id
-      );
-      if (index !== -1) {
-        productData.value.splice(index, 1);
+  // 鎻愪氦琛ㄥ崟
+  const submitForm = () => {
+    proxy.$refs["formRef"].validate(valid => {
+      if (valid) {
+        if (productData.value.length > 0) {
+          form.value.productData = proxy.HaveJson(productData.value);
+        } else {
+          proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
+          return;
+        }
+        let tempFileIds = [];
+        if (fileList.value.length > 0) {
+          tempFileIds = fileList.value.map(item => item.tempId);
+        }
+        form.value.tempFileIds = tempFileIds;
+        form.value.type = 2;
+
+        // 濡傛灉salesLedgerId涓虹┖锛屽垯涓嶄紶閫抯alesContractNo
+        if (!form.value.salesLedgerId) {
+          form.value.salesContractNo = "";
+        }
+
+        addOrEditPurchase(form.value).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+          getList();
+        });
       }
     });
-  } else {
+  };
+  // 鍏抽棴寮规
+  const closeDia = () => {
+    proxy.resetForm("formRef");
+    dialogFormVisible.value = false;
+  };
+  // 鎵撳紑浜у搧寮规
+  const openProductForm = (type, row, index) => {
+    productOperationType.value = type;
+    productOperationIndex.value = index;
+    productForm.value = {};
+    proxy.resetForm("productFormRef");
+    if (type === "edit") {
+      productForm.value = { ...row };
+    }
+    productFormVisible.value = true;
+    getProductOptions();
+  };
+  const getProductOptions = () => {
+    productTreeList().then(res => {
+      productOptions.value = convertIdToValue(res);
+    });
+  };
+  const getModels = value => {
+    if (value) {
+      productForm.value.productCategory =
+        findNodeById(productOptions.value, value) || "";
+      modelList({ id: value }).then(res => {
+        modelOptions.value = res;
+      });
+    } else {
+      productForm.value.productCategory = "";
+      modelOptions.value = [];
+    }
+  };
+  const getProductModel = value => {
+    const index = modelOptions.value.findIndex(item => item.id === value);
+    if (index !== -1) {
+      productForm.value.specificationModel = modelOptions.value[index].model;
+      productForm.value.unit = modelOptions.value[index].unit;
+    } else {
+      productForm.value.specificationModel = null;
+      productForm.value.unit = null;
+    }
+  };
+  const findNodeById = (nodes, productId) => {
+    for (let i = 0; i < nodes.length; i++) {
+      if (nodes[i].value === productId) {
+        return nodes[i].label; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣鐨刲abel
+      }
+      if (nodes[i].children && nodes[i].children.length > 0) {
+        const foundNode = findNodeById(nodes[i].children, productId);
+        if (foundNode) {
+          return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝鐩存帴杩斿洖锛堝凡缁忔槸label瀛楃涓诧級
+        }
+      }
+    }
+    return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
+  };
+  function convertIdToValue(data) {
+    return data.map(item => {
+      const { id, children, ...rest } = item;
+      const newItem = {
+        ...rest,
+        value: id, // 灏� id 鏀逛负 value
+      };
+      if (children && children.length > 0) {
+        newItem.children = convertIdToValue(children);
+      }
+
+      return newItem;
+    });
+  }
+  // 鎻愪氦浜у搧琛ㄥ崟
+  const submitProduct = () => {
+    proxy.$refs["productFormRef"].validate(valid => {
+      if (valid) {
+        if (operationType.value === "edit") {
+          submitProductEdit();
+        } else {
+          if (productOperationType.value === "add") {
+            productData.value.push({ ...productForm.value });
+            console.log("productData.value---", productData.value);
+          } else {
+            productData.value[productOperationIndex.value] = {
+              ...productForm.value,
+            };
+          }
+          closeProductDia();
+        }
+      }
+    });
+  };
+  const submitProductEdit = () => {
+    productForm.value.salesLedgerId = currentId.value;
+    productForm.value.type = 2;
+    addOrUpdateSalesLedgerProduct(productForm.value).then(res => {
+      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+      closeProductDia();
+      getPurchaseById({ id: currentId.value, type: 2 }).then(res => {
+        productData.value = res.productData;
+      });
+    });
+  };
+  // 鍒犻櫎浜у搧
+  const deleteProduct = () => {
+    if (productSelectedRows.value.length === 0) {
+      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+      return;
+    }
+    if (operationType.value === "add") {
+      productSelectedRows.value.forEach(selectedRow => {
+        const index = productData.value.findIndex(
+          product => product.id === selectedRow.id
+        );
+        if (index !== -1) {
+          productData.value.splice(index, 1);
+        }
+      });
+    } else {
+      let ids = [];
+      if (productSelectedRows.value.length > 0) {
+        ids = productSelectedRows.value.map(item => item.id);
+      }
+      ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
+        confirmButtonText: "纭",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      })
+        .then(() => {
+          delProduct(ids).then(res => {
+            proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+            closeProductDia();
+            getSalesLedgerWithProducts({ id: currentId.value, type: 2 }).then(
+              res => {
+                productData.value = res.productData;
+              }
+            );
+          });
+        })
+        .catch(() => {
+          proxy.$modal.msg("宸插彇娑�");
+        });
+    }
+  };
+  // 鍏抽棴浜у搧寮规
+  const closeProductDia = () => {
+    proxy.resetForm("productFormRef");
+    productFormVisible.value = false;
+  };
+  // 瀵煎嚭
+  const handleOut = () => {
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
+      .then(() => {
+        proxy.download("/purchase/ledger/export", {}, "閲囪喘鍙拌处.xlsx");
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+  };
+  // 鍒犻櫎
+  const handleDelete = () => {
     let ids = [];
-    if (productSelectedRows.value.length > 0) {
-      ids = productSelectedRows.value.map((item) => item.id);
+    if (selectedRows.value.length > 0) {
+      // 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
+      const unauthorizedData = selectedRows.value.filter(
+        item => item.recorderName !== userStore.nickName
+      );
+      if (unauthorizedData.length > 0) {
+        proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
+        return;
+      }
+      ids = selectedRows.value.map(item => item.id);
+    } else {
+      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+      return;
     }
     ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
       confirmButtonText: "纭",
@@ -1567,388 +1585,347 @@
       type: "warning",
     })
       .then(() => {
-        delProduct(ids).then((res) => {
+        delPurchase(ids).then(res => {
           proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-          closeProductDia();
-          getSalesLedgerWithProducts({ id: currentId.value, type: 2 }).then(
-            (res) => {
-              productData.value = res.productData;
-            }
-          );
+          getList();
         });
       })
       .catch(() => {
         proxy.$modal.msg("宸插彇娑�");
       });
+  };
+  // 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
+  function getCurrentDate() {
+    const today = new Date();
+    const year = today.getFullYear();
+    const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
+    const day = String(today.getDate()).padStart(2, "0");
+    return `${year}-${month}-${day}`;
   }
-};
-// 鍏抽棴浜у搧寮规
-const closeProductDia = () => {
-  proxy.resetForm("productFormRef");
-  productFormVisible.value = false;
-};
-// 瀵煎嚭
-const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      proxy.download("/purchase/ledger/export", {}, "閲囪喘鍙拌处.xlsx");
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-// 鍒犻櫎
-const handleDelete = () => {
-  let ids = [];
-  if (selectedRows.value.length > 0) {
-		// 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
-		const unauthorizedData = selectedRows.value.filter(item => item.recorderName !== userStore.nickName);
-		if (unauthorizedData.length > 0) {
-			proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
-			return;
-		}
-    ids = selectedRows.value.map((item) => item.id);
-  } else {
-    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-    return;
-  }
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      delPurchase(ids).then((res) => {
-        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        getList();
-      });
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
-};
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
-  const today = new Date();
-  const year = today.getFullYear();
-  const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
-  const day = String(today.getDate()).padStart(2, "0");
-  return `${year}-${month}-${day}`;
-}
-const mathNum = () => {
-	if (!productForm.value.taxRate) {
-		proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
-		return;
-	}
-  if (!productForm.value.taxInclusiveUnitPrice) {
-    return;
-  }
-  if (!productForm.value.quantity) {
-    return;
-  }
-  // 鍚◣鎬讳环璁$畻
-  productForm.value.taxInclusiveTotalPrice =
-    proxy.calculateTaxIncludeTotalPrice(
-      productForm.value.taxInclusiveUnitPrice,
-      productForm.value.quantity
-    );
-  if (productForm.value.taxRate) {
-    // 涓嶅惈绋庢�讳环璁$畻
-    productForm.value.taxExclusiveTotalPrice =
-      proxy.calculateTaxExclusiveTotalPrice(
-        productForm.value.taxInclusiveTotalPrice,
-        productForm.value.taxRate
-      );
-  }
-};
-const reverseMathNum = (field) => {
-	if (!productForm.value.taxRate) {
-		proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
-		return;
-	}
-  const taxRate = Number(productForm.value.taxRate);
-  if (!taxRate) return;
-  if (field === 'taxInclusiveTotalPrice') {
-    // 宸茬煡鍚◣鎬讳环鍜屾暟閲忥紝鍙嶇畻鍚◣鍗曚环
-    if (productForm.value.quantity) {
-      productForm.value.taxInclusiveUnitPrice = 
-        (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.quantity)).toFixed(2);
-    }
-    // 宸茬煡鍚◣鎬讳环鍜屽惈绋庡崟浠凤紝鍙嶇畻鏁伴噺
-    else if (productForm.value.taxInclusiveUnitPrice) {
-      productForm.value.quantity = 
-        (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.taxInclusiveUnitPrice)).toFixed(2);
-    }
-    // 鍙嶇畻涓嶅惈绋庢�讳环
-    productForm.value.taxExclusiveTotalPrice = 
-      (Number(productForm.value.taxInclusiveTotalPrice) / (1 + taxRate / 100)).toFixed(2);
-  } else if (field === 'taxExclusiveTotalPrice') {
-    // 鍙嶇畻鍚◣鎬讳环
-    productForm.value.taxInclusiveTotalPrice = 
-      (Number(productForm.value.taxExclusiveTotalPrice) * (1 + taxRate / 100)).toFixed(2);
-    // 宸茬煡鏁伴噺锛屽弽绠楀惈绋庡崟浠�
-    if (productForm.value.quantity) {
-      productForm.value.taxInclusiveUnitPrice = 
-        (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.quantity)).toFixed(2);
-    }
-    // 宸茬煡鍚◣鍗曚环锛屽弽绠楁暟閲�
-    else if (productForm.value.taxInclusiveUnitPrice) {
-      productForm.value.quantity = 
-        (Number(productForm.value.taxInclusiveTotalPrice) / Number(productForm.value.taxInclusiveUnitPrice)).toFixed(2);
-    }
-  }
-};
-// 閿�鍞悎鍚岄�夋嫨鏀瑰彉鏂规硶
-const salesLedgerChange = async (row) => {
-  console.log("row", row);
-  var index = salesContractList.value.findIndex((item) => item.id == row);
-  console.log("index", index);
-  if (index > -1) {
-    await querygProductInfoByContractNo();
-  }
-};
-
-const querygProductInfoByContractNo = async () => {
-  const { code, data } = await getProductInfoByContractNo({
-    contractNo: form.value.salesLedgerId,
-  });
-  if (code == 200) {
-    productData.value = data;
-  }
-};
-
-const fileListRef = ref(null)
-const downLoadFile = (row) => {
-	fileListRef.value.open(row.salesLedgerFiles)
-}
-
-// 鏄剧ず浜岀淮鐮�
-const showQRCode = async (row) => {
-  try {
-    // 鏋勫缓浜岀淮鐮佸唴瀹癸紝鍙寘鍚噰璐悎鍚屽彿锛堢函鏂囨湰锛�
-    const qrContent = row.purchaseContractNumber || '';
-    // 妫�鏌ュ唴瀹规槸鍚︿负绌�
-    if (!qrContent || qrContent.trim() === '') {
-      proxy.$modal.msgWarning("璇ヨ娌℃湁閲囪喘鍚堝悓鍙凤紝鏃犳硶鐢熸垚浜岀淮鐮�");
+  const mathNum = () => {
+    if (!productForm.value.taxRate) {
+      proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
       return;
     }
-    qrCodeUrl.value = await QRCode.toDataURL(qrContent, {
-      width: 200,
-      margin: 2,
-      color: {
-        dark: '#000000',
-        light: '#FFFFFF'
+    if (!productForm.value.taxInclusiveUnitPrice) {
+      return;
+    }
+    if (!productForm.value.quantity) {
+      return;
+    }
+    // 鍚◣鎬讳环璁$畻
+    productForm.value.taxInclusiveTotalPrice =
+      proxy.calculateTaxIncludeTotalPrice(
+        productForm.value.taxInclusiveUnitPrice,
+        productForm.value.quantity
+      );
+    if (productForm.value.taxRate) {
+      // 涓嶅惈绋庢�讳环璁$畻
+      productForm.value.taxExclusiveTotalPrice =
+        proxy.calculateTaxExclusiveTotalPrice(
+          productForm.value.taxInclusiveTotalPrice,
+          productForm.value.taxRate
+        );
+    }
+  };
+  const reverseMathNum = field => {
+    if (!productForm.value.taxRate) {
+      proxy.$modal.msgWarning("璇峰厛閫夋嫨绋庣巼");
+      return;
+    }
+    const taxRate = Number(productForm.value.taxRate);
+    if (!taxRate) return;
+    if (field === "taxInclusiveTotalPrice") {
+      // 宸茬煡鍚◣鎬讳环鍜屾暟閲忥紝鍙嶇畻鍚◣鍗曚环
+      if (productForm.value.quantity) {
+        productForm.value.taxInclusiveUnitPrice = (
+          Number(productForm.value.taxInclusiveTotalPrice) /
+          Number(productForm.value.quantity)
+        ).toFixed(2);
+      }
+      // 宸茬煡鍚◣鎬讳环鍜屽惈绋庡崟浠凤紝鍙嶇畻鏁伴噺
+      else if (productForm.value.taxInclusiveUnitPrice) {
+        productForm.value.quantity = (
+          Number(productForm.value.taxInclusiveTotalPrice) /
+          Number(productForm.value.taxInclusiveUnitPrice)
+        ).toFixed(2);
+      }
+      // 鍙嶇畻涓嶅惈绋庢�讳环
+      productForm.value.taxExclusiveTotalPrice = (
+        Number(productForm.value.taxInclusiveTotalPrice) /
+        (1 + taxRate / 100)
+      ).toFixed(2);
+    } else if (field === "taxExclusiveTotalPrice") {
+      // 鍙嶇畻鍚◣鎬讳环
+      productForm.value.taxInclusiveTotalPrice = (
+        Number(productForm.value.taxExclusiveTotalPrice) *
+        (1 + taxRate / 100)
+      ).toFixed(2);
+      // 宸茬煡鏁伴噺锛屽弽绠楀惈绋庡崟浠�
+      if (productForm.value.quantity) {
+        productForm.value.taxInclusiveUnitPrice = (
+          Number(productForm.value.taxInclusiveTotalPrice) /
+          Number(productForm.value.quantity)
+        ).toFixed(2);
+      }
+      // 宸茬煡鍚◣鍗曚环锛屽弽绠楁暟閲�
+      else if (productForm.value.taxInclusiveUnitPrice) {
+        productForm.value.quantity = (
+          Number(productForm.value.taxInclusiveTotalPrice) /
+          Number(productForm.value.taxInclusiveUnitPrice)
+        ).toFixed(2);
+      }
+    }
+  };
+  // 閿�鍞悎鍚岄�夋嫨鏀瑰彉鏂规硶
+  const salesLedgerChange = async row => {
+    console.log("row", row);
+    var index = salesContractList.value.findIndex(item => item.id == row);
+    console.log("index", index);
+    if (index > -1) {
+      await querygProductInfoByContractNo();
+    }
+  };
+
+  const querygProductInfoByContractNo = async () => {
+    const { code, data } = await getProductInfoByContractNo({
+      contractNo: form.value.salesLedgerId,
+    });
+    if (code == 200) {
+      productData.value = data;
+    }
+  };
+
+  const fileListRef = ref(null);
+  const downLoadFile = row => {
+    fileListRef.value.open(row.salesLedgerFiles);
+  };
+
+  // 鏄剧ず浜岀淮鐮�
+  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;
+    }
+
+    const a = document.createElement("a");
+    a.href = qrCodeUrl.value;
+    a.download = `閲囪喘鍚堝悓鍙蜂簩缁寸爜_${new Date().getTime()}.png`;
+    document.body.appendChild(a);
+    a.click();
+    document.body.removeChild(a);
+    proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
+  };
+
+  // 鎵爜鏂板瀵硅瘽妗嗙浉鍏冲彉閲�
+  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 >= 2) {
+      scanAddForm.purchaseContractNumber = parts[0] || "";
+      scanAddForm.supplierName = parts[1] || "";
+      scanAddForm.contractAmount = parts[2] || "";
+      scanAddForm.paymentMethod = parts[3] || "";
+      scanAddForm.projectName = parts[4] || "";
+      // scanAddForm.contractAmount = parts[3] || "";
+      // scanAddForm.paymentMethod = parts[4] || "";
+    }
+  };
+
+  // 鍏抽棴鎵爜鏂板瀵硅瘽妗�
+  const closeScanAddDialog = () => {
+    scanAddDialogVisible.value = false;
+    proxy.resetForm("scanAddFormRef");
+  };
+
+  // 鎻愪氦鎵爜鏂板
+  const submitScanAdd = () => {
+    proxy.$refs["scanAddFormRef"].validate(valid => {
+      if (valid) {
+        // 鏋勫缓鏂板鏁版嵁
+        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,
+        };
+
+        // 妯℃嫙鏂板鎴愬姛
+        proxy.$modal.msgSuccess("鎵爜鏂板鎴愬姛锛�");
+        closeScanAddDialog();
+
+        // 鍙互閫夋嫨鏄惁鍒锋柊鍒楄〃
+        // getList();
       }
     });
-    qrCodeDialogVisible.value = true;
-  } catch (error) {
-    console.error('鐢熸垚浜岀淮鐮佸け璐�:', error);
-    proxy.$modal.msgError("鐢熸垚浜岀淮鐮佸け璐ワ細" + error.message);
+  };
+
+  // 鎵撳紑鎵爜鐧昏瀵硅瘽妗�
+  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 = () => {
+    proxy.$refs["scanFormRef"].validate(valid => {
+      if (valid) {
+        // 娣诲姞鎵爜璁板綍
+        scanRecords.value.push({
+          ...scanForm,
+          id: Date.now(), // 妯℃嫙ID
+          scanTime: getCurrentDateTime(),
+        });
+        scanForm.scanStatus = "宸叉壂鐮�";
+        scanForm.scanRemark = scanForm.scanRemark || "鏃�";
+        proxy.$modal.msgSuccess("鎵爜鐧昏鎴愬姛锛�");
+        closeScanDialog();
+      }
+    });
+  };
+
+  // 鑾峰彇褰撳墠鏃ユ湡鏃堕棿
+  function getCurrentDateTime() {
+    const now = new Date();
+    const year = now.getFullYear();
+    const month = String(now.getMonth() + 1).padStart(2, "0");
+    const day = String(now.getDate()).padStart(2, "0");
+    const hours = String(now.getHours()).padStart(2, "0");
+    const minutes = String(now.getMinutes()).padStart(2, "0");
+    const seconds = String(now.getSeconds()).padStart(2, "0");
+    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
   }
-};
 
-// 涓嬭浇浜岀淮鐮�
-const downloadQRCode = () => {
-  if (!qrCodeUrl.value) {
-    proxy.$modal.msgWarning("浜岀淮鐮佹湭鐢熸垚");
-    return;
-  }
-  
-  const a = document.createElement('a');
-  a.href = qrCodeUrl.value;
-  a.download = `閲囪喘鍚堝悓鍙蜂簩缁寸爜_${new Date().getTime()}.png`;
-  document.body.appendChild(a);
-  a.click();
-  document.body.removeChild(a);
-  proxy.$modal.msgSuccess("涓嬭浇鎴愬姛");
-};
+  // 娣诲姞琛岀被鍚嶆柟娉�
+  const tableRowClassName = ({ row }) => {
+    return row.isInvalid ? "invalid-row" : "";
+  };
 
-// 鎵爜鏂板瀵硅瘽妗嗙浉鍏冲彉閲�
-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 >= 2) {
-    scanAddForm.purchaseContractNumber = parts[0] || "";
-    scanAddForm.supplierName = parts[1] || "";
-    scanAddForm.contractAmount = parts[2] || "";
-    scanAddForm.paymentMethod = parts[3] || "";
-    scanAddForm.projectName = parts[4] || "";
-    // scanAddForm.contractAmount = parts[3] || "";
-    // scanAddForm.paymentMethod = parts[4] || "";
-  }
-};
-
-// 鍏抽棴鎵爜鏂板瀵硅瘽妗�
-const closeScanAddDialog = () => {
-  scanAddDialogVisible.value = false;
-  proxy.resetForm("scanAddFormRef");
-};
-
-// 鎻愪氦鎵爜鏂板
-const submitScanAdd = () => {
-  proxy.$refs["scanAddFormRef"].validate((valid) => {
-    if (valid) {
-      // 鏋勫缓鏂板鏁版嵁
-      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
-      };
-      
-      // 妯℃嫙鏂板鎴愬姛
-      proxy.$modal.msgSuccess("鎵爜鏂板鎴愬姛锛�");
-      closeScanAddDialog();
-      
-      // 鍙互閫夋嫨鏄惁鍒锋柊鍒楄〃
-      // getList();
+  // 鑾峰彇妯℃澘淇℃伅
+  const getTemplateList = async () => {
+    let res = await getPurchaseTemplateList();
+    if (res && res.code === 200 && Array.isArray(res.data)) {
+      templateList.value = res.data;
     }
+  };
+
+  onMounted(() => {
+    getList();
+    getTemplateList();
   });
-};
-
-// 鎵撳紑鎵爜鐧昏瀵硅瘽妗�
-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 = () => {
-  proxy.$refs["scanFormRef"].validate((valid) => {
-    if (valid) {
-      // 娣诲姞鎵爜璁板綍
-      scanRecords.value.push({
-        ...scanForm,
-        id: Date.now(), // 妯℃嫙ID
-        scanTime: getCurrentDateTime(),
-      });
-      scanForm.scanStatus = "宸叉壂鐮�";
-      scanForm.scanRemark = scanForm.scanRemark || "鏃�";
-      proxy.$modal.msgSuccess("鎵爜鐧昏鎴愬姛锛�");
-      closeScanDialog();
-    }
-  });
-};
-
-// 鑾峰彇褰撳墠鏃ユ湡鏃堕棿
-function getCurrentDateTime() {
-  const now = new Date();
-  const year = now.getFullYear();
-  const month = String(now.getMonth() + 1).padStart(2, "0");
-  const day = String(now.getDate()).padStart(2, "0");
-  const hours = String(now.getHours()).padStart(2, "0");
-  const minutes = String(now.getMinutes()).padStart(2, "0");
-  const seconds = String(now.getSeconds()).padStart(2, "0");
-  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
-}
-
-// 娣诲姞琛岀被鍚嶆柟娉�
-const tableRowClassName = ({ row }) => {
-  return row.isInvalid ? 'invalid-row' : '';
-};
-
-// 鑾峰彇妯℃澘淇℃伅
-const getTemplateList =async ()=>{
-  let res = await getPurchaseTemplateList()
-  if(res && res.code===200 && Array.isArray(res.data)){
-    templateList.value = res.data
-  }
-}
-
-onMounted(() => {
-  getList();
-  getTemplateList();
-
-});
 </script>
 
 <style scoped lang="scss">
-.invalid-row {
-  opacity: 0.6;
-  background-color: #f5f7fa;
-}
-.el-row{
-  justify-content: space-between;
-  align-items: center
-}
-.no-arrow-select {
-  --el-select-suffix-icon-color: transparent; /* 闅愯棌榛樿涓嬫媺绠ご */
-}
-.select-button-group {
-  display: flex;
-  align-items: center;
-}
-
+  .invalid-row {
+    opacity: 0.6;
+    background-color: #f5f7fa;
+  }
+  .el-row {
+    justify-content: space-between;
+    align-items: center;
+  }
+  .no-arrow-select {
+    --el-select-suffix-icon-color: transparent; /* 闅愯棌榛樿涓嬫媺绠ご */
+  }
+  .select-button-group {
+    display: flex;
+    align-items: center;
+  }
 </style>
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
index 17b38bb..e519bd3 100644
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ b/src/views/salesManagement/invoiceRegistration/index.vue
@@ -1,356 +1,331 @@
 <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>
-					<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>
-		<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 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-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="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"
-						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%"
-															 :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%"
-															 :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 }">
+  <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>
+    <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
+                        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-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="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"
+                           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%"
+                               :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%"
+                               :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-table-column>
+          <el-table-column label="鐧昏鏃ユ湡"
+                           prop="registerDate"
+                           width="150">
+            <!-- <template #default="{ row }">
 							<el-date-picker
 								style="width: 100%"
 								v-model="row.registerDate"
@@ -362,410 +337,446 @@
 								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>
+          </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 { Search } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
-// import {userListNoPage} from "@/api/system/user.js";
-import {
-	getSalesLedgerWithProducts,
-	ledgerListPage,
-	productList,
-} from "@/api/salesManagement/salesLedger.js";
-import { invoiceRegistrationSave } from "@/api/salesManagement/invoiceRegistration.js";
-import useFormData from "@/hooks/useFormData";
-import useUserStore from "@/store/modules/user";
-import dayjs from "dayjs";
+  import pagination from "@/components/PIMTable/Pagination.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,
+  } from "@/api/salesManagement/salesLedger.js";
+  import { invoiceRegistrationSave } from "@/api/salesManagement/invoiceRegistration.js";
+  import useFormData from "@/hooks/useFormData";
+  import useUserStore from "@/store/modules/user";
+  import dayjs from "dayjs";
 
-const { proxy } = getCurrentInstance();
-const userStore = useUserStore();
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const tableLoading = ref(false);
-const page = reactive({
-	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, // 褰曞叆鏃ユ湡锛�
-		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 { proxy } = getCurrentInstance();
+  const userStore = useUserStore();
+  const tableData = ref([]);
+  const productData = ref([]);
+  const selectedRows = ref([]);
+  const tableLoading = ref(false);
+  const page = reactive({
+    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, // 褰曞叆鏃ユ湡锛�
+      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;
-	}
-};
+  const formattedNumber = (row, column, 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;
-};
+  const formattedInputNumber = value => {
+    return value ? parseFloat(value).toFixed(2) : 0;
+  };
 
-// 鏌ヨ鍒楄〃
-/** 鎼滅储鎸夐挳鎿嶄綔 */
-const handleQuery = () => {
-	page.current = 1;
-	getList();
-};
-const paginationChange = (obj) => {
-	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 = [];
-	});
-};
-// 琛ㄦ牸閫夋嫨鏁版嵁
-const handleSelectionChange = (selection) => {
-	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 = [];
-	}
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = (param) => {
-	return proxy.summarizeTable(param, [
-		"contractAmount",
-		"invoiceTotal",
-		"noInvoiceAmountTotal",
-	]);
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeChildrenTable = (param) => {
-	return proxy.summarizeTable(param, [
-		"taxInclusiveUnitPrice",
-		"taxInclusiveTotalPrice",
-		"taxExclusiveTotalPrice",
-		"invoiceNum",
-		"invoiceAmount",
-		"currentInvoiceAmount",
-		"noInvoiceNum",
-		"noInvoiceAmount",
-		"currentInvoiceNum",
-	]);
-};
-// 鎵撳紑寮规
-const openForm = () => {
-	// 鍒ゆ柇鏄惁閫夋嫨浜嗗悎鍚�
-	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) {
-			// 濡傛灉鏄壒閲忔搷浣滐紝灏嗘墍鏈夊悎鍚岀殑鏁版嵁鏀惧湪涓�涓暟缁勯噷锛屽彧璋冪敤涓�娆℃帴鍙�
-			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;
-};
-// 瀵煎嚭
-const handleOut = () => {
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			proxy.download("/invoiceRegistration/export", {}, "寮�绁ㄧ櫥璁颁俊鎭�.xlsx");
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
+  // 鏌ヨ鍒楄〃
+  /** 鎼滅储鎸夐挳鎿嶄綔 */
+  const handleQuery = () => {
+    page.current = 1;
+    getList();
+  };
+  const paginationChange = obj => {
+    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 = [];
+    });
+  };
+  // 琛ㄦ牸閫夋嫨鏁版嵁
+  const handleSelectionChange = selection => {
+    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 = [];
+    }
+  };
+  // 涓昏〃鍚堣鏂规硶
+  const summarizeMainTable = param => {
+    return proxy.summarizeTable(param, [
+      "contractAmount",
+      "invoiceTotal",
+      "noInvoiceAmountTotal",
+    ]);
+  };
+  // 瀛愯〃鍚堣鏂规硶
+  const summarizeChildrenTable = param => {
+    return proxy.summarizeTable(param, [
+      "taxInclusiveUnitPrice",
+      "taxInclusiveTotalPrice",
+      "taxExclusiveTotalPrice",
+      "invoiceNum",
+      "invoiceAmount",
+      "currentInvoiceAmount",
+      "noInvoiceNum",
+      "noInvoiceAmount",
+      "currentInvoiceNum",
+    ]);
+  };
+  // 鎵撳紑寮规
+  const openForm = () => {
+    // 鍒ゆ柇鏄惁閫夋嫨浜嗗悎鍚�
+    if (selectedRows.value.length === 0) {
+      proxy.$modal.msgError("璇疯嚦灏戦�夋嫨涓�鏉″悎鍚�");
+      return;
+    }
 
-// 瀵煎嚭閿�鍞彴璐�
-const handleExport = () => {
-	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-		confirmButtonText: "纭",
-		cancelButtonText: "鍙栨秷",
-		type: "warning",
-	})
-		.then(() => {
-			proxy.download("/sales/ledger/exportOne", { ...searchForm, ...page }, "寮�绁ㄧ櫥璁�.xlsx");
-		})
-		.catch(() => {
-			proxy.$modal.msg("宸插彇娑�");
-		});
-};
+    // 妫�鏌ユ墍鏈夐�夋嫨鐨勫悎鍚屾槸鍚﹀叿鏈夌浉鍚岀殑瀹㈡埛鍚嶇О
+    const firstRow = selectedRows.value[0];
+    const isSameCustomer = selectedRows.value.every(
+      row => row.customerName === firstRow.customerName
+    );
 
-//鏈寮�绁ㄥけ鐒︽搷浣�
-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);
-};
-// 鏈寮�绁ㄩ噾棰濆け鐒︽搷浣�
-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 (!isSameCustomer) {
+      proxy.$modal.msgError("璇烽�夋嫨鐩稿悓瀹㈡埛鍚嶇О鐨勫悎鍚�");
+      return;
+    }
 
-onMounted(() => {
-	getList();
-});
+    // 鍏佽涓嶅悓鐨勯攢鍞悎鍚屽彿鎵归噺澶勭悊锛屾棤闇�妫�鏌ラ噸澶�
+
+    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;
+        console.log("result.productData", result.productData);
+
+        if (result.productData) {
+          result.productData.forEach(item => {
+            allProductData.push({
+              ...item,
+              // id: contractId, // 鏄庣‘璁剧疆鍚堝悓ID
+              salesContractNo: contract.salesContractNo, // 娣诲姞閿�鍞悎鍚屽彿
+              customerName: contract.customerName, // 娣诲姞瀹㈡埛鍚嶇О
+              customerContractNo: contract.customerContractNo, // 娣诲姞瀹㈡埛鍚堝悓鍙�
+            });
+          });
+        }
+      });
+      console.log("allProductData", allProductData);
+
+      // 璁剧疆琛ㄥ崟鏁版嵁锛堜娇鐢ㄧ涓�涓悎鍚岀殑鍩烘湰淇℃伅锛岄攢鍞悎鍚屽彿鐣欑┖锛�
+      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 processProductData = products => {
+    return products.map(product => {
+      return {
+        ...product,
+        currentInvoiceNum: product.currentInvoiceNum
+          ? Number(Number(product.currentInvoiceNum).toFixed(2))
+          : 0,
+        currentInvoiceAmount: product.currentInvoiceAmount
+          ? Number(Number(product.currentInvoiceAmount).toFixed(2))
+          : 0,
+        noInvoiceNum: product.noInvoiceNum
+          ? Number(Number(product.noInvoiceNum).toFixed(2))
+          : 0,
+        noInvoiceAmount: product.noInvoiceAmount
+          ? Number(Number(product.noInvoiceAmount).toFixed(2))
+          : 0,
+      };
+    });
+  };
+  // 鎻愪氦琛ㄥ崟
+  const submitForm = () => {
+    proxy.$refs["formRef"].validate(valid => {
+      if (valid) {
+        // 澶勭悊浜у搧鏁版嵁锛屽皢 currentInvoiceNum 鍜� currentInvoiceAmount 杞崲涓烘暟瀛�
+
+        // 濡傛灉鏄壒閲忔搷浣滐紝灏嗘墍鏈夊悎鍚岀殑鏁版嵁鏀惧湪涓�涓暟缁勯噷锛屽彧璋冪敤涓�娆℃帴鍙�
+        if (selectedRows.value.length > 1) {
+          // 鍒涘缓鍖呭惈鎵�鏈夊悎鍚屾暟鎹殑鏁扮粍
+          const batchData = selectedRows.value.map(contract => {
+            // 绛涢�夊嚭灞炰簬褰撳墠鍚堝悓鐨勪骇鍝佹暟鎹�
+            const contractProductData = productData.value.filter(
+              item => item.salesLedgerId === contract.id
+            );
+
+            // 澶勭悊浜у搧鏁版嵁锛岃浆鎹负鏁板瓧鏍煎紡
+            const processedProductData = processProductData(contractProductData);
+
+            // 涓烘瘡涓攢鍞悎鍚屽彿鍒涘缓鐙珛鐨勫璞�
+            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(processedProductData),
+
+              // 鎵归噺鏍囪瘑
+              isBatch: true,
+            };
+          });
+
+          // 鍙皟鐢ㄤ竴娆℃帴鍙o紝浼犻�掑寘鍚墍鏈夊悎鍚屾暟鎹殑鏁扮粍
+          invoiceRegistrationSave(batchData).then(() => {
+            proxy.$modal.msgSuccess("鎵归噺鏂板鎴愬姛");
+            closeDia();
+            getList();
+          });
+        } else {
+          // 鍗曚釜鍚堝悓鎻愪氦閫昏緫 - 涔熶互鏁扮粍褰㈠紡浼犻��
+          const singleContract = selectedRows.value[0];
+
+          // 澶勭悊浜у搧鏁版嵁锛岃浆鎹负鏁板瓧鏍煎紡
+          const processedProductData = processProductData(productData.value);
+          console.log("processedProductData ", processedProductData);
+
+          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(processedProductData),
+
+              // 鎵归噺鏍囪瘑
+              isBatch: false,
+            },
+          ];
+          console.log("singleFormArray ", singleFormArray);
+          invoiceRegistrationSave(singleFormArray).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("/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("宸插彇娑�");
+      });
+  };
+
+  //鏈寮�绁ㄥけ鐒︽搷浣�
+  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);
+  };
+  // 鏈寮�绁ㄩ噾棰濆け鐒︽搷浣�
+  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);
+    // 璁$畻鏈紑绁ㄦ暟
+    row.noInvoiceNum = (row.originalNoInvoiceNum - row.currentInvoiceNum).toFixed(
+      2
+    );
+    // 璁$畻鏈紑绁ㄩ噾棰�
+    row.noInvoiceAmount = (
+      row.tempnoInvoiceAmount - row.currentInvoiceAmount
+    ).toFixed(2);
+  };
+
+  onMounted(() => {
+    getList();
+  });
 </script>
 
 <style scoped lang="scss">
-.table_list {
-	margin-top: unset;
-}
-.flex {
-	display: flex;
-}
-.justify-between {
-	justify-content: space-between;
-}
-::v-deep(.el-checkbox__label) {
-	font-weight: bold;
-}
+  .table_list {
+    margin-top: unset;
+  }
+  .flex {
+    display: flex;
+  }
+  .justify-between {
+    justify-content: space-between;
+  }
+  ::v-deep(.el-checkbox__label) {
+    font-weight: bold;
+  }
 </style>
 
 

--
Gitblit v1.9.3