From 4eda70d80cfacbe107929effb0ff65b9c794deb1 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期四, 07 五月 2026 13:13:07 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_NEW_pro' into dev_NEW_pro

---
 src/views/procurementManagement/procurementLedger/index.vue | 2338 ++++++++++++++++++++++++++++++-----------------------------
 1 files changed, 1,183 insertions(+), 1,155 deletions(-)

diff --git a/src/views/procurementManagement/procurementLedger/index.vue b/src/views/procurementManagement/procurementLedger/index.vue
index 7c8cb89..cffdcc6 100644
--- a/src/views/procurementManagement/procurementLedger/index.vue
+++ b/src/views/procurementManagement/procurementLedger/index.vue
@@ -9,7 +9,7 @@
                       placeholder="璇疯緭鍏�"
                       clearable
                       prefix-icon="Search"
-                      @change="handleQuery"/>
+                      @change="handleQuery" />
           </el-form-item>
           <el-form-item label="閲囪喘鍚堝悓鍙凤細">
             <el-input v-model="searchForm.purchaseContractNumber"
@@ -17,21 +17,21 @@
                       placeholder="璇疯緭鍏�"
                       @change="handleQuery"
                       clearable
-                      :prefix-icon="Search"/>
+                      :prefix-icon="Search" />
           </el-form-item>
           <el-form-item label="閿�鍞悎鍚屽彿锛�">
             <el-input v-model="searchForm.salesContractNo"
                       placeholder="璇疯緭鍏�"
                       clearable
                       prefix-icon="Search"
-                      @change="handleQuery"/>
+                      @change="handleQuery" />
           </el-form-item>
           <el-form-item label="椤圭洰鍚嶇О锛�">
             <el-input v-model="searchForm.projectName"
                       placeholder="璇疯緭鍏�"
                       clearable
                       prefix-icon="Search"
-                      @change="handleQuery"/>
+                      @change="handleQuery" />
           </el-form-item>
           <el-form-item label="褰曞叆鏃ユ湡锛�">
             <el-date-picker v-model="searchForm.entryDate"
@@ -40,7 +40,7 @@
                             type="daterange"
                             placeholder="璇烽�夋嫨"
                             clearable
-                            @change="changeDaterange"/>
+                            @change="changeDaterange" />
           </el-form-item>
           <el-form-item>
             <el-button type="primary"
@@ -54,7 +54,9 @@
       <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
         <el-button type="primary"
                    @click="openForm('add')">鏂板鍙拌处</el-button>
-        <el-button type="primary" plain @click="handleImport">瀵煎叆</el-button>
+        <el-button type="primary"
+                   plain
+                   @click="handleImport">瀵煎叆</el-button>
         <el-button @click="handleOut">瀵煎嚭</el-button>
         <el-button type="danger"
                    plain
@@ -73,7 +75,7 @@
                 height="calc(100vh - 21.5em)">
         <el-table-column align="center"
                          type="selection"
-                         width="55"/>
+                         width="55" />
         <el-table-column type="expand">
           <template #default="props">
             <el-table :data="props.row.children"
@@ -83,62 +85,60 @@
               <el-table-column align="center"
                                label="搴忓彿"
                                type="index"
-                               width="60"/>
+                               width="60" />
               <el-table-column label="浜у搧澶х被"
-                               prop="productCategory"/>
+                               prop="productCategory" />
               <el-table-column label="瑙勬牸鍨嬪彿"
-                               prop="specificationModel"/>
+                               prop="specificationModel" />
               <el-table-column label="鍗曚綅"
-                               prop="unit"/>
+                               prop="unit" />
               <el-table-column label="鏁伴噺"
-                               prop="quantity"/>
+                               prop="quantity" />
               <el-table-column label="鍙敤鏁伴噺"
-                               prop="availableQuality"/>
+                               prop="availableQuality" />
               <el-table-column label="閫�璐ф暟閲�"
-                               prop="returnQuality"/>
-
+                               prop="returnQuality" />
               <el-table-column label="绋庣巼(%)"
-                               prop="taxRate"/>
+                               prop="taxRate" />
               <el-table-column label="鍚◣鍗曚环(鍏�)"
                                prop="taxInclusiveUnitPrice"
-                               :formatter="formattedNumber"/>
+                               :formatter="formattedNumber" />
               <el-table-column label="鍚◣鎬讳环(鍏�)"
                                prop="taxInclusiveTotalPrice"
-                               :formatter="formattedNumber"/>
+                               :formatter="formattedNumber" />
               <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
                                prop="taxExclusiveTotalPrice"
-                               :formatter="formattedNumber"/>
+                               :formatter="formattedNumber" />
             </el-table>
           </template>
         </el-table-column>
         <el-table-column align="center"
                          label="搴忓彿"
                          type="index"
-                         width="60"/>
+                         width="60" />
         <el-table-column label="閲囪喘鍚堝悓鍙�"
                          prop="purchaseContractNumber"
                          width="160"
-                         show-overflow-tooltip/>
+                         show-overflow-tooltip />
         <el-table-column label="閿�鍞悎鍚屽彿"
                          prop="salesContractNo"
                          width="160"
-                         show-overflow-tooltip/>
+                         show-overflow-tooltip />
         <el-table-column label="渚涘簲鍟嗗悕绉�"
                          prop="supplierName"
                          width="160"
-                         show-overflow-tooltip/>
+                         show-overflow-tooltip />
         <el-table-column label="椤圭洰鍚嶇О"
                          prop="projectName"
                          width="320"
-                         show-overflow-tooltip/>
+                         show-overflow-tooltip />
         <el-table-column label="瀹℃壒鐘舵��"
                          prop="approvalStatus"
                          width="100"
                          show-overflow-tooltip>
           <template #default="scope">
-            <el-tag
-                :type="getApprovalStatusType(scope.row.approvalStatus)"
-                size="small">
+            <el-tag :type="getApprovalStatusType(scope.row.approvalStatus)"
+                    size="small">
               {{ approvalStatusText[scope.row.approvalStatus] || '鏈煡鐘舵��' }}
             </el-tag>
           </template>
@@ -146,28 +146,28 @@
         <el-table-column label="绛捐鏃ユ湡"
                          prop="executionDate"
                          width="100"
-                         show-overflow-tooltip/>
+                         show-overflow-tooltip />
         <el-table-column label="浠樻鏂瑰紡"
                          width="100"
                          prop="paymentMethod"
-                         show-overflow-tooltip/>
+                         show-overflow-tooltip />
         <el-table-column label="鍚堝悓閲戦(鍏�)"
                          prop="contractAmount"
                          width="200"
                          show-overflow-tooltip
-                         :formatter="formattedNumber"/>
+                         :formatter="formattedNumber" />
         <el-table-column label="褰曞叆浜�"
                          prop="recorderName"
                          width="120"
-                         show-overflow-tooltip/>
+                         show-overflow-tooltip />
         <el-table-column label="褰曞叆鏃ユ湡"
                          prop="entryDate"
                          width="100"
-                         show-overflow-tooltip/>
+                         show-overflow-tooltip />
         <el-table-column label="澶囨敞"
                          prop="remarks"
                          width="200"
-                         show-overflow-tooltip/>
+                         show-overflow-tooltip />
         <el-table-column fixed="right"
                          label="鎿嶄綔"
                          width="120"
@@ -189,7 +189,7 @@
                   layout="total, sizes, prev, pager, next, jumper"
                   :page="page.current"
                   :limit="page.size"
-                  @pagination="paginationChange"/>
+                  @pagination="paginationChange" />
     </div>
     <FormDialog v-model="dialogFormVisible"
                 :title="operationType === 'add' ? '鏂板閲囪喘鍙拌处椤甸潰' : '缂栬緫閲囪喘鍙拌处椤甸潰'"
@@ -209,7 +209,7 @@
                           prop="purchaseContractNumber">
               <el-input v-model="form.purchaseContractNumber"
                         placeholder="璇疯緭鍏�"
-                        clearable/>
+                        clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -223,7 +223,7 @@
                 <el-option v-for="item in salesContractList"
                            :key="item.id"
                            :label="item.salesContractNo"
-                           :value="item.id"/>
+                           :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -249,7 +249,7 @@
                           prop="projectName">
               <el-input v-model="form.projectName"
                         placeholder="璇疯緭鍏�"
-                        clearable/>
+                        clearable />
             </el-form-item>
           </el-col>
         </el-row>
@@ -258,7 +258,7 @@
             <el-form-item label="浠樻鏂瑰紡">
               <el-input v-model="form.paymentMethod"
                         placeholder="璇疯緭鍏�"
-                        clearable/>
+                        clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -270,7 +270,7 @@
                               format="YYYY-MM-DD"
                               type="date"
                               placeholder="璇烽�夋嫨"
-                              clearable/>
+                              clearable />
             </el-form-item>
           </el-col>
         </el-row>
@@ -278,7 +278,15 @@
           <el-col :span="12">
             <el-form-item label="褰曞叆浜猴細"
                           prop="recorderId">
-              <el-input v-model="form.recorderName" placeholder="鑷姩濉厖" disabled/>
+              <el-select v-model="form.recorderId"
+                         placeholder="璇烽�夋嫨"
+                         clearable
+                         filterable>
+                <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">
@@ -290,7 +298,7 @@
                               format="YYYY-MM-DD"
                               type="date"
                               placeholder="璇烽�夋嫨"
-                              clearable/>
+                              clearable />
             </el-form-item>
           </el-col>
         </el-row>
@@ -327,12 +335,11 @@
                          :value="item.templateName">
                 <div style="display: flex; justify-content: space-between; align-items: center;">
                   <span>{{ item.templateName }}</span>
-                  <el-icon
-                      v-if="item.id"
-                      class="delete-icon"
-                      @click.stop="handleDeleteTemplate(item)"
-                      style="cursor: pointer; color: #f56c6c; font-size: 14px; margin-left: 8px;">
-                    <Delete/>
+                  <el-icon v-if="item.id"
+                           class="delete-icon"
+                           @click.stop="handleDeleteTemplate(item)"
+                           style="cursor: pointer; color: #f56c6c; font-size: 14px; margin-left: 8px;">
+                    <Delete />
                   </el-icon>
                 </div>
               </el-option>
@@ -353,40 +360,40 @@
                   :summary-method="summarizeProTable">
           <el-table-column align="center"
                            type="selection"
-                           width="55"/>
+                           width="55" />
           <el-table-column align="center"
                            label="搴忓彿"
                            type="index"
-                           width="60"/>
+                           width="60" />
           <el-table-column label="浜у搧澶х被"
-                           prop="productCategory"/>
+                           prop="productCategory" />
           <el-table-column label="瑙勬牸鍨嬪彿"
-                           prop="specificationModel"/>
+                           prop="specificationModel" />
           <el-table-column label="鍗曚綅"
                            prop="unit"
-                           width="70"/>
+                           width="70" />
           <el-table-column label="鏁伴噺"
                            prop="quantity"
-                           width="70"/>
+                           width="70" />
           <el-table-column label="搴撳瓨棰勮鏁伴噺"
                            prop="warnNum"
                            width="120"
-                           show-overflow-tooltip/>
+                           show-overflow-tooltip />
           <el-table-column label="绋庣巼(%)"
                            prop="taxRate"
-                           width="80"/>
+                           width="80" />
           <el-table-column label="鍚◣鍗曚环(鍏�)"
                            prop="taxInclusiveUnitPrice"
                            :formatter="formattedNumber"
-                           width="150"/>
+                           width="150" />
           <el-table-column label="鍚◣鎬讳环(鍏�)"
                            prop="taxInclusiveTotalPrice"
                            :formatter="formattedNumber"
-                           width="150"/>
+                           width="150" />
           <el-table-column label="涓嶅惈绋庢�讳环(鍏�)"
                            prop="taxExclusiveTotalPrice"
                            :formatter="formattedNumber"
-                           width="150"/>
+                           width="150" />
           <el-table-column label="鏄惁璐ㄦ"
                            prop="isChecked"
                            width="150">
@@ -416,7 +423,7 @@
                         placeholder="璇疯緭鍏�"
                         clearable
                         type="textarea"
-                        :rows="2"/>
+                        :rows="2" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -424,35 +431,31 @@
           <el-col :span="24">
             <el-form-item label="闄勪欢鏉愭枡锛�"
                           prop="purchaseLedgerFiles">
-              <FileUpload v-model:file-list="fileList"/>
+              <FileUpload v-model:file-list="fileList" />
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
     </FormDialog>
     <!-- 瀵煎叆寮圭獥 -->
-    <FormDialog
-        v-model="importUpload.open"
-        :title="importUpload.title"
-        :width="'600px'"
-        @close="importUpload.open = false"
-        @confirm="submitImportFile"
-        @cancel="importUpload.open = false"
-    >
-      <el-upload
-          ref="importUploadRef"
-          :limit="1"
-          accept=".xlsx,.xls"
-          :action="importUpload.url"
-          :headers="importUpload.headers"
-          :before-upload="importUpload.beforeUpload"
-          :on-success="importUpload.onSuccess"
-          :on-error="importUpload.onError"
-          :on-progress="importUpload.onProgress"
-          :on-change="importUpload.onChange"
-          :auto-upload="false"
-          drag
-      >
+    <FormDialog v-model="importUpload.open"
+                :title="importUpload.title"
+                :width="'600px'"
+                @close="importUpload.open = false"
+                @confirm="submitImportFile"
+                @cancel="importUpload.open = false">
+      <el-upload ref="importUploadRef"
+                 :limit="1"
+                 accept=".xlsx,.xls"
+                 :action="importUpload.url"
+                 :headers="importUpload.headers"
+                 :before-upload="importUpload.beforeUpload"
+                 :on-success="importUpload.onSuccess"
+                 :on-error="importUpload.onError"
+                 :on-progress="importUpload.onProgress"
+                 :on-change="importUpload.onChange"
+                 :auto-upload="false"
+                 drag>
         <i class="el-icon-upload"></i>
         <div class="el-upload__text">
           灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em>
@@ -460,7 +463,9 @@
         <template #tip>
           <div class="el-upload__tip">
             浠呮敮鎸� xls/xlsx锛屽ぇ灏忎笉瓒呰繃 10MB銆�
-            <el-button link type="primary" @click="downloadTemplate">涓嬭浇瀵煎叆妯℃澘</el-button>
+            <el-button link
+                       type="primary"
+                       @click="downloadTemplate">涓嬭浇瀵煎叆妯℃澘</el-button>
           </div>
         </template>
       </el-upload>
@@ -489,7 +494,7 @@
                               @change="getModels"
                               :data="productOptions"
                               :render-after-expand="false"
-                              style="width: 100%"/>
+                              style="width: 100%" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -505,7 +510,7 @@
                 <el-option v-for="item in modelOptions"
                            :key="item.id"
                            :label="item.model"
-                           :value="item.id"/>
+                           :value="item.id" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -516,7 +521,7 @@
                           prop="unit">
               <el-input v-model="productForm.unit"
                         placeholder="璇疯緭鍏�"
-                        clearable/>
+                        clearable />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -526,12 +531,10 @@
                          placeholder="璇烽�夋嫨"
                          clearable
                          @change="mathNum">
-                <el-option
-                  v-for="dict in tax_rate"
-                  :key="dict.value"
-                  :label="dict.label"
-                  :value="dict.value"
-                />
+                <el-option v-for="dict in tax_rate"
+                           :key="dict.value"
+                           :label="dict.label"
+                           :value="dict.value" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -546,7 +549,7 @@
                                :min="0"
                                clearable
                                style="width: 100%"
-                               @change="mathNum"/>
+                               @change="mathNum" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -559,7 +562,7 @@
                                style="width: 100%"
                                v-model="productForm.quantity"
                                placeholder="璇疯緭鍏�"
-                               @change="mathNum"/>
+                               @change="mathNum" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -573,7 +576,7 @@
                                :min="0"
                                clearable
                                style="width: 100%"
-                               @change="reverseMathNum('taxInclusiveTotalPrice')"/>
+                               @change="reverseMathNum('taxInclusiveTotalPrice')" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -585,7 +588,7 @@
                                :min="0"
                                clearable
                                style="width: 100%"
-                               @change="reverseMathNum('taxExclusiveTotalPrice')"/>
+                               @change="reverseMathNum('taxExclusiveTotalPrice')" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -597,9 +600,9 @@
                          placeholder="璇烽�夋嫨"
                          clearable>
                 <el-option label="澧炴櫘绁�"
-                           value="澧炴櫘绁�"/>
+                           value="澧炴櫘绁�" />
                 <el-option label="澧炰笓绁�"
-                           value="澧炰笓绁�"/>
+                           value="澧炰笓绁�" />
               </el-select>
             </el-form-item>
           </el-col>
@@ -611,7 +614,7 @@
                                :step="0.1"
                                :min="0"
                                clearable
-                               style="width: 100%"/>
+                               style="width: 100%" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -621,22 +624,25 @@
                           prop="isChecked">
               <el-radio-group v-model="productForm.isChecked">
                 <el-radio label="鏄�"
-                          :value="true"/>
+                          :value="true" />
                 <el-radio label="鍚�"
-                          :value="false"/>
+                          :value="false" />
               </el-radio-group>
             </el-form-item>
           </el-col>
         </el-row>
       </el-form>
     </FormDialog>
-    <FileList v-if="fileListDialogVisible"  v-model:visible="fileListDialogVisible" record-type="purchase_ledger" :record-id="recordId"  />
+    <FileList v-if="fileListDialogVisible"
+              v-model:visible="fileListDialogVisible"
+              record-type="purchase_ledger"
+              :record-id="recordId" />
   </div>
 </template>
 
 <script setup>
-import FormDialog from '@/components/Dialog/FormDialog.vue';
-import FileListDialog from '@/components/Dialog/FileListDialog.vue';
+  import FormDialog from "@/components/Dialog/FormDialog.vue";
+  import FileListDialog from "@/components/Dialog/FileListDialog.vue";
   import { getToken } from "@/utils/auth";
   import pagination from "@/components/PIMTable/Pagination.vue";
   import {
@@ -649,6 +655,7 @@
   } from "vue";
   import { Search, Delete } from "@element-plus/icons-vue";
   import { ElMessageBox, ElMessage } from "element-plus";
+  import { userListNoPage } from "@/api/system/user.js";
   import {
     addOrUpdateSalesLedgerProduct,
     delProduct,
@@ -670,435 +677,446 @@
     delPurchaseTemplate,
   } from "@/api/procurementManagement/procurementLedger.js";
   import useFormData from "@/hooks/useFormData.js";
-  const FileList = defineAsyncComponent(() => import("@/components/Dialog/FileList.vue"));
+  const FileList = defineAsyncComponent(() =>
+    import("@/components/Dialog/FileList.vue")
+  );
 
-const {proxy} = getCurrentInstance();
-const { tax_rate } = proxy.useDict("tax_rate");
-const tableData = ref([]);
-const productData = ref([]);
-const selectedRows = ref([]);
-const productSelectedRows = ref([]);
-const modelOptions = ref([]);
-const productOptions = ref([]);
-const salesContractList = ref([]);
-const supplierList = ref([]);
-const tableLoading = ref(false);
-const fileListDialogVisible = 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";
-import FileUpload from "@/components/AttachmentUpload/file/index.vue";
+  const { proxy } = getCurrentInstance();
+  const { tax_rate } = proxy.useDict("tax_rate");
+  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 fileListDialogVisible = 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";
+  import FileUpload from "@/components/AttachmentUpload/file/index.vue";
 
-const userStore = useUserStore();
+  const userStore = useUserStore();
 
-// 璁㈠崟瀹℃壒鐘舵�佹樉绀烘枃鏈�
-const approvalStatusText = {
-  1: "寰呭鏍�",
-  2: "瀹℃壒涓�",
-  3: "瀹℃壒閫氳繃",
-  4: "瀹℃壒澶辫触",
-};
-
-// 鑾峰彇瀹℃壒鐘舵�佹爣绛剧被鍨�
-const getApprovalStatusType = (status) => {
-  const typeMap = {
-    1: "info",      // 寰呭鏍� - 鐏拌壊
-    2: "warning",   // 瀹℃壒涓� - 姗欒壊
-    3: "success",   // 瀹℃壒閫氳繃 - 缁胯壊
-    4: "danger",    // 瀹℃壒澶辫触 - 绾㈣壊
+  // 璁㈠崟瀹℃壒鐘舵�佹樉绀烘枃鏈�
+  const approvalStatusText = {
+    1: "寰呭鏍�",
+    2: "瀹℃壒涓�",
+    3: "瀹℃壒閫氳繃",
+    4: "瀹℃壒澶辫触",
   };
-  return typeMap[status] || "";
-};
 
-const templateName = ref("");
-const filterInputValue = ref("");
-const templateList = ref([]);
-const isTemplateNameDuplicate = ref(false); // 鏍囪妯℃澘鍚嶇О鏄惁閲嶅
-// 褰撳墠閫変腑鐨勬ā鏉縄D锛堢敤浜庡尯鍒嗘柊澧炴ā鏉胯繕鏄洿鏂版ā鏉匡級
-const currentTemplateId = ref(null);
-
-// 妫�鏌ユā鏉垮悕绉版槸鍚﹂噸澶�
-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) {
-    // 璁板綍褰撳墠閫変腑鐨勬ā鏉縄D锛屽悗缁繚瀛樻椂杩涜鏇存柊鎿嶄綔
-    currentTemplateId.value = matchedTemplate.id;
-    // 閫変腑宸叉湁妯℃澘鏃讹紝涓嶅簲瑙嗕负鈥滄ā鏉垮悕绉伴噸澶嶅鑷翠笉鍙繚瀛樷��
-    isTemplateNameDuplicate.value = false;
-    // 濡傛灉鎵惧埌妯℃澘锛屽彧璧嬪�间緵搴斿晢銆侀」鐩悕绉般�佷粯娆炬柟寮忓拰浜у搧淇℃伅
-    if (matchedTemplate.supplierId) {
-      form.value.supplierId = matchedTemplate.supplierId;
-    }
-    if (matchedTemplate.supplierName) {
-      form.value.supplierName = matchedTemplate.supplierName;
-    }
-    if (matchedTemplate.projectName) {
-      form.value.projectName = matchedTemplate.projectName;
-    }
-    if (matchedTemplate.paymentMethod) {
-      form.value.paymentMethod = matchedTemplate.paymentMethod;
-    }
-    // 妯℃澘鏁版嵁涓殑浜у搧瀛楁鏄� productList锛岄渶瑕佽浆鎹负 productData
-    productData.value = matchedTemplate.productList || matchedTemplate.productData || [];
-  } else {
-    // 鏈尮閰嶅埌宸叉湁妯℃澘锛岃涓烘柊妯℃澘
-    currentTemplateId.value = null;
-    // 濡傛灉娌℃湁鎵惧埌妯℃澘锛岄噸缃〃鍗曪紙淇濇寔褰撳墠琛ㄥ崟鐘舵�侊級
-    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,
+  // 鑾峰彇瀹℃壒鐘舵�佹爣绛剧被鍨�
+  const getApprovalStatusType = status => {
+    const typeMap = {
+      1: "info", // 寰呭鏍� - 鐏拌壊
+      2: "warning", // 瀹℃壒涓� - 姗欒壊
+      3: "success", // 瀹℃壒閫氳繃 - 缁胯壊
+      4: "danger", // 瀹℃壒澶辫触 - 绾㈣壊
     };
-    productData.value = currentProductData;
-  }
-};
+    return typeMap[status] || "";
+  };
 
-// 鐢ㄦ埛淇℃伅琛ㄥ崟寮规鏁版嵁
-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: "",
-    recorderName: "",
-    entryDate: "",
-    productData: [],
-    supplierName: "",
-    supplierId: "",
-    paymentMethod: "",
-    executionDate: "",
-    isChecked: false,
-  },
-  rules: {
-    purchaseContractNumber: [
-      {required: true, message: "璇疯緭鍏�", trigger: "blur"},
-    ],
-    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 templateName = ref("");
+  const filterInputValue = ref("");
+  const templateList = ref([]);
+  const isTemplateNameDuplicate = ref(false); // 鏍囪妯℃澘鍚嶇О鏄惁閲嶅
+  // 褰撳墠閫変腑鐨勬ā鏉縄D锛堢敤浜庡尯鍒嗘柊澧炴ā鏉胯繕鏄洿鏂版ā鏉匡級
+  const currentTemplateId = ref(null);
 
-// 浜у搧琛ㄥ崟寮规鏁版嵁
-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: "",
-    isChecked: false,
-  },
-  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"}],
-    isChecked: [{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 importUploadRef = ref(null);
-const importUpload = reactive({
-  title: "瀵煎叆閲囪喘鍙拌处",
-  open: false,
-  url: import.meta.env.VITE_APP_BASE_API + "/purchase/ledger/import",
-  headers: {Authorization: "Bearer " + getToken()},
-  isUploading: false,
-  beforeUpload: (file) => {
-    const isExcel = file.name.endsWith(".xlsx") || file.name.endsWith(".xls");
-    const isLt10M = file.size / 1024 / 1024 < 10;
-    if (!isExcel) {
-      proxy.$modal.msgError("涓婁紶鏂囦欢鍙兘鏄� xlsx/xls 鏍煎紡!");
+  // 妫�鏌ユā鏉垮悕绉版槸鍚﹂噸澶�
+  const checkTemplateNameDuplicate = name => {
+    if (!name || name.trim() === "") {
+      isTemplateNameDuplicate.value = false;
       return false;
     }
-    if (!isLt10M) {
-      proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 10MB!");
-      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);
     }
-    return true;
-  },
-  onChange: (file, fileList) => {
-    // noop
-  },
-  onProgress: (event, file, fileList) => {
-    // noop
-  },
-  onSuccess: (response, file, fileList) => {
-    importUpload.isUploading = false;
-    if (response?.code === 200) {
-      proxy.$modal.msgSuccess("瀵煎叆鎴愬姛");
-      importUpload.open = false;
-      if (importUploadRef.value) {
-        importUploadRef.value.clearFiles?.();
-      }
-      getList();
+    // 瀹炴椂妫�鏌ユā鏉垮悕绉版槸鍚﹂噸澶嶏紙闃叉姈澶勭悊锛岄伩鍏嶉绻佹彁绀猴級
+    if (val && val.trim()) {
+      duplicateCheckTimer = setTimeout(() => {
+        const isDuplicate = checkTemplateNameDuplicate(val);
+        if (isDuplicate) {
+          ElMessage({
+            message: "妯℃澘鍚嶇О宸插瓨鍦紝璇锋洿鎹㈡ā鏉垮悕绉�",
+            type: "warning",
+            duration: 2000,
+          });
+        }
+      }, 300); // 300ms 闃叉姈
     } else {
-      proxy.$modal.msgError(response?.msg || "瀵煎叆澶辫触");
+      isTemplateNameDuplicate.value = false;
     }
-  },
-  onError: () => {
+  };
+
+  // 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) {
+      // 璁板綍褰撳墠閫変腑鐨勬ā鏉縄D锛屽悗缁繚瀛樻椂杩涜鏇存柊鎿嶄綔
+      currentTemplateId.value = matchedTemplate.id;
+      // 閫変腑宸叉湁妯℃澘鏃讹紝涓嶅簲瑙嗕负鈥滄ā鏉垮悕绉伴噸澶嶅鑷翠笉鍙繚瀛樷��
+      isTemplateNameDuplicate.value = false;
+      // 濡傛灉鎵惧埌妯℃澘锛屽彧璧嬪�间緵搴斿晢銆侀」鐩悕绉般�佷粯娆炬柟寮忓拰浜у搧淇℃伅
+      if (matchedTemplate.supplierId) {
+        form.value.supplierId = matchedTemplate.supplierId;
+      }
+      if (matchedTemplate.supplierName) {
+        form.value.supplierName = matchedTemplate.supplierName;
+      }
+      if (matchedTemplate.projectName) {
+        form.value.projectName = matchedTemplate.projectName;
+      }
+      if (matchedTemplate.paymentMethod) {
+        form.value.paymentMethod = matchedTemplate.paymentMethod;
+      }
+      // 妯℃澘鏁版嵁涓殑浜у搧瀛楁鏄� productList锛岄渶瑕佽浆鎹负 productData
+      productData.value =
+        matchedTemplate.productList || matchedTemplate.productData || [];
+    } else {
+      // 鏈尮閰嶅埌宸叉湁妯℃澘锛岃涓烘柊妯℃澘
+      currentTemplateId.value = null;
+      // 濡傛灉娌℃湁鎵惧埌妯℃澘锛岄噸缃〃鍗曪紙淇濇寔褰撳墠琛ㄥ崟鐘舵�侊級
+      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: "",
+      isChecked: false,
+    },
+    rules: {
+      purchaseContractNumber: [
+        { required: true, message: "璇疯緭鍏�", trigger: "blur" },
+      ],
+      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: "",
+      isChecked: false,
+    },
+    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" }],
+      isChecked: [{ 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 importUploadRef = ref(null);
+  const importUpload = reactive({
+    title: "瀵煎叆閲囪喘鍙拌处",
+    open: false,
+    url: import.meta.env.VITE_APP_BASE_API + "/purchase/ledger/import",
+    headers: { Authorization: "Bearer " + getToken() },
+    isUploading: false,
+    beforeUpload: file => {
+      const isExcel = file.name.endsWith(".xlsx") || file.name.endsWith(".xls");
+      const isLt10M = file.size / 1024 / 1024 < 10;
+      if (!isExcel) {
+        proxy.$modal.msgError("涓婁紶鏂囦欢鍙兘鏄� xlsx/xls 鏍煎紡!");
+        return false;
+      }
+      if (!isLt10M) {
+        proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 10MB!");
+        return false;
+      }
+      return true;
+    },
+    onChange: (file, fileList) => {
+      // noop
+    },
+    onProgress: (event, file, fileList) => {
+      // noop
+    },
+    onSuccess: (response, file, fileList) => {
+      importUpload.isUploading = false;
+      if (response?.code === 200) {
+        proxy.$modal.msgSuccess("瀵煎叆鎴愬姛");
+        importUpload.open = false;
+        if (importUploadRef.value) {
+          importUploadRef.value.clearFiles?.();
+        }
+        getList();
+      } else {
+        proxy.$modal.msgError(response?.msg || "瀵煎叆澶辫触");
+      }
+    },
+    onError: () => {
+      importUpload.isUploading = false;
+      proxy.$modal.msgError("瀵煎叆澶辫触锛岃閲嶈瘯");
+    },
+  });
+
+  const handleImport = () => {
+    importUpload.title = "瀵煎叆閲囪喘鍙拌处";
+    importUpload.open = true;
     importUpload.isUploading = false;
-    proxy.$modal.msgError("瀵煎叆澶辫触锛岃閲嶈瘯");
-  },
-});
+    if (importUploadRef.value) {
+      importUploadRef.value.clearFiles?.();
+    }
+  };
 
-const handleImport = () => {
-  importUpload.title = "瀵煎叆閲囪喘鍙拌处";
-  importUpload.open = true;
-  importUpload.isUploading = false;
-  if (importUploadRef.value) {
-    importUploadRef.value.clearFiles?.();
-  }
-};
+  // 涓嬭浇瀵煎叆妯℃澘锛堝鍚庣璺緞涓嶅悓锛屽彲鍦ㄦ澶勮皟鏁达級
+  const downloadTemplate = () => {
+    proxy.download(
+      "/purchase/ledger/exportTemplate",
+      {},
+      "閲囪喘鍙拌处瀵煎叆妯℃澘.xlsx"
+    );
+  };
 
-// 涓嬭浇瀵煎叆妯℃澘锛堝鍚庣璺緞涓嶅悓锛屽彲鍦ㄦ澶勮皟鏁达級
-const downloadTemplate = () => {
-  proxy.download("/purchase/ledger/exportTemplate", {}, "閲囪喘鍙拌处瀵煎叆妯℃澘.xlsx");
-};
+  const submitImportFile = () => {
+    importUpload.isUploading = true;
+    proxy.$refs["importUploadRef"]?.submit?.();
+  };
 
-const submitImportFile = () => {
-  importUpload.isUploading = true;
-  proxy.$refs["importUploadRef"]?.submit?.();
-};
+  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 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 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;
-  }
-
-  // 濡傛灉鏄�滄柊澧炴ā鏉库�濓紙娌℃湁閫変腑宸叉湁妯℃澘锛夛紝鎵嶉渶瑕佸仛閲嶅悕鏍¢獙锛�
-  // 鑻ユ槸閫変腑宸叉湁妯℃澘鍚庝慨鏀癸紝鍒欏厑璁镐娇鐢ㄥ師鍚嶇О锛堣涓烘洿鏂帮級
-  if (!currentTemplateId.value) {
-    const isDuplicate = checkTemplateNameDuplicate(templateName.value);
-    if (isDuplicate) {
+  // 淇濆瓨妯℃澘
+  const handleButtonClick = async () => {
+    // 妫�鏌ユā鏉垮悕绉版槸鍚︿负绌�
+    if (!templateName.value || templateName.value.trim() === "") {
       ElMessage({
-        message: "妯℃澘鍚嶇О宸插瓨鍦紝璇锋洿鎹㈡ā鏉垮悕绉�",
+        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,
-      recorderName: form.value.recorderName,
-      projectName: form.value.projectName,
-      templateName: templateName.value.trim(),
-    };
-    console.log("template params ===>", params, "currentTemplateId:", currentTemplateId.value);
-
-    // 濡傛灉 currentTemplateId 鏈夊�硷紝璇存槑褰撳墠鏄�滅紪杈戝凡鏈夋ā鏉库�� 鈫� 璋冪敤鏇存柊鎺ュ彛
-    // 鍚﹀垯涓衡�滄柊寤烘ā鏉库�� 鈫� 璋冪敤鏂板鎺ュ彛
-    let res;
-    if (currentTemplateId.value) {
-      res = await updatePurchaseTemplate({
-        id: currentTemplateId.value,
-        ...params,
-      });
-    } else {
-      res = await addPurchaseTemplate(params);
+    // 濡傛灉鏄�滄柊澧炴ā鏉库�濓紙娌℃湁閫変腑宸叉湁妯℃澘锛夛紝鎵嶉渶瑕佸仛閲嶅悕鏍¢獙锛�
+    // 鑻ユ槸閫変腑宸叉湁妯℃澘鍚庝慨鏀癸紝鍒欏厑璁镐娇鐢ㄥ師鍚嶇О锛堣涓烘洿鏂帮級
+    if (!currentTemplateId.value) {
+      const isDuplicate = checkTemplateNameDuplicate(templateName.value);
+      if (isDuplicate) {
+        ElMessage({
+          message: "妯℃澘鍚嶇О宸插瓨鍦紝璇锋洿鎹㈡ā鏉垮悕绉�",
+          type: "warning",
+        });
+        return;
+      }
     }
 
-    if (res && res.code === 200) {
+    // 妫�鏌ヤ緵搴斿晢鏄惁閫夋嫨
+    if (!form.value.supplierId) {
       ElMessage({
-        message: currentTemplateId.value ? "妯℃澘鏇存柊鎴愬姛" : "妯℃澘淇濆瓨鎴愬姛",
-        type: "success",
+        message: "璇峰厛閫夋嫨渚涘簲鍟�",
+        type: "warning",
       });
-      // 淇濆瓨鎴愬姛鍚庨噸鏂拌幏鍙栨ā鏉垮垪琛�
-      await getTemplateList();
-      // 娓呯┖妯℃澘鍚嶇О杈撳叆
-      templateName.value = "";
-      filterInputValue.value = "";
-      isTemplateNameDuplicate.value = false;
-      // 淇濆瓨/鏇存柊瀹屾垚鍚庯紝閲嶇疆褰撳墠妯℃澘ID
-      currentTemplateId.value = null;
-    } else {
+      return;
+    }
+
+    // 妫�鏌ユ槸鍚︽湁浜у搧鏁版嵁
+    if (!productData.value || productData.value.length === 0) {
       ElMessage({
-        message: res?.msg || "妯℃澘淇濆瓨澶辫触",
+        message: "璇峰厛娣诲姞浜у搧淇℃伅",
+        type: "warning",
+      });
+      return;
+    }
+
+    try {
+      let params = {
+        productData: proxy.HaveJson(productData.value),
+        supplierId: form.value.supplierId,
+        paymentMethod: form.value.paymentMethod,
+        recorderId: form.value.recorderId,
+        projectName: form.value.projectName,
+        templateName: templateName.value.trim(),
+      };
+      console.log(
+        "template params ===>",
+        params,
+        "currentTemplateId:",
+        currentTemplateId.value
+      );
+
+      // 濡傛灉 currentTemplateId 鏈夊�硷紝璇存槑褰撳墠鏄�滅紪杈戝凡鏈夋ā鏉库�� 鈫� 璋冪敤鏇存柊鎺ュ彛
+      // 鍚﹀垯涓衡�滄柊寤烘ā鏉库�� 鈫� 璋冪敤鏂板鎺ュ彛
+      let res;
+      if (currentTemplateId.value) {
+        res = await updatePurchaseTemplate({
+          id: currentTemplateId.value,
+          ...params,
+        });
+      } else {
+        res = await addPurchaseTemplate(params);
+      }
+
+      if (res && res.code === 200) {
+        ElMessage({
+          message: currentTemplateId.value ? "妯℃澘鏇存柊鎴愬姛" : "妯℃澘淇濆瓨鎴愬姛",
+          type: "success",
+        });
+        // 淇濆瓨鎴愬姛鍚庨噸鏂拌幏鍙栨ā鏉垮垪琛�
+        await getTemplateList();
+        // 娓呯┖妯℃澘鍚嶇О杈撳叆
+        templateName.value = "";
+        filterInputValue.value = "";
+        isTemplateNameDuplicate.value = false;
+        // 淇濆瓨/鏇存柊瀹屾垚鍚庯紝閲嶇疆褰撳墠妯℃澘ID
+        currentTemplateId.value = null;
+      } 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(
+  };
+  // 瀛愯〃鍚堣鏂规硶
+  const summarizeChildrenTable = param => {
+    return proxy.summarizeTable(
       param,
       [
         "taxInclusiveUnitPrice",
@@ -1110,20 +1128,20 @@
         "futureTicketsAmount",
       ],
       {
-        ticketsNum: {noDecimal: true}, // 涓嶄繚鐣欏皬鏁�
-        futureTickets: {noDecimal: true}, // 涓嶄繚鐣欏皬鏁�
+        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})
+    );
+  };
+  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;
@@ -1140,461 +1158,471 @@
       .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);
+  };
+  // 琛ㄦ牸閫夋嫨鏁版嵁
+  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);
+        }
       }
-    } 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) => {
+    // 缂栬緫鏃舵鏌ュ鏍哥姸鎬侊紝鍙湁寰呭鏍�(1)鍜屽鎵瑰け璐�(4)鎵嶈兘缂栬緫
+    if (type === "edit" && row) {
+      if (row.approvalStatus !== 1 && row.approvalStatus !== 4) {
+        proxy.$modal.msgWarning("鍙湁寰呭鏍稿拰瀹℃壒澶辫触鐘舵�佺殑璁板綍鎵嶈兘缂栬緫");
+        return;
       }
     }
-  } else {
-    expandedRowKeys.value = [];
+
+    await getTemplateList();
+    await userListNoPage().then(res => {
+      userList.value = res.data;
+    });
+    operationType.value = type;
+    form.value = {};
+    productData.value = [];
+    fileList.value = [];
+    templateName.value = "";
+    filterInputValue.value = "";
+    isTemplateNameDuplicate.value = false;
+    try {
+      // 骞惰鍔犺浇鍩虹鏁版嵁
+      const [salesRes, supplierRes] = await Promise.all([
+        getSalesNo(),
+        getOptions(),
+      ]);
+
+      salesContractList.value = salesRes || [];
+      // 渚涘簲鍟嗚繃婊ゅ嚭isWhite=0 鐨勬暟鎹�
+      supplierList.value = (supplierRes.data || []).filter(
+        item => item.isWhite === 0
+      );
+
+      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.storageBlobVOS || [];
+        } catch (error) {
+          console.error("鍔犺浇閲囪喘鍙拌处鏁版嵁澶辫触:", error);
+          proxy.$modal.msgError("鍔犺浇鏁版嵁澶辫触");
+          return;
+        }
+      }
+
+      if (form.value.salesLedgerId == -1) {
+        form.value.salesLedgerId = null;
+      }
+      console.log(form.value, "form.value===========");
+      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;
   }
-};
-// 涓昏〃鍚堣鏂规硶
-const summarizeMainTable = param => {
-  return proxy.summarizeTable(param, ["contractAmount"]);
-};
-// 瀛愯〃鍚堣鏂规硶
-const summarizeProTable = param => {
-  return proxy.summarizeTable(param, [
-    "taxInclusiveUnitPrice",
-    "taxInclusiveTotalPrice",
-    "taxExclusiveTotalPrice",
-  ]);
-};
-// 鎵撳紑寮规
-const openForm = async (type, row) => {
-  // 缂栬緫鏃舵鏌ュ鏍哥姸鎬侊紝鍙湁寰呭鏍�(1)鍜屽鎵瑰け璐�(4)鎵嶈兘缂栬緫
-  if (type === "edit" && row) {
-    if (row.approvalStatus !== 1 && row.approvalStatus !== 4) {
-      proxy.$modal.msgWarning("鍙湁寰呭鏍稿拰瀹℃壒澶辫触鐘舵�佺殑璁板綍鎵嶈兘缂栬緫");
+
+  // 涓婁紶澶辫触
+  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) {
+      try {
+        await delLedgerFile([file.id]);
+        proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      } catch (error) {
+        console.error("鍒犻櫎鏂囦欢澶辫触:", error);
+        proxy.$modal.msgError("鍒犻櫎鏂囦欢澶辫触");
+      }
+    }
   }
 
-  await getTemplateList();
-  operationType.value = type;
-  form.value = {};
-  productData.value = [];
-  fileList.value = [];
-  templateName.value = "";
-  filterInputValue.value = "";
-  isTemplateNameDuplicate.value = false;
-  try {
-    // 骞惰鍔犺浇鍩虹鏁版嵁
-    const [salesRes, supplierRes] = await Promise.all([
-      getSalesNo(),
-      getOptions(),
-    ]);
+  // 鎻愪氦琛ㄥ崟
+  const submitForm = () => {
+    proxy.$refs["formRef"].validate(valid => {
+      if (valid) {
+        if (productData.value.length > 0) {
+          // 鏂板鏃讹紝闇�瑕佷粠姣忎釜浜у搧瀵硅薄涓垹闄� id 瀛楁
+          let processedProductData = productData.value;
+          if (operationType.value === "add") {
+            processedProductData = productData.value.map(product => {
+              const { id, ...rest } = product;
+              return rest;
+            });
+          }
+          form.value.productData = proxy.HaveJson(processedProductData);
+        } else {
+          proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
+          return;
+        }
+        form.value.storageBlobDTOS = fileList.value;
+        form.value.type = 2;
 
-    salesContractList.value = salesRes || [];
-    // 渚涘簲鍟嗚繃婊ゅ嚭isWhite=0 鐨勬暟鎹�
-    supplierList.value = (supplierRes.data || []).filter(
-        item => item.isWhite === 0
-    );
+        // 濡傛灉salesLedgerId涓虹┖锛屽垯涓嶄紶閫抯alesContractNo
+        if (!form.value.salesLedgerId) {
+          form.value.salesContractNo = "";
+        }
 
-    // 璁剧疆榛樿鍊�
-    form.value.recorderName = userStore.nickName;
-    form.value.entryDate = getCurrentDate();
+        // 鏂板鏃朵笉浼犻�抜d
+        const submitData = { ...form.value };
+        if (operationType.value === "add") {
+          delete submitData.id;
+        }
+
+        addOrEditPurchase(submitData).then(res => {
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+          closeDia();
+          getList();
+        });
+      }
+    });
+  };
+  // 鍏抽棴寮规
+  const closeDia = () => {
+    proxy.resetForm("formRef");
+    dialogFormVisible.value = false;
+  };
+  // 鎵撳紑浜у搧寮规
+  const openProductForm = async (type, row, index) => {
+    productOperationType.value = type;
+    productOperationIndex.value = index;
+    productForm.value = {};
+    proxy.resetForm("productFormRef");
+    productFormVisible.value = true;
+
+    // 鍏堣幏鍙栦骇鍝侀�夐」锛岀‘淇濇暟鎹姞杞藉畬鎴�
+    await getProductOptions();
+
+    // 绛夊緟 DOM 鏇存柊
+    await nextTick();
 
     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.storageBlobVOS || [];
-      } catch (error) {
-        console.error("鍔犺浇閲囪喘鍙拌处鏁版嵁澶辫触:", error);
-        proxy.$modal.msgError("鍔犺浇鏁版嵁澶辫触");
-        return;
-      }
+      productForm.value.isChecked = false;
     }
 
-    if (form.value.salesLedgerId == -1) {
-      form.value.salesLedgerId = null;
-    }
-    console.log(form.value, "form.value===========");
-    dialogFormVisible.value = true;
-  } catch (error) {
-    console.error("鎵撳紑琛ㄥ崟澶辫触:", error);
-    proxy.$modal.msgError("鍔犺浇鍩虹鏁版嵁澶辫触");
-  }
-};
+    if (type === "edit") {
+      // 澶嶅埗琛屾暟鎹�
+      productForm.value = { ...row };
 
-// 涓婁紶鍓嶆牎妫�
-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) {
-    try {
-      await delLedgerFile([file.id]);
-      proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-    } catch (error) {
-      console.error("鍒犻櫎鏂囦欢澶辫触:", error);
-      proxy.$modal.msgError("鍒犻櫎鏂囦欢澶辫触");
-    }
-  }
-}
-
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
-  proxy.$refs["formRef"].validate(valid => {
-    if (valid) {
-      if (productData.value.length > 0) {
-        // 鏂板鏃讹紝闇�瑕佷粠姣忎釜浜у搧瀵硅薄涓垹闄� id 瀛楁
-        let processedProductData = productData.value;
-        if (operationType.value === "add") {
-          processedProductData = productData.value.map(product => {
-            const {id, ...rest} = product;
-            return rest;
-          });
-        }
-        form.value.productData = proxy.HaveJson(processedProductData);
-      } else {
-        proxy.$modal.msgWarning("璇锋坊鍔犱骇鍝佷俊鎭�");
-        return;
-      }
-      form.value.storageBlobDTOS = fileList.value;
-      form.value.type = 2;
-
-      // 濡傛灉salesLedgerId涓虹┖锛屽垯涓嶄紶閫抯alesContractNo
-      if (!form.value.salesLedgerId) {
-        form.value.salesContractNo = "";
-      }
-
-      // 鏂板鏃朵笉浼犻�抜d
-      const submitData = {...form.value};
-      if (operationType.value === "add") {
-        delete submitData.id;
-      }
-
-      addOrEditPurchase(submitData).then(res => {
-        proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
-        closeDia();
-        getList();
-      });
-    }
-  });
-};
-// 鍏抽棴寮规
-const closeDia = () => {
-  proxy.resetForm("formRef");
-  dialogFormVisible.value = false;
-};
-// 鎵撳紑浜у搧寮规
-const openProductForm = async (type, row, index) => {
-  productOperationType.value = type;
-  productOperationIndex.value = index;
-  productForm.value = {};
-  proxy.resetForm("productFormRef");
-  productFormVisible.value = true;
-
-  // 鍏堣幏鍙栦骇鍝侀�夐」锛岀‘淇濇暟鎹姞杞藉畬鎴�
-  await getProductOptions();
-
-  // 绛夊緟 DOM 鏇存柊
-  await nextTick();
-
-  if (type === "add") {
-    productForm.value.isChecked = false;
-  }
-
-  if (type === "edit") {
-    // 澶嶅埗琛屾暟鎹�
-    productForm.value = {...row};
-
-    // 濡傛灉鏄粠妯℃澘鍔犺浇鐨勬暟鎹紝鍙兘娌℃湁 productId 鍜� productModelId
-    // 闇�瑕佹牴鎹� productCategory 鍜� specificationModel 鏉ユ煡鎵惧搴旂殑 ID
-    if (!productForm.value.productId && productForm.value.productCategory) {
-      // 鏍规嵁 productCategory 鏌ユ壘 productId
-      const findProductIdByCategory = (nodes, categoryName) => {
-        for (let i = 0; i < nodes.length; i++) {
-          if (nodes[i].label === categoryName) {
-            return nodes[i].value;
+      // 濡傛灉鏄粠妯℃澘鍔犺浇鐨勬暟鎹紝鍙兘娌℃湁 productId 鍜� productModelId
+      // 闇�瑕佹牴鎹� productCategory 鍜� specificationModel 鏉ユ煡鎵惧搴旂殑 ID
+      if (!productForm.value.productId && productForm.value.productCategory) {
+        // 鏍规嵁 productCategory 鏌ユ壘 productId
+        const findProductIdByCategory = (nodes, categoryName) => {
+          for (let i = 0; i < nodes.length; i++) {
+            if (nodes[i].label === categoryName) {
+              return nodes[i].value;
+            }
+            if (nodes[i].children && nodes[i].children.length > 0) {
+              const found = findProductIdByCategory(
+                nodes[i].children,
+                categoryName
+              );
+              if (found) return found;
+            }
           }
-          if (nodes[i].children && nodes[i].children.length > 0) {
-            const found = findProductIdByCategory(nodes[i].children, categoryName);
-            if (found) return found;
+          return null;
+        };
+
+        const productId = findProductIdByCategory(
+          productOptions.value,
+          productForm.value.productCategory
+        );
+        if (productId) {
+          productForm.value.productId = productId;
+          // 鑾峰彇鍨嬪彿鍒楄〃骞剁瓑寰呭畬鎴�
+          const modelRes = await modelList({ id: productId });
+          modelOptions.value = modelRes;
+
+          // 绛夊緟 DOM 鏇存柊
+          await nextTick();
+
+          // 鏍规嵁 specificationModel 鏌ユ壘 productModelId
+          if (
+            productForm.value.specificationModel &&
+            modelOptions.value.length > 0
+          ) {
+            const modelItem = modelOptions.value.find(
+              item => item.model === productForm.value.specificationModel
+            );
+            if (modelItem) {
+              productForm.value.productModelId = modelItem.id;
+              // 璁剧疆瑙勬牸鍨嬪彿鍜屽崟浣�
+              getProductModel(modelItem.id);
+            }
           }
         }
-        return null;
-      };
-
-      const productId = findProductIdByCategory(productOptions.value, productForm.value.productCategory);
-      if (productId) {
-        productForm.value.productId = productId;
-        // 鑾峰彇鍨嬪彿鍒楄〃骞剁瓑寰呭畬鎴�
-        const modelRes = await modelList({id: productId});
-        modelOptions.value = modelRes;
+      } else if (productForm.value.productId) {
+        // 濡傛灉鏈� productId锛屾甯稿姞杞藉瀷鍙峰垪琛�
+        await getModels(productForm.value.productId);
 
         // 绛夊緟 DOM 鏇存柊
         await nextTick();
 
-        // 鏍规嵁 specificationModel 鏌ユ壘 productModelId
-        if (productForm.value.specificationModel && modelOptions.value.length > 0) {
-          const modelItem = modelOptions.value.find(
-              item => item.model === productForm.value.specificationModel
-          );
-          if (modelItem) {
-            productForm.value.productModelId = modelItem.id;
-            // 璁剧疆瑙勬牸鍨嬪彿鍜屽崟浣�
-            getProductModel(modelItem.id);
-          }
+        if (productForm.value.productModelId) {
+          getProductModel(productForm.value.productModelId);
         }
       }
-    } else if (productForm.value.productId) {
-      // 濡傛灉鏈� productId锛屾甯稿姞杞藉瀷鍙峰垪琛�
-      await getModels(productForm.value.productId);
 
-      // 绛夊緟 DOM 鏇存柊
+      // 鏈�鍚庡啀绛夊緟涓�娆� DOM 鏇存柊锛岀‘淇濇墍鏈夋暟鎹兘宸茶缃�
       await nextTick();
-
-      if (productForm.value.productModelId) {
-        getProductModel(productForm.value.productModelId);
-      }
     }
-
-    // 鏈�鍚庡啀绛夊緟涓�娆� DOM 鏇存柊锛岀‘淇濇墍鏈夋暟鎹兘宸茶缃�
-    await nextTick();
-  }
-};
-const getProductOptions = () => {
-  return productTreeList().then(res => {
-    productOptions.value = convertIdToValue(res);
-    return res;
-  });
-};
-const getModels = value => {
-  if (value) {
-    productForm.value.productCategory =
-        findNodeById(productOptions.value, value) || "";
-    return modelList({id: value}).then(res => {
-      modelOptions.value = res;
+  };
+  const getProductOptions = () => {
+    return productTreeList().then(res => {
+      productOptions.value = convertIdToValue(res);
       return res;
     });
-  } else {
-    productForm.value.productCategory = "";
-    modelOptions.value = [];
-    return Promise.resolve([]);
-  }
-};
-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
+  };
+  const getModels = value => {
+    if (value) {
+      productForm.value.productCategory =
+        findNodeById(productOptions.value, value) || "";
+      return modelList({ id: value }).then(res => {
+        modelOptions.value = res;
+        return res;
+      });
+    } else {
+      productForm.value.productCategory = "";
+      modelOptions.value = [];
+      return Promise.resolve([]);
     }
-    if (nodes[i].children && nodes[i].children.length > 0) {
-      const foundNode = findNodeById(nodes[i].children, productId);
-      if (foundNode) {
-        return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝鐩存帴杩斿洖锛堝凡缁忔槸label瀛楃涓诧級
+  };
+  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
       }
-    }
-  }
-  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,
-          };
+      if (nodes[i].children && nodes[i].children.length > 0) {
+        const foundNode = findNodeById(nodes[i].children, productId);
+        if (foundNode) {
+          return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝鐩存帴杩斿洖锛堝凡缁忔槸label瀛楃涓诧級
         }
-        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;
+    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 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 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();
+        }
       }
     });
-  } else {
-    let ids = [];
-    if (productSelectedRows.value.length > 0) {
-      ids = productSelectedRows.value.map(item => item.id);
+  };
+  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;
     }
-    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", {
-      confirmButtonText: "纭",
-      cancelButtonText: "鍙栨秷",
-      type: "warning",
-    })
+    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();
-            getPurchaseById({id: currentId.value, type: 2}).then(
-                res => {
-                  productData.value = res.productData;
-                }
-            );
+            getPurchaseById({ 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",
-  })
+    }
+  };
+  // 鍏抽棴浜у搧寮规
+  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) {
-    ids = selectedRows.value.filter(item => item.salesLedgerId === null).map(item => item.id);
-  } else {
-    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
-    return;
-  }
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
+  };
+  // 鍒犻櫎
+  const handleDelete = () => {
+    let ids = [];
+    if (selectedRows.value.length > 0) {
+      ids = selectedRows.value
+        .filter(item => item.salesLedgerId === null)
+        .map(item => item.id);
+    } else {
+      proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+      return;
+    }
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
+    })
       .then(() => {
         delPurchase(ids).then(res => {
           proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
@@ -1604,172 +1632,172 @@
       .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}`;
-}
+  // 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� 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" ||
-      field === "taxExclusiveTotalPrice"
-  ) {
-    const value = Number(productForm.value[field]);
-    if (value < 0) {
-      productForm.value[field] = "0";
-      proxy.$modal.msgWarning("鍊间笉鑳藉皬浜�0");
+  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 = (
+    // 纭繚杈撳叆鍊间笉涓鸿礋鏁�
+    if (
+      field === "taxInclusiveTotalPrice" ||
+      field === "taxExclusiveTotalPrice"
+    ) {
+      const value = Number(productForm.value[field]);
+      if (value < 0) {
+        productForm.value[field] = "0";
+        proxy.$modal.msgWarning("鍊间笉鑳藉皬浜�0");
+        return;
+      }
+    }
+
+    if (field === "taxInclusiveTotalPrice") {
+      // 宸茬煡鍚◣鎬讳环鍜屾暟閲忥紝鍙嶇畻鍚◣鍗曚环
+      if (productForm.value.quantity) {
+        productForm.value.taxInclusiveUnitPrice = (
           Number(productForm.value.taxInclusiveTotalPrice) /
           Number(productForm.value.quantity)
-      ).toFixed(2);
-      // 纭繚缁撴灉涓嶄负璐熸暟
-      if (Number(productForm.value.taxInclusiveUnitPrice) < 0) {
-        productForm.value.taxInclusiveUnitPrice = "0";
+        ).toFixed(2);
+        // 纭繚缁撴灉涓嶄负璐熸暟
+        if (Number(productForm.value.taxInclusiveUnitPrice) < 0) {
+          productForm.value.taxInclusiveUnitPrice = "0";
+        }
       }
-    }
-    // 宸茬煡鍚◣鎬讳环鍜屽惈绋庡崟浠凤紝鍙嶇畻鏁伴噺
-    else if (productForm.value.taxInclusiveUnitPrice) {
-      productForm.value.quantity = (
+      // 宸茬煡鍚◣鎬讳环鍜屽惈绋庡崟浠凤紝鍙嶇畻鏁伴噺
+      else if (productForm.value.taxInclusiveUnitPrice) {
+        productForm.value.quantity = (
           Number(productForm.value.taxInclusiveTotalPrice) /
           Number(productForm.value.taxInclusiveUnitPrice)
-      ).toFixed(2);
-      // 纭繚缁撴灉涓嶄负璐熸暟
-      if (Number(productForm.value.quantity) < 0) {
-        productForm.value.quantity = "0";
+        ).toFixed(2);
+        // 纭繚缁撴灉涓嶄负璐熸暟
+        if (Number(productForm.value.quantity) < 0) {
+          productForm.value.quantity = "0";
+        }
       }
-    }
-    // 鍙嶇畻涓嶅惈绋庢�讳环
-    productForm.value.taxExclusiveTotalPrice = (
+      // 鍙嶇畻涓嶅惈绋庢�讳环
+      productForm.value.taxExclusiveTotalPrice = (
         Number(productForm.value.taxInclusiveTotalPrice) /
         (1 + taxRate / 100)
-    ).toFixed(2);
-    // 纭繚缁撴灉涓嶄负璐熸暟
-    if (Number(productForm.value.taxExclusiveTotalPrice) < 0) {
-      productForm.value.taxExclusiveTotalPrice = "0";
-    }
-  } else if (field === "taxExclusiveTotalPrice") {
-    // 鍙嶇畻鍚◣鎬讳环
-    productForm.value.taxInclusiveTotalPrice = (
+      ).toFixed(2);
+      // 纭繚缁撴灉涓嶄负璐熸暟
+      if (Number(productForm.value.taxExclusiveTotalPrice) < 0) {
+        productForm.value.taxExclusiveTotalPrice = "0";
+      }
+    } else if (field === "taxExclusiveTotalPrice") {
+      // 鍙嶇畻鍚◣鎬讳环
+      productForm.value.taxInclusiveTotalPrice = (
         Number(productForm.value.taxExclusiveTotalPrice) *
         (1 + taxRate / 100)
-    ).toFixed(2);
-    // 纭繚缁撴灉涓嶄负璐熸暟
-    if (Number(productForm.value.taxInclusiveTotalPrice) < 0) {
-      productForm.value.taxInclusiveTotalPrice = "0";
-    }
-    // 宸茬煡鏁伴噺锛屽弽绠楀惈绋庡崟浠�
-    if (productForm.value.quantity) {
-      productForm.value.taxInclusiveUnitPrice = (
+      ).toFixed(2);
+      // 纭繚缁撴灉涓嶄负璐熸暟
+      if (Number(productForm.value.taxInclusiveTotalPrice) < 0) {
+        productForm.value.taxInclusiveTotalPrice = "0";
+      }
+      // 宸茬煡鏁伴噺锛屽弽绠楀惈绋庡崟浠�
+      if (productForm.value.quantity) {
+        productForm.value.taxInclusiveUnitPrice = (
           Number(productForm.value.taxInclusiveTotalPrice) /
           Number(productForm.value.quantity)
-      ).toFixed(2);
-      // 纭繚缁撴灉涓嶄负璐熸暟
-      if (Number(productForm.value.taxInclusiveUnitPrice) < 0) {
-        productForm.value.taxInclusiveUnitPrice = "0";
+        ).toFixed(2);
+        // 纭繚缁撴灉涓嶄负璐熸暟
+        if (Number(productForm.value.taxInclusiveUnitPrice) < 0) {
+          productForm.value.taxInclusiveUnitPrice = "0";
+        }
       }
-    }
-    // 宸茬煡鍚◣鍗曚环锛屽弽绠楁暟閲�
-    else if (productForm.value.taxInclusiveUnitPrice) {
-      productForm.value.quantity = (
+      // 宸茬煡鍚◣鍗曚环锛屽弽绠楁暟閲�
+      else if (productForm.value.taxInclusiveUnitPrice) {
+        productForm.value.quantity = (
           Number(productForm.value.taxInclusiveTotalPrice) /
           Number(productForm.value.taxInclusiveUnitPrice)
-      ).toFixed(2);
-      // 纭繚缁撴灉涓嶄负璐熸暟
-      if (Number(productForm.value.quantity) < 0) {
-        productForm.value.quantity = "0";
+        ).toFixed(2);
+        // 纭繚缁撴灉涓嶄负璐熸暟
+        if (Number(productForm.value.quantity) < 0) {
+          productForm.value.quantity = "0";
+        }
       }
     }
-  }
-};
-// 閿�鍞悎鍚岄�夋嫨鏀瑰彉鏂规硶
-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 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 querygProductInfoByContractNo = async () => {
+    const { code, data } = await getProductInfoByContractNo({
+      contractNo: form.value.salesLedgerId,
+    });
+    if (code == 200) {
+      productData.value = data;
+    }
+  };
 
-// 鑾峰彇妯℃澘淇℃伅
-const getTemplateList = async () => {
-  let res = await getPurchaseTemplateList();
-  if (res && res.code === 200 && Array.isArray(res.data)) {
-    templateList.value = res.data;
-  }
-};
+  // 鑾峰彇妯℃澘淇℃伅
+  const getTemplateList = async () => {
+    let res = await getPurchaseTemplateList();
+    if (res && res.code === 200 && Array.isArray(res.data)) {
+      templateList.value = res.data;
+    }
+  };
 
-// 鎵撳紑闄勪欢寮规
-const openFileDialog = async (row) => {
-  recordId.value = row.id
-  fileListDialogVisible.value = true
-}
+  // 鎵撳紑闄勪欢寮规
+  const openFileDialog = async row => {
+    recordId.value = row.id;
+    fileListDialogVisible.value = true;
+  };
 
-// 鍒犻櫎妯℃澘
-const handleDeleteTemplate = async (item) => {
-  if (!item.id) {
-    proxy.$modal.msgWarning("鏃犳硶鍒犻櫎璇ユā鏉�");
-    return;
-  }
+  // 鍒犻櫎妯℃澘
+  const handleDeleteTemplate = async item => {
+    if (!item.id) {
+      proxy.$modal.msgWarning("鏃犳硶鍒犻櫎璇ユā鏉�");
+      return;
+    }
 
-  try {
-    await ElMessageBox.confirm(
+    try {
+      await ElMessageBox.confirm(
         `纭畾瑕佸垹闄ゆā鏉�"${item.templateName}"鍚楋紵`,
         "鍒犻櫎纭",
         {
@@ -1777,122 +1805,122 @@
           cancelButtonText: "鍙栨秷",
           type: "warning",
         }
-    );
+      );
 
-    const res = await delPurchaseTemplate([item.id]);
-    if (res && res.code === 200) {
-      ElMessage({
-        message: "鍒犻櫎鎴愬姛",
-        type: "success",
-      });
-      // 濡傛灉鍒犻櫎鐨勬槸褰撳墠閫変腑鐨勬ā鏉匡紝娓呯┖閫夋嫨
-      if (templateName.value === item.templateName) {
-        templateName.value = "";
-        filterInputValue.value = "";
+      const res = await delPurchaseTemplate([item.id]);
+      if (res && res.code === 200) {
+        ElMessage({
+          message: "鍒犻櫎鎴愬姛",
+          type: "success",
+        });
+        // 濡傛灉鍒犻櫎鐨勬槸褰撳墠閫変腑鐨勬ā鏉匡紝娓呯┖閫夋嫨
+        if (templateName.value === item.templateName) {
+          templateName.value = "";
+          filterInputValue.value = "";
+        }
+        // 閲嶆柊鑾峰彇妯℃澘鍒楄〃
+        await getTemplateList();
+      } else {
+        ElMessage({
+          message: res?.msg || "鍒犻櫎澶辫触",
+          type: "error",
+        });
       }
-      // 閲嶆柊鑾峰彇妯℃澘鍒楄〃
-      await getTemplateList();
-    } else {
-      ElMessage({
-        message: res?.msg || "鍒犻櫎澶辫触",
-        type: "error",
-      });
+    } catch (error) {
+      if (error !== "cancel") {
+        console.error("鍒犻櫎妯℃澘澶辫触:", error);
+        ElMessage({
+          message: "鍒犻櫎澶辫触锛岃绋嶅悗閲嶈瘯",
+          type: "error",
+        });
+      }
     }
-  } catch (error) {
-    if (error !== "cancel") {
-      console.error("鍒犻櫎妯℃澘澶辫触:", error);
-      ElMessage({
-        message: "鍒犻櫎澶辫触锛岃绋嶅悗閲嶈瘯",
-        type: "error",
-      });
-    }
-  }
-};
+  };
 
-onMounted(() => {
-  getList();
-  getTemplateList();
-});
+  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;
-}
-
-// 瀹℃壒浜鸿妭鐐瑰鍣ㄦ牱寮�
-.approver-nodes-container {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 16px;
-  padding: 16px;
-  background-color: #f8f9fa;
-  border-radius: 4px;
-  border: 1px solid #e4e7ed;
-}
-
-.approver-node-item {
-  flex: 0 0 calc(33.333% - 12px);
-  min-width: 200px;
-  padding: 12px;
-  background-color: #fff;
-  border-radius: 4px;
-  border: 1px solid #dcdfe6;
-  transition: all 0.3s;
-
-  &:hover {
-    border-color: #409eff;
-    box-shadow: 0 2px 8px rgba(64, 158, 255, 0.1);
+  .invalid-row {
+    opacity: 0.6;
+    background-color: #f5f7fa;
   }
-}
 
-.approver-node-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  margin-bottom: 8px;
-}
+  .el-row {
+    justify-content: space-between;
+    align-items: center;
+  }
 
-.approver-node-label {
-  font-size: 13px;
-  font-weight: 500;
-  color: #606266;
-}
+  .no-arrow-select {
+    --el-select-suffix-icon-color: transparent; /* 闅愯棌榛樿涓嬫媺绠ご */
+  }
 
-@media (max-width: 1200px) {
+  .select-button-group {
+    display: flex;
+    align-items: center;
+  }
+
+  // 瀹℃壒浜鸿妭鐐瑰鍣ㄦ牱寮�
+  .approver-nodes-container {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 16px;
+    padding: 16px;
+    background-color: #f8f9fa;
+    border-radius: 4px;
+    border: 1px solid #e4e7ed;
+  }
+
   .approver-node-item {
-    flex: 0 0 calc(50% - 8px);
-  }
-}
+    flex: 0 0 calc(33.333% - 12px);
+    min-width: 200px;
+    padding: 12px;
+    background-color: #fff;
+    border-radius: 4px;
+    border: 1px solid #dcdfe6;
+    transition: all 0.3s;
 
-@media (max-width: 768px) {
-  .approver-node-item {
-    flex: 0 0 100%;
+    &:hover {
+      border-color: #409eff;
+      box-shadow: 0 2px 8px rgba(64, 158, 255, 0.1);
+    }
   }
-}
 
-// 鍒犻櫎鍥炬爣鏍峰紡
-.delete-icon {
-  transition: all 0.3s;
-
-  &:hover {
-    color: #f56c6c !important;
-    transform: scale(1.2);
+  .approver-node-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 8px;
   }
-}
+
+  .approver-node-label {
+    font-size: 13px;
+    font-weight: 500;
+    color: #606266;
+  }
+
+  @media (max-width: 1200px) {
+    .approver-node-item {
+      flex: 0 0 calc(50% - 8px);
+    }
+  }
+
+  @media (max-width: 768px) {
+    .approver-node-item {
+      flex: 0 0 100%;
+    }
+  }
+
+  // 鍒犻櫎鍥炬爣鏍峰紡
+  .delete-icon {
+    transition: all 0.3s;
+
+    &:hover {
+      color: #f56c6c !important;
+      transform: scale(1.2);
+    }
+  }
 </style>

--
Gitblit v1.9.3