sen
昨天 7ed2a032d0724e68aec8af940f2ce0023a9f0eb7
ui/admin-ui3/src/views/tms/tmsDispatchOrder/index.vue
@@ -5,7 +5,14 @@
      @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 #licensePlate-form="{ row, disabled }">
        <el-input v-model="form.licensePlate" placeholder="请选择车牌号" readonly :disabled="disabled"
          @click="handleVehicleSelect">
          <template #append>
            <el-button icon="el-icon-search" @click="handleVehicleSelect" />
          </template>
        </el-input>
      </template>
      <!-- template 中 -->
      <template #requiredVehicleTypes-form="{ row, disabled }">
        <template v-if="disabled">
@@ -319,7 +326,7 @@
      </div>
      <div v-if="optionType == 'loading'">
            <el-descriptions v-if="optionNum == 'radio'" style="margin-bottom: 20px" :column="2" border>
        <el-descriptions v-if="optionNum == 'radio'" 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>
@@ -649,7 +656,17 @@
    <flowLog ref="flowLogIshow" :isShow="false" :flowParams="flowParams"></flowLog>
  </basicContainer>
  <el-dialog title="选择车辆" v-model="vehicleDialogVisible" width="70%" append-to-body :close-on-click-modal="false">
    <avue-crud ref="vehicleCrudRef" :option="vehicleOption" :data="vehicleData" :page="vehiclePage"
      @on-load="loadVehicleList" @search-change="vehicleSearchChange" @search-reset="vehicleSearchReset"
      @current-change="vehicleCurrentChange" @size-change="vehicleSizeChange" @row-click="handleVehicleRowClick">
    </avue-crud>
    <template #footer>
      <el-button @click="vehicleDialogVisible = false">取 消</el-button>
      <el-button type="primary" @click="confirmVehicleSelection">确 定</el-button>
    </template>
  </el-dialog>
</template>
@@ -679,7 +696,7 @@
  importTemplateTmsDispatchOrder, ypdddjSumbit,
  tmsTmsDispatchOrderImportLog,
  saveTmsFinanceDetail2,
  getLastLicensePlate,
  getLastLicensePlate,
} from "@/api/tms/tmsDispatchOrder";
import useCurrentInstance from "@/utils/useCurrentInstance";
import { computed, onMounted, onBeforeUnmount, reactive, ref, toRefs, watch, getCurrentInstance, nextTick } from "vue";
@@ -719,15 +736,27 @@
import {
  tmsFinanceDetail
} from "@/api/tms/tmsDispatchOrder";
const { appContext } = getCurrentInstance();
const { appContext } = getCurrentInstance() as any;
const { proxy } = useCurrentInstance(
);
// 定义类型
interface VehicleRow {
  id?: string;
  licensePlate?: string;
  serviceProviderName?: string;
  vehicleType?: string;
  internalCode?: string;
  licenseHk?: string;
  licenseMo?: string;
  [key: string]: any;
}
const { fee_type, sys_currency, vehicle_type, order_type } = proxy.useDict('fee_type', 'sys_currency', 'vehicle_type', 'order_type')
const crudRef = ref();
const boxFormRef = ref();
const goodsCrudRef = ref();
const actualFormRef = ref();
const isAutoSettingVehicle = ref(false);
/**
 * 字典公共转换函数
 */
@@ -1178,9 +1207,9 @@
        // },
        orderTime: {
          label: '下单时间',
          type: 'datetime',  // 改为 datetime 类型
          format: 'YYYY-MM-DD HH:mm:ss',
          valueFormat: 'YYYY-MM-DD HH:mm:ss',
          type: 'date',  // 改为 datetime 类型
          format: 'YYYY-MM-DD',
          valueFormat: 'YYYY-MM-DD',
          display: true,
          rules: [
            {
@@ -1356,37 +1385,54 @@
              message: "主驾驶员不能为空", trigger: "change"
            }
          ],
          change: (val: any) => {
            // 防止重复执行
          // 在 mainDriverId 的 change 事件中
          change: async (val: any) => {
            if (data.isChanging) return;
            data.isChanging = true;
            isAutoSettingVehicle.value = true;
            const table = crudRef.value?.getPropRef?.('mainDriverId')?.$refs?.temp;
            if (!table) {
              data.isChanging = false;
              isAutoSettingVehicle.value = false;
              return;
            }
            let active = table.active;
            if (Array.isArray(active)) active = active[0];
            console.log('自动填充成功:', active);
            if (active && active.driverName) {
              try {
            if (active) {
              Object.assign(form.value, {
                mainDriverId: active.id,
                mainDriverName: active.driverName,
              });
                await nextTick(); // 等待清空生效
                const res = await getLastLicensePlate(active.driverName);
              // 获取车牌号并赋值
              getLastLicensePlate(active.driverName).then(res => {
                if (res.code == 200) {
                  form.value.licensePlate = res.data.licensePlate;
                  form.value.vehicleId = res.data.vehicleId
                if (res.code === 200 && res.data) {
                  const vehicleData = res.data;
                  nextTick(() => {
                    Object.assign(form.value, {
                      licensePlate: vehicleData.licensePlate,
                      vehicleId: vehicleData.vehicleId,
                      actualVehicleType: vehicleData.actualVehicleType,
                      mainDriverName: active.driverName
                    });
                  })
                  await nextTick();
                  console.log('自动填充成功:', form.value);
                }
              }).finally(() => {
              } catch (e) {
                console.error("自动获取车牌失败", e);
              } finally {
                data.isChanging = false;
              });
                setTimeout(() => {
                  // isAutoSettingVehicle.value = false;
                }, 500); // 稍微延长一点时间,防止 vehicleId 的 change 事件误触
              }
            } else {
              data.isChanging = false;
              // isAutoSettingVehicle.value = false;
            }
          },
          // change: (val: any) => {
@@ -1414,7 +1460,7 @@
            searchMenuSpan: 5,
            column: {
              vehicleProviderName: {
                label: '车辆服务商1', minWidth: 130,
                label: '车辆服务商', minWidth: 130,
                search: true,
              },
              driverName: {
@@ -1505,6 +1551,8 @@
              if (Array.isArray(value)) {
                id = value[0]
              }
              console.log(98521);
              getTmsDriver(id).then(res => {
                return callback(res.data || {})
              })
@@ -1524,92 +1572,117 @@
          }
        },
        vehicleId: {
        licensePlate: {
          label: '车牌号', dataType: 'string',
          display: true,
          readonly: true,
          rules: [
            {
              required: true,
              required: false,
              message: "车牌号不能为空", trigger: "change"
            }
          ],
          change: (val: any) => {
            const table = crudRef.value?.getPropRef?.('vehicleId')?.$refs?.temp;
            if (!table) return;
            let active = table.active;
            if (Array.isArray(active)) active = active[0];
            if (active) {
              Object.assign(form.value, {
                vehicleId: active.id,
                licensePlate: active.licensePlate,
                actualVehicleType: active.vehicleType,
              });
            }
          },
          type: 'table', suffixIcon: 'search',
          children: {
            border: true,
            searchLabelWidth: 100,
            searchMenuSpan: 5,
            column: {
              serviceProviderName: {
                label: '车辆服务商', minWidth: 130,
                search: true,
              },
              vehicleType: {
                label: '车辆类型', minWidth: 120,
                type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/vehicle_type',
                search: true,
              },
              internalCode: {
                label: '车辆内部编码', minWidth: 120,
                search: true,
              },
              licensePlate: {
                label: '车牌号', minWidth: 120,
                search: true,
              },
              licenseHk: {
                label: '香港牌照', minWidth: 120,
                search: true,
              },
              licenseMo: {
                label: '澳门牌照', minWidth: 120,
                search: true,
              },
            },
          },
          props: {
            label: 'licensePlate',
            value: 'id'
          },
          onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
            if (value) {
              let id = value;
              if (Array.isArray(value)) {
                id = value[0]
              }
              getTmsVehicle(id).then(res => {
                return callback(res.data || {})
              })
            } else {
              listTmsVehicle({
                pageSize: page.pageSize,
                pageNum: page.currentPage, ...data,
                carrierType: form.value.operationMode, serviceProviderId: form.value.vehicleProviderId
              }).then(res => {
                return callback({
                  total: res.total,
                  data: res.rows || [],
                })
              })
            }
          click: ({ value, column }) => {
            // 点击输入框时触发选择弹窗
            handleVehicleSelect();
          }
        },
        // vehicleId: {
        //   label: '车牌号', dataType: 'string',
        //   display: true,
        //   rules: [
        //     {
        //       required: true,
        //       message: "车牌号不能为空", trigger: "change"
        //     }
        //   ],
        //   change: (val: any) => {
        //     if (isAutoSettingVehicle.value) {
        //       return;
        //     }
        //     const table = crudRef.value?.getPropRef?.('vehicleId')?.$refs?.temp;
        //     if (!table) return;
        //     let active = table.active;
        //     if (Array.isArray(active)) active = active[0];
        //     console.log(9852);
        //     if (active) {
        //       Object.assign(form.value, {
        //         vehicleId: active.id,
        //         licensePlate: active.licensePlate,
        //         actualVehicleType: active.vehicleType,
        //       });
        //     }
        //   },
        //   type: 'table', suffixIcon: 'search',
        //   children: {
        //     border: true,
        //     searchLabelWidth: 100,
        //     searchMenuSpan: 5,
        //     column: {
        //       serviceProviderName: {
        //         label: '车辆服务商', minWidth: 130,
        //         search: true,
        //       },
        //       vehicleType: {
        //         label: '车辆类型', minWidth: 120,
        //         type: 'select', dataType: 'string', dicUrl: '/system/dict/data/type/vehicle_type',
        //         search: true,
        //       },
        //       internalCode: {
        //         label: '车辆内部编码', minWidth: 120,
        //         search: true,
        //       },
        //       licensePlate: {
        //         label: '车牌号', minWidth: 120,
        //         search: true,
        //       },
        //       licenseHk: {
        //         label: '香港牌照', minWidth: 120,
        //         search: true,
        //       },
        //       licenseMo: {
        //         label: '澳门牌照', minWidth: 120,
        //         search: true,
        //       },
        //     },
        //   },
        //   props: {
        //     label: 'licensePlate',
        //     value: 'id'
        //   },
        //   onLoad: ({ page, value, data }: { page: any, value: any, data: any }, callback: any) => {
        //     if (value) {
        //       let id = value;
        //       if (Array.isArray(value)) {
        //         id = value[0]
        //       }
        //       console.log(555, 'xq1');
        //       getTmsVehicle(id).then(res => {
        //         return callback(res.data || {})
        //       })
        //     } else {
        //       console.log(444, 'xq1');
        //       listTmsVehicle({
        //         pageSize: page.pageSize,
        //         pageNum: page.currentPage, ...data,
        //         carrierType: form.value.operationMode, serviceProviderId: form.value.vehicleProviderId
        //       }).then(res => {
        //         return callback({
        //           total: res.total,
        //           data: res.rows || [],
        //         })
        //       })
        //     }
        //   }
        // },
        actualVehicleType: {
          label: '派出车型',
          display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string',
@@ -2614,10 +2687,14 @@
          if (Array.isArray(value)) {
            id = value[0]
          }
          console.log(998, 'xq1');
          getTmsVehicle(id).then(res => {
            return callback(res.data || {})
          })
        } else {
          console.log(669, 'xq2');
          listTmsVehicle({ pageSize: page.pageSize, pageNum: page.currentPage, ...data }).then(res => {
            return callback({
              total: res.total,
@@ -3562,7 +3639,7 @@
          customsServiceProviderName: form.value.customsServiceProviderName
        };
      });
    }else if (optionNum.value == 'radio') {
    } else if (optionNum.value == 'radio') {
      result = [{
        id: form.value.id,
        customsServiceProviderId: form.value.customsServiceProviderId,
@@ -3582,7 +3659,7 @@
    })
  } else if (optionType.value === 'loading') {
       let result = <any>[];
    let result = <any>[];
    if (optionNum.value == 'checkbox') {
      result = clearanceList.value.map(item => {
        return {
@@ -3591,7 +3668,7 @@
          loadingServiceProviderName: form.value.loadingServiceProviderName
        };
      });
    }else if (optionNum.value == 'radio') {
    } else if (optionNum.value == 'radio') {
      result = [{
        id: form.value.id,
        loadingServiceProviderId: form.value.loadingServiceProviderId,
@@ -4246,7 +4323,7 @@
const handleCustomsAdd = (row) => {
  title.value = '补充委托装卸信息';
   clearanceList.value = [];
  clearanceList.value = [];
  // 2. 清除表格视觉上的选中状态
  if (crudRef.value) {
    crudRef.value.clearSelection();
@@ -5065,6 +5142,139 @@
    }
  }
};
/* 车牌号 */
// --- 状态管理 ---
const vehicleDialogVisible = ref(false);
const vehicleData = ref<VehicleRow[]>([]);
const vehicleQuery = ref<any>({});
const selectedVehicleRow = ref<VehicleRow>({});
const vehiclePage = ref({
  currentPage: 1,
  pageSize: 10,
  total: 0
});
// --- 弹窗配置 ---
const vehicleOption = ref({
  header: true,
  menu: false,
  addBtn: false,
  refreshBtn: true,
  columnBtn: false,
  index: false,
  selection: false,
  searchShow: true,
  searchMenuSpan: 6,
  searchLabelWidth: 100,
  highlightCurrentRow: true,
  column: [
    { label: '车辆服务商', prop: 'serviceProviderName', search: true },
    {
      label: '车辆类型',
      prop: 'vehicleType',
      type: 'select',
      dataType: 'string',
      dicUrl: '/system/dict/data/type/vehicle_type',
      search: true
    },
    { label: '车辆内部编码', prop: 'internalCode', search: true },
    { label: '车牌号', prop: 'licensePlate', search: true },
    { label: '香港牌照', prop: 'licenseHk' },
    { label: '澳门牌照', prop: 'licenseMo' }
  ]
});
// --- 方法 ---
/**
 * 加载数据:默认强制传 carrierType: '0'
 */
const loadVehicleList = async (page?: any, params?: any) => {
  const query = {
    pageNum: vehiclePage.value.currentPage,
    pageSize: vehiclePage.value.pageSize,
    carrierType: '0', // 默认强制传0
    ...vehicleQuery.value,
    ...params
  };
  try {
    const res = await listTmsVehicle(query);
    if (res.code === 200) {
      // const { records, total } = res.rows;
      vehicleData.value = res.rows;
      vehiclePage.value.total = res.total;
    }
  } catch (error) {
    console.error("加载车辆列表失败", error);
  }
};
/**
 * 搜索:带入搜索参数并强制 carrierType 为 0
 */
const vehicleSearchChange = (params: any, done: Function) => {
  vehicleQuery.value = params;
  vehiclePage.value.currentPage = 1;
  loadVehicleList();
  done();
};
/**
 * 重置:清空搜索条件,但依然保留 carrierType 为 0
 */
const vehicleSearchReset = () => {
  vehicleQuery.value = {}; // 清空搜索
  vehiclePage.value.currentPage = 1;
  loadVehicleList(); // loadVehicleList 内部已经写死 carrierType: '0'
};
const vehicleCurrentChange = (val: number) => {
  vehiclePage.value.currentPage = val;
  loadVehicleList();
};
const vehicleSizeChange = (val: number) => {
  vehiclePage.value.pageSize = val;
  loadVehicleList();
};
const handleVehicleRowClick = (row: VehicleRow) => {
  selectedVehicleRow.value = row;
};
// 打开弹窗方法
const handleVehicleSelect = () => {
  selectedVehicleRow.value = {};
  vehicleDialogVisible.value = true;
};
/**
 * 确认选择:回显到主表单
 */
const confirmVehicleSelection = () => {
  if (!selectedVehicleRow.value.licensePlate) {
    appContext.$message.warning("请点击选择一行记录");
    return;
  }
  // 1. 赋值 (确保主表单 data.form 存在)
  data.form.vehicleId = selectedVehicleRow.value.id;
  data.form.licensePlate = selectedVehicleRow.value.licensePlate;
  data.form.actualVehicleType= selectedVehicleRow.value.vehicleType;
  // 如果需要其他字段也可以一并带回,比如服务商等
  // data.form.serviceProviderName = selectedVehicleRow.value.serviceProviderName;
  vehicleDialogVisible.value = false;
  // 2. 强制视图更新
  nextTick(() => {
    appContext.$forceUpdate();
  });
};
</script>
<style lang="scss" scoped>