diff --git a/openhis-ui-vue3/src/views/pharmacymanagement/westernmedicine/index.vue b/openhis-ui-vue3/src/views/pharmacymanagement/westernmedicine/index.vue index 56465f07..21f88931 100644 --- a/openhis-ui-vue3/src/views/pharmacymanagement/westernmedicine/index.vue +++ b/openhis-ui-vue3/src/views/pharmacymanagement/westernmedicine/index.vue @@ -755,9 +755,9 @@ async function previewAndPrint() { // 保存预览数据 previewData.value = result; - console.log('执行处方预览和打印'); + console.log('直接执行处方打印预览'); - // 构建预览HTML + // 构建预览HTML(保持原有格式) let previewHtml = ''; // 为每个处方生成预览内容 @@ -837,54 +837,153 @@ async function previewAndPrint() { previewHtml += '
'; }); - // 将打印数据序列化,以便在预览窗口中访问 - const serializedData = encodeURIComponent(JSON.stringify(result)); + // 创建临时打印容器(不可见) + const printContainer = document.createElement('div'); + printContainer.style.position = 'fixed'; + printContainer.style.left = '-9999px'; + printContainer.style.top = '-9999px'; + printContainer.style.width = '800px'; - // 创建预览窗口 - const previewWindow = window.open('', '_blank'); - if (!previewWindow) { - throw new Error('无法打开预览窗口,请检查浏览器弹窗设置'); - } + // 添加打印样式,确保只打印药品信息 + const style = document.createElement('style'); + style.textContent = ` + /* 确保打印样式只应用于药品信息 */ + .print-content { + font-family: Arial, sans-serif; + font-size: 12px; + } + .medicine-table { + width: 100%; + border-collapse: collapse; + } + .medicine-table th, + .medicine-table td { + border: 1px solid #000; + padding: 8px; + text-align: left; + } + .medicine-table th { + background: #f2f2f2; + font-weight: bold; + } + .page-break { + page-break-after: always; + } + /* 隐藏不需要打印的元素 */ + @media print { + body > *:not(#print-container) { + display: none !important; + } + #print-container { + position: static !important; + width: 100% !important; + } + } + `; + document.head.appendChild(style); - // 使用更安全的方式生成HTML内容,避免Vue编译错误 - const createPreviewHtml = (prescriptionData) => { - // 简单的HTML结构,避免复杂标签嵌套 - let html = '处方预览'; + // 设置容器ID以便CSS选择 + printContainer.id = 'print-container'; + + // 仅构建药品信息表格 + let medicineHtml = ''; + printContainer.innerHTML = medicineHtml; + + // 添加到文档 + document.body.appendChild(printContainer); + + // 触发打印预览 + window.print(); + + // 打印完成后移除临时容器和样式 + const cleanup = () => { + // 移除临时容器 + if (printContainer && document.body.contains(printContainer)) { + document.body.removeChild(printContainer); + } + // 移除临时样式 + if (style && document.head.contains(style)) { + document.head.removeChild(style); + } + // 移除事件监听器 + window.removeEventListener('afterprint', cleanup); }; - // 使用创建的函数生成HTML并写入 - previewWindow.document.write(createPreviewHtml(previewHtml)); - previewWindow.document.close(); + // 监听打印完成事件 + window.addEventListener('afterprint', cleanup); - proxy.$modal.msgSuccess('预览成功,请在新窗口中查看并点击打印按钮'); + // 添加超时清理,防止打印预览取消时资源未释放 + setTimeout(() => { + cleanup(); + }, 30000); // 30秒后自动清理 - // 同时处理后台打印逻辑(使用原来的打印功能) + proxy.$modal.msgSuccess('打印预览已启动'); + + // 同时处理后台打印逻辑 setTimeout(() => { handleBackgroundPrint(result); - }, 1000); + }, 500); } catch (error) { console.error('预览和打印过程出错:', error); proxy.$modal.msgError('操作失败: ' + error.message);