列宽修改 pdf 和图片 预览 其他文件下载

master
2358328281@qq.com 4 days ago
parent d657a141e9
commit 9b15b4c7e5

@ -34,17 +34,17 @@
<el-table-column <el-table-column
:label="$t('table.hospital')" :label="$t('table.hospital')"
prop="name" prop="name"
min-width="180" min-width="140"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column :label="$t('label.category')" prop="customerCategory" width="100" /> <el-table-column :label="$t('label.category')" prop="customerCategory" width="auto" />
<el-table-column :label="$t('table.contact')" prop="contactPerson" width="100" /> <el-table-column :label="$t('table.contact')" prop="contactPerson" width="auto" />
<el-table-column :label="$t('table.phone')" prop="contactPhone" width="140" /> <el-table-column :label="$t('table.phone')" prop="contactPhone" width="auto" />
<el-table-column :label="$t('table.manager')" prop="managerName" width="140" /> <el-table-column :label="$t('table.manager')" prop="managerName" width="auto" />
<el-table-column :label="$t('table.usageYears')" width="140"> <el-table-column :label="$t('table.usageYears')" width="auto">
<template #default="{ row }">{{ formatUsageYears(row.signDate) }}</template> <template #default="{ row }">{{ formatUsageYears(row.signDate) }}</template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('table.acceptanceReport')" width="140"> <el-table-column :label="$t('table.acceptanceReport')" width="auto">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
v-if="row.attachmentPath" v-if="row.attachmentPath"
@ -57,10 +57,10 @@
<span v-else></span> <span v-else></span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('table.signDate')" width="120"> <el-table-column :label="$t('table.signDate')" width="auto">
<template #default="{ row }">{{ formatDate(row.signDate) }}</template> <template #default="{ row }">{{ formatDate(row.signDate) }}</template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('table.maintenanceEnd')" width="120"> <el-table-column :label="$t('table.maintenanceEnd')" width="auto">
<template #default="{ row }">{{ formatDate(row.maintenanceEnd) }}</template> <template #default="{ row }">{{ formatDate(row.maintenanceEnd) }}</template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('table.action')" width="160" fixed="right"> <el-table-column :label="$t('table.action')" width="160" fixed="right">

@ -48,7 +48,7 @@
link link
type="primary" type="primary"
class="file-item" class="file-item"
@click="viewReport(f.filePath)" @click="viewReport(f.filePath, f.fileName)"
> >
<el-icon><Document /></el-icon>{{ f.fileName }} <el-icon><Document /></el-icon>{{ f.fileName }}
</el-button> </el-button>
@ -59,13 +59,13 @@
<div class="section-title">{{ $t('orderDetail.statusChange') }}</div> <div class="section-title">{{ $t('orderDetail.statusChange') }}</div>
<el-timeline> <el-timeline>
<el-timeline-item <el-timeline-item
v-for="(log, i) in detail.logs || []" v-for="(log, i) in detail.statusLogs || []"
:key="i" :key="i"
:timestamp="log.createdAt" :timestamp="log.createdAt"
placement="top" placement="top"
> >
<div class="log-title">{{ log.action }} · {{ log.operator }}</div> <div class="log-title">{{ log.toStatus }} · {{ log.operator }}</div>
<div class="log-remark">{{ log.remark }}</div> <div class="log-remark" v-html="log.remark"></div>
</el-timeline-item> </el-timeline-item>
</el-timeline> </el-timeline>
</div> </div>
@ -80,10 +80,15 @@
:before-close="closePreview" :before-close="closePreview"
> >
<iframe <iframe
v-if="previewUrl" v-if="previewType === 'pdf' && previewUrl"
:src="previewUrl" :src="previewUrl"
class="preview-iframe" class="preview-iframe"
/> />
<img
v-else-if="previewType === 'image' && previewUrl"
:src="previewUrl"
class="preview-image"
/>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
@ -118,12 +123,14 @@ const goProcess = () => router.push(`/admin/orders/process/${route.params.id}`);
const previewVisible = ref(false); const previewVisible = ref(false);
const previewUrl = ref(""); const previewUrl = ref("");
const previewType = ref(""); // 'pdf' | 'image' | ''
const cleanupPreviewUrl = () => { const cleanupPreviewUrl = () => {
if (previewUrl.value) { if (previewUrl.value) {
URL.revokeObjectURL(previewUrl.value); URL.revokeObjectURL(previewUrl.value);
previewUrl.value = ""; previewUrl.value = "";
} }
previewType.value = "";
}; };
const closePreview = () => { const closePreview = () => {
@ -131,14 +138,49 @@ const closePreview = () => {
cleanupPreviewUrl(); cleanupPreviewUrl();
}; };
const viewReport = async (attachmentPath) => { // /+blob mime
const getFileType = (fileName, blob) => {
const name = String(fileName || "");
const ext = name.split(".").pop()?.toLowerCase() || "";
const mime = blob?.type || "";
if (ext === "pdf" || mime === "application/pdf") return "pdf";
if (
["jpg", "jpeg", "png", "gif", "bmp", "webp", "svg"].includes(ext) ||
(mime && mime.startsWith("image/"))
) {
return "image";
}
return "other";
};
// blob
const downloadBlob = (blob, fileName) => {
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = fileName || "download";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
setTimeout(() => URL.revokeObjectURL(url), 0);
};
const viewReport = async (attachmentPath, originalName) => {
if (!attachmentPath) return; if (!attachmentPath) return;
const fileName = String(attachmentPath); const path = String(attachmentPath);
// 退
const downloadName = originalName || path;
try { try {
const blob = await getUploadFile(fileName); const blob = await getUploadFile(path);
cleanupPreviewUrl(); const type = getFileType(downloadName, blob);
previewUrl.value = URL.createObjectURL(blob); if (type === "pdf" || type === "image") {
previewVisible.value = true; cleanupPreviewUrl();
previewUrl.value = URL.createObjectURL(blob);
previewType.value = type;
previewVisible.value = true;
} else {
downloadBlob(blob, downloadName);
}
} catch (e) { } catch (e) {
ElMessage.error(e?.message || $t('msg.failed')); ElMessage.error(e?.message || $t('msg.failed'));
} }
@ -205,4 +247,11 @@ onMounted(loadDetail);
height: 80vh; height: 80vh;
border: 0; border: 0;
} }
.preview-image {
display: block;
max-width: 100%;
max-height: 80vh;
margin: 0 auto;
object-fit: contain;
}
</style> </style>

Loading…
Cancel
Save