Pārlūkot izejas kodu

fix: COPY /B到打印机共享——先COPY后WritePrinter回退

lq 1 mēnesi atpakaļ
vecāks
revīzija
2e02a6dfe0

+ 36 - 1
internal/modules/printer/service/serial.go

@@ -3,6 +3,7 @@ package service
 import (
 	"fmt"
 	"os"
+	"os/exec"
 	"syscall"
 	"unsafe"
 
@@ -97,4 +98,38 @@ func PrintRaw(printerName string, data []byte) error {
 	return nil
 }
 
-var _ = os.Stderr // keep import
+// copyToPrinter 通过临时文件 + COPY /B 到打印机共享发送 RAW 数据
+func copyToPrinter(printerName string, data []byte) error {
+	tmpFile, err := os.CreateTemp("", "tkt_*.bin")
+	if err != nil {
+		return err
+	}
+	tmpPath := tmpFile.Name()
+	defer os.Remove(tmpPath)
+	if _, err := tmpFile.Write(data); err != nil {
+		tmpFile.Close()
+		return err
+	}
+	tmpFile.Close()
+
+	// 尝试 COPY /B file \\127.0.0.1\share_name
+	// 先查共享名
+	shareName := printerName
+	for _, path := range []string{
+		fmt.Sprintf("\\\\127.0.0.1\\%s", shareName),
+		fmt.Sprintf("\\\\localhost\\%s", shareName),
+	} {
+		cmd := exec.Command("cmd", "/C", "copy", "/B", tmpPath, path)
+		output, err := cmd.CombinedOutput()
+		if err == nil {
+			return nil
+		}
+		// 打印失败,尝试下一个
+		_ = output
+	}
+
+	// 最后回退 WritePrinter API
+	return PrintRaw(printerName, data)
+}
+
+var _ = os.Stderr

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

@@ -29,8 +29,10 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
 		srl, err = NewSerialPrinter(printer.PortName, printer.BaudRate)
 		if err == nil { defer srl.Close(); write = func(data []byte) { srl.Write(data) } }
 	} else {
-		// USB/Windows 打印机 → WritePrinter API (RAW)
-		write = func(data []byte) { err = PrintRaw(printer.Name, data) }
+		// USB/Windows 打印机 → COPY /B 到共享路径
+		write = func(data []byte) {
+			err = copyToPrinter(printer.Name, data)
+		}
 	}
 	if err != nil {
 		global.GVA_DB.Model(&printer).Update("status", "offline")