Эх сурвалжийг харах

feat: 将前端发送的打印数据,添加到打印队列中,前端展示打印队列

zhuyong 10 сар өмнө
parent
commit
108be314df

+ 1 - 0
electron/channel/Channel.ts

@@ -6,4 +6,5 @@ export const Channel = {
   PRINT_START: "print:start",
   PRINT_PROGRESS: "print:progress",
   PRINT_DATA: "print:data",
+  PRINT_TASK_LIST: "print:task:list"
 }

+ 75 - 37
electron/service/PrintService.ts

@@ -5,17 +5,48 @@ import { BrowserWindow } from 'electron'
 import {Event} from '../utils/Event'
 import {PrintEvent} from "../event/PrintEvent";
 import {Channel} from "../channel/Channel";
+import {PrintTaskQueue} from "../utils/PrintTaskQueue";
+import {randomUUID} from "node:crypto";
 /**
  * 打印服务
  */
 class PrintService {
-
+    private static queue = new PrintTaskQueue()
     constructor() {
     }
 
     _init() {
         Event.on(PrintEvent.PRINT_DATA, async (res) => {
-            await this.printData(res)
+            if (res instanceof Array) {
+                for (let print of res) {
+                    PrintService.queue.enqueue({taskId: randomUUID(), data: print})
+                }
+            }
+        })
+        this.printLoop()
+    }
+
+    printLoop() {
+        new Promise(async (resolve, reject) => {
+            try {
+                while (!PrintService.queue.isEmpty()) {
+                    getMainWindow().webContents.send(Channel.PRINT_TASK_LIST, PrintService.queue.list())
+                    const task = PrintService.queue.dequeue()
+                    if (task) {
+                        // @ts-ignore
+                        await this.printData(task.data)
+                    }
+                    await new Promise(resolve2 => setTimeout(resolve2, 1000))
+                    resolve(true)
+                }
+            } catch (e) {
+                logger.error('print loop ex ---> ', e)
+                reject(e)
+            }
+        }).then((res: any) => {
+            logger.info("print then --->", res)
+        }).catch((e: any) => {
+            logger.error('print catch ex ---> ', e)
         })
     }
 
@@ -27,41 +58,48 @@ class PrintService {
     }
 
     async printData(data: any) {
-        getMainWindow().webContents.send(Channel.PRINT_START)
-        const printWindow = new BrowserWindow({ show: false });
-        const printData = `<html><body>${data.html}</body></html>`
-        getMainWindow().webContents.send(Channel.PRINT_DATA, printData)
-        await printWindow.loadURL(`data:text/html, ${printData}`);
-        printWindow.webContents.on('did-finish-load', () => {
-            getMainWindow().webContents.send(Channel.PRINT_PROGRESS)
-            printWindow.webContents.print({
-                silent: true,
-                printBackground: true,
-                deviceName: data.deviceName ,
-                margins:data.margins||{
-                    marginType :'none'
-                },
-                landscape:data.landscape||false,
-                copies:data.copies||1,
-                dpi:data.dpi,
-                header:data.header,
-                footer:data.footer,
-                pageSize:data.pageSize //A4,Legal | {height:}
-            }, (success: boolean, failureReason: string) => {
-                logger.info('打印结果:', success, failureReason)
-                getMainWindow().webContents.send(Channel.PRINT_RESULT, {
-                    success,
-                    failureReason
-                })
-                printRecordService.add({
-                    printerName: data.deviceName,
-                    printHtml: data.html,
-                    printStatus: success ? 'success' : 'failure',
-                    failureReason: failureReason
-                })
-                printWindow.close();
-            }); // 静默打印
-        });
+        return new Promise(async (resolve, reject) => {
+            getMainWindow().webContents.send(Channel.PRINT_START)
+            const printWindow = new BrowserWindow({ show: false });
+            const printData = `<html><body>${data.html}</body></html>`
+            getMainWindow().webContents.send(Channel.PRINT_DATA, printData)
+            await printWindow.loadURL(`data:text/html, ${printData}`);
+            printWindow.webContents.on('did-finish-load', () => {
+                getMainWindow().webContents.send(Channel.PRINT_PROGRESS)
+                printWindow.webContents.print({
+                    silent: true,
+                    printBackground: true,
+                    deviceName: data.deviceName ,
+                    margins:data.margins||{
+                        marginType :'none'
+                    },
+                    landscape:data.landscape||false,
+                    copies:data.copies||1,
+                    dpi:data.dpi,
+                    header:data.header,
+                    footer:data.footer,
+                    pageSize:data.pageSize //A4,Legal | {height:}
+                }, (success: boolean, failureReason: string) => {
+                    logger.info('打印结果:', success, failureReason)
+                    getMainWindow().webContents.send(Channel.PRINT_RESULT, {
+                        success,
+                        failureReason
+                    })
+                    printRecordService.add({
+                        printerName: data.deviceName,
+                        printHtml: data.html,
+                        printStatus: success ? 'success' : 'failure',
+                        failureReason: failureReason
+                    })
+                    if (success) {
+                        resolve(true)
+                    }else {
+                        reject(failureReason)
+                    }
+                    printWindow.close();
+                }); // 静默打印
+            });
+        })
     }
 
 }

+ 0 - 13
electron/utils/PrintQueueManager.ts

@@ -1,13 +0,0 @@
-import {Queue} from "./Queue";
-
-class PrintQueueManager {
-
-    private static queue: Queue<any> = new Queue();
-
-    public addJob(job: any) {
-        PrintQueueManager.queue.enqueue(job)
-    }
-}
-PrintQueueManager.toString = () => '[class PrintQueueManager]'
-const printQueueManager = new PrintQueueManager()
-export { PrintQueueManager, printQueueManager }

+ 3 - 3
electron/utils/Queue.ts → electron/utils/PrintTaskQueue.ts

@@ -1,5 +1,5 @@
 
-export class Queue<T> {
+export class PrintTaskQueue<T> {
     private items: T[] = [];
 
     // 入队操作
@@ -33,7 +33,7 @@ export class Queue<T> {
     }
 
     // 打印队列内容
-    print(): void {
-        console.log(this.items.join(' -> '));
+    list(): any[] {
+        return this.items
     }
 }

+ 1 - 0
frontend/src/api/Channel.ts

@@ -6,4 +6,5 @@ export const Channel = {
   PRINT_START: "print:start",
   PRINT_PROGRESS: "print:progress",
   PRINT_DATA: "print:data",
+  PRINT_TASK_LIST: "print:task:list"
 }

+ 6 - 0
frontend/src/views/PrintScreen.vue

@@ -59,6 +59,7 @@ const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE;
 onMounted(() => {
   loadLocalPrintList()
   onSocketState()
+  loadPrintTaskList()
 })
 
 // load native print list
@@ -73,6 +74,11 @@ const loadLocalPrintList = () => {
 
 // load print task list
 const printTaskList = ref<any>([])
+const loadPrintTaskList = () => {
+  ipc.on(Channel.PRINT_TASK_LIST, (e: any, result: any) => {
+
+  })
+}
 
 
 // show print preview