瀏覽代碼

fix: CSN模式改用WriteData直发ESC/POS字节——绕过高阶函数

lq 1 月之前
父節點
當前提交
d7afaeee10
共有 2 個文件被更改,包括 35 次插入24 次删除
  1. 10 0
      internal/modules/printer/service/csn_dll.go
  2. 25 24
      internal/modules/printer/service/service.go

+ 10 - 0
internal/modules/printer/service/csn_dll.go

@@ -107,6 +107,16 @@ func csn_FullCut() {
 	}
 }
 
+// WriteData 直接发送 RAW 字节到当前激活的打印机端口
+func Csn_WriteData(data []byte) int {
+	if csnDll == nil { return 0 }
+	ret, _, _ := csnDll.NewProc("WriteData").Call(
+		uintptr(unsafe.Pointer(&data[0])),
+		uintptr(len(data)),
+		3000) // timeout 3s
+	return int(ret)
+}
+
 func csn_Text(text string, widthTimes, heightTimes, fontType, fontStyle int) {
 	if csnDll == nil {
 		return

+ 25 - 24
internal/modules/printer/service/service.go

@@ -55,30 +55,31 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
 	slipNo := fmt.Sprintf("%d", ticketID)
 
 	if useCSN {
-		csn_Reset()
-		csn_Align(1)
-		csn_Text("PARKING TICKET", 2, 2, 0, 0)
-		csn_Text("", 1, 1, 0, 0)
-		csn_Text(lotName, 1, 1, 0, 0)
-		csn_Text("A-General Car", 1, 1, 0, 0)
-		csn_Text("", 1, 1, 0, 0)
-		csn_Text("PARK AT YOUR OWN RISK", 1, 1, 0, 1)
-		csn_Text("================================", 1, 1, 0, 0)
-		csn_Align(0)
-		csn_Text("In-Time::"+now, 1, 1, 0, 0)
-		if channelCode != "" { csn_Text("InGate::"+channelCode, 1, 1, 0, 0) }
-		if plateNo != "" { csn_Text("Veh No::"+plateNo, 1, 1, 0, 0) }
-		csn_Text("================================", 1, 1, 0, 0)
-		csn_Text("Slip No::"+slipNo, 1, 1, 0, 0)
-		csn_Text("================================", 1, 1, 0, 0)
-		csn_Align(1)
-		csn_FeedLine()
-		csn_QRCode(ticketNo, 4)
-		csn_FeedLine()
-		csn_Text("SCAN AND PAY WITH", 1, 1, 0, 0)
-		csn_Text("NEW THE CANADIA BANK APP", 1, 1, 0, 0)
-		csn_FeedLines(3)
-		csn_FullCut()
+		// 用 WriteData 直发 ESC/POS 字节(绕过高阶函数兼容性问题)
+		var buf []byte
+		add := func(b []byte) { buf = append(buf, b...) }
+		add(InitCmd); add(AlignCenterCmd); add(DoubleHeightCmd); add(BoldOnCmd)
+		add(ESCPOS_Text("PARKING TICKET"))
+		add(BoldOffCmd); add(NormalCmd)
+		add(ESCPOS_Text("")); add(ESCPOS_Text(lotName))
+		add(ESCPOS_Text("A-General Car")); add(ESCPOS_Text(""))
+		add(ESCPOS_Text("PARK AT YOUR OWN RISK"))
+		add(ESCPOS_Text("================================"))
+		add(AlignLeftCmd)
+		add(ESCPOS_Text("In-Time::"+now))
+		if channelCode != "" { add(ESCPOS_Text("InGate::"+channelCode)) }
+		if plateNo != "" { add(ESCPOS_Text("Veh No::"+plateNo)) }
+		add(ESCPOS_Text("================================"))
+		add(ESCPOS_Text("Slip No::"+slipNo))
+		add(ESCPOS_Text("================================"))
+		add(AlignCenterCmd); add(ESCPOS_Text(""))
+		add(ESCPOS_QRCode(ticketNo))
+		add(ESCPOS_Text(""))
+		add(ESCPOS_Text("SCAN AND PAY WITH"))
+		add(ESCPOS_Text("NEW THE CANADIA BANK APP"))
+		add(InitCmd); add(ESCPOS_Text("")); add(ESCPOS_Text("")); add(ESCPOS_Text(""))
+		add(CutPaperCmd)
+		Csn_WriteData(buf)
 		global.GVA_DB.Model(&printer).Update("status", "online")
 		return nil
 	}