From d618de40dcefeeefcfbecae7022d94e863a2c69f Mon Sep 17 00:00:00 2001 From: hwj Date: Tue, 26 May 2026 17:05:20 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E8=AE=BE=E5=A4=87=E5=8F=B0?= =?UTF-8?q?=E8=B4=A6-=E8=AF=A6=E6=83=85-=E6=B7=BB=E5=8A=A0=E8=B5=84?= =?UTF-8?q?=E6=96=99tabs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/mes/deviceledger/detail/index.vue | 75 +++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/src/views/mes/deviceledger/detail/index.vue b/src/views/mes/deviceledger/detail/index.vue index 29228ea1..dabd5e7f 100644 --- a/src/views/mes/deviceledger/detail/index.vue +++ b/src/views/mes/deviceledger/detail/index.vue @@ -382,6 +382,20 @@ + + + + + + + + + + @@ -398,6 +412,7 @@ import { TicketManagementApi } from '@/api/mes/ticketManagement' import { DvRepairApi } from '@/api/mes/dvrepair' import QrcodeActionCard from '@/components/QrcodeActionCard/index.vue' import { useTagsViewStore } from '@/store/modules/tagsView' +import { downloadByUrl } from '@/utils/filt' defineOptions({ name: 'MesDeviceLedgerDetail' }) @@ -445,6 +460,66 @@ const detailTemplateJson = computed(() => { return templateJson }) +type FileUrlItem = { + fileName: string + fileUrl: string +} + +const getFileNameFromUrl = (url: string) => { + const cleanUrl = url.split('?')[0] + const fileName = cleanUrl.substring(cleanUrl.lastIndexOf('/') + 1) + return decodeURIComponent(fileName || url) +} + +const parseFileUrlList = (value: any): FileUrlItem[] => { + if (!value) return [] + let rawList: any[] = [] + if (Array.isArray(value)) { + rawList = value + } else if (typeof value === 'string') { + const trimmed = value.trim() + if (!trimmed) return [] + try { + const parsed = JSON.parse(trimmed) + rawList = Array.isArray(parsed) ? parsed : [parsed] + } catch { + rawList = trimmed + .split(',') + .map((url) => ({ fileUrl: url.trim() })) + .filter((item) => item.fileUrl) + } + } else if (typeof value === 'object') { + rawList = [value] + } + + return rawList + .map((item) => { + if (!item) return undefined + const fileUrl = typeof item === 'string' ? item : item.fileUrl + if (!fileUrl) return undefined + const normalizedUrl = String(fileUrl).trim() + if (!normalizedUrl) return undefined + const fileName = + typeof item === 'string' + ? getFileNameFromUrl(normalizedUrl) + : item.fileName || getFileNameFromUrl(normalizedUrl) + return { + fileName: String(fileName), + fileUrl: normalizedUrl + } + }) + .filter((item): item is FileUrlItem => Boolean(item)) +} + +const fileUrlList = computed(() => parseFileUrlList(detailData.value?.fileUrl)) + +const handleDownloadFile = (row: FileUrlItem) => { + downloadByUrl({ + url: row.fileUrl, + fileName: row.fileName + }) +} + const buildDetailPrintData = () => { return { id: detailData.value?.id,