222版签名提交

This commit is contained in:
yy2205 2025-06-17 15:56:11 +08:00
parent c2f4217cea
commit 9e9a372959
6 changed files with 333 additions and 18 deletions

View File

@ -1,5 +1,5 @@
import axios from 'axios' import axios from 'axios'
const imageAddress = 'F://陕西省咸阳市礼泉县心电图FTP/ecgimage/' const imageAddress = 'F:/陕西省咸阳市礼泉县心电图FTP/ecgimage/'
const originImageAddress = 'https://zzxmc.gw12320.com/ecgimage/' const originImageAddress = 'https://zzxmc.gw12320.com/ecgimage/'
// 超声组件 API // 超声组件 API
export const processImageApi = { export const processImageApi = {
@ -385,11 +385,12 @@ step:" ",
return str; return str;
}, },
addressToUrl:(address)=>{ addressToUrl:(address)=>{
// F:\陕西省咸阳市礼泉县心电图FTP\ecgimage\imgOcrAndProcess\\250605000=1567835=8d813b33-e7e7-4ee9-bce6-ab32526b269d.pdf
if (!address){ if (!address){
return return
} }
// console.log(imageAddress) // console.log(imageAddress)
const str = address.replace(imageAddress,originImageAddress) const str = address.replace("F:\\陕西省咸阳市礼泉县心电图FTP\\ecgimage\\",originImageAddress)
// console.log(str) // console.log(str)
return str; return str;
} }

7
src/types/ukey.d.ts vendored Normal file
View File

@ -0,0 +1,7 @@
declare global {
interface Window {
QysUKeySdk: any;
}
}
export {}

File diff suppressed because one or more lines are too long

80
src/utils/ukey.ts Normal file
View File

@ -0,0 +1,80 @@
import axios from 'axios'
// 动态加载 SDK
export const loadUKeySdk = () => {
return new Promise<void>((resolve, reject) => {
const script = document.createElement('script')
script.src = '/src/utils/sdk.min.v1.0.0.js'
script.type = 'text/javascript'
// 确保 window 对象已准备好
script.onload = () => {
if (window.QysUKeySdk) {
resolve()
} else {
reject(new Error('SDK 加载失败QysUKeySdk 未定义'))
}
}
script.onerror = (error) => {
reject(new Error('SDK 加载失败:' + error))
}
document.head.appendChild(script)
})
}
// 下载 PDF 文件
const downloadPdf = (data: any, filename: string = 'signed.pdf') => {
const blob = new Blob([data], { type: 'application/pdf' })
const url = URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = filename
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
URL.revokeObjectURL(url)
}
const uploadPdf = async (byteArray: number[], filename: string = 'signed.pdf') => {
console.log(router)
// return
try {
// 将字节数组转换为逗号分隔的字符串
const fileStream = byteArray.join(',');
const formData = new FormData();
formData.append('fileStream', fileStream);
formData.append('filename', filename);
formData.append('fileType', 'pdf');
formData.append('savePath', 'D:/陕西省咸阳市礼泉县心电图FTP/ecgimage/imgOcrAndProcess/');
const response = await fetch('http://localhost:58080/uploadFile', {
method: 'POST',
body: formData
});
const result = await response.json();
console.log('上传结果:', result);
return result;
} catch (error) {
console.error('文件上传失败:', error);
throw error;
}
};
// 获取 SDK 实例
export const getUKeySdk = () => {
if (window.QysUKeySdk) {
const sdk = new window.QysUKeySdk({
signCb: async function(file) {
try {
uploadPdf(file[0].rawFileData)
console.log('签署完成,文件已上传到服务器',file);
} catch (error) {
console.error('文件处理失败:', error)
}
}
})
return sdk
}
return null
}

View File

@ -490,7 +490,9 @@
</el-scrollbar> </el-scrollbar>
</div> </div>
</el-drawer> </el-drawer>
<Dialog v-model="uKeyable" title="表单详情" >
<index2/>
</Dialog>
<el-dialog <el-dialog
title="" title=""
v-model="isdiagshow" v-model="isdiagshow"
@ -587,6 +589,7 @@ import { PatientexamlistApi, PatientexamlistVO } from '@/api/tblist/patientexaml
import QRCode from 'qrcode' import QRCode from 'qrcode'
import ECGprint from '@/views/ECG/ECGprint.vue' import ECGprint from '@/views/ECG/ECGprint.vue'
import ReportInfoECG from '@/views/applyregistration/reportPrintStatistics/ReportInfoECG.vue' import ReportInfoECG from '@/views/applyregistration/reportPrintStatistics/ReportInfoECG.vue'
import Index2 from "@/views/ECG/translate/index2.vue";
import htmlToPdf from '@/utils/htmlPdf' import htmlToPdf from '@/utils/htmlPdf'
import ECGWarningDialog from '@/views/ECG/ECGWaring/ECGWarningDialog.vue' import ECGWarningDialog from '@/views/ECG/ECGWaring/ECGWarningDialog.vue'
import ECGReport from '@/views/ECG/ECGWaring/ECGReport.vue' import ECGReport from '@/views/ECG/ECGWaring/ECGReport.vue'
@ -597,6 +600,8 @@ import useClipboard from 'vue-clipboard3' //复制组件
import { ElLoading } from 'element-plus' import { ElLoading } from 'element-plus'
import { processImageApi } from '@/api/processImage' import { processImageApi } from '@/api/processImage'
import {encodeBase64} from "@/utils/base64" import {encodeBase64} from "@/utils/base64"
import Dialog from "@/components/Dialog/src/Dialog.vue";
import { log } from 'console'
const { toClipboard } = useClipboard() const { toClipboard } = useClipboard()
const emit = defineEmits(['success']) // success const emit = defineEmits(['success']) // success
@ -642,7 +647,8 @@ const keyid = ref() //当前数据行的主键ID
const savedisabled = ref(false) // const savedisabled = ref(false) //
const isPictureVisible = ref(false) // const isPictureVisible = ref(false) //
const loading = ref(false) // const loading = ref(false) //
const uKeyable = ref(false) //
const router = useRouter()
// //
const treeDefaultProps = { const treeDefaultProps = {
children: 'children', children: 'children',
@ -678,6 +684,7 @@ const open = async (row: any) => {
(queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.BMP') || (queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.BMP') ||
queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.JPG') || queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.JPG') ||
queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.PNG')) queryParams.value.ecgJsonDataFilePath.toUpperCase().endsWith('.PNG'))
) { ) {
isPictureVisible.value = true isPictureVisible.value = true
isChildVisible.value = false isChildVisible.value = false
@ -730,44 +737,42 @@ const open = async (row: any) => {
} }
// //
async function process() { async function process() {
uKeyable.value=false
if (applyFormVO.value.reportstatus === '已分析') { if (applyFormVO.value.reportstatus === '已分析') {
// //
await message.delConfirm('是否进行审核操作', '审核') await message.delConfirm('是否进行审核操作', '审核')
// loading.value = true // uKeyable.value=true
// return
const response = await PatientexamlistApi.examine(keyid.value,Profilevo.value.doctorname,Profilevo.value.doctorID) const response = await PatientexamlistApi.examine(keyid.value,Profilevo.value.doctorname,Profilevo.value.doctorID)
if (response) { if (response) {
message.alertSuccess('审核成功') message.alertSuccess('审核成功')
let data = Object.assign({},processImageApi.paramsList[rowinfo.value.orgName]) let data = Object.assign({},processImageApi.paramsList[rowinfo.value.orgName])
// data.imagePath = "F:\\西FTP\\ecgimage\\\\K021180213001N0003_20250418161404.jpg"
data.imagePath = queryParams.value.ecgJsonDataFilePath data.imagePath = queryParams.value.ecgJsonDataFilePath
// data.imagePath = "https://zzxmc.gw12320.com/ecgimage/%E5%8C%97%E5%B1%AF%E4%B8%AD%E5%BF%83%E5%8D%AB%E7%94%9F%E9%99%A2/K021180213001N0003_20250418162136.jpg"
data.examId = rowinfo.value.examId data.examId = rowinfo.value.examId
data.orgId = rowinfo.value.orgId data.orgId = rowinfo.value.orgId
data.watermarkText = data.step + queryParams.value.doctorDiagResult data.watermarkText = data.step + queryParams.value.doctorDiagResult
// console.log(data) // console.log(data)
data.imagePath = processImageApi.urlToAddress(data.imagePath) data.imagePath = processImageApi.urlToAddress(data.imagePath)
// let str = JSON.stringify(data) // const processResponse = await processImageApi.processImg(data,processImageApi.apiUrl111)
// let str64 = encodeBase64(str) const processResponse = await processImageApi.processImg(data,processImageApi.apiUrl222)
const processResponse = await processImageApi.processImg(data,processImageApi.apiUrl111)
// await processImageApi.processImg(data,processImageApi.apiUrl222)
console.log("processResponse",processResponse)
// 1. JSON data // 1. JSON data
const dataObj = JSON.parse(processResponse.data); const dataObj = JSON.parse(processResponse.data.data);
console.log("dataObj",dataObj)
// 2. updateSuccess // 2. updateSuccess
const updateSuccess = dataObj.updateSuccess; const updateSuccess = dataObj.updateSuccess;
console.log("updateSuccess",updateSuccess)
if (!updateSuccess){ if (!updateSuccess){
message.warning('诊断图片生成异常') message.warning('诊断图片生成异常')
}else{
const imageUrl = processImageApi.addressToUrl(dataObj.imagePath)
// 使 window.open
window.open(`/translate?img=${encodeURIComponent(imageUrl)}`, '_blank')
} }
// loading.value = false
await getPatientexamlist(keyid.value) await getPatientexamlist(keyid.value)
emit('success') emit('success')
savedisabled.value = true savedisabled.value = true
// loading.value = false
} }
} else if (applyFormVO.value.reportstatus === '已审核') { } else if (applyFormVO.value.reportstatus === '已审核') {
message.warning('已经审核,无需再次审核') message.warning('已经审核,无需再次审核')

View File

@ -0,0 +1,221 @@
<!-- App.vue -->
<template>
<div class='App'>
<div class='header'>
<div class="upload-section">
<label htmlFor='addFile'>添加本地文件</label>
<input id='addFile' type="file" multiple @change="handleAddFile" :disabled="loading"/>
</div>
<div class="network-section">
<el-input
v-model="pdfUrl"
placeholder="请输入 PDF 文件地址"
:disabled="loading"
class="pdf-url-input"
>
<template #append>
<el-button @click="handleNetworkPdf(pdfUrl)" :loading="loading">
加载网络 PDF
</el-button>
</template>
</el-input>
</div>
<el-button @click="handleCloseApp" :disabled="loading" type="danger">
关闭应用
</el-button>
</div>
<div class='body'>
<div ref="container" class='container'></div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, nextTick } from 'vue'
import { loadUKeySdk, getUKeySdk } from '@/utils/ukey'
import { ElLoading, ElMessage } from 'element-plus'
import axios from 'axios'
import { log } from 'console'
const ukeySdk = ref<any>(null)
const container = ref<HTMLDivElement|null>(null)
const loading = ref(false)
const pdfUrl = ref('')
const route = useRoute()
onMounted(async () => {
loading.value = true
const pdfParam = route.query.img
console.log('PDF参数:', pdfParam)
try {
await loadUKeySdk()
ukeySdk.value = getUKeySdk()
if (!ukeySdk.value) {
throw new Error('SDK 初始化失败')
}
ElMessage.success('SDK 加载成功')
// URL使URL使URL
const pdfToLoad = pdfParam ? String(pdfParam) : ''
pdfUrl.value = pdfToLoad
// 使 nextTick SDK
nextTick(async () => {
if (pdfToLoad) {
console.log('准备加载PDF:', pdfToLoad)
// SDK
setTimeout(async () => {
await handleNetworkPdf(pdfToLoad)
}, 1000)
}
})
} catch (error: any) {
console.error('SDK加载失败:', error)
ElMessage.error(error.message || 'SDK 加载失败')
} finally {
loading.value = false
}
})
//
const handleAddFile = (event: any) => {
if (loading.value) {
ElMessage.warning('SDK 正在加载中,请稍候...')
return
}
const files = event.target.files;
if (!files || !files.length || !ukeySdk.value) {
ElMessage.warning('请先选择文件')
return
}
try {
/** ukeySdk.container 可用于判断当前是否已经渲染,组件渲染后会将根 dom 元素保存在 sdk 实例中 */
if (!ukeySdk.value.container) {
ukeySdk.value.render(container.value!)
}
/** 向签章系统中添加 pdf 文件 */
ukeySdk.value.addFile(files)
ElMessage.success('文件添加成功')
} catch (error: any) {
console.error('添加文件失败:', error)
ElMessage.error(error.message || '添加文件失败')
}
}
// PDF
const handleNetworkPdf = async (pdf) => {
console.log('开始处理PDF:', pdf)
if (loading.value) {
console.log('SDK正在加载中退出处理')
ElMessage.warning('SDK 正在加载中,请稍候...')
return
}
if (!pdf) {
console.log('PDF地址为空退出处理')
ElMessage.warning('PDF 文件地址为空')
return
}
if (!ukeySdk.value) {
console.log('SDK未初始化退出处理')
ElMessage.warning('SDK 未初始化')
return
}
console.log('开始设置loading状态')
loading.value = true
try {
console.log('开始获取PDF文件:', pdf)
// PDF
const response = await axios.get(pdf, {
responseType: 'blob',
timeout: 30000, //
headers: {
'Cache-Control': 'no-cache',
'Pragma': 'no-cache'
}
})
console.log('PDF文件获取成功响应状态:', response.status)
console.log('开始创建File对象')
// File
const file = new File([response.data], 'document.pdf', {
type: 'application/pdf'
})
//
if (!ukeySdk.value.container) {
console.log('开始渲染容器')
ukeySdk.value.render(container.value!)
}
console.log('开始添加文件到签章系统')
//
await ukeySdk.value.addFile([file])
console.log('文件添加成功')
ElMessage.success('网络 PDF 文件添加成功')
} catch (error: any) {
console.error('添加网络 PDF 失败:', error)
ElMessage.error(error.message || '添加网络 PDF 失败')
} finally {
console.log('处理完成重置loading状态')
loading.value = false
}
}
/** 卸载当前签章应用实例 */
const handleCloseApp = () => {
if (!ukeySdk.value) {
ElMessage.warning('SDK 未初始化')
return
}
try {
ukeySdk.value.close()
ElMessage.success('应用已关闭')
} catch (error: any) {
console.error('关闭应用失败:', error)
ElMessage.error(error.message || '关闭应用失败')
}
}
</script>
<style scoped>
.App {
width: 100vw;
height: 100vh;
overflow: hidden;
display: flex;
flex-direction: column;
}
.header {
flex-shrink: 0;
padding: 10px;
display: flex;
gap: 10px;
align-items: center;
}
.body {
flex: 1;
overflow: hidden;
}
.container {
width: 100%;
height: 100%;
}
button:disabled,
input:disabled {
opacity: 0.5;
cursor: not-allowed;
}
</style>