| | |
| | | @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"> |
| | | <span>{{ dictFormat(vehicle_type, row?.requiredVehicleTypes || form?.requiredVehicleTypes) }}</span> |
| | | </template> |
| | | <template v-else> |
| | | <el-select v-model="form.requiredVehicleTypes" placeholder="请选择车型" style="width: 100%"> |
| | | <el-option v-for="item in vehicle_type" :key="item.value" :label="item.label" :value="item.value" /> |
| | | </el-select> |
| | | </template> |
| | | </template> |
| | | |
| | | <template #orderType-form="{ row, disabled }"> |
| | | <template v-if="disabled"> |
| | | <span>{{ dictFormat(order_type, row?.orderType || form?.orderType) }}</span> |
| | | </template> |
| | | <template v-else> |
| | | <el-select v-model="form.orderType" placeholder="请选择订单类型" @change="(val) => handleOrderTypeChange(val)" |
| | | style="width: 100%" clearable> |
| | | <el-option v-for="item in order_type" :key="item.value" :label="item.label" :value="parseInt(item.value)" /> |
| | | </el-select> |
| | | </template> |
| | | </template> |
| | | |
| | | <template #actualVehicleType-form="{ row, disabled }"> |
| | | <template v-if="disabled"> |
| | | <span>{{ dictFormat(vehicle_type, row?.actualVehicleType || form?.actualVehicleType) }}</span> |
| | | </template> |
| | | <template v-else> |
| | | <el-select v-model="form.actualVehicleType" placeholder="请选择实际车型" style="width: 100%"> |
| | | <el-option v-for="item in vehicle_type" :key="item.value" :label="item.label" :value="item.value" /> |
| | | </el-select> |
| | | </template> |
| | | </template> |
| | | |
| | | |
| | | |
| | | <template #menu-left> |
| | | <!-- <el-button--> |
| | | <!-- type="success"--> |
| | |
| | | <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" |
| | | <el-button type="warning" icon="Avatar" :disabled="selectionList.length === 0" @click="handleCustoms" |
| | | v-hasPermi="['tms:tmsDispatchOrder:customs']">委托报关信息 |
| | | </el-button> |
| | | <el-button type="primary" icon="UserFilled" :disabled="!(isLoad == 0)" @click="handleLoading" |
| | | <el-button type="primary" icon="UserFilled" :disabled="selectionList.length === 0" @click="handleLoading" |
| | | v-hasPermi="['tms:tmsDispatchOrder:loading']">委托卸货信息 |
| | | </el-button> |
| | | <el-button type="primary" icon="UserFilled" :disabled="pageF.single" @click="handleZZ" |
| | |
| | | </div> |
| | | |
| | | <div v-if="optionType == 'customs'"> |
| | | <el-descriptions 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> |
| | | <el-descriptions-item label="运输路线">{{ form.transportLine }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | <el-table v-if="optionNum == 'checkbox'" :data="clearanceList" border size="small" |
| | | style="width: 100%; margin-bottom: 20px"> |
| | | <el-table-column prop="dispatchNo" label="调度单号" width="150" /> |
| | | <el-table-column prop="customerName" label="客户" min-width="120" show-overflow-tooltip /> |
| | | <el-table-column prop="projectName" label="项目名称" min-width="120" show-overflow-tooltip /> |
| | | <el-table-column prop="transportLine" label="运输路线" min-width="150" show-overflow-tooltip /> |
| | | </el-table> |
| | | |
| | | <avue-form v-model="form" ref="boxFormRef" :option="boxFormOption"> |
| | | |
| | | </avue-form> |
| | | </div> |
| | | |
| | | <div v-if="optionType == 'loading'"> |
| | | <el-descriptions 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> |
| | | <el-descriptions-item label="运输路线">{{ form.transportLine }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | <el-table v-if="optionNum == 'checkbox'" :data="clearanceList" border size="small" |
| | | style="width: 100%; margin-bottom: 20px"> |
| | | <el-table-column prop="dispatchNo" label="调度单号" width="150" /> |
| | | <el-table-column prop="customerName" label="客户" min-width="120" show-overflow-tooltip /> |
| | | <el-table-column prop="projectName" label="项目名称" min-width="120" show-overflow-tooltip /> |
| | | <el-table-column prop="transportLine" label="运输路线" min-width="150" show-overflow-tooltip /> |
| | | </el-table> |
| | | <avue-form v-model="form" ref="boxFormRef" :option="boxFormOption"> |
| | | |
| | | </avue-form> |
| | | </div> |
| | | <template #footer> |
| | |
| | | </avue-crud> |
| | | <avue-crud :option="boxTableOption" :data="boxTableData" @selection-change="boxSelectionChange"> |
| | | <template #menu-left> |
| | | <el-button type="danger" plain icon="Delete" :disabled="!(boxSelectionList.length === 1 && boxSelectionList[0]?.status === 0)" |
| | | <el-button type="danger" plain icon="Delete" |
| | | :disabled="!(boxSelectionList.length === 1 && boxSelectionList[0]?.status === 0)" |
| | | @click="handleBatchBoxDel"> |
| | | 作废 |
| | | </el-button> |
| | |
| | | <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> |
| | | |
| | |
| | | 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"; |
| | |
| | | import { |
| | | tmsFinanceDetail |
| | | } from "@/api/tms/tmsDispatchOrder"; |
| | | const { appContext } = getCurrentInstance(); |
| | | const { appContext } = getCurrentInstance() as any; |
| | | |
| | | const { proxy } = useCurrentInstance( |
| | | ); |
| | | const { fee_type, sys_currency,vehicle_type } = proxy.useDict('fee_type', 'sys_currency','vehicle_type') |
| | | // 定义类型 |
| | | 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); |
| | | /** |
| | | * 字典公共转换函数 |
| | | */ |
| | |
| | | customerCode: active.customerCode, |
| | | contractId: active.contractId, |
| | | contractName: active.contractName, |
| | | requiredVehicleTypes: active.vehicleType, |
| | | requiredVehicleTypes: active.vehicleType + '', |
| | | quotePlanId: active.quotePlanId, |
| | | }); |
| | | form.value.shipperId = undefined; |
| | |
| | | display: true, disabled: true |
| | | }, |
| | | requiredVehicleTypes: { |
| | | label: '下单车型', disabled: true, |
| | | display: true, type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string', |
| | | rules: [ |
| | | { |
| | | required: true, |
| | | message: "下单车型不能为空", trigger: "blur" |
| | | } |
| | | ], |
| | | // formatter: (row: any, value: any) => dictFormat(vehicle_type, value) |
| | | label: '下单车型', |
| | | minWidth: 130, |
| | | display: true, // ✅ 改为 true 在表格显示 |
| | | type: 'select', |
| | | search: true, |
| | | dicUrl: '/system/dict/data/type/vehicle_type', |
| | | dataType: 'string', |
| | | |
| | | }, |
| | | |
| | | orderType: { |
| | | label: '订单类型', |
| | | display: true, |
| | |
| | | } |
| | | ], |
| | | change: ({ value }: any) => { |
| | | |
| | | option.value.group.forEach((item: any) => { |
| | | |
| | | if (item.prop == 'pcxx') { |
| | | item.column.shipperId.rules.forEach((cItem: any) => { |
| | | |
| | | |
| | | cItem.required = !(value == 1); |
| | | }); |
| | | item.column.receiverId.rules.forEach((cItem: any) => { |
| | |
| | | // }, |
| | | 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: [ |
| | | { |
| | |
| | | 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) => { |
| | |
| | | searchMenuSpan: 5, |
| | | column: { |
| | | vehicleProviderName: { |
| | | label: '车辆服务商1', minWidth: 130, |
| | | label: '车辆服务商', minWidth: 130, |
| | | search: true, |
| | | }, |
| | | driverName: { |
| | |
| | | if (Array.isArray(value)) { |
| | | id = value[0] |
| | | } |
| | | console.log(98521); |
| | | |
| | | getTmsDriver(id).then(res => { |
| | | return callback(res.data || {}) |
| | | }) |
| | |
| | | } |
| | | |
| | | }, |
| | | vehicleId: { |
| | | label: '车牌号1', dataType: 'string', |
| | | 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', |
| | |
| | | dataType: 'string', |
| | | |
| | | }, |
| | | createTimeRange: { |
| | | label: '创建时间', display: false, searchRange: true, type: 'date', |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 6, |
| | | valueFormat: 'YYYY-MM-DD', |
| | | overHidden: true |
| | | }, |
| | | // createTimeRange: { |
| | | // 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, |
| | |
| | | searchRange: true, |
| | | addDisplay: false, // 新增时不显示 |
| | | editDisplay: false, // 修改时不显示 |
| | | viewDisplay: false, |
| | | type: 'daterange', |
| | | startPlaceholder: '开始日期', |
| | | endPlaceholder: '结束日期', |
| | |
| | | search: true, |
| | | searchRange: true, |
| | | addDisplay: false, // 新增时不显示 |
| | | editDisplay: false, // 修改时不显示 |
| | | editDisplay: false, // |
| | | viewDisplay: false, |
| | | type: 'daterange', |
| | | startPlaceholder: '开始日期', |
| | | endPlaceholder: '结束日期', |
| | |
| | | display: false, |
| | | search: true, |
| | | type: 'select', dicUrl: '/system/dict/data/type/vehicle_type', dataType: 'string', |
| | | |
| | | }, |
| | | |
| | | |
| | |
| | | search: true, |
| | | |
| | | }, |
| | | confirmTime: { |
| | | 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, |
| | | addDisplay: false, |
| | |
| | | label: '创建时间', minWidth: 180, |
| | | addDisplay: false, |
| | | editDisplay: false, |
| | | viewDisplay: false, |
| | | viewDisplay: true, |
| | | hide: false, |
| | | search: false, |
| | | overHidden: true, |
| | |
| | | label: '更新时间', minWidth: 180, |
| | | addDisplay: false, |
| | | editDisplay: false, |
| | | viewDisplay: false, |
| | | viewDisplay: true, |
| | | hide: false, |
| | | search: false, |
| | | overHidden: true, |
| | | searchSpan: 6, |
| | | |
| | | }, |
| | | |
| | | confirmTime: { |
| | | label: '确认时间', minWidth: 180, |
| | | addDisplay: false, |
| | | editDisplay: false, |
| | | viewDisplay: true, |
| | | hide: true, |
| | | search: false, |
| | | overHidden: true, |
| | | searchSpan: 6, |
| | | }, |
| | | confirmTimeRange: { |
| | | label: '确认时间', display: false, searchRange: true, type: 'date', |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 6, |
| | |
| | | searchRange: true, |
| | | addDisplay: false, // 新增时不显示 |
| | | editDisplay: false, // 修改时不显示 |
| | | viewDisplay: false, |
| | | type: 'daterange', |
| | | startPlaceholder: '开始日期', |
| | | endPlaceholder: '结束日期', |
| | | valueFormat: 'YYYY-MM-DD', |
| | | hide: true |
| | | }, |
| | | okTimeRange: { |
| | | label: '完成时间', display: false, searchRange: true, type: 'date', |
| | | format: 'YYYY-MM-DD', hide: true, searchSpan: 6, |
| | | valueFormat: 'YYYY-MM-DD', |
| | | okTime: { |
| | | label: '完成时间', minWidth: 180, |
| | | addDisplay: false, |
| | | editDisplay: false, |
| | | viewDisplay: true, |
| | | hide: true, |
| | | search: false, |
| | | searchSpan: 6, |
| | | }, |
| | | // okTimeRange: { |
| | | // label: '完成时间2', display: false, searchRange: true, type: 'date', |
| | | // viewDisplay: true, |
| | | // format: 'YYYY-MM-DD', hide: true, searchSpan: 6, |
| | | // valueFormat: 'YYYY-MM-DD', |
| | | // }, |
| | | |
| | | okTimeRangeArray: { |
| | | label: '完成时间', |
| | | minWidth: 150, |
| | |
| | | searchRange: true, |
| | | addDisplay: false, // 新增时不显示 |
| | | editDisplay: false, // 修改时不显示 |
| | | viewDisplay: 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', |
| | | orderTime: { |
| | | label: '下单时间', minWidth: 180, |
| | | addDisplay: false, |
| | | editDisplay: false, |
| | | viewDisplay: true, |
| | | hide: true, |
| | | search: false, |
| | | searchSpan: 6, |
| | | }, |
| | | loadingDate: { |
| | | bind: 'orderTime', |
| | | label: '装货日期', minWidth: 180, |
| | | addDisplay: false, |
| | | editDisplay: false, |
| | | viewDisplay: true, |
| | | hide: true, |
| | | search: false, |
| | | searchSpan: 6, |
| | | }, |
| | | // orderTimeRange: { |
| | | // label: '下单时间', display: false, searchRange: true, type: 'date', |
| | | // format: 'YYYY-MM-DD', hide: true, searchSpan: 6, |
| | | // valueFormat: 'YYYY-MM-DD', |
| | | // }, |
| | | orderTimeRangeArray: { |
| | | label: '下单时间', |
| | | minWidth: 150, |
| | |
| | | searchRange: true, |
| | | addDisplay: false, // 新增时不显示 |
| | | editDisplay: false, // 修改时不显示 |
| | | viewDisplay: false, |
| | | type: 'daterange', |
| | | startPlaceholder: '开始日期', |
| | | endPlaceholder: '结束日期', |
| | |
| | | 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, |
| | |
| | | } |
| | | }); |
| | | const zzItemsTableData = ref(); |
| | | |
| | | |
| | | |
| | | /* 报关列表 */ |
| | | const clearanceList = ref([]); |
| | | const optionNum = ref(''); // 用于区分是报关还是装卸 |
| | | |
| | | const { |
| | | tableData, |
| | |
| | | }, |
| | | handleSelectionChangeFunc: (selection: any) => { |
| | | selectionList.value = selection; |
| | | clearanceList.value = selection; |
| | | if (selection.length > 0) { |
| | | isCustoms.value = selection[0].isCustoms; |
| | | isLoad.value = selection[0].isLoad; |
| | |
| | | }, |
| | | |
| | | getBeginListFunc: (params = {}) => { |
| | | // 1. 日期转换 |
| | | let newParams = <any>{ ...params }; |
| | | if (newParams) { |
| | | // 1. 定义日期字段映射 (数组名 : 接口需要的前缀) |
| | | // 这样写的好处是:如果你有多个日期,直接在这里添加一行即可 |
| | | const dateMap = { |
| | | confirmTimeRangeArray: 'confirmTimeRange', |
| | | createTimeRangeArray: 'createTime', |
| | | updateTimeRangeArray: 'updateTimeRange', |
| | | okTimeRangeArray: 'okTime', |
| | | orderTimeRangeArray: 'orderTime' |
| | | }; |
| | | // 1. 使用浅拷贝,不影响原始查询对象 |
| | | // 关键点:从原始 queryParams.value 取值,确保分页时依然能拿到数组 |
| | | let newParams = { ...queryParams.value, ...params }; |
| | | |
| | | // 2. 遍历处理日期 |
| | | Object.keys(dateMap).forEach(arrayKey => { |
| | | const prefix = dateMap[arrayKey]; |
| | | const range = newParams[arrayKey]; |
| | | // 2. 定义日期字段映射 (数组名 : 接口需要的前缀) |
| | | const dateMap = { |
| | | confirmTimeRangeArray: 'confirmTimeRange', |
| | | createTimeRangeArray: 'createTime', |
| | | updateTimeRangeArray: 'updateTimeRange', |
| | | okTimeRangeArray: 'okTime', |
| | | orderTimeRangeArray: 'orderTime' |
| | | }; |
| | | |
| | | if (Array.isArray(range) && range.length > 0) { |
| | | // 赋值 Begin 和 End |
| | | newParams[`${prefix}Begin`] = range[0]; |
| | | newParams[`${prefix}End`] = range[1]; |
| | | } |
| | | // 3. 遍历处理日期 |
| | | Object.keys(dateMap).forEach(arrayKey => { |
| | | const prefix = dateMap[arrayKey]; |
| | | const range = newParams[arrayKey]; |
| | | |
| | | // 【核心改动】:无论是否有值,处理完后都把原始的 Array 字段删掉 |
| | | // 这样请求里就不会出现 confirmTimeRangeArray: [...] |
| | | delete newParams[arrayKey]; |
| | | }); |
| | | if (Array.isArray(range) && range.length === 2) { |
| | | // 赋值接口需要的 Begin 和 End |
| | | newParams[`${prefix}Begin`] = range[0]; |
| | | newParams[`${prefix}End`] = range[1]; |
| | | } |
| | | |
| | | // 3. 通用清洗:删除所有空字符串、null 或 undefined 的其他字段 |
| | | Object.keys(newParams).forEach(key => { |
| | | const val = newParams[key]; |
| | | if (val === '' || val === null || val === undefined) { |
| | | delete newParams[key]; |
| | | } |
| | | }); |
| | | // 只在给接口的参数中删除数组,不影响页面显示的 queryParams |
| | | delete newParams[arrayKey]; |
| | | }); |
| | | |
| | | } 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; |
| | | // 4. 清洗参数:过滤空值 |
| | | const finalParams = {}; |
| | | Object.keys(newParams).forEach(key => { |
| | | const val = newParams[key]; |
| | | if (val !== '' && val !== null && val !== undefined) { |
| | | finalParams[key] = val; |
| | | } |
| | | }); |
| | | |
| | | |
| | | |
| | | |
| | | // delete newParams.updateTimeArray; |
| | | // delete newParams.businessTimeArray; |
| | | // delete newParams.payableConfirmTimeArray; |
| | | |
| | | queryParams.value = newParams; |
| | | return newParams; |
| | | // 【核心修改】:直接返回,不要赋值给 queryParams.value |
| | | return finalParams; |
| | | }, |
| | | handleBeforeOpenFunc: (type: string) => { |
| | | |
| | | if (type == 'add') { |
| | | form.value = {}; |
| | | } else if (type == 'edit') { |
| | | // form.value = row; |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | pageF.isUploading = false; |
| | | }) |
| | | } else if (optionType.value === 'customs') { |
| | | customsOrder({ |
| | | id: form.value.id, |
| | | customsServiceProviderId: form.value.customsServiceProviderId, |
| | | customsServiceProviderName: form.value.customsServiceProviderName, |
| | | }).then(res => { |
| | | let result = <any>[]; |
| | | if (optionNum.value == 'checkbox') { |
| | | result = clearanceList.value.map(item => { |
| | | return { |
| | | id: item.id, |
| | | customsServiceProviderId: form.value.customsServiceProviderId, |
| | | customsServiceProviderName: form.value.customsServiceProviderName |
| | | }; |
| | | }); |
| | | } else if (optionNum.value == 'radio') { |
| | | result = [{ |
| | | id: form.value.id, |
| | | customsServiceProviderId: form.value.customsServiceProviderId, |
| | | customsServiceProviderName: form.value.customsServiceProviderName |
| | | }] |
| | | } |
| | | |
| | | customsOrder(result).then(res => { |
| | | ElMessage({ |
| | | message: "提交成功!", |
| | | type: 'success' |
| | |
| | | pageF.isUploading = false; |
| | | }) |
| | | } else if (optionType.value === 'loading') { |
| | | loadingOrder({ |
| | | id: form.value.id, |
| | | loadingServiceProviderId: form.value.loadingServiceProviderId, |
| | | loadingServiceProviderName: form.value.loadingServiceProviderName, |
| | | }).then(res => { |
| | | |
| | | let result = <any>[]; |
| | | if (optionNum.value == 'checkbox') { |
| | | result = clearanceList.value.map(item => { |
| | | return { |
| | | id: item.id, |
| | | loadingServiceProviderId: form.value.loadingServiceProviderId, |
| | | loadingServiceProviderName: form.value.loadingServiceProviderName |
| | | }; |
| | | }); |
| | | } else if (optionNum.value == 'radio') { |
| | | result = [{ |
| | | id: form.value.id, |
| | | loadingServiceProviderId: form.value.loadingServiceProviderId, |
| | | loadingServiceProviderName: form.value.loadingServiceProviderName |
| | | }] |
| | | } |
| | | |
| | | loadingOrder(result).then(res => { |
| | | ElMessage({ |
| | | message: "提交成功!", |
| | | type: 'success' |
| | |
| | | const handleCustoms = () => { |
| | | title.value = '补充委托报关信息'; |
| | | open.value = true; |
| | | form.value = selectionList.value[0]; |
| | | form.value = clearanceList.value[0]; |
| | | optionType.value = 'customs'; |
| | | optionNum.value = 'checkbox' |
| | | boxFormOption.value = customsOption.value; |
| | | |
| | | } |
| | | |
| | | const handleCustomsAdd = (selectionList) => { |
| | | const handleCustomsAdd = (row) => { |
| | | title.value = '补充委托装卸信息'; |
| | | |
| | | clearanceList.value = []; |
| | | // 2. 清除表格视觉上的选中状态 |
| | | if (crudRef.value) { |
| | | crudRef.value.clearSelection(); |
| | | } |
| | | |
| | | // 3. 重置表单 |
| | | form.value = {}; |
| | | |
| | | // 4. 将当前点击的行数据赋值给 form,用于弹窗编辑 |
| | | Object.assign(form.value, row); |
| | | |
| | | open.value = true; |
| | | form.value = selectionList; |
| | | optionType.value = 'loading'; |
| | | optionNum.value = 'radio'; |
| | | |
| | | boxFormOption.value = loadingOption.value; |
| | | } |
| | | const handleLoading = () => { |
| | |
| | | open.value = true; |
| | | form.value = selectionList.value[0]; |
| | | optionType.value = 'loading'; |
| | | optionNum.value = 'checkbox' |
| | | boxFormOption.value = loadingOption.value; |
| | | } |
| | | const handleLoadingAdd = (selectionList) => { |
| | | title.value = '补充委托装卸信息'; |
| | | const handleLoadingAdd = (row: any) => { |
| | | // 1. 清空批量选中的数据列表,导致顶部按钮 disabled (length === 0) |
| | | clearanceList.value = []; |
| | | // 2. 清除表格视觉上的选中状态 |
| | | if (crudRef.value) { |
| | | crudRef.value.clearSelection(); |
| | | } |
| | | |
| | | // 3. 重置表单 |
| | | form.value = {}; |
| | | |
| | | // 4. 将当前点击的行数据赋值给 form,用于弹窗编辑 |
| | | Object.assign(form.value, row); |
| | | |
| | | // 5. 设置弹窗配置 |
| | | title.value = '补充委托报关信息'; |
| | | optionType.value = 'customs'; |
| | | optionNum.value = 'radio'; |
| | | boxFormOption.value = customsOption.value; |
| | | |
| | | // 6. 打开弹窗 |
| | | open.value = true; |
| | | form.value = selectionList; |
| | | optionType.value = 'loading'; |
| | | boxFormOption.value = loadingOption.value; |
| | | |
| | | // 【调试】此时打印,长度应为 0 |
| | | } |
| | | const quotationItems = ref(); |
| | | const getQuotationItems = async () => { |
| | |
| | | } |
| | | const submitForm5 = () => { |
| | | boxFormRef.value.validate((valid: boolean, done: any) => { |
| | | console.log(valid) |
| | | if (valid) { |
| | | boxForm.value.id = form.value.id; |
| | | closeOrder(boxForm.value).then(res => { |
| | |
| | | // 取消操作 |
| | | }); |
| | | } |
| | | |
| | | const handleOrderTypeChange = (value: any) => { |
| | | // 防止 value 为 null 或 undefined 时出错 (当清空选择时) |
| | | if (value === null || value === undefined) { |
| | | return; |
| | | } |
| | | |
| | | option.value.group.forEach((item: any) => { |
| | | if (item.prop == 'pcxx') { |
| | | // 处理装货点必填规则 |
| | | if (item.column.shipperId && item.column.shipperId.rules) { |
| | | item.column.shipperId.rules.forEach((cItem: any) => { |
| | | cItem.required = !(value == 1); |
| | | }); |
| | | } |
| | | |
| | | // 处理卸货点必填规则 |
| | | if (item.column.receiverId && item.column.receiverId.rules) { |
| | | item.column.receiverId.rules.forEach((cItem: any) => { |
| | | cItem.required = !(value == 1); |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | // 【新增逻辑】如果切换到了非必填状态 (value == 1),则清除这两个字段的校验提示 |
| | | if (value == 1) { |
| | | // 确保 crudRef 存在且暴露了 clearValidate 方法 |
| | | if (crudRef.value && typeof crudRef.value.clearValidate === 'function') { |
| | | // 清除指定字段的校验状态 |
| | | crudRef.value.clearValidate(['shipperId', 'receiverId']); |
| | | } |
| | | } |
| | | }; |
| | | /* 车牌号 */ |
| | | // --- 状态管理 --- |
| | | 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> |
| | | ::v-deep .cydprint .el-dialog__body { |