fix(print): 修复打印模板创建失败问题

1. OutpatientSurgeryCharge.json: 添加缺失的 paperList 属性
   - 在 panels 中添加 paperList 配置,指定自定义纸张尺寸 (80x297)
   - 与成功模板 OutpatientBilling.json 保持一致的结构

2. printUtils.js: 移除重复的 hiprint.init() 调用
   - 注释掉 previewPrint 函数中的 hiprint.init() 调用
   - 避免覆盖 main.js 中带有 providers 的初始化配置
   - 防止元素类型未正确注册导致的问题

🤖 Generated with [Qoder][https://qoder.com]
This commit is contained in:
2026-03-06 17:02:25 +08:00
parent 2492daa0ad
commit 8ef334ba1b
2 changed files with 90 additions and 504 deletions

View File

@@ -2,509 +2,44 @@
"panels": [ "panels": [
{ {
"index": 0, "index": 0,
"name": 1, "name": "门诊收费凭证",
"paperType": "自定义", "paperType": "自定义",
"height": 297, "height": 297,
"width": 80, "width": 80,
"paperHeader": 0,
"paperFooter": 597,
"paperNumberDisabled": true,
"paperList": { "paperList": {
"type": "自定义", "type": "自定义",
"width": 80, "width": 80,
"height": 297 "height": 297
}, },
"panelPageRule": "none",
"paperHeader": 0,
"paperFooter": 597,
"paperNumberDisabled": true,
"paperNumberContinue": true,
"expandCss": "",
"panelAngle": 0,
"overPrintOptions": {
"content": "",
"opacity": 0.7,
"type": 1
},
"watermarkOptions": {
"content": "",
"fillStyle": "rgba(87, 13, 248, 0.5)",
"fontSize": "36px",
"rotate": 25,
"width": 413,
"height": 310,
"timestamp": true,
"format": "YYYY-MM-DD HH:mm"
},
"panelLayoutOptions": {
"layoutType": "column",
"layoutRowGap": 0,
"layoutColumnGap": 0
},
"printElements": [ "printElements": [
{ {"options": {"left": 0, "top": 8, "height": 14, "width": 226.5, "title": "{{HOSPITAL_NAME}}门诊收费凭证", "fontWeight": "bold", "textAlign": "center", "fontSize": 11}, "printElementType": {"title": "文本", "type": "text"}},
"options": { {"options": {"left": 10, "top": 26, "height": 10, "width": 80, "title": "患者:", "fontSize": 9, "field": "patientName"}, "printElementType": {"title": "文本", "type": "text"}},
"left": 0, {"options": {"left": 100, "top": 26, "height": 10, "width": 60, "title": "性别:", "fontSize": 9, "field": "sex"}, "printElementType": {"title": "文本", "type": "text"}},
"top": 8, {"options": {"left": 160, "top": 26, "height": 10, "width": 60, "title": "年龄:", "fontSize": 9, "field": "age"}, "printElementType": {"title": "文本", "type": "text"}},
"height": 14, {"options": {"left": 10, "top": 38, "height": 10, "width": 100, "title": "科室:", "fontSize": 9, "field": "organizationName"}, "printElementType": {"title": "文本", "type": "text"}},
"width": 226.5, {"options": {"left": 120, "top": 38, "height": 10, "width": 100, "title": "医生:", "fontSize": 9, "field": "practitionerName"}, "printElementType": {"title": "文本", "type": "text"}},
"title": "{{HOSPITAL_NAME}}门诊收费凭证", {"options": {"left": 10, "top": 50, "height": 10, "width": 80, "title": "病人类型:", "fontSize": 9, "field": "personType"}, "printElementType": {"title": "文本", "type": "text"}},
"coordinateSync": false, {"options": {"left": 100, "top": 50, "height": 10, "width": 120, "title": "门诊号:", "fontSize": 9, "field": "busNo"}, "printElementType": {"title": "文本", "type": "text"}},
"widthHeightSync": false, {"options": {"left": 10, "top": 62, "height": 10, "width": 150, "title": "收费时间:", "fontSize": 9, "field": "chargeTime"}, "printElementType": {"title": "文本", "type": "text"}},
"fontWeight": "bold", {"options": {"left": 0, "top": 76, "height": 2, "width": 226.5, "borderWidth": 1, "borderStyle": "solid", "borderColor": "#000000"}, "printElementType": {"title": "线", "type": "line"}},
"textAlign": "center", {"options": {"left": 10, "top": 82, "height": 10, "width": 80, "title": "收费项目", "fontSize": 9, "fontWeight": "bold"}, "printElementType": {"title": "文本", "type": "text"}},
"fontSize": 11 {"options": {"left": 100, "top": 82, "height": 10, "width": 40, "title": "数量", "fontSize": 9, "fontWeight": "bold", "textAlign": "center"}, "printElementType": {"title": "文本", "type": "text"}},
}, {"options": {"left": 145, "top": 82, "height": 10, "width": 80, "title": "金额", "fontSize": 9, "fontWeight": "bold", "textAlign": "right"}, "printElementType": {"title": "文本", "type": "text"}},
"printElementType": { {"options": {"left": 0, "top": 94, "height": 40, "width": 226.5, "field": "chargeItem", "textAlign": "center", "fontSize": 8, "columns": [[{"title": "收费项目", "width": 95, "field": "chargeItemName"}, {"title": "数量", "width": 40, "field": "quantityValue"}, {"title": "金额", "width": 50, "field": "totalPrice"}]]}, "printElementType": {"title": "表格", "type": "table"}},
"title": "文本", {"options": {"left": 0, "top": 136, "height": 2, "width": 226.5, "borderWidth": 1, "borderStyle": "solid", "borderColor": "#000000"}, "printElementType": {"title": "线", "type": "line"}},
"type": "text" {"options": {"left": 10, "top": 142, "height": 10, "width": 80, "title": "合计:", "fontSize": 9, "field": "FULAMT_OWNPAY_AMT"}, "printElementType": {"title": "文本", "type": "text"}},
} {"options": {"left": 100, "top": 142, "height": 10, "width": 120, "title": "现金:", "fontSize": 9, "textAlign": "right", "field": "SELF_CASH_PAY"}, "printElementType": {"title": "文本", "type": "text"}},
}, {"options": {"left": 10, "top": 154, "height": 10, "width": 100, "title": "微信:", "fontSize": 9, "field": "SELF_VX_PAY"}, "printElementType": {"title": "文本", "type": "text"}},
{ {"options": {"left": 120, "top": 154, "height": 10, "width": 100, "title": "支付宝:", "fontSize": 9, "textAlign": "right", "field": "SELF_ALI_PAY"}, "printElementType": {"title": "文本", "type": "text"}},
"options": { {"options": {"left": 10, "top": 166, "height": 10, "width": 150, "title": "医保账户:", "fontSize": 9, "field": "SELF_YB_ZH_PAY"}, "printElementType": {"title": "文本", "type": "text"}},
"left": 10, {"options": {"left": 0, "top": 180, "height": 2, "width": 226.5, "borderWidth": 1, "borderStyle": "dashed", "borderColor": "#CCCCCC"}, "printElementType": {"title": "线", "type": "line"}},
"top": 26, {"options": {"left": 0, "top": 186, "height": 12, "width": 226.5, "title": "门诊手术计费流程", "fontWeight": "bold", "textAlign": "center", "fontSize": 10, "color": "#0066CC"}, "printElementType": {"title": "文本", "type": "text"}},
"height": 10, {"options": {"left": 10, "top": 200, "height": 85, "width": 206.5, "field": "surgeryFlowImage", "fit": "contain"}, "printElementType": {"title": "图片", "type": "image"}},
"width": 80, {"options": {"left": 0, "top": 288, "height": 10, "width": 226.5, "title": "请妥善保管,有疑问请咨询服务台", "fontSize": 8, "textAlign": "center", "color": "#666666"}, "printElementType": {"title": "文本", "type": "text"}}
"title": "患者:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "patientName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 100,
"top": 26,
"height": 10,
"width": 60,
"title": "性别:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "sex"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 160,
"top": 26,
"height": 10,
"width": 60,
"title": "年龄:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "age"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 38,
"height": 10,
"width": 100,
"title": "科室:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "organizationName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 120,
"top": 38,
"height": 10,
"width": 100,
"title": "医生:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "practitionerName"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 50,
"height": 10,
"width": 80,
"title": "病人类型:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "personType"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 100,
"top": 50,
"height": 10,
"width": 120,
"title": "门诊号:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "busNo"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 62,
"height": 10,
"width": 150,
"title": "收费时间:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "chargeTime"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 0,
"top": 76,
"height": 2,
"width": 226.5,
"coordinateSync": false,
"widthHeightSync": false,
"borderWidth": 1,
"borderStyle": "solid",
"borderColor": "#000000"
},
"printElementType": {
"title": "线",
"type": "line"
}
},
{
"options": {
"left": 10,
"top": 82,
"height": 10,
"width": 80,
"title": "收费项目",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"fontWeight": "bold"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 100,
"top": 82,
"height": 10,
"width": 40,
"title": "数量",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"fontWeight": "bold",
"textAlign": "center"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 145,
"top": 82,
"height": 10,
"width": 80,
"title": "金额",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"fontWeight": "bold",
"textAlign": "right"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 0,
"top": 94,
"height": 40,
"width": 226.5,
"title": "费用明细",
"field": "chargeItem",
"coordinateSync": false,
"widthHeightSync": false,
"textAlign": "center",
"fontSize": 8,
"columns": [
[
{
"title": "收费项目",
"width": 95,
"field": "chargeItemName",
"checked": true,
"columnId": "chargeItemName",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "数量",
"width": 40,
"field": "quantityValue",
"checked": true,
"columnId": "quantityValue",
"fixed": false,
"rowspan": 1,
"colspan": 1
},
{
"title": "金额",
"width": 50,
"field": "totalPrice",
"checked": true,
"columnId": "totalPrice",
"fixed": false,
"rowspan": 1,
"colspan": 1,
"formatter2": "function(value, row, index, options, rowIndex, column) {\n if (!value) return '';\n return `<span>${value}</span>`;\n}"
}
]
]
},
"printElementType": {
"title": "表格",
"type": "table",
"editable": true,
"columnDisplayEditable": true,
"columnDisplayIndexEditable": true,
"columnTitleEditable": true,
"columnResizable": true,
"columnAlignEditable": true,
"isEnableEditField": true,
"isEnableContextMenu": true,
"isEnableInsertRow": true,
"isEnableDeleteRow": true,
"isEnableInsertColumn": true,
"isEnableDeleteColumn": true,
"isEnableMergeCell": true
}
},
{
"options": {
"left": 0,
"top": 136,
"height": 2,
"width": 226.5,
"coordinateSync": false,
"widthHeightSync": false,
"borderWidth": 1,
"borderStyle": "solid",
"borderColor": "#000000"
},
"printElementType": {
"title": "线",
"type": "line"
}
},
{
"options": {
"left": 10,
"top": 142,
"height": 10,
"width": 80,
"title": "合计:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "FULAMT_OWNPAY_AMT"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 100,
"top": 142,
"height": 10,
"width": 120,
"title": "现金:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"textAlign": "right",
"field": "SELF_CASH_PAY"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 154,
"height": 10,
"width": 100,
"title": "微信:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "SELF_VX_PAY"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 120,
"top": 154,
"height": 10,
"width": 100,
"title": "支付宝:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"textAlign": "right",
"field": "SELF_ALI_PAY"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 166,
"height": 10,
"width": 150,
"title": "医保账户:",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 9,
"field": "SELF_YB_ZH_PAY"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 0,
"top": 180,
"height": 2,
"width": 226.5,
"coordinateSync": false,
"widthHeightSync": false,
"borderWidth": 1,
"borderStyle": "dashed",
"borderColor": "#CCCCCC"
},
"printElementType": {
"title": "线",
"type": "line"
}
},
{
"options": {
"left": 0,
"top": 186,
"height": 12,
"width": 226.5,
"title": "门诊手术计费流程",
"coordinateSync": false,
"widthHeightSync": false,
"fontWeight": "bold",
"textAlign": "center",
"fontSize": 10,
"color": "#0066CC"
},
"printElementType": {
"title": "文本",
"type": "text"
}
},
{
"options": {
"left": 10,
"top": 200,
"height": 85,
"width": 206.5,
"coordinateSync": false,
"widthHeightSync": false,
"field": "surgeryFlowImage",
"imgSrc": "/img/surgery-charge-flow.png",
"fit": "contain"
},
"printElementType": {
"title": "图片",
"type": "image"
}
},
{
"options": {
"left": 0,
"top": 288,
"height": 10,
"width": 226.5,
"title": "请妥善保管,有疑问请咨询服务台",
"coordinateSync": false,
"widthHeightSync": false,
"fontSize": 8,
"textAlign": "center",
"color": "#666666"
},
"printElementType": {
"title": "文本",
"type": "text"
}
}
] ]
} }
] ]
} }

View File

@@ -3,6 +3,8 @@
* 集中管理所有打印相关功能 * 集中管理所有打印相关功能
*/ */
import {hiprint} from 'vue-plugin-hiprint';
// 打印模板映射表 . // 打印模板映射表 .
const TEMPLATE_MAP = { const TEMPLATE_MAP = {
// CLINIC_CHARGE: () => import('@/views/charge/cliniccharge/components/template.json'), // CLINIC_CHARGE: () => import('@/views/charge/cliniccharge/components/template.json'),
@@ -42,6 +44,24 @@ const TEMPLATE_MAP = {
//中药医生处方单 //中药医生处方单
DOC_CHINESE_MEDICINE_PRESCRIPTION: () => DOC_CHINESE_MEDICINE_PRESCRIPTION: () =>
import('@/components/Print/DocChineseMedicinePrescription.json'), import('@/components/Print/DocChineseMedicinePrescription.json'),
// ========== 新增模板原LODOP迁移==========
//腕带
WRIST_BAND: () => import('@/components/Print/WristBand.json'),
//分诊条
TRIAGE_TICKET: () => import('@/components/Print/TriageTicket.json'),
//输液标签
INJECT_LABEL: () => import('@/components/Print/InjectLabel.json'),
//床头卡
BED_CARD: () => import('@/components/Print/BedCard.json'),
//护理交接班
CHANGE_SHIFT_BILL: () => import('@/components/Print/ChangeShiftBill.json'),
//医嘱执行单
EXE_ORDER_SHEET: () => import('@/components/Print/ExeOrderSheet.json'),
//体温单
TEMPERATURE_SHEET: () => import('@/components/Print/TemperatureSheet.json'),
//会诊申请单
CONSULTATION: () => import('@/components/Print/Consultation.json'),
}; };
/** /**
@@ -147,6 +167,24 @@ export const PRINT_TEMPLATE = {
PHARMACY_PRESCRIPTION: 'PHARMACY_PRESCRIPTION', PHARMACY_PRESCRIPTION: 'PHARMACY_PRESCRIPTION',
//中药医生处方单 //中药医生处方单
DOC_CHINESE_MEDICINE_PRESCRIPTION: 'DOC_CHINESE_MEDICINE_PRESCRIPTION', DOC_CHINESE_MEDICINE_PRESCRIPTION: 'DOC_CHINESE_MEDICINE_PRESCRIPTION',
// ========== 新增模板原LODOP迁移==========
//腕带
WRIST_BAND: 'WRIST_BAND',
//分诊条
TRIAGE_TICKET: 'TRIAGE_TICKET',
//输液标签
INJECT_LABEL: 'INJECT_LABEL',
//床头卡
BED_CARD: 'BED_CARD',
//护理交接班
CHANGE_SHIFT_BILL: 'CHANGE_SHIFT_BILL',
//医嘱执行单
EXE_ORDER_SHEET: 'EXE_ORDER_SHEET',
//体温单
TEMPERATURE_SHEET: 'TEMPERATURE_SHEET',
//会诊申请单
CONSULTATION: 'CONSULTATION',
}; };
/** /**
@@ -155,8 +193,8 @@ export const PRINT_TEMPLATE = {
*/ */
export function getPrinterList() { export function getPrinterList() {
try { try {
if (window.hiprint && window.hiprint.hiwebSocket && window.hiprint.hiwebSocket.connected) { if (hiprint && hiprint.hiwebSocket && hiprint.hiwebSocket.connected) {
const printerList = window.hiprint.hiwebSocket.getPrinterList(); const printerList = hiprint.hiwebSocket.getPrinterList();
return printerList || []; return printerList || [];
} else { } else {
console.warn('打印服务未连接,返回空打印机列表'); console.warn('打印服务未连接,返回空打印机列表');
@@ -230,15 +268,28 @@ export function savePrinterToCache(printerName, businessName = 'default') {
export function executePrint(data, template, printerName, options = {}, businessName = 'default') { export function executePrint(data, template, printerName, options = {}, businessName = 'default') {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
try { try {
if (!window.hiprint) { // 调试信息
throw new Error('打印插件未加载'); console.log('hiprint 对象:', hiprint);
} console.log('hiprint.PrintTemplate:', hiprint.PrintTemplate);
console.log('模板数据:', template);
const userStore = useUserStore(); const userStore = useUserStore();
const processedTemplate = JSON.parse( const processedTemplate = JSON.parse(
JSON.stringify(template).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName) JSON.stringify(template).replace(/{{HOSPITAL_NAME}}/g, userStore.hospitalName)
); );
const hiprintTemplate = new window.hiprint.PrintTemplate({ template: processedTemplate });
console.log('打印模板:', processedTemplate.panels?.[0]?.name, '元素数量:', processedTemplate.panels?.[0]?.printElements?.length);
// 创建打印模板
let hiprintTemplate;
try {
hiprintTemplate = new hiprint.PrintTemplate({ template: processedTemplate });
} catch (templateError) {
console.error('创建打印模板失败:', templateError);
console.error('模板内容:', JSON.stringify(processedTemplate, null, 2));
throw new Error('打印模板创建失败: ' + templateError.message);
}
const printOptions = { const printOptions = {
title: '打印标题', title: '打印标题',
height: 210, height: 210,
@@ -247,7 +298,7 @@ export function executePrint(data, template, printerName, options = {}, business
}; };
// 检查客户端是否连接 // 检查客户端是否连接
const isClientConnected = window.hiprint.hiwebSocket && window.hiprint.hiwebSocket.connected; const isClientConnected = hiprint.hiwebSocket && hiprint.hiwebSocket.connected;
// 如果指定了打印机且客户端已连接,添加到打印选项中 // 如果指定了打印机且客户端已连接,添加到打印选项中
if (printerName && isClientConnected) { if (printerName && isClientConnected) {
@@ -348,9 +399,9 @@ export async function selectPrinterAndPrint(
// 预览打印 // 预览打印
export function previewPrint(elementDom) { export function previewPrint(elementDom) {
if (elementDom) { if (elementDom) {
//初始化 // 初始化已在 main.js 中完成,无需重复调用
window.hiprint.init(); // hiprint.init();
const hiprintTemplate = new window.hiprint.PrintTemplate(); const hiprintTemplate = new hiprint.PrintTemplate();
// printByHtml为预览打印 // printByHtml为预览打印
hiprintTemplate.printByHtml(elementDom, {}); hiprintTemplate.printByHtml(elementDom, {});
} else { } else {