yh-hiprint 2.6.13 → 2.6.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HiprintDesigner.vue +670 -687
- package/config.json +399 -0
- package/doc.md +265 -0
- package/hiprintPreview.vue +132 -133
- package/hooks/useHipirntCanvas.ts +3 -0
- package/hooks/{useHiprint.js → useHiprint.ts} +115 -53
- package/hooks/useHiprintep.ts +0 -0
- package/index.ts +539 -0
- package/libs/index.js +2 -2
- package/libs/previewHiprint.ts +55 -0
- package/package.json +10 -4
- package/store/defaultPrintElement.ts +175 -0
- package/store/useHiprintStore.ts +92 -0
- package/types.ts +756 -0
- package/index.d.ts +0 -377
- package/index.js +0 -376
package/index.js
DELETED
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
import './libs/jquery';
|
|
2
|
-
import { ElDialog, ElSelect, ElOption, ElButton, ElMessageBox, ElLoading } from 'element-plus';
|
|
3
|
-
import { createApp, createVNode } from 'vue';
|
|
4
|
-
export { hiprint, defaultElementTypeProvider, print, print2, usePaper, useScale, useDataSource } from './hooks/useHiprint';
|
|
5
|
-
export { default as fontSize } from './font-size';
|
|
6
|
-
export { default as scale } from './scale';
|
|
7
|
-
export { default as zIndex } from './z-index';
|
|
8
|
-
export { default as panel } from './panel';
|
|
9
|
-
import { getPrintTemplate } from 'yh-hiprint/libs/index.js';
|
|
10
|
-
|
|
11
|
-
export function guid () {
|
|
12
|
-
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (t) {
|
|
13
|
-
var e = (16 * Math.random()) | 0;
|
|
14
|
-
return ('x' == t ? e : (3 & e) | 8).toString(16);
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function cLog (string, isError = false) {
|
|
19
|
-
if (isError) {
|
|
20
|
-
console.error('%cyhHiprint:%c', 'font-size: 16px;font-weight: bold;color: #00ffff', 'font-size: 16px;font-weight: bold;color: #ccccc', string);
|
|
21
|
-
} else {
|
|
22
|
-
console.log('%cyhHiprint%c ' + string, 'font-size: 18px;font-weight: bold;color: #61AFEF', 'font-size: 12px;color: #999');
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const hiprintFun = async ({ code, params, data, isCustom, returnHtml }) => {
|
|
27
|
-
if (window.electronBrowserAPI && window.electronBrowserAPI.print) {
|
|
28
|
-
clientPrintHandler(code, params, data);
|
|
29
|
-
} else {
|
|
30
|
-
let height = document.documentElement.clientHeight;
|
|
31
|
-
let width = 1200;
|
|
32
|
-
let left = (document.documentElement.clientWidth - 1200) / 2;
|
|
33
|
-
// 转换数组
|
|
34
|
-
let paramData = params;
|
|
35
|
-
if (!Array.isArray(params)) {
|
|
36
|
-
paramData = [params];
|
|
37
|
-
}
|
|
38
|
-
let url = '/hiprint/#/preview?code=' + encodeURIComponent(code);
|
|
39
|
-
if (params) {
|
|
40
|
-
url += `¶ms=${encodeURIComponent(JSON.stringify(paramData))}`;
|
|
41
|
-
}
|
|
42
|
-
if (data) {
|
|
43
|
-
url += `&data=${encodeURIComponent(JSON.stringify(data))}`;
|
|
44
|
-
}
|
|
45
|
-
if (isCustom) {
|
|
46
|
-
url += `&isCustom=${isCustom ? '1' : '0'}`;
|
|
47
|
-
}
|
|
48
|
-
if (returnHtml) {
|
|
49
|
-
url += `&returnHtml=${returnHtml ? '1' : '0'}`;
|
|
50
|
-
}
|
|
51
|
-
let windowOpen = window.open(url, 'hiprintWindow', `height=${height}, width=${width}, top=20, left=${left}, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no`);
|
|
52
|
-
|
|
53
|
-
return new Promise((resolve, reject) => {
|
|
54
|
-
if (!windowOpen) {
|
|
55
|
-
reject("预览窗口渲染失败!");
|
|
56
|
-
}
|
|
57
|
-
function printHTMLHandler (e) {
|
|
58
|
-
let { type, data } = e.data;
|
|
59
|
-
if (type === "sendPrintHTML" && data) {
|
|
60
|
-
resolve(data);
|
|
61
|
-
}
|
|
62
|
-
window.removeEventListener('message', printHTMLHandler);
|
|
63
|
-
}
|
|
64
|
-
window.addEventListener('message', printHTMLHandler);
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
const silentHiprint = async ({ code, params = {}, data }) => {
|
|
70
|
-
if (!code || !data) {
|
|
71
|
-
ElMessageBox.alert("请正确的传递模板编号和打印数据", '提示');
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
let loading = null;
|
|
75
|
-
try {
|
|
76
|
-
loading = ElLoading.service({
|
|
77
|
-
text: "正在获取打印模板"
|
|
78
|
-
});
|
|
79
|
-
let res = await getPrintTemplate(code, params);
|
|
80
|
-
if (res.status === 200 && res.data && res.data.json) {
|
|
81
|
-
let json = res.data.json;
|
|
82
|
-
let hiprintTemplate = new hiprint.PrintTemplate({ template: JSON.parse(json) });
|
|
83
|
-
let html = hiprintTemplate.getHtml(data);
|
|
84
|
-
if (html[0]) {
|
|
85
|
-
return html[0].innerHTML;
|
|
86
|
-
} else {
|
|
87
|
-
ElMessageBox.alert("打印内容渲染失败", '提示');
|
|
88
|
-
}
|
|
89
|
-
} else {
|
|
90
|
-
ElMessageBox.alert(res.message || "获取打印模板失败", '提示');
|
|
91
|
-
}
|
|
92
|
-
} catch (error) {
|
|
93
|
-
if (loading) {
|
|
94
|
-
loading.close();
|
|
95
|
-
loading = null;
|
|
96
|
-
}
|
|
97
|
-
console.error(error);
|
|
98
|
-
} finally {
|
|
99
|
-
if (loading) {
|
|
100
|
-
loading.close();
|
|
101
|
-
loading = null;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
window.silentHiprint = silentHiprint;
|
|
107
|
-
|
|
108
|
-
// 客户端打印处理函数
|
|
109
|
-
const clientPrintHandler = async (code, params, data) => {
|
|
110
|
-
let loading = null;
|
|
111
|
-
try {
|
|
112
|
-
loading = ElLoading.service({
|
|
113
|
-
text: "正在获取打印模板"
|
|
114
|
-
});
|
|
115
|
-
let reqParams = [];
|
|
116
|
-
try {
|
|
117
|
-
reqParams = params ? JSON.parse(params) : [];
|
|
118
|
-
} catch (error) {
|
|
119
|
-
console.error(error);
|
|
120
|
-
}
|
|
121
|
-
// 获取打印模板
|
|
122
|
-
let res = await getPrintTemplate(code, reqParams);
|
|
123
|
-
if (res.status !== 200 || !res.data || !res.data.json) {
|
|
124
|
-
ElMessageBox.alert(res.message || "获取打印模板失败", '提示');
|
|
125
|
-
return false;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
loading.setText("正在连接打印客户端");
|
|
129
|
-
|
|
130
|
-
// 获取打印机列表
|
|
131
|
-
let printerList = await electronBrowserAPI.getPrinterList();
|
|
132
|
-
if (!printerList || printerList.length === 0) {
|
|
133
|
-
loading?.close();
|
|
134
|
-
ElMessageBox.alert("未获取到打印机列表", '提示');
|
|
135
|
-
return false;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
loading.close();
|
|
139
|
-
loading = null;
|
|
140
|
-
|
|
141
|
-
// 显示选择打印机的对话框
|
|
142
|
-
return await showPrinterSelectionDialog(printerList, res.data.json, res.data.list, res.data.name, data);
|
|
143
|
-
} catch (error) {
|
|
144
|
-
if (loading) {
|
|
145
|
-
loading.close();
|
|
146
|
-
loading = null;
|
|
147
|
-
}
|
|
148
|
-
console.error(error);
|
|
149
|
-
ElMessageBox.alert("客户端打印出错: " + error.message, '提示');
|
|
150
|
-
return false;
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
// 显示打印机选择对话框
|
|
155
|
-
const showPrinterSelectionDialog = (printerList, templateJson, templateData, templateName, data) => {
|
|
156
|
-
return new Promise((resolve) => {
|
|
157
|
-
// 获取上次选择的打印机
|
|
158
|
-
const lastSelectedPrinter = localStorage.getItem('lastSelectedPrinter') || '';
|
|
159
|
-
|
|
160
|
-
let json = {};
|
|
161
|
-
try {
|
|
162
|
-
json = JSON.parse(templateJson);
|
|
163
|
-
} catch (error) {
|
|
164
|
-
console.error('客户端打印解析模板失败:', error);
|
|
165
|
-
ElMessageBox.alert('客户端打印解析模板失败', '提示');
|
|
166
|
-
document.body.removeChild(mountPoint);
|
|
167
|
-
resolve(false);
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
// 创建挂载点
|
|
171
|
-
const mountPoint = document.createElement('div');
|
|
172
|
-
document.body.appendChild(mountPoint);
|
|
173
|
-
|
|
174
|
-
// 创建Vue组件
|
|
175
|
-
const PrinterSelectorComponent = {
|
|
176
|
-
components: {
|
|
177
|
-
ElDialog,
|
|
178
|
-
ElSelect,
|
|
179
|
-
ElOption,
|
|
180
|
-
ElButton
|
|
181
|
-
},
|
|
182
|
-
data () {
|
|
183
|
-
return {
|
|
184
|
-
visible: true,
|
|
185
|
-
selectedPrinter: lastSelectedPrinter,
|
|
186
|
-
printerList: printerList
|
|
187
|
-
};
|
|
188
|
-
},
|
|
189
|
-
methods: {
|
|
190
|
-
handlePrint: async function () {
|
|
191
|
-
if (!this.selectedPrinter) {
|
|
192
|
-
ElMessageBox.alert("请选择打印机", '提示');
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
// 保存选择的打印机
|
|
196
|
-
localStorage.setItem('lastSelectedPrinter', this.selectedPrinter);
|
|
197
|
-
|
|
198
|
-
let loading = ElLoading.service({
|
|
199
|
-
text: "正在渲染打印内容"
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
try {
|
|
203
|
-
// 创建打印模板实例
|
|
204
|
-
let hiprintTemplate = new hiprint.PrintTemplate({ template: json });
|
|
205
|
-
|
|
206
|
-
loading.setText("正在发送打印任务");
|
|
207
|
-
const newGuid = guid();
|
|
208
|
-
const printOption = {
|
|
209
|
-
printer: this.selectedPrinter,
|
|
210
|
-
title: templateName,
|
|
211
|
-
imgToBase64: true,
|
|
212
|
-
id: newGuid,
|
|
213
|
-
templateId: newGuid,
|
|
214
|
-
pageSize: {
|
|
215
|
-
width: (json?.panels[0]?.width || 210) * 1000,
|
|
216
|
-
height: (json?.panels[0]?.height || 297) * 1000
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
const pCss = `<style rel="stylesheet" type="text/css">${printCss}</style>`;
|
|
220
|
-
const html = hiprintTemplate.getHtml(data || templateData, printOption)[0].outerHTML;
|
|
221
|
-
|
|
222
|
-
printOption.html = `${pCss}${html}`;
|
|
223
|
-
|
|
224
|
-
// 监听打印结果
|
|
225
|
-
const handlePrintResult = (event) => {
|
|
226
|
-
if (event.data && event.data.type) {
|
|
227
|
-
switch (event.data.type) {
|
|
228
|
-
case 'PRINT_SUCCESS':
|
|
229
|
-
loading.close();
|
|
230
|
-
this.handleClose(true);
|
|
231
|
-
ElMessage.success("打印任务已发送到打印机");
|
|
232
|
-
// 移除事件监听器
|
|
233
|
-
window.removeEventListener('message', handlePrintResult);
|
|
234
|
-
clearTimeout(timeoutId);
|
|
235
|
-
break;
|
|
236
|
-
case 'PRINT_ERROR':
|
|
237
|
-
loading.close();
|
|
238
|
-
const error = event.data.data;
|
|
239
|
-
ElMessageBox.alert("打印失败: " + (error.msg || "未知错误"), '提示');
|
|
240
|
-
this.handleClose(false);
|
|
241
|
-
// 移除事件监听器
|
|
242
|
-
window.removeEventListener('message', handlePrintResult);
|
|
243
|
-
clearTimeout(timeoutId);
|
|
244
|
-
break;
|
|
245
|
-
default:
|
|
246
|
-
break;
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
// 添加事件监听器
|
|
252
|
-
window.addEventListener('message', handlePrintResult);
|
|
253
|
-
|
|
254
|
-
// 添加超时机制,防止监听器泄漏
|
|
255
|
-
const timeoutId = setTimeout(() => {
|
|
256
|
-
window.removeEventListener('message', handlePrintResult);
|
|
257
|
-
loading.close();
|
|
258
|
-
ElMessageBox.alert("打印超时", '提示');
|
|
259
|
-
this.handleClose(false);
|
|
260
|
-
}, 60 * 1000); // 30秒超时
|
|
261
|
-
|
|
262
|
-
// 发送到客户端打印
|
|
263
|
-
try {
|
|
264
|
-
electronBrowserAPI.print(printOption);
|
|
265
|
-
} catch (error) {
|
|
266
|
-
console.error('客户端打印发送失败:', error);
|
|
267
|
-
loading.close();
|
|
268
|
-
window.removeEventListener('message', handlePrintResult);
|
|
269
|
-
clearTimeout(timeoutId);
|
|
270
|
-
ElMessageBox.alert("客户端打印发送失败: " + error.message, '提示');
|
|
271
|
-
this.handleClose(false);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
} catch (error) {
|
|
276
|
-
if (loading) {
|
|
277
|
-
loading.close();
|
|
278
|
-
}
|
|
279
|
-
console.error(error);
|
|
280
|
-
ElMessageBox.alert("打印过程中发生错误: " + error.message, '提示');
|
|
281
|
-
this.handleClose(false);
|
|
282
|
-
}
|
|
283
|
-
},
|
|
284
|
-
handleClose: function (result = false) {
|
|
285
|
-
this.visible = false;
|
|
286
|
-
// 移除固定延迟,直接执行卸载逻辑
|
|
287
|
-
app.unmount();
|
|
288
|
-
document.body.removeChild(mountPoint);
|
|
289
|
-
resolve(result);
|
|
290
|
-
}
|
|
291
|
-
},
|
|
292
|
-
render () {
|
|
293
|
-
return createVNode(ElDialog, {
|
|
294
|
-
modelValue: this.visible,
|
|
295
|
-
title: "选择打印机",
|
|
296
|
-
width: "500px",
|
|
297
|
-
onClose: () => this.handleClose(false),
|
|
298
|
-
onClosed: () => this.handleClose(false)
|
|
299
|
-
}, {
|
|
300
|
-
default: () => [
|
|
301
|
-
createVNode(ElSelect, {
|
|
302
|
-
modelValue: this.selectedPrinter,
|
|
303
|
-
"onUpdate:modelValue": (val) => { this.selectedPrinter = val; },
|
|
304
|
-
placeholder: "请选择打印机",
|
|
305
|
-
style: "width: 100%; margin-bottom: 15px;"
|
|
306
|
-
}, {
|
|
307
|
-
default: () => this.printerList.map(printer =>
|
|
308
|
-
createVNode(ElOption, {
|
|
309
|
-
key: printer.name,
|
|
310
|
-
label: printer.name,
|
|
311
|
-
value: printer.name
|
|
312
|
-
})
|
|
313
|
-
)
|
|
314
|
-
})
|
|
315
|
-
],
|
|
316
|
-
footer: () => [
|
|
317
|
-
createVNode("span", { class: "dialog-footer" }, [
|
|
318
|
-
createVNode(ElButton, {
|
|
319
|
-
onClick: () => this.handleClose(false)
|
|
320
|
-
}, {
|
|
321
|
-
default: () => "取消"
|
|
322
|
-
}),
|
|
323
|
-
createVNode(ElButton, {
|
|
324
|
-
type: "primary",
|
|
325
|
-
onClick: this.handlePrint
|
|
326
|
-
}, {
|
|
327
|
-
default: () => "打印"
|
|
328
|
-
})
|
|
329
|
-
])
|
|
330
|
-
]
|
|
331
|
-
});
|
|
332
|
-
}
|
|
333
|
-
};
|
|
334
|
-
|
|
335
|
-
// 创建应用实例
|
|
336
|
-
const app = createApp(PrinterSelectorComponent);
|
|
337
|
-
|
|
338
|
-
// 挂载应用
|
|
339
|
-
app.mount(mountPoint);
|
|
340
|
-
});
|
|
341
|
-
};
|
|
342
|
-
|
|
343
|
-
// window.silentHiprint = silentHiprint;
|
|
344
|
-
|
|
345
|
-
export default {
|
|
346
|
-
install (app, { router, pinia, isAdmin, clientPrint = false }) {
|
|
347
|
-
app.provide('$hiprint', hiprintFun);
|
|
348
|
-
app.provide('$silentHiprint', silentHiprint);
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
if (router) {
|
|
352
|
-
router.addRoute('Index', {
|
|
353
|
-
path: 'hiprint/designer',
|
|
354
|
-
name: '打印设计器',
|
|
355
|
-
meta: {
|
|
356
|
-
icon: 'md-planet',
|
|
357
|
-
title: '打印设计器',
|
|
358
|
-
},
|
|
359
|
-
component: () => import('yh-hiprint/HiprintDesigner.vue'),
|
|
360
|
-
});
|
|
361
|
-
router.addRoute({
|
|
362
|
-
path: '/preview',
|
|
363
|
-
name: 'printView',
|
|
364
|
-
meta: {
|
|
365
|
-
icon: 'md-planet',
|
|
366
|
-
title: 'printView',
|
|
367
|
-
},
|
|
368
|
-
component: () => import('yh-hiprint/hiprintPreview.vue'),
|
|
369
|
-
});
|
|
370
|
-
} else {
|
|
371
|
-
if (!router) {
|
|
372
|
-
cLog('没有传递 router 对象,所以无法将路由添加到应用中', true);
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
},
|
|
376
|
-
};
|