sen
2026-03-26 030b6b200408629f2d957ff3ff9a930ff0b62a6a
ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -90,22 +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"
                   v-hasPermi="['tms:tmsDispatchOrder:query']"
            @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="false" class="link-btn"
                   v-hasPermi="['tms:tmsDispatchOrder:remove']" v-if="row.status == 0"
          <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"
                   v-hasPermi="['tms:tmsDispatchOrder:edit']" v-if="[0, 1].includes(row.status)"
          <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,53 +116,70 @@
        <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-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="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" icon="el-icon-set-up">
        </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="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">
        </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="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">
        </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="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"
                 v-hasPermi="['tms:tmsDispatchOrder:copyOrder']"
                 icon="el-icon-connection">
        </el-link>
          <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">
        </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="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">
        </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="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="false" icon="el-icon-circle-check">
        </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="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="never" icon="el-icon-circle-check">
            &nbsp;
          </el-link>
        </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="never" icon="el-icon-document">
            &nbsp;
          </el-link>
        </el-tooltip>
      </template>
@@ -502,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>
@@ -559,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,
@@ -571,6 +596,7 @@
  getTmsDispatchOrder,
  listTmsDispatchOrder,
  updateTmsDispatchOrder,
  tmsDispatchOrderRecord,
  confirmOrder,
  copyOrder,
  okOrder,
@@ -621,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();
@@ -646,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,
  },
@@ -683,6 +729,7 @@
} = toRefs(data);
const option = ref({
  menuType: 'icon',
  viewBtn: false, // 关闭原生查看
  editBtn: false, // 关闭原生编辑
  delBtn: false, // 关闭原生编辑
@@ -1061,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',
@@ -1074,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',
@@ -1717,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,
@@ -1744,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: '订单类型',
@@ -1800,6 +1885,7 @@
      label: '车辆服务商名称', minWidth: 150,
      display: false,
      search: true,
      overHidden: true
    },
@@ -1826,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',
@@ -1850,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,
@@ -1897,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,
@@ -1923,6 +2013,8 @@
      viewDisplay: false,
      hide: false,
      search: false,
      overHidden: true,
      searchSpan: 6,
    },
    updateBy: {
@@ -1940,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
    },
  }
@@ -2976,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') {
@@ -2991,6 +3185,9 @@
  }
})
useAvueTableShowHide(option.value);
const handleConfirm = (row: any) => {
  ElMessageBox.confirm("是否对调度单号" + row.dispatchNo + "确定 ?", '系统提示', {
    confirmButtonText: '确定',
@@ -3330,7 +3527,7 @@
}
const submitForm3 = () => {
  updateTmsDispatchOrder(actualForm.value).then(res => {
  tmsDispatchOrderRecord(actualForm.value).then(res => {
    ElMessage({
      message: "操作成功!",
      type: 'success'
@@ -3959,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) {
@@ -3990,8 +4187,8 @@
        message: "操作成功!",
        type: 'success'
      })
        open4.value = false;
        onLoad(page.value)
      open4.value = false;
      onLoad(page.value)
      boxFormRef.value?.resetFields();
      getTab4Data();
    })
@@ -4587,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 {
@@ -4658,4 +4870,8 @@
  padding: 1px 11px;
  box-shadow: 0 0 0 1px var(--el-disabled-border-color) inset;
}
.link-btn {
  font-size: 18px;
}
</style>