diff --git a/web-admin/src/views/pl/self-vehicle/index.vue b/web-admin/src/views/pl/self-vehicle/index.vue
index 2d5f45c39..223b03b6e 100644
--- a/web-admin/src/views/pl/self-vehicle/index.vue
+++ b/web-admin/src/views/pl/self-vehicle/index.vue
@@ -107,6 +107,23 @@
header-align="center"
:index="(index) => (pagination.page - 1) * pagination.pageSize + index + 1"
/>
+
+
+
+ 未上传
+
+
+
+
+
+
+
自有
@@ -249,6 +277,15 @@
maxlength="512"
/>
+
+
+
@@ -364,6 +401,16 @@
删除
+
+
+ —
+
import ListToolbarEndActions from '@/components/business/list-toolbar-end-actions/index.vue'
import ListQuickSearchInput from '@/components/business/list-quick-search-input/index.vue'
+import AttachmentUploadField from '@/components/business/attachment-upload-field/index.vue'
import { usePersistedListColumns } from '@/composables/usePersistedListColumns'
import { Check, Close, Delete, Edit, Plus, RefreshLeft, Search, Van } from '@element-plus/icons-vue'
import {
@@ -399,6 +447,7 @@ import {
import PlVehicleCertPartTabs from '@/components/business/pl-vehicle-cert-part-tabs/index.vue'
import PlVehicleCertPersonnelTabs from '@/components/business/pl-vehicle-cert-personnel-tabs/index.vue'
import PlVehicleCertBadges from '@/components/business/pl-vehicle-cert-badges/index.vue'
+import PlCertListAttachmentCell from '@/components/business/pl-cert-list-attachment-cell/index.vue'
import type { VehiclePersonnelViewRow } from '@/components/business/pl-vehicle-personnel-view-list/index.vue'
import SystemViewDialog, {
type ViewSection
@@ -414,6 +463,7 @@ import {
getPlVehicleStatusTagType,
normalizePlPersonnelSummaryDisplay
} from '@/utils/pl-display'
+import { firstPhotoUrl, resolvePhotoDisplayUrl } from '@/utils/pl-photo'
import {
collectSelfVehicleRequiredCertErrors,
ensureSelfVehicleCertSlots,
@@ -442,6 +492,8 @@ const vehicleList = ref([])
const carrierList = ref([])
const listColumnDefs = [
+ { prop: 'photoUrls', label: '照片' },
+ { prop: 'certAttachments', label: '证书附件' },
{ prop: 'vehicleType', label: '车辆类型' },
{ prop: 'vehicleStatus', label: '车辆状态' },
{ prop: 'loadCapacity', label: '载重(吨)' },
@@ -456,13 +508,14 @@ const {
isIndeterminate,
isColumnVisible,
resetToDefault
-} = usePersistedListColumns('pl-self-vehicle-list-columns', listColumnDefs)
+} = usePersistedListColumns('pl-self-vehicle-list-columns-v3', listColumnDefs)
const personnelOptions = ref([])
const selectedRows = ref([])
const dialogVisible = ref(false)
const dialogTitle = ref('')
const formRef = ref()
+const photoUploadRef = ref>()
const isEdit = ref(false)
const personnelList = ref([])
@@ -495,7 +548,8 @@ const formData = reactive({
carrierId: '',
carrierName: '',
vehicleStatus: 'available',
- remark: ''
+ remark: '',
+ photoUrls: ''
})
const formRules = {
@@ -563,7 +617,16 @@ const viewSections = computed(() => {
{ label: '备注', value: d.remark || '—', span: 'full' }
],
fieldLayout: 'table',
- tableMode: 'triple',
+ tableMode: 'triple'
+ },
+ {
+ title: '车辆照片',
+ fields: [],
+ slot: 'photo'
+ },
+ {
+ title: '',
+ fields: [],
slot: 'vehicleDetailTabs'
}
]
@@ -833,7 +896,8 @@ function handleAdd() {
carrierId: '',
carrierName: '',
vehicleStatus: 'available',
- remark: ''
+ remark: '',
+ photoUrls: ''
})
resetSubTables()
certList.value = ensureSelfVehicleCertSlots([], formData.trailerNo)
@@ -880,7 +944,8 @@ async function handleEdit(row: Vehicle) {
carrierId: detail.carrierId || '',
carrierName: detail.carrierName || '',
vehicleStatus: detail.vehicleStatus,
- remark: detail.remark
+ remark: detail.remark,
+ photoUrls: detail.photoUrls || ''
})
personnelList.value = resolvePersonnelRows(
(detail.personnelList || []).map(p => ({
@@ -915,6 +980,10 @@ async function handleSubmit() {
ElMessage.warning('证书附件上传中,请稍候')
return
}
+ if (photoUploadRef.value?.hasUploading?.()) {
+ ElMessage.warning('附件上传中,请稍候')
+ return
+ }
if (formData.carrierId) {
const carrier = carrierList.value.find(c => c.id === formData.carrierId)
@@ -934,6 +1003,7 @@ async function handleSubmit() {
loadCapacity: formData.loadCapacity,
vehicleStatus: formData.vehicleStatus,
remark: formData.remark,
+ photoUrls: formData.photoUrls || undefined,
personnelList: personnelList.value.map(p => ({
personnelId: p.personnelId,
personnelName: p.personnelName.trim(),
@@ -1032,4 +1102,24 @@ onMounted(() => {
flex-wrap: nowrap;
gap: 6px;
}
+
+.pl-photo-thumb {
+ width: 48px;
+ height: 48px;
+ border-radius: 8px;
+ object-fit: cover;
+ border: 1px solid var(--el-border-color, #d9e8e2);
+ display: inline-block;
+ vertical-align: middle;
+ background: #f8fafc;
+}
+
+.pl-photo-thumb--empty {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 11px;
+ color: #94a3b8;
+ box-sizing: border-box;
+}