|
@@ -1,9 +1,9 @@
|
|
|
-<!-- 全部车辆管理 -->
|
|
|
|
|
|
|
+<!-- 三方车辆 -->
|
|
|
<template>
|
|
<template>
|
|
|
<div class="page-container">
|
|
<div class="page-container">
|
|
|
<section class="panel">
|
|
<section class="panel">
|
|
|
<div class="panel-top">
|
|
<div class="panel-top">
|
|
|
- <h2 class="title-bar-heading">车辆列表</h2>
|
|
|
|
|
|
|
+ <h2 class="title-bar-heading">三方车辆</h2>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 筛选区 -->
|
|
<!-- 筛选区 -->
|
|
@@ -18,12 +18,6 @@
|
|
|
@keyup.enter="handleSearch"
|
|
@keyup.enter="handleSearch"
|
|
|
/>
|
|
/>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="车辆类型">
|
|
|
|
|
- <el-select v-model="searchForm.vehicleType" placeholder="全部" clearable>
|
|
|
|
|
- <el-option label="自有" value="self" />
|
|
|
|
|
- <el-option label="承运商" value="carrier" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
<el-form-item label="承运商">
|
|
<el-form-item label="承运商">
|
|
|
<el-select v-model="searchForm.carrierId" placeholder="全部" clearable filterable>
|
|
<el-select v-model="searchForm.carrierId" placeholder="全部" clearable filterable>
|
|
|
<el-option
|
|
<el-option
|
|
@@ -224,12 +218,6 @@
|
|
|
<el-form-item label="挂车号" prop="trailerNo">
|
|
<el-form-item label="挂车号" prop="trailerNo">
|
|
|
<el-input v-model="formData.trailerNo" placeholder="请输入挂车号" maxlength="20" clearable />
|
|
<el-input v-model="formData.trailerNo" placeholder="请输入挂车号" maxlength="20" clearable />
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
- <el-form-item label="车辆类型" prop="vehicleType">
|
|
|
|
|
- <el-select v-model="formData.vehicleType" placeholder="请选择">
|
|
|
|
|
- <el-option label="自有" value="self" />
|
|
|
|
|
- <el-option label="承运商" value="carrier" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
<el-form-item label="载重(吨)" prop="loadCapacity">
|
|
<el-form-item label="载重(吨)" prop="loadCapacity">
|
|
|
<el-input-number
|
|
<el-input-number
|
|
|
v-model="formData.loadCapacity"
|
|
v-model="formData.loadCapacity"
|
|
@@ -342,8 +330,8 @@
|
|
|
upload-folder="pl/vehicle-cert"
|
|
upload-folder="pl/vehicle-cert"
|
|
|
:cert-name-options="certNameOptions"
|
|
:cert-name-options="certNameOptions"
|
|
|
layout="table"
|
|
layout="table"
|
|
|
- :enforce-self-vehicle-required="formData.vehicleType === 'self'"
|
|
|
|
|
- :enforce-carrier-vehicle-required="formData.vehicleType === 'carrier'"
|
|
|
|
|
|
|
+ :enforce-self-vehicle-required="false"
|
|
|
|
|
+ :enforce-carrier-vehicle-required="false"
|
|
|
/>
|
|
/>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
<template #footer>
|
|
<template #footer>
|
|
@@ -391,9 +379,7 @@
|
|
|
:vehicle-id="viewDetail?.id"
|
|
:vehicle-id="viewDetail?.id"
|
|
|
:personnel-list="viewPersonnelList"
|
|
:personnel-list="viewPersonnelList"
|
|
|
:vehicle-cert-check-type="viewVehicleCertCheckType"
|
|
:vehicle-cert-check-type="viewVehicleCertCheckType"
|
|
|
- :check-linked-personnel-certs="
|
|
|
|
|
- viewDetail?.vehicleType === 'self' || viewDetail?.vehicleType === 'carrier'
|
|
|
|
|
- "
|
|
|
|
|
|
|
+ :check-linked-personnel-certs="false"
|
|
|
cert-layout="table"
|
|
cert-layout="table"
|
|
|
/>
|
|
/>
|
|
|
</template>
|
|
</template>
|
|
@@ -429,15 +415,9 @@ import { pickBxList, pickBxPageResult } from '@/utils/http/bx'
|
|
|
import { DEFAULT_LIST_PAGE_SIZE } from '@/utils/table/tableConfig'
|
|
import { DEFAULT_LIST_PAGE_SIZE } from '@/utils/table/tableConfig'
|
|
|
import { formatDateTime } from '@/utils/format'
|
|
import { formatDateTime } from '@/utils/format'
|
|
|
import { formatPlVehiclePlateDisplay, normalizePlPersonnelSummaryDisplay } from '@/utils/pl-display'
|
|
import { formatPlVehiclePlateDisplay, normalizePlPersonnelSummaryDisplay } from '@/utils/pl-display'
|
|
|
-import {
|
|
|
|
|
- collectCarrierVehicleRequiredCertErrors,
|
|
|
|
|
- collectSelfVehicleRequiredCertErrors,
|
|
|
|
|
- ensureVehicleCertSlots,
|
|
|
|
|
- formatRequiredCertErrors
|
|
|
|
|
-} from '@/utils/pl-cert-slots'
|
|
|
|
|
|
|
+import { ensureVehicleCertSlots } from '@/utils/pl-cert-slots'
|
|
|
import {
|
|
import {
|
|
|
PL_VEHICLE_CERT_NAME_OPTIONS,
|
|
PL_VEHICLE_CERT_NAME_OPTIONS,
|
|
|
- getVehicleCertMissingSuffix,
|
|
|
|
|
type PlVehicleCertCheckType
|
|
type PlVehicleCertCheckType
|
|
|
} from '@/utils/pl-vehicle-cert'
|
|
} from '@/utils/pl-vehicle-cert'
|
|
|
import {
|
|
import {
|
|
@@ -450,6 +430,8 @@ import { canDeleteByCreator, filterDeletableByCreator, allRowsDeletableByCreator
|
|
|
type CertListItem = CertRow & { _key?: string }
|
|
type CertListItem = CertRow & { _key?: string }
|
|
|
type CertFormListRef = InstanceType<typeof PlVehicleCertPartTabs>
|
|
type CertFormListRef = InstanceType<typeof PlVehicleCertPartTabs>
|
|
|
|
|
|
|
|
|
|
+const VEHICLE_TYPE_LOCK = 'carrier' as const
|
|
|
|
|
+
|
|
|
const loading = ref(false)
|
|
const loading = ref(false)
|
|
|
const quickSearchKeyword = ref('')
|
|
const quickSearchKeyword = ref('')
|
|
|
const submitLoading = ref(false)
|
|
const submitLoading = ref(false)
|
|
@@ -493,7 +475,7 @@ const certNameOptions = PL_VEHICLE_CERT_NAME_OPTIONS
|
|
|
|
|
|
|
|
const searchForm = reactive({
|
|
const searchForm = reactive({
|
|
|
q: '',
|
|
q: '',
|
|
|
- vehicleType: '',
|
|
|
|
|
|
|
+ vehicleType: VEHICLE_TYPE_LOCK,
|
|
|
carrierId: '',
|
|
carrierId: '',
|
|
|
vehicleStatus: ''
|
|
vehicleStatus: ''
|
|
|
})
|
|
})
|
|
@@ -508,7 +490,7 @@ const formData = reactive({
|
|
|
id: '',
|
|
id: '',
|
|
|
licensePlate: '',
|
|
licensePlate: '',
|
|
|
trailerNo: '',
|
|
trailerNo: '',
|
|
|
- vehicleType: 'self',
|
|
|
|
|
|
|
+ vehicleType: VEHICLE_TYPE_LOCK,
|
|
|
carrierId: '',
|
|
carrierId: '',
|
|
|
carrierName: '',
|
|
carrierName: '',
|
|
|
loadCapacity: null as number | null,
|
|
loadCapacity: null as number | null,
|
|
@@ -519,7 +501,6 @@ const formData = reactive({
|
|
|
const formRules = {
|
|
const formRules = {
|
|
|
licensePlate: [{ required: true, message: '请输入车牌号', trigger: 'blur' }],
|
|
licensePlate: [{ required: true, message: '请输入车牌号', trigger: 'blur' }],
|
|
|
trailerNo: [{ required: true, message: '请输入挂车号', trigger: 'blur' }],
|
|
trailerNo: [{ required: true, message: '请输入挂车号', trigger: 'blur' }],
|
|
|
- vehicleType: [{ required: true, message: '请选择车辆类型', trigger: 'change' }],
|
|
|
|
|
carrierId: [{ required: true, message: '请选择承运商', trigger: 'change' }]
|
|
carrierId: [{ required: true, message: '请选择承运商', trigger: 'change' }]
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -559,24 +540,9 @@ const viewHeroMeta = computed(() => {
|
|
|
return parts.join(' · ')
|
|
return parts.join(' · ')
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
-const viewVehicleCertCheckType = computed<PlVehicleCertCheckType | undefined>(() => {
|
|
|
|
|
- const type = viewDetail.value?.vehicleType
|
|
|
|
|
- return type === 'self' || type === 'carrier' ? type : undefined
|
|
|
|
|
-})
|
|
|
|
|
|
|
+const viewVehicleCertCheckType = computed<PlVehicleCertCheckType>(() => VEHICLE_TYPE_LOCK)
|
|
|
|
|
|
|
|
-const viewDialogTitle = computed(() => {
|
|
|
|
|
- const plate = viewDetail.value?.licensePlate || '车辆详情'
|
|
|
|
|
- const checkType = viewVehicleCertCheckType.value
|
|
|
|
|
- if (!viewDetail.value || !checkType) return plate
|
|
|
|
|
- return (
|
|
|
|
|
- plate +
|
|
|
|
|
- getVehicleCertMissingSuffix({
|
|
|
|
|
- vehicleType: checkType,
|
|
|
|
|
- certList: viewDetail.value.certList,
|
|
|
|
|
- trailerNo: viewDetail.value.trailerNo
|
|
|
|
|
- })
|
|
|
|
|
- )
|
|
|
|
|
-})
|
|
|
|
|
|
|
+const viewDialogTitle = computed(() => viewDetail.value?.licensePlate || '车辆详情')
|
|
|
|
|
|
|
|
const viewSections = computed<ViewSection[]>(() => {
|
|
const viewSections = computed<ViewSection[]>(() => {
|
|
|
const d = viewDetail.value
|
|
const d = viewDetail.value
|
|
@@ -801,19 +767,6 @@ function validateSubTables(): boolean {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (formData.vehicleType === 'self') {
|
|
|
|
|
- const certErrors = collectSelfVehicleRequiredCertErrors(certList.value, formData.trailerNo)
|
|
|
|
|
- if (certErrors.length) {
|
|
|
|
|
- ElMessage.warning(formatRequiredCertErrors(certErrors))
|
|
|
|
|
- return false
|
|
|
|
|
- }
|
|
|
|
|
- } else if (formData.vehicleType === 'carrier') {
|
|
|
|
|
- const certErrors = collectCarrierVehicleRequiredCertErrors(certList.value, formData.trailerNo)
|
|
|
|
|
- if (certErrors.length) {
|
|
|
|
|
- ElMessage.warning(formatRequiredCertErrors(certErrors))
|
|
|
|
|
- return false
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
return true
|
|
return true
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -822,7 +775,7 @@ async function fetchData() {
|
|
|
try {
|
|
try {
|
|
|
const res = await vehicleApi.list({
|
|
const res = await vehicleApi.list({
|
|
|
q: quickSearchKeyword.value.trim() || searchForm.q || undefined,
|
|
q: quickSearchKeyword.value.trim() || searchForm.q || undefined,
|
|
|
- vehicleType: searchForm.vehicleType || undefined,
|
|
|
|
|
|
|
+ vehicleType: VEHICLE_TYPE_LOCK,
|
|
|
carrierId: searchForm.carrierId || undefined,
|
|
carrierId: searchForm.carrierId || undefined,
|
|
|
vehicleStatus: searchForm.vehicleStatus || undefined,
|
|
vehicleStatus: searchForm.vehicleStatus || undefined,
|
|
|
page: pagination.page,
|
|
page: pagination.page,
|
|
@@ -846,7 +799,7 @@ function handleSearch() {
|
|
|
|
|
|
|
|
function handleReset() {
|
|
function handleReset() {
|
|
|
searchForm.q = ''
|
|
searchForm.q = ''
|
|
|
- searchForm.vehicleType = ''
|
|
|
|
|
|
|
+ searchForm.vehicleType = VEHICLE_TYPE_LOCK
|
|
|
searchForm.carrierId = ''
|
|
searchForm.carrierId = ''
|
|
|
searchForm.vehicleStatus = ''
|
|
searchForm.vehicleStatus = ''
|
|
|
quickSearchKeyword.value = ''
|
|
quickSearchKeyword.value = ''
|
|
@@ -913,7 +866,7 @@ function handleAdd() {
|
|
|
id: '',
|
|
id: '',
|
|
|
licensePlate: '',
|
|
licensePlate: '',
|
|
|
trailerNo: '',
|
|
trailerNo: '',
|
|
|
- vehicleType: 'self',
|
|
|
|
|
|
|
+ vehicleType: VEHICLE_TYPE_LOCK,
|
|
|
carrierId: '',
|
|
carrierId: '',
|
|
|
carrierName: '',
|
|
carrierName: '',
|
|
|
loadCapacity: null,
|
|
loadCapacity: null,
|
|
@@ -921,7 +874,7 @@ function handleAdd() {
|
|
|
remark: ''
|
|
remark: ''
|
|
|
})
|
|
})
|
|
|
resetSubTables()
|
|
resetSubTables()
|
|
|
- certList.value = ensureVehicleCertSlots([], formData.trailerNo, formData.vehicleType as PlVehicleCertCheckType)
|
|
|
|
|
|
|
+ certList.value = ensureVehicleCertSlots([], formData.trailerNo, VEHICLE_TYPE_LOCK)
|
|
|
loadPersonnelOptions()
|
|
loadPersonnelOptions()
|
|
|
dialogVisible.value = true
|
|
dialogVisible.value = true
|
|
|
}
|
|
}
|
|
@@ -957,7 +910,7 @@ async function handleEdit(row: Vehicle) {
|
|
|
id: detail.id,
|
|
id: detail.id,
|
|
|
licensePlate: detail.licensePlate,
|
|
licensePlate: detail.licensePlate,
|
|
|
trailerNo: detail.trailerNo || '',
|
|
trailerNo: detail.trailerNo || '',
|
|
|
- vehicleType: detail.vehicleType,
|
|
|
|
|
|
|
+ vehicleType: VEHICLE_TYPE_LOCK,
|
|
|
carrierId: detail.carrierId,
|
|
carrierId: detail.carrierId,
|
|
|
carrierName: detail.carrierName,
|
|
carrierName: detail.carrierName,
|
|
|
loadCapacity: detail.loadCapacity ?? null,
|
|
loadCapacity: detail.loadCapacity ?? null,
|
|
@@ -980,14 +933,7 @@ async function handleEdit(row: Vehicle) {
|
|
|
remindDays: c.remindDays ?? 30,
|
|
remindDays: c.remindDays ?? 30,
|
|
|
attachmentUrls: c.attachmentUrls || ''
|
|
attachmentUrls: c.attachmentUrls || ''
|
|
|
}))
|
|
}))
|
|
|
- certList.value =
|
|
|
|
|
- detail.vehicleType === 'self' || detail.vehicleType === 'carrier'
|
|
|
|
|
- ? ensureVehicleCertSlots(
|
|
|
|
|
- mappedCerts,
|
|
|
|
|
- formData.trailerNo,
|
|
|
|
|
- detail.vehicleType as PlVehicleCertCheckType
|
|
|
|
|
- )
|
|
|
|
|
- : mappedCerts
|
|
|
|
|
|
|
+ certList.value = ensureVehicleCertSlots(mappedCerts, formData.trailerNo, VEHICLE_TYPE_LOCK)
|
|
|
certFormListRef.value?.refreshRequiredSlots?.()
|
|
certFormListRef.value?.refreshRequiredSlots?.()
|
|
|
} finally {
|
|
} finally {
|
|
|
dialogLoading.value = false
|
|
dialogLoading.value = false
|