zhangback
2025-12-05 2a83e96652851ca20794278b9be3607bbe4186fa
ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -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
@@ -46,31 +46,77 @@
        </el-button>
        <el-button
            type="success"
            icon="Delete"
            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>
        <el-button
            type="warning"
            icon="Avatar"
            :disabled="!( isCustoms == 0)"
            @click="handleCustoms"
            v-hasPermi="['tms:tmsDispatchOrder:customs']"
        >委托报关信息
        </el-button>
        <el-button
            type="primary"
            icon="UserFilled"
            :disabled="!( isLoad == 0)"
            @click="handleLoading"
            v-hasPermi="['tms:tmsDispatchOrder:loading']"
        >委托卸货信息
        </el-button>
      </template>
      <template #menu-before="{row}">
        <el-link size="small" type="primary" @click="handleAddGoods(row)" class="link-btn"
                 v-hasPermi="['tms:tmsGoodsDetail:add']"
                 :underline="false" icon="el-icon-document-add">运输货品登记
        </el-link>
        <el-link size="small" type="primary" @click="handleActual(row)" class="link-btn"
                 v-hasPermi="['tms:tmsDispatchOrder:update']"
                 :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"
                 v-hasPermi="['tms:tmsDispatchOrder:confirmOrder']"
                 :underline="false" icon="el-icon-pointer">确定
        </el-link>
        <el-link size="small" type="primary" @click="handleCopy(row)" class="link-btn" :underline="false"
                 v-hasPermi="['tms:tmsDispatchOrder:copyOrder']"
                 icon="el-icon-connection">复制
        </el-link>
        <el-link size="small" type="primary" v-if="[1,2].includes(row.status)" @click="handleUploadItinerary(row)"
                 v-hasPermi="['tms:tmsTrip:add']"
                 class="link-btn" :underline="false" icon="el-icon-upload">上传行程
        </el-link>
        <el-link size="small" type="primary" v-if="![0,1].includes(row.status)" @click="handleLogItinerary(row)"
                 v-hasPermi="['tms:tmsTrip:list']"
                 class="link-btn" :underline="false" icon="el-icon-view">查看行程
        </el-link>
        <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn"
                 v-hasPermi="['tms:tmsDispatchOrder:okOrder']"
                 :underline="false" icon="el-icon-circle-check">完成行程
        </el-link>
        <el-link size="small" type="primary" v-if="[2,3].includes(row.status)" @click="handleAddFinance(row)" class="link-btn"
        <el-link size="small" type="primary" v-if="[2,3].includes(row.status)" @click="handleAddFinance(row)"
                 class="link-btn" v-hasPermi="['tms:tmsFinanceDetail:add']"
                 :underline="false" icon="el-icon-edit-pen">费用登记
        </el-link>
      </template>
@@ -79,9 +125,46 @@
                 icon="el-icon-tickets">日志
        </el-link>
      </template>
      <template #shipperId-form>
        <div style="display:flex; align-items: center;justify-content: space-between">
          <avue-input-table :props="consignorProps"
                            :children="consignorOption"
                            :on-load="onShipperLoad" suffixIcon="search"
                            v-model="form.shipperId" style="width: 80%"
                            @change="changeShipper"
                            placeholder="请选择装货点"></avue-input-table>
          <el-button icon="plus" @click="handleAddShipper"></el-button>
        </div>
      </template>
      <template #receiverId-form>
        <div style="display:flex; align-items: center;justify-content: space-between">
          <avue-input-table :props="consignorProps"
                            :children="consignorOption"
                            :on-load="onConsignorLoad" suffixIcon="search"
                            v-model="form.receiverId"
                            @change="changeReceiver" style="width: 80%"
                            placeholder="请选择卸货点"></avue-input-table>
          <el-button icon="plus" @click="handleAddReceiver"></el-button>
        </div>
      </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">
      <h2 v-if="optionType == 'addFinance'">报价费用</h2>
      <avue-crud v-if="optionType == 'addFinance'"
                 :option="itemsTableOption"
                 :data="itemsTableData"
                 @selection-change="selectionChange2"
      >
        <template #count="{row}">
          <el-input-number v-model="row.count" @change="countChange(row)" placeholder="请输入计费数量"
                           min="0"></el-input-number>
        </template>
      </avue-crud>
      <h2 v-if="optionType == 'addFinance'">实报实销费用</h2>
      <avue-form v-if="optionType == 'addItinerary' || optionType == 'addFinance'" v-model="boxForm" ref="boxFormRef"
                 :option="boxFormOption">
      </avue-form>
      <avue-crud
@@ -91,11 +174,13 @@
      </avue-crud>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" v-if="optionType == 'addItinerary' || optionType == 'addFinance'" :loading="pageF.isUploading" @click="submitForm">
          <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">
          <el-button type="primary" v-if="optionType == 'generate' " :loading="pageF.isUploading"
                     @click="submitGenerate">
            {{ pageF.isUploading ? '生成中' : '生成费用' }}
          </el-button>
          <el-button @click="cancelBox">取 消</el-button>
@@ -103,6 +188,111 @@
      </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>
      <div v-if="optionType == 'customs'">
        <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.projectName }}</el-descriptions-item>
          <el-descriptions-item label="运输路线">{{ form.transportLine }}</el-descriptions-item>
        </el-descriptions>
        <avue-form v-model="form" ref="boxFormRef" :option="boxFormOption">
        </avue-form>
      </div>
      <div v-if="optionType == 'loading'">
        <el-descriptions style="margin-bottom: 20px"
                         :column="2"
                         border
        >
          <el-descriptions-item label="调度单号">{{ form.dispatchNo }}</el-descriptions-item>
          <el-descriptions-item label="客户">{{ form.customerName }}</el-descriptions-item>
          <el-descriptions-item label="项目名称">{{ form.projectName }}</el-descriptions-item>
          <el-descriptions-item label="运输路线">{{ form.transportLine }}</el-descriptions-item>
        </el-descriptions>
        <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>
@@ -117,10 +307,10 @@
  getTmsDispatchOrder,
  listTmsDispatchOrder,
  updateTmsDispatchOrder,
  confirmOrder, copyOrder, okOrder
  confirmOrder, copyOrder, okOrder, initGenerate, generateTmsDispatchOrder, dropHook, connectHang,customsOrder,loadingOrder,
} from "@/api/tms/tmsDispatchOrder";
import useCurrentInstance from "@/utils/useCurrentInstance";
import {computed, onMounted, reactive, ref, toRefs, watch} from "vue";
import {computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance} from "vue";
import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
import {usePagePlus} from "@/hooks/usePagePlus";
import {hasPermission} from "@/utils/permissionUtils";
@@ -132,14 +322,26 @@
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 {addTmsConsignor, getTmsConsignor, listTmsConsignor} from "@/api/tms/tmsConsignor";
import {ElMessage, ElMessageBox} from "element-plus";
import {addTmsTrip, listTmsTrip} from "@/api/tms/tmsTrip";
import {addTmsFinanceDetail, listTmsFinanceDetail} from "@/api/tms/tmsFinanceDetail";
import {addTmsFinanceDetail, listTmsFinanceDetail, updateTmsFinanceDetail} from "@/api/tms/tmsFinanceDetail";
import {getTmsProductInfo, listTmsProductInfo} from "@/api/tms/tmsProductInfo";
import {addTmsGoodsDetail, delTmsGoodsDetail, listTmsGoodsDetail, updateTmsGoodsDetail} from "@/api/tms/tmsGoodsDetail";
import {getTransportRouteVi, listTransportRouteVi} from "@/api/tms/tmsTransportRouteVi";
import {listTmsQuoteItem} from "@/api/tms/tmsQuotePlanItem";
import {$DialogForm} from '@smallwei/avue'
import {getTmsCustomerInfo, listTmsCustomerInfo} from "@/api/tms/tmsCustomerInfo";
import {getAddressCode} from "@/api/tms/tmsRegion";
import {mapRegeo} from "@/api/common";
const {appContext} = getCurrentInstance();
const {proxy} = useCurrentInstance();
const crudRef = ref();
const boxFormRef = ref();
const goodsCrudRef = ref();
const actualFormRef = ref();
const permissionList = (key: any, row: any, index: any) => {
@@ -148,7 +350,7 @@
  } 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)
    return hasPermission(["tms:tmsDispatchOrder:edit"]) && [0, 1].includes(row?.status)
  } else if (key == 'viewBtn') {
    return hasPermission(["tms:tmsDispatchOrder:query"])
  } else {
@@ -168,11 +370,23 @@
  boxTableData: <any>[],
  boxForm: <any>{},
  boxFormOption: <any>{},
  boxTableOption: <any>{}
  boxTableOption: <any>{},
  title: '',
  open: false,
  open2: false,
  goodsTableData: <any>[],
  selectionList2: <any>[],
  goodsForm: <any>{},
  open3: false,
  actualForm: <any>{},
  isCustoms:<any> -1,
  isLoad: -1,
})
const {queryParams, form, page, selectionList,
const {
  queryParams, form, page, selectionList, open3,
  boxTableData, optionType,
  boxFormOption,boxForm,boxTableOption
  boxFormOption, boxForm, boxTableOption, title, open, open2,
  goodsTableData, goodsForm, actualForm, selectionList2,isCustoms,isLoad
} = toRefs(data);
const option = ref({
  pageKey: 'TmsDispatchOrder',
@@ -180,81 +394,81 @@
  labelWidth: 130,
  searchSpan: 6,
  searchLabelWidth: 150,
  menuWidth: 300,
  group: [
    {
      label: '基本信息',
      prop: 'jbxx',
      column: {
        projectId: {
          label: '关联项目',
        quoteDetailId: {
          label: '运输线路', span: 24,
          display: true,
          rules: [
            {
              required: true,
              message: "关联项目不能为空", trigger: "change"
              message: "请选择运输路线", trigger: "change"
            }
          ],
          type: 'table', suffixIcon: 'search',dataType: 'string',
          change: (val: any) => {
            const table = crudRef.value?.getPropRef?.('projectId')?.$refs?.temp;
            const table = crudRef.value?.getPropRef?.('quoteDetailId')?.$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,
                quoteDetailId: active.quoteDetailId,
                transportLine: active.transportRoute,
                startRegionCode: active.startRegionCode,
                endRegionCode: active.endRegionCode,
                projectId: active.projectId,
                projectName: active.projectName,
                customerId: active.relatedCustomerId,
                customerName: active.relatedCustomerName,
                contractId: active.relatedContractId,
                contractName: active.relatedContractName,
                customerId: active.customerId,
                customerName: active.customerFullName,
                customerCode: active.customerCode,
                contractId: active.contractId,
                contractName: active.contractName,
                requiredVehicleTypes: active.vehicleType,
                quotePlanId: active.quotePlanId,
              });
            }
          },
          type: 'table', suffixIcon: 'search',
          children: {
            border: true,
            searchMenuSpan: 5,
            column: {
              transportRoute: {
                label: '运输路线', minWidth: 130,
                search: true,
              },
              customerFullName: {
                label: '客户全称', minWidth: 120,
                search: true,
              },
              projectName: {
                label: '项目名称', minWidth: 130,
                search: true,
              },
              projectCode: {
                label: '项目编号', minWidth: 120,
                search: true,
              },
              relatedContractName: {
                label: '关联合同',
                label: '关联项目',
                display: false, minWidth: 150,
                search: true,
              },
              relatedCustomerName: {
                label: '关联客户',
              contractName: {
                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,
              vehicleType: {
                label: '车型', dataType: 'string',
                type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', minWidth: 150,
                hide: false,
                search: true,
                rules: [
                  {
                    required: true,
                    message: "状态不能为空", trigger: "blur"
                  }
                ],
              },
            },
          },
          props: {
            label: 'projectName',
            value: 'id'
            label: 'transportRoute',
            value: 'quoteDetailId'
          },
          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
            if (value) {
@@ -262,11 +476,11 @@
              if (Array.isArray(value)) {
                id = value[0]
              }
              getTmsProject(id).then(res => {
              getTransportRouteVi(id).then(res => {
                return callback(res.data || {})
              })
            } else {
              listTmsProject({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
              listTransportRouteVi({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
                return callback({
                  total: res.total,
                  data: res.rows || [],
@@ -275,10 +489,13 @@
            }
          }
        },
        customerName: {
          label: '客户名称',
          display: true, disabled: true
        },
        projectName: {
          label: '关联项目',
          display: true, disabled: true
        },
        // customerCode: {
@@ -286,10 +503,19 @@
        //   display: true,disabled:true
        // },
        contractName: {
          label: '关联合同名称',
          label: '关联合同',
          display: true, disabled: true
        },
        requiredVehicleTypes: {
          label: '下单车型', disabled: true,
          display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
          rules: [
            {
              required: true,
              message: "下单车型不能为空", trigger: "blur"
            }
          ],
        },
        orderType: {
          label: '订单类型',
          display: true,
@@ -301,16 +527,278 @@
              message: "订单类型不能为空", trigger: "change"
            }
          ],
          change: ({value}: any) => {
            option.value.group.forEach((item: any) => {
              if (item.prop == 'pcxx') {
                item.column.shipperId.rules.forEach((cItem: any) => {
                  cItem.required = !(value == 1);
                });
                item.column.receiverId.rules.forEach((cItem: any) => {
                  cItem.required = !(value == 1);
                });
              }
            })
          }
        },
        signType: {
          label: '签收类型',
        // signType: {
        //   label: '签收类型',
        //   display: true,
        //   type: 'select', dataType: 'string',
        //   dicUrl: '/system/dict/data/type/sign_type',
        //   rules: [
        //     {
        //       required: true,
        //       message: "签收类型不能为空", trigger: "change"
        //     }
        //   ],
        // },
        // 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 || [],
        //         })
        //       })
        //     }
        //
        //   }
        // },
        isCustoms: {
          label: '委托报关',
          display: true,
          type: 'select', dataType: 'string',
          dicUrl: '/system/dict/data/type/sign_type',
          type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
          rules: [
            {
              required: true,
              message: "签收类型不能为空", trigger: "change"
              message: "委托报关不能为空", trigger: "blur"
            }
          ],
        },
        isLoad: {
          label: '委托装卸',
          display: true,
          type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
          rules: [
            {
              required: true,
              message: "委托装卸不能为空", trigger: "blur"
            }
          ],
        },
        isUrgent: {
          label: '是否紧急',
          display: true,
          type: 'radio', 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',
        // },
        latestDeparture: {
          label: '要求最晚出发时间',
          type: 'datetime',  // 改为 datetime 类型
          format: 'YYYY-MM-DD HH:mm:ss', labelWidth: 150,
          valueFormat: 'YYYY-MM-DD HH:mm:ss',
          display: true,
          rules: [
            {
              required: true,
              message: "要求最晚出发时间不能为空", trigger: "blur"
            }
          ],
        },
        latestArrival: {
          label: '要求最晚到达时间', labelWidth: 150,
          type: 'datetime',  // 改为 datetime 类型
          format: 'YYYY-MM-DD HH:mm:ss',
          valueFormat: 'YYYY-MM-DD HH:mm:ss',
          display: true,
          rules: [
            {
              required: true,
              message: "要求最晚到达时间不能为空", trigger: "blur"
            }
          ],
        },
      }
    },
    {
      label: '派车信息',
      prop: 'pcxx',
      column: {
        operationMode: {
          label: '是否是自营车队', value: 0,
          type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_number_is',
          rules: [
            {
              required: true,
              message: "是否是自营车队不能为空", trigger: "change"
            }
          ],
          change: ({value}: any) => {
            console.log(value)
            option.value.group.forEach((item: any) => {
              if (item.prop == 'pcxx') {
                item.column.commissionModel.display = value != 1;
                item.column.vehicleProviderId.display = value == 1;
                // item.column.vehicleProviderId.rules.forEach((cItem: any) => {
                //   cItem.required = value == 1;
                // });
              }
            })
          },
        },
        commissionModel:{
          label: '提成模式',
          display: true, type: 'radio', dicUrl: '/system/dict/data/type/commission_model', dataType: 'string',
          rules: [
            {
              required: true,
              message: "提成模式不能为空", trigger: "change"
            }
          ],
        },
@@ -335,7 +823,7 @@
              });
            }
          },
          type: 'table', suffixIcon: 'search',
          type: 'table', suffixIcon: 'search',dataType: 'string',
          children: {
            border: true,
            searchLabelWidth: 100,
@@ -400,170 +888,9 @@
          }
        },
        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',
          display: true, dataType: 'string',
          rules: [
            {
              required: true,
@@ -598,7 +925,7 @@
              licenseType: {
                label: '准驾车型', minWidth: 120,
                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/license_type',
                search: true,multiple:true,
                search: true, multiple: true,
              },
            },
@@ -617,7 +944,11 @@
                return callback(res.data || {})
              })
            } else {
              listTmsDriver({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
              listTmsDriver({
                pageSize: page.pageSize,
                pageNum: page.currentPage, ...data,
                carrierType: form.value.operationMode
              }).then(res => {
                return callback({
                  total: res.total,
                  data: res.rows || [],
@@ -631,7 +962,7 @@
        },
        assistantDriverId: {
          label: '副驾驶员',
          display: true,dataType: 'string',
          display: true, dataType: 'string',
          change: (val: any) => {
            const table = crudRef.value?.getPropRef?.('assistantDriverId')?.$refs?.temp;
            if (!table) return;
@@ -658,7 +989,7 @@
                search: true,
              },
              licenseType: {
                label: '准驾车型', minWidth: 120,multiple:true,
                label: '准驾车型', minWidth: 120, multiple: true,
                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/license_type',
                search: true,
              },
@@ -679,7 +1010,11 @@
                return callback(res.data || {})
              })
            } else {
              listTmsDriver({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
              listTmsDriver({
                pageSize: page.pageSize,
                pageNum: page.currentPage, ...data,
                carrierType: form.value.operationMode
              }).then(res => {
                return callback({
                  total: res.total,
                  data: res.rows || [],
@@ -690,22 +1025,8 @@
          }
        },
        requiredVehicleTypes: {
          label: '要求车型',
          display: true, type: 'select', dicUrl: '/system/dict/data/type/license_type', dataType: 'string',
          rules: [
            {
              required: true,
              message: "要求车型不能为空", trigger: "blur"
            }
          ],
        },
        actualVehicleType: {
          label: '实际运输工具类型',
          display: true, type: 'select', dicUrl: '/system/dict/data/type/license_type', dataType: 'string',
        },
        vehicleId: {
          label: '车牌号',dataType: 'string',
          label: '车牌号', dataType: 'string',
          display: true,
          rules: [
            {
@@ -772,7 +1093,11 @@
                return callback(res.data || {})
              })
            } else {
              listTmsVehicle({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
              listTmsVehicle({
                pageSize: page.pageSize,
                pageNum: page.currentPage, ...data,
                carrierType: form.value.operationMode
              }).then(res => {
                return callback({
                  total: res.total,
                  data: res.rows || [],
@@ -782,6 +1107,57 @@
          }
        },
        actualVehicleType: {
          label: '派出车型',
          display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
        },
        shipperId: {
          label: '装货点', dataType: 'string',
          display: true,
          rules: [
            {
              required: false,
              message: "装货点不能为空", trigger: "change"
            }
          ],
        },
        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"
            }
          ],
        },
        receiverRegionLabel: {
          label: '卸货点行政区域',
          display: true, disabled: true
        },
        receiverAddress: {
          label: '卸货点详细地址',
          display: true, disabled: true
        },
        receiverMobile: {
          label: '卸货点联系方式',
          display: true, disabled: true
        },
        containerId: {
          label: '关联集装箱信息',
@@ -798,7 +1174,7 @@
              });
            }
          },
          type: 'table', suffixIcon: 'search',
          type: 'table', suffixIcon: 'search',dataType: 'string',
          children: {
            border: true,
            searchLabelWidth: 100,
@@ -863,7 +1239,7 @@
              });
            }
          },
          type: 'table', suffixIcon: 'search',
          type: 'table', suffixIcon: 'search',dataType: 'string',
          children: {
            border: true,
            searchLabelWidth: 100,
@@ -910,330 +1286,83 @@
          }
        },
      }
    },
    {
      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: 'date', valueFormat: 'YYYY-MM-DD',
          display: true,
        },
        latestDeparture: {
          label: '要求最晚出发时间',
          type: 'date', valueFormat: 'YYYY-MM-DD',
          display: true,
        },
        earliestArrival: {
          label: '要求最早到达时间',
          type: 'date', valueFormat: 'YYYY-MM-DD',
          display: true,
        },
        latestArrival: {
          label: '要求最晚到达时间',
          type: 'date', valueFormat: 'YYYY-MM-DD',
          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,
        },
      }
    }
      },
    },
    // {
    //   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,
    //     },
    //
    //   }
    // },
    // {
    //   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: {
@@ -1318,7 +1447,7 @@
      label: '实际运输工具类型', minWidth: 130,
      display: false,
      search: true,
      type: 'select', dicUrl: '/system/dict/data/type/license_type', dataType: 'string',
      type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
    },
@@ -1329,12 +1458,12 @@
    },
    shipperName: {
      label: '发货人名称',
      label: '装货点名称',
      display: false, minWidth: 120,
      search: true,
    },
    receiverName: {
      label: '收货人名称', minWidth: 120,
      label: '卸货点名称', minWidth: 120,
      display: false,
      search: true,
    },
@@ -1385,7 +1514,21 @@
      hide: false,
      search: false,
    },
    updateTimeRange: {
      label: '更新时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      valueFormat: 'YYYY-MM-DD',
    },
    confirmTimeRange: {
      label: '确认时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      valueFormat: 'YYYY-MM-DD',
    },
    okTimeRange: {
      label: '完成时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      valueFormat: 'YYYY-MM-DD',
    },
  }
})
@@ -1449,14 +1592,10 @@
    voucherUrl: {
      label: '行程凭证',
      display: true,
      span: 24, dataType: 'string',
      type: 'upload',
      multiple: true,
      span: 24,
      propsHttp: {
        url: 'url',
        name: 'name',
        res: 'data'
      },
      action: '/common/upload2',
    },
    dataSource: {
      label: '数据来源',
@@ -1509,6 +1648,10 @@
    voucherUrl: {
      label: '行程凭证',
      display: true,
      span: 24, dataType: 'string',
      type: 'upload',
      action: '/common/upload2',
    },
  }
@@ -1543,14 +1686,11 @@
    voucherUrl: {
      label: '行程凭证',
      display: true,
      type: 'upload',
      multiple: true,
      span: 24,
      propsHttp: {
        url: 'url',
        name: 'name',
        res: 'data'
      },
      accept: 'string', dataType: 'string',
      type: 'upload',
      action: '/common/upload2',
    },
    dataSource: {
      label: '数据来源',
@@ -1594,6 +1734,11 @@
    feeVoucherUrl: {
      label: '费用凭证',
      display: true,
      span: 24,
      accept: 'string', dataType: 'object',
      type: 'upload',
      action: '/common/upload2',
    },
  }
@@ -1604,14 +1749,14 @@
  addBtn: false,
  header: false, selection: false,
  column: {
    accountsReceivableName: {
    collectionPlanName: {
      label: '匹配应收方案名称', minWidth: 160,
    },
    accountsReceivableStatus: {
      label: '应收费用生成状态', minWidth: 160,
      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/accounts_status',
    },
    accountsPayableName: {
    paymentPlanName: {
      label: '匹配应付方案名称', minWidth: 160,
    },
@@ -1632,21 +1777,21 @@
      display: false,
    },
    shipperName: {
      label: '发货人名称',
      label: '装货点名称',
      display: false, minWidth: 120,
    },
    receiverName: {
      label: '收货人名称', minWidth: 120,
      label: '卸货点名称', minWidth: 120,
      display: false,
    },
    transportLine: {
      label: '运输线路',
      display: false,minWidth: 180, overHidden: true
      display: false, minWidth: 180, overHidden: true
    },
    actualVehicleType: {
      label: '车型', minWidth: 130,
      display: false,
      type: 'select', dicUrl: '/system/dict/data/type/license_type', dataType: 'string',
      type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
    },
    licensePlate: {
@@ -1656,7 +1801,583 @@
  }
})
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 customsOption = ref({
  menuBtn: false,
  labelWidth: 120,
  column: {
    customsServiceProviderId: {
      label: '报关服务商', span:24,
      display: true,
      rules: [
        {
          required: true,
          message: "报关服务商不能为空", trigger: "change"
        }
      ],
      type: 'table', suffixIcon: 'search', dataType: 'string',
      change: (val: any) => {
        const table = boxFormRef.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,
          });
        }
      },
      children: {
        border: true,
        searchLabelWidth: 100,
        searchMenuSpan: 5,
        column:{
          serviceCode: {
            label: '服务商编码',
            search: true,
          },
          serviceShortName: {
            label: '服务商简称',minWidth:150,
            search: true,
          },
          serviceName: {
            label: '服务商全称',search: true,
          },
          serviceType: {
            label: '服务类型',minWidth:150,
            type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/service_type',
            multiple:true,
            search: true,
          },
        }
      },
      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 || [],
            })
          })
        }
      }
    },
  }
})
const loadingOption = ref({
  menuBtn: false,
  labelWidth: 120,
  column: {
    loadingServiceProviderId: {
      label: '装卸服务商',span:24,
      display: true,
      rules: [
        {
          required: true,
          message: "装卸服务商不能为空", trigger: "change"
        }
      ],
      type: 'table', suffixIcon: 'search', dataType: 'string',
      change: (val: any) => {
        const table = boxFormRef.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,
          });
        }
      },
      children: {
        border: true,
        searchLabelWidth: 100,
        searchMenuSpan: 5,
        column:{
          serviceCode: {
            label: '服务商编码',
            search: true,
          },
          serviceShortName: {
            label: '服务商简称',minWidth:150,
            search: true,
          },
          serviceName: {
            label: '服务商全称',search: true,
          },
          serviceType: {
            label: '服务类型',minWidth:150,
            type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/service_type',
            multiple:true,
            search: true,
          },
        }
      },
      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 || [],
            })
          })
        }
      }
    },
  }
})
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 itemsTableOption = ref({
  pageKey: 'itemsTable',
  rowKey: 'rowKey',
  header: false,
  addBtn: false, menu: false,
  column: {
    feeType: {
      label: '费用名称',
    },
    unit: {
      label: '*计量单位',
    },
    price: {
      label: '*计费金额',
    },
    currency: {
      label: '币制',
    },
    count: {
      label: '计费数量', minWidth: 130,
    },
    sum: {
      label: '总金额',
    }
  }
})
const consignorOption = ref({
  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,
    },
  },
})
const consignorProps = ref({
  label: 'consignorName',
  value: 'id'
})
const itemsCrudRef = ref()
const itemsTableData = ref<any>([])
const {
  tableData,
@@ -1692,7 +2413,24 @@
  },
  handleSelectionChangeFunc: (selection: any) => {
    selectionList.value = selection;
  }
    if (selection.length > 0){
      isCustoms.value = selection[0].isCustoms;
      isLoad.value = selection[0].isLoad ;
    }else{
      isCustoms.value = -1;
      isLoad.value = -1;
    }
    isCustoms.value = isCustoms.value == 0 && !pageF.single ? 0 : -1;
    isLoad.value = isLoad.value == 0 && !pageF.single ? 0 : -1;
    console.log(pageF.single)
  },
  getBeginListFunc: () => {
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.createTimeRange, 'createTime') || {};
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.updateTimeRange, 'updateTime') || {};
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.confirmTimeRange, 'confirmTime') || {};
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.okTimeRange, 'okTime') || {};
  },
})
const handleConfirm = (row: any) => {
  ElMessageBox.confirm("是否对调度单号" + row.dispatchNo + "确定 ?", '系统提示', {
@@ -1771,7 +2509,7 @@
}
const submitForm = () => {
  if (optionType.value === 'addItinerary'){
  if (optionType.value === 'addItinerary') {
    if (Array.isArray(boxForm.value.voucherUrl)) {
      boxForm.value.voucherUrl = boxForm.value.voucherUrl.toString();
    }
@@ -1783,11 +2521,19 @@
      cancelBox();
      onLoad(page.value);
    })
  }else if (optionType.value === 'addFinance'){
  } else if (optionType.value === 'addFinance') {
    if (Array.isArray(boxForm.value.feeVoucherUrl)) {
      boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString();
    }
    addTmsFinanceDetail(boxForm.value).then(res=>{
    let filter = selectionList2.value.filter((item: any) => {
      return !item.count
    });
    if (filter.length > 0) {
      proxy.$modal.msgError("勾选报价费用请填写计费数量");
      return;
    }
    boxForm.value.items = selectionList2.value;
    addTmsFinanceDetail(boxForm.value).then(res => {
      ElMessage({
        message: "操作成功!",
        type: 'success'
@@ -1815,39 +2561,754 @@
  })
}
const handleAddFinance = (row:any)=>{
const handleAddFinance = async (row: any) => {
  optionType.value = 'addFinance';
  boxFormOption.value = financeOption.value;
  boxTableOption.value = financeTableOption.value;
  const quotePlanItemRes = await listTmsQuoteItem({quotePlanId: row.quotePlanId, pageNum: 1, pageSize: 999});
  let items = quotePlanItemRes.rows || [];
  itemsTableData.value = items.map((item: any) => {
    return {
      rowKey: item.id,
      feeType: item.freeName,
      unit: item.unit,
      price: item.price,
      currency: item.currency,
      count: 0,
      sum: 0,
    }
  })
  listTmsFinanceDetail({
    dispatchOrderId: row.id,financeType:2,
    pageNum: 1, pageSize: 999}).then(res => {
    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,
      financeType: 2,
    }
  })
}
const handleGenerate = () => {
  optionType.value = 'generate';
  pageF.open = true;
  pageF.title = '生成应收应付费用数据';
  boxTableOption.value = generateTableOption.value;
  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 if (optionType.value === 'customs') {
    customsOrder(form.value.id).then(res => {
      ElMessage({
        message: "提交成功!",
        type: 'success'
      })
      cancelBox2();
      onLoad(page.value);
    }).finally(() => {
      pageF.isUploading = false;
    })
  }else if (optionType.value === 'loading') {
    loadingOrder(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;
}
onMounted(() => {
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)
  })
}
const countChange = (row: any) => {
  row.sum = Number(row.price) * Number(row.count);
}
const selectionChange2 = (selection?: any[]) => {
  selectionList2.value = selection;
}
const onShipperLoad = ({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 {
    if (form.value.startRegionCode) {
      const split = form.value.startRegionCode.split(',');
      const [provinceId, cityId, districtId, streetId] = split;
      if (provinceId) data.provinceId = provinceId;
      if (cityId) data.cityId = cityId;
      if (districtId) data.districtId = districtId;
      if (streetId) data.streetId = streetId;
    }
    listTmsConsignor({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
      return callback({
        total: res.total,
        data: res.rows || [],
      })
    })
  }
}
const onConsignorLoad = ({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 {
    if (form.value.endRegionCode) {
      const split = form.value.endRegionCode.split(',');
      const [provinceId, cityId, districtId, streetId] = split;
      if (provinceId) data.provinceId = provinceId;
      if (cityId) data.cityId = cityId;
      if (districtId) data.districtId = districtId;
      if (streetId) data.streetId = streetId;
    }
    listTmsConsignor({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
      return callback({
        total: res.total,
        data: res.rows || [],
      })
    })
  }
}
const changeShipper = ({value}: any) => {
  if (value) {
    let id = value;
    if (Array.isArray(value)) {
      id = value[0]
    }
    getTmsConsignor(id).then(res => {
      let active = res.data || {};
      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
      });
    })
  }
}
const changeReceiver = ({value}: any) => {
  if (value) {
    let id = value;
    if (Array.isArray(value)) {
      id = value[0]
    }
    getTmsConsignor(id).then(res => {
      let active = res.data || {};
      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,
      });
    })
  }
}
const consignorAddOption =ref({
  labelWidth: 120,
  group: [
    {
      label: '基础信息',
      prop: 'jcxx',
      column:{
        // consignorCode: {
        //   label: '装卸货点编码',minWidth: 150,
        //   addDisplay: false, disabled: true,
        //   editDisplay: true,
        //   viewDisplay: true,
        //   hide: false,
        //   search: true,
        //   rules: [
        //     {
        //       required: true,
        //       message: "装卸货点编码不能为空", trigger: "blur"
        //     }
        //   ],
        // },
        consignorName: {
          label: '装卸货点名称',minWidth: 150,
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          hide: false,
          search: true,
          rules: [
            {
              required: true,
              message: "装卸货点名称不能为空", trigger: "blur"
            }
          ],
        },
        customerName:{
          label: '所属客户',minWidth: 150,disabled: true,
        },
        // customerId: {
        //   label: '所属客户',minWidth: 150,
        //   addDisplay: true,
        //   editDisplay: true,suffixIcon:'search',
        //   viewDisplay: true,
        //   hide: true,
        //   search: true,
        //   rules: [
        //     {
        //       required: true,
        //       message: "所属客户不能为空", trigger: "change"
        //     }
        //   ],
        //   type: 'table',
        //   children:{
        //     border: true,
        //     searchMenuSpan: 5,
        //     column:{
        //       customerType: {
        //         label: '客户类型', minWidth: 120,
        //         type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/customer_type',
        //         search: true,
        //       },
        //       customerShortName: {
        //         label: '客户简称', minWidth: 130,
        //         search: true,
        //       },
        //       customerCode: {
        //         label: '客户编号',minWidth: 120,
        //         search: true,
        //       },
        //       contactName: {
        //         label: '联系人姓名',minWidth: 120,
        //       },
        //       signCompanyName: {
        //         label: '签约公司', minWidth: 150,
        //       },
        //     },
        //
        //   },
        //   props:{
        //     label: 'customerShortName',
        //     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]
        //       }
        //       getTmsCustomerInfo(id).then(res=>{
        //         return callback(res.data||{})
        //       })
        //     }else{
        //       listTmsCustomerInfo({pageSize:page.pageSize,pageNum:page.currentPage,...data}).then(res=>{
        //         return callback({
        //           total: res.total,
        //           data: res.rows||[],
        //         })
        //       })
        //     }
        //
        //   },
        //   change: ({value}: any) => {
        //     if(value){
        //       getTmsCustomerInfo(value).then(res=>{
        //         let active = res.data || {};
        //         if (active){
        //           console.log(dialForm.value)
        //           form2.value.customerId = active.id
        //           form2.value.customerSysCode = active.customerCode
        //           form2.value.customerName = active.customerShortName
        //         }
        //       })
        //     }
        //   },
        // },
        // customerSysCode: {
        //   label: '客户编码',minWidth: 150,
        //   addDisplay: true,
        //   editDisplay: true,
        //   viewDisplay: true,
        //   hide: false,
        //   search: true,
        //   disabled: true,
        //   rules: [
        //     {
        //       required: true,
        //       message: "客户编码不能为空", trigger: "blur"
        //     }
        //   ],
        // },
        consignorType: {
          label: '装卸货点类型',minWidth: 150,
          type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/consignor_type',
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          hide: false,
          search: true,
          rules: [
            {
              required: true,
              message: "装卸货点类型不能为空", trigger: "change"
            }
          ],
        },
      }
    },
    {
      label: '联系人信息',
      prop: 'lxrxx',
      column:{
        contactName: {
          label: '联系人姓名',minWidth: 150,
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          hide: false,
          search: true,
          rules: [
            {
              required: true,
              message: "联系人姓名不能为空", trigger: "blur"
            }
          ],
        },
        contactPhone: {
          label: '联系人电话',minWidth: 150,
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          hide: true,
          search: false,
        },
        contactEmail: {
          label: '联系人邮箱',minWidth: 150,
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
          hide: true,
          search: false,
        },
      }
    },
    {
      label: '地址信息',
      prop: 'dzxx',
      column:{
        mapLocationDetail: {
          label: '地图位置',minWidth: 150,
          addDisplay: true,
          editDisplay: true,span:24,
          viewDisplay: true,
          hide: true,
          search: false,
          type: 'map',
          // mapChange: async (params:any)=>{
          //   if (params.info === "OK") {
          //     let { province, city, district, township } = params.regeocode.addressComponent || {};
          //     const res = await getAddressCode({province, city, district, township});
          //     const {provinceCode, cityCode, districtCode, townshipCode} = res.data || {};
          //     form2.value.regionLabel = province + " / " + city + " / " + district + " / " + township;
          //     //form2.value.region = [provinceCode, cityCode, districtCode, townshipCode];
          //     form2.value.provinceId = provinceCode;
          //     form2.value.cityId = cityCode;
          //     form2.value.districtId = districtCode;
          //     form2.value.streetId = townshipCode;
          //     form2.value.dispatchTransportArea = params.regeocode.formattedAddress;
          //     console.log(form2.value,"form2")
          //   }
          // },
          change: async ({value}:any)=>{
            if (Array.isArray(value) && value.length === 3){
                mapRegeo(value[1], value[0]).then(async res => {
                  let params = res.data || {};
                  if (params.info === "OK") {
                    let {province, city, district, township} = params.regeocode.addressComponent || {};
                    const res = await getAddressCode({province, city, district, township});
                    const {provinceCode, cityCode, districtCode, townshipCode} = res.data || {};
                    form2.value.regionLabel = province + " / " + city + " / " + district + " / " + township;
                    form2.value.provinceId = provinceCode;
                    form2.value.cityId = cityCode;
                    form2.value.districtId = districtCode;
                    form2.value.streetId = townshipCode;
                    form2.value.dispatchTransportArea = params.regeocode.formatted_address || params.regeocode.formattedAddress;
                    console.log(form2.value, "form2")
                  }
                });
            }
          },
        },
        // dispatchTransportArea: {
        //   label: '调度单运输地',
        //   addDisplay: true,minWidth: 150,
        //   editDisplay: true,
        //   viewDisplay: true,
        //   hide: false,
        //   search: true,
        //   rules: [
        //     {
        //       required: true,
        //       message: "调度单运输地不能为空", trigger: "blur"
        //     }
        //   ],
        // },
        electronicFenceRange: {
          label: '电子围栏范围',
          addDisplay: true,minWidth: 150,
          editDisplay: true,
          viewDisplay: true,append:'米',
          hide: false,
          search: true,
          rules: [
            {
              required: true,
              message: "电子围栏范围不能为空", trigger: "blur"
            }
          ],
        },
      }
    },
    {
      label: '其他信息',
      prop: 'qtyxx',
      column:{
        remark: {
          label: '备注',minWidth: 150,
          type: 'textarea', minRows: 3, maxRows: 5,
          addDisplay: true,
          editDisplay: true,span:24,
          viewDisplay: true,
          hide: true,
          search: false,
        },
      }
    }
  ],
})
const form2 = ref<any>({});
const dialForm = ref();
const handleAddShipper = () => {
  if (!form.value.customerId){
    return ElMessage.error('请先选择运输路线');
  }
  form2.value = {
    customerId: form.value.customerId,
    customerSysCode: form.value.customerCode,
    customerName: form.value.customerName,
  };
  dialForm.value = $DialogForm(appContext)({
    title: '新增装货地',
    data:form2.value,
    width: '80%',
    option: consignorAddOption.value,
    menuPosition: 'right',
    callback: (res:any,) => {
      let data1 = res.data;
      if (data1.mapLocationDetail){
        data1.mapLocation = data1.mapLocationDetail[0]+','+data1.mapLocationDetail[1];
        data1.addressDetail = data1.mapLocationDetail[2]
      }
      addTmsConsignor({...form2.value,...data1}).then(res2=>{
        let active = res2.data || {};
        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
          });
        }
        dialForm.value.close();
        res.done();
      }).catch(err=>{
        res.done();
      })
    },
  })
}
const handleAddReceiver = () => {
  if (!form.value.customerId){
    return ElMessage.error('请先选择运输路线');
  }
  form2.value = {
    customerId: form.value.customerId,
    customerSysCode: form.value.customerCode,
    customerName: form.value.customerName,
  };
  dialForm.value = $DialogForm(appContext)({
    title: '新增卸货地',
    data:form2.value,
    width: '80%',
    option: consignorAddOption.value,
    menuPosition: 'right',
    callback: (res:any,) => {
      let data1 = res.data;
      if (data1.mapLocationDetail){
        data1.mapLocation = data1.mapLocationDetail[0]+','+data1.mapLocationDetail[1];
        data1.addressDetail = data1.mapLocationDetail[2]
      }
      addTmsConsignor({...form2.value,...data1}).then(res2=>{
        let active = res2.data || {};
        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,
          });
        }
        dialForm.value.close();
        res.done();
      }).catch(err=>{
        res.done();
      })
    },
  })
}
const handleCustoms = () => {
  title.value = '补充委托报关信息';
  open.value = true;
  form.value = selectionList.value[0];
  optionType.value = 'customs';
  boxFormOption.value = customsOption.value;
}
const handleLoading = () => {
  title.value = '补充委托装卸信息';
  open.value = true;
  form.value = selectionList.value[0];
  optionType.value = 'loading';
  boxFormOption.value = loadingOption.value;
}
</script>