浏览代码

feat: 打印时拿到设置的打印机信息,未拿到则提示未设置默认打印机

zhuyong 10 月之前
父节点
当前提交
494cf5deb0
共有 4 个文件被更改,包括 42 次插入4 次删除
  1. 2 1
      electron/channel/Channel.ts
  2. 12 1
      electron/service/PrintService.ts
  3. 2 1
      frontend/src/api/Channel.ts
  4. 26 1
      frontend/src/views/PrintScreen.vue

+ 2 - 1
electron/channel/Channel.ts

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

+ 12 - 1
electron/service/PrintService.ts

@@ -7,6 +7,7 @@ import {PrintEvent} from "../event/PrintEvent";
 import {Channel} from "../channel/Channel";
 import {PrintTaskQueue} from "../utils/PrintTaskQueue";
 import {randomUUID} from "node:crypto";
+import { appConfigService } from './database/AppConfigService'
 /**
  * 打印服务
  */
@@ -59,17 +60,27 @@ class PrintService {
 
     async printData(data: any) {
         return new Promise(async (resolve, reject) => {
+            const appConfig = await appConfigService.getConfig()
             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}`);
+            // @ts-ignore
+            const deviceName = appConfig ? appConfig.defaultPrintName ? appConfig.defaultPrintName : '' : ''
+            if (!deviceName) {
+                getMainWindow().webContents.send(Channel.PRINT_RESULT, {
+                    success: false,
+                    failureReason: '未找到默认打印机'
+                })
+                return
+            }
             printWindow.webContents.on('did-finish-load', () => {
                 getMainWindow().webContents.send(Channel.PRINT_PROGRESS)
                 printWindow.webContents.print({
                     silent: true,
                     printBackground: true,
-                    deviceName: data.deviceName ,
+                    deviceName: deviceName,
                     margins:data.margins||{
                         marginType :'none'
                     },

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

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

+ 26 - 1
frontend/src/views/PrintScreen.vue

@@ -41,6 +41,8 @@
                 </template>
               </a-empty>
             </div>
+            <div v-if="printPreview" v-html="printPreviewData">
+            </div>
           </div>
         </div>
     </div>
@@ -60,6 +62,8 @@ onMounted(() => {
   loadLocalPrintList()
   onSocketState()
   loadPrintTaskList()
+  listenPrintDatePreview()
+  listenPrintTaskState()
 })
 
 // load native print list
@@ -76,13 +80,34 @@ const loadLocalPrintList = () => {
 const printTaskList = ref<any>([])
 const loadPrintTaskList = () => {
   ipc.on(Channel.PRINT_TASK_LIST, (e: any, result: any) => {
-
+    printTaskList.value = result
   })
 }
 
 
 // show print preview
 const printPreview = ref<any>(false)
+const printPreviewData = ref<any>('')
+const listenPrintDatePreview = () => {
+  ipc.on(Channel.PRINT_DATA, (e: any, result: any) => {
+    if (result) {
+      printPreview.value = true
+      printPreviewData.value = result
+    }
+  })
+  ipc.on(Channel.PRINT_RESULT, (e: any, result: any) => {
+    printPreview.value = false
+    printPreviewData.value = ''
+  })
+}
+
+// listen printer task state
+const printTaskState = ref<any>(null)
+const listenPrintTaskState = () => {
+  ipc.on(Channel.PRINT_TASK_STATE, (e: any, result: any) => {
+    printTaskState.value = result
+  })
+}
 
 // load set default print name
 const defaultPrintName = ref<string>('')