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,