sen
2026-03-10 933046f7fd7fa9104bc33862951d570d88d7e2df
ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -1,25 +1,10 @@
<template>
  <basicContainer>
    <avue-crud
        :option="option"
        :table-loading="pageF.loading"
        :data="tableData"
        :page="page"
        :permission="permissionList"
        :before-open="beforeOpen"
        v-model="form" v-model:search="queryParams"
        ref="crudRef"
        @row-update="rowUpdate"
        @row-save="rowSave"
        @refresh-change="refreshChange"
        @row-del="rowDel"
        @search-change="searchChange"
        @search-reset="searchReset"
        @selection-change="selectionChange"
        @current-change="currentChange"
        @size-change="sizeChange"
        @on-load="onLoad"
    >
    <avue-crud :option="option" :table-loading="pageF.loading" :data="tableData" :page="page"
      :permission="permissionList" :before-open="beforeOpen" v-model="form" v-model:search="queryParams" ref="crudRef"
      @row-update="rowUpdate" @row-save="rowSave" @refresh-change="refreshChange" @row-del="rowDel"
      @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
      @current-change="currentChange" @size-change="sizeChange" @on-load="onLoad">
      <template #menu-left>
        <!--        <el-button-->
        <!--            type="success"-->
@@ -36,176 +21,195 @@
        <!--            v-hasPermi="['tms:tmsDispatchOrder:remove']"-->
        <!--        >删除-->
        <!--        </el-button>-->
        <el-button
            type="warning"
            plain
            icon="Download"
            @click="handleExport"
            v-hasPermi="['tms:tmsDispatchOrder:export']"
        >导出
        <el-button type="warning" plain icon="Download" @click="handleExport"
          v-hasPermi="['tms:tmsDispatchOrder:export']">导出
        </el-button>
        <el-button
            type="info"
            icon="Upload"
            @click="handleImport"
            v-hasPermi="['tms:tmsDispatchOrder:import']">导入</el-button>
<!--        <el-button-->
<!--            type="success"-->
<!--            icon="Promotion"-->
<!--            :disabled="pageF.multiple"-->
<!--            @click="handleGenerate"-->
<!--            v-hasPermi="['tms:tmsDispatchOrder:generate']"-->
<!--        >生成应收应付费用-->
<!--        </el-button>-->
        <el-button
            type="warning"
            icon="Female"
            :disabled="pageF.single"
            @click="handleDropHook"
            v-hasPermi="['tms:tmsDispatchOrder:dropHook']"
        >甩挂
        <el-button type="info" icon="Upload" @click="handleImport"
          v-hasPermi="['tms:tmsDispatchOrder:import']">导入</el-button>
        <el-button type="info" plain icon="Document" @click="handleImportLog">导入日志</el-button>
        <!--        <el-button-->
        <!--            type="success"-->
        <!--            icon="Promotion"-->
        <!--            :disabled="pageF.multiple"-->
        <!--            @click="handleGenerate"-->
        <!--            v-hasPermi="['tms:tmsDispatchOrder:generate']"-->
        <!--        >生成应收应付费用-->
        <!--        </el-button>-->
        <el-button type="warning" icon="Female" :disabled="pageF.single" @click="handleDropHook"
          v-hasPermi="['tms:tmsDispatchOrder:dropHook']">甩挂
        </el-button>
        <el-button
            type="primary"
            icon="Male"
            :disabled="pageF.single"
            @click="handleConnectHang"
            v-hasPermi="['tms:tmsDispatchOrder:connectHang']"
        >接挂
        <el-button 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 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 type="primary" icon="UserFilled" :disabled="!(isLoad == 0)" @click="handleLoading"
          v-hasPermi="['tms:tmsDispatchOrder:loading']">委托卸货信息
        </el-button>
        <el-button
            type="primary"
            icon="UserFilled"
            :disabled="pageF.single"
            @click="handleZZ"
            v-hasPermi="['tms:tmsDispatchOrder:zzdj']"
        >增值作业登记
        <el-button type="primary" icon="UserFilled" :disabled="pageF.single" @click="handleZZ"
          v-hasPermi="['tms:tmsDispatchOrder:zzdj']">增值作业登记
        </el-button>
        <el-button
            type="primary"
            icon="Printer"
            :disabled="pageF.single"
            @click="handlePrint"
            v-hasPermi="['tms:tmsDispatchOrder:print']"
        >承运单打印
        <el-button type="primary" icon="Printer" :disabled="pageF.single" @click="handlePrint"
          v-hasPermi="['tms:tmsDispatchOrder:print']">承运单打印
        </el-button>
      </template>
      <template #menu-before="{row}">
        <el-link size="small" type="primary" @click="handleAddGoods(row)" class="link-btn"
                 v-hasPermi="['tms:tmsGoodsDetail:add']" v-if="[0,1,2].includes(row.status)"
                 :underline="false" icon="el-icon-document-add">运输货品登记
        </el-link>
        <el-link size="small" type="primary" @click="handleActual(row)" class="link-btn"
                 v-hasPermi="['tms:tmsDispatchOrder:update']" v-if="[0,1,2].includes(row.status)"
                 :underline="false" 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" v-if="[0,1,2].includes(row.status)" @click="handleClose(row)" class="link-btn"
                 v-hasPermi="['tms:tmsDispatchOrder:closeOrder']"
                 :underline="false" icon="el-icon-close">作废
        </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" v-hasPermi="['tms:tmsFinanceDetail:add']"-->
<!--                 :underline="false" icon="el-icon-edit-pen">费用登记-->
<!--        </el-link>-->
      </template>
      <template #menu="{row}">
        <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" :underline="false"
                 icon="el-icon-tickets">日志
        </el-link>
        <el-button type="primary" icon="UserFilled" :disabled="!zxhdjSingle" @click="handleZXHDJ"
          v-hasPermi="['tms:tmsDispatchOrder:zzdj']">装卸货点登记
        </el-button>
      </template>
      <template #shipperId-form="{disabled}">
      <template #loadingServiceProviderName="{ row }">
        <template v-if="String(row.isCustoms).trim() === '0' && !row.loadingServiceProviderName">
          <el-link type="primary" underline="never" @click="handleCustomsAdd(row)"
            style="font-weight: bold; cursor: pointer; color: #409eff;">
            待添加
          </el-link>
        </template>
        <template v-else>
          <span>{{ row.loadingServiceProviderName }}</span>
        </template>
      </template>
      <!-- 卸货服务 -->
      <template #customsServiceProviderName="{ row }">
        <template v-if="String(row.isLoad).trim() === '0' && !row.customsServiceProviderName">
          <el-link type="primary" underline="never" @click="handleLoadingAdd(row)"
            style="font-weight: bold; cursor: pointer; color: #409eff;">
            待添加
          </el-link>
        </template>
        <template v-else>
          <span>{{ row.customsServiceProviderName }}</span>
        </template>
      </template>
      <template #menu="{ row, index, size }">
        <el-tooltip content="查看" placement="top" :enterable="false">
          <el-link type="primary" icon="el-icon-view" :underline="false" class="link-btn"
            @click="$refs.crudRef.rowView(row, index)">
          </el-link>
        </el-tooltip>
        <el-tooltip content="编辑" placement="top" :enterable="false">
          <el-link type="primary" icon="el-icon-edit" :underline="false" class="link-btn"
            @click="$refs.crudRef.rowEdit(row, index)">
          </el-link>
        </el-tooltip>
      </template>
      <template #menu-before="{ row }">
        <el-tooltip content="运输货品登记" placement="top">
          <el-link size="small" type="primary" @click="handleAddGoods(row)" class="link-btn"
            v-hasPermi="['tms:tmsGoodsDetail:add']" v-if="[0, 1, 2].includes(row.status)" :underline="false"
            icon="el-icon-document-add">
          </el-link>
        </el-tooltip>
        <el-tooltip content="实际运输记录" placement="top">
          <el-link size="small" type="primary" @click="handleActual(row)" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:update']" v-if="[0, 1, 2].includes(row.status)" :underline="false"
            icon="el-icon-set-up">
          </el-link>
        </el-tooltip>
        <el-tooltip content="确定" placement="top">
          <el-link size="small" type="primary" @click="handleConfirm(row)" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:confirmOrder']" v-if="row.status == 0" :underline="false"
            icon="el-icon-set-up">
          </el-link>
        </el-tooltip>
        <el-tooltip content="作废" placement="top">
          <el-link size="small" type="primary" @click="handleClose(row)" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:closeOrder']" v-if="[0, 1, 2].includes(row.status)" :underline="false"
            icon="el-icon-close">
          </el-link>
        </el-tooltip>
        <el-tooltip content="复制" placement="top">
          <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-tooltip>
        <el-tooltip content="上传行程" placement="top">
          <el-link size="small" type="primary" v-if="[1, 2].includes(row.status)" @click="handleUploadItinerary(row)"
            v-hasPermi="['tms:tmsTrip:add']" class="link-btn" :underline="false" icon="el-icon-upload">
          </el-link>
        </el-tooltip>
        <el-tooltip content="查看行程" placement="top">
          <el-link size="small" type="primary" v-if="![0, 1].includes(row.status)" @click="handleLogItinerary(row)"
            v-hasPermi="['tms:tmsTrip:list']" class="link-btn" :underline="false" icon="el-icon-view">
          </el-link>
        </el-tooltip>
        <el-tooltip content="完成行程" placement="top">
          <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:okOrder']" :underline="false" icon="el-icon-circle-check">
          </el-link>
        </el-tooltip>
        <!-- <el-tooltip content="日志" placement="top">
          <el-link size="small" type="primary" @click="handleLog(row)" class="link-btn" :underline="false"
            icon="el-icon-tickets">
          </el-link>
        </el-tooltip> -->
      </template>
      <!-- <template #menu="{row}">
</template> -->
      <template #shipperId-form="{ disabled }">
        <div style="display:flex; align-items: center;justify-content: space-between">
          <avue-input-table :props="consignorProps" dataType="string"
                            :children="consignorOption" :disabled="disabled"
                            :on-load="onShipperLoad" suffixIcon="search"
                            v-model="form.shipperId" style="width: 80%"
                            @change="changeShipper"
                            placeholder="请选择装货点"></avue-input-table>
          <el-button icon="plus"  :disabled="disabled" @click="handleAddShipper"></el-button>
          <avue-input-table :props="consignorProps" dataType="string" :children="consignorOption" :disabled="disabled"
            :on-load="onShipperLoad" suffixIcon="search" v-model="form.shipperId" style="width: 80%"
            @change="changeShipper" placeholder="请选择装货点"></avue-input-table>
          <el-button icon="plus" :disabled="disabled" @click="handleAddShipper"></el-button>
        </div>
      </template>
      <template #receiverId-form="{disabled}">
      <template #receiverId-form="{ disabled }">
        <div style="display:flex; align-items: center;justify-content: space-between">
          <avue-input-table :props="consignorProps"
                            :children="consignorOption" dataType="string"
                            :on-load="onConsignorLoad" suffixIcon="search"
                            v-model="form.receiverId"  :disabled="disabled"
                            @change="changeReceiver" style="width: 80%"
                            placeholder="请选择卸货点"></avue-input-table>
          <el-button icon="plus"  :disabled="disabled" @click="handleAddReceiver"></el-button>
          <avue-input-table :props="consignorProps" :children="consignorOption" dataType="string"
            :on-load="onConsignorLoad" suffixIcon="search" v-model="form.receiverId" :disabled="disabled"
            @change="changeReceiver" style="width: 80%" placeholder="请选择卸货点"></avue-input-table>
          <el-button icon="plus" :disabled="disabled" @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%">
      <h2 v-if="optionType == 'addFinance'">报价费用</h2>
      <avue-crud v-if="optionType == 'addFinance'"
                 :option="itemsTableOption"
                 :data="itemsTableData"
                 @selection-change="selectionChange2"
      >
        <template #count="{row}">
      <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>
            min="0"></el-input-number>
        </template>
      </avue-crud>
      <h2 v-if="optionType == 'addFinance'">实报实销费用</h2>
      <h2 v-if="optionType == 'addFinance'">实报实销费用1</h2>
      <avue-form v-if="optionType == 'addItinerary' || optionType == 'addFinance'" v-model="boxForm" ref="boxFormRef"
                 :option="boxFormOption">
        :option="boxFormOption">
      </avue-form>
      <avue-crud
          :option="boxTableOption"
          :data="boxTableData"
      >
      <avue-crud :option="boxTableOption" :data="boxTableData">
      </avue-crud>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" v-if="optionType == 'addItinerary' || optionType == 'addFinance'"
                     :loading="pageF.isUploading" @click="submitForm">
            :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>
@@ -215,10 +219,7 @@
    <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 :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>
@@ -229,10 +230,7 @@
        </el-descriptions>
      </div>
      <div v-if="optionType == 'connectHang'">
        <el-descriptions style="margin-bottom: 20px"
                         :column="2"
                         border
        >
        <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>
@@ -244,10 +242,7 @@
      </div>
      <div v-if="optionType == 'customs'">
        <el-descriptions style="margin-bottom: 20px"
                         :column="2"
                         border
        >
        <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>
@@ -259,10 +254,7 @@
      </div>
      <div v-if="optionType == 'loading'">
        <el-descriptions style="margin-bottom: 20px"
                         :column="2"
                         border
        >
        <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>
@@ -284,14 +276,8 @@
    <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 :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">-->
@@ -304,9 +290,7 @@
    </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 v-model="actualForm" ref="actualFormRef" :option="actualFormOption">
      </avue-form>
      <template #footer>
@@ -323,47 +307,59 @@
    <el-dialog title="增值作业登记" v-model="open4" class="avue-dialog avue-dialog--top" width="80%">
      <el-descriptions :column="3" border>
        <el-descriptions-item label="调度单号">{{form.dispatchNo}}</el-descriptions-item>
        <el-descriptions-item label="客户名称">{{form.customerName}}</el-descriptions-item>
        <el-descriptions-item label="项目名称">{{form.projectName}}</el-descriptions-item>
        <el-descriptions-item label="运输路线">{{form.transportLine}}</el-descriptions-item>
        <el-descriptions-item label="车型">{{form.$actualVehicleType}}</el-descriptions-item>
        <el-descriptions-item label="车牌">{{form.licensePlate}}</el-descriptions-item>
        <el-descriptions-item label="调度单号">{{ form.dispatchNo }}</el-descriptions-item>
        <el-descriptions-item label="客户名称">{{ form.customerName }}</el-descriptions-item>
        <el-descriptions-item label="项目名称">{{ form.projectName }}</el-descriptions-item>
        <el-descriptions-item label="运输路线">{{ form.transportLine }}</el-descriptions-item>
        <el-descriptions-item label="车型">{{ form.$actualVehicleType }}</el-descriptions-item>
        <el-descriptions-item label="车牌">{{ form.licensePlate }}</el-descriptions-item>
      </el-descriptions>
      <avue-tabs :option="tabsOption" ref="tabsOptionRef"
                 @change="handleChange"></avue-tabs>
      <avue-tabs :option="tabsOption" ref="tabsOptionRef" @change="handleChange"></avue-tabs>
        <avue-crud v-if="active !== 'tab4'"
            :option="zzItemsTableOption" ref="itemsTableRef"
            :data="zzItemsTableData"
        >
          <template #count="{row}">
            <el-input-number v-model="row.count" placeholder="计费数量"
                             :min="0"></el-input-number>
          </template>
          <template #remark="{row}">
            <el-input v-model="row.remark" placeholder="备注" ></el-input>
          </template>
      <avue-crud v-if="active !== 'tab4'" :option="zzItemsTableOption" ref="itemsTableRef" :data="zzItemsTableData">
        <template #count="{ row }">
          <el-input-number v-model="row.count" placeholder="计费数量" :min="0"></el-input-number>
        </template>
        <template #remark="{ row }">
          <el-input v-model="row.remark" placeholder="备注"></el-input>
        </template>
        </avue-crud>
      </avue-crud>
      <div v-if="active === 'tab4'">
        <h2>实报实销费用</h2>
        <avue-form  v-model="boxForm" ref="boxFormRef"
                    :option="boxFormOption">
        <!-- <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
        </avue-form>
        <avue-crud
            :option="boxTableOption"
            :data="boxTableData"
        >
        </avue-form> -->
        <avue-crud :option="expenditureTableOption" :data="tmsFinanceDetails">
          <template #actualFeeAmount="{ row }">
            <el-input-number v-model="row.actualFeeAmount" :precision="2" :min="0" controls-position="right"
              placeholder="输入金额" style="width: 100%" />
          </template>
          <template #currency="{ row }">
            <el-radio-group v-model="row.currency">
              <el-radio v-for="item in sys_currency" :key="item.value" :label="item.value">
                {{ item.label }}
              </el-radio>
            </el-radio-group>
          </template>
          <template #voucherUrl="{ row }">
            <avue-upload v-model="row.voucherUrl" :action="'/common/upload2'" type="upload" accept="image/*"
              @upload-after="(res, done, loading, column) => handleUploadAfter(res, done, loading, column, row)"></avue-upload>
          </template>
          <template #remark="{ row }">
            <el-input v-model="row.remark" placeholder="填写备注" clearable />
          </template>
        </avue-crud>
        <avue-crud :option="boxTableOption" :data="boxTableData">
        </avue-crud>
      </div>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary"
                     :loading="pageF.isUploading" @click="submitTabForm">
          <el-button type="primary" :loading="pageF.isUploading" @click="submitTabForm">
            {{ pageF.isUploading ? '提交中' : '确 定' }}
          </el-button>
@@ -374,22 +370,20 @@
    <el-dialog title="调度单作废" v-model="open5" class="avue-dialog avue-dialog--top" width="80%">
      <el-descriptions :column="3" border>
        <el-descriptions-item label="调度单号">{{form.dispatchNo}}</el-descriptions-item>
        <el-descriptions-item label="客户名称">{{form.customerName}}</el-descriptions-item>
        <el-descriptions-item label="项目名称">{{form.projectName}}</el-descriptions-item>
        <el-descriptions-item label="运输路线">{{form.transportLine}}</el-descriptions-item>
        <el-descriptions-item label="车型">{{form.$actualVehicleType}}</el-descriptions-item>
        <el-descriptions-item label="车牌">{{form.licensePlate}}</el-descriptions-item>
        <el-descriptions-item label="调度单号">{{ form.dispatchNo }}</el-descriptions-item>
        <el-descriptions-item label="客户名称">{{ form.customerName }}</el-descriptions-item>
        <el-descriptions-item label="项目名称">{{ form.projectName }}</el-descriptions-item>
        <el-descriptions-item label="运输路线">{{ form.transportLine }}</el-descriptions-item>
        <el-descriptions-item label="车型">{{ form.$actualVehicleType }}</el-descriptions-item>
        <el-descriptions-item label="车牌">{{ form.licensePlate }}</el-descriptions-item>
      </el-descriptions>
      <avue-form  v-model="boxForm" ref="boxFormRef"
                  :option="boxFormOption">
      <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
      </avue-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary"
                     :loading="pageF.isUploading" @click="submitForm5">
          <el-button type="primary" :loading="pageF.isUploading" @click="submitForm5">
            {{ pageF.isUploading ? '提交中' : '确 定' }}
          </el-button>
@@ -401,32 +395,31 @@
    <el-dialog title="承运单打印" v-model="open6" class="avue-dialog avue-dialog--top cydprint" width="80%">
      <div v-if="print == 0">
        <el-descriptions :column="3" border>
          <el-descriptions-item label="订单号">{{form.dispatchNo}}</el-descriptions-item>
          <el-descriptions-item label="承运日期">{{form.orderTime}}</el-descriptions-item>
          <el-descriptions-item label="车牌">{{form.licensePlate}}</el-descriptions-item>
          <el-descriptions-item label="订车类型">{{form.$actualVehicleType}}</el-descriptions-item>
          <el-descriptions-item label="订单号">{{ form.dispatchNo }}</el-descriptions-item>
          <el-descriptions-item label="承运日期">{{ form.orderTime }}</el-descriptions-item>
          <el-descriptions-item label="车牌">{{ form.licensePlate }}</el-descriptions-item>
          <el-descriptions-item label="订车类型">{{ form.$actualVehicleType }}</el-descriptions-item>
          <el-descriptions-item label="司机姓名">{{form.mainDriverName}}</el-descriptions-item>
          <el-descriptions-item label="电话">{{form.mainDriverMobile}}</el-descriptions-item>
          <el-descriptions-item label="托架号/柜号">{{form.shelfCode}}/ {{form.containerNo}}</el-descriptions-item>
          <el-descriptions-item label="客户名称">{{form.customerName}}</el-descriptions-item>
          <el-descriptions-item label="起止路线">{{form.transportLine}}</el-descriptions-item>
          <el-descriptions-item label="调度员">{{form.createBy}}</el-descriptions-item>
          <el-descriptions-item label="是否打印">{{form.$isPrint}}</el-descriptions-item>
          <el-descriptions-item label="历史打印次数">{{form.printCount}}</el-descriptions-item>
          <el-descriptions-item label="司机姓名">{{ form.mainDriverName }}</el-descriptions-item>
          <el-descriptions-item label="电话">{{ form.mainDriverMobile }}</el-descriptions-item>
          <el-descriptions-item label="托架号/柜号">{{ form.shelfCode }}/ {{ form.containerNo }}</el-descriptions-item>
          <el-descriptions-item label="客户名称">{{ form.customerName }}</el-descriptions-item>
          <el-descriptions-item label="起止路线">{{ form.transportLine }}</el-descriptions-item>
          <el-descriptions-item label="调度员">{{ form.createBy }}</el-descriptions-item>
          <el-descriptions-item label="是否打印">{{ form.$isPrint }}</el-descriptions-item>
          <el-descriptions-item label="历史打印次数">{{ form.printCount }}</el-descriptions-item>
        </el-descriptions>
        <h3 class="title" style="color: #333;font-weight: bold;">单据信息</h3>
        <avue-form  v-model="boxForm" ref="boxFormRef"
                    :option="boxFormOption">
        <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
        </avue-form>
      </div>
      <div v-else>
        <div id="print">
          <img src="@/assets/img.png" alt="" style="width: 168px;height: 68px">
          <h3 class="title" >珠海市汇畅交通投资有限公司</h3>
          <h3 class="title">珠海市汇畅交通投资有限公司</h3>
          <div class="header">
            <div class="order">订单号:{{boxForm.dispatchNo}}</div>
            <div class="order">订单号:{{ boxForm.dispatchNo }}</div>
            <div class="sub-title">货物承运单证</div>
          </div>
          <table>
@@ -436,7 +429,7 @@
            </tr>
            <tr>
              <td>车牌:{{ boxForm.licensePlate }}</td>
              <td>订车车型: {{boxForm.$actualVehicleType}}</td>
              <td>订车车型: {{ boxForm.$actualVehicleType }}</td>
            </tr>
            <tr>
              <td>司机姓名:{{ boxForm.mainDriverName }}</td>
@@ -444,7 +437,7 @@
            </tr>
            <tr>
              <td>托架号/柜号:{{boxForm.shelfCode}}/ {{boxForm.containerNo}}</td>
              <td>托架号/柜号:{{ boxForm.shelfCode }}/ {{ boxForm.containerNo }}</td>
              <td>行驶口岸:{{ boxForm.portName }}</td>
            </tr>
            <tr>
@@ -454,7 +447,7 @@
            <tr>
              <td>客户:{{ boxForm.customerName }}</td>
              <td>联络人:{{ boxForm.contactName }} {{ boxForm.contactPhone }}  </td>
              <td>联络人:{{ boxForm.contactName }} {{ boxForm.contactPhone }} </td>
            </tr>
            <tr>
              <td colspan="2">
@@ -468,8 +461,8 @@
            </tr>
            <tr>
              <td>
                <div style="line-height: 24px">调度员:{{boxForm.createBy}}</div>
                <div style="line-height: 42px">承运司机:{{boxForm.mainDriverName}}</div>
                <div style="line-height: 24px">调度员:{{ boxForm.createBy }}</div>
                <div style="line-height: 42px">承运司机:{{ boxForm.mainDriverName }}</div>
              </td>
              <td>收货人签字/盖章:</td>
            </tr>
@@ -481,7 +474,7 @@
          <div>3.一切交易均按本公司之标准经营条款为准,本公司之责任在某些情况下会被豁免或限 (制如有须要,欢迎索取)!</div>
        </div>
      </div>
@@ -489,9 +482,8 @@
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="print = 0" v-if="print == 1">重新填写</el-button>
          <el-button type="primary"
                     :loading="pageF.isUploading" @click="submitForm6">
            {{ pageF.isUploading ? '提交中' : '确 定' }}
          <el-button type="primary" :loading="pageF.isUploading" @click="submitForm6">
            {{ pageF.isUploading ? '提交中' : '确 定2' }}
          </el-button>
          <el-button @click="open6 = false">取 消</el-button>
@@ -501,24 +493,16 @@
    <!-- 用户导入对话框 -->
    <el-dialog title="调度单导入" v-model="upload.open" width="400px" append-to-body>
      <el-upload
          ref="uploadRef"
          :limit="1"
          accept=".xlsx, .xls"
          :headers="upload.headers"
          :action="upload.url + '?updateSupport=' + upload.updateSupport"
          :disabled="upload.isUploading"
          :on-progress="handleFileUploadProgress"
          :on-success="handleFileSuccess"
          :auto-upload="false"
          drag
      >
      <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
        :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
        :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
        <el-icon class="el-icon--upload"><upload-filled /></el-icon>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        <template #tip>
          <div class="el-upload__tip text-center">
            <span>仅允许导入xls、xlsx格式文件。</span>
            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
            <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
              @click="importTemplate">下载模板</el-link>
          </div>
        </template>
      </el-upload>
@@ -530,6 +514,50 @@
      </template>
    </el-dialog>
    <el-dialog title="预配订单装卸货点登记" v-model="open7" class="avue-dialog avue-dialog--top" width="80%">
      <avue-form v-model="shipperReceiverForm" ref="shipperReceiverFormRef" :option="shipperReceiverFormOption">
        <template #dispatchNos="{ disabled }">
          <div class="dispatchNos">
            <el-tag v-for="tag in shipperReceiverForm.dispatchNos" :key="tag" closable
              @close="handleCloseDispatchNo(tag)">
              {{ tag }}
            </el-tag>
          </div>
        </template>
        <template #shipperId="{ disabled }">
          <div style="display:flex; align-items: center;justify-content: space-between">
            <avue-input-table :props="consignorProps" dataType="string" :children="consignorOption" :disabled="disabled"
              :on-load="onShipperLoad" suffixIcon="search" v-model="shipperReceiverForm.shipperId" style="width: 80%"
              @change="changeShipper2" placeholder="请选择装货点"></avue-input-table>
            <el-button icon="plus" :disabled="disabled" @click="handleAddShipper2"></el-button>
          </div>
        </template>
        <template #receiverId="{ disabled }">
          <div style="display:flex; align-items: center;justify-content: space-between">
            <avue-input-table :props="consignorProps" :children="consignorOption" dataType="string"
              :on-load="onConsignorLoad" suffixIcon="search" v-model="shipperReceiverForm.receiverId"
              :disabled="disabled" @change="changeReceiver2" style="width: 80%" placeholder="请选择卸货点"></avue-input-table>
            <el-button icon="plus" :disabled="disabled" @click="handleAddReceiver2"></el-button>
          </div>
        </template>
      </avue-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" :loading="pageF.isUploading" @click="submitZxForm">
            {{ pageF.isUploading ? '提交中' : '确 定' }}
          </el-button>
          <el-button @click="open7 = false">取 消</el-button>
        </div>
      </template>
    </el-dialog>
    <el-dialog title="导入日志" v-model="importLogVisible" width="80%">
      <avue-crud :data="importLogData" :option="importLogOption" :table-loading="importLogLoading"
        @on-load="getImportLogList"></avue-crud>
    </el-dialog>
  </basicContainer>
</template>
@@ -554,46 +582,50 @@
  checkCloseOrder,
  closeOrder,
  printDispatchOrder,
  importTemplateTmsDispatchOrder
  importTemplateTmsDispatchOrder, ypdddjSumbit,
  tmsTmsDispatchOrderImportLog,
  saveTmsFinanceDetail2
} from "@/api/tms/tmsDispatchOrder";
import useCurrentInstance from "@/utils/useCurrentInstance";
import {computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick} from "vue";
import {PagesInterface, PageQueryInterface} from "@/utils/globalInterface";
import {usePagePlus} from "@/hooks/usePagePlus";
import {hasPermission} from "@/utils/permissionUtils";
import {getTmsProject, listTmsProject} from "@/api/tms/tmsProject";
import {getTmsServiceProvider, listTmsServiceProvider} from "@/api/tms/tmsServiceProvider";
import {getTmsLoadingServiceProvider, listTmsLoadingServiceProvider} from "@/api/tms/tmsLoadingServiceProvider";
import {getTmsCustomsServiceProvider, listTmsCustomsServiceProvider} from "@/api/tms/tmsCustomsServiceProvider";
import {getTmsDriver, listTmsDriver} from "@/api/tms/tmsDriver";
import {getTmsVehicle, listTmsVehicle} from "@/api/tms/tmsVehicle";
import {getTmsContainer, listTmsContainer} from "@/api/tms/tmsContainer";
import {getTmsShelf, listTmsShelf} from "@/api/tms/tmsShelf";
import {addTmsConsignor, getTmsConsignor, listTmsConsignor} from "@/api/tms/tmsConsignor";
import {ElMessage, ElMessageBox, type ElUpload} from "element-plus";
import {addTmsTrip, listTmsTrip} from "@/api/tms/tmsTrip";
import { computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
import { usePagePlus } from "@/hooks/usePagePlus";
import { hasPermission } from "@/utils/permissionUtils";
import { getTmsProject, listTmsProject } from "@/api/tms/tmsProject";
import { getTmsServiceProvider, listTmsServiceProvider } from "@/api/tms/tmsServiceProvider";
import { getTmsLoadingServiceProvider, listTmsLoadingServiceProvider } from "@/api/tms/tmsLoadingServiceProvider";
import { getTmsCustomsServiceProvider, listTmsCustomsServiceProvider } from "@/api/tms/tmsCustomsServiceProvider";
import { getTmsDriver, listTmsDriver } from "@/api/tms/tmsDriver";
import { getTmsVehicle, listTmsVehicle } from "@/api/tms/tmsVehicle";
import { getTmsContainer, listTmsContainer } from "@/api/tms/tmsContainer";
import { getTmsShelf, listTmsShelf } from "@/api/tms/tmsShelf";
import { addTmsConsignor, getTmsConsignor, listTmsConsignor } from "@/api/tms/tmsConsignor";
import { ElMessage, ElMessageBox, type ElUpload } from "element-plus";
import { addTmsTrip, listTmsTrip } from "@/api/tms/tmsTrip";
import {
  addTmsFinanceDetail,
  listTmsFinanceDetail,
  saveTmsFinanceDetail,
  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, randomId} from '@smallwei/avue'
import {getTmsCustomerInfo, listTmsCustomerInfo} from "@/api/tms/tmsCustomerInfo";
import {getAddressCode} from "@/api/tms/tmsRegion";
import {mapRegeo} from "@/api/common";
import {getDicts} from "@/api/system/dict/data";
import {pushTmsQuoteFee} from "@/api/tms/tmsQuoteFee";
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, randomId } from '@smallwei/avue'
import { getTmsCustomerInfo, listTmsCustomerInfo } from "@/api/tms/tmsCustomerInfo";
import { getAddressCode } from "@/api/tms/tmsRegion";
import { mapRegeo } from "@/api/common";
import { getDicts } from "@/api/system/dict/data";
import { pushTmsQuoteFee } from "@/api/tms/tmsQuoteFee";
import { $Print } from '@smallwei/avue'
import {getToken} from "@/utils/auth";
import { getToken } from "@/utils/auth";
const {appContext} = getCurrentInstance();
const { appContext } = getCurrentInstance();
const {proxy} = useCurrentInstance();
const { proxy } = useCurrentInstance(
);
const { fee_type, sys_currency } = proxy.useDict('fee_type', 'sys_currency')
const crudRef = ref();
const boxFormRef = ref();
const goodsCrudRef = ref();
@@ -635,18 +667,28 @@
  goodsForm: <any>{},
  open3: false,
  actualForm: <any>{},
  isCustoms:<any> -1,
  isCustoms: <any>-1,
  isLoad: -1,
  open5:false,
  open6:false,
  open5: false,
  open6: false,
  open7: false,
  zxhdjSingle: false,
})
const {
  queryParams, form, page, selectionList, open3,
  boxTableData, optionType,
  boxFormOption, boxForm, boxTableOption, title, open, open2,
  goodsTableData, goodsForm, actualForm, selectionList2,isCustoms,isLoad,open5,open6
  goodsTableData, goodsForm, actualForm, selectionList2, isCustoms, isLoad, open5, open6, open7, zxhdjSingle
} = toRefs(data);
const option = ref({
  menuType: 'icon',
  viewBtn: false, // 关闭原生查看
  editBtn: false, // 关闭原生编辑
  searchIndex: 7, // 关键:折叠时显示的个数(根据你的字段数量调整)
  searchIcon: true, // 关键:显示折叠/展开按钮
  searchMenuSpan: 6, // 搜索按钮栏占位(可选)
  pageKey: 'TmsDispatchOrder',
  rowKey: 'id',
  labelWidth: 130,
@@ -669,7 +711,7 @@
              message: "请选择运输路线", trigger: "change"
            }
          ],
          type: 'table', suffixIcon: 'search',dataType: 'string',
          type: 'table', suffixIcon: 'search', dataType: 'string',
          change: (val: any) => {
            const table = crudRef.value?.getPropRef?.('quoteDetailId')?.$refs?.temp;
            if (!table) return;
@@ -736,7 +778,7 @@
            label: 'transportRoute',
            value: 'quoteDetailId'
          },
          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
            if (value) {
              let id = value;
              if (Array.isArray(value)) {
@@ -746,7 +788,7 @@
                return callback(res.data || {})
              })
            } else {
              listTransportRouteVi({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 || [],
@@ -793,7 +835,7 @@
              message: "订单类型不能为空", trigger: "change"
            }
          ],
          change: ({value}: any) => {
          change: ({ value }: any) => {
            option.value.group.forEach((item: any) => {
              if (item.prop == 'pcxx') {
                item.column.shipperId.rules.forEach((cItem: any) => {
@@ -983,7 +1025,7 @@
          ],
        },
        isUrgent: {
          label: '是否紧急',value: '1',
          label: '是否紧急', value: '1',
          display: true,
          type: 'radio', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
          rules: [
@@ -1058,7 +1100,7 @@
              message: "是否是自营车队不能为空", trigger: "change"
            }
          ],
          change: ({value}: any) => {
          change: ({ value }: any) => {
            console.log(value)
            option.value.group.forEach((item: any) => {
              if (item.prop == 'pcxx') {
@@ -1076,7 +1118,7 @@
          },
        },
        commissionModel:{
        commissionModel: {
          label: '提成模式',
          display: true, type: 'radio', dicUrl: '/system/dict/data/type/commission_model', dataType: 'string',
          rules: [
@@ -1107,7 +1149,7 @@
              });
            }
          },
          type: 'table', suffixIcon: 'search',dataType: 'string',
          type: 'table', suffixIcon: 'search', dataType: 'string',
          children: {
            border: true,
            searchLabelWidth: 100,
@@ -1151,7 +1193,7 @@
            label: 'serviceShortName',
            value: 'id'
          },
          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
            if (value) {
              let id = value;
              if (Array.isArray(value)) {
@@ -1161,7 +1203,7 @@
                return callback(res.data || {})
              })
            } else {
              listTmsServiceProvider({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
              listTmsServiceProvider({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
                return callback({
                  total: res.total,
                  data: res.rows || [],
@@ -1218,7 +1260,7 @@
            label: 'driverName',
            value: 'id'
          },
          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
            if (value) {
              let id = value;
              if (Array.isArray(value)) {
@@ -1231,7 +1273,7 @@
              listTmsDriver({
                pageSize: page.pageSize,
                pageNum: page.currentPage, ...data,
                carrierType: form.value.operationMode,vehicleProviderId:form.value.vehicleProviderId
                carrierType: form.value.operationMode, vehicleProviderId: form.value.vehicleProviderId
              }).then(res => {
                return callback({
                  total: res.total,
@@ -1284,7 +1326,7 @@
            label: 'driverName',
            value: 'id'
          },
          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
            if (value) {
              let id = value;
              if (Array.isArray(value)) {
@@ -1296,7 +1338,7 @@
            } else {
              listTmsDriver({
                pageSize: page.pageSize,
                pageNum: page.currentPage, ...data,vehicleProviderId:form.value.vehicleProviderId,
                pageNum: page.currentPage, ...data, vehicleProviderId: form.value.vehicleProviderId,
                carrierType: form.value.operationMode
              }).then(res => {
                return callback({
@@ -1370,7 +1412,7 @@
            label: 'licensePlate',
            value: 'id'
          },
          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
            if (value) {
              let id = value;
              if (Array.isArray(value)) {
@@ -1383,7 +1425,7 @@
              listTmsVehicle({
                pageSize: page.pageSize,
                pageNum: page.currentPage, ...data,
                carrierType: form.value.operationMode,serviceProviderId:form.value.vehicleProviderId
                carrierType: form.value.operationMode, serviceProviderId: form.value.vehicleProviderId
              }).then(res => {
                return callback({
                  total: res.total,
@@ -1465,7 +1507,7 @@
              });
            }
          },
          type: 'table', suffixIcon: 'search',dataType: 'string',
          type: 'table', suffixIcon: 'search', dataType: 'string',
          children: {
            border: true,
            searchLabelWidth: 100,
@@ -1499,7 +1541,7 @@
            label: 'containerCode',
            value: 'id'
          },
          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
            if (value) {
              let id = value;
              if (Array.isArray(value)) {
@@ -1509,7 +1551,7 @@
                return callback(res.data || {})
              })
            } else {
              listTmsContainer({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
              listTmsContainer({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
                return callback({
                  total: res.total,
                  data: res.rows || [],
@@ -1539,7 +1581,7 @@
              });
            }
          },
          type: 'table', suffixIcon: 'search',dataType: 'string',
          type: 'table', suffixIcon: 'search', dataType: 'string',
          children: {
            border: true,
            searchLabelWidth: 100,
@@ -1571,7 +1613,7 @@
            label: 'shelfCode',
            value: 'id'
          },
          onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
            if (value) {
              let id = value;
              if (Array.isArray(value)) {
@@ -1581,7 +1623,7 @@
                return callback(res.data || {})
              })
            } else {
              listTmsShelf({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
              listTmsShelf({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
                return callback({
                  total: res.total,
                  data: res.rows || [],
@@ -1677,17 +1719,54 @@
      display: false,
      search: true,
    },
    licensePlate: {
      label: '车牌号', minWidth: 120,
      display: false,
      search: true,
    },
    customerName: {
      label: '客户',
      display: false, minWidth: 120,
      search: true,
    },
    mainDriverName: {
      label: '主驾驶员',
      display: false, minWidth: 120,
      search: true,
    },
    requiredVehicleTypes: {
      label: '下单车型', minWidth: 130,
      display: false, type: 'select', search: true,
      dicUrl: '/system/dict/data/type/vehicle_type',
      dataType: 'string',
    },
    createTimeRange: {
      label: '创建时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      valueFormat: 'YYYY-MM-DD',
    },
    updateTimeRange: {
      label: '更新时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      valueFormat: 'YYYY-MM-DD',
    },
    loadingServiceProviderName: {
      label: '装货服务商名称', minWidth: 150,
      display: false,
      search: true,
    },
    customsServiceProviderName: {
      label: '报关服务商名称', minWidth: 150,
      display: false,
      search: true,
    },
    projectName: {
      label: '项目名称',
      display: false, minWidth: 120,
      search: true,
    },
    contractName: {
      label: '关联合同名称', minWidth: 120,
      display: false,
@@ -1721,16 +1800,7 @@
      search: true,
    },
    loadingServiceProviderName: {
      label: '装货服务商名称', minWidth: 150,
      display: false,
      search: true,
    },
    customsServiceProviderName: {
      label: '报关服务商名称', minWidth: 150,
      display: false,
      search: true,
    },
    isUrgent: {
      label: '是否紧急',
      display: false, minWidth: 100,
@@ -1759,24 +1829,13 @@
      type: 'select', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
    },
    mainDriverName: {
      label: '主驾驶员',
      display: false, minWidth: 120,
      search: true,
    },
    // requiredVehicleTypes: {
    //   label: '要求运输工具类型',
    //   display: false,
    //   search: true,
    // },
    requiredVehicleTypes: {
      label: '下单车型',minWidth: 130,
      display: false, type: 'select',  search: true,
      dicUrl: '/system/dict/data/type/vehicle_type',
      dataType: 'string',
    },
    actualVehicleType: {
      label: '派出车型', minWidth: 130,
      display: false,
@@ -1785,11 +1844,7 @@
    },
    licensePlate: {
      label: '车牌号', minWidth: 120,
      display: false,
      search: true,
    },
    shipperName: {
      label: '装货点名称',
@@ -1834,7 +1889,7 @@
    inStatusList: {
      label: '状态', minWidth: 150,
      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/tms_dispatch_order_status',
      display: false,multiple:true,
      display: false, multiple: true,
      hide: true,
      search: true,
@@ -1867,11 +1922,7 @@
      hide: false,
      search: false,
    },
    createTimeRange: {
      label: '创建时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      valueFormat: 'YYYY-MM-DD',
    },
    updateBy: {
      label: '更新人', minWidth: 150,
      addDisplay: false,
@@ -1888,11 +1939,7 @@
      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,
@@ -1929,8 +1976,8 @@
    tripType: {
      label: '行程类型',
      display: true,
      change: function ({value}: any) {
        if (value == '5'){
      change: function ({ value }: any) {
        if (value == '5') {
          itineraryOption.value.column.iscc.display = true
        }
      },
@@ -2077,7 +2124,7 @@
        }
      ],
    },
    currency:{
    currency: {
      label: '币种',
      display: true,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
@@ -2097,7 +2144,7 @@
      action: '/common/upload2',
    },
    remark:{
    remark: {
      label: '备注',
      type: 'textarea', minRows: 3, maxRows: 5, span: 24
    },
@@ -2140,7 +2187,7 @@
      label: '金额',
      display: true,
    },
    currency:{
    currency: {
      label: '币种',
      display: true,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
@@ -2153,7 +2200,7 @@
      type: 'upload',
      action: '/common/upload2',
    },
    remark:{
    remark: {
      label: '备注',
    },
@@ -2267,7 +2314,7 @@
        label: 'licensePlate',
        value: 'id'
      },
      onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
      onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
        if (value) {
          let id = value;
          if (Array.isArray(value)) {
@@ -2277,7 +2324,7 @@
            return callback(res.data || {})
          })
        } else {
          listTmsVehicle({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
          listTmsVehicle({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
            return callback({
              total: res.total,
              data: res.rows || [],
@@ -2321,7 +2368,7 @@
        label: 'driverName',
        value: 'id'
      },
      onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
      onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
        if (value) {
          let id = value;
          if (Array.isArray(value)) {
@@ -2331,7 +2378,7 @@
            return callback(res.data || {})
          })
        } else {
          listTmsDriver({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
          listTmsDriver({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
            return callback({
              total: res.total,
              data: res.rows || [],
@@ -2351,7 +2398,7 @@
  labelWidth: 120,
  column: {
    customsServiceProviderId: {
      label: '报关服务商', span:24,
      label: '报关服务商', span: 24,
      display: true,
      rules: [
        {
@@ -2376,22 +2423,22 @@
        border: true,
        searchLabelWidth: 100,
        searchMenuSpan: 5,
        column:{
        column: {
          serviceCode: {
            label: '服务商编码',
            search: true,
          },
          serviceShortName: {
            label: '服务商简称',minWidth:150,
            label: '服务商简称', minWidth: 150,
            search: true,
          },
          serviceName: {
            label: '服务商全称',search: true,
            label: '服务商全称', search: true,
          },
          serviceType: {
            label: '服务类型',minWidth:150,
            label: '服务类型', minWidth: 150,
            type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/service_type',
            multiple:true,
            multiple: true,
            search: true,
          },
        }
@@ -2400,7 +2447,7 @@
        label: 'serviceShortName',
        value: 'id'
      },
      onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
      onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
        if (value) {
          let id = value;
          if (Array.isArray(value)) {
@@ -2410,7 +2457,7 @@
            return callback(res.data || {})
          })
        } else {
          listTmsCustomsServiceProvider({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
          listTmsCustomsServiceProvider({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
            return callback({
              total: res.total,
              data: res.rows || [],
@@ -2429,7 +2476,7 @@
  labelWidth: 120,
  column: {
    loadingServiceProviderId: {
      label: '装卸服务商',span:24,
      label: '装卸服务商', span: 24,
      display: true,
      rules: [
        {
@@ -2454,22 +2501,22 @@
        border: true,
        searchLabelWidth: 100,
        searchMenuSpan: 5,
        column:{
        column: {
          serviceCode: {
            label: '服务商编码',
            search: true,
          },
          serviceShortName: {
            label: '服务商简称',minWidth:150,
            label: '服务商简称', minWidth: 150,
            search: true,
          },
          serviceName: {
            label: '服务商全称',search: true,
            label: '服务商全称', search: true,
          },
          serviceType: {
            label: '服务类型',minWidth:150,
            label: '服务类型', minWidth: 150,
            type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/service_type',
            multiple:true,
            multiple: true,
            search: true,
          },
        }
@@ -2478,7 +2525,7 @@
        label: 'serviceShortName',
        value: 'id'
      },
      onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
      onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
        if (value) {
          let id = value;
          if (Array.isArray(value)) {
@@ -2488,7 +2535,7 @@
            return callback(res.data || {})
          })
        } else {
          listTmsLoadingServiceProvider({pageSize: page.pageSize, pageNum: page.currentPage, ...data}).then(res => {
          listTmsLoadingServiceProvider({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
            return callback({
              total: res.total,
              data: res.rows || [],
@@ -2506,8 +2553,8 @@
  menuBtn: false,
  labelWidth: 120,
  column: {
    closeWhy:{
      label: '作废原因',span:24,
    closeWhy: {
      label: '作废原因', span: 24,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/close_why',
      rules: [
        {
@@ -2516,10 +2563,10 @@
        }
      ],
    },
    closeWhyRemark:{
    closeWhyRemark: {
      label: '作废原因说明',
      type: 'textarea',
      span:24,
      span: 24,
    },
  }
})
@@ -2571,7 +2618,7 @@
        label: 'productName',
        value: 'id'
      },
      onLoad: ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
      onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
        if (value) {
          let id = value;
          if (Array.isArray(value)) {
@@ -2845,7 +2892,7 @@
      name: 'tab4',
      value: '3',
    }
    ]
  ]
})
const tabsOptionRef = ref();
const active = ref('tab1');
@@ -2857,16 +2904,16 @@
  menu: false,
  selection: false,
  column: {
    freeName:{
    freeName: {
      label: '费用名称',
    },
    unit:{
    unit: {
      label: '计量单位',
    },
    count:{
      label : '计费数量'
    count: {
      label: '计费数量'
    },
    remark:{
    remark: {
      label: '备注'
    }
  }
@@ -2910,16 +2957,22 @@
  },
  handleSelectionChangeFunc: (selection: any) => {
    selectionList.value = selection;
    if (selection.length > 0){
    if (selection.length > 0) {
      isCustoms.value = selection[0].isCustoms;
      isLoad.value = selection[0].isLoad ;
    }else{
      isLoad.value = selection[0].isLoad;
    } else {
      isCustoms.value = -1;
      isLoad.value = -1;
    }
    isCustoms.value = isCustoms.value == 0 && !pageF.single ? 0 : -1;
    isLoad.value = isLoad.value == 0 && !pageF.single ? 0 : -1;
    console.log(pageF.single)
    zxhdjSingle.value = pageF.multiple || true;
    let yp = selection.filter((item: any) => {
      return item.orderType == 0
    });
    if (yp.length > 0) {
      zxhdjSingle.value = false;
    }
  },
  getBeginListFunc: (params = {}) => {
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.createTimeRange, 'createTime') || {};
@@ -2929,8 +2982,8 @@
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.orderTimeRange, 'orderTime') || {};
    return params;
  },
  handleBeforeOpenFunc:(type:string)=>{
    if(type == 'add'){
  handleBeforeOpenFunc: (type: string) => {
    if (type == 'add') {
      form.value = {};
    }
  }
@@ -2988,8 +3041,10 @@
const handleUploadItinerary = (row: any) => {
  optionType.value = 'addItinerary';
  boxFormOption.value = itineraryOption.value;
  console.log(itineraryOption.value);
  boxTableOption.value = itineraryTableOption.value;
  listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => {
  listTmsTrip({ dispatchOrderId: row.id, pageNum: 1, pageSize: 999 }).then(res => {
    boxTableData.value = res.rows || [];
    pageF.open = true;
    pageF.title = '上传行程';
@@ -3002,6 +3057,8 @@
      vehicleNumber: row.licensePlate,
      vehicleId: row.vehicleId,
    }
    console.log(boxForm.value);
  })
}
const cancelBox = () => {
@@ -3057,7 +3114,7 @@
const handleLogItinerary = (row: any) => {
  optionType.value = 'view';
  boxTableOption.value = itineraryTableOption.value;
  listTmsTrip({dispatchOrderId: row.id, pageNum: 1, pageSize: 999}).then(res => {
  listTmsTrip({ dispatchOrderId: row.id, pageNum: 1, pageSize: 999 }).then(res => {
    boxTableData.value = res.rows || [];
    pageF.open = true;
    pageF.title = '查看行程';
@@ -3069,7 +3126,7 @@
  optionType.value = 'addFinance';
  boxFormOption.value = financeOption.value;
  boxTableOption.value = financeTableOption.value;
  const quotePlanItemRes = await listTmsQuoteItem({quotePlanId: row.quotePlanId, pageNum: 1, pageSize: 999});
  const quotePlanItemRes = await listTmsQuoteItem({ quotePlanId: row.quotePlanId, pageNum: 1, pageSize: 999 });
  let items = quotePlanItemRes.rows || [];
  itemsTableData.value = items.map((item: any) => {
    return {
@@ -3160,8 +3217,9 @@
    }).finally(() => {
      pageF.isUploading = false;
    })
  }else if (optionType.value === 'customs') {
    customsOrder({id:form.value.id,
  } else if (optionType.value === 'customs') {
    customsOrder({
      id: form.value.id,
      customsServiceProviderId: form.value.customsServiceProviderId,
      customsServiceProviderName: form.value.customsServiceProviderName,
    }).then(res => {
@@ -3174,8 +3232,9 @@
    }).finally(() => {
      pageF.isUploading = false;
    })
  }else if (optionType.value === 'loading') {
    loadingOrder({id:form.value.id,
  } else if (optionType.value === 'loading') {
    loadingOrder({
      id: form.value.id,
      loadingServiceProviderId: form.value.loadingServiceProviderId,
      loadingServiceProviderName: form.value.loadingServiceProviderName,
    }).then(res => {
@@ -3188,7 +3247,7 @@
    }).finally(() => {
      pageF.isUploading = false;
    })
  }else {
  } else {
    connectHang({
      dispatchId: form.value.id,
      vehicleId: form.value.vehicleId,
@@ -3212,7 +3271,7 @@
}
const handleAddGoods = (row: any) => {
  listTmsGoodsDetail({dispatchId: row.id, pageSize: 999, pageNum: 1}).then(res => {
  listTmsGoodsDetail({ dispatchId: row.id, pageSize: 999, pageNum: 1 }).then(res => {
    goodsTableData.value = res.rows || [];
    form.value = row;
    open2.value = true;
@@ -3286,7 +3345,7 @@
  selectionList2.value = selection;
}
const onShipperLoad = ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
const onShipperLoad = ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
  if (value) {
    let id = value;
    if (Array.isArray(value)) {
@@ -3305,7 +3364,10 @@
      if (districtId) data.districtId = districtId;
      if (streetId) data.streetId = streetId;
    }
    listTmsConsignor({pageSize: page.pageSize, pageNum: page.currentPage, ...data,customerId: form.value.customerId}).then(res => {
    if (shipperReceiverForm.value.customerId) {
      form.value.customerId = shipperReceiverForm.value.customerId;
    }
    listTmsConsignor({ pageSize: page.pageSize, pageNum: page.currentPage, ...data, customerId: form.value.customerId }).then(res => {
      return callback({
        total: res.total,
        data: res.rows || [],
@@ -3313,7 +3375,7 @@
    })
  }
}
const onConsignorLoad = ({page, value, data}: { page: any, value: any, data: any }, callback: any) => {
const onConsignorLoad = ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
  if (value) {
    let id = value;
    if (Array.isArray(value)) {
@@ -3332,7 +3394,10 @@
      if (districtId) data.districtId = districtId;
      if (streetId) data.streetId = streetId;
    }
    listTmsConsignor({pageSize: page.pageSize, pageNum: page.currentPage, ...data,customerId: form.value.customerId}).then(res => {
    if (shipperReceiverForm.value.customerId) {
      form.value.customerId = shipperReceiverForm.value.customerId;
    }
    listTmsConsignor({ pageSize: page.pageSize, pageNum: page.currentPage, ...data, customerId: form.value.customerId }).then(res => {
      return callback({
        total: res.total,
        data: res.rows || [],
@@ -3340,7 +3405,7 @@
    })
  }
}
const changeShipper = ({value}: any) => {
const changeShipper = ({ value }: any) => {
  if (value) {
    let id = value;
@@ -3375,7 +3440,7 @@
    })
  }
}
const changeReceiver = ({value}: any) => {
const changeReceiver = ({ value }: any) => {
  if (value) {
    let id = value;
@@ -3411,13 +3476,13 @@
    })
  }
}
const consignorAddOption =ref({
const consignorAddOption = ref({
  labelWidth: 120,
  group: [
    {
      label: '基础信息',
      prop: 'jcxx',
      column:{
      column: {
        // consignorCode: {
        //   label: '装卸货点编码',minWidth: 150,
        //   addDisplay: false, disabled: true,
@@ -3433,7 +3498,7 @@
        //   ],
        // },
        consignorName: {
          label: '装卸货点名称',minWidth: 150,
          label: '装卸货点名称', minWidth: 150,
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
@@ -3446,8 +3511,8 @@
            }
          ],
        },
        customerName:{
          label: '所属客户',minWidth: 150,disabled: true,
        customerName: {
          label: '所属客户', minWidth: 150, disabled: true,
        },
        // customerId: {
        //   label: '所属客户',minWidth: 150,
@@ -3542,7 +3607,7 @@
        //   ],
        // },
        consignorType: {
          label: '装卸货点类型',minWidth: 150,
          label: '装卸货点类型', minWidth: 150,
          type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/consignor_type',
          addDisplay: true,
          editDisplay: true,
@@ -3561,9 +3626,9 @@
    {
      label: '联系人信息',
      prop: 'lxrxx',
      column:{
      column: {
        contactName: {
          label: '联系人姓名',minWidth: 150,
          label: '联系人姓名', minWidth: 150,
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
@@ -3577,7 +3642,7 @@
          ],
        },
        contactPhone: {
          label: '联系人电话',minWidth: 150,
          label: '联系人电话', minWidth: 150,
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
@@ -3585,7 +3650,7 @@
          search: false,
        },
        contactEmail: {
          label: '联系人邮箱',minWidth: 150,
          label: '联系人邮箱', minWidth: 150,
          addDisplay: true,
          editDisplay: true,
          viewDisplay: true,
@@ -3597,12 +3662,12 @@
    {
      label: '地址信息',
      prop: 'dzxx',
      column:{
      column: {
        mapLocationDetail: {
          label: '地图位置',minWidth: 150,
          label: '地图位置', minWidth: 150,
          addDisplay: true,
          editDisplay: true,span:24,
          editDisplay: true, span: 24,
          viewDisplay: true,
          hide: true,
          search: false,
@@ -3622,23 +3687,23 @@
          //     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")
                  }
                });
          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")
                }
              });
            }
          },
        },
@@ -3658,9 +3723,9 @@
        // },
        electronicFenceRange: {
          label: '电子围栏范围',
          addDisplay: true,minWidth: 150,
          addDisplay: true, minWidth: 150,
          editDisplay: true,
          viewDisplay: true,append:'米',
          viewDisplay: true, append: '米',
          hide: false,
          search: true,
          rules: [
@@ -3675,12 +3740,12 @@
    {
      label: '其他信息',
      prop: 'qtyxx',
      column:{
      column: {
        remark: {
          label: '备注',minWidth: 150,
          label: '备注', minWidth: 150,
          type: 'textarea', minRows: 3, maxRows: 5,
          addDisplay: true,
          editDisplay: true,span:24,
          editDisplay: true, span: 24,
          viewDisplay: true,
          hide: true,
          search: false,
@@ -3693,7 +3758,7 @@
const dialForm = ref();
const handleAddShipper = () => {
  if (!form.value.customerId){
  if (!form.value.customerId) {
    return ElMessage.error('请先选择运输路线');
  }
  form2.value = {
@@ -3703,33 +3768,33 @@
  };
  dialForm.value = $DialogForm(appContext)({
    title: '新增装货地',
    data:form2.value,
    data: form2.value,
    width: '80%',
    option: consignorAddOption.value,
    menuPosition: 'right',
    callback: (res:any,) => {
    callback: (res: any,) => {
      let data1 = res.data;
      if (data1.mapLocationDetail){
        data1.mapLocation = data1.mapLocationDetail[0]+','+data1.mapLocationDetail[1];
      if (data1.mapLocationDetail) {
        data1.mapLocation = data1.mapLocationDetail[0] + ',' + data1.mapLocationDetail[1];
        data1.addressDetail = data1.mapLocationDetail[2]
      }
      addTmsConsignor({...form2.value,...data1}).then(res2=>{
      addTmsConsignor({ ...form2.value, ...data1 }).then(res2 => {
        let active = res2.data || {};
        if (active) {
          let shipperRegionCode = '';
          if (active.provinceId){
          if (active.provinceId) {
            shipperRegionCode = active.provinceId;
          }
          if (active.cityId){
            shipperRegionCode =shipperRegionCode+ ","+active.cityId;
          if (active.cityId) {
            shipperRegionCode = shipperRegionCode + "," + active.cityId;
          }
          if (active.districtId){
            shipperRegionCode =shipperRegionCode+ ","+active.districtId;
          if (active.districtId) {
            shipperRegionCode = shipperRegionCode + "," + active.districtId;
          }
          if (active.streetId){
            shipperRegionCode =shipperRegionCode+ ","+active.streetId;
          if (active.streetId) {
            shipperRegionCode = shipperRegionCode + "," + active.streetId;
          }
          Object.assign(form.value, {
            shipperId: active.id,
@@ -3737,12 +3802,12 @@
            shipperRegionLabel: active.regionLabel,
            shipperAddress: active.addressDetail,
            shipperMobile: active.contactPhone,
            shipperRegionCode:shipperRegionCode
            shipperRegionCode: shipperRegionCode
          });
        }
        dialForm.value.close();
        res.done();
      }).catch(err=>{
      }).catch(err => {
        res.done();
      })
    },
@@ -3750,7 +3815,7 @@
}
const handleAddReceiver = () => {
  if (!form.value.customerId){
  if (!form.value.customerId) {
    return ElMessage.error('请先选择运输路线');
  }
  form2.value = {
@@ -3760,33 +3825,33 @@
  };
  dialForm.value = $DialogForm(appContext)({
    title: '新增卸货地',
    data:form2.value,
    data: form2.value,
    width: '80%',
    option: consignorAddOption.value,
    menuPosition: 'right',
    callback: (res:any,) => {
    callback: (res: any,) => {
      let data1 = res.data;
      if (data1.mapLocationDetail){
        data1.mapLocation = data1.mapLocationDetail[0]+','+data1.mapLocationDetail[1];
      if (data1.mapLocationDetail) {
        data1.mapLocation = data1.mapLocationDetail[0] + ',' + data1.mapLocationDetail[1];
        data1.addressDetail = data1.mapLocationDetail[2]
      }
      addTmsConsignor({...form2.value,...data1}).then(res2=>{
      addTmsConsignor({ ...form2.value, ...data1 }).then(res2 => {
        let active = res2.data || {};
        if (active) {
          let receiverRegionCode = '';
          if (active.provinceId){
          if (active.provinceId) {
            receiverRegionCode = active.provinceId;
          }
          if (active.cityId){
            receiverRegionCode =receiverRegionCode+ ","+active.cityId;
          if (active.cityId) {
            receiverRegionCode = receiverRegionCode + "," + active.cityId;
          }
          if (active.districtId){
            receiverRegionCode =receiverRegionCode+ ","+active.districtId;
          if (active.districtId) {
            receiverRegionCode = receiverRegionCode + "," + active.districtId;
          }
          if (active.streetId){
            receiverRegionCode =receiverRegionCode+ ","+active.streetId;
          if (active.streetId) {
            receiverRegionCode = receiverRegionCode + "," + active.streetId;
          }
          Object.assign(form.value, {
@@ -3795,12 +3860,12 @@
            receiverRegionLabel: active.regionLabel,
            receiverAddress: active.addressDetail,
            receiverMobile: active.contactPhone,
            receiverRegionCode:receiverRegionCode,
            receiverRegionCode: receiverRegionCode,
          });
        }
        dialForm.value.close();
        res.done();
      }).catch(err=>{
      }).catch(err => {
        res.done();
      })
    },
@@ -3813,6 +3878,15 @@
  form.value = selectionList.value[0];
  optionType.value = 'customs';
  boxFormOption.value = customsOption.value;
}
const handleCustomsAdd = (selectionList) => {
  title.value = '补充委托装卸信息';
  open.value = true;
  form.value = selectionList;
  optionType.value = 'loading';
  boxFormOption.value = loadingOption.value;
}
const handleLoading = () => {
  title.value = '补充委托装卸信息';
@@ -3821,32 +3895,40 @@
  optionType.value = 'loading';
  boxFormOption.value = loadingOption.value;
}
const handleLoadingAdd = (selectionList) => {
  title.value = '补充委托装卸信息';
  open.value = true;
  form.value = selectionList;
  optionType.value = 'loading';
  boxFormOption.value = loadingOption.value;
}
const quotationItems = ref();
const getQuotationItems = async () => {
  let res = await  getDicts("sys_quotation_items");
  let res = await getDicts("sys_quotation_items");
  quotationItems.value = res.data || [];
}
getQuotationItems();
const getTabData = (val:string)=>{
const getTabData = (val: string) => {
  console.log(val)
  let filter = quotationItems.value.filter((item:any)=>{
  let filter = quotationItems.value.filter((item: any) => {
    return item.remark == val;
  });
  if (filter.length > 0){
    zzItemsTableData.value = filter.map((item:any)=>{
      return { rowKey: randomId() ,freeName: item.dictLabel,free: item.dictValue,unit: '次'}
  if (filter.length > 0) {
    zzItemsTableData.value = filter.map((item: any) => {
      return { rowKey: randomId(), freeName: item.dictLabel, free: item.dictValue, unit: '次' }
    })
  }else{
  } else {
    zzItemsTableData.value = []
  }
}
const getTab4Data = ()=>{
const getTab4Data = () => {
  listTmsFinanceDetail({
    dispatchOrderId: form.value.id, financeType: 2,
    pageNum: 1, pageSize: 999
  }).then(async res => {
    boxTableData.value = res.rows || [];
    boxForm.value = {
@@ -3859,39 +3941,76 @@
const submitTabForm = ()=>{
  if (['tab1','tab2','tab3'].includes(active.value)){
    let quoteFeeItems = zzItemsTableData.value.filter((item:any)=>{
const submitTabForm = () => {
  if (['tab1', 'tab2', 'tab3'].includes(active.value)) {
    let quoteFeeItems = zzItemsTableData.value.filter((item: any) => {
      return item.count && item.count > 0;
    })
    console.log(quoteFeeItems)
    pushTmsQuoteFee({...form.value,quoteFeeItems:quoteFeeItems}).then(res=>{
    pushTmsQuoteFee({ ...form.value, quoteFeeItems: quoteFeeItems }).then(res => {
      ElMessage.success('保存成功');
      open4.value = false;
    })
  }else if (active.value === 'tab4'){
    if (Array.isArray(boxForm.value.feeVoucherUrl)) {
      boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString();
    }
  } else if (active.value === 'tab4') {
    // if (Array.isArray(boxForm.value.feeVoucherUrl)) {
    //   boxForm.value.feeVoucherUrl = boxForm.value.feeVoucherUrl.toString();
    // }
    //boxForm.value.rowItems = boxTableData.value;
    saveTmsFinanceDetail(boxForm.value).then(res => {
    // console.log(tmsFinanceDetails.value);
    // console.log(boxForm.value);
    // 1. 提取填写了金额的数据(金额大于0)
    const validDetails = tmsFinanceDetails.value.filter(item => item.actualFeeAmount && item.actualFeeAmount > 0);
    if (validDetails.length === 0) {
      ElMessage.warning('请至少填写一项费用金额');
      return;
    }
    // 2. 校验:填写了金额的是否都选了币制
    const incomplete = validDetails.find(item => !item.currency);
    if (incomplete) {
      ElMessage.error(`费用类型【${incomplete.feeTypeName}】已填写金额,请选择币制!`);
      return; // 拦截提交
    }
    // 3. 处理凭证 URL (如果有单张或多张上传的逻辑)
    // 假设后端需要的是逗号分隔的字符串
    const submitData = validDetails.map(item => {
      let url = item.voucherUrl;
      if (Array.isArray(url)) {
        url = url.join(',');
      }
      return { ...item, voucherUrl: url };
    });
    saveTmsFinanceDetail2(submitData).then(res => {
      ElMessage({
        message: "操作成功!",
        type: 'success'
      })
      open4.value = false;
      onLoad(page.value)
      boxFormRef.value?.resetFields();
      getTab4Data();
    })
    // saveTmsFinanceDetail(boxForm.value).then(res => {
    //   ElMessage({
    //     message: "操作成功!",
    //     type: 'success'
    //   })
    //   boxFormRef.value?.resetFields();
    //   getTab4Data();
    // })
  }
}
const handleChange = (column:any)=>{
const handleChange = (column: any) => {
  active.value = column.prop;
  if (['tab1','tab2','tab3'].includes(column.prop)){
  if (['tab1', 'tab2', 'tab3'].includes(column.prop)) {
    getTabData(column.value)
  }else if (column.prop === 'tab4'){
  } else if (column.prop === 'tab4') {
    getTab4Data()
  }
}
@@ -3903,38 +4022,38 @@
  boxFormOption.value = financeOption.value;
  boxTableOption.value = financeTableOption.value;
  nextTick(()=>{
  nextTick(() => {
    tabsOptionRef.value.active = "0";
  })
}
const handleClose = (row:any) => {
const handleClose = (row: any) => {
  if (row.status == 2){
    checkCloseOrder(row.id).then(res=>{
  if (row.status == 2) {
    checkCloseOrder(row.id).then(res => {
      open5.value = true;
      form.value = row;
      boxFormOption.value = closeOption.value;
    });
  }else{
  } else {
    open5.value = true;
    form.value = row;
    boxFormOption.value = closeOption.value;
  }
}
const submitForm5 = () =>{
  boxFormRef.value.validate((valid: boolean,done:any) => {
const submitForm5 = () => {
  boxFormRef.value.validate((valid: boolean, done: any) => {
    console.log(valid)
    if(valid){
    if (valid) {
      boxForm.value.id = form.value.id;
      closeOrder(boxForm.value).then(res=>{
      closeOrder(boxForm.value).then(res => {
        ElMessage.success('操作成功');
        open5.value = false;
        done();
        onLoad(page.value)
      }).catch(err=>{
      }).catch(err => {
        done();
      })
    }
@@ -3944,54 +4063,54 @@
  menuBtn: false,
  labelWidth: 120,
  column: {
    sixLinkNo:{
    sixLinkNo: {
      label: '六联单号',
    },
    portName:{
    portName: {
      label: '行驶口岸',
      type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/sys_port',
    },
    billNo:{
    billNo: {
      label: '提单号S/O',
    },
    terminalName:{
    terminalName: {
      label: '码头名',
    },
    cargoName:{
    cargoName: {
      label: '货物名',
    },
    pieceCount:{
    pieceCount: {
      label: '件数',
    },
    weight:{
    weight: {
      label: '重量',
    },
    contactName:{
    contactName: {
      label: '客户联络人',
    },
    contactPhone:{
    contactPhone: {
      label: '联络人手机号',
    }
  }
})
const print =ref(0)
const print = ref(0)
const handlePrint = () => {
  form.value =  selectionList.value[0];
  form.value = selectionList.value[0];
  boxFormOption.value = printOption.value;
  boxForm.value = form.value
  getTmsDriver(boxForm.value.mainDriverId).then(res=>{
  getTmsDriver(boxForm.value.mainDriverId).then(res => {
    open6.value = true;
    const driver =  res.data || {};
    const driver = res.data || {};
    boxForm.value.mainDriverMobile = driver.mobile;
    print.value = 0
  })
}
const submitForm6 = ()=>{
const submitForm6 = () => {
  print.value = 1;
  printDispatchOrder(boxForm.value).then(res=>{
  printDispatchOrder(boxForm.value).then(res => {
    $Print('#print');
    onLoad(page.value)
  })
@@ -4024,11 +4143,11 @@
  importTemplateTmsDispatchOrder();
}
const handleFileUploadProgress = (event:any, file:any) => {
const handleFileUploadProgress = (event: any, file: any) => {
  upload.isUploading = true;
};
/** 文件上传成功处理 */
const handleFileSuccess = (response:any, file:any) => {
const handleFileSuccess = (response: any, file: any) => {
  upload.open = false;
  upload.isUploading = false;
  uploadRef.value!.clearFiles();
@@ -4039,33 +4158,461 @@
function submitFileForm() {
  uploadRef.value!.submit();
}
const shipperReceiverForm = ref<any>({});
const shipperReceiverFormRef = ref();
const shipperReceiverFormOption = ref({
  menuBtn: false, labelWidth: 140,
  column: {
    dispatchNos: {
      label: '调度单号', span: 24,
      rules: [
        {
          required: true,
          message: "调度单号不能为空", trigger: "change"
        }
      ],
    },
    shipperId: {
      label: '装货点', dataType: 'string', disabled: false,
      display: true,
      rules: [
        {
          required: true,
          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', disabled: false,
      rules: [
        {
          required: true,
          message: "卸货点不能为空", trigger: "change"
        }
      ],
    },
    receiverRegionLabel: {
      label: '卸货点行政区域',
      display: true, disabled: true
    },
    receiverAddress: {
      label: '卸货点详细地址',
      display: true, disabled: true
    },
    receiverMobile: {
      label: '卸货点联系方式',
      display: true, disabled: true
    },
  }
});
const changeShipper2 = ({ 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(shipperReceiverForm.value, {
        shipperId: active.id,
        shipperName: active.consignorName,
        shipperRegionLabel: active.regionLabel,
        shipperAddress: active.addressDetail,
        shipperMobile: active.contactPhone,
        shipperRegionCode: shipperRegionCode
      });
    })
  }
}
const changeReceiver2 = ({ 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(shipperReceiverForm.value, {
        receiverId: active.id,
        receiverName: active.consignorName,
        receiverRegionLabel: active.regionLabel,
        receiverAddress: active.addressDetail,
        receiverMobile: active.contactPhone,
        receiverRegionCode: receiverRegionCode,
      });
    })
  }
}
const hasDifferentCustomer = (() => {
  const customerSet = new Set(
    selectionList.value.map((item: any) => item.customerId)
  );
  return customerSet.size > 1;
})();
const handleZXHDJ = () => {
  if (hasDifferentCustomer) {
    ElMessage.error('单次操作只能操作一个客户的数据');
    return;
  }
  let filter = selectionList.value.filter((item: any) => !item.shipperId);
  let filter2 = selectionList.value.filter((item: any) => !item.receiverId);
  let zLen = filter.length || 0;
  let xLen = filter2.length || 0;
  if (zLen == 0 && xLen == 0) {
    ElMessage.error('选择的数据已完成对装卸货点登记');
    return;
  }
  if (zLen > 0 && xLen > 0) {
    if (zLen > xLen) {
      ElMessage.error('选择的数据已填写卸货点数据,请单独编辑');
      return;
    }
    if (zLen < xLen) {
      ElMessage.error('选择的数据已填写装货点数据,请单独编辑');
      return;
    }
  }
  let item: any = selectionList.value[0];
  shipperReceiverForm.value.customerId = item?.customerId
  shipperReceiverForm.value.customerCode = item?.customerCode
  shipperReceiverForm.value.customerName = item?.customerName;
  shipperReceiverForm.value.dispatchNos = selectionList.value.map((item: any) => item.dispatchNo) || [];
  shipperReceiverFormOption.value.column.shipperId.disabled = zLen == 0;
  shipperReceiverFormOption.value.column.shipperId.rules[0].required = zLen != 0;
  shipperReceiverFormOption.value.column.receiverId.disabled = xLen == 0;
  shipperReceiverFormOption.value.column.receiverId.rules[0].required = xLen != 0;
  open7.value = true;
}
const handleAddShipper2 = () => {
  form2.value = {
    customerId: shipperReceiverForm.value.customerId,
    customerSysCode: shipperReceiverForm.value.customerCode,
    customerName: shipperReceiverForm.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(shipperReceiverForm.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 handleAddReceiver2 = () => {
  if (!form.value.customerId) {
    return ElMessage.error('请先选择运输路线');
  }
  form2.value = {
    customerId: shipperReceiverForm.value.customerId,
    customerSysCode: shipperReceiverForm.value.customerCode,
    customerName: shipperReceiverForm.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(shipperReceiverForm.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 handleCloseDispatchNo = (tag: string) => {
  let indexOf = shipperReceiverForm.value.dispatchNos.indexOf(tag);
  shipperReceiverForm.value.dispatchNos.splice(indexOf, 1);
}
const submitZxForm = () => {
  shipperReceiverFormRef.value.validate((valid: boolean, done: any) => {
    if (valid) {
      ypdddjSumbit(shipperReceiverForm.value).then(res => {
        ElMessage.success('登记成功');
        open7.value = false;
        onLoad(page.value);
        done();
      }).catch(err => {
        done();
      })
    }
  })
}
const importLogVisible = ref(false);
const importLogLoading = ref(false);
const importLogData = ref([]);
// 弹窗表格配置
const importLogOption = {
  header: false,
  addBtn: false,
  menu: false, // 仅展示,不需要操作列
  column: [
    { label: '导入时间', prop: 'importTime', type: 'datetime', format: 'YYYY-MM-DD HH:mm:ss' },
    { label: '导入文件名称', prop: 'fileName' },
    { label: '操作人', prop: 'operator' },
    { label: '成功行数', prop: 'successCount' },
    { label: '失败行数', prop: 'failureCount' },
    { label: '失败说明', prop: 'failureDescription', overHidden: true }
  ]
};
// 打开日志弹窗
const handleImportLog = () => {
  importLogVisible.value = true;
};
// 获取日志列表数据(需根据实际 API 调整)
const getImportLogList = () => {
  importLogData.value = []
  // 假设有一个 getLogApi 的接口
  tmsTmsDispatchOrderImportLog().then(res => {
    if (res.code == 200) {
      importLogLoading.value = true;
      importLogData.value = res.data;
      importLogLoading.value = false;
    }
  });
};
// 1. 定义唯一的变量名
const tmsFinanceDetails = ref([]); // 数据源
const expenditureTableOption = ref({
  addBtn: false,
  menu: false,
  header: false,
  border: true,
  index: false,
  selection: false,
  column: [
    {
      label: '费用类型',
      prop: 'feeTypeName',
      width: 150
    },
    {
      label: '费用金额',
      prop: 'actualFeeAmount',
      slot: true,
      width: 150
    },
    {
      label: '币制',
      prop: 'currency',
      slot: true,
      width: 200
    },
    {
      label: '费用凭证',
      display: true,
      span: 24,
      accept: 'string', dataType: 'object',
      type: 'upload',
      // action: '/common/upload2',
      prop: 'voucherUrl', // 这里改成 prop 属性
      slot: true,        // 开启插槽
      width: 200
    },
    {
      label: '备注',
      prop: 'remark',
      slot: true
    }
  ]
});
// 3. 回显初始化
const initExpenditureData = () => {
  if (fee_type.value && fee_type.value.length > 0 && tmsFinanceDetails.value.length === 0) {
    tmsFinanceDetails.value = fee_type.value.map(item => ({
      feeType: item.value,
      feeTypeName: item.label,
      feeAmount: undefined,
      currency: '',
      voucherUrl: '',
      remark: ''
    }));
  }
};
// 4. 监听切换
watch(() => active.value, (val) => {
  if (val === 'tab4') {
    initExpenditureData();
  }
});
const handleUploadAfter = (res, done, loading, column, row) => {
  // res 是接口返回的完整数据
  if (res && res.url) {
    // 手动给这一行的数据赋值
    row.voucherUrl = res.url;
    console.log('上传成功,当前行数据:', row);
  } else if (res.data && res.data.url) {
    // 如果返回的数据包裹在 data 里
    row.voucherUrl = res.data.url;
  }
  done(); // 必须调用 done 结束上传状态
};
</script>
<style lang="scss" scoped>
::v-deep .cydprint .el-dialog__body{
 overflow: hidden;
::v-deep .cydprint .el-dialog__body {
  overflow: hidden;
  //padding: 0;
  margin: 0;
}
#print{
  .title{
#print {
  .title {
    text-align: center;
    font-size: 14pt;
    color: #000;
    line-height:23pt;
    line-height: 23pt;
    font-weight: bold;
    margin: 0;
  }
  .header{
   position: relative;
    .order{
  .header {
    position: relative;
    .order {
      font-size: 12pt;
      color: #000;
      line-height: 23pt;
    }
    .sub-title{
    .sub-title {
      position: absolute;
      left: 50%;
      transform: translateX(-50%);
@@ -4080,19 +4627,33 @@
  table {
    width: 100%;
    border-collapse: collapse; /* 合并边框 */
    border-collapse: collapse;
    /* 合并边框 */
    font-size: 12px;
    table-layout: fixed; /* 关键点 */
    table-layout: fixed;
    /* 关键点 */
  }
  table, td {
  table,
  td {
    border: 1px solid #000;
  }
  td {
    padding: 4px;
    vertical-align: middle;
    width: 50%;          /* 强制等宽 */
    width: 50%;
    /* 强制等宽 */
    word-break: break-all;
  }
}
.dispatchNos {
  //border: 1px solid #ebeef5;
  border-radius: 4px;
  min-height: 73px;
  padding: 1px 11px;
  box-shadow: 0 0 0 1px var(--el-disabled-border-color) inset;
}
</style>