From f7490c5b05906399fe754fecdb1f32172a01170d Mon Sep 17 00:00:00 2001
From: zhangback <zhangback@163.com>
Date: 星期二, 18 十一月 2025 22:27:29 +0800
Subject: [PATCH] 提交

---
 ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue | 3007 +++++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 2,416 insertions(+), 591 deletions(-)

diff --git a/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue b/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
index 4a10511..3f37261 100644
--- a/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
+++ b/ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -1,5 +1,5 @@
 <template>
-  <basicContainer >
+  <basicContainer>
     <avue-crud
         :option="option"
         :table-loading="pageF.loading"
@@ -21,21 +21,21 @@
         @on-load="onLoad"
     >
       <template #menu-left>
-        <el-button
-            type="success"
-            icon="Edit"
-            :disabled="pageF.single"
-            v-hasPermi="['tms:tmsDispatchOrder:edit']"
-            @click="handleUpdate">淇敼
-        </el-button>
-        <el-button
-            type="danger"
-            icon="Delete"
-            :disabled="pageF.multiple"
-            @click="handleDelete"
-            v-hasPermi="['tms:tmsDispatchOrder:remove']"
-        >鍒犻櫎
-        </el-button>
+<!--        <el-button-->
+<!--            type="success"-->
+<!--            icon="Edit"-->
+<!--            :disabled="pageF.single"-->
+<!--            v-hasPermi="['tms:tmsDispatchOrder:edit']"-->
+<!--            @click="handleUpdate">淇敼-->
+<!--        </el-button>-->
+<!--        <el-button-->
+<!--            type="danger"-->
+<!--            icon="Delete"-->
+<!--            :disabled="pageF.multiple"-->
+<!--            @click="handleDelete"-->
+<!--            v-hasPermi="['tms:tmsDispatchOrder:remove']"-->
+<!--        >鍒犻櫎-->
+<!--        </el-button>-->
         <el-button
             type="warning"
             plain
@@ -44,594 +44,2419 @@
             v-hasPermi="['tms:tmsDispatchOrder:export']"
         >瀵煎嚭
         </el-button>
+        <el-button
+            type="success"
+            icon="Promotion"
+            :disabled="pageF.multiple"
+            @click="handleGenerate"
+            v-hasPermi="['tms:tmsDispatchOrder:generate']"
+        >鐢熸垚搴旀敹搴斾粯璐圭敤
+        </el-button>
+        <el-button
+            type="warning"
+            icon="Female"
+            :disabled="pageF.single"
+            @click="handleDropHook"
+            v-hasPermi="['tms:tmsDispatchOrder:dropHook']"
+        >鐢╂寕
+        </el-button>
+        <el-button
+            type="primary"
+            icon="Male"
+            :disabled="pageF.single"
+            @click="handleConnectHang"
+            v-hasPermi="['tms:tmsDispatchOrder:connectHang']"
+        >鎺ユ寕
+        </el-button>
+
+      </template>
+      <template #menu-before="{row}">
+        <el-link size="small" type="primary"  @click="handleAddGoods(row)" class="link-btn"
+                 :underline="false" icon="el-icon-document-add">杩愯緭璐у搧鐧昏
+        </el-link>
+        <el-link size="small" type="primary"  @click="handleActual(row)" class="link-btn"
+                 :underline="false" icon="el-icon-set-up">瀹為檯杩愯緭璁板綍
+        </el-link>
+        <el-link size="small" type="primary" v-if="row.status == 0" @click="handleConfirm(row)" class="link-btn"
+                 :underline="false" icon="el-icon-pointer">纭畾
+        </el-link>
+        <el-link size="small" type="primary" @click="handleCopy(row)" class="link-btn" :underline="false"
+                 icon="el-icon-connection">澶嶅埗
+        </el-link>
+        <el-link size="small" type="primary" v-if="[1,2].includes(row.status)" @click="handleUploadItinerary(row)"
+                 class="link-btn" :underline="false" icon="el-icon-upload">涓婁紶琛岀▼
+        </el-link>
+        <el-link size="small" type="primary" v-if="![0,1].includes(row.status)" @click="handleLogItinerary(row)"
+                 class="link-btn" :underline="false" icon="el-icon-view">鏌ョ湅琛岀▼
+        </el-link>
+        <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn"
+                 :underline="false" icon="el-icon-circle-check">瀹屾垚琛岀▼
+        </el-link>
+        <el-link size="small" type="primary" v-if="[2,3].includes(row.status)" @click="handleAddFinance(row)" class="link-btn"
+                 :underline="false" icon="el-icon-edit-pen">璐圭敤鐧昏
+        </el-link>
+      </template>
+      <template #menu="{row}">
+        <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" :underline="false"
+                 icon="el-icon-tickets">鏃ュ織
+        </el-link>
       </template>
     </avue-crud>
+    <el-dialog :title="pageF.title" v-model="pageF.open" class="avue-dialog avue-dialog--top" width="80%">
+      <avue-form v-if="optionType == 'addItinerary' || optionType == 'addFinance'" v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
+
+      </avue-form>
+      <avue-crud
+          :option="boxTableOption"
+          :data="boxTableData"
+      >
+      </avue-crud>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" v-if="optionType == 'addItinerary' || optionType == 'addFinance'" :loading="pageF.isUploading" @click="submitForm">
+            {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
+          </el-button>
+
+          <el-button type="primary" v-if="optionType == 'generate' " :loading="pageF.isUploading" @click="submitGenerate">
+            {{ pageF.isUploading ? '鐢熸垚涓�' : '鐢熸垚璐圭敤' }}
+          </el-button>
+          <el-button @click="cancelBox">鍙� 娑�</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <el-dialog :title="title" v-model="open" class="avue-dialog avue-dialog--top" width="40%">
+      <div v-if="optionType === 'dropHook'">
+        <el-descriptions
+            :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.$actualVehicleType}}</el-descriptions-item>
+          <el-descriptions-item label="杩愯緭宸ュ叿鍙风爜" >{{ form.licensePlate }}</el-descriptions-item>
+          <el-descriptions-item label="鎵樻灦鍙�" >{{ form.shelfCode }}</el-descriptions-item>
+          <el-descriptions-item label="涓婚┚椹跺憳" >{{ form.mainDriverName }}</el-descriptions-item>
+          <el-descriptions-item label="鍓┚椹跺憳" >{{ form.assistantDriverName }}</el-descriptions-item>
+        </el-descriptions>
+      </div>
+      <div  v-if="optionType == 'connectHang'">
+        <el-descriptions 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.$actualVehicleType}}</el-descriptions-item>
+          <el-descriptions-item label="鎵樻灦鍙�" >{{ form.shelfCode }}</el-descriptions-item>
+        </el-descriptions>
+        <avue-form v-model="form" ref="boxFormRef" :option="boxFormOption">
+
+        </avue-form>
+      </div>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary"  :loading="pageF.isUploading" @click="submitForm2">
+            {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
+          </el-button>
+          <el-button @click="cancelBox2">鍙� 娑�</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+
+    <el-dialog title="璐у搧淇℃伅鐧昏" v-model="open2" class="avue-dialog avue-dialog--top" width="80%">
+      <avue-crud
+          :option="goodsTableOption"
+          v-model="goodsForm"
+          @row-update="rowGoodsUpdate"
+          @row-save="rowGoodsSave"
+          @row-del="rowGoodsDel"
+          :data="goodsTableData" ref="goodsCrudRef"
+      >
+      </avue-crud>
+<!--      <template #footer>-->
+<!--        <div class="dialog-footer">-->
+<!--          <el-button type="primary"  :loading="pageF.isUploading" @click="submitForm2">-->
+<!--            {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}-->
+<!--          </el-button>-->
+<!--          <el-button @click="open2 = false">鍙� 娑�</el-button>-->
+<!--        </div>-->
+<!--      </template>-->
+    </el-dialog>
+
+    <el-dialog title="瀹為檯杩愯緭淇℃伅" v-model="open3" class="avue-dialog avue-dialog--top" width="80%">
+      <avue-form  v-model="actualForm" 
+                  ref="actualFormRef"
+                  :option="actualFormOption">
+
+      </avue-form>
+            <template #footer>
+              <div class="dialog-footer">
+                <el-button type="primary"  :loading="pageF.isUploading" @click="submitForm3">
+                  {{ pageF.isUploading ? '鎻愪氦涓�' : '纭� 瀹�' }}
+                </el-button>
+                <el-button @click="open3 = false">鍙� 娑�</el-button>
+              </div>
+            </template>
+    </el-dialog>
+
+
+
   </basicContainer>
 </template>
 
 <script setup name="tmsDispatchOrder" lang="ts">
-  import {TmsDispatchOrderI,addTmsDispatchOrder, delTmsDispatchOrder, exportTmsDispatchOrder, getTmsDispatchOrder, listTmsDispatchOrder, updateTmsDispatchOrder} from "@/api/tms/tmsDispatchOrder";
-  import useCurrentInstance from "@/utils/useCurrentInstance";
-  import {computed,reactive, ref, toRefs} from "vue";
-  import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
-  import {usePagePlus} from "@/hooks/usePagePlus";
-  import {hasPermission} from "@/utils/permissionUtils";
+import {
+  TmsDispatchOrderI,
+  addTmsDispatchOrder,
+  delTmsDispatchOrder,
+  exportTmsDispatchOrder,
+  getTmsDispatchOrder,
+  listTmsDispatchOrder,
+  updateTmsDispatchOrder,
+  confirmOrder, copyOrder, okOrder, initGenerate, generateTmsDispatchOrder, dropHook, connectHang
+} from "@/api/tms/tmsDispatchOrder";
+import useCurrentInstance from "@/utils/useCurrentInstance";
+import {computed, onMounted, reactive, ref, toRefs, watch} from "vue";
+import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
+import {usePagePlus} from "@/hooks/usePagePlus";
+import {hasPermission} from "@/utils/permissionUtils";
+import {getTmsProject, listTmsProject} from "@/api/tms/tmsProject";
+import {getTmsServiceProvider, listTmsServiceProvider} from "@/api/tms/tmsServiceProvider";
+import {getTmsLoadingServiceProvider, listTmsLoadingServiceProvider} from "@/api/tms/tmsLoadingServiceProvider";
+import {getTmsCustomsServiceProvider, listTmsCustomsServiceProvider} from "@/api/tms/tmsCustomsServiceProvider";
+import {getTmsDriver, listTmsDriver} from "@/api/tms/tmsDriver";
+import {getTmsVehicle, listTmsVehicle} from "@/api/tms/tmsVehicle";
+import {getTmsContainer, listTmsContainer} from "@/api/tms/tmsContainer";
+import {getTmsShelf, listTmsShelf} from "@/api/tms/tmsShelf";
+import {getTmsConsignor, listTmsConsignor} from "@/api/tms/tmsConsignor";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {addTmsTrip, listTmsTrip} from "@/api/tms/tmsTrip";
+import {addTmsFinanceDetail, listTmsFinanceDetail, updateTmsFinanceDetail} from "@/api/tms/tmsFinanceDetail";
+import {getTmsProductInfo, listTmsProductInfo} from "@/api/tms/tmsProductInfo";
+import {addTmsGoodsDetail, delTmsGoodsDetail, listTmsGoodsDetail, updateTmsGoodsDetail} from "@/api/tms/tmsGoodsDetail";
 
-  const { proxy } = useCurrentInstance();
-  const crudRef = ref();
+const {proxy} = useCurrentInstance();
+const crudRef = ref();
+const boxFormRef = ref();
+const goodsCrudRef = ref();
+const actualFormRef = ref();
 
-  const permissionList = computed(()=>{
-    return {
-      addBtn: hasPermission(["tms:tmsDispatchOrder:add"]),
-      delBtn: hasPermission(["tms:tmsDispatchOrder:remove"]),
-      editBtn: hasPermission(["tms:tmsDispatchOrder:edit"]),
-      viewBtn: hasPermission(["tms:tmsDispatchOrder:query"]),
-    }
-  })
 
-  const data = reactive({
-    form:<TmsDispatchOrderI>{},
-    queryParams:<TmsDispatchOrderI&PageQueryInterface>{},
-    page: <PagesInterface>{
-      pageSize: 10,
-      total: 0,
-      currentPage: 1,
-    },
-    selectionList:[],
-  })
-  const {queryParams,form,page,selectionList} = toRefs(data);
-  const option = ref({
-    pageKey: 'TmsDispatchOrder',
-    rowKey: 'id',
-    column: {
-                                id: {
-          label: '涓婚敭ID',
-                  addDisplay : false,
-        editDisplay : false,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                dispatchNo: {
-          label: '璋冨害鍗曞彿',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "璋冨害鍗曞彿涓嶈兘涓虹┖", trigger: "blur" }
-            ],                  },
-                                customerName: {
-          label: '瀹㈡埛鍚嶇О',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "瀹㈡埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
-            ],                  },
-                                customerCode: {
-          label: '瀹㈡埛缂栫爜',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                projectName: {
-          label: '椤圭洰鍚嶇О',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "椤圭洰鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
-            ],                  },
-                                transportPlanNo: {
-          label: '杩愯緭璁″垝缂栧彿',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "杩愯緭璁″垝缂栧彿涓嶈兘涓虹┖", trigger: "blur" }
-            ],                  },
-                                departureRegion: {
-          label: '鍑哄彂鍦拌鏀垮尯鍩�',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "鍑哄彂鍦拌鏀垮尯鍩熶笉鑳戒负绌�", trigger: "blur" }
-            ],                  },
-                                destinationRegion: {
-          label: '鐩殑琛屾斂鍖哄煙',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "鐩殑琛屾斂鍖哄煙涓嶈兘涓虹┖", trigger: "blur" }
-            ],                  },
-                                transportLine: {
-          label: '杩愯緭绾胯矾',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "杩愯緭绾胯矾涓嶈兘涓虹┖", trigger: "blur" }
-            ],                  },
-                                vehicleProvider: {
-          label: '杞﹁締鏈嶅姟鍟�',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "杞﹁締鏈嶅姟鍟嗕笉鑳戒负绌�", trigger: "blur" }
-            ],                  },
-                                mainDriver: {
-          label: '涓婚┚椹跺憳',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "涓婚┚椹跺憳涓嶈兘涓虹┖", trigger: "blur" }
-            ],                  },
-                                assistantDriver: {
-          label: '鍓┚椹跺憳',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                requiredVehicleType: {
-          label: '瑕佹眰杩愯緭宸ュ叿绫诲瀷',
-                      type: 'select', dataType:'string', dicUrl: '/system/dict/data/type/dispatch_transport_mode',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "瑕佹眰杩愯緭宸ュ叿绫诲瀷涓嶈兘涓虹┖", trigger: "change"
-                 }
-            ],                  },
-                                vehicleNumber: {
-          label: '杩愯緭宸ュ叿鍙风爜',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "杩愯緭宸ュ叿鍙风爜涓嶈兘涓虹┖", trigger: "blur" }
-            ],                  },
-                                transportMode: {
-          label: '杩愯緭鏂瑰紡',
-                      type: 'select', dataType:'string', dicUrl: '/system/dict/data/type/dispatch_transport_mode',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                      rules: [
-              {
-                required: true,
-                message: "杩愯緭鏂瑰紡涓嶈兘涓虹┖", trigger: "change"
-                 }
-            ],                  },
-                                loadMode: {
-          label: '閰嶈浇鏂瑰紡',
-                      type: 'select', dataType:'string', dicUrl: '/system/dict/data/type/load_method',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                      rules: [
-              {
-                required: true,
-                message: "閰嶈浇鏂瑰紡涓嶈兘涓虹┖", trigger: "change"
-                 }
-            ],                  },
-                                goodsName: {
-          label: '璐у搧鍚嶇О',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                quantity: {
-          label: '鏁伴噺',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                goodsType: {
-          label: '璐у搧绫诲瀷',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                weight: {
-          label: '閲嶉噺(kg)',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                netWeight: {
-          label: '鍑�閲�(kg)',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                volume: {
-          label: '浣撶Н(m鲁)',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                loosePieces: {
-          label: '鏁d欢鏁�',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                fullContainers: {
-          label: '鏁寸鏁�',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                containerNo: {
-          label: '闆嗚绠卞彿',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                palletCount: {
-          label: '鎵樻暟',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                earliestDeparture: {
-          label: '瑕佹眰鏈�鏃╁嚭鍙戞椂闂�',
-                      type: 'date', valueFormat: 'YYYY-MM-DD',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                latestDeparture: {
-          label: '瑕佹眰鏈�鏅氬嚭鍙戞椂闂�',
-                      type: 'date', valueFormat: 'YYYY-MM-DD',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                earliestArrival: {
-          label: '瑕佹眰鏈�鏃╁埌杈炬椂闂�',
-                      type: 'date', valueFormat: 'YYYY-MM-DD',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                latestArrival: {
-          label: '瑕佹眰鏈�鏅氬埌杈炬椂闂�',
-                      type: 'date', valueFormat: 'YYYY-MM-DD',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                departureAddress: {
-          label: '鍑哄彂鍦板湴鍧�',
-                      type: 'textarea', minRows: 3, maxRows: 5,
-                  addDisplay : false,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                destinationAddress: {
-          label: '鐩殑鍦板湴鍧�',
-                      type: 'textarea', minRows: 3, maxRows: 5,
-                  addDisplay : false,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                actualVehicleType: {
-          label: '瀹為檯杩愯緭宸ュ叿绫诲瀷',
-                  addDisplay : false,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                actualLoadStart: {
-          label: '瀹為檯瑁呰溅寮�濮嬫椂闂�',
-                      type: 'date', valueFormat: 'YYYY-MM-DD',
-                  addDisplay : false,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                actualUnloadEnd: {
-          label: '瀹為檯鍗歌溅瀹屾垚鏃堕棿',
-                      type: 'date', valueFormat: 'YYYY-MM-DD',
-                  addDisplay : false,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                actualDeparture: {
-          label: '瀹為檯鍑哄彂鏃堕棿',
-                      type: 'date', valueFormat: 'YYYY-MM-DD',
-                  addDisplay : false,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                actualArrival: {
-          label: '瀹為檯鍒拌揪鏃堕棿',
-                      type: 'date', valueFormat: 'YYYY-MM-DD',
-                  addDisplay : false,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                actualQuantity: {
-          label: '瀹炲彂鏁伴噺',
-                  addDisplay : false,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                actualWeight: {
-          label: '瀹炲彂閲嶉噺(kg)',
-                  addDisplay : false,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                actualVolume: {
-          label: '瀹炲彂浣撶Н(m鲁)',
-                  addDisplay : false,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                reweighWeight: {
-          label: '澶嶇閲嶉噺(kg)',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                electronicLock: {
-          label: '鐢靛瓙閿佺紪鍙�',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                containerInfo: {
-          label: '闆嗚绠卞彿',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                carPlate: {
-          label: '杞︽澘鍙�',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                emptyMileage: {
-          label: '绌鸿浇閲岀▼(Km)',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                emptyFuel: {
-          label: '绌鸿浇娌硅��(L)',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                loadedMileage: {
-          label: '閲嶈浇閲岀▼(Km)',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                loadedFuel: {
-          label: '閲嶈浇娌硅��(L)',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                shiftNo: {
-          label: '鐝鍙�',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                lineNo: {
-          label: '绾胯矾鍙�',
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                status: {
-          label: '鐘舵��',
-                      type: 'select', dataType:'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status',
-                  addDisplay : false,
-        editDisplay : false,
-        viewDisplay :true,
-        hide :false,
-        search :true,
-                      rules: [
-              {
-                required: true,
-                message: "鐘舵�佷笉鑳戒负绌�", trigger: "change"
-                 }
-            ],                  },
-                                createBy: {
-          label: '鍒涘缓浜�',
-                  addDisplay : false,
-        editDisplay : false,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                createTime: {
-          label: '鍒涘缓鏃堕棿',
-                      type: 'date', valueFormat: 'YYYY-MM-DD',
-                  addDisplay : false,
-        editDisplay : false,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
-                                updateBy: {
-          label: '鏇存柊浜�',
-                  addDisplay : false,
-        editDisplay : false,
-        viewDisplay : false,
-        hide :false,
-        search : false,
-                  },
-                                updateTime: {
-          label: '鏇存柊鏃堕棿',
-                      type: 'date', valueFormat: 'YYYY-MM-DD',
-                  addDisplay : false,
-        editDisplay : false,
-        viewDisplay : false,
-        hide :false,
-        search : false,
-                  },
-                                remark: {
-          label: '澶囨敞',
-                      type: 'textarea', minRows: 3, maxRows: 5,
-                  addDisplay :true,
-        editDisplay :true,
-        viewDisplay : false,
-        hide : true,
-        search : false,
-                  },
+const permissionList = (key: any, row: any, index: any) => {
+  if (key == 'addBtn') {
+    return hasPermission(["tms:tmsDispatchOrder:add"])
+  } else if (key == 'delBtn') {
+    return hasPermission(["tms:tmsDispatchOrder:remove"]) && row?.status == 0
+  } else if (key == 'editBtn') {
+    return hasPermission(["tms:tmsDispatchOrder:edit"]) && [0,1].includes(row?.status)
+  } else if (key == 'viewBtn') {
+    return hasPermission(["tms:tmsDispatchOrder:query"])
+  } else {
+    return true;
+  }
+};
+const data = reactive({
+  form: <TmsDispatchOrderI>{},
+  queryParams: <TmsDispatchOrderI & PageQueryInterface>{},
+  page: <PagesInterface>{
+    pageSize: 10,
+    total: 0,
+    currentPage: 1,
+  },
+  selectionList: [],
+  optionType: '',
+  boxTableData: <any>[],
+  boxForm: <any>{},
+  boxFormOption: <any>{},
+  boxTableOption: <any>{},
+  title: '',
+  open: false,
+  open2:false,
+  goodsTableData: <any>[],
+  goodsForm:<any>{},
+  open3: false,
+  actualForm:<any>{},
+})
+const {queryParams, form, page, selectionList,open3,
+  boxTableData, optionType,
+  boxFormOption,boxForm,boxTableOption,title,open,open2,
+  goodsTableData,goodsForm,actualForm
+} = toRefs(data);
+const option = ref({
+  pageKey: 'TmsDispatchOrder',
+  rowKey: 'id',
+  labelWidth: 130,
+  searchSpan: 6,
+  searchLabelWidth: 150,
+  menuWidth: 300,
+  group: [
+    {
+      label: '鍩烘湰淇℃伅',
+      prop: 'jbxx',
+      column: {
+        projectId: {
+          label: '鍏宠仈椤圭洰',
+          display: true,
+          rules: [
+            {
+              required: true,
+              message: "鍏宠仈椤圭洰涓嶈兘涓虹┖", trigger: "change"
+            }
+          ],
+          change: (val: any) => {
+            const table = crudRef.value?.getPropRef?.('projectId')?.$refs?.temp;
+            if (!table) return;
+            let active = table.active;
+            if (Array.isArray(active)) active = active[0];
+            if (active) {
+              Object.assign(form.value, {
+                projectId: active.id,
+                projectName: active.projectName,
+                customerId: active.relatedCustomerId,
+                customerName: active.relatedCustomerName,
+                customerCode: active.relatedCustomerCode,
+                contractId: active.relatedContractId,
+                contractName: active.relatedContractName,
+              });
+            }
+          },
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchMenuSpan: 5,
+            column: {
+              projectName: {
+                label: '椤圭洰鍚嶇О', minWidth: 130,
+                search: true,
+              },
+              projectCode: {
+                label: '椤圭洰缂栧彿', minWidth: 120,
+                search: true,
+              },
+              relatedContractName: {
+                label: '鍏宠仈鍚堝悓',
+                display: false, minWidth: 150,
+                search: true,
+              },
+
+              relatedCustomerName: {
+                label: '鍏宠仈瀹㈡埛',
+                display: false, minWidth: 150,
+                search: true,
+              },
+              status: {
+                label: '鐘舵��', dataType: 'string',
+                type: 'radio', dicUrl: '/system/dict/data/type/data_status',
+                addDisplay: false, minWidth: 150,
+                editDisplay: false,
+                viewDisplay: true,
+                hide: false,
+                search: true,
+                rules: [
+                  {
+                    required: true,
+                    message: "鐘舵�佷笉鑳戒负绌�", trigger: "blur"
+                  }
+                ],
+              },
+            },
+
+          },
+          props: {
+            label: 'projectName',
+            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]
+              }
+              getTmsProject(id).then(res => {
+                return callback(res.data || {})
+              })
+            } else {
+              listTmsProject({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
           }
-  })
 
-  const { tableData,pageF,rowSave,rowUpdate,rowDel,beforeOpen,searchChange,
-    searchReset,selectionChange,onLoad,currentChange,sizeChange,handleDelete,handleExport,handleUpdate,refreshChange} = usePagePlus({
-    form:form,
-    option:option,
-    queryParams:queryParams,
-    idKey:'id',
-    page:page.value,
-    getListApi:listTmsDispatchOrder,
-    getDetailApi:getTmsDispatchOrder,
-    exportApi:exportTmsDispatchOrder,
-    deleteApi:delTmsDispatchOrder,
-    addApi:addTmsDispatchOrder,
-    updateApi:updateTmsDispatchOrder,
-    handleUpdateFunc:()=>{
-      crudRef.value.rowEdit(selectionList.value[0]);
+        },
+        customerName: {
+          label: '瀹㈡埛鍚嶇О',
+          display: true, disabled: true
+        },
+        // customerCode: {
+        //   label: '瀹㈡埛缂栫爜',
+        //   display: true,disabled:true
+        // },
+        contractName: {
+          label: '鍏宠仈鍚堝悓鍚嶇О',
+          display: true, disabled: true
+        },
+
+        orderType: {
+          label: '璁㈠崟绫诲瀷',
+          display: true,
+          type: 'select', dataType: 'string',
+          dicUrl: '/system/dict/data/type/order_type',
+          rules: [
+            {
+              required: true,
+              message: "璁㈠崟绫诲瀷涓嶈兘涓虹┖", trigger: "change"
+            }
+          ],
+        },
+        signType: {
+          label: '绛炬敹绫诲瀷',
+          display: true,
+          type: 'select', dataType: 'string',
+          dicUrl: '/system/dict/data/type/sign_type',
+          rules: [
+            {
+              required: true,
+              message: "绛炬敹绫诲瀷涓嶈兘涓虹┖", trigger: "change"
+            }
+          ],
+        },
+        vehicleProviderId: {
+          label: '杞﹁締鏈嶅姟鍟�',
+          display: true,
+          rules: [
+            {
+              required: true,
+              message: "杞﹁締鏈嶅姟鍟嗕笉鑳戒负绌�", trigger: "change"
+            }
+          ],
+          change: (val: any) => {
+            const table = crudRef.value?.getPropRef?.('vehicleProviderId')?.$refs?.temp;
+            if (!table) return;
+            let active = table.active;
+            if (Array.isArray(active)) active = active[0];
+            if (active) {
+              Object.assign(form.value, {
+                vehicleProviderId: active.id,
+                vehicleProviderName: active.serviceShortName,
+              });
+            }
+          },
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchLabelWidth: 100,
+            searchMenuSpan: 5,
+            column: {
+              serviceCode: {
+                label: '鏈嶅姟鍟嗙紪鐮�', minWidth: 130,
+                search: true,
+              },
+              serviceShortName: {
+                label: '鏈嶅姟鍟嗙畝绉�', minWidth: 120,
+                search: true,
+              },
+              serviceType: {
+                label: '鏈嶅姟绫诲瀷', multiple: true,
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/service_type',
+                minWidth: 150,
+              },
+              isTransport: {
+                label: '鏄惁杩愯緭鏈嶅姟鍟�',
+                type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_number_is',
+                minWidth: 150,
+              },
+              isStorage: {
+                label: '鏄惁浠撳偍鏈嶅姟鍟�',
+                type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_number_is',
+                minWidth: 150,
+              },
+              isExpress: {
+                label: '鏄惁蹇�掓湇鍔″晢',
+                type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_number_is',
+                minWidth: 150,
+              },
+              contactName: {
+                label: '鑱旂郴浜哄鍚�', minWidth: 120,
+              },
+            },
+
+          },
+          props: {
+            label: 'serviceShortName',
+            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]
+              }
+              getTmsServiceProvider(id).then(res => {
+                return callback(res.data || {})
+              })
+            } else {
+              listTmsServiceProvider({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
+          }
+
+        },
+        loadingServiceProviderId: {
+          label: '瑁呰揣鏈嶅姟鍟�',
+          display: true,
+          rules: [
+            {
+              required: true,
+              message: "瑁呰揣鏈嶅姟鍟嗕笉鑳戒负绌�", trigger: "change"
+            }
+          ],
+          change: (val: any) => {
+            const table = crudRef.value?.getPropRef?.('loadingServiceProviderId')?.$refs?.temp;
+            if (!table) return;
+            let active = table.active;
+            if (Array.isArray(active)) active = active[0];
+            if (active) {
+              Object.assign(form.value, {
+                loadingServiceProviderId: active.id,
+                loadingServiceProviderName: active.serviceShortName,
+              });
+            }
+          },
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchLabelWidth: 100,
+            searchMenuSpan: 5,
+            column: {
+              serviceCode: {
+                label: '鏈嶅姟鍟嗙紪鐮�', minWidth: 130,
+                search: true,
+              },
+              serviceShortName: {
+                label: '鏈嶅姟鍟嗙畝绉�', minWidth: 120,
+                search: true,
+              },
+              serviceType: {
+                label: '鏈嶅姟绫诲瀷', multiple: true,
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/service_type',
+                minWidth: 150,
+              },
+              contactName: {
+                label: '鑱旂郴浜哄鍚�', minWidth: 120,
+              },
+            },
+
+          },
+          props: {
+            label: 'serviceShortName',
+            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]
+              }
+              getTmsLoadingServiceProvider(id).then(res => {
+                return callback(res.data || {})
+              })
+            } else {
+              listTmsLoadingServiceProvider({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
+          }
+
+        },
+        customsServiceProviderId: {
+          label: '鎶ュ叧鏈嶅姟鍟�',
+          display: true,
+          rules: [
+            {
+              required: true,
+              message: "鎶ュ叧鏈嶅姟鍟嗕笉鑳戒负绌�", trigger: "change"
+            }
+          ],
+          change: (val: any) => {
+            const table = crudRef.value?.getPropRef?.('customsServiceProviderId')?.$refs?.temp;
+            if (!table) return;
+            let active = table.active;
+            if (Array.isArray(active)) active = active[0];
+            if (active) {
+              Object.assign(form.value, {
+                customsServiceProviderId: active.id,
+                customsServiceProviderName: active.serviceShortName,
+              });
+            }
+          },
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchLabelWidth: 100,
+            searchMenuSpan: 5,
+            column: {
+              serviceCode: {
+                label: '鏈嶅姟鍟嗙紪鐮�', minWidth: 130,
+                search: true,
+              },
+              serviceShortName: {
+                label: '鏈嶅姟鍟嗙畝绉�', minWidth: 120,
+                search: true,
+              },
+              serviceType: {
+                label: '鏈嶅姟绫诲瀷', multiple: true,
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/service_type',
+                minWidth: 150,
+              },
+              contactName: {
+                label: '鑱旂郴浜哄鍚�', minWidth: 120,
+              },
+            },
+
+          },
+          props: {
+            label: 'serviceShortName',
+            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]
+              }
+              getTmsCustomsServiceProvider(id).then(res => {
+                return callback(res.data || {})
+              })
+            } else {
+              listTmsCustomsServiceProvider({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
+          }
+        },
+        isUrgent: {
+          label: '鏄惁绱ф��',
+          display: true,
+          type: 'select', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
+          rules: [
+            {
+              required: true,
+              message: "鏄惁绱ф�ヤ笉鑳戒负绌�", trigger: "blur"
+            }
+          ],
+        },
+        transportType: {
+          label: '杩愯緭鏂瑰紡',
+          display: true, type: 'select', dicUrl: '/system/dict/data/type/dispatch_transport_mode', dataType: 'string',
+
+        },
+        loadMethod: {
+          label: '閰嶈浇鏂瑰紡',
+          display: true, type: 'select', dicUrl: '/system/dict/data/type/load_method', dataType: 'string',
+        },
+        mainDriverId: {
+          label: '涓婚┚椹跺憳',
+          display: true,dataType: 'string',
+          rules: [
+            {
+              required: true,
+              message: "涓婚┚椹跺憳涓嶈兘涓虹┖", trigger: "change"
+            }
+          ],
+          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];
+            if (active) {
+              Object.assign(form.value, {
+                mainDriverId: active.id,
+                mainDriverName: active.driverName,
+              });
+            }
+          },
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchMenuSpan: 5,
+            column: {
+              vehicleProviderName: {
+                label: '杞﹁締鏈嶅姟鍟�', minWidth: 130,
+                search: true,
+              },
+              driverName: {
+                label: '椹鹃┒鍛樺鍚�', minWidth: 120,
+                search: true,
+              },
+              licenseType: {
+                label: '鍑嗛┚杞﹀瀷', minWidth: 120,
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/license_type',
+                search: true,multiple:true,
+              },
+            },
+
+          },
+          props: {
+            label: 'driverName',
+            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]
+              }
+              getTmsDriver(id).then(res => {
+                return callback(res.data || {})
+              })
+            } else {
+              listTmsDriver({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
+          }
+
+
+        },
+        assistantDriverId: {
+          label: '鍓┚椹跺憳',
+          display: true,dataType: 'string',
+          change: (val: any) => {
+            const table = crudRef.value?.getPropRef?.('assistantDriverId')?.$refs?.temp;
+            if (!table) return;
+            let active = table.active;
+            if (Array.isArray(active)) active = active[0];
+            if (active) {
+              Object.assign(form.value, {
+                assistantDriverId: active.id,
+                assistantDriverName: active.driverName,
+              });
+            }
+          },
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchMenuSpan: 5,
+            column: {
+              vehicleProviderName: {
+                label: '杞﹁締鏈嶅姟鍟�', minWidth: 130,
+                search: true,
+              },
+              driverName: {
+                label: '椹鹃┒鍛樺鍚�', minWidth: 120,
+                search: true,
+              },
+              licenseType: {
+                label: '鍑嗛┚杞﹀瀷', minWidth: 120,multiple:true,
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/license_type',
+                search: true,
+              },
+            },
+
+          },
+          props: {
+            label: 'driverName',
+            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]
+              }
+              getTmsDriver(id).then(res => {
+                return callback(res.data || {})
+              })
+            } else {
+              listTmsDriver({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
+          }
+
+        },
+        requiredVehicleTypes: {
+          label: '瑕佹眰杞﹀瀷',
+          display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
+          rules: [
+            {
+              required: true,
+              message: "瑕佹眰杞﹀瀷涓嶈兘涓虹┖", trigger: "blur"
+            }
+          ],
+        },
+        actualVehicleType: {
+          label: '瀹為檯杩愯緭宸ュ叿绫诲瀷',
+          display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
+        },
+        vehicleId: {
+          label: '杞︾墝鍙�',dataType: 'string',
+          display: true,
+          rules: [
+            {
+              required: true,
+              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,
+              });
+            }
+          },
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchLabelWidth: 100,
+            searchMenuSpan: 5,
+            column: {
+              serviceProviderName: {
+                label: '杞﹁締鏈嶅姟鍟�', minWidth: 130,
+                search: true,
+              },
+              vehicleType: {
+                label: '杞﹁締绫诲瀷', minWidth: 120,
+                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}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
+          }
+
+        },
+        containerId: {
+          label: '鍏宠仈闆嗚绠变俊鎭�',
+          display: true,
+          change: (val: any) => {
+            const table = crudRef.value?.getPropRef?.('containerId')?.$refs?.temp;
+            if (!table) return;
+            let active = table.active;
+            if (Array.isArray(active)) active = active[0];
+            if (active) {
+              Object.assign(form.value, {
+                containerId: active.id,
+                containerNo: active.containerCode,
+              });
+            }
+          },
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchLabelWidth: 100,
+            searchMenuSpan: 5,
+            column: {
+              containerCode: {
+                label: '闆嗚绠卞彿', minWidth: 130,
+                search: true,
+              },
+              containerUseType: {
+                label: '闆嗚绠辩敤閫旂被鍨�', minWidth: 120,
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/container_use_type',
+                search: true,
+              },
+              containerSize: {
+                label: '绠卞瀷',
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/container_type',
+                display: false,
+                hide: false, minWidth: 150,
+                search: true,
+              },
+            },
+
+          },
+          props: {
+            label: 'containerCode',
+            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]
+              }
+              getTmsContainer(id).then(res => {
+                return callback(res.data || {})
+              })
+            } else {
+              listTmsContainer({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
+          }
+
+        },
+        shelfId: {
+          label: '鎵樻澘鍙�',
+          display: true,
+          change: (val: any) => {
+            const table = crudRef.value?.getPropRef?.('shelfId')?.$refs?.temp;
+            if (!table) return;
+            let active = table.active;
+            if (Array.isArray(active)) active = active[0];
+            if (active) {
+              Object.assign(form.value, {
+                shelfId: active.id,
+                shelfCode: active.shelfCode,
+              });
+            }
+          },
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchLabelWidth: 100,
+            searchMenuSpan: 5,
+            column: {
+              shelfCode: {
+                label: '鎵樻灦鍙�', minWidth: 130,
+                search: true,
+              },
+              shelfType: {
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/shelf_type',
+                search: true,
+              },
+              compatibleContainerType: {
+                label: '閫傞厤闆嗚绠辩被鍨�', minWidth: 120,
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/container_type',
+                search: true,
+              },
+            },
+
+          },
+          props: {
+            label: 'shelfCode',
+            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]
+              }
+              getTmsShelf(id).then(res => {
+                return callback(res.data || {})
+              })
+            } else {
+              listTmsShelf({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
+          }
+
+        },
+      }
     },
-    handleSelectionChangeFunc:(selection:any)=>{
-      selectionList.value = selection;
+    {
+      label: '鏀跺彂璐т汉淇℃伅',
+      prop: 'shffxrxx',
+      column: {
+        shipperId: {
+          label: '鍙戣揣浜�',dataType:'string',
+          display: true,
+          change: (val: any) => {
+            const table = crudRef.value?.getPropRef?.('shipperId')?.$refs?.temp;
+            if (!table) return;
+            let active = table.active;
+            if (Array.isArray(active)) active = active[0];
+            if (active) {
+              let shipperRegionCode = '';
+              if (active.provinceId){
+                shipperRegionCode = active.provinceId;
+              }
+              if (active.cityId){
+                shipperRegionCode =shipperRegionCode+ ","+active.cityId;
+
+              }
+              if (active.districtId){
+                shipperRegionCode =shipperRegionCode+ ","+active.districtId;
+
+              }
+              if (active.streetId){
+                shipperRegionCode =shipperRegionCode+ ","+active.streetId;
+              }
+              Object.assign(form.value, {
+                shipperId: active.id,
+                shipperName: active.consignorName,
+                shipperRegionLabel: active.regionLabel,
+                shipperAddress: active.addressDetail,
+                shipperMobile: active.contactPhone,
+                shipperRegionCode:shipperRegionCode
+              });
+              form.value.transportLine = form.value.shipperRegionLabel
+                  + (form.value.receiverRegionLabel ? '>' + form.value.receiverRegionLabel : '');
+            }
+          },
+          rules: [
+            {
+              required: true,
+              message: "鍙戣揣浜轰笉鑳戒负绌�", trigger: "change"
+            }
+          ],
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchLabelWidth: 100,
+            searchMenuSpan: 5,
+            column: {
+              consignorCode: {
+                label: '鏀跺彂璐т汉缂栫爜', minWidth: 130,
+                search: true,
+              },
+              consignorName: {
+                label: '鏀跺彂璐т汉鍚嶇О', minWidth: 130,
+                search: true,
+              },
+              consignorType: {
+                label: '鏀跺彂璐т汉绫诲瀷', minWidth: 80,
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/consignor_type',
+                display: false,
+                hide: false,
+                search: true,
+              },
+              contactName: {
+                label: '鑱旂郴浜哄鍚�', minWidth: 110,
+                display: false,
+                hide: false,
+                search: true,
+              },
+              contactPhone: {
+                label: '鑱旂郴浜虹數璇�', minWidth: 110,
+                display: false,
+                hide: false,
+                search: true,
+              },
+              regionLabel: {
+                label: '琛屾斂鍖哄煙', minWidth: 180,
+                display: false,
+                hide: false,
+                search: true,
+              },
+            },
+
+          },
+          props: {
+            label: 'consignorName',
+            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]
+              }
+              getTmsConsignor(id).then(res => {
+                return callback(res.data || {})
+              })
+            } else {
+              listTmsConsignor({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
+          }
+
+        },
+        shipperRegionLabel: {
+          label: '鍙戣揣浜鸿鏀垮尯鍩�',
+          display: true, disabled: true
+
+        },
+        shipperAddress: {
+          label: '鍙戣揣浜鸿缁嗗湴鍧�',
+          display: true, disabled: true
+        },
+        shipperMobile: {
+          label: '鍙戣揣浜鸿仈绯绘柟寮�',
+          display: true, disabled: true
+        },
+        receiverId: {
+          label: '鏀惰揣浜�',
+          display: true, dataType:'string',
+          rules: [
+            {
+              required: true,
+              message: "鏀惰揣浜轰笉鑳戒负绌�", trigger: "change"
+            }
+          ],
+          change: (val: any) => {
+            const table = crudRef.value?.getPropRef?.('receiverId')?.$refs?.temp;
+            if (!table) return;
+            let active = table.active;
+            if (Array.isArray(active)) active = active[0];
+            if (active) {
+              let receiverRegionCode = '';
+              if (active.provinceId){
+                receiverRegionCode = active.provinceId;
+              }
+              if (active.cityId){
+                receiverRegionCode =receiverRegionCode+ ","+active.cityId;
+
+              }
+              if (active.districtId){
+                receiverRegionCode =receiverRegionCode+ ","+active.districtId;
+
+              }
+              if (active.streetId){
+                receiverRegionCode =receiverRegionCode+ ","+active.streetId;
+              }
+
+              Object.assign(form.value, {
+                receiverId: active.id,
+                receiverName: active.consignorName,
+                receiverRegionLabel: active.regionLabel,
+                receiverAddress: active.addressDetail,
+                receiverMobile: active.contactPhone,
+                receiverRegionCode:receiverRegionCode,
+              });
+              form.value.transportLine =
+                  (form.value.shipperRegionLabel ? form.value.shipperRegionLabel + '>' : '') + form.value.receiverRegionLabel;
+
+            }
+          },
+          type: 'table', suffixIcon: 'search',
+          children: {
+            border: true,
+            searchLabelWidth: 100,
+            searchMenuSpan: 5,
+            column: {
+              consignorCode: {
+                label: '鏀跺彂璐т汉缂栫爜', minWidth: 130,
+                search: true,
+              },
+              consignorName: {
+                label: '鏀跺彂璐т汉鍚嶇О', minWidth: 130,
+                search: true,
+              },
+              consignorType: {
+                label: '鏀跺彂璐т汉绫诲瀷', minWidth: 80,
+                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/consignor_type',
+                display: false,
+                hide: false,
+                search: true,
+              },
+              contactName: {
+                label: '鑱旂郴浜哄鍚�', minWidth: 110,
+                display: false,
+                hide: false,
+                search: true,
+              },
+              contactPhone: {
+                label: '鑱旂郴浜虹數璇�', minWidth: 110,
+                display: false,
+                hide: false,
+                search: true,
+              },
+              regionLabel: {
+                label: '琛屾斂鍖哄煙', minWidth: 180,
+                display: false,
+                hide: false,
+                search: true,
+              },
+            },
+
+          },
+          props: {
+            label: 'consignorName',
+            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]
+              }
+              getTmsConsignor(id).then(res => {
+                return callback(res.data || {})
+              })
+            } else {
+              listTmsConsignor({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+                return callback({
+                  total: res.total,
+                  data: res.rows || [],
+                })
+              })
+            }
+
+          }
+
+        },
+        receiverRegionLabel: {
+          label: '鏀惰揣浜鸿鏀垮尯鍩�',
+          display: true, disabled: true
+        },
+        receiverAddress: {
+          label: '鏀惰揣浜鸿缁嗗湴鍧�',
+          display: true, disabled: true
+        },
+        receiverMobile: {
+          label: '鏀惰揣浜鸿仈绯绘柟寮�',
+          display: true, disabled: true
+        },
+        transportLine: {
+          label: '杩愯緭绾胯矾', span: 24,
+          display: true, disabled: true
+        },
+      }
+    },
+    {
+      label: '杩愯緭瑕佹眰淇℃伅',
+      prop: 'ysyqxx',
+      column: {
+        earliestDeparture: {
+          label: '瑕佹眰鏈�鏃╁嚭鍙戞椂闂�',
+          type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
+          format: 'YYYY-MM-DD HH:mm:ss',
+          valueFormat: 'YYYY-MM-DD HH:mm:ss',
+          display: true,
+        },
+        latestDeparture: {
+          label: '瑕佹眰鏈�鏅氬嚭鍙戞椂闂�',
+          type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
+          format: 'YYYY-MM-DD HH:mm:ss',
+          valueFormat: 'YYYY-MM-DD HH:mm:ss',
+          display: true,
+        },
+        earliestArrival: {
+          label: '瑕佹眰鏈�鏃╁埌杈炬椂闂�',
+          type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
+          format: 'YYYY-MM-DD HH:mm:ss',
+          valueFormat: 'YYYY-MM-DD HH:mm:ss',
+          display: true,
+        },
+        latestArrival: {
+          label: '瑕佹眰鏈�鏅氬埌杈炬椂闂�',
+          type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
+          format: 'YYYY-MM-DD HH:mm:ss',
+          valueFormat: 'YYYY-MM-DD HH:mm:ss',
+          display: true,
+        },
+      }
+    },
+    {
+      label: '杞﹁締淇℃伅',
+      prop: 'clxx',
+      column: {
+        emptyMileage: {
+          label: '绌鸿浇閲岀▼', append: 'Km',
+          display: true,
+        },
+        emptyFuel: {
+          label: '绌鸿浇娌硅��', append: 'L',
+          display: true,
+        },
+        loadedMileage: {
+          label: '閲嶈浇閲岀▼', append: 'Km',
+          display: true,
+        },
+        loadedFuel: {
+          label: '閲嶈浇娌硅��', append: 'L',
+          display: true,
+        },
+      }
+    },
+    {
+      label: '鍏朵粬淇℃伅',
+      prop: 'qtyxx',
+      column: {
+        shiftNo: {
+          label: '鐝鍙�',
+          display: true,
+        },
+        lineNo: {
+          label: '绾胯矾鍙�',
+          display: true,
+        },
+        remark: {
+          label: '澶囨敞', span: 24,
+          type: 'textarea', minRows: 3, maxRows: 5,
+          display: true,
+        },
+      }
+    }
+  ],
+  column: {
+
+    dispatchNo: {
+      label: '璋冨害鍗曞彿', minWidth: 120,
+      display: false,
+      search: true,
+    },
+    customerName: {
+      label: '瀹㈡埛',
+      display: false, minWidth: 120,
+      search: true,
+    },
+
+    projectName: {
+      label: '椤圭洰鍚嶇О',
+      display: false, minWidth: 120,
+      search: true,
+    },
+    contractName: {
+      label: '鍏宠仈鍚堝悓鍚嶇О', minWidth: 120,
+      display: false,
+      search: true,
+    },
+    orderType: {
+      label: '璁㈠崟绫诲瀷',
+      display: false,
+      search: true, minWidth: 120,
+      type: 'select', dataType: 'string',
+      dicUrl: '/system/dict/data/type/order_type',
+    },
+    signType: {
+      label: '璁㈠崟绫诲瀷',
+      display: false,
+      search: true, minWidth: 120,
+      type: 'select', dataType: 'string',
+      dicUrl: '/system/dict/data/type/order_type',
+    },
+
+    transportLine: {
+      label: '杩愯緭绾胯矾',
+      display: false,
+      search: true, minWidth: 180, overHidden: true
+    },
+
+
+    vehicleProviderName: {
+      label: '杞﹁締鏈嶅姟鍟嗗悕绉�', minWidth: 150,
+      display: false,
+      search: true,
+    },
+
+    loadingServiceProviderName: {
+      label: '瑁呰揣鏈嶅姟鍟嗗悕绉�', minWidth: 150,
+      display: false,
+      search: true,
+    },
+    customsServiceProviderName: {
+      label: '鎶ュ叧鏈嶅姟鍟嗗悕绉�', minWidth: 150,
+      display: false,
+      search: true,
+    },
+    isUrgent: {
+      label: '鏄惁绱ф�ュ惁',
+      display: false, minWidth: 100,
+      search: true,
+      type: 'select', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
+
+    },
+    mainDriverName: {
+      label: '涓婚┚椹跺憳',
+      display: false, minWidth: 120,
+      search: true,
+    },
+
+    // requiredVehicleTypes: {
+    //   label: '瑕佹眰杩愯緭宸ュ叿绫诲瀷',
+    //   display: false,
+    //   search: true,
+    // },
+    actualVehicleType: {
+      label: '瀹為檯杩愯緭宸ュ叿绫诲瀷', minWidth: 130,
+      display: false,
+      search: true,
+      type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
+
+    },
+
+    licensePlate: {
+      label: '杞︾墝鍙�', minWidth: 120,
+      display: false,
+      search: true,
+    },
+
+    shipperName: {
+      label: '鍙戣揣浜哄悕绉�',
+      display: false, minWidth: 120,
+      search: true,
+    },
+    receiverName: {
+      label: '鏀惰揣浜哄悕绉�', minWidth: 120,
+      display: false,
+      search: true,
+    },
+    accountsReceivableStatus: {
+      label: '搴旀敹璐圭敤鐢熸垚鐘舵��', minWidth: 160,
+      display: false,
+      hide: false,
+      search: true,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/accounts_status',
+
+    },
+    accountsPayableStatus: {
+      label: '搴斾粯璐圭敤鐢熸垚鐘舵��', minWidth: 160,
+      display: false,
+      hide: false,
+      search: true,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/accounts_status',
+
+    },
+
+    status: {
+      label: '鐘舵��', minWidth: 150,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status',
+      display: false,
+      hide: false, fixed: 'right',
+      search: true,
+      rules: [
+        {
+          required: true,
+          message: "鐘舵�佷笉鑳戒负绌�", trigger: "change"
+        }
+      ],
+    },
+
+    updateBy: {
+      label: '鏇存柊浜�', minWidth: 150,
+      addDisplay: false,
+      editDisplay: false,
+      viewDisplay: false,
+      hide: false,
+      search: false,
+    },
+    updateTime: {
+      label: '鏇存柊鏃堕棿', minWidth: 180,
+      addDisplay: false,
+      editDisplay: false,
+      viewDisplay: false,
+      hide: false,
+      search: false,
+    },
+
+
+  }
+})
+
+const itineraryOption = ref({
+  menuBtn: false,
+  labelWidth: 120,
+  column: {
+
+    driverName: {
+      label: '涓婚┚椹跺憳鍚嶇О',
+      display: true, disabled: true,
+    },
+    vehicleNumber: {
+      label: '杞︾墝鍙风爜',
+      display: true, disabled: true,
+
+    },
+    tripType: {
+      label: '琛岀▼绫诲瀷',
+      display: true,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/trip_type',
+      rules: [
+        {
+          required: true,
+          message: "琛岀▼绫诲瀷涓嶈兘涓虹┖", trigger: "change"
+        }
+      ],
+    },
+    tripTime: {
+      label: '鏃堕棿',
+      type: 'datetime', valueFormat: 'YYYY-MM-DD HH:mm:ss',
+      display: true,
+      rules: [
+        {
+          required: true,
+          message: "鏃堕棿涓嶈兘涓虹┖", trigger: "change"
+        }
+      ],
+    },
+    odometer: {
+      label: '浠〃閲岀▼',
+      display: true,
+      rules: [
+        {
+          required: true,
+          message: "浠〃閲岀▼涓嶈兘涓虹┖", trigger: "change"
+        }
+      ],
+    },
+    address: {
+      label: '鍏蜂綋鍦板潃',
+      display: true,
+      rules: [
+        {
+          required: true,
+          message: "鍏蜂綋鍦板潃涓嶈兘涓虹┖", trigger: "change"
+        }
+      ],
+    },
+    voucherUrl: {
+      label: '琛岀▼鍑瘉',
+      display: true,
+      span: 24,
+      accept:'string',dataType: 'string',
+      type: 'upload',
+      action: '/common/upload2',
+      propsHttp:{
+        url: 'url',
+        name: 'name',
+        res: 'data',
+      },
+    },
+    dataSource: {
+      label: '鏁版嵁鏉ユ簮',
+      display: false,
+      value: 0
+    },
+  }
+})
+
+const itineraryTableOption = ref({
+  menu: false,
+  addBtn: false,
+  header: false, selection: false,
+  title: '鍘嗗彶琛岀▼',
+  column: {
+    dataSource: {
+      label: '鏁版嵁鏉ユ簮',
+      display: false,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/data_source',
+
+    },
+    driverName: {
+      label: '涓婚┚椹跺憳鍚嶇О',
+      display: true, disabled: true,
+    },
+    vehicleNumber: {
+      label: '杞︾墝鍙风爜',
+      display: true, disabled: true,
+
+    },
+    tripType: {
+      label: '琛岀▼绫诲瀷',
+      display: true,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/trip_type',
+
+    },
+    tripTime: {
+      label: '鏃堕棿',
+      type: 'date', valueFormat: 'YYYY-MM-DD',
+      display: true,
+    },
+    odometer: {
+      label: '浠〃閲岀▼',
+      display: true,
+    },
+    address: {
+      label: '鍏蜂綋鍦板潃',
+      display: true,
+    },
+    voucherUrl: {
+      label: '琛岀▼鍑瘉',
+      display: true,
+      span: 24,dataType: 'string',
+      type: 'upload',
+      action: '/common/upload2',
+      propsHttp:{
+        url: 'url',
+        name: 'name',
+        res: 'data',
+      },
+    },
+
+  }
+})
+
+const financeOption = ref({
+  menuBtn: false,
+  labelWidth: 120,
+  column: {
+    feeType: {
+      label: '璐圭敤绫诲瀷',
+      display: true,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/fee_type',
+      rules: [
+        {
+          required: true,
+          message: "璐圭敤绫诲瀷涓嶈兘涓虹┖", trigger: "change"
+        }
+      ],
+    },
+    actualFeeAmount: {
+      label: '璐圭敤閲戦',
+      type: 'number',
+      display: true,
+      rules: [
+        {
+          required: true,
+          message: "璐圭敤閲戦涓嶈兘涓虹┖", trigger: "change"
+        }
+      ],
+    },
+    voucherUrl: {
+      label: '琛岀▼鍑瘉',
+      display: true,
+      span: 24,
+      accept:'string',dataType: 'string',
+      type: 'upload',
+      action: '/common/upload2',
+      propsHttp:{
+        url: 'url',
+        name: 'name',
+        res: 'data',
+      },
+    },
+    dataSource: {
+      label: '鏁版嵁鏉ユ簮',
+      display: false,
+      value: 0
+    },
+  }
+})
+
+const financeTableOption = ref({
+  menu: false,
+  addBtn: false,
+  header: false, selection: false,
+  title: '鍘嗗彶鍨粯璐圭敤',
+  column: {
+    dataSource: {
+      label: '鏁版嵁鏉ユ簮',
+      display: false,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/data_source',
+
+    },
+    createBy: {
+      label: '娣诲姞浜�',
+      display: true, disabled: true,
+    },
+    feeCreateTime: {
+      label: '涓婁紶鏃堕棿',
+      display: true, disabled: true,
+
+    },
+    feeType: {
+      label: '璐圭敤绫诲瀷',
+      display: true,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/fee_type',
+
+    },
+    actualFeeAmount: {
+      label: '閲戦',
+      display: true,
+    },
+    feeVoucherUrl: {
+      label: '璐圭敤鍑瘉',
+      display: true,
+      span: 24,
+      accept:'string',dataType: 'object',
+      type: 'upload',
+      action: '/common/upload2',
+      propsHttp:{
+        url: 'url',
+        name: 'name',
+        res: 'data',
+      },
+    },
+
+  }
+})
+
+const generateTableOption = ref({
+  menu: false,
+  addBtn: false,
+  header: false, selection: false,
+  column: {
+    collectionPlanName: {
+      label: '鍖归厤搴旀敹鏂规鍚嶇О', minWidth: 160,
+    },
+    accountsReceivableStatus: {
+      label: '搴旀敹璐圭敤鐢熸垚鐘舵��', minWidth: 160,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/accounts_status',
+    },
+    paymentPlanName: {
+      label: '鍖归厤搴斾粯鏂规鍚嶇О', minWidth: 160,
+    },
+
+    accountsPayableStatus: {
+      label: '搴斾粯璐圭敤鐢熸垚鐘舵��', minWidth: 160,
+      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/accounts_status',
+    },
+    dispatchNo: {
+      label: '璋冨害鍗曞彿', minWidth: 120,
+      display: false,
+    },
+    customerName: {
+      label: '瀹㈡埛',
+      display: false, minWidth: 120,
+    },
+    vehicleProviderName: {
+      label: '杞﹁締鏈嶅姟鍟嗗悕绉�', minWidth: 150,
+      display: false,
+    },
+    shipperName: {
+      label: '鍙戣揣浜哄悕绉�',
+      display: false, minWidth: 120,
+    },
+    receiverName: {
+      label: '鏀惰揣浜哄悕绉�', minWidth: 120,
+      display: false,
+    },
+    transportLine: {
+      label: '杩愯緭绾胯矾',
+      display: false,minWidth: 180, overHidden: true
+    },
+    actualVehicleType: {
+      label: '杞﹀瀷', minWidth: 130,
+      display: false,
+      type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
+
+    },
+    licensePlate: {
+      label: '杞︾墝鍙�', minWidth: 120,
+      display: false,
+    },
+
+  }
+})
+const connectHangOption = ref({
+  menuBtn: false,
+  labelWidth: 120,
+  column: {
+    vehicleId: {
+      label: '鎺ユ寕杞﹁締鍙风爜',
+      display: true,
+      rules: [
+        {
+          required: true,
+          message: "鎺ユ寕杞﹁締鍙风爜涓嶈兘涓虹┖", trigger: "change"
+        }
+      ],
+      type: 'table', suffixIcon: 'search',dataType: 'string',
+      children: {
+        border: true,
+        searchLabelWidth: 100,
+        searchMenuSpan: 5,
+        column: {
+          serviceProviderName: {
+            label: '杞﹁締鏈嶅姟鍟�', minWidth: 130,
+            search: true,
+          },
+          vehicleType: {
+            label: '杞﹁締绫诲瀷', minWidth: 120,
+            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}).then(res => {
+            return callback({
+              total: res.total,
+              data: res.rows || [],
+            })
+          })
+        }
+
+      }
+    },
+    driverId: {
+      label: '鎺ユ寕鍙告満',
+      display: true,
+      rules: [
+        {
+          required: true,
+          message: "鎺ユ寕鍙告満涓嶈兘涓虹┖", trigger: "change"
+        }
+      ],
+      type: 'table', suffixIcon: 'search',dataType: 'string',
+      children: {
+        border: true,
+        searchMenuSpan: 5,
+        column: {
+          vehicleProviderName: {
+            label: '杞﹁締鏈嶅姟鍟�', minWidth: 130,
+            search: true,
+          },
+          driverName: {
+            label: '椹鹃┒鍛樺鍚�', minWidth: 120,
+            search: true,
+          },
+          licenseType: {
+            label: '鍑嗛┚杞﹀瀷', minWidth: 120,
+            type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/license_type',
+            search: true,multiple:true,
+          },
+        },
+
+      },
+      props: {
+        label: 'driverName',
+        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]
+          }
+          getTmsDriver(id).then(res => {
+            return callback(res.data || {})
+          })
+        } else {
+          listTmsDriver({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
+            return callback({
+              total: res.total,
+              data: res.rows || [],
+            })
+          })
+        }
+
+      }
+    },
+
+  }
+})
+
+const goodsTableOption = ref({
+  pageKey: 'TmsGoodsDetail',
+  rowKey: 'id',
+  selection: false,
+  viewBtn: false,
+  column: {
+    productId: {
+      label: '璐у搧鍚嶇О',hide:true,
+      display: true,minWidth: 120, type: 'table', suffixIcon: 'search',dataType: 'string',
+      children: {
+        border: true,
+        searchLabelWidth: 100,
+        searchMenuSpan: 5,
+        column: {
+          productCode: {
+            label: '璐у搧缂栫爜', minWidth: 130,
+            search: true,
+          },
+          productName: {
+            label: '璐у搧鍚嶇О', minWidth: 120,
+            search: true,
+          },
+          grossWeight: {
+            label: '璐у搧閲嶉噺', minWidth: 120,
+            search: true,
+          },
+          netWeight: {
+            label: '璐у搧鍑�閲�', minWidth: 120,
+            search: true,
+          },
+          volume: {
+            label: '璐у搧浣撶Н', minWidth: 120,
+            search: true,
+          },
+          productType: {
+            label: '璐у搧绫诲瀷', minWidth: 120,
+            search: true,
+          },
+        },
+
+      },
+      props: {
+        label: 'productName',
+        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]
+          }
+          getTmsProductInfo(id).then(res => {
+            return callback(res.data || {})
+          })
+        } else {
+          listTmsProductInfo({pageSize: page.pageSize,
+            pageNum: page.currentPage,
+            ...data,
+            customerId:form.value.customerId
+          }).then(res => {
+            return callback({
+              total: res.total,
+              data: res.rows || [],
+            })
+          })
+        }
+
+      },
+      change: (val: any) => {
+        const table = goodsCrudRef.value?.getPropRef?.('productId')?.$refs?.temp;
+        if (!table) return;
+        let active = table.active;
+        if (Array.isArray(active)) active = active[0];
+        if (active) {
+          Object.assign(goodsForm.value, {
+            productId: active.id,
+            productName: active.productName,
+            productType: active.productType,
+            grossWeight: active.grossWeight,
+            netWeight: active.netWeight,
+            volume: active.volume,
+            packUnit: active.packUnit,
+          });
+
+          goodsForm.value.sumWeight = active.grossWeight|| 0 * goodsForm.value.quantity;
+          goodsForm.value.sumNetWeight = active.netWeight || 0* goodsForm.value.quantity;
+          goodsForm.value.sumVolume = active.volume|| 0 * goodsForm.value.quantity;
+
+        }
+      },
+    },
+    productName: {
+      label: '璐у搧鍚嶇О',minWidth: 120,
+      display :false,
+      hide: false,
+    },
+    quantity: {
+      label: '鏁伴噺',
+      addDisplay :true,minWidth: 100,
+      editDisplay :true,
+      viewDisplay :true,
+      value: 1,
+      change:()=>{
+        goodsForm.value.sumWeight = goodsForm.value.grossWeight || 0 * goodsForm.value.quantity;
+        goodsForm.value.sumNetWeight = goodsForm.value.netWeight || 0* goodsForm.value.quantity;
+        goodsForm.value.sumVolume = goodsForm.value.volume || 0 * goodsForm.value.quantity;
+      }
+    },
+    sumWeight: {
+      label: '閲嶉噺(kg)',
+      addDisplay :true,minWidth: 100,append: 'Kg',
+      editDisplay :true,
+      viewDisplay :true,
+    },
+    sumNetWeight: {
+      label: '鍑�閲�(kg)',
+      addDisplay :true,
+      editDisplay :true,minWidth: 100,append: 'Kg',
+      viewDisplay :true,
+    },
+    sumVolume: {
+      label: '浣撶Н(m鲁)',
+      addDisplay :true,
+      editDisplay :true,minWidth: 100,append: 'm鲁',
+      viewDisplay :true,
+    },
+
+
+    loosePieces: {
+      label: '鏁d欢鏁�',
+      addDisplay :true,
+      editDisplay :true,minWidth: 100,
+      viewDisplay :true,
+    },
+
+    fullContainers: {
+      label: '鏁寸鏁�',
+      addDisplay :true,
+      editDisplay :true,minWidth: 100,
+      viewDisplay :true,
+    },
+    containerNo: {
+      label: '闆嗚绠卞彿',
+      addDisplay :true,
+      editDisplay :true,minWidth: 100,
+      viewDisplay :true,
+    },
+    palletCount: {
+      label: '鎵樻暟',
+      addDisplay :true,minWidth: 100,
+      editDisplay :true,
+      viewDisplay :true,
+    }
+  }})
+
+const actualFormOption = ref({
+   menuBtn: false, labelWidth: 140,
+  column:{
+    departureAddress:{
+      label: '瀹為檯鍑哄彂鍦板湴鍧�',
+      span:24,
+    },
+    destinationAddress:{
+      label: '瀹為檯鐩殑鍦板湴鍧�',
+      span:24,
+    },
+    actualLoadStart: {
+      label: '瀹為檯瑁呰溅寮�濮嬫椂闂�',
+      type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
+      format: 'YYYY-MM-DD HH:mm:ss',
+      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+      display: true,
+    },
+    actualUnloadEnd: {
+      label: '瀹為檯鍗歌溅瀹屾垚鏃堕棿',
+      type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
+      format: 'YYYY-MM-DD HH:mm:ss',
+      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+      display: true,
+    },
+    actualDeparture: {
+      label: '瀹為檯鍑哄彂鏃堕棿',
+      type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
+      format: 'YYYY-MM-DD HH:mm:ss',
+      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+      display: true,
+    },
+    actualArrival: {
+      label: '瀹為檯鍒拌揪鏃堕棿',
+      type: 'datetime',  // 鏀逛负 datetime 绫诲瀷
+      format: 'YYYY-MM-DD HH:mm:ss',
+      valueFormat: 'YYYY-MM-DD HH:mm:ss',
+      display: true,
+    },
+    actualQuantity: {
+      label: '瀹炲彂鏁伴噺',type: 'number',
+    },
+    actualWeight: {
+      label: '瀹炲彂閲嶉噺',type: 'number',
+    },
+    actualVolume: {
+      label: '瀹炲彂浣撶Н',type: 'number',
+    },
+    reweighWeight: {
+      label: '澶嶇閲嶉噺',type: 'number',
+    },
+    electronicLock:{
+      label: '鐢靛瓙閿�',
+    }
+  }
+})
+
+
+const {
+  tableData,
+  pageF,
+  rowSave,
+  rowUpdate,
+  rowDel,
+  beforeOpen,
+  searchChange,
+  searchReset,
+  selectionChange,
+  onLoad,
+  currentChange,
+  sizeChange,
+  handleDelete,
+  handleExport,
+  handleUpdate,
+  refreshChange
+} = usePagePlus({
+  form: form,
+  option: option,
+  queryParams: queryParams,
+  idKey: 'id',
+  page: page.value,
+  getListApi: listTmsDispatchOrder,
+  getDetailApi: getTmsDispatchOrder,
+  exportApi: exportTmsDispatchOrder,
+  deleteApi: delTmsDispatchOrder,
+  addApi: addTmsDispatchOrder,
+  updateApi: updateTmsDispatchOrder,
+  handleUpdateFunc: () => {
+    crudRef.value.rowEdit(selectionList.value[0]);
+  },
+  handleSelectionChangeFunc: (selection: any) => {
+    selectionList.value = selection;
+  }
+})
+const handleConfirm = (row: any) => {
+  ElMessageBox.confirm("鏄惁瀵硅皟搴﹀崟鍙�" + row.dispatchNo + "纭畾 锛�", '绯荤粺鎻愮ず', {
+    confirmButtonText: '纭畾',
+    cancelButtonText: '鍙栨秷',
+    type: 'warning'
+  }).then(() => {
+    return confirmOrder(row.id);
+  }).then(() => {
+    onLoad(page.value);
+    ElMessage({
+      message: "鎿嶄綔鎴愬姛锛�",
+      type: 'success'
+    })
+  });
+}
+
+const handleCopy = (row: any) => {
+  ElMessageBox.confirm("鏄惁瀵硅皟搴﹀崟鍙�" + row.dispatchNo + "澶嶅埗 锛�", '绯荤粺鎻愮ず', {
+    confirmButtonText: '纭畾',
+    cancelButtonText: '鍙栨秷',
+    type: 'warning'
+  }).then(() => {
+    return copyOrder(row.id);
+  }).then(() => {
+    onLoad(page.value);
+    ElMessage({
+      message: "鎿嶄綔鎴愬姛锛�",
+      type: 'success'
+    })
+  });
+}
+const handleOk = (row: any) => {
+  ElMessageBox.confirm("鏄惁纭瀹屾垚璋冨害鍗曞彿锛�" + row.dispatchNo + " 鐨勮绋� 锛�", '绯荤粺鎻愮ず', {
+    confirmButtonText: '纭畾',
+    cancelButtonText: '鍙栨秷',
+    type: 'warning'
+  }).then(() => {
+    return okOrder(row.id);
+  }).then(() => {
+    onLoad(page.value);
+    ElMessage({
+      message: "鎿嶄綔鎴愬姛锛�",
+      type: 'success'
+    })
+  });
+}
+/**
+ * 涓婁紶琛岀▼
+ */
+const handleUploadItinerary = (row: any) => {
+  optionType.value = 'addItinerary';
+  boxFormOption.value = itineraryOption.value;
+  boxTableOption.value = itineraryTableOption.value;
+  listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => {
+    boxTableData.value = res.rows || [];
+    pageF.open = true;
+    pageF.title = '涓婁紶琛岀▼';
+
+    boxForm.value = {
+      dispatchOrderId: row.id,
+      dataSource: 0,
+      driverId: row.mainDriverId,
+      driverName: row.mainDriverName,
+      vehicleNumber: row.licensePlate,
+      vehicleId: row.vehicleId,
     }
   })
+}
+const cancelBox = () => {
+  if (optionType.value === 'addItinerary' || optionType.value === 'addFinance') {
+    boxForm.value = {};
+    boxFormRef.value.resetFields();
+  }
+  pageF.open = false;
+}
+
+const submitForm = () => {
+  if (optionType.value === 'addItinerary'){
+    if (Array.isArray(boxForm.value.voucherUrl)) {
+      boxForm.value.voucherUrl = boxForm.value.voucherUrl.toString();
+    }
+    addTmsTrip(boxForm.value).then(res => {
+      ElMessage({
+        message: "鎿嶄綔鎴愬姛锛�",
+        type: 'success'
+      })
+      cancelBox();
+      onLoad(page.value);
+    })
+  }else if (optionType.value === 'addFinance'){
+    if (Array.isArray(boxForm.value.feeVoucherUrl)) {
+      boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString();
+    }
+    addTmsFinanceDetail(boxForm.value).then(res=>{
+      ElMessage({
+        message: "鎿嶄綔鎴愬姛锛�",
+        type: 'success'
+      })
+      cancelBox();
+      onLoad(page.value);
+    })
+  }
 
 
-</script>
+}
+
+
+const handleLog = (row: any) => {
+
+}
+const handleLogItinerary = (row: any) => {
+  optionType.value = 'view';
+  boxTableOption.value = itineraryTableOption.value;
+  listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => {
+    boxTableData.value = res.rows || [];
+    pageF.open = true;
+    pageF.title = '鏌ョ湅琛岀▼';
+    boxFormOption.value.title = '';
+  })
+}
+
+const handleAddFinance = (row:any)=>{
+  optionType.value = 'addFinance';
+  boxFormOption.value = financeOption.value;
+  boxTableOption.value = financeTableOption.value;
+  listTmsFinanceDetail({
+    dispatchOrderId: row.id,financeType:2,
+    pageNum: 1, pageSize: 999}).then(res => {
+    boxTableData.value = res.rows || [];
+    pageF.open = true;
+    pageF.title = '璐圭敤鐧昏';
+    boxForm.value = {
+      dispatchOrderId: row.id,
+      dataSource: 0,
+      financeType:2,
+    }
+  })
+}
+
+const handleGenerate = () => {
+  let ids = selectionList.value.map((item:any) => item.id);
+  initGenerate(ids).then(res => {
+    boxTableData.value = res.data|| [];
+    optionType.value = 'generate';
+    pageF.open = true;
+    pageF.title = '鐢熸垚搴旀敹搴斾粯璐圭敤鏁版嵁';
+    boxTableOption.value = generateTableOption.value;
+  })
+}
+
+const submitGenerate = () => {
+  pageF.isUploading = true;
+  let ids = selectionList.value.map((item:any) => item.id);
+
+  generateTmsDispatchOrder(ids).then(res => {
+    pageF.isUploading = false;
+    ElMessage({
+      message: "鎿嶄綔鎴愬姛锛�",
+      type: 'success'
+    })
+    cancelBox();
+    onLoad(page.value);
+  }).finally(()=>{
+    pageF.isUploading = false;
+  })
+}
+/**
+ * 鐢╂寕
+ */
+const handleDropHook = () => {
+    title.value = '璋冨害鍗曠敥鎸�';
+  open.value = true;
+  form.value = selectionList.value[0];
+  optionType.value = 'dropHook';
+
+}
+/**
+ * 鎺ユ寕
+ */
+const handleConnectHang = () => {
+  title.value = '璋冨害鍗曟帴鎸�';
+  open.value = true;
+  form.value = selectionList.value[0];
+  optionType.value = 'connectHang';
+  boxFormOption.value = connectHangOption.value;
+}
+const submitForm2 = () => {
+  pageF.isUploading = true;
+  if (optionType.value === 'dropHook') {
+    dropHook(form.value.id).then(res => {
+      ElMessage({
+        message: "鎻愪氦鎴愬姛锛�",
+        type: 'success'
+      })
+      cancelBox2();
+      onLoad(page.value);
+    }).finally(()=>{
+      pageF.isUploading = false;
+    })
+  }else{
+    connectHang({
+      dispatchId:form.value.id,
+      vehicleId:form.value.vehicleId,
+      driverId:form.value.driverId
+    }).then(res => {
+      ElMessage({
+        message: "鎻愪氦鎴愬姛锛�",
+        type: 'success'
+      })
+      cancelBox2();
+      onLoad(page.value);
+    }).finally(()=>{
+      pageF.isUploading = false
+    })
+  }
+}
+
+
+const cancelBox2 = () => {
+  open.value = false;
+}
+
+const handleAddGoods = (row: any) => {
+  listTmsGoodsDetail({dispatchId: row.id,pageSize:999,pageNum:1}).then(res=>{
+    goodsTableData.value =  res.rows || [];
+    form.value = row;
+    open2.value = true;
+  })
+}
+const rowGoodsUpdate = (row:any,index:any,done:any, loading:any) => {
+  updateTmsGoodsDetail(row).then(res => {
+    ElMessage({
+      message: "淇敼鎴愬姛锛�",
+      type: 'success'
+    })
+    handleAddGoods(form.value);
+    onLoad(page.value);
+    done();
+  }).catch(()=>{
+    loading()
+  })
+}
+const rowGoodsSave = (row:any, done:any, loading:any) => {
+  row.dispatchId = form.value.id;
+  row.dispatchNo = form.value.dispatchNo;
+  addTmsGoodsDetail(row).then(res=>{
+    ElMessage({
+      message: "鏂板鎴愬姛锛�",
+      type: 'success'
+    })
+    handleAddGoods(form.value);
+    onLoad(page.value);
+    done();
+  }).catch(()=>{
+    loading()
+  })
+}
+const rowGoodsDel = (row:any) => {
+  ElMessageBox.confirm("纭畾灏嗛�夋嫨鏁版嵁鍒犻櫎锛�", '绯荤粺鎻愮ず', {confirmButtonText: '纭畾', cancelButtonText: '鍙栨秷', type: 'warning'}).then(() => {
+    return delTmsGoodsDetail(row.id);
+  }).then(() => {
+    handleAddGoods(form.value);
+    ElMessage({
+      message: "鍒犻櫎鎴愬姛锛�",
+      type: 'success'
+    })
+  });
+}
+
+const handleActual = (row:any) => {
+    actualForm.value = row;
+    open3.value = true;
+
+}
+
+const submitForm3 = ()=>{
+  updateTmsDispatchOrder(actualForm.value).then(res=>{
+    ElMessage({
+      message: "鎿嶄綔鎴愬姛锛�",
+      type: 'success'
+    })
+    open3.value = false;
+    onLoad(page.value)
+  })
+}
+
+
+</script>
\ No newline at end of file

--
Gitblit v1.8.0