Files
zgty-mas-m/pages/analysis/sample/pdf-preview.vue
2025-11-11 20:51:08 +08:00

144 lines
3.9 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<view>
<navbar-back title="任务单预览"></navbar-back>
<view></view>
<!-- #ifdef H5 -->
<web-view :src="pdfUrlH5"></web-view>
<!-- #endif -->
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { onLoad, onHide, onUnload } from '@dcloudio/uni-app'
import { getBaseUrl } from '@/defaultBaseUrl'
import nx from '@/nx'
// 响应式数据
const businessAssayTaskId = ref('')
const localFilePath = ref('')
const reportKey = ref('')
const hideResultFlag = ref('')
const viewerUrl = '/hybrid/html/web/viewer.html?file='
const pdfUrlH5 = ref('')
let wv = null // 计划创建的 webview
// 方法:下载 PDF
const downloadPdf = (pdfUrl, retryCount = 0) => {
const MAX_RETRY = 3 // 最多重试 3 次
return new Promise(resolve => {
if (retryCount >= MAX_RETRY) {
console.error('PDF 下载失败:超过最大重试次数')
return resolve(null)
}
uni.downloadFile({
url: pdfUrl,
success: res => {
if (res.statusCode !== 200) {
console.warn(`下载失败,状态码: ${res.statusCode},重试第 ${retryCount + 1}`)
return resolve(downloadPdf(pdfUrl, retryCount + 1))
}
const tempFilePath = res.tempFilePath
uni.getFileInfo({
filePath: tempFilePath,
success: fileInfo => {
if (fileInfo.size > 0) {
resolve(tempFilePath)
} else {
console.warn('文件为空,重试中...')
resolve(downloadPdf(pdfUrl, retryCount + 1))
}
},
fail: () => {
console.warn('获取文件信息失败,重试中...')
resolve(downloadPdf(pdfUrl, retryCount + 1))
}
})
},
fail: () => {
console.warn('网络请求失败,重试中...')
resolve(downloadPdf(pdfUrl, retryCount + 1))
}
})
})
}
// 方法Android 加载 PDF
const loadPdfOnAndroid = async pdfUrl => {
const tempFilePath = await downloadPdf(pdfUrl)
if (!tempFilePath) return
const localPath = plus.io.convertLocalFileSystemURL(tempFilePath)
localFilePath.value = localPath
const allUrl = viewerUrl + encodeURIComponent(localPath)
// 创建并加载 webview
wv = plus.webview.create('', 'custom-webview', {
top: uni.getSystemInfoSync().statusBarHeight + 44,
bottom: 0
})
wv.loadURL(allUrl)
const currentWebview = getCurrentPages().pop().$getAppWebview()
currentWebview.append(wv)
}
// 获取 PDF 预览 URL
const getPdf = async () => {
const printBaseUrl = getBaseUrl()
const baseUrl = getBaseUrl()
let dataUrl = `${baseUrl}/qms/bus/sample/analysis-audit/crossAuditByTaskId?businessAssayTaskId=${businessAssayTaskId.value}`
dataUrl += `&hideResultFlag=${hideResultFlag.value}`
const token = nx.$store('user').token
let url = `${printBaseUrl}/qms/config-report-template/preview`
url += `?token=${token}`
url += `&type=PDF`
url += `&reportKey=${reportKey.value}`
url += `&dataUrl=${encodeURIComponent(dataUrl)}`
// #ifdef H5
pdfUrlH5.value = viewerUrl + encodeURIComponent(url)
// #endif
// #ifndef H5
await loadPdfOnAndroid(url)
// #endif
}
// 删除临时文件
const deleteTmpFile = () => {
if (!localFilePath.value) return
const dir = localFilePath.value.substring(0, localFilePath.value.lastIndexOf('/'))
plus.io.resolveLocalFileSystemURL(
dir,
entry => {
entry.removeRecursively(
() => console.log('删除成功'),
e => console.log('删除失败:' + e.message)
)
},
e => console.log('目录不存在:' + e.message)
)
}
// 生命周期
onLoad(param => {
if (param.businessAssayTaskId) {
businessAssayTaskId.value = param.businessAssayTaskId
reportKey.value = param.reportKey
hideResultFlag.value = param.hideResultFlag
}
getPdf()
})
onHide(() => {
deleteTmpFile()
})
onUnload(() => {
deleteTmpFile()
})
</script>
<style scoped></style>