yh-hiprint 2.6.13 → 2.6.14
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.js → index.ts} +243 -106
- 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 → index.ts}
RENAMED
|
@@ -1,41 +1,114 @@
|
|
|
1
1
|
import './libs/jquery';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
import {
|
|
3
|
+
ElDialog,
|
|
4
|
+
ElSelect,
|
|
5
|
+
ElOption,
|
|
6
|
+
ElButton,
|
|
7
|
+
ElMessageBox,
|
|
8
|
+
ElLoading,
|
|
9
|
+
ElMessage,
|
|
10
|
+
} from 'element-plus';
|
|
11
|
+
import {createApp, createVNode} from 'vue';
|
|
12
|
+
import {
|
|
13
|
+
hiprint,
|
|
14
|
+
defaultElementTypeProvider,
|
|
15
|
+
print,
|
|
16
|
+
print2,
|
|
17
|
+
usePaper,
|
|
18
|
+
useScale,
|
|
19
|
+
useDataSource,
|
|
20
|
+
} from './hooks/useHiprint';
|
|
21
|
+
export {hiprint, defaultElementTypeProvider, print, print2, usePaper, useScale, useDataSource};
|
|
22
|
+
export {default as fontSize} from './font-size';
|
|
23
|
+
export {default as scale} from './scale';
|
|
24
|
+
export {default as zIndex} from './z-index';
|
|
25
|
+
export {default as panel} from './panel';
|
|
26
|
+
import {getPrintTemplate} from './libs/index.js';
|
|
27
|
+
export {default as defaultPrintElement} from './store/defaultPrintElement';
|
|
28
|
+
export {getPrintTemplate};
|
|
29
|
+
|
|
30
|
+
export function guid(): string {
|
|
12
31
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (t) {
|
|
13
32
|
var e = (16 * Math.random()) | 0;
|
|
14
33
|
return ('x' == t ? e : (3 & e) | 8).toString(16);
|
|
15
34
|
});
|
|
16
35
|
}
|
|
17
36
|
|
|
18
|
-
|
|
37
|
+
// 定义类型
|
|
38
|
+
interface HiprintFunParams {
|
|
39
|
+
code: string;
|
|
40
|
+
params?: any;
|
|
41
|
+
data?: any;
|
|
42
|
+
isCustom?: boolean;
|
|
43
|
+
returnHtml?: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
interface SilentHiprintParams {
|
|
47
|
+
code: string;
|
|
48
|
+
params?: any;
|
|
49
|
+
data?: any;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface MessageEvent {
|
|
53
|
+
data: {
|
|
54
|
+
type: string;
|
|
55
|
+
data: any;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
interface TemplateResponse {
|
|
60
|
+
status: number;
|
|
61
|
+
data?: {
|
|
62
|
+
json: string;
|
|
63
|
+
};
|
|
64
|
+
message?: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface HiprintTemplate {
|
|
68
|
+
new (options: {template: any}): any;
|
|
69
|
+
getHtml(data: any): Array<{innerHTML: string}>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
interface CustomWindow extends Window {
|
|
73
|
+
silentHiprint: typeof silentHiprint;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function cLog(string: string, isError: boolean = false): void {
|
|
19
77
|
if (isError) {
|
|
20
|
-
console.error(
|
|
78
|
+
console.error(
|
|
79
|
+
'%cyhHiprint:%c',
|
|
80
|
+
'font-size: 16px;font-weight: bold;color: #00ffff',
|
|
81
|
+
'font-size: 16px;font-weight: bold;color: #ccccc',
|
|
82
|
+
string
|
|
83
|
+
);
|
|
21
84
|
} else {
|
|
22
|
-
console.log(
|
|
85
|
+
console.log(
|
|
86
|
+
'%cyhHiprint%c ' + string,
|
|
87
|
+
'font-size: 18px;font-weight: bold;color: #61AFEF',
|
|
88
|
+
'font-size: 12px;color: #999'
|
|
89
|
+
);
|
|
23
90
|
}
|
|
24
91
|
}
|
|
25
92
|
|
|
26
|
-
const hiprintFun = async ({
|
|
93
|
+
const hiprintFun = async ({
|
|
94
|
+
code,
|
|
95
|
+
params,
|
|
96
|
+
data,
|
|
97
|
+
isCustom,
|
|
98
|
+
returnHtml,
|
|
99
|
+
}: HiprintFunParams): Promise<any> => {
|
|
27
100
|
if (window.electronBrowserAPI && window.electronBrowserAPI.print) {
|
|
28
|
-
clientPrintHandler(code, params, data);
|
|
101
|
+
return clientPrintHandler(code, params, data);
|
|
29
102
|
} else {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
103
|
+
const height: number = document.documentElement.clientHeight;
|
|
104
|
+
const width: number = 1200;
|
|
105
|
+
const left: number = (document.documentElement.clientWidth - 1200) / 2;
|
|
33
106
|
// 转换数组
|
|
34
|
-
let paramData = params;
|
|
107
|
+
let paramData: any = params;
|
|
35
108
|
if (!Array.isArray(params)) {
|
|
36
109
|
paramData = [params];
|
|
37
110
|
}
|
|
38
|
-
let url = '/hiprint/#/preview?code=' + encodeURIComponent(code);
|
|
111
|
+
let url: string = '/hiprint/#/preview?code=' + encodeURIComponent(code);
|
|
39
112
|
if (params) {
|
|
40
113
|
url += `¶ms=${encodeURIComponent(JSON.stringify(paramData))}`;
|
|
41
114
|
}
|
|
@@ -48,15 +121,20 @@ const hiprintFun = async ({ code, params, data, isCustom, returnHtml }) => {
|
|
|
48
121
|
if (returnHtml) {
|
|
49
122
|
url += `&returnHtml=${returnHtml ? '1' : '0'}`;
|
|
50
123
|
}
|
|
51
|
-
|
|
124
|
+
const windowOpen = window.open(
|
|
125
|
+
url,
|
|
126
|
+
'hiprintWindow',
|
|
127
|
+
`height=${height}, width=${width}, top=20, left=${left}, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no`
|
|
128
|
+
);
|
|
52
129
|
|
|
53
130
|
return new Promise((resolve, reject) => {
|
|
54
131
|
if (!windowOpen) {
|
|
55
|
-
reject(
|
|
132
|
+
reject('预览窗口渲染失败!');
|
|
133
|
+
return;
|
|
56
134
|
}
|
|
57
|
-
function printHTMLHandler
|
|
58
|
-
|
|
59
|
-
if (type ===
|
|
135
|
+
function printHTMLHandler(e: MessageEvent): void {
|
|
136
|
+
const {type, data} = e.data;
|
|
137
|
+
if (type === 'sendPrintHTML' && data) {
|
|
60
138
|
resolve(data);
|
|
61
139
|
}
|
|
62
140
|
window.removeEventListener('message', printHTMLHandler);
|
|
@@ -66,28 +144,34 @@ const hiprintFun = async ({ code, params, data, isCustom, returnHtml }) => {
|
|
|
66
144
|
}
|
|
67
145
|
};
|
|
68
146
|
|
|
69
|
-
const silentHiprint = async ({
|
|
147
|
+
const silentHiprint = async ({
|
|
148
|
+
code,
|
|
149
|
+
params = {},
|
|
150
|
+
data,
|
|
151
|
+
}: SilentHiprintParams): Promise<string | boolean> => {
|
|
70
152
|
if (!code || !data) {
|
|
71
|
-
ElMessageBox.alert(
|
|
153
|
+
ElMessageBox.alert('请正确的传递模板编号和打印数据', '提示');
|
|
72
154
|
return false;
|
|
73
155
|
}
|
|
74
|
-
let loading = null;
|
|
156
|
+
let loading: any = null;
|
|
75
157
|
try {
|
|
76
158
|
loading = ElLoading.service({
|
|
77
|
-
text:
|
|
159
|
+
text: '正在获取打印模板',
|
|
78
160
|
});
|
|
79
|
-
|
|
161
|
+
const res: TemplateResponse = await getPrintTemplate(code, params);
|
|
80
162
|
if (res.status === 200 && res.data && res.data.json) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
163
|
+
const json: string = res.data.json;
|
|
164
|
+
const hiprintTemplate: HiprintTemplate = new (hiprint as any).PrintTemplate({
|
|
165
|
+
template: JSON.parse(json),
|
|
166
|
+
});
|
|
167
|
+
const html: Array<{innerHTML: string}> = hiprintTemplate.getHtml(data);
|
|
84
168
|
if (html[0]) {
|
|
85
169
|
return html[0].innerHTML;
|
|
86
170
|
} else {
|
|
87
|
-
ElMessageBox.alert(
|
|
171
|
+
ElMessageBox.alert('打印内容渲染失败', '提示');
|
|
88
172
|
}
|
|
89
173
|
} else {
|
|
90
|
-
ElMessageBox.alert(res.message ||
|
|
174
|
+
ElMessageBox.alert(res.message || '获取打印模板失败', '提示');
|
|
91
175
|
}
|
|
92
176
|
} catch (error) {
|
|
93
177
|
if (loading) {
|
|
@@ -101,16 +185,23 @@ const silentHiprint = async ({ code, params = {}, data }) => {
|
|
|
101
185
|
loading = null;
|
|
102
186
|
}
|
|
103
187
|
}
|
|
188
|
+
return false;
|
|
104
189
|
};
|
|
105
190
|
|
|
106
|
-
window.silentHiprint = silentHiprint;
|
|
191
|
+
(window as unknown as CustomWindow).silentHiprint = silentHiprint;
|
|
192
|
+
|
|
193
|
+
interface InstallOptions {
|
|
194
|
+
router?: any;
|
|
195
|
+
pinia?: any;
|
|
196
|
+
isAdmin?: boolean;
|
|
197
|
+
}
|
|
107
198
|
|
|
108
199
|
// 客户端打印处理函数
|
|
109
200
|
const clientPrintHandler = async (code, params, data) => {
|
|
110
201
|
let loading = null;
|
|
111
202
|
try {
|
|
112
203
|
loading = ElLoading.service({
|
|
113
|
-
text:
|
|
204
|
+
text: '正在获取打印模板',
|
|
114
205
|
});
|
|
115
206
|
let reqParams = [];
|
|
116
207
|
try {
|
|
@@ -121,17 +212,17 @@ const clientPrintHandler = async (code, params, data) => {
|
|
|
121
212
|
// 获取打印模板
|
|
122
213
|
let res = await getPrintTemplate(code, reqParams);
|
|
123
214
|
if (res.status !== 200 || !res.data || !res.data.json) {
|
|
124
|
-
ElMessageBox.alert(res.message ||
|
|
215
|
+
ElMessageBox.alert(res.message || '获取打印模板失败', '提示');
|
|
125
216
|
return false;
|
|
126
217
|
}
|
|
127
218
|
|
|
128
|
-
loading.setText(
|
|
219
|
+
loading.setText('正在连接打印客户端');
|
|
129
220
|
|
|
130
221
|
// 获取打印机列表
|
|
131
222
|
let printerList = await electronBrowserAPI.getPrinterList();
|
|
132
223
|
if (!printerList || printerList.length === 0) {
|
|
133
224
|
loading?.close();
|
|
134
|
-
ElMessageBox.alert(
|
|
225
|
+
ElMessageBox.alert('未获取到打印机列表', '提示');
|
|
135
226
|
return false;
|
|
136
227
|
}
|
|
137
228
|
|
|
@@ -139,20 +230,32 @@ const clientPrintHandler = async (code, params, data) => {
|
|
|
139
230
|
loading = null;
|
|
140
231
|
|
|
141
232
|
// 显示选择打印机的对话框
|
|
142
|
-
return await showPrinterSelectionDialog(
|
|
233
|
+
return await showPrinterSelectionDialog(
|
|
234
|
+
printerList,
|
|
235
|
+
res.data.json,
|
|
236
|
+
res.data.list,
|
|
237
|
+
res.data.name,
|
|
238
|
+
data
|
|
239
|
+
);
|
|
143
240
|
} catch (error) {
|
|
144
241
|
if (loading) {
|
|
145
242
|
loading.close();
|
|
146
243
|
loading = null;
|
|
147
244
|
}
|
|
148
245
|
console.error(error);
|
|
149
|
-
ElMessageBox.alert(
|
|
246
|
+
ElMessageBox.alert('客户端打印出错: ' + error.message, '提示');
|
|
150
247
|
return false;
|
|
151
248
|
}
|
|
152
249
|
};
|
|
153
250
|
|
|
154
251
|
// 显示打印机选择对话框
|
|
155
|
-
const showPrinterSelectionDialog = (
|
|
252
|
+
const showPrinterSelectionDialog = (
|
|
253
|
+
printerList,
|
|
254
|
+
templateJson,
|
|
255
|
+
templateData,
|
|
256
|
+
templateName,
|
|
257
|
+
data
|
|
258
|
+
) => {
|
|
156
259
|
return new Promise((resolve) => {
|
|
157
260
|
// 获取上次选择的打印机
|
|
158
261
|
const lastSelectedPrinter = localStorage.getItem('lastSelectedPrinter') || '';
|
|
@@ -177,33 +280,33 @@ const showPrinterSelectionDialog = (printerList, templateJson, templateData, tem
|
|
|
177
280
|
ElDialog,
|
|
178
281
|
ElSelect,
|
|
179
282
|
ElOption,
|
|
180
|
-
ElButton
|
|
283
|
+
ElButton,
|
|
181
284
|
},
|
|
182
|
-
data
|
|
285
|
+
data() {
|
|
183
286
|
return {
|
|
184
287
|
visible: true,
|
|
185
288
|
selectedPrinter: lastSelectedPrinter,
|
|
186
|
-
printerList: printerList
|
|
289
|
+
printerList: printerList,
|
|
187
290
|
};
|
|
188
291
|
},
|
|
189
292
|
methods: {
|
|
190
293
|
handlePrint: async function () {
|
|
191
294
|
if (!this.selectedPrinter) {
|
|
192
|
-
ElMessageBox.alert(
|
|
295
|
+
ElMessageBox.alert('请选择打印机', '提示');
|
|
193
296
|
return;
|
|
194
297
|
}
|
|
195
298
|
// 保存选择的打印机
|
|
196
299
|
localStorage.setItem('lastSelectedPrinter', this.selectedPrinter);
|
|
197
300
|
|
|
198
301
|
let loading = ElLoading.service({
|
|
199
|
-
text:
|
|
302
|
+
text: '正在渲染打印内容',
|
|
200
303
|
});
|
|
201
304
|
|
|
202
305
|
try {
|
|
203
306
|
// 创建打印模板实例
|
|
204
|
-
let hiprintTemplate = new hiprint.PrintTemplate({
|
|
307
|
+
let hiprintTemplate = new hiprint.PrintTemplate({template: json});
|
|
205
308
|
|
|
206
|
-
loading.setText(
|
|
309
|
+
loading.setText('正在发送打印任务');
|
|
207
310
|
const newGuid = guid();
|
|
208
311
|
const printOption = {
|
|
209
312
|
printer: this.selectedPrinter,
|
|
@@ -213,8 +316,8 @@ const showPrinterSelectionDialog = (printerList, templateJson, templateData, tem
|
|
|
213
316
|
templateId: newGuid,
|
|
214
317
|
pageSize: {
|
|
215
318
|
width: (json?.panels[0]?.width || 210) * 1000,
|
|
216
|
-
height: (json?.panels[0]?.height || 297) * 1000
|
|
217
|
-
}
|
|
319
|
+
height: (json?.panels[0]?.height || 297) * 1000,
|
|
320
|
+
},
|
|
218
321
|
};
|
|
219
322
|
const pCss = `<style rel="stylesheet" type="text/css">${printCss}</style>`;
|
|
220
323
|
const html = hiprintTemplate.getHtml(data || templateData, printOption)[0].outerHTML;
|
|
@@ -228,7 +331,7 @@ const showPrinterSelectionDialog = (printerList, templateJson, templateData, tem
|
|
|
228
331
|
case 'PRINT_SUCCESS':
|
|
229
332
|
loading.close();
|
|
230
333
|
this.handleClose(true);
|
|
231
|
-
ElMessage.success(
|
|
334
|
+
ElMessage.success('打印任务已发送到打印机');
|
|
232
335
|
// 移除事件监听器
|
|
233
336
|
window.removeEventListener('message', handlePrintResult);
|
|
234
337
|
clearTimeout(timeoutId);
|
|
@@ -236,7 +339,7 @@ const showPrinterSelectionDialog = (printerList, templateJson, templateData, tem
|
|
|
236
339
|
case 'PRINT_ERROR':
|
|
237
340
|
loading.close();
|
|
238
341
|
const error = event.data.data;
|
|
239
|
-
ElMessageBox.alert(
|
|
342
|
+
ElMessageBox.alert('打印失败: ' + (error.msg || '未知错误'), '提示');
|
|
240
343
|
this.handleClose(false);
|
|
241
344
|
// 移除事件监听器
|
|
242
345
|
window.removeEventListener('message', handlePrintResult);
|
|
@@ -255,7 +358,7 @@ const showPrinterSelectionDialog = (printerList, templateJson, templateData, tem
|
|
|
255
358
|
const timeoutId = setTimeout(() => {
|
|
256
359
|
window.removeEventListener('message', handlePrintResult);
|
|
257
360
|
loading.close();
|
|
258
|
-
ElMessageBox.alert(
|
|
361
|
+
ElMessageBox.alert('打印超时', '提示');
|
|
259
362
|
this.handleClose(false);
|
|
260
363
|
}, 60 * 1000); // 30秒超时
|
|
261
364
|
|
|
@@ -267,17 +370,15 @@ const showPrinterSelectionDialog = (printerList, templateJson, templateData, tem
|
|
|
267
370
|
loading.close();
|
|
268
371
|
window.removeEventListener('message', handlePrintResult);
|
|
269
372
|
clearTimeout(timeoutId);
|
|
270
|
-
ElMessageBox.alert(
|
|
373
|
+
ElMessageBox.alert('客户端打印发送失败: ' + error.message, '提示');
|
|
271
374
|
this.handleClose(false);
|
|
272
375
|
}
|
|
273
|
-
|
|
274
|
-
|
|
275
376
|
} catch (error) {
|
|
276
377
|
if (loading) {
|
|
277
378
|
loading.close();
|
|
278
379
|
}
|
|
279
380
|
console.error(error);
|
|
280
|
-
ElMessageBox.alert(
|
|
381
|
+
ElMessageBox.alert('打印过程中发生错误: ' + error.message, '提示');
|
|
281
382
|
this.handleClose(false);
|
|
282
383
|
}
|
|
283
384
|
},
|
|
@@ -287,49 +388,68 @@ const showPrinterSelectionDialog = (printerList, templateJson, templateData, tem
|
|
|
287
388
|
app.unmount();
|
|
288
389
|
document.body.removeChild(mountPoint);
|
|
289
390
|
resolve(result);
|
|
290
|
-
}
|
|
391
|
+
},
|
|
392
|
+
},
|
|
393
|
+
render() {
|
|
394
|
+
return createVNode(
|
|
395
|
+
ElDialog,
|
|
396
|
+
{
|
|
397
|
+
modelValue: this.visible,
|
|
398
|
+
title: '选择打印机',
|
|
399
|
+
width: '500px',
|
|
400
|
+
onClose: () => this.handleClose(false),
|
|
401
|
+
onClosed: () => this.handleClose(false),
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
default: () => [
|
|
405
|
+
createVNode(
|
|
406
|
+
ElSelect,
|
|
407
|
+
{
|
|
408
|
+
modelValue: this.selectedPrinter,
|
|
409
|
+
'onUpdate:modelValue': (val) => {
|
|
410
|
+
this.selectedPrinter = val;
|
|
411
|
+
},
|
|
412
|
+
placeholder: '请选择打印机',
|
|
413
|
+
style: 'width: 100%; margin-bottom: 15px;',
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
default: () =>
|
|
417
|
+
this.printerList.map((printer) =>
|
|
418
|
+
createVNode(ElOption, {
|
|
419
|
+
key: printer.name,
|
|
420
|
+
label: printer.name,
|
|
421
|
+
value: printer.name,
|
|
422
|
+
})
|
|
423
|
+
),
|
|
424
|
+
}
|
|
425
|
+
),
|
|
426
|
+
],
|
|
427
|
+
footer: () => [
|
|
428
|
+
createVNode('span', {class: 'dialog-footer'}, [
|
|
429
|
+
createVNode(
|
|
430
|
+
ElButton,
|
|
431
|
+
{
|
|
432
|
+
onClick: () => this.handleClose(false),
|
|
433
|
+
},
|
|
434
|
+
{
|
|
435
|
+
default: () => '取消',
|
|
436
|
+
}
|
|
437
|
+
),
|
|
438
|
+
createVNode(
|
|
439
|
+
ElButton,
|
|
440
|
+
{
|
|
441
|
+
type: 'primary',
|
|
442
|
+
onClick: this.handlePrint,
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
default: () => '打印',
|
|
446
|
+
}
|
|
447
|
+
),
|
|
448
|
+
]),
|
|
449
|
+
],
|
|
450
|
+
}
|
|
451
|
+
);
|
|
291
452
|
},
|
|
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
453
|
};
|
|
334
454
|
|
|
335
455
|
// 创建应用实例
|
|
@@ -342,12 +462,29 @@ const showPrinterSelectionDialog = (printerList, templateJson, templateData, tem
|
|
|
342
462
|
|
|
343
463
|
// window.silentHiprint = silentHiprint;
|
|
344
464
|
|
|
465
|
+
// 添加必要的类型定义
|
|
466
|
+
interface ElectronBrowserAPI {
|
|
467
|
+
print: (options: any) => void;
|
|
468
|
+
getPrinterList: () => Promise<any[]>;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
declare global {
|
|
472
|
+
interface Window {
|
|
473
|
+
electronBrowserAPI?: ElectronBrowserAPI;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// 导入打印样式
|
|
478
|
+
import printCss from './libs/css/hiprint.css?inline';
|
|
479
|
+
|
|
345
480
|
export default {
|
|
346
|
-
install
|
|
481
|
+
install(
|
|
482
|
+
app: any,
|
|
483
|
+
{router, pinia, isAdmin, clientPrint = false}: InstallOptions & {clientPrint?: boolean}
|
|
484
|
+
): void {
|
|
347
485
|
app.provide('$hiprint', hiprintFun);
|
|
348
486
|
app.provide('$silentHiprint', silentHiprint);
|
|
349
487
|
|
|
350
|
-
|
|
351
488
|
if (router) {
|
|
352
489
|
router.addRoute('Index', {
|
|
353
490
|
path: 'hiprint/designer',
|
|
@@ -356,7 +493,7 @@ export default {
|
|
|
356
493
|
icon: 'md-planet',
|
|
357
494
|
title: '打印设计器',
|
|
358
495
|
},
|
|
359
|
-
component: () => import('
|
|
496
|
+
component: () => import('./HiprintDesigner.vue'),
|
|
360
497
|
});
|
|
361
498
|
router.addRoute({
|
|
362
499
|
path: '/preview',
|
|
@@ -365,7 +502,7 @@ export default {
|
|
|
365
502
|
icon: 'md-planet',
|
|
366
503
|
title: 'printView',
|
|
367
504
|
},
|
|
368
|
-
component: () => import('
|
|
505
|
+
component: () => import('./hiprintPreview.vue'),
|
|
369
506
|
});
|
|
370
507
|
} else {
|
|
371
508
|
if (!router) {
|
|
@@ -373,4 +510,4 @@ export default {
|
|
|
373
510
|
}
|
|
374
511
|
}
|
|
375
512
|
},
|
|
376
|
-
};
|
|
513
|
+
};
|
package/libs/index.js
CHANGED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
import axios from '@/libs/api.request';
|
|
3
|
+
import {ElMessage, ElMessageBox} from 'element-plus';
|
|
4
|
+
import {hiprint} from 'yh-hiprint';
|
|
5
|
+
|
|
6
|
+
export default async function (code) {
|
|
7
|
+
let {
|
|
8
|
+
data: {list, json},
|
|
9
|
+
} = await axios.request({
|
|
10
|
+
url: `/printTemplate/data/${code}`,
|
|
11
|
+
method: 'post',
|
|
12
|
+
type: 'json',
|
|
13
|
+
data: [
|
|
14
|
+
{
|
|
15
|
+
code: '50101820',
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
});
|
|
19
|
+
if (json) {
|
|
20
|
+
if (Array.isArray(list) && list.length > 0) {
|
|
21
|
+
list = list.map((item) => {
|
|
22
|
+
let printData = {};
|
|
23
|
+
let datas = Object.entries(item);
|
|
24
|
+
datas.forEach((arr) => {
|
|
25
|
+
if (Array.isArray(arr[1])) {
|
|
26
|
+
printData[arr[0]] = arr[1];
|
|
27
|
+
} else {
|
|
28
|
+
if (arr[1] !== null && arr[1] !== undefined) {
|
|
29
|
+
let itemsEntries = Object.entries(arr[1]);
|
|
30
|
+
itemsEntries.forEach((cArr) => {
|
|
31
|
+
printData[`$${arr[0]}[${cArr[0]}]`] = cArr[1];
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
return printData;
|
|
37
|
+
});
|
|
38
|
+
} else {
|
|
39
|
+
list = [];
|
|
40
|
+
}
|
|
41
|
+
const htmlStr = new hiprint.PrintTemplate({template: JSON.parse(json)}).getHtml(list)[0].innerHTML;
|
|
42
|
+
ElMessageBox.alert(htmlStr, '打印预览', {
|
|
43
|
+
customClass: 'print-preview-dialog',
|
|
44
|
+
dangerouslyUseHTMLString: true,
|
|
45
|
+
closeOnClickModal: true,
|
|
46
|
+
closeOnPressEscape: true,
|
|
47
|
+
closeOnHashChange: true,
|
|
48
|
+
showConfirmButton: false,
|
|
49
|
+
});
|
|
50
|
+
} else {
|
|
51
|
+
ElMessage.warning({
|
|
52
|
+
message: '模板配置不存在,请检查',
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
package/package.json
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yh-hiprint",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.14",
|
|
4
4
|
"description": "Hiprint for Vue3 by NoahLiu in ForceCon in Hunan Changesha",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"import": "./index.ts",
|
|
9
|
+
"types": "./index.ts"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
7
12
|
"scripts": {
|
|
8
13
|
"start": "npm run pub:aliyun && npm run pub:npm",
|
|
9
14
|
"pub:aliyun": "npm publish --registry https://packages.aliyun.com/60765e0161a945067837bb5f/npm/npm-registry/ --tag latest --no-git-checks",
|
|
@@ -17,7 +22,8 @@
|
|
|
17
22
|
"nzh": "1.0.9"
|
|
18
23
|
},
|
|
19
24
|
"peerDependencies": {
|
|
20
|
-
"vue": "^3.
|
|
25
|
+
"vue": "^3.5.0",
|
|
26
|
+
"element-plus": "^2.9.0"
|
|
21
27
|
},
|
|
22
28
|
"author": "Liubin"
|
|
23
29
|
}
|