sen
2026-03-31 cc41746818af3b619167947ecb4401ccdfbec2d8
ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -90,21 +90,24 @@
      <template #menu="{ row, index, size }">
        <el-tooltip content="查看" placement="top" :enterable="false">
          <el-link type="primary" icon="el-icon-view" :underline="false" class="link-btn"
          <el-link type="primary" icon="el-icon-view" underline="never" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:query']" @click="$refs.crudRef.rowView(row, index)">
            &nbsp;
          </el-link>
        </el-tooltip>
        <el-tooltip content="删除" placement="top" :enterable="false">
          <el-link type="primary" icon="el-icon-delete" :underline="false" class="link-btn"
          <el-link type="primary" icon="el-icon-delete" underline="never" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:remove']" v-if="row.status == 0"
            @click="$refs.crudRef.rowDel(row, index)">
            &nbsp;
          </el-link>
        </el-tooltip>
        <el-tooltip content="编辑" placement="top" :enterable="false">
          <el-link type="primary" icon="el-icon-edit" :underline="false" class="link-btn"
          <el-link type="primary" icon="el-icon-edit" underline="never" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:edit']" v-if="[0, 1].includes(row.status)"
            @click="$refs.crudRef.rowEdit(row, index)">
            &nbsp;
          </el-link>
        </el-tooltip>
@@ -114,56 +117,66 @@
        <el-tooltip content="运输货品登记" placement="top">
          <el-link size="small" type="primary" @click="handleAddGoods(row)" class="link-btn"
            v-hasPermi="['tms:tmsGoodsDetail:add']" v-if="[0, 1, 2].includes(row.status)" :underline="false"
            v-hasPermi="['tms:tmsGoodsDetail:add']" v-if="[0, 1, 2].includes(row.status)" underline="never"
            icon="el-icon-document-add">
            &nbsp;
          </el-link>
        </el-tooltip>
        <el-tooltip content="实际运输记录" placement="top">
          <el-link size="small" type="primary" @click="handleActual(row)" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:update']" v-if="[0, 1, 2].includes(row.status)" :underline="false"
            v-hasPermi="['tms:tmsDispatchOrder:update']" v-if="[0, 1, 2].includes(row.status)" underline="never"
            icon="el-icon-set-up">
            &nbsp;
          </el-link>
        </el-tooltip>
        <el-tooltip content="确定" placement="top">
          <el-link size="small" type="primary" v-if="row.status == 0" @click="handleConfirm(row)" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:confirmOrder']" :underline="false" icon="el-icon-pointer">
            v-hasPermi="['tms:tmsDispatchOrder:confirmOrder']" underline="never" icon="el-icon-pointer">
            &nbsp;
          </el-link>
        </el-tooltip>
        <el-tooltip content="作废" placement="top">
          <el-link size="small" type="primary" v-if="[0, 1, 2].includes(row.status)" @click="handleClose(row)"
            class="link-btn" v-hasPermi="['tms:tmsDispatchOrder:closeOrder']" :underline="false" icon="el-icon-close">
            class="link-btn" v-hasPermi="['tms:tmsDispatchOrder:closeOrder']" underline="never" icon="el-icon-close">
            &nbsp;
          </el-link>
        </el-tooltip>
        <el-tooltip content="复制" placement="top">
          <el-link size="small" type="primary" @click="handleCopy(row)" class="link-btn" :underline="false"
          <el-link size="small" type="primary" @click="handleCopy(row)" class="link-btn" underline="never"
            v-hasPermi="['tms:tmsDispatchOrder:copyOrder']" icon="el-icon-connection">
            &nbsp;
          </el-link>
        </el-tooltip>
        <el-tooltip content="上传行程" placement="top">
          <el-link size="small" type="primary" v-if="[1, 2].includes(row.status)" @click="handleUploadItinerary(row)"
            v-hasPermi="['tms:tmsTrip:add']" class="link-btn" :underline="false" icon="el-icon-upload">
            v-hasPermi="['tms:tmsTrip:add']" class="link-btn" underline="never" icon="el-icon-upload">
            &nbsp;
          </el-link>
        </el-tooltip>
        <el-tooltip content="查看行程" placement="top">
          <el-link size="small" type="primary" v-if="![0, 1].includes(row.status)" @click="handleLogItinerary(row)"
            v-hasPermi="['tms:tmsTrip:list']" class="link-btn" :underline="false" icon="el-icon-view">
            v-hasPermi="['tms:tmsTrip:list']" class="link-btn" underline="never" icon="Finished">
            &nbsp;
          </el-link>
        </el-tooltip>
        <el-tooltip content="完成行程" placement="top">
          <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:okOrder']" :underline="false" icon="el-icon-circle-check">
            v-hasPermi="['tms:tmsDispatchOrder:okOrder']" underline="never" icon="el-icon-circle-check">
            &nbsp;
          </el-link>
        </el-tooltip>
        <!--
        <el-tooltip content="完成行程" placement="top">
          <el-link size="small" type="primary" v-if="[2].includes(row.status)" @click="handleOk(row)" class="link-btn"
            v-hasPermi="['tms:tmsDispatchOrder:okOrder']" :underline="false" icon="el-icon-circle-check">
            v-hasPermi="['tms:tmsDispatchOrder:okOrder']" underline="never" icon="el-icon-circle-check">
            &nbsp;
          </el-link>
        </el-tooltip>
        </el-tooltip> -->
        <el-tooltip content="日志" placement="top">
          <el-link size="small" type="primary" @click="handleFlow(row)" class="link-btn"
            v-hasPermi="['cwgl:estimatedReceivable:flog']"   :underline="false" icon="el-icon-document">
            v-hasPermi="['cwgl:estimatedReceivable:flog']" underline="never" icon="el-icon-document">
            &nbsp;
          </el-link>
        </el-tooltip>
@@ -201,7 +214,7 @@
            min="0"></el-input-number>
        </template>
      </avue-crud>
      <h2 v-if="optionType == 'addFinance'">实报实销费用1</h2>
      <h2 v-if="optionType == 'addFinance'">实报实销费用</h2>
      <avue-form v-if="optionType == 'addItinerary' || optionType == 'addFinance'" v-model="boxForm" ref="boxFormRef"
        :option="boxFormOption">
@@ -335,7 +348,7 @@
      </avue-crud>
      <div v-if="active === 'tab4'">
        <h2>实报实销费用</h2>
        <h2>实报实销费用3</h2>
        <!-- <avue-form v-model="boxForm" ref="boxFormRef" :option="boxFormOption">
        </avue-form> -->
@@ -344,7 +357,6 @@
            <el-input-number v-model="row.actualFeeAmount" :precision="2" :min="0" controls-position="right"
              placeholder="输入金额" style="width: 100%" />
          </template>
          <template #currency="{ row }">
            <el-radio-group v-model="row.currency">
              <el-radio v-for="item in sys_currency" :key="item.value" :label="item.value">
@@ -353,8 +365,19 @@
            </el-radio-group>
          </template>
          <template #voucherUrl="{ row }">
            <avue-upload v-model="row.voucherUrl" :action="'/common/upload2'" type="upload" accept="image/*"
              @upload-after="(res, done, loading, column) => handleUploadAfter(res, done, loading, column, row)"></avue-upload>
            <!-- <avue-upload v-model="row.voucherUrl" :action="'/common/upload2'" type="upload" accept="image/*"
              @upload-after="(res, done, loading, column) => handleUploadAfter(res, done, loading, column, row)"></avue-upload> -->
            <!-- 凭证图片 -->
            <el-upload class="upload-demo" ref="uploadRef" :limit="1" drag :action="urlApi + '/common/upload2'" multiple
              :show-file-list="true" :on-success="(res) => handleUploadAfter(res, row)"
              :on-exceed="(files) => handleExceed(files, row)">
              <el-icon class="el-icon--upload"><upload-filled /></el-icon>
              <div class="el-upload__text">
                点击或将图片拖拽到此区域上传
              </div>
            </el-upload>
          </template>
          <template #remark="{ row }">
            <el-input v-model="row.remark" placeholder="填写备注" clearable />
@@ -490,7 +513,7 @@
        <div class="dialog-footer">
          <el-button @click="print = 0" v-if="print == 1">重新填写</el-button>
          <el-button type="primary" :loading="pageF.isUploading" @click="submitForm6">
            {{ pageF.isUploading ? '提交中' : '确 定2' }}
            {{ pageF.isUploading ? '提交中' : '确 定' }}
          </el-button>
          <el-button @click="open6 = false">取 消</el-button>
@@ -508,7 +531,7 @@
        <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;"
            <el-link type="primary" underline="never" style="font-size:12px;vertical-align: baseline;"
              @click="importTemplate">下载模板</el-link>
          </div>
        </template>
@@ -566,8 +589,8 @@
        @on-load="getImportLogList"></avue-crud>
    </el-dialog>
     <flowLog ref="flowLogIshow" :isShow="false" :flowParams="flowParams"></flowLog>
    <flowLog ref="flowLogIshow" :isShow="false" :flowParams="flowParams"></flowLog>
  </basicContainer>
@@ -598,10 +621,11 @@
  printDispatchOrder,
  importTemplateTmsDispatchOrder, ypdddjSumbit,
  tmsTmsDispatchOrderImportLog,
  saveTmsFinanceDetail2
  saveTmsFinanceDetail2,
  getLastLicensePlate
} from "@/api/tms/tmsDispatchOrder";
import useCurrentInstance from "@/utils/useCurrentInstance";
import { computed, onMounted, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
import { computed, onMounted, onBeforeUnmount, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
import { PagesInterface, PageQueryInterface } from "@/utils/globalInterface";
import { usePagePlus } from "@/hooks/usePagePlus";
import { hasPermission } from "@/utils/permissionUtils";
@@ -660,11 +684,30 @@
    return true;
  }
};
const getNextDayMidnight = () => {
  const date = new Date();
  // 1. 将日期推进到明天
  date.setDate(date.getDate() + 1);
  // 2. 将时分秒毫秒全部清零
  date.setHours(0, 0, 0, 0);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const hours = String(date.getHours()).padStart(2, '0');
  const minutes = String(date.getMinutes()).padStart(2, '0');
  const seconds = String(date.getSeconds()).padStart(2, '0');
  // 返回格式:2024-01-20 00:00:00
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
};
const data = reactive({
  form: <TmsDispatchOrderI>{},
  queryParams: <TmsDispatchOrderI & PageQueryInterface>{},
  page: <PagesInterface>{
    pageSize: 10,
    pageSize: 30,
    total: 0,
    currentPage: 1,
  },
@@ -697,6 +740,7 @@
} = toRefs(data);
const option = ref({
  menuType: 'icon',
  viewBtn: false, // 关闭原生查看
  editBtn: false, // 关闭原生编辑
  delBtn: false, // 关闭原生编辑
@@ -710,7 +754,7 @@
  labelWidth: 130,
  searchSpan: 6,
  searchLabelWidth: 150,
  menuWidth: 300,
  menuWidth: 350,
  height: 530,
  group: [
    {
@@ -1075,6 +1119,7 @@
        },
        latestDeparture: {
          label: '要求最晚出发时间',
          value: getNextDayMidnight(),
          type: 'datetime',  // 改为 datetime 类型
          format: 'YYYY-MM-DD HH:mm:ss', labelWidth: 150,
          valueFormat: 'YYYY-MM-DD HH:mm:ss',
@@ -1088,6 +1133,7 @@
        },
        latestArrival: {
          label: '要求最晚到达时间', labelWidth: 150,
          value: getNextDayMidnight(),
          type: 'datetime',  // 改为 datetime 类型
          format: 'YYYY-MM-DD HH:mm:ss',
          valueFormat: 'YYYY-MM-DD HH:mm:ss',
@@ -1117,7 +1163,6 @@
            }
          ],
          change: ({ value }: any) => {
            console.log(value)
            option.value.group.forEach((item: any) => {
              if (item.prop == 'pcxx') {
                item.column.commissionModel.display = value != 1;
@@ -1240,24 +1285,64 @@
            }
          ],
          change: (val: any) => {
            // 防止重复执行
            if (data.isChanging) return;
            data.isChanging = true;
            const table = crudRef.value?.getPropRef?.('mainDriverId')?.$refs?.temp;
            if (!table) return;
            if (!table) {
              data.isChanging = false;
              return;
            }
            let active = table.active;
            if (Array.isArray(active)) active = active[0];
            if (active) {
              Object.assign(form.value, {
                mainDriverId: active.id,
                mainDriverName: active.driverName,
              });
              // 获取车牌号并赋值
              getLastLicensePlate(active.driverName).then(res => {
                if (res.code == 200) {
                  form.value.licensePlate = res.data.licensePlate;
                    form.value.vehicleId = res.data.vehicleId
                }
              }).finally(() => {
                data.isChanging = false;
              });
            } else {
              data.isChanging = false;
            }
          },
          // change: (val: any) => {
          //   const table = crudRef.value?.getPropRef?.('mainDriverId')?.$refs?.temp;
          //   if (!table) return;
          //   let active = table.active;
          //   if (Array.isArray(active)) active = active[0];
          //   console.log(active,'888');
          //   if (active) {
          //     Object.assign(form.value, {
          //       mainDriverId: active.id,
          //       mainDriverName: active.driverName,
          //     });
          //     console.log(active.driverName,'44');
          //     getLastLicensePlate(active.driverName).then(res => {
          //       console.log(res);
          //     })
          //   }
          // },
          type: 'table', suffixIcon: 'search',
          children: {
            border: true,
            searchMenuSpan: 5,
            column: {
              vehicleProviderName: {
                label: '车辆服务商', minWidth: 130,
                label: '车辆服务商1', minWidth: 130,
                search: true,
              },
              driverName: {
@@ -1368,7 +1453,7 @@
        },
        vehicleId: {
          label: '车牌号', dataType: 'string',
          label: '车牌号1', dataType: 'string',
          display: true,
          rules: [
            {
@@ -1734,21 +1819,25 @@
      label: '调度单号', minWidth: 180,
      display: false,
      search: true,
      overHidden: true
    },
    licensePlate: {
      label: '车牌号', minWidth: 120,
      display: false,
      search: true,
      overHidden: true
    },
    customerName: {
      label: '客户',
      display: false, minWidth: 250,
      search: true,
      overHidden: true
    },
    mainDriverName: {
      label: '主驾驶员',
      display: false, minWidth: 120,
      search: true,
      overHidden: true
    },
    requiredVehicleTypes: {
      label: '下单车型', minWidth: 130,
@@ -1758,35 +1847,67 @@
    },
    createTimeRange: {
      label: '创建时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      label: '创建时间', display: false, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
      overHidden: true
    },
    createTimeRangeArray: {
      label: '创建时间',
      minWidth: 150,
      search: true,
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
    updateTimeRange: {
      label: '更新时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      label: '更新时间', display: false, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
      overHidden: true
    },
    updateTimeRangeArray: {
      label: '更新时间',
      minWidth: 150,
      search: true,
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
    loadingServiceProviderName: {
      label: '装货服务商名称', minWidth: 150,
      display: false,
      search: true,
      overHidden: true
    },
    customsServiceProviderName: {
      label: '报关服务商名称', minWidth: 150,
      display: false,
      search: true,
      overHidden: true
    },
    projectName: {
      label: '项目名称',
      display: false, minWidth: 250,
      search: true,
      overHidden: true
    },
    contractName: {
      label: '关联合同名称', minWidth: 250,
      display: false,
      search: true,
      overHidden: true
    },
    orderType: {
      label: '订单类型',
@@ -1814,6 +1935,7 @@
      label: '车辆服务商名称', minWidth: 150,
      display: false,
      search: true,
      overHidden: true
    },
@@ -1866,11 +1988,13 @@
      label: '装货点名称',
      display: false, minWidth: 200,
      search: true,
      overHidden: true
    },
    receiverName: {
      label: '卸货点名称', minWidth: 200,
      display: false,
      search: true,
      overHidden: true
    },
    // accountsReceivableStatus: {
    //   label: '应收费用生成状态', minWidth: 160,
@@ -1911,16 +2035,18 @@
    },
    confirmTime: {
      label: '确认时间', minWidth: 180,
      label: '确认时间', minWidth: 200,
      display: false,
      hide: false,
      search: false,
      searchSpan: 6,
    },
    orderTime: {
      label: '下单时间', minWidth: 180,
      display: false,
      hide: false,
      search: false,
      searchSpan: 6,
    },
    createBy: {
      label: '创建人', minWidth: 150,
@@ -1937,6 +2063,8 @@
      viewDisplay: false,
      hide: false,
      search: false,
      overHidden: true,
      searchSpan: 6,
    },
    updateBy: {
@@ -1954,22 +2082,64 @@
      viewDisplay: false,
      hide: false,
      search: false,
      overHidden: true,
      searchSpan: 6,
    },
    confirmTimeRange: {
      label: '确认时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      label: '确认时间', display: false, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
    },
    confirmTimeRangeArray: {
      label: '确认时间',
      minWidth: 150,
      search: true,
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
    okTimeRange: {
      label: '完成时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
      label: '完成时间', display: false, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
    },
    orderTimeRange: {
      label: '下单时间', display: false, search: true, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 5,
    okTimeRangeArray: {
      label: '完成时间',
      minWidth: 150,
      search: true,
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
    orderTimeRange: {
      label: '下单时间', display: false, searchRange: true, type: 'date',
      format: 'YYYY-MM-DD', hide: true, searchSpan: 6,
      valueFormat: 'YYYY-MM-DD',
    },
    orderTimeRangeArray: {
      label: '下单时间',
      minWidth: 150,
      search: true,
      searchRange: true,
      addDisplay: false,  // 新增时不显示
      editDisplay: false, // 修改时不显示
      type: 'daterange',
      startPlaceholder: '开始日期',
      endPlaceholder: '结束日期',
      valueFormat: 'YYYY-MM-DD',
      hide: true
    },
  }
@@ -2062,7 +2232,7 @@
    },
  }
})
const urlApi = ref(import.meta.env.VITE_APP_BASE_API)
const itineraryTableOption = ref({
  menu: false,
  addBtn: false,
@@ -2141,19 +2311,19 @@
      ],
    },
    currency: {
      label: '币种',
      label: '币制',
      display: true,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
      rules: [
        {
          required: true,
          message: "币种不能为空", trigger: "change"
          message: "币制不能为空", trigger: "change"
        }
      ],
    },
    voucherUrl: {
      label: '费用凭证',
      label: '费用凭证1',
      display: true,
      accept: 'string', dataType: 'string',
      type: 'upload',
@@ -2204,7 +2374,7 @@
      display: true,
    },
    currency: {
      label: '币种',
      label: '币制',
      display: true,
      type: 'radio', dataType: 'string', dicUrl: '/system/dict/data/type/sys_currency',
    },
@@ -2990,13 +3160,71 @@
      zxhdjSingle.value = false;
    }
  },
  getBeginListFunc: (params = {}) => {
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.createTimeRange, 'createTime') || {};
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.updateTimeRange, 'updateTime') || {};
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.confirmTimeRange, 'confirmTime') || {};
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.okTimeRange, 'okTime') || {};
    queryParams.value = proxy.addDateRangeNew(queryParams.value, queryParams.value?.orderTimeRange, 'orderTime') || {};
    return params;
    // 1. 日期转换
    let newParams = <any>{ ...params };
    if (newParams) {
      // 1. 定义日期字段映射 (数组名 : 接口需要的前缀)
      // 这样写的好处是:如果你有多个日期,直接在这里添加一行即可
      const dateMap = {
        confirmTimeRangeArray: 'confirmTimeRange',
        createTimeRangeArray: 'createTime',
        updateTimeRangeArray: 'updateTimeRange',
        okTimeRangeArray: 'okTime',
        orderTimeRangeArray: 'orderTime'
      };
      // 2. 遍历处理日期
      Object.keys(dateMap).forEach(arrayKey => {
        const prefix = dateMap[arrayKey];
        const range = newParams[arrayKey];
        if (Array.isArray(range) && range.length > 0) {
          // 赋值 Begin 和 End
          newParams[`${prefix}Begin`] = range[0];
          newParams[`${prefix}End`] = range[1];
        }
        // 【核心改动】:无论是否有值,处理完后都把原始的 Array 字段删掉
        // 这样请求里就不会出现 confirmTimeRangeArray: [...]
        delete newParams[arrayKey];
      });
      // 3. 通用清洗:删除所有空字符串、null 或 undefined 的其他字段
      Object.keys(newParams).forEach(key => {
        const val = newParams[key];
        if (val === '' || val === null || val === undefined) {
          delete newParams[key];
        }
      });
    } else {
      newParams = {};
    }
    return newParams;
    // newParams = proxy.addDateRangeNew(queryParams.value, queryParams.value?.createTimeRangeArray, 'createTime');
    // newParams = proxy.addDateRangeNew(queryParams.value, queryParams.value?.updateTimeRangeArray, 'updateTime');
    // newParams = proxy.addDateRangeNew(queryParams.value, queryParams.value?.confirmTimeRangeArray, 'confirmTime');
    // newParams = proxy.addDateRangeNew(queryParams.value, queryParams.value?.okTimeRangeArray, 'okTime');
    // newParams =  proxy.addDateRangeNew(queryParams.value, queryParams.value?.orderTimeRangeArray, 'orderTime');
    // delete newParams.createTimeRangeArray;
    // delete newParams.updateTimeRangeArray;
    // delete newParams.confirmTimeRangeArray;
    // delete newParams.okTimeRangeArray;
    // delete newParams.orderTimeRangeArray;
    // delete newParams.updateTimeArray;
    // delete newParams.businessTimeArray;
    // delete newParams.payableConfirmTimeArray;
    queryParams.value = newParams;
    return newParams;
  },
  handleBeforeOpenFunc: (type: string) => {
    if (type == 'add') {
@@ -3060,7 +3288,6 @@
const handleUploadItinerary = (row: any) => {
  optionType.value = 'addItinerary';
  boxFormOption.value = itineraryOption.value;
  console.log(itineraryOption.value);
  boxTableOption.value = itineraryTableOption.value;
  listTmsTrip({ dispatchOrderId: row.id, pageNum: 1, pageSize: 999 }).then(res => {
@@ -3076,7 +3303,6 @@
      vehicleNumber: row.licensePlate,
      vehicleId: row.vehicleId,
    }
    console.log(boxForm.value);
  })
}
@@ -3720,7 +3946,6 @@
                  form2.value.districtId = districtCode;
                  form2.value.streetId = townshipCode;
                  form2.value.dispatchTransportArea = params.regeocode.formatted_address || params.regeocode.formattedAddress;
                  console.log(form2.value, "form2")
                }
              });
            }
@@ -3929,7 +4154,6 @@
getQuotationItems();
const getTabData = (val: string) => {
  console.log(val)
  let filter = quotationItems.value.filter((item: any) => {
    return item.remark == val;
  });
@@ -3947,9 +4171,7 @@
    dispatchOrderId: form.value.id, financeType: 2,
    pageNum: 1, pageSize: 999
  }).then(async res => {
    boxTableData.value = res.rows || [];
    boxForm.value = {
      dispatchOrderId: form.value.id,
      dataSource: 0,
@@ -3993,8 +4215,12 @@
    // 3. 处理凭证 URL (如果有单张或多张上传的逻辑)
    // 假设后端需要的是逗号分隔的字符串
    const submitData = validDetails.map(item => {
    const submitData = validDetails.map((item: any) => {
      let url = item.voucherUrl;
      item.dispatchOrderId = form.value.id;
      item.financeType = 2;
      item.status = 0;
      item.dataSource = 1;
      if (Array.isArray(url)) {
        url = url.join(',');
      }
@@ -4555,13 +4781,12 @@
    },
    {
      label: '费用凭证',
      label: '费用凭证2',
      display: true,
      span: 24,
      accept: 'string', dataType: 'object',
      type: 'upload',
      // action: '/common/upload2',
      prop: 'voucherUrl', // 这里改成 prop 属性
      slot: true,        // 开启插槽
      width: 200
@@ -4575,6 +4800,7 @@
});
// 3. 回显初始化
const initExpenditureData = () => {
  tmsFinanceDetails.value = []
  if (fee_type.value && fee_type.value.length > 0 && tmsFinanceDetails.value.length === 0) {
    tmsFinanceDetails.value = fee_type.value.map(item => ({
      feeType: item.value,
@@ -4592,19 +4818,25 @@
    initExpenditureData();
  }
});
const handleUploadAfter = (res, done, loading, column, row) => {
const handleUploadAfter = (res: any, row: any) => {
  // res 是接口返回的完整数据
  if (res && res.url) {
  if (res.code === 200) {
    // 手动给这一行的数据赋值
    row.voucherUrl = res.url;
    console.log('上传成功,当前行数据:', row);
    row.voucherUrl = res.data.url;
  } else if (res.data && res.data.url) {
    // 如果返回的数据包裹在 data 里
    row.voucherUrl = res.data.url;
  }
  done(); // 必须调用 done 结束上传状态
};
/** 当文件超出限制时(实现自动替换逻辑) */
const handleExceed = (files: any, row: any) => {
  // 1. 清除当前显示的文件列表
  uploadRef.value.clearFiles();
  // 2. 手动把新选择的文件添加进去重新上传
  const file = files[0];
  uploadRef.value.handleStart(file);
  uploadRef.value.submit();
};
const flowLogIshow = ref()
const flowParams = ref([])
@@ -4694,4 +4926,74 @@
.link-btn {
  font-size: 18px;
}
/*  */
/* 现有的样式保持不变... */
.specific-drag-area {
  width: 100%;
  :deep(.full-width-drag) {
    // 1. 核心:隐藏 Avue 默认在 dragger 下方生成的那个“点击上传”按钮
    // 在 3.x 版本中,它是 el-upload 后的一个兄弟节点或者是内部节点
    .el-button--primary {
      display: none !important;
    }
    .el-upload {
      width: 100%;
      display: block; // 确保块级显示
      .el-upload-dragger {
        width: 100%;
        height: 120px;
        background-color: #fcfdfe;
        border: 2px dashed #dcdfe6;
        border-radius: 8px;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        padding: 0 !important;
        // 覆盖 Element Plus 默认的内部文字排版,防止冲突
        .el-upload__text {
          display: none !important;
        }
        &:hover {
          border-color: #409eff;
          background-color: #f5f7fa;
        }
      }
    }
  }
  // 3. 自定义内容的样式(确保它不被 display:none 影响)
  .drag-zone-inner {
    pointer-events: none;
    text-align: center;
    .upload-icon {
      font-size: 32px !important;
      color: #909399;
      margin-bottom: 8px;
    }
    .drag-text {
      .main-title {
        font-size: 14px;
        color: #606266;
        font-weight: bold;
        line-height: 1.5;
      }
      .sub-title {
        font-size: 12px;
        color: #a8abb2;
        margin-top: 4px;
      }
    }
  }
}
</style>