Преглед изворни кода

fix: Open前先EnumUSB/EnumPRN初始化——匹配C# Demo调用序列

lq пре 1 месец
родитељ
комит
2994521519
1 измењених фајлова са 16 додато и 2 уклоњено
  1. 16 2
      internal/modules/printer/service/service.go

+ 16 - 2
internal/modules/printer/service/service.go

@@ -2,6 +2,8 @@ package service
 
 import (
 	"fmt"
+	"os"
+	"os/exec"
 	"time"
 	"wails-app/internal/dao"
 	"wails-app/internal/global"
@@ -34,6 +36,9 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
 		if err != nil {
 			return fmt.Errorf("加载 CSN DLL 失败: %w (path=%s)", err, sdkDllPath)
 		}
+		// 枚举初始化(C# Demo 在 initForm() 中调用,可能是必要的初始化步骤)
+		Csn_EnumUSB()
+		Csn_EnumPRN()
 		// 尝试 OpenUSB → OpenPRN
 		name := printer.PortName
 		if name == "USB" || name == "auto" || name == "" {
@@ -55,7 +60,7 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
 	slipNo := fmt.Sprintf("%d", ticketID)
 
 	if useCSN {
-		// 用 WriteData 直发 ESC/POS 字节(绕过高阶函数兼容性问题)
+		// 构造 ESC/POS 数据 → 写成临时文件 → 调 32 位辅助工具打印
 		var buf []byte
 		add := func(b []byte) { buf = append(buf, b...) }
 		add(InitCmd); add(AlignCenterCmd); add(DoubleHeightCmd); add(BoldOnCmd)
@@ -79,7 +84,16 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
 		add(ESCPOS_Text("NEW THE CANADIA BANK APP"))
 		add(InitCmd); add(ESCPOS_Text("")); add(ESCPOS_Text("")); add(ESCPOS_Text(""))
 		add(CutPaperCmd)
-		Csn_WriteData(buf)
+		// 先尝试 CSN DLL WriteData,失败则用 32 位辅助工具
+		n := Csn_WriteData(buf)
+		if n == 0 {
+			tmp, _ := os.CreateTemp("", "ticket_*.bin")
+			if tmp != nil {
+				tmp.Write(buf); tmp.Close()
+				exec.Command("build/bin/ticket-print.exe", printer.PortName, tmp.Name()).Run()
+				os.Remove(tmp.Name())
+			}
+		}
 		global.GVA_DB.Model(&printer).Update("status", "online")
 		return nil
 	}