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/tmsDispatchOrder/index.vue | 1161 +++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 944 insertions(+), 217 deletions(-)

diff --git a/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue b/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
index 3198e16..82fb31f 100644
--- a/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
+++ b/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -5,6 +5,51 @@
       @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 #licensePlate-form="{ row, disabled }">
+        <el-input v-model="form.licensePlate" placeholder="璇烽�夋嫨杞︾墝鍙�" readonly :disabled="disabled"
+          @click="handleVehicleSelect">
+          <template #append>
+            <el-button icon="el-icon-search" @click="handleVehicleSelect" />
+          </template>
+        </el-input>
+      </template>
+      <!-- template 涓� -->
+      <template #requiredVehicleTypes-form="{ row, disabled }">
+        <template v-if="disabled">
+          <span>{{ dictFormat(vehicle_type, row?.requiredVehicleTypes || form?.requiredVehicleTypes) }}</span>
+        </template>
+        <template v-else>
+          <el-select v-model="form.requiredVehicleTypes" placeholder="璇烽�夋嫨杞﹀瀷" style="width: 100%">
+            <el-option v-for="item in vehicle_type" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </template>
+      </template>
+
+      <template #orderType-form="{ row, disabled }">
+        <template v-if="disabled">
+          <span>{{ dictFormat(order_type, row?.orderType || form?.orderType) }}</span>
+        </template>
+        <template v-else>
+          <el-select v-model="form.orderType" placeholder="璇烽�夋嫨璁㈠崟绫诲瀷" @change="(val) => handleOrderTypeChange(val)"
+            style="width: 100%" clearable>
+            <el-option v-for="item in order_type" :key="item.value" :label="item.label" :value="parseInt(item.value)" />
+          </el-select>
+        </template>
+      </template>
+
+      <template #actualVehicleType-form="{ row, disabled }">
+        <template v-if="disabled">
+          <span>{{ dictFormat(vehicle_type, row?.actualVehicleType || form?.actualVehicleType) }}</span>
+        </template>
+        <template v-else>
+          <el-select v-model="form.actualVehicleType" placeholder="璇烽�夋嫨瀹為檯杞﹀瀷" style="width: 100%">
+            <el-option v-for="item in vehicle_type" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </template>
+      </template>
+
+
+
       <template #menu-left>
         <!--        <el-button-->
         <!--            type="success"-->
@@ -41,11 +86,10 @@
         <el-button type="primary" icon="Male" :disabled="pageF.single" @click="handleConnectHang"
           v-hasPermi="['tms:tmsDispatchOrder:connectHang']">鎺ユ寕
         </el-button>
-
-        <el-button type="warning" icon="Avatar" :disabled="!(isCustoms == 0)" @click="handleCustoms"
+        <el-button type="warning" icon="Avatar" :disabled="selectionList.length === 0" @click="handleCustoms"
           v-hasPermi="['tms:tmsDispatchOrder:customs']">濮旀墭鎶ュ叧淇℃伅
         </el-button>
-        <el-button type="primary" icon="UserFilled" :disabled="!(isLoad == 0)" @click="handleLoading"
+        <el-button type="primary" icon="UserFilled" :disabled="selectionList.length === 0" @click="handleLoading"
           v-hasPermi="['tms:tmsDispatchOrder:loading']">濮旀墭鍗歌揣淇℃伅
         </el-button>
         <el-button type="primary" icon="UserFilled" :disabled="pageF.single" @click="handleZZ"
@@ -90,21 +134,24 @@
 
       <template #menu="{ row, index, size }">
         <el-tooltip content="鏌ョ湅" placement="top" :enterable="false">
-          <el-link type="primary" icon="el-icon-view" :underline="false" class="link-btn"
+          <el-link type="primary" icon="el-icon-view" underline="never" class="link-btn"
             v-hasPermi="['tms:tmsDispatchOrder:query']" @click="$refs.crudRef.rowView(row, index)">
+            &nbsp;
           </el-link>
         </el-tooltip>
         <el-tooltip content="鍒犻櫎" placement="top" :enterable="false">
-          <el-link type="primary" icon="el-icon-delete" :underline="false" class="link-btn"
+          <el-link type="primary" icon="el-icon-delete" underline="never" class="link-btn"
             v-hasPermi="['tms:tmsDispatchOrder:remove']" v-if="row.status == 0"
             @click="$refs.crudRef.rowDel(row, index)">
+            &nbsp;
           </el-link>
         </el-tooltip>
 
         <el-tooltip content="缂栬緫" placement="top" :enterable="false">
-          <el-link type="primary" icon="el-icon-edit" :underline="false" class="link-btn"
+          <el-link type="primary" icon="el-icon-edit" underline="never" class="link-btn"
             v-hasPermi="['tms:tmsDispatchOrder:edit']" v-if="[0, 1].includes(row.status)"
             @click="$refs.crudRef.rowEdit(row, index)">
+            &nbsp;
           </el-link>
         </el-tooltip>
 
@@ -114,56 +161,66 @@
 
         <el-tooltip content="杩愯緭璐у搧鐧昏" placement="top">
           <el-link size="small" type="primary" @click="handleAddGoods(row)" class="link-btn"
-            v-hasPermi="['tms:tmsGoodsDetail:add']" v-if="[0, 1, 2].includes(row.status)" :underline="false"
+            v-hasPermi="['tms:tmsGoodsDetail:add']" v-if="[0, 1, 2].includes(row.status)" underline="never"
             icon="el-icon-document-add">
+            &nbsp;
           </el-link>
         </el-tooltip>
         <el-tooltip content="瀹為檯杩愯緭璁板綍" placement="top">
           <el-link size="small" type="primary" @click="handleActual(row)" class="link-btn"
-            v-hasPermi="['tms:tmsDispatchOrder:update']" v-if="[0, 1, 2].includes(row.status)" :underline="false"
+            v-hasPermi="['tms:tmsDispatchOrder:update']" v-if="[0, 1, 2].includes(row.status)" underline="never"
             icon="el-icon-set-up">
+            &nbsp;
           </el-link>
         </el-tooltip>
         <el-tooltip content="纭畾" placement="top">
           <el-link size="small" type="primary" v-if="row.status == 0" @click="handleConfirm(row)" class="link-btn"
-            v-hasPermi="['tms:tmsDispatchOrder:confirmOrder']" :underline="false" icon="el-icon-pointer">
+            v-hasPermi="['tms:tmsDispatchOrder:confirmOrder']" underline="never" icon="el-icon-pointer">
+            &nbsp;
           </el-link>
         </el-tooltip>
         <el-tooltip content="浣滃簾" placement="top">
           <el-link size="small" type="primary" v-if="[0, 1, 2].includes(row.status)" @click="handleClose(row)"
-            class="link-btn" v-hasPermi="['tms:tmsDispatchOrder:closeOrder']" :underline="false" icon="el-icon-close">
+            class="link-btn" v-hasPermi="['tms:tmsDispatchOrder:closeOrder']" underline="never" icon="el-icon-close">
+            &nbsp;
           </el-link>
         </el-tooltip>
         <el-tooltip content="澶嶅埗" placement="top">
-          <el-link size="small" type="primary" @click="handleCopy(row)" class="link-btn" :underline="false"
+          <el-link size="small" type="primary" @click="handleCopy(row)" class="link-btn" underline="never"
             v-hasPermi="['tms:tmsDispatchOrder:copyOrder']" icon="el-icon-connection">
+            &nbsp;
           </el-link>
         </el-tooltip>
         <el-tooltip content="涓婁紶琛岀▼" placement="top">
           <el-link size="small" type="primary" v-if="[1, 2].includes(row.status)" @click="handleUploadItinerary(row)"
-            v-hasPermi="['tms:tmsTrip:add']" class="link-btn" :underline="false" icon="el-icon-upload">
+            v-hasPermi="['tms:tmsTrip:add']" class="link-btn" underline="never" icon="el-icon-upload">
+            &nbsp;
           </el-link>
         </el-tooltip>
         <el-tooltip content="鏌ョ湅琛岀▼" placement="top">
           <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">
+            v-hasPermi="['tms:tmsTrip:list']" class="link-btn" underline="never" icon="Finished">
+            &nbsp;
           </el-link>
         </el-tooltip>
         <el-tooltip content="瀹屾垚琛岀▼" placement="top">
           <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn"
-            v-hasPermi="['tms:tmsDispatchOrder:okOrder']" :underline="false" icon="el-icon-circle-check">
+            v-hasPermi="['tms:tmsDispatchOrder:okOrder']" underline="never" icon="el-icon-circle-check">
+            &nbsp;
           </el-link>
         </el-tooltip>
-
+        <!-- 
         <el-tooltip content="瀹屾垚琛岀▼" placement="top">
           <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn"
-            v-hasPermi="['tms:tmsDispatchOrder:okOrder']" :underline="false" icon="el-icon-circle-check">
+            v-hasPermi="['tms:tmsDispatchOrder:okOrder']" underline="never" icon="el-icon-circle-check">
+            &nbsp;
           </el-link>
-        </el-tooltip>
+        </el-tooltip> -->
 
         <el-tooltip content="鏃ュ織" placement="top">
           <el-link size="small" type="primary" @click="handleFlow(row)" class="link-btn"
-            v-hasPermi="['cwgl:estimatedReceivable:flog']"   :underline="false" icon="el-icon-document">
+            v-hasPermi="['cwgl:estimatedReceivable:flog']" underline="never" icon="el-icon-document">
+            &nbsp;
           </el-link>
         </el-tooltip>
 
@@ -201,7 +258,7 @@
             min="0"></el-input-number>
         </template>
       </avue-crud>
-      <h2 v-if="optionType == 'addFinance'">瀹炴姤瀹為攢璐圭敤1</h2>
+      <h2 v-if="optionType == 'addFinance'">瀹炴姤瀹為攢璐圭敤</h2>
       <avue-form v-if="optionType == 'addItinerary' || optionType == 'addFinance'" v-model="boxForm" ref="boxFormRef"
         :option="boxFormOption">
 
@@ -249,26 +306,40 @@
       </div>
 
       <div v-if="optionType == 'customs'">
-        <el-descriptions style="margin-bottom: 20px" :column="2" border>
+        <el-descriptions v-if="optionNum == 'radio'" style="margin-bottom: 20px" :column="2" 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>
+        <el-table v-if="optionNum == 'checkbox'" :data="clearanceList" border size="small"
+          style="width: 100%; margin-bottom: 20px">
+          <el-table-column prop="dispatchNo" label="璋冨害鍗曞彿" width="150" />
+          <el-table-column prop="customerName" label="瀹㈡埛" min-width="120" show-overflow-tooltip />
+          <el-table-column prop="projectName" label="椤圭洰鍚嶇О" min-width="120" show-overflow-tooltip />
+          <el-table-column prop="transportLine" label="杩愯緭璺嚎" min-width="150" show-overflow-tooltip />
+        </el-table>
+
         <avue-form v-model="form" ref="boxFormRef" :option="boxFormOption">
 
         </avue-form>
       </div>
 
       <div v-if="optionType == 'loading'">
-        <el-descriptions style="margin-bottom: 20px" :column="2" border>
+        <el-descriptions v-if="optionNum == 'radio'" style="margin-bottom: 20px" :column="2" 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>
+        <el-table v-if="optionNum == 'checkbox'" :data="clearanceList" border size="small"
+          style="width: 100%; margin-bottom: 20px">
+          <el-table-column prop="dispatchNo" label="璋冨害鍗曞彿" width="150" />
+          <el-table-column prop="customerName" label="瀹㈡埛" min-width="120" show-overflow-tooltip />
+          <el-table-column prop="projectName" label="椤圭洰鍚嶇О" min-width="120" show-overflow-tooltip />
+          <el-table-column prop="transportLine" label="杩愯緭璺嚎" min-width="150" show-overflow-tooltip />
+        </el-table>
         <avue-form v-model="form" ref="boxFormRef" :option="boxFormOption">
-
         </avue-form>
       </div>
       <template #footer>
@@ -344,7 +415,6 @@
             <el-input-number v-model="row.actualFeeAmount" :precision="2" :min="0" controls-position="right"
               placeholder="杈撳叆閲戦" style="width: 100%" />
           </template>
-
           <template #currency="{ row }">
             <el-radio-group v-model="row.currency">
               <el-radio v-for="item in sys_currency" :key="item.value" :label="item.value">
@@ -353,15 +423,32 @@
             </el-radio-group>
           </template>
           <template #voucherUrl="{ row }">
-            <avue-upload v-model="row.voucherUrl" :action="'/common/upload2'" type="upload" accept="image/*"
-              @upload-after="(res, done, loading, column) => handleUploadAfter(res, done, loading, column, row)"></avue-upload>
+            <!-- <avue-upload v-model="row.voucherUrl" :action="'/common/upload2'" type="upload" accept="image/*"
+              @upload-after="(res, done, loading, column) => handleUploadAfter(res, done, loading, column, row)"></avue-upload> -->
+
+            <!-- 鍑瘉鍥剧墖 -->
+            <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>
+
+            </el-upload>
           </template>
           <template #remark="{ row }">
             <el-input v-model="row.remark" placeholder="濉啓澶囨敞" clearable />
           </template>
         </avue-crud>
-        <avue-crud :option="boxTableOption" :data="boxTableData">
-
+        <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>
         </avue-crud>
       </div>
       <template #footer>
@@ -490,7 +577,7 @@
         <div class="dialog-footer">
           <el-button @click="print = 0" v-if="print == 1">閲嶆柊濉啓</el-button>
           <el-button type="primary" :loading="pageF.isUploading" @click="submitForm6">
-            {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�2' }}
+            {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
           </el-button>
 
           <el-button @click="open6 = false">鍙� 娑�</el-button>
@@ -508,7 +595,7 @@
         <template #tip>
           <div class="el-upload__tip text-center">
             <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
-            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
+            <el-link type="primary" underline="never" style="font-size:12px;vertical-align: baseline;"
               @click="importTemplate">涓嬭浇妯℃澘</el-link>
           </div>
         </template>
@@ -566,10 +653,20 @@
         @on-load="getImportLogList"></avue-crud>
     </el-dialog>
 
-     <flowLog ref="flowLogIshow" :isShow="false" :flowParams="flowParams"></flowLog>
-    
-  </basicContainer>
+    <flowLog ref="flowLogIshow" :isShow="false" :flowParams="flowParams"></flowLog>
 
+  </basicContainer>
+  <el-dialog title="閫夋嫨杞﹁締" v-model="vehicleDialogVisible" width="70%" append-to-body :close-on-click-modal="false">
+    <avue-crud ref="vehicleCrudRef" :option="vehicleOption" :data="vehicleData" :page="vehiclePage"
+      @on-load="loadVehicleList" @search-change="vehicleSearchChange" @search-reset="vehicleSearchReset"
+      @current-change="vehicleCurrentChange" @size-change="vehicleSizeChange" @row-click="handleVehicleRowClick">
+    </avue-crud>
+
+    <template #footer>
+      <el-button @click="vehicleDialogVisible = false">鍙� 娑�</el-button>
+      <el-button type="primary" @click="confirmVehicleSelection">纭� 瀹�</el-button>
+    </template>
+  </el-dialog>
 
 </template>
 
@@ -598,10 +695,11 @@
   printDispatchOrder,
   importTemplateTmsDispatchOrder, ypdddjSumbit,
   tmsTmsDispatchOrderImportLog,
-  saveTmsFinanceDetail2
+  saveTmsFinanceDetail2,
+  getLastLicensePlate,
 } from "@/api/tms/tmsDispatchOrder";
 import useCurrentInstance from "@/utils/useCurrentInstance";
-import { computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
+import { computed, onMounted, onBeforeUnmount, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
 import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
 import { usePagePlus } from "@/hooks/usePagePlus";
 import { hasPermission } from "@/utils/permissionUtils";
@@ -635,17 +733,38 @@
 import { $Print } from '@smallwei/avue'
 import { getToken } from "@/utils/auth";
 import { useAvueTableShowHide } from "@/hooks/useAvueTableShowHide";
-
-const { appContext } = getCurrentInstance();
+import {
+  tmsFinanceDetail
+} from "@/api/tms/tmsDispatchOrder";
+const { appContext } = getCurrentInstance() as any;
 
 const { proxy } = useCurrentInstance(
 );
-const { fee_type, sys_currency } = proxy.useDict('fee_type', 'sys_currency')
+// 瀹氫箟绫诲瀷
+interface VehicleRow {
+  id?: string;
+  licensePlate?: string;
+  serviceProviderName?: string;
+  vehicleType?: string;
+  internalCode?: string;
+  licenseHk?: string;
+  licenseMo?: string;
+  [key: string]: any;
+}
+const { fee_type, sys_currency, vehicle_type, order_type } = proxy.useDict('fee_type', 'sys_currency', 'vehicle_type', 'order_type')
 const crudRef = ref();
 const boxFormRef = ref();
 const goodsCrudRef = ref();
 const actualFormRef = ref();
-
+const isAutoSettingVehicle = ref(false);
+/**
+ * 瀛楀吀鍏叡杞崲鍑芥暟
+ */
+const dictFormat = (dict: any, value: any) => {
+  const dictData = Array.isArray(dict) ? dict : (dict?.value || []);
+  if (value === undefined || value === null || value === '') return '';
+  return proxy.selectDictLabel(dictData, value);
+};
 
 const permissionList = (key: any, row: any, index: any) => {
   if (key == 'addBtn') {
@@ -660,11 +779,31 @@
     return true;
   }
 };
+const getNextDayMidnight = () => {
+  const date = new Date();
+
+  // 1. 灏嗘棩鏈熸帹杩涘埌鏄庡ぉ
+  date.setDate(date.getDate() + 1);
+
+  // 2. 灏嗘椂鍒嗙姣鍏ㄩ儴娓呴浂
+  date.setHours(0, 0, 0, 0);
+
+  const year = date.getFullYear();
+  const month = String(date.getMonth() + 1).padStart(2, '0');
+  const day = String(date.getDate()).padStart(2, '0');
+  const hours = String(date.getHours()).padStart(2, '0');
+  const minutes = String(date.getMinutes()).padStart(2, '0');
+  const seconds = String(date.getSeconds()).padStart(2, '0');
+
+  // 杩斿洖鏍煎紡锛�2024-01-20 00:00:00
+  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+};
 const data = reactive({
   form: <TmsDispatchOrderI>{},
+  boxSelectionList: <any>[],
   queryParams: <TmsDispatchOrderI & PageQueryInterface>{},
   page: <PagesInterface>{
-    pageSize: 10,
+    pageSize: 30,
     total: 0,
     currentPage: 1,
   },
@@ -693,10 +832,11 @@
   queryParams, form, page, selectionList, open3,
   boxTableData, optionType,
   boxFormOption, boxForm, boxTableOption, title, open, open2,
-  goodsTableData, goodsForm, actualForm, selectionList2, isCustoms, isLoad, open5, open6, open7, zxhdjSingle
+  goodsTableData, goodsForm, actualForm, selectionList2, isCustoms, isLoad, open5, open6, open7, zxhdjSingle, boxSelectionList
 } = toRefs(data);
 const option = ref({
   menuType: 'icon',
+
   viewBtn: false, // 鍏抽棴鍘熺敓鏌ョ湅
   editBtn: false, // 鍏抽棴鍘熺敓缂栬緫
   delBtn: false, // 鍏抽棴鍘熺敓缂栬緫
@@ -710,7 +850,7 @@
   labelWidth: 130,
   searchSpan: 6,
   searchLabelWidth: 150,
-  menuWidth: 300,
+  menuWidth: 350,
   height: 530,
   group: [
     {
@@ -746,7 +886,7 @@
                 customerCode: active.customerCode,
                 contractId: active.contractId,
                 contractName: active.contractName,
-                requiredVehicleTypes: active.vehicleType,
+                requiredVehicleTypes: active.vehicleType + '',
                 quotePlanId: active.quotePlanId,
               });
               form.value.shipperId = undefined;
@@ -831,15 +971,16 @@
           display: true, disabled: true
         },
         requiredVehicleTypes: {
-          label: '涓嬪崟杞﹀瀷', disabled: true,
-          display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
-          rules: [
-            {
-              required: true,
-              message: "涓嬪崟杞﹀瀷涓嶈兘涓虹┖", trigger: "blur"
-            }
-          ],
+          label: '涓嬪崟杞﹀瀷',
+          minWidth: 130,
+          display: true,        // 鉁� 鏀逛负 true 鍦ㄨ〃鏍兼樉绀�
+          type: 'select',
+          search: true,
+          dicUrl: '/system/dict/data/type/vehicle_type',
+          dataType: 'string',
+
         },
+
         orderType: {
           label: '璁㈠崟绫诲瀷',
           display: true,
@@ -852,9 +993,13 @@
             }
           ],
           change: ({ value }: any) => {
+
             option.value.group.forEach((item: any) => {
+
               if (item.prop == 'pcxx') {
                 item.column.shipperId.rules.forEach((cItem: any) => {
+
+
                   cItem.required = !(value == 1);
                 });
                 item.column.receiverId.rules.forEach((cItem: any) => {
@@ -1062,9 +1207,9 @@
         // },
         orderTime: {
           label: '涓嬪崟鏃堕棿',
-          type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
-          format: 'YYYY-MM-DD HH:mm:ss',
-          valueFormat: 'YYYY-MM-DD HH:mm:ss',
+          type: 'date',  // 鏀逛负 datetime 绫诲瀷
+          format: 'YYYY-MM-DD',
+          valueFormat: 'YYYY-MM-DD',
           display: true,
           rules: [
             {
@@ -1075,6 +1220,7 @@
         },
         latestDeparture: {
           label: '瑕佹眰鏈�鏅氬嚭鍙戞椂闂�',
+          value: getNextDayMidnight(),
           type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
           format: 'YYYY-MM-DD HH:mm:ss', labelWidth: 150,
           valueFormat: 'YYYY-MM-DD HH:mm:ss',
@@ -1088,6 +1234,7 @@
         },
         latestArrival: {
           label: '瑕佹眰鏈�鏅氬埌杈炬椂闂�', labelWidth: 150,
+          value: getNextDayMidnight(),
           type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
           format: 'YYYY-MM-DD HH:mm:ss',
           valueFormat: 'YYYY-MM-DD HH:mm:ss',
@@ -1117,7 +1264,6 @@
             }
           ],
           change: ({ value }: any) => {
-            console.log(value)
             option.value.group.forEach((item: any) => {
               if (item.prop == 'pcxx') {
                 item.column.commissionModel.display = value != 1;
@@ -1239,18 +1385,75 @@
               message: "涓婚┚椹跺憳涓嶈兘涓虹┖", trigger: "change"
             }
           ],
-          change: (val: any) => {
+          // 鍦� mainDriverId 鐨� change 浜嬩欢涓�
+          change: async (val: any) => {
+            if (data.isChanging) return;
+            data.isChanging = true;
+            isAutoSettingVehicle.value = true;
+
             const table = crudRef.value?.getPropRef?.('mainDriverId')?.$refs?.temp;
-            if (!table) return;
+            if (!table) {
+              data.isChanging = false;
+              isAutoSettingVehicle.value = false;
+              return;
+            }
+
             let active = table.active;
             if (Array.isArray(active)) active = active[0];
-            if (active) {
-              Object.assign(form.value, {
-                mainDriverId: active.id,
-                mainDriverName: active.driverName,
-              });
+            console.log('鑷姩濉厖鎴愬姛:', active);
+            if (active && active.driverName) {
+              try {
+
+                await nextTick(); // 绛夊緟娓呯┖鐢熸晥
+                const res = await getLastLicensePlate(active.driverName);
+
+                if (res.code === 200 && res.data) {
+                  const vehicleData = res.data;
+                  nextTick(() => {
+                    Object.assign(form.value, {
+                      licensePlate: vehicleData.licensePlate,
+                      vehicleId: vehicleData.vehicleId,
+                      actualVehicleType: vehicleData.actualVehicleType,
+                      mainDriverName: active.driverName
+ 
+
+                    });
+                  })
+                  await nextTick();
+                  console.log('鑷姩濉厖鎴愬姛:', form.value);
+                }
+              } catch (e) {
+                console.error("鑷姩鑾峰彇杞︾墝澶辫触", e);
+              } finally {
+                data.isChanging = false;
+                setTimeout(() => {
+                  // isAutoSettingVehicle.value = false;
+                }, 500); // 绋嶅井寤堕暱涓�鐐规椂闂达紝闃叉 vehicleId 鐨� change 浜嬩欢璇Е
+              }
+            } else {
+              data.isChanging = false;
+              // isAutoSettingVehicle.value = false;
             }
           },
+          // change: (val: any) => {
+          //   const table = crudRef.value?.getPropRef?.('mainDriverId')?.$refs?.temp;
+          //   if (!table) return;
+          //   let active = table.active;
+          //   if (Array.isArray(active)) active = active[0];
+          //   console.log(active,'888');
+
+          //   if (active) {
+          //     Object.assign(form.value, {
+          //       mainDriverId: active.id,
+          //       mainDriverName: active.driverName,
+          //     });
+          //     console.log(active.driverName,'44');
+          //     getLastLicensePlate(active.driverName).then(res => { 
+          //       console.log(res);
+
+          //     })
+          //   }
+          // },
           type: 'table', suffixIcon: 'search',
           children: {
             border: true,
@@ -1348,6 +1551,8 @@
               if (Array.isArray(value)) {
                 id = value[0]
               }
+              console.log(98521);
+
               getTmsDriver(id).then(res => {
                 return callback(res.data || {})
               })
@@ -1367,92 +1572,117 @@
           }
 
         },
-        vehicleId: {
+        licensePlate: {
           label: '杞︾墝鍙�', dataType: 'string',
           display: true,
+          readonly: true,
           rules: [
             {
-              required: true,
+              required: false,
               message: "杞︾墝鍙蜂笉鑳戒负绌�", trigger: "change"
             }
           ],
-          change: (val: any) => {
-            const table = crudRef.value?.getPropRef?.('vehicleId')?.$refs?.temp;
-            if (!table) return;
-            let active = table.active;
-            if (Array.isArray(active)) active = active[0];
-            if (active) {
-              Object.assign(form.value, {
-                vehicleId: active.id,
-                licensePlate: active.licensePlate,
-                actualVehicleType: active.vehicleType,
-              });
-            }
-          },
-          type: 'table', suffixIcon: 'search',
-          children: {
-            border: true,
-            searchLabelWidth: 100,
-            searchMenuSpan: 5,
-            column: {
-              serviceProviderName: {
-                label: '杞﹁締鏈嶅姟鍟�', minWidth: 130,
-                search: true,
-              },
-              vehicleType: {
-                label: '杞﹁締绫诲瀷', minWidth: 120,
-                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/vehicle_type',
-
-                search: true,
-              },
-              internalCode: {
-                label: '杞﹁締鍐呴儴缂栫爜', minWidth: 120,
-                search: true,
-              },
-              licensePlate: {
-                label: '杞︾墝鍙�', minWidth: 120,
-                search: true,
-              },
-              licenseHk: {
-                label: '棣欐腐鐗岀収', minWidth: 120,
-                search: true,
-              },
-              licenseMo: {
-                label: '婢抽棬鐗岀収', minWidth: 120,
-                search: true,
-              },
-            },
-
-          },
-          props: {
-            label: 'licensePlate',
-            value: 'id'
-          },
-          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
-            if (value) {
-              let id = value;
-              if (Array.isArray(value)) {
-                id = value[0]
-              }
-              getTmsVehicle(id).then(res => {
-                return callback(res.data || {})
-              })
-            } else {
-              listTmsVehicle({
-                pageSize: page.pageSize,
-                pageNum: page.currentPage, ...data,
-                carrierType: form.value.operationMode, serviceProviderId: form.value.vehicleProviderId
-              }).then(res => {
-                return callback({
-                  total: res.total,
-                  data: res.rows || [],
-                })
-              })
-            }
-
+          click: ({ value, column }) => {
+            // 鐐瑰嚮杈撳叆妗嗘椂瑙﹀彂閫夋嫨寮圭獥
+            handleVehicleSelect();
           }
-
         },
+        // vehicleId: {
+        //   label: '杞︾墝鍙�', dataType: 'string',
+        //   display: true,
+        //   rules: [
+        //     {
+        //       required: true,
+        //       message: "杞︾墝鍙蜂笉鑳戒负绌�", trigger: "change"
+        //     }
+        //   ],
+        //   change: (val: any) => {
+        //     if (isAutoSettingVehicle.value) {
+        //       return;
+        //     }
+
+        //     const table = crudRef.value?.getPropRef?.('vehicleId')?.$refs?.temp;
+        //     if (!table) return;
+        //     let active = table.active;
+        //     if (Array.isArray(active)) active = active[0];
+        //     console.log(9852);
+
+        //     if (active) {
+        //       Object.assign(form.value, {
+        //         vehicleId: active.id,
+        //         licensePlate: active.licensePlate,
+        //         actualVehicleType: active.vehicleType,
+        //       });
+        //     }
+        //   },
+        //   type: 'table', suffixIcon: 'search',
+        //   children: {
+        //     border: true,
+        //     searchLabelWidth: 100,
+        //     searchMenuSpan: 5,
+        //     column: {
+        //       serviceProviderName: {
+        //         label: '杞﹁締鏈嶅姟鍟�', minWidth: 130,
+        //         search: true,
+        //       },
+        //       vehicleType: {
+        //         label: '杞﹁締绫诲瀷', minWidth: 120,
+        //         type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/vehicle_type',
+
+        //         search: true,
+        //       },
+        //       internalCode: {
+        //         label: '杞﹁締鍐呴儴缂栫爜', minWidth: 120,
+        //         search: true,
+        //       },
+        //       licensePlate: {
+        //         label: '杞︾墝鍙�', minWidth: 120,
+        //         search: true,
+        //       },
+        //       licenseHk: {
+        //         label: '棣欐腐鐗岀収', minWidth: 120,
+        //         search: true,
+        //       },
+        //       licenseMo: {
+        //         label: '婢抽棬鐗岀収', minWidth: 120,
+        //         search: true,
+        //       },
+        //     },
+
+        //   },
+        //   props: {
+        //     label: 'licensePlate',
+        //     value: 'id'
+        //   },
+        //   onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
+        //     if (value) {
+        //       let id = value;
+        //       if (Array.isArray(value)) {
+        //         id = value[0]
+        //       }
+        //       console.log(555, 'xq1');
+
+        //       getTmsVehicle(id).then(res => {
+        //         return callback(res.data || {})
+        //       })
+        //     } else {
+        //       console.log(444, 'xq1');
+
+        //       listTmsVehicle({
+        //         pageSize: page.pageSize,
+        //         pageNum: page.currentPage, ...data,
+        //         carrierType: form.value.operationMode, serviceProviderId: form.value.vehicleProviderId
+        //       }).then(res => {
+        //         return callback({
+        //           total: res.total,
+        //           data: res.rows || [],
+        //         })
+        //       })
+        //     }
+
+        //   }
+
+        // },
         actualVehicleType: {
           label: '娲惧嚭杞﹀瀷',
           display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
@@ -1734,21 +1964,25 @@
       label: '璋冨害鍗曞彿', minWidth: 180,
       display: false,
       search: true,
+      overHidden: true
     },
     licensePlate: {
       label: '杞︾墝鍙�', minWidth: 120,
       display: false,
       search: true,
+      overHidden: true
     },
     customerName: {
       label: '瀹㈡埛',
       display: false, minWidth: 250,
       search: true,
+      overHidden: true
     },
     mainDriverName: {
       label: '涓婚┚椹跺憳',
       display: false, minWidth: 120,
       search: true,
+      overHidden: true
     },
     requiredVehicleTypes: {
       label: '涓嬪崟杞﹀瀷', minWidth: 130,
@@ -1757,36 +1991,70 @@
       dataType: 'string',
 
     },
-    createTimeRange: {
-      label: '鍒涘缓鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
-      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
+    // createTimeRange: {
+    //   label: '鍒涘缓鏃堕棿', display: false, searchRange: true, type: 'date',
+    //   format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
+    //   valueFormat: 'YYYY-MM-DD',
+    //   overHidden: true
+    // },
+    createTimeRangeArray: {
+      label: '鍒涘缓鏃堕棿',
+      minWidth: 150,
+      search: true,
+      searchRange: true,
+      addDisplay: false,  // 鏂板鏃朵笉鏄剧ず
+      editDisplay: false, // 淇敼鏃朵笉鏄剧ず
+      viewDisplay: false,
+      type: 'daterange',
+      startPlaceholder: '寮�濮嬫棩鏈�',
+      endPlaceholder: '缁撴潫鏃ユ湡',
       valueFormat: 'YYYY-MM-DD',
+      hide: true
     },
     updateTimeRange: {
-      label: '鏇存柊鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
-      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
+      label: '鏇存柊鏃堕棿', display: false, searchRange: true, type: 'date',
+      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
       valueFormat: 'YYYY-MM-DD',
+      overHidden: true
+    },
+    updateTimeRangeArray: {
+      label: '鏇存柊鏃堕棿',
+      minWidth: 150,
+      search: true,
+      searchRange: true,
+      addDisplay: false,  // 鏂板鏃朵笉鏄剧ず
+      editDisplay: false, //
+      viewDisplay: false,
+      type: 'daterange',
+      startPlaceholder: '寮�濮嬫棩鏈�',
+      endPlaceholder: '缁撴潫鏃ユ湡',
+      valueFormat: 'YYYY-MM-DD',
+      hide: true
     },
     loadingServiceProviderName: {
       label: '瑁呰揣鏈嶅姟鍟嗗悕绉�', minWidth: 150,
       display: false,
       search: true,
+      overHidden: true
     },
     customsServiceProviderName: {
       label: '鎶ュ叧鏈嶅姟鍟嗗悕绉�', minWidth: 150,
       display: false,
       search: true,
+      overHidden: true
     },
     projectName: {
       label: '椤圭洰鍚嶇О',
       display: false, minWidth: 250,
       search: true,
+      overHidden: true
     },
 
     contractName: {
       label: '鍏宠仈鍚堝悓鍚嶇О', minWidth: 250,
       display: false,
       search: true,
+      overHidden: true
     },
     orderType: {
       label: '璁㈠崟绫诲瀷',
@@ -1814,6 +2082,7 @@
       label: '杞﹁締鏈嶅姟鍟嗗悕绉�', minWidth: 150,
       display: false,
       search: true,
+      overHidden: true
     },
 
 
@@ -1857,7 +2126,6 @@
       display: false,
       search: true,
       type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
-
     },
 
 
@@ -1866,11 +2134,13 @@
       label: '瑁呰揣鐐瑰悕绉�',
       display: false, minWidth: 200,
       search: true,
+      overHidden: true
     },
     receiverName: {
       label: '鍗歌揣鐐瑰悕绉�', minWidth: 200,
       display: false,
       search: true,
+      overHidden: true
     },
     // accountsReceivableStatus: {
     //   label: '搴旀敹璐圭敤鐢熸垚鐘舵��', minWidth: 160,
@@ -1910,18 +2180,8 @@
       search: true,
 
     },
-    confirmTime: {
-      label: '纭鏃堕棿', minWidth: 180,
-      display: false,
-      hide: false,
-      search: false,
-    },
-    orderTime: {
-      label: '涓嬪崟鏃堕棿', minWidth: 180,
-      display: false,
-      hide: false,
-      search: false,
-    },
+
+
     createBy: {
       label: '鍒涘缓浜�', minWidth: 150,
       addDisplay: false,
@@ -1934,9 +2194,11 @@
       label: '鍒涘缓鏃堕棿', minWidth: 180,
       addDisplay: false,
       editDisplay: false,
-      viewDisplay: false,
+      viewDisplay: true,
       hide: false,
       search: false,
+      overHidden: true,
+      searchSpan: 6,
     },
 
     updateBy: {
@@ -1951,25 +2213,109 @@
       label: '鏇存柊鏃堕棿', minWidth: 180,
       addDisplay: false,
       editDisplay: false,
-      viewDisplay: false,
+      viewDisplay: true,
       hide: false,
       search: false,
-    },
+      overHidden: true,
+      searchSpan: 6,
 
+    },
+    confirmTime: {
+      label: '纭鏃堕棿', minWidth: 180,
+      addDisplay: false,
+      editDisplay: false,
+      viewDisplay: true,
+      hide: true,
+      search: false,
+      overHidden: true,
+      searchSpan: 6,
+    },
     confirmTimeRange: {
-      label: '纭鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
-      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
+      label: '纭鏃堕棿', display: false, searchRange: true, type: 'date',
+      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,
+    confirmTimeRangeArray: {
+      label: '纭鏃堕棿',
+      minWidth: 150,
+      search: true,
+      searchRange: true,
+      addDisplay: false,  // 鏂板鏃朵笉鏄剧ず
+      editDisplay: false, // 淇敼鏃朵笉鏄剧ず
+      viewDisplay: false,
+      type: 'daterange',
+      startPlaceholder: '寮�濮嬫棩鏈�',
+      endPlaceholder: '缁撴潫鏃ユ湡',
       valueFormat: 'YYYY-MM-DD',
+      hide: true
     },
-    orderTimeRange: {
-      label: '涓嬪崟鏃堕棿', display: false, search: true, searchRange: true, type: 'date',
-      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
+    okTime: {
+      label: '瀹屾垚鏃堕棿', minWidth: 180,
+      addDisplay: false,
+      editDisplay: false,
+      viewDisplay: true,
+      hide: true,
+      search: false,
+      searchSpan: 6,
+    },
+    // okTimeRange: {
+    //   label: '瀹屾垚鏃堕棿2', display: false, searchRange: true, type: 'date',
+    //   viewDisplay: true,
+    //   format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
+    //   valueFormat: 'YYYY-MM-DD',
+    // },
+
+    okTimeRangeArray: {
+      label: '瀹屾垚鏃堕棿',
+      minWidth: 150,
+      search: true,
+      searchRange: true,
+      addDisplay: false,  // 鏂板鏃朵笉鏄剧ず
+      editDisplay: false, // 淇敼鏃朵笉鏄剧ず
+      viewDisplay: false,
+      type: 'daterange',
+      startPlaceholder: '寮�濮嬫棩鏈�',
+      endPlaceholder: '缁撴潫鏃ユ湡',
       valueFormat: 'YYYY-MM-DD',
+      hide: true
+    },
+    orderTime: {
+      label: '涓嬪崟鏃堕棿', minWidth: 180,
+      addDisplay: false,
+      editDisplay: false,
+      viewDisplay: true,
+      hide: true,
+      search: false,
+      searchSpan: 6,
+    },
+    loadingDate: {
+      bind: 'orderTime',
+      label: '瑁呰揣鏃ユ湡', minWidth: 180,
+      addDisplay: false,
+      editDisplay: false,
+      viewDisplay: true,
+      hide: true,
+      search: false,
+      searchSpan: 6,
+    },
+    // orderTimeRange: {
+    //   label: '涓嬪崟鏃堕棿', display: false, searchRange: true, type: 'date',
+    //   format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
+    //   valueFormat: 'YYYY-MM-DD',
+    // },
+    orderTimeRangeArray: {
+      label: '涓嬪崟鏃堕棿',
+      minWidth: 150,
+      search: true,
+      searchRange: true,
+      addDisplay: false,  // 鏂板鏃朵笉鏄剧ず
+      editDisplay: false, // 淇敼鏃朵笉鏄剧ず
+      viewDisplay: false,
+      type: 'daterange',
+      startPlaceholder: '寮�濮嬫棩鏈�',
+      endPlaceholder: '缁撴潫鏃ユ湡',
+      valueFormat: 'YYYY-MM-DD',
+      hide: true
     },
 
   }
@@ -2062,7 +2408,7 @@
     },
   }
 })
-
+const urlApi = ref(import.meta.env.VITE_APP_BASE_API)
 const itineraryTableOption = ref({
   menu: false,
   addBtn: false,
@@ -2141,19 +2487,19 @@
       ],
     },
     currency: {
-      label: '甯佺',
+      label: '甯佸埗',
       display: true,
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
       rules: [
         {
           required: true,
-          message: "甯佺涓嶈兘涓虹┖", trigger: "change"
+          message: "甯佸埗涓嶈兘涓虹┖", trigger: "change"
         }
       ],
 
     },
     voucherUrl: {
-      label: '璐圭敤鍑瘉',
+      label: '璐圭敤鍑瘉1',
       display: true,
       accept: 'string', dataType: 'string',
       type: 'upload',
@@ -2175,7 +2521,8 @@
 const financeTableOption = ref({
   menu: false,
   addBtn: false,
-  header: false, selection: false,
+  selection: true,
+  header: true,
   title: '鍘嗗彶鍨粯璐圭敤',
   column: {
     dataSource: {
@@ -2204,7 +2551,7 @@
       display: true,
     },
     currency: {
-      label: '甯佺',
+      label: '甯佸埗',
       display: true,
       type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
     },
@@ -2219,7 +2566,11 @@
     remark: {
       label: '澶囨敞',
     },
-
+    status: {
+      label: '鐘舵��',
+      display: true,
+      type: 'select', dicUrl: '/system/dict/data/type/sys_cancel_word', dataType: 'string',
+    },
   }
 })
 
@@ -2336,10 +2687,14 @@
           if (Array.isArray(value)) {
             id = value[0]
           }
+          console.log(998, 'xq1');
+
           getTmsVehicle(id).then(res => {
             return callback(res.data || {})
           })
         } else {
+          console.log(669, 'xq2');
+
           listTmsVehicle({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
             return callback({
               total: res.total,
@@ -2935,9 +3290,9 @@
   }
 });
 const zzItemsTableData = ref();
-
-
-
+/* 鎶ュ叧鍒楄〃 */
+const clearanceList = ref([]);
+const optionNum = ref(''); // 鐢ㄤ簬鍖哄垎鏄姤鍏宠繕鏄鍗�
 
 const {
   tableData,
@@ -2973,6 +3328,7 @@
   },
   handleSelectionChangeFunc: (selection: any) => {
     selectionList.value = selection;
+    clearanceList.value = selection;
     if (selection.length > 0) {
       isCustoms.value = selection[0].isCustoms;
       isLoad.value = selection[0].isLoad;
@@ -2990,17 +3346,56 @@
       zxhdjSingle.value = false;
     }
   },
+
   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') || {};
-    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.orderTimeRange, 'orderTime') || {};
-    return params;
+    // 1. 浣跨敤娴呮嫹璐濓紝涓嶅奖鍝嶅師濮嬫煡璇㈠璞�
+    // 鍏抽敭鐐癸細浠庡師濮� queryParams.value 鍙栧�硷紝纭繚鍒嗛〉鏃朵緷鐒惰兘鎷垮埌鏁扮粍
+    let newParams = { ...queryParams.value, ...params };
+
+    // 2. 瀹氫箟鏃ユ湡瀛楁鏄犲皠 (鏁扮粍鍚� : 鎺ュ彛闇�瑕佺殑鍓嶇紑)
+    const dateMap = {
+      confirmTimeRangeArray: 'confirmTimeRange',
+      createTimeRangeArray: 'createTime',
+      updateTimeRangeArray: 'updateTimeRange',
+      okTimeRangeArray: 'okTime',
+      orderTimeRangeArray: 'orderTime'
+    };
+
+    // 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;
+      }
+    });
+
+
+    // 銆愭牳蹇冧慨鏀广�戯細鐩存帴杩斿洖锛屼笉瑕佽祴鍊肩粰 queryParams.value
+    return finalParams;
   },
   handleBeforeOpenFunc: (type: string) => {
+
     if (type == 'add') {
       form.value = {};
+    } else if (type == 'edit') {
+      // form.value = row;
+
     }
   }
 
@@ -3060,7 +3455,6 @@
 const handleUploadItinerary = (row: any) => {
   optionType.value = 'addItinerary';
   boxFormOption.value = itineraryOption.value;
-  console.log(itineraryOption.value);
 
   boxTableOption.value = itineraryTableOption.value;
   listTmsTrip({ dispatchOrderId: row.id, pageNum: 1, pageSize: 999 }).then(res => {
@@ -3076,7 +3470,6 @@
       vehicleNumber: row.licensePlate,
       vehicleId: row.vehicleId,
     }
-    console.log(boxForm.value);
 
   })
 }
@@ -3237,11 +3630,24 @@
       pageF.isUploading = false;
     })
   } else if (optionType.value === 'customs') {
-    customsOrder({
-      id: form.value.id,
-      customsServiceProviderId: form.value.customsServiceProviderId,
-      customsServiceProviderName: form.value.customsServiceProviderName,
-    }).then(res => {
+    let result = <any>[];
+    if (optionNum.value == 'checkbox') {
+      result = clearanceList.value.map(item => {
+        return {
+          id: item.id,
+          customsServiceProviderId: form.value.customsServiceProviderId,
+          customsServiceProviderName: form.value.customsServiceProviderName
+        };
+      });
+    } else if (optionNum.value == 'radio') {
+      result = [{
+        id: form.value.id,
+        customsServiceProviderId: form.value.customsServiceProviderId,
+        customsServiceProviderName: form.value.customsServiceProviderName
+      }]
+    }
+
+    customsOrder(result).then(res => {
       ElMessage({
         message: "鎻愪氦鎴愬姛锛�",
         type: 'success'
@@ -3252,11 +3658,25 @@
       pageF.isUploading = false;
     })
   } else if (optionType.value === 'loading') {
-    loadingOrder({
-      id: form.value.id,
-      loadingServiceProviderId: form.value.loadingServiceProviderId,
-      loadingServiceProviderName: form.value.loadingServiceProviderName,
-    }).then(res => {
+
+    let result = <any>[];
+    if (optionNum.value == 'checkbox') {
+      result = clearanceList.value.map(item => {
+        return {
+          id: item.id,
+          loadingServiceProviderId: form.value.loadingServiceProviderId,
+          loadingServiceProviderName: form.value.loadingServiceProviderName
+        };
+      });
+    } else if (optionNum.value == 'radio') {
+      result = [{
+        id: form.value.id,
+        loadingServiceProviderId: form.value.loadingServiceProviderId,
+        loadingServiceProviderName: form.value.loadingServiceProviderName
+      }]
+    }
+
+    loadingOrder(result).then(res => {
       ElMessage({
         message: "鎻愪氦鎴愬姛锛�",
         type: 'success'
@@ -3720,7 +4140,6 @@
                   form2.value.districtId = districtCode;
                   form2.value.streetId = townshipCode;
                   form2.value.dispatchTransportArea = params.regeocode.formatted_address || params.regeocode.formattedAddress;
-                  console.log(form2.value, "form2")
                 }
               });
             }
@@ -3894,17 +4313,32 @@
 const handleCustoms = () => {
   title.value = '琛ュ厖濮旀墭鎶ュ叧淇℃伅';
   open.value = true;
-  form.value = selectionList.value[0];
+  form.value = clearanceList.value[0];
   optionType.value = 'customs';
+  optionNum.value = 'checkbox'
   boxFormOption.value = customsOption.value;
 
 }
 
-const handleCustomsAdd = (selectionList) => {
+const handleCustomsAdd = (row) => {
   title.value = '琛ュ厖濮旀墭瑁呭嵏淇℃伅';
+
+  clearanceList.value = [];
+  // 2. 娓呴櫎琛ㄦ牸瑙嗚涓婄殑閫変腑鐘舵��
+  if (crudRef.value) {
+    crudRef.value.clearSelection();
+  }
+
+  // 3. 閲嶇疆琛ㄥ崟
+  form.value = {};
+
+  // 4. 灏嗗綋鍓嶇偣鍑荤殑琛屾暟鎹祴鍊肩粰 form锛岀敤浜庡脊绐楃紪杈�
+  Object.assign(form.value, row);
+
   open.value = true;
-  form.value = selectionList;
   optionType.value = 'loading';
+  optionNum.value = 'radio';
+
   boxFormOption.value = loadingOption.value;
 }
 const handleLoading = () => {
@@ -3912,14 +4346,33 @@
   open.value = true;
   form.value = selectionList.value[0];
   optionType.value = 'loading';
+  optionNum.value = 'checkbox'
   boxFormOption.value = loadingOption.value;
 }
-const handleLoadingAdd = (selectionList) => {
-  title.value = '琛ュ厖濮旀墭瑁呭嵏淇℃伅';
+const handleLoadingAdd = (row: any) => {
+  // 1. 娓呯┖鎵归噺閫変腑鐨勬暟鎹垪琛紝瀵艰嚧椤堕儴鎸夐挳 disabled (length === 0)
+  clearanceList.value = [];
+  // 2. 娓呴櫎琛ㄦ牸瑙嗚涓婄殑閫変腑鐘舵��
+  if (crudRef.value) {
+    crudRef.value.clearSelection();
+  }
+
+  // 3. 閲嶇疆琛ㄥ崟
+  form.value = {};
+
+  // 4. 灏嗗綋鍓嶇偣鍑荤殑琛屾暟鎹祴鍊肩粰 form锛岀敤浜庡脊绐楃紪杈�
+  Object.assign(form.value, row);
+
+  // 5. 璁剧疆寮圭獥閰嶇疆
+  title.value = '琛ュ厖濮旀墭鎶ュ叧淇℃伅';
+  optionType.value = 'customs';
+  optionNum.value = 'radio';
+  boxFormOption.value = customsOption.value;
+
+  // 6. 鎵撳紑寮圭獥
   open.value = true;
-  form.value = selectionList;
-  optionType.value = 'loading';
-  boxFormOption.value = loadingOption.value;
+
+  // 銆愯皟璇曘�戞鏃舵墦鍗帮紝闀垮害搴斾负 0
 }
 const quotationItems = ref();
 const getQuotationItems = async () => {
@@ -3929,7 +4382,6 @@
 getQuotationItems();
 
 const getTabData = (val: string) => {
-  console.log(val)
   let filter = quotationItems.value.filter((item: any) => {
     return item.remark == val;
   });
@@ -3947,9 +4399,7 @@
     dispatchOrderId: form.value.id, financeType: 2,
     pageNum: 1, pageSize: 999
   }).then(async res => {
-
     boxTableData.value = res.rows || [];
-
     boxForm.value = {
       dispatchOrderId: form.value.id,
       dataSource: 0,
@@ -3993,8 +4443,12 @@
 
     // 3. 澶勭悊鍑瘉 URL (濡傛灉鏈夊崟寮犳垨澶氬紶涓婁紶鐨勯�昏緫)
     // 鍋囪鍚庣闇�瑕佺殑鏄�楀彿鍒嗛殧鐨勫瓧绗︿覆
-    const submitData = validDetails.map(item => {
+    const submitData = validDetails.map((item: any) => {
       let url = item.voucherUrl;
+      item.dispatchOrderId = form.value.id;
+      item.financeType = 2;
+      item.status = 0;
+      item.dataSource = 1;
       if (Array.isArray(url)) {
         url = url.join(',');
       }
@@ -4007,8 +4461,9 @@
         message: "鎿嶄綔鎴愬姛锛�",
         type: 'success'
       })
-      open4.value = false;
+      // open4.value = false;
       onLoad(page.value)
+      initExpenditureData();
       boxFormRef.value?.resetFields();
       getTab4Data();
     })
@@ -4064,7 +4519,6 @@
 }
 const submitForm5 = () => {
   boxFormRef.value.validate((valid: boolean, done: any) => {
-    console.log(valid)
     if (valid) {
       boxForm.value.id = form.value.id;
       closeOrder(boxForm.value).then(res => {
@@ -4561,7 +5015,6 @@
       accept: 'string', dataType: 'object',
       type: 'upload',
       // action: '/common/upload2',
-
       prop: 'voucherUrl', // 杩欓噷鏀规垚 prop 灞炴��
       slot: true,        // 寮�鍚彃妲�
       width: 200
@@ -4575,6 +5028,7 @@
 });
 // 3. 鍥炴樉鍒濆鍖�
 const initExpenditureData = () => {
+  tmsFinanceDetails.value = []
   if (fee_type.value && fee_type.value.length > 0 && tmsFinanceDetails.value.length === 0) {
     tmsFinanceDetails.value = fee_type.value.map(item => ({
       feeType: item.value,
@@ -4592,19 +5046,25 @@
     initExpenditureData();
   }
 });
-const handleUploadAfter = (res, done, loading, column, row) => {
+const handleUploadAfter = (res: any, row: any) => {
   // res 鏄帴鍙h繑鍥炵殑瀹屾暣鏁版嵁
-  if (res && res.url) {
+  if (res.code === 200) {
     // 鎵嬪姩缁欒繖涓�琛岀殑鏁版嵁璧嬪��
-    row.voucherUrl = res.url;
-    console.log('涓婁紶鎴愬姛锛屽綋鍓嶈鏁版嵁锛�', row);
+    row.voucherUrl = res.data.url;
   } else if (res.data && res.data.url) {
     // 濡傛灉杩斿洖鐨勬暟鎹寘瑁瑰湪 data 閲�
     row.voucherUrl = res.data.url;
   }
-  done(); // 蹇呴』璋冪敤 done 缁撴潫涓婁紶鐘舵��
 };
-
+/** 褰撴枃浠惰秴鍑洪檺鍒舵椂锛堝疄鐜拌嚜鍔ㄦ浛鎹㈤�昏緫锛� */
+const handleExceed = (files: any, row: any) => {
+  // 1. 娓呴櫎褰撳墠鏄剧ず鐨勬枃浠跺垪琛�
+  uploadRef.value.clearFiles();
+  // 2. 鎵嬪姩鎶婃柊閫夋嫨鐨勬枃浠舵坊鍔犺繘鍘婚噸鏂颁笂浼�
+  const file = files[0];
+  uploadRef.value.handleStart(file);
+  uploadRef.value.submit();
+};
 
 const flowLogIshow = ref()
 const flowParams = ref([])
@@ -4619,6 +5079,203 @@
 
   })
 }
+
+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(() => {
+    let data = {
+      id: boxSelectionList.value[0].id,
+      status: 1
+    }
+    tmsFinanceDetail(data).then(res => {
+      ElMessage.success('浣滃簾鎴愬姛');
+      getTab4Data(); // 鍒锋柊鏁版嵁
+    }).catch(err => {
+      ElMessage.error('浣滃簾澶辫触');
+    });
+  }).catch(() => {
+    // 鍙栨秷鎿嶄綔
+  });
+}
+
+const handleOrderTypeChange = (value: any) => {
+  // 闃叉 value 涓� null 鎴� undefined 鏃跺嚭閿� (褰撴竻绌洪�夋嫨鏃�)
+  if (value === null || value === undefined) {
+    return;
+  }
+
+  option.value.group.forEach((item: any) => {
+    if (item.prop == 'pcxx') {
+      // 澶勭悊瑁呰揣鐐瑰繀濉鍒�
+      if (item.column.shipperId && item.column.shipperId.rules) {
+        item.column.shipperId.rules.forEach((cItem: any) => {
+          cItem.required = !(value == 1);
+        });
+      }
+
+      // 澶勭悊鍗歌揣鐐瑰繀濉鍒�
+      if (item.column.receiverId && item.column.receiverId.rules) {
+        item.column.receiverId.rules.forEach((cItem: any) => {
+          cItem.required = !(value == 1);
+        });
+      }
+    }
+  });
+
+  // 銆愭柊澧為�昏緫銆戝鏋滃垏鎹㈠埌浜嗛潪蹇呭~鐘舵�� (value == 1)锛屽垯娓呴櫎杩欎袱涓瓧娈电殑鏍¢獙鎻愮ず
+  if (value == 1) {
+    // 纭繚 crudRef 瀛樺湪涓旀毚闇蹭簡 clearValidate 鏂规硶
+    if (crudRef.value && typeof crudRef.value.clearValidate === 'function') {
+      // 娓呴櫎鎸囧畾瀛楁鐨勬牎楠岀姸鎬�
+      crudRef.value.clearValidate(['shipperId', 'receiverId']);
+    }
+  }
+};
+/* 杞︾墝鍙� */
+// --- 鐘舵�佺鐞� ---
+const vehicleDialogVisible = ref(false);
+const vehicleData = ref<VehicleRow[]>([]);
+const vehicleQuery = ref<any>({});
+const selectedVehicleRow = ref<VehicleRow>({});
+
+const vehiclePage = ref({
+  currentPage: 1,
+  pageSize: 10,
+  total: 0
+});
+
+// --- 寮圭獥閰嶇疆 ---
+const vehicleOption = ref({
+  header: true,
+  menu: false,
+  addBtn: false,
+  refreshBtn: true,
+  columnBtn: false,
+  index: false,
+  selection: false,
+  searchShow: true,
+  searchMenuSpan: 6,
+  searchLabelWidth: 100,
+  highlightCurrentRow: true, 
+  column: [
+    { label: '杞﹁締鏈嶅姟鍟�', prop: 'serviceProviderName', search: true },
+    { 
+      label: '杞﹁締绫诲瀷', 
+      prop: 'vehicleType', 
+      type: 'select', 
+      dataType: 'string', 
+      dicUrl: '/system/dict/data/type/vehicle_type', 
+      search: true 
+    },
+    { label: '杞﹁締鍐呴儴缂栫爜', prop: 'internalCode', search: true },
+    { label: '杞︾墝鍙�', prop: 'licensePlate', search: true },
+    { label: '棣欐腐鐗岀収', prop: 'licenseHk' },
+    { label: '婢抽棬鐗岀収', prop: 'licenseMo' }
+  ]
+});
+
+// --- 鏂规硶 ---
+
+/**
+ * 鍔犺浇鏁版嵁锛氶粯璁ゅ己鍒朵紶 carrierType: '0'
+ */
+const loadVehicleList = async (page?: any, params?: any) => {
+  const query = {
+    pageNum: vehiclePage.value.currentPage,
+    pageSize: vehiclePage.value.pageSize,
+    carrierType: '0', // 榛樿寮哄埗浼�0
+    ...vehicleQuery.value,
+    ...params
+  };
+  
+  try {
+    const res = await listTmsVehicle(query);
+    if (res.code === 200) {
+      // const { records, total } = res.rows;
+      vehicleData.value = res.rows;
+      vehiclePage.value.total = res.total;
+    }
+  } catch (error) {
+    console.error("鍔犺浇杞﹁締鍒楄〃澶辫触", error);
+  }
+};
+
+/**
+ * 鎼滅储锛氬甫鍏ユ悳绱㈠弬鏁板苟寮哄埗 carrierType 涓� 0
+ */
+const vehicleSearchChange = (params: any, done: Function) => {
+  vehicleQuery.value = params;
+  vehiclePage.value.currentPage = 1;
+  loadVehicleList();
+  done();
+};
+
+/**
+ * 閲嶇疆锛氭竻绌烘悳绱㈡潯浠讹紝浣嗕緷鐒朵繚鐣� carrierType 涓� 0
+ */
+const vehicleSearchReset = () => {
+  vehicleQuery.value = {}; // 娓呯┖鎼滅储
+  vehiclePage.value.currentPage = 1;
+  loadVehicleList(); // loadVehicleList 鍐呴儴宸茬粡鍐欐 carrierType: '0'
+};
+
+const vehicleCurrentChange = (val: number) => {
+  vehiclePage.value.currentPage = val;
+  loadVehicleList();
+};
+
+const vehicleSizeChange = (val: number) => {
+  vehiclePage.value.pageSize = val;
+  loadVehicleList();
+};
+
+const handleVehicleRowClick = (row: VehicleRow) => {
+  selectedVehicleRow.value = row;
+};
+
+// 鎵撳紑寮圭獥鏂规硶
+const handleVehicleSelect = () => {
+  selectedVehicleRow.value = {}; 
+  vehicleDialogVisible.value = true;
+};
+
+/**
+ * 纭閫夋嫨锛氬洖鏄惧埌涓昏〃鍗�
+ */
+const confirmVehicleSelection = () => {
+  if (!selectedVehicleRow.value.licensePlate) {
+    appContext.$message.warning("璇风偣鍑婚�夋嫨涓�琛岃褰�");
+    return;
+  }
+  // 1. 璧嬪�� (纭繚涓昏〃鍗� data.form 瀛樺湪)
+  
+
+  data.form.vehicleId = selectedVehicleRow.value.id;
+  data.form.licensePlate = selectedVehicleRow.value.licensePlate;
+  data.form.actualVehicleType= selectedVehicleRow.value.vehicleType;
+
+  // 濡傛灉闇�瑕佸叾浠栧瓧娈典篃鍙互涓�骞跺甫鍥烇紝姣斿鏈嶅姟鍟嗙瓑
+  // data.form.serviceProviderName = selectedVehicleRow.value.serviceProviderName;
+
+  vehicleDialogVisible.value = false;
+
+  // 2. 寮哄埗瑙嗗浘鏇存柊
+  nextTick(() => {
+    appContext.$forceUpdate();
+  });
+};
+
 </script>
 <style lang="scss" scoped>
 ::v-deep .cydprint .el-dialog__body {
@@ -4694,4 +5351,74 @@
 .link-btn {
   font-size: 18px;
 }
+
+/*  */
+/* 鐜版湁鐨勬牱寮忎繚鎸佷笉鍙�... */
+.specific-drag-area {
+  width: 100%;
+
+  :deep(.full-width-drag) {
+
+    // 1. 鏍稿績锛氶殣钘� Avue 榛樿鍦� dragger 涓嬫柟鐢熸垚鐨勯偅涓�滅偣鍑讳笂浼犫�濇寜閽�
+    // 鍦� 3.x 鐗堟湰涓紝瀹冩槸 el-upload 鍚庣殑涓�涓厔寮熻妭鐐规垨鑰呮槸鍐呴儴鑺傜偣
+    .el-button--primary {
+      display: none !important;
+    }
+
+    .el-upload {
+      width: 100%;
+      display: block; // 纭繚鍧楃骇鏄剧ず
+
+      .el-upload-dragger {
+        width: 100%;
+        height: 120px;
+        background-color: #fcfdfe;
+        border: 2px dashed #dcdfe6;
+        border-radius: 8px;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        padding: 0 !important;
+
+        // 瑕嗙洊 Element Plus 榛樿鐨勫唴閮ㄦ枃瀛楁帓鐗堬紝闃叉鍐茬獊
+        .el-upload__text {
+          display: none !important;
+        }
+
+        &:hover {
+          border-color: #409eff;
+          background-color: #f5f7fa;
+        }
+      }
+    }
+  }
+
+  // 3. 鑷畾涔夊唴瀹圭殑鏍峰紡锛堢‘淇濆畠涓嶈 display:none 褰卞搷锛�
+  .drag-zone-inner {
+    pointer-events: none;
+    text-align: center;
+
+    .upload-icon {
+      font-size: 32px !important;
+      color: #909399;
+      margin-bottom: 8px;
+    }
+
+    .drag-text {
+      .main-title {
+        font-size: 14px;
+        color: #606266;
+        font-weight: bold;
+        line-height: 1.5;
+      }
+
+      .sub-title {
+        font-size: 12px;
+        color: #a8abb2;
+        margin-top: 4px;
+      }
+    }
+  }
+}
 </style>

--
Gitblit v1.8.0