sen
2026-03-26 030b6b200408629f2d957ff3ff9a930ff0b62a6a
ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -90,43 +90,97 @@
      <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 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="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>
      </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"
            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="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="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="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="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="never" icon="el-icon-view">
            &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="never" icon="el-icon-circle-check">
            &nbsp;
          </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-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="never" icon="el-icon-circle-check">
            &nbsp;
          </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 size="small" type="primary" @click="handleFlow(row)" class="link-btn"
            v-hasPermi="['cwgl:estimatedReceivable:flog']" underline="never" icon="el-icon-document">
            &nbsp;
          </el-link>
        </el-tooltip>
      </template>
      <!-- <template #menu="{row}">
@@ -467,7 +521,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>
@@ -524,10 +578,16 @@
      <avue-crud :data="importLogData" :option="importLogOption" :table-loading="importLogLoading"
        @on-load="getImportLogList"></avue-crud>
    </el-dialog>
    <flowLog ref="flowLogIshow" :isShow="false" :flowParams="flowParams"></flowLog>
  </basicContainer>
</template>
<script setup name="tmsDispatchOrder" lang="ts">
import { listTmsDispatchOrderLog } from "@/api/tms/tmsDispatchOrderLog";
import {
  TmsDispatchOrderI,
  addTmsDispatchOrder,
@@ -536,6 +596,7 @@
  getTmsDispatchOrder,
  listTmsDispatchOrder,
  updateTmsDispatchOrder,
  tmsDispatchOrderRecord,
  confirmOrder,
  copyOrder,
  okOrder,
@@ -586,6 +647,7 @@
import { pushTmsQuoteFee } from "@/api/tms/tmsQuoteFee";
import { $Print } from '@smallwei/avue'
import { getToken } from "@/utils/auth";
import { useAvueTableShowHide } from "@/hooks/useAvueTableShowHide";
const { appContext } = getCurrentInstance();
@@ -611,11 +673,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,
  },
@@ -648,8 +729,10 @@
} = toRefs(data);
const option = ref({
  menuType: 'icon',
  viewBtn: false, // 关闭原生查看
  editBtn: false, // 关闭原生编辑
  delBtn: false, // 关闭原生编辑
  searchIndex: 7, // 关键:折叠时显示的个数(根据你的字段数量调整)
  searchIcon: true, // 关键:显示折叠/展开按钮
@@ -1025,6 +1108,7 @@
        },
        latestDeparture: {
          label: '要求最晚出发时间',
          value: getNextDayMidnight(),
          type: 'datetime',  // 改为 datetime 类型
          format: 'YYYY-MM-DD HH:mm:ss', labelWidth: 150,
          valueFormat: 'YYYY-MM-DD HH:mm:ss',
@@ -1038,6 +1122,7 @@
        },
        latestArrival: {
          label: '要求最晚到达时间', labelWidth: 150,
          value: getNextDayMidnight(),
          type: 'datetime',  // 改为 datetime 类型
          format: 'YYYY-MM-DD HH:mm:ss',
          valueFormat: 'YYYY-MM-DD HH:mm:ss',
@@ -1681,24 +1766,28 @@
  column: {
    dispatchNo: {
      label: '调度单号', minWidth: 120,
      label: '调度单号', minWidth: 180,
      display: false,
      search: true,
      overHidden: true
    },
    licensePlate: {
      label: '车牌号', minWidth: 120,
      display: false,
      search: true,
      overHidden: true
    },
    customerName: {
      label: '客户',
      display: false, minWidth: 120,
      display: false, minWidth: 250,
      search: true,
      overHidden: true
    },
    mainDriverName: {
      label: '主驾驶员',
      display: false, minWidth: 120,
      search: true,
      overHidden: true
    },
    requiredVehicleTypes: {
      label: '下单车型', minWidth: 130,
@@ -1708,35 +1797,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: 120,
      display: false, minWidth: 250,
      search: true,
      overHidden: true
    },
    contractName: {
      label: '关联合同名称', minWidth: 120,
      label: '关联合同名称', minWidth: 250,
      display: false,
      search: true,
      overHidden: true
    },
    orderType: {
      label: '订单类型',
@@ -1764,6 +1885,7 @@
      label: '车辆服务商名称', minWidth: 150,
      display: false,
      search: true,
      overHidden: true
    },
@@ -1790,7 +1912,7 @@
    },
    isPrint: {
      label: '是否打印承运单',
      display: false, minWidth: 100,
      display: false, minWidth: 120,
      search: true,
      type: 'select', dicUrl: '/system/dict/data/type/sys_number_is', dataType: 'string',
@@ -1814,13 +1936,15 @@
    shipperName: {
      label: '装货点名称',
      display: false, minWidth: 120,
      display: false, minWidth: 200,
      search: true,
      overHidden: true
    },
    receiverName: {
      label: '卸货点名称', minWidth: 120,
      label: '卸货点名称', minWidth: 200,
      display: false,
      search: true,
      overHidden: true
    },
    // accountsReceivableStatus: {
    //   label: '应收费用生成状态', minWidth: 160,
@@ -1861,16 +1985,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,
@@ -1887,6 +2013,8 @@
      viewDisplay: false,
      hide: false,
      search: false,
      overHidden: true,
      searchSpan: 6,
    },
    updateBy: {
@@ -1904,22 +2032,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
    },
  }
@@ -2940,13 +3110,73 @@
      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 };
    console.log(newParams, '2');
   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 = {};
}
console.log('最终发送给接口的参数:', 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') {
@@ -2955,6 +3185,9 @@
  }
})
useAvueTableShowHide(option.value);
const handleConfirm = (row: any) => {
  ElMessageBox.confirm("是否对调度单号" + row.dispatchNo + "确定 ?", '系统提示', {
    confirmButtonText: '确定',
@@ -3024,7 +3257,7 @@
      vehicleId: row.vehicleId,
    }
    console.log(boxForm.value);
  })
}
const cancelBox = () => {
@@ -3294,7 +3527,7 @@
}
const submitForm3 = () => {
  updateTmsDispatchOrder(actualForm.value).then(res => {
  tmsDispatchOrderRecord(actualForm.value).then(res => {
    ElMessage({
      message: "操作成功!",
      type: 'success'
@@ -3923,7 +4156,7 @@
    //boxForm.value.rowItems = boxTableData.value;
    // console.log(tmsFinanceDetails.value);
    // console.log(boxForm.value);
// 1. 提取填写了金额的数据(金额大于0)
    // 1. 提取填写了金额的数据(金额大于0)
    const validDetails = tmsFinanceDetails.value.filter(item => item.actualFeeAmount && item.actualFeeAmount > 0);
    if (validDetails.length === 0) {
@@ -3954,8 +4187,8 @@
        message: "操作成功!",
        type: 'success'
      })
        open4.value = false;
        onLoad(page.value)
      open4.value = false;
      onLoad(page.value)
      boxFormRef.value?.resetFields();
      getTab4Data();
    })
@@ -4551,6 +4784,21 @@
  }
  done(); // 必须调用 done 结束上传状态
};
const flowLogIshow = ref()
const flowParams = ref([])
const handleFlow = (row: string) => {
  let data = {
    headId: row.id,
  }
  listTmsDispatchOrderLog(data).then((res) => {
    flowParams.value = res.rows
    flowLogIshow.value.openModel()
  })
}
</script>
<style lang="scss" scoped>
::v-deep .cydprint .el-dialog__body {
@@ -4622,4 +4870,8 @@
  padding: 1px 11px;
  box-shadow: 0 0 0 1px var(--el-disabled-border-color) inset;
}
</style>
.link-btn {
  font-size: 18px;
}
</style>