zhangback
2025-11-18 f7490c5b05906399fe754fecdb1f32172a01170d
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: '散件数',
                  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: '散件数',
      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>