From 7ed2a032d0724e68aec8af940f2ce0023a9f0eb7 Mon Sep 17 00:00:00 2001
From: sen <sen@qq.com>
Date: 星期三, 15 四月 2026 09:27:51 +0800
Subject: [PATCH] 修改调度单年月日

---
 ui/admin-ui3/src/views/tms/generationCost/index.vue |  783 ++++++++++++++++++++++++++++++-------------------------
 1 files changed, 427 insertions(+), 356 deletions(-)

diff --git a/ui/admin-ui3/src/views/tms/generationCost/index.vue b/ui/admin-ui3/src/views/tms/generationCost/index.vue
index 924ba13..6995609 100644
--- a/ui/admin-ui3/src/views/tms/generationCost/index.vue
+++ b/ui/admin-ui3/src/views/tms/generationCost/index.vue
@@ -1,139 +1,95 @@
 <template>
   <basicContainer>
-    <avue-crud
-        :option="option"
-        :table-loading="pageF.loading"
-        :data="tableData"
-        :page="page"
-        :permission="permissionList"
-        :before-open="beforeOpen"
-        v-model="form" v-model:search="queryParams"
-        ref="crudRef"
-        @row-update="rowUpdate"
-        @row-save="rowSave"
-        @refresh-change="refreshChange"
-        @row-del="rowDel"
-        @search-change="searchChange"
-        @search-reset="searchReset"
-        @selection-change="selectionChange"
-        @current-change="currentChange"
-        @size-change="sizeChange"
-        @on-load="onLoad"
-    >
+    <avue-crud :option="option" :table-loading="pageF.loading" :data="tableData" :page="page"
+      :permission="permissionList" :before-open="beforeOpen" v-model="form" v-model:search="queryParams" ref="crudRef"
+      @row-update="rowUpdate" @row-save="rowSave" @refresh-change="refreshChange" @row-del="rowDel"
+      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
+      @current-change="currentChange" @size-change="sizeChange" @on-load="onLoad">
       <template #menu-left>
-        <el-button
-            type="warning"
-            plain
-            icon="Download"
-            @click="handleExport"
-            v-hasPermi="['tms:tmsDispatchOrder:export']"
-        >瀵煎嚭
+        <el-button type="warning" plain icon="Download" @click="handleExport"
+          v-hasPermi="['tms:tmsDispatchOrder:export']">瀵煎嚭
         </el-button>
-          <el-button
-              type="primary"
-              icon="Promotion"
-              :disabled="pageF.multiple"
-              @click="handleYSGenerate"
-              v-hasPermi="['tms:tmsDispatchOrder:generate']"
-          >鐢熸垚搴旀敹璐圭敤
-          </el-button>
-          <el-button
-              type="success"
-              icon="Promotion"
-              :disabled="pageF.multiple"
-              @click="handleYFGenerate"
-              v-hasPermi="['tms:tmsDispatchOrder:generate']"
-          >鐢熸垚搴斾粯璐圭敤
-          </el-button>
+        <el-button type="primary" icon="Promotion" :disabled="pageF.multiple" @click="handleYSGenerate"
+          v-hasPermi="['tms:tmsDispatchOrder:generate']">鐢熸垚搴旀敹璐圭敤
+        </el-button>
+        <el-button type="success" icon="Promotion" :disabled="pageF.multiple" @click="handleYFGenerate"
+          v-hasPermi="['tms:tmsDispatchOrder:generate']">鐢熸垚搴斾粯璐圭敤
+        </el-button>
       </template>
-      <template #menu-before="{row}">
-        <el-link size="small" type="primary" v-if="[0,1,2,3].includes(row.status)" @click="handleClose(row)" class="link-btn"
-                 v-hasPermi="['tms:tmsDispatchOrder:closeOrder']"
-                 :underline="false" icon="el-icon-close">浣滃簾
+      <template #menu-before="{ row }">
+        <el-link size="small" type="primary" v-if="[0, 1, 2, 3].includes(row.status)" @click="handleClose(row)"
+          class="link-btn" v-hasPermi="['tms:tmsDispatchOrder:closeOrder']" :underline="false" icon="el-icon-close">浣滃簾
         </el-link>
-        <el-link size="small" type="primary" v-if="![0,1].includes(row.status)" @click="handleLogItinerary(row)"
-                 v-hasPermi="['tms:tmsTrip:list']"
-                 class="link-btn" :underline="false" icon="el-icon-view">鏌ョ湅琛岀▼
+        <el-link size="small" type="primary" v-if="![0, 1].includes(row.status)" @click="handleLogItinerary(row)"
+          v-hasPermi="['tms:tmsTrip:list']" class="link-btn" :underline="false" icon="el-icon-view">鏌ョ湅琛岀▼
         </el-link>
         <el-link size="small" type="primary" v-if="row.accountsReceivableStatus == 0" @click="handleAddFinance(row)"
-                 class="link-btn" v-hasPermi="['tms:tmsFinanceDetail:add']"
-                 :underline="false" icon="el-icon-edit-pen">璐圭敤鐧昏
+          class="link-btn" v-hasPermi="['tms:tmsFinanceDetail:add']" :underline="false" icon="el-icon-edit-pen">璐圭敤鐧昏
         </el-link>
       </template>
-      <template #menu="{row}">
+      <template #menu="{ row }">
         <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" :underline="false"
-                 icon="el-icon-tickets">鏃ュ織
+          icon="el-icon-tickets">鏃ュ織
         </el-link>
       </template>
 
 
       <template #body>
-        <avue-tabs :option="tabsOption"
-                   @change="handleChange"></avue-tabs>
+        <avue-tabs :option="tabsOption" @change="handleChange"></avue-tabs>
       </template>
     </avue-crud>
     <el-dialog title="璐圭敤鐧昏" v-model="pageF.open" class="avue-dialog avue-dialog--top" width="80%">
       <el-descriptions :column="3" border>
-        <el-descriptions-item label="璋冨害鍗曞彿">{{form.dispatchNo}}</el-descriptions-item>
-        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{form.customerName}}</el-descriptions-item>
-        <el-descriptions-item label="椤圭洰鍚嶇О">{{form.projectName}}</el-descriptions-item>
-        <el-descriptions-item label="杩愯緭璺嚎">{{form.transportLine}}</el-descriptions-item>
-        <el-descriptions-item label="杞﹀瀷">{{form.$actualVehicleType}}</el-descriptions-item>
-        <el-descriptions-item label="杞︾墝">{{form.licensePlate}}</el-descriptions-item>
+        <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
+        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ form.customerName }}</el-descriptions-item>
+        <el-descriptions-item label="椤圭洰鍚嶇О">{{ form.projectName }}</el-descriptions-item>
+        <el-descriptions-item label="杩愯緭璺嚎">{{ form.transportLine }}</el-descriptions-item>
+        <el-descriptions-item label="杞﹀瀷">{{ form.$actualVehicleType }}</el-descriptions-item>
+        <el-descriptions-item label="杞︾墝">{{ form.licensePlate }}</el-descriptions-item>
       </el-descriptions>
-      <avue-tabs :option="tabsOption2" ref="tabsOption2Ref"
-                 @change="handleChange2"></avue-tabs>
+      <avue-tabs :option="tabsOption2" ref="tabsOption2Ref" @change="handleChange2"></avue-tabs>
       <div v-if="active === 'tab1'">
-        <avue-crud
-                   :option="itemsTableOption" ref="itemsTableRef"
-                   :data="itemsTableData"
-                   @selection-change="selectionChange2"
-        >
-          <template #count="{row}">
+        <avue-crud :option="itemsTableOption" ref="itemsTableRef" :data="itemsTableData"
+          @selection-change="selectionChange2">
+          <template #count="{ row }">
             <el-input-number v-model="row.count" @change="countChange(row)" placeholder="璇疯緭鍏ヨ璐规暟閲�"
-                             :min="0"></el-input-number>
+              :min="0"></el-input-number>
           </template>
-          <template #isYF="{row}">
-            <el-checkbox v-model="row.isYF"
-                         :true-value="1"
-                         :false-value="0"
-                         @change="(e:number) =>isYFChange(e, row)" ></el-checkbox>
+          <template #isYF="{ row }">
+            <el-checkbox v-model="row.isYF" :true-value="1" :false-value="0"
+              @change="(e: number) => isYFChange(e, row)"></el-checkbox>
           </template>
-          <template #remark="{row}">
-            <el-input v-model="row.remark" placeholder="澶囨敞" ></el-input>
+          <template #remark="{ row }">
+            <el-input v-model="row.remark" placeholder="澶囨敞"></el-input>
           </template>
-          <template #expand="{row}">
+          <template #expand="{ row }">
             <el-descriptions :column="3" border v-if="row.isYF == 1">
               <el-descriptions-item label="鏈嶅姟鍟�">
-                <el-select v-model="row.serviceProviderId"  placeholder="璇烽�夋嫨鏈嶅姟鍟�"
-                           @change="serviceProviderChange(row)"
-                           :filterable="true">
-                  <el-option v-for="item in row.serviceProviderData"
-                             :key="item.id" :label="item.serviceShortName"
-                              :value="item.id"></el-option>
+                <el-select v-model="row.serviceProviderId" placeholder="璇烽�夋嫨鏈嶅姟鍟�" @change="serviceProviderChange(row)"
+                  :filterable="true">
+                  <el-option v-for="item in row.serviceProviderData" :key="item.id" :label="item.serviceShortName"
+                    :value="item.id"></el-option>
                 </el-select>
               </el-descriptions-item>
               <el-descriptions-item label="鏄惁瀛樺湪搴斾粯鎶ヤ环">
-                <span :style="{color: row.isCZYF == 0? 'red': ''}">{{row.isCZYF == 0? '鍚�': row.isCZYF == 1? '鏄�': ''}}</span>
+                <span :style="{ color: row.isCZYF == 0 ? 'red' : '' }">{{ row.isCZYF == 0 ? '鍚�' : row.isCZYF == 1 ? '鏄�'
+                  :
+                  '' }}</span>
 
               </el-descriptions-item>
               <el-descriptions-item label="璁¤垂閲戦">
-                <el-input v-model="row.yfPrice" :min="1"
-                          @change="yfPriceChange(row)"
-                          type="number" placeholder="璇疯緭鍏ラ噾棰�"></el-input>
+                <el-input v-model="row.yfPrice" :min="1" @change="yfPriceChange(row)" type="number"
+                  placeholder="璇疯緭鍏ラ噾棰�"></el-input>
               </el-descriptions-item>
               <el-descriptions-item label="甯佸埗">
-                <el-radio-group v-model="row.yfCurrency" >
-                  <el-radio
-                      v-for="dict in sys_currency"
-                      :key="dict.value"
-                      :label="dict.value"
-                  >{{ dict.label }}</el-radio>
+                <el-radio-group v-model="row.yfCurrency">
+                  <el-radio v-for="dict in sys_currency" :key="dict.value" :label="dict.value">{{ dict.label
+                  }}</el-radio>
                 </el-radio-group>
               </el-descriptions-item>
               <el-descriptions-item label="璁¤垂鏁伴噺">
                 <el-input-number v-model="row.yfCount" @change="yfPriceChange(row)" placeholder="璇疯緭鍏ヨ璐规暟閲�"
-                                 :min="0"></el-input-number>
+                  :min="0"></el-input-number>
 
               </el-descriptions-item>
               <el-descriptions-item label="鎬婚噾棰�">{{ row.yfSum }}</el-descriptions-item>
@@ -143,48 +99,53 @@
       </div>
       <div v-if="active === 'tab2'">
         <h2>瀹炴姤瀹為攢璐圭敤</h2>
-        <avue-form  v-model="boxForm" ref="boxFormRef"
-                   :option="boxFormOption">
+        <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
+          <template #voucherUrl="{ row }">
+            <el-upload class="upload-demo" ref="uploadRef" :limit="1" drag :action="urlApi + '/common/upload2'" multiple
+              :show-file-list="true" :on-success="(res) => handleUploadAfter(res, row)"
+              :on-exceed="(files) => handleExceed(files, row)">
+              <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+              <div class="el-upload__text">
+                鐐瑰嚮鎴栧皢鍥剧墖鎷栨嫿鍒版鍖哄煙涓婁紶
+              </div>
 
-        </avue-form>
-        <avue-crud
-            :option="boxTableOption"
-            :data="boxTableData"
-        >
-          <template #isYF="{row}">
-            <el-checkbox v-model="row.isYF"
-                         :true-value="1"
-                         :false-value="0"
-                         @change="(e:number) =>isYFChange(e, row)" ></el-checkbox>
+            </el-upload>
           </template>
-          <template #yfServiceProviderId="{row}">
-            <el-select v-model="row.yfServiceProviderIdType"  placeholder="璇烽�夋嫨鏈嶅姟鍟�"
-                      @change="(e:any)=>ysServiceProviderChange(e,row)"
-                      :filterable="true">
+        </avue-form>
+        <avue-crud :option="boxTableOption" :data="boxTableData" @selection-change="boxSelectionChange">
+          <template #menu-left>
+            <el-button type="danger" plain icon="Delete"
+              :disabled="!(boxSelectionList.length === 1 && boxSelectionList[0]?.status === 0)"
+              @click="handleBatchBoxDel">
+              浣滃簾
+            </el-button>
+          </template>
+          <template #isYF="{ row }">
+            <el-checkbox v-model="row.isYF" :disabled="row.status == 1" :true-value="1" :false-value="0"
+              @change="(e: number) => isYFChange(e, row)"></el-checkbox>
+          </template>
+          <template #yfServiceProviderId="{ row }">
+            <el-select :disabled="row.status == 1" v-model="row.yfServiceProviderIdType" placeholder="璇烽�夋嫨鏈嶅姟鍟�"
+              @change="(e: any) => ysServiceProviderChange(e, row)" :filterable="true">
               <el-option v-for="item in serviceProviderList"
-                         :key="item.serviceProviderId + '_'+ item.serviceProviderType" :label="item.serviceProviderName"
-                         :value="item.serviceProviderId + '_'+ item.serviceProviderType"></el-option>
+                :key="item.serviceProviderId + '_' + item.serviceProviderType" :label="item.serviceProviderName"
+                :value="item.serviceProviderId + '_' + item.serviceProviderType"></el-option>
             </el-select>
           </template>
-          <template #yfPrice="{row}">
-            <el-input v-model="row.yfPrice" :min="1"
-                      type="number" placeholder="璇疯緭鍏ラ噾棰�"></el-input>
+          <template #yfPrice="{ row }">
+            <el-input :disabled="row.status == 1" v-model="row.yfPrice" :min="1" type="number"
+              placeholder="璇疯緭鍏ラ噾棰�"></el-input>
           </template>
-          <template #yfCurrency="{row}">
-              <el-radio-group v-model="row.yfCurrency" >
-                <el-radio
-                    v-for="dict in sys_currency"
-                    :key="dict.value"
-                    :label="dict.value"
-                >{{ dict.label }}</el-radio>
-              </el-radio-group>
+          <template #yfCurrency="{ row }">
+            <el-radio-group v-model="row.yfCurrency" :disabled="row.status == 1">
+              <el-radio v-for="dict in sys_currency" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
+            </el-radio-group>
           </template>
         </avue-crud>
       </div>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary"
-                     :loading="pageF.isUploading" @click="submitForm">
+          <el-button type="primary" :loading="pageF.isUploading" @click="submitForm">
             {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
           </el-button>
 
@@ -197,40 +158,31 @@
 
 
     <el-dialog :title="pageF.title" v-model="open" class="avue-dialog avue-dialog--top" width="80%">
-      <avue-crud
-          :option="boxTableOption" ref="itemsTableRef"
-          :data="boxTableData"
-      >
-        <template #expand="{row}">
-          <avue-crud v-if="optionType === 'ysGenerate'"
-              :option="boxItemTableOption" ref="itemsTableRef2"
-              :data="row.tmsReceivableFeeItems"
-          >
+      <avue-crud :option="boxTableOption" ref="itemsTableRef" :data="boxTableData">
+        <template #expand="{ row }">
+          <avue-crud v-if="optionType === 'ysGenerate'" :option="boxItemTableOption" ref="itemsTableRef2"
+            :data="row.tmsReceivableFeeItems">
           </avue-crud>
-          <avue-crud v-else
-              :option="boxItemTableOption" ref="itemsTableRef2"
-              :data="row.payableFeeItems"
-          >
+          <avue-crud v-else :option="boxItemTableOption" ref="itemsTableRef2" :data="row.payableFeeItems">
           </avue-crud>
 
         </template>
-        <template #receivableAmount="{row}">
-          <div v-if="row.receivableAmountRMB > 0">{{row.receivableAmountRMB}}浜烘皯甯�</div>
-          <div v-if="row.receivableAmountHKD > 0">{{row.receivableAmountHKD}}娓竵</div>
+        <template #receivableAmount="{ row }">
+          <div v-if="row.receivableAmountRMB > 0">{{ row.receivableAmountRMB }}浜烘皯甯�</div>
+          <div v-if="row.receivableAmountHKD > 0">{{ row.receivableAmountHKD }}娓竵</div>
 
         </template>
 
-        <template #payableAmount="{row}">
-          <div v-if="row.payableRmbAmount > 0">{{row.payableRmbAmount}}浜烘皯甯�</div>
-          <div v-if="row.payableHkbAmount > 0">{{row.payableHkbAmount}}娓竵</div>
+        <template #payableAmount="{ row }">
+          <div v-if="row.payableRmbAmount > 0">{{ row.payableRmbAmount }}浜烘皯甯�</div>
+          <div v-if="row.payableHkbAmount > 0">{{ row.payableHkbAmount }}娓竵</div>
         </template>
       </avue-crud>
 
 
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary"
-                     :loading="pageF.isUploading" @click="submitGenerate">
+          <el-button type="primary" v-if="optionType != 'view'" :loading="pageF.isUploading" @click="submitGenerate">
             {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
           </el-button>
 
@@ -241,22 +193,20 @@
 
     <el-dialog title="璋冨害鍗曚綔搴�" v-model="open5" class="avue-dialog avue-dialog--top" width="80%">
       <el-descriptions :column="3" border>
-        <el-descriptions-item label="璋冨害鍗曞彿">{{form.dispatchNo}}</el-descriptions-item>
-        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{form.customerName}}</el-descriptions-item>
-        <el-descriptions-item label="椤圭洰鍚嶇О">{{form.projectName}}</el-descriptions-item>
-        <el-descriptions-item label="杩愯緭璺嚎">{{form.transportLine}}</el-descriptions-item>
-        <el-descriptions-item label="杞﹀瀷">{{form.$actualVehicleType}}</el-descriptions-item>
-        <el-descriptions-item label="杞︾墝">{{form.licensePlate}}</el-descriptions-item>
+        <el-descriptions-item label="璋冨害鍗曞彿">{{ form.dispatchNo }}</el-descriptions-item>
+        <el-descriptions-item label="瀹㈡埛鍚嶇О">{{ form.customerName }}</el-descriptions-item>
+        <el-descriptions-item label="椤圭洰鍚嶇О">{{ form.projectName }}</el-descriptions-item>
+        <el-descriptions-item label="杩愯緭璺嚎">{{ form.transportLine }}</el-descriptions-item>
+        <el-descriptions-item label="杞﹀瀷">{{ form.$actualVehicleType }}</el-descriptions-item>
+        <el-descriptions-item label="杞︾墝">{{ form.licensePlate }}</el-descriptions-item>
       </el-descriptions>
 
-      <avue-form  v-model="boxForm" ref="boxFormRef"
-                  :option="boxFormOption">
+      <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
 
       </avue-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary"
-                     :loading="pageF.isUploading" @click="submitForm5">
+          <el-button type="primary" :loading="pageF.isUploading" @click="submitForm5">
             {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
           </el-button>
 
@@ -279,34 +229,35 @@
   updateTmsDispatchOrder,
   generateTmsDispatchOrder, initGenerate, initYSGenerate,
   ysGenerateTmsDispatchOrder, initYFGenerate, yfGenerateTmsDispatchOrder,
-  getServiceProvider, checkCloseOrder, closeOrder
+  getServiceProvider, checkCloseOrder, closeOrder, tmsFinanceDetail
 } from "@/api/tms/tmsDispatchOrder";
 import useCurrentInstance from "@/utils/useCurrentInstance";
-import {computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick} from "vue";
-import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
-import {usePagePlus} from "@/hooks/usePagePlus";
-import {hasPermission} from "@/utils/permissionUtils";
-import {ElMessage, ElMessageBox} from "element-plus";
-import {addTmsTrip, listTmsTrip} from "@/api/tms/tmsTrip";
-import {saveTmsFinanceDetail, listTmsFinanceDetail, updateTmsFinanceDetail} from "@/api/tms/tmsFinanceDetail";
-import {listTmsQuoteItem} from "@/api/tms/tmsQuotePlanItem";
-import {getDicts} from "@/api/system/dict/data";
-import {listTmsServiceProvider} from "@/api/tms/tmsServiceProvider";
-import {listTmsCustomsServiceProvider} from "@/api/tms/tmsCustomsServiceProvider";
-import {listTmsLoadingServiceProvider} from "@/api/tms/tmsLoadingServiceProvider";
-import {selectPaymentTmsQuotePlan} from "@/api/tms/tmsQuotePlan";
-import {addTmsQuoteFee, listTmsQuoteFee, pushTmsQuoteFee} from "@/api/tms/tmsQuoteFee";
+import { computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
+import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
+import { usePagePlus } from "@/hooks/usePagePlus";
+import { hasPermission } from "@/utils/permissionUtils";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { addTmsTrip, listTmsTrip } from "@/api/tms/tmsTrip";
+import { saveTmsFinanceDetail, listTmsFinanceDetail, updateTmsFinanceDetail } from "@/api/tms/tmsFinanceDetail";
+import { listTmsQuoteItem } from "@/api/tms/tmsQuotePlanItem";
+import { getDicts } from "@/api/system/dict/data";
+import { listTmsServiceProvider } from "@/api/tms/tmsServiceProvider";
+import { listTmsCustomsServiceProvider } from "@/api/tms/tmsCustomsServiceProvider";
+import { listTmsLoadingServiceProvider } from "@/api/tms/tmsLoadingServiceProvider";
+import { selectPaymentTmsQuotePlan } from "@/api/tms/tmsQuotePlan";
+import { addTmsQuoteFee, listTmsQuoteFee, pushTmsQuoteFee } from "@/api/tms/tmsQuoteFee";
+import { status } from "nprogress";
 
 
 
-const {appContext} = getCurrentInstance();
+const { appContext } = getCurrentInstance();
 
-const {proxy} = useCurrentInstance();
+const { proxy } = useCurrentInstance();
 const crudRef = ref();
 const boxFormRef = ref();
 
-const {sys_quotation_items,sys_unit,sys_currency} =
-    proxy.useDict("sys_quotation_items","sys_unit","sys_currency");
+const { sys_quotation_items, sys_unit, sys_currency } =
+  proxy.useDict("sys_quotation_items", "sys_unit", "sys_currency");
 const permissionList = (key: any, row: any, index: any) => {
   if (key == 'addBtn') {
     return hasPermission(["tms:tmsDispatchOrder:add"])
@@ -322,6 +273,8 @@
 };
 const data = reactive({
   form: <TmsDispatchOrderI>{},
+  selectionList2: <any>[],
+  boxSelectionList: <any>[],
   queryParams: <TmsDispatchOrderI & PageQueryInterface>{},
   page: <PagesInterface>{
     pageSize: 10,
@@ -339,21 +292,20 @@
   open: false,
   open2: false,
   goodsTableData: <any>[],
-  selectionList2: <any>[],
   goodsForm: <any>{},
   open3: false,
   actualForm: <any>{},
-  isCustoms:<any> -1,
+  isCustoms: <any>-1,
   isLoad: -1,
   active: 'tab1',
-  quotationItems:[],
+  quotationItems: [],
   serviceProviderList: <any>[],
-  open5:false,
+  open5: false,
 })
 const {
   queryParams, form, page, selectionList,
-  boxTableData, optionType,open,open5,
-  boxFormOption, boxForm, boxTableOption,boxItemTableOption,selectionList2,isCustoms,isLoad,active,quotationItems,serviceProviderList
+  boxTableData, optionType, open, open5, boxSelectionList,
+  boxFormOption, boxForm, boxTableOption, boxItemTableOption, selectionList2, isCustoms, isLoad, active, quotationItems, serviceProviderList
 } = toRefs(data);
 const option = ref({
   pageKey: 'TmsDispatchOrder',
@@ -437,7 +389,7 @@
           ],
         },
         isUrgent: {
-          label: '鏄惁绱ф��',value: '1',
+          label: '鏄惁绱ф��', value: '1',
           display: true,
           type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
           rules: [
@@ -498,7 +450,7 @@
               message: "鏄惁鏄嚜钀ヨ溅闃熶笉鑳戒负绌�", trigger: "change"
             }
           ],
-          change: ({value}: any) => {
+          change: ({ value }: any) => {
             console.log(value)
             option.value.group.forEach((item: any) => {
               if (item.prop == 'pcxx') {
@@ -514,7 +466,7 @@
 
           },
         },
-        commissionModel:{
+        commissionModel: {
           label: '鎻愭垚妯″紡',
           display: true, type: 'radio', dicUrl: '/system/dict/data/type/commission_model', dataType: 'string',
           rules: [
@@ -613,25 +565,28 @@
   column: {
 
     dispatchNo: {
-      label: '璋冨害鍗曞彿', minWidth: 120,
+      label: '璋冨害鍗曞彿', minWidth: 140,
       display: false,
       search: true,
     },
     customerName: {
       label: '瀹㈡埛',
-      display: false, minWidth: 120,
+      display: false, minWidth: 200,
       search: true,
+      overHidden: true
     },
 
     projectName: {
       label: '椤圭洰鍚嶇О',
-      display: false, minWidth: 120,
+      display: false, minWidth: 150,
       search: true,
+      overHidden: true
     },
     contractName: {
-      label: '鍏宠仈鍚堝悓鍚嶇О', minWidth: 120,
+      label: '鍏宠仈鍚堝悓鍚嶇О', minWidth: 160,
       display: false,
       search: true,
+      overHidden: true
     },
     orderType: {
       label: '璁㈠崟绫诲瀷',
@@ -704,13 +659,15 @@
 
     shipperName: {
       label: '瑁呰揣鐐瑰悕绉�',
-      display: false, minWidth: 120,
+      display: false, minWidth: 160,
       search: true,
+      overHidden: true
     },
     receiverName: {
-      label: '鍗歌揣鐐瑰悕绉�', minWidth: 120,
+      label: '鍗歌揣鐐瑰悕绉�', minWidth: 160,
       display: false,
       search: true,
+      overHidden: true
     },
     // accountsReceivableStatus: {
     //   label: '搴旀敹璐圭敤鐢熸垚鐘舵��', minWidth: 160,
@@ -745,7 +702,7 @@
     inStatusList: {
       label: '鐘舵��', minWidth: 150,
       type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status',
-      display: false,multiple:true,
+      display: false, multiple: true,
       hide: true,
       search: true,
 
@@ -780,22 +737,22 @@
     },
     updateTimeRange: {
       label: '鏇存柊鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
-      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
+      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
       valueFormat: 'YYYY-MM-DD',
     },
     confirmTimeRange: {
       label: '纭鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
-      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
+      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
       valueFormat: 'YYYY-MM-DD',
     },
     okTimeRange: {
       label: '瀹屾垚鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
-      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
+      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
       valueFormat: 'YYYY-MM-DD',
     },
     orderTimeRange: {
       label: '涓嬪崟鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
-      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
+      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
       valueFormat: 'YYYY-MM-DD',
     },
 
@@ -819,17 +776,17 @@
 })
 const tabsOption2 = ref({
   column: [
-      {
+    {
       label: '鎶ヤ环璐圭敤鐧昏',
       prop: 'tab1',
-        name: 'tab1',
+      name: 'tab1',
 
     },
     {
-    label: '瀹炴姤瀹為攢璐圭敤鐧昏',
-    prop: 'tab2',
+      label: '瀹炴姤瀹為攢璐圭敤鐧昏',
+      prop: 'tab2',
       name: 'tab2',
-  }]
+    }]
 })
 const itineraryTableOption = ref({
   menu: false,
@@ -872,7 +829,7 @@
       display: true,
     },
     voucherUrl: {
-      label: '琛岀▼鍑瘉',
+      label: '琛岀▼鍑瘉3',
       display: true,
       span: 24, dataType: 'string',
       type: 'upload',
@@ -925,11 +882,11 @@
       display: true,
       accept: 'string', dataType: 'string',
       type: 'upload',
-      action: '/common/upload2',
-
+      // action: '/common/upload2',
+      slot: true,
     },
     remark: {
-      label: '澶囨敞',span:24,
+      label: '澶囨敞', span: 24,
       display: true,
       type: 'textarea',
 
@@ -945,7 +902,8 @@
 const financeTableOption = ref({
   menu: false,
   addBtn: false,
-  header: false, selection: false,
+  header: true,
+  selection: true,
   title: '鍘嗗彶鍨粯璐圭敤',
   column: {
     dataSource: {
@@ -973,6 +931,17 @@
       label: '閲戦',
       display: true,
     },
+    currency: {
+      label: '甯佸埗',
+      display: true,
+      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
+      rules: [
+        {
+          required: true,
+          message: "甯佸埗涓嶈兘涓虹┖", trigger: "change"
+        }
+      ],
+    },
     feeVoucherUrl: {
       label: '璐圭敤鍑瘉',
       display: true,
@@ -986,35 +955,38 @@
       label: '澶囨敞',
       display: true,
     },
-    isYF:{
+    isYF: {
       label: '鏄惁搴斾粯璐圭敤',
       display: true,
       type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
 
     },
-    yfServiceProviderId:{
+    yfServiceProviderId: {
       label: '鏈嶅姟鍟�',
       display: true,
       type: 'select',
 
     },
-    yfPrice:{
+    yfPrice: {
       label: '搴斾粯閲戦',
       display: true,
     },
-    yfCurrency:{
+    yfCurrency: {
       label: '搴斾粯甯佸埗',
       display: true,
-
-    }
-
+    },
+    status: {
+      label: '鐘舵��',
+      display: true,
+      type: 'select', dicUrl: '/system/dict/data/type/sys_cancel_word', dataType: 'string',
+    },
   }
 })
 
 const itemsTableOption = ref({
   pageKey: 'itemsTable',
   rowKey: 'rowKey',
-  header: false,expand:true,
+  header: false, expand: true,
   addBtn: false, menu: false,
   column: {
     feeType: {
@@ -1048,35 +1020,35 @@
 const YSGenerateTableOption = ref({
   menu: false,
   add: false,
-  header:false,
+  header: false,
   selection: false,
-  expand:true,
-  defaultExpandAll:true,
-  rowKey:'id',
-  column:{
-    dispatchNo:{
+  expand: true,
+  defaultExpandAll: true,
+  rowKey: 'id',
+  column: {
+    dispatchNo: {
       label: '璋冨害鍗曞彿',
     },
-    customerName:{
+    customerName: {
       label: '瀹㈡埛鍚嶇О',
     },
-    shipperName:{
+    shipperName: {
       label: '瑁呰揣鍦�',
     },
-    receiverName:{
+    receiverName: {
       label: '鍗歌揣鍦�',
     },
-    transportLine:{
+    transportLine: {
       label: '杩愯緭璺嚎',
     },
-    actualVehicleType:{
+    actualVehicleType: {
       label: '杞﹀瀷',
       display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
 
-    },licensePlate:{
+    }, licensePlate: {
       label: '杞︾墝',
     },
-    receivableAmount:{
+    receivableAmount: {
       label: '搴旀敹璐圭敤',
     }
   }
@@ -1084,26 +1056,26 @@
 const YSGenerateItemTableOption = ref({
   menu: false,
   add: false,
-  header:false,
+  header: false,
   selection: false,
-  rowKey:'rowKey',
+  rowKey: 'rowKey',
 
-  column:{
-    feeType:{
+  column: {
+    feeType: {
       label: '璐圭敤绫诲瀷',
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/receivable_fee_type',
 
     },
-    feeName:{
+    feeName: {
       label: '璐圭敤鍚嶇О',
     },
-    registerTime:{
+    registerTime: {
       label: '鐧昏鏃堕棿',
     },
-    registerAmount:{
+    registerAmount: {
       label: '鐧昏閲戦',
     },
-    currency:{
+    currency: {
       label: '甯佸埗',
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
 
@@ -1115,20 +1087,20 @@
 const YFGenerateTableOption = ref({
   menu: false,
   add: false,
-  header:false,
+  header: false,
   selection: false,
-  expand:true,
-  defaultExpandAll:true,
-  rowKey:'id',
-  column:{
-    dispatchNo:{
+  expand: true,
+  defaultExpandAll: true,
+  rowKey: 'id',
+  column: {
+    dispatchNo: {
       label: '璋冨害鍗曞彿',
     },
-    serviceProviderType:{
+    serviceProviderType: {
       label: '鏈嶅姟鍟嗙被鍨�',
       type: 'radio', dicUrl: '/system/dict/data/type/provider_type', dataType: 'string',
     },
-    serviceProviderName:{
+    serviceProviderName: {
       label: '鏈嶅姟鍟嗗悕绋�',
     },
     // transportLine:{
@@ -1141,7 +1113,7 @@
     // },licensePlate:{
     //   label: '杞︾墝',
     // },
-    payableAmount:{
+    payableAmount: {
       label: '搴斾粯璐圭敤',
     }
   }
@@ -1149,26 +1121,26 @@
 const YFGenerateItemTableOption = ref({
   menu: false,
   add: false,
-  header:false,
+  header: false,
   selection: false,
-  rowKey:'rowKey',
+  rowKey: 'rowKey',
 
-  column:{
-    feeType:{
+  column: {
+    feeType: {
       label: '璐圭敤绫诲瀷',
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/receivable_fee_type',
 
     },
-    feeName:{
+    feeName: {
       label: '璐圭敤鍚嶇О',
     },
-    registerTime:{
+    registerTime: {
       label: '鐧昏鏃堕棿',
     },
-    registerAmount:{
+    registerAmount: {
       label: '鐧昏閲戦',
     },
-    currency:{
+    currency: {
       label: '甯佸埗',
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
 
@@ -1181,8 +1153,8 @@
   menuBtn: false,
   labelWidth: 120,
   column: {
-    closeWhy:{
-      label: '浣滃簾鍘熷洜',span:24,
+    closeWhy: {
+      label: '浣滃簾鍘熷洜', span: 24,
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/close_why',
       rules: [
         {
@@ -1191,10 +1163,10 @@
         }
       ],
     },
-    closeWhyRemark:{
+    closeWhyRemark: {
       label: '浣滃簾鍘熷洜璇存槑',
       type: 'textarea',
-      span:24,
+      span: 24,
     },
   }
 })
@@ -1239,10 +1211,10 @@
   },
   handleSelectionChangeFunc: (selection: any) => {
     selectionList.value = selection;
-    if (selection.length > 0){
+    if (selection.length > 0) {
       isCustoms.value = selection[0].isCustoms;
-      isLoad.value = selection[0].isLoad ;
-    }else{
+      isLoad.value = selection[0].isLoad;
+    } else {
       isCustoms.value = -1;
       isLoad.value = -1;
     }
@@ -1250,13 +1222,50 @@
     isLoad.value = isLoad.value == 0 && !pageF.single ? 0 : -1;
     console.log(pageF.single)
   },
+
+
   getBeginListFunc: (params = {}) => {
-    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.createTimeRange, 'createTime') || {};
-    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.updateTimeRange, 'updateTime') || {};
-    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.confirmTimeRange, 'confirmTime') || {};
-    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.okTimeRange, 'okTime') || {};
-    return params;
-    },
+    // 1. 浣跨敤娴呮嫹璐濓紝涓嶅奖鍝嶅師濮嬫煡璇㈠璞�
+    // 鍏抽敭鐐癸細浠庡師濮� queryParams.value 鍙栧�硷紝纭繚鍒嗛〉鏃朵緷鐒惰兘鎷垮埌鏁扮粍
+    let newParams = { ...queryParams.value, ...params };
+
+    // 2. 瀹氫箟鏃ユ湡瀛楁鏄犲皠 (鏁扮粍鍚� : 鎺ュ彛闇�瑕佺殑鍓嶇紑)
+    const dateMap = {
+      createTimeRange: 'createTime',
+      updateTimeRange: 'updateTime',
+      confirmTimeRange: 'confirmTime',
+      okTimeRange: 'okTime',
+    };
+
+    // 3. 閬嶅巻澶勭悊鏃ユ湡
+    Object.keys(dateMap).forEach(arrayKey => {
+      const prefix = dateMap[arrayKey];
+      const range = newParams[arrayKey];
+
+      if (Array.isArray(range) && range.length === 2) {
+        // 璧嬪�兼帴鍙i渶瑕佺殑 Begin 鍜� End
+        newParams[`${prefix}Begin`] = range[0];
+        newParams[`${prefix}End`] = range[1];
+      }
+
+      // 鍙湪缁欐帴鍙g殑鍙傛暟涓垹闄ゆ暟缁勶紝涓嶅奖鍝嶉〉闈㈡樉绀虹殑 queryParams
+      delete newParams[arrayKey];
+    });
+
+    // 4. 娓呮礂鍙傛暟锛氳繃婊ょ┖鍊�
+    const finalParams = {};
+    Object.keys(newParams).forEach(key => {
+      const val = newParams[key];
+      if (val !== '' && val !== null && val !== undefined) {
+        finalParams[key] = val;
+      }
+    });
+
+    console.log('鍙戦�佺粰鎺ュ彛鐨勬渶缁堝弬鏁�:', finalParams);
+
+    // 銆愭牳蹇冧慨鏀广�戯細鐩存帴杩斿洖锛屼笉瑕佽祴鍊肩粰 queryParams.value
+    return finalParams;
+  },
 
 })
 
@@ -1275,11 +1284,10 @@
 
 const submitForm = () => {
   if (active.value === 'tab1') {
-    console.log()
     pushTmsQuoteFee({
       ...form.value,
       quoteFeeItems: selectionList2.value
-    }).then(res=>{
+    }).then(res => {
       ElMessage({
         message: "鎿嶄綔鎴愬姛锛�",
         type: 'success'
@@ -1288,10 +1296,11 @@
     })
 
 
-  }else{
+  } else {
     if (Array.isArray(boxForm.value.feeVoucherUrl)) {
       boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString();
     }
+
     boxForm.value.rowItems = boxTableData.value;
     saveTmsFinanceDetail(boxForm.value).then(res => {
       ElMessage({
@@ -1299,6 +1308,7 @@
         type: 'success'
       })
       boxFormRef.value?.resetFields();
+      uploadRef.value?.clearFiles();
       getTab2Data();
     })
   }
@@ -1313,9 +1323,9 @@
 const handleLogItinerary = (row: any) => {
   optionType.value = 'view';
   boxTableOption.value = itineraryTableOption.value;
-  listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => {
+  listTmsTrip({ dispatchOrderId: row.id, pageNum: 1, pageSize: 999 }).then(res => {
     boxTableData.value = res.rows || [];
-    open.value =  true;
+    open.value = true;
     pageF.title = '鏌ョ湅琛岀▼';
     boxFormOption.value.title = '';
   })
@@ -1332,24 +1342,23 @@
   boxTableOption.value = financeTableOption.value;
   form.value = row;
   handleChange2(tabsOption2.value.column[0]);
-  nextTick(()=>{
+  nextTick(() => {
     tabsOption2Ref.value.active = "0";
 
   })
 }
 
 
-const getTab1Data = async () =>{
-  const quotePlanItemRes2 = await listTmsQuoteItem({quotePlanId: form.value.quotePlanId, pageNum: 1, pageSize: 999});
+const getTab1Data = async () => {
+  const quotePlanItemRes2 = await listTmsQuoteItem({ quotePlanId: form.value.quotePlanId, pageNum: 1, pageSize: 999 });
   let list = quotePlanItemRes2.rows || [];
-  let quotePlanItemRes = await  getDicts("sys_quotation_items");
-  console.log(quotePlanItemRes)
+  let quotePlanItemRes = await getDicts("sys_quotation_items");
   let items = quotePlanItemRes.data || [];
-  let res =  await listTmsQuoteFee({dispatchId: form.value.id,  pageNum: 1, pageSize: 999});
-    let rowsData = res.rows || [];
+  let res = await listTmsQuoteFee({ dispatchId: form.value.id, pageNum: 1, pageSize: 999 });
+  let rowsData = res.rows || [];
   selectionList2.value = []
   itemsTableRef.value?.clearSelection();
-  itemsTableData.value = items.map( (item: any) => {
+  itemsTableData.value = items.map((item: any) => {
     let find2 = list.find((ele: any) => {
       return item.dictValue == ele.free
     });
@@ -1362,22 +1371,22 @@
         unit: '娆�',
 
         ...item,
-        freeName:item.dictLabel,
+        freeName: item.dictLabel,
         feeType: item.dictLabel,
         rowKey: item.dictCode,
         free: item.dictValue,
         ...find,
         ...find2,
-        price: find.price||0,
-        currency: find.currency|| 'RMB',
-        sum: find.sum|| 0,
+        price: find.price || 0,
+        currency: find.currency || 'RMB',
+        sum: find.sum || 0,
       };
       selectionList2.value.push(aRow);
       return aRow
     } else {
       return {
         ...item,
-        freeName:item.dictLabel,
+        freeName: item.dictLabel,
         rowKey: item.dictCode,
         feeType: item.dictLabel,
         price: 0,
@@ -1401,7 +1410,7 @@
 }
 
 
-const getTab2Data = async () =>{
+const getTab2Data = async () => {
   let serviceProvider = await getServiceProvider(form.value.id);
   serviceProviderList.value = serviceProvider.data || [];
   listTmsFinanceDetail({
@@ -1425,7 +1434,7 @@
 
 
 const getQuotationItems = async () => {
-  let res = await  getDicts("sys_quotation_items");
+  let res = await getDicts("sys_quotation_items");
   quotationItems.value = res.data || [];
 }
 getQuotationItems();
@@ -1441,15 +1450,15 @@
 
 
 
-const handleChange = (column:any) => {
-  let accountsReceivableStatus :number | undefined= undefined;
-  let accountsPayableStatus :number | undefined= undefined;
-  if (column.prop === 'tab1'){
+const handleChange = (column: any) => {
+  let accountsReceivableStatus: number | undefined = undefined;
+  let accountsPayableStatus: number | undefined = undefined;
+  if (column.prop === 'tab1') {
     accountsReceivableStatus = 0
 
-  }else if (column.prop === 'tab2'){
+  } else if (column.prop === 'tab2') {
     accountsPayableStatus = 0;
-  }else if (column.prop === 'tab3'){
+  } else if (column.prop === 'tab3') {
     queryParams.value.inStatusList = [5];
   }
   page.value.currentPage = 1;
@@ -1458,58 +1467,57 @@
   onLoad(page.value)
 }
 
-const handleChange2 = (column:any)=>{
-    active.value = column.prop;
-    if (column.prop === 'tab1'){
-      getTab1Data()
-    }else if (column.prop === 'tab2'){
-      getTab2Data()
-    }
+const handleChange2 = (column: any) => {
+  active.value = column.prop;
+  if (column.prop === 'tab1') {
+    getTab1Data()
+  } else if (column.prop === 'tab2') {
+    getTab2Data()
+  }
 }
 
-const isYFChange =async (value:number,row:any)  =>   {
-  if (value == 1){
-    let find:any = quotationItems.value.find((item:any) => item.dictLabel === row.feeType);
-    if (find){
-      console.log(find,"find")
-      let opt =  find.remark;
+const isYFChange = async (value: number, row: any) => {
+  if (value == 1) {
+    let find: any = quotationItems.value.find((item: any) => item.dictLabel === row.feeType);
+    if (find) {
+      let opt = find.remark;
       row.serviceProviderType = opt;
-      if (opt == 0){
-        let res = await listTmsServiceProvider({pageSize:999,pageNum:1})
-        row.serviceProviderData = res.rows|| [];
+      if (opt == 0) {
+        let res = await listTmsServiceProvider({ pageSize: 999, pageNum: 1 })
+        row.serviceProviderData = res.rows || [];
 
         // 杞﹁締杩愯惀鍟�
         let serviceProviderId = form.value.vehicleProviderId || row.serviceProviderId;
-        if (!serviceProviderId){
+        if (!serviceProviderId) {
           ElMessage.warning("鎵句笉鍒拌璐圭敤鐨勮溅杈嗘湇鍔″晢");
-        }else{
+        } else {
           row.serviceProviderId = serviceProviderId;
         }
 
-      }else if (opt == 1){
-        let res = await listTmsCustomsServiceProvider({pageSize:999,pageNum:1})
-        row.serviceProviderData = res.rows|| [];
+      } else if (opt == 1) {
+        let res = await listTmsCustomsServiceProvider({ pageSize: 999, pageNum: 1 })
+        row.serviceProviderData = res.rows || [];
         let serviceProviderId = form.value.customsServiceProviderId || row.serviceProviderId;
-        if (!serviceProviderId){
+        if (!serviceProviderId) {
           ElMessage.warning("鎵句笉鍒拌璐圭敤鐨勬姤鍏虫湇鍔″晢");
-        }else{
+        } else {
           row.serviceProviderId = serviceProviderId;
 
         }
 
-      }else if (opt == 2){
-        let res = await listTmsLoadingServiceProvider({pageSize:999,pageNum:1})
-        row.serviceProviderData = res.rows|| [];
+      } else if (opt == 2) {
+        let res = await listTmsLoadingServiceProvider({ pageSize: 999, pageNum: 1 })
+        row.serviceProviderData = res.rows || [];
         let serviceProviderId = form.value.loadingServiceProviderId || row.serviceProviderId;
-        if (!serviceProviderId){
+        if (!serviceProviderId) {
           ElMessage.warning("鎵句笉鍒拌璐圭敤鐨勮璐ф湇鍔″晢");
-        }else{
+        } else {
           row.serviceProviderId = serviceProviderId;
 
         }
       }
 
-      if (row.serviceProviderType){
+      if (row.serviceProviderType) {
         serviceProviderChange(row);
       }
 
@@ -1517,7 +1525,7 @@
     }
   }
 
-  itemsTableRef.value?.toggleRowExpansion(row,value == 1)
+  itemsTableRef.value?.toggleRowExpansion(row, value == 1)
 
 
 
@@ -1526,23 +1534,23 @@
 
 }
 
-const serviceProviderChange = (row:any) => {
-  selectPaymentTmsQuotePlan({providerId:row.serviceProviderId,providerType:row.serviceProviderType,free:row.free}).then(res=>{
-    let resData =  res.data || {};
-    if (Object.keys(resData).length > 0){
-      row.yfCurrency =resData.currency ;
-      row.yfId =resData.id ;
-      row.yfPrice =resData.price ;
-      row.yfCurrency =resData.currency ;
-      row.yfCurrency =resData.currency ;
-      row.isCZYF = 1 ;
-    }else{
-      row.isCZYF = 0 ;
+const serviceProviderChange = (row: any) => {
+  selectPaymentTmsQuotePlan({ providerId: row.serviceProviderId, providerType: row.serviceProviderType, free: row.free }).then(res => {
+    let resData = res.data || {};
+    if (Object.keys(resData).length > 0) {
+      row.yfCurrency = resData.currency;
+      row.yfId = resData.id;
+      row.yfPrice = resData.price;
+      row.yfCurrency = resData.currency;
+      row.yfCurrency = resData.currency;
+      row.isCZYF = 1;
+    } else {
+      row.isCZYF = 0;
     }
   })
 }
 
-const yfPriceChange = (row:any)=>{
+const yfPriceChange = (row: any) => {
   let yfCount = row.yfCount || 0;
   let yfPrice = row.yfPrice || 0;
   row.yfSum = Number(yfPrice) * Number(yfCount);
@@ -1554,15 +1562,14 @@
   let ids = selectionList.value.map((item: any) => item.id);
   initYSGenerate(ids).then(res => {
     boxTableData.value = res.data || [];
-    boxTableData.value.forEach((item:any) => {
+    boxTableData.value.forEach((item: any) => {
       let items = item.tmsReceivableFeeItems || [];
-      let receivableAmountRMB = items.filter( (cItem:any) => cItem.currency == 'RMB').reduce( (pre:any,cur:any) => {
+      let receivableAmountRMB = items.filter((cItem: any) => cItem.currency == 'RMB').reduce((pre: any, cur: any) => {
         return pre + Number(cur.registerAmount)
-      },0);
-      let receivableAmountHKD = items.filter( (cItem:any) => cItem.currency == 'HKD').reduce( (pre:any,cur:any) => {
+      }, 0);
+      let receivableAmountHKD = items.filter((cItem: any) => cItem.currency == 'HKD').reduce((pre: any, cur: any) => {
         return pre + Number(cur.registerAmount)
-      },0);
-      console.log(receivableAmountRMB,receivableAmountHKD)
+      }, 0);
       item.receivableAmountRMB = receivableAmountRMB;
       item.receivableAmountHKD = receivableAmountHKD;
 
@@ -1577,7 +1584,7 @@
 /**
  * 鐢熸垚搴斾粯璐圭敤
  */
-const handleYFGenerate = () =>{
+const handleYFGenerate = () => {
   let ids = selectionList.value.map((item: any) => item.id);
   initYFGenerate(ids).then(res => {
     boxTableData.value = res.data || [];
@@ -1592,7 +1599,7 @@
 const submitGenerate = () => {
   pageF.isUploading = true;
   let ids = selectionList.value.map((item: any) => item.id);
-  if (optionType.value == 'ysGenerate'){
+  if (optionType.value == 'ysGenerate') {
     ysGenerateTmsDispatchOrder(ids).then(res => {
       pageF.isUploading = false;
       ElMessage({
@@ -1604,7 +1611,7 @@
     }).finally(() => {
       pageF.isUploading = false;
     })
-  }else  if (optionType.value == 'yfGenerate'){
+  } else if (optionType.value == 'yfGenerate') {
     yfGenerateTmsDispatchOrder(ids).then(res => {
       pageF.isUploading = false;
       ElMessage({
@@ -1621,41 +1628,105 @@
 
 }
 
-const ysServiceProviderChange = (e:any,row:any) => {
-  let  active = serviceProviderList.value.find((item:any) => item.serviceProviderId + '_'+ item.serviceProviderType == e)
+const ysServiceProviderChange = (e: any, row: any) => {
+  let active = serviceProviderList.value.find((item: any) => item.serviceProviderId + '_' + item.serviceProviderType == e)
   row.yfServiceProviderId = active.serviceProviderId;
   row.yfServiceProviderName = active.serviceProviderName;
   row.yfServiceProviderType = active.serviceProviderType;
 }
-const handleClose = (row:any) => {
+const handleClose = (row: any) => {
 
-  if (row.status == 2 && row.isfk == 1){
-    checkCloseOrder(row.id).then(res=>{
+  if (row.status == 2 && row.isfk == 1) {
+    checkCloseOrder(row.id).then(res => {
       open5.value = true;
       form.value = row;
       boxFormOption.value = closeOption.value;
     });
-  }else{
+  } else {
     open5.value = true;
     form.value = row;
     boxFormOption.value = closeOption.value;
 
   }
 }
-const submitForm5 = () =>{
-  boxFormRef.value.validate((valid: boolean,done:any) => {
-    console.log(valid)
-    if(valid){
+const submitForm5 = () => {
+  boxFormRef.value.validate((valid: boolean, done: any) => {
+    if (valid) {
       boxForm.value.id = form.value.id;
-      closeOrder(boxForm.value).then(res=>{
+      closeOrder(boxForm.value).then(res => {
         ElMessage.success('鎿嶄綔鎴愬姛');
         open5.value = false;
         done();
         onLoad(page.value)
-      }).catch(err=>{
+      }).catch(err => {
         done();
       })
     }
   })
 }
+const uploadRef = ref<any>()
+const urlApi = ref(import.meta.env.VITE_APP_BASE_API)
+// 鍦� script 閮ㄥ垎淇敼 handleUploadAfter 鍑芥暟
+const handleUploadAfter = (res: any, row: any) => {
+  if (res.code === 200) {
+    // 纭繚 res.data.url 瀛樺湪
+    const url = res.data?.url || res.url;
+    if (url) {
+      boxForm.value.feeVoucherUrl = url
+    } else {
+      ElMessage.error('鏈幏鍙栧埌涓婁紶鏂囦欢 URL');
+    }
+  } else {
+    ElMessage.error(res.msg || '涓婁紶澶辫触');
+  }
+};
+
+// 鍚屾椂淇敼 handleExceed 鍑芥暟
+const handleExceed = (files: any, row: any) => {
+  if (!row) {
+    ElMessage.error('琛屾暟鎹负绌�');
+    return;
+  }
+
+  uploadRef.value?.clearFiles();
+  const file = files[0];
+  uploadRef.value?.handleStart(file);
+  uploadRef.value?.submit();
+};
+
+const boxSelectionChange = (selection: any[]) => {
+  boxSelectionList.value = selection;
+}
+/**
+ * 鎵归噺浣滃簾璐圭敤鏄庣粏
+ */
+const handleBatchBoxDel = () => {
+  if (boxSelectionList.value.length === 0) {
+    ElMessage.warning('璇烽�夋嫨瑕佷綔搴熺殑璐圭敤鏄庣粏');
+    return;
+  }
+
+  ElMessageBox.confirm(`纭瑕佷綔搴熼�変腑鐨� ${boxSelectionList.value.length} 鏉¤垂鐢ㄦ槑缁嗗悧锛焋, '璀﹀憡', {
+    confirmButtonText: '纭畾',
+    cancelButtonText: '鍙栨秷',
+    type: 'warning'
+  }).then(() => {
+    // 浠� boxTableData 涓Щ闄ら�変腑鐨勯」
+    // const ids = boxSelectionList.value.map((item: any) => item.id).join(',');
+    let data = {
+      id: boxSelectionList.value[0].id,
+      status: 1
+    }
+    tmsFinanceDetail(data).then(res => {
+      ElMessage.success('浣滃簾鎴愬姛');
+      getTab2Data(); // 鍒锋柊鏁版嵁
+    }).catch(err => {
+      ElMessage.error('浣滃簾澶辫触');
+    });
+    // ElMessage.success('浣滃簾鎴愬姛');
+    // boxSelectionList.value = []; // 娓呯┖閫夋嫨
+  }).catch(() => {
+    // 鍙栨秷鎿嶄綔
+  });
+}
 </script>
\ No newline at end of file

--
Gitblit v1.8.0