Sfoglia il codice sorgente

fix: EMD807二维码改用US Q指令+优化票面排版+分隔线

lq 1 mese fa
parent
commit
cfc3a485c0

+ 9 - 20
internal/modules/printer/service/escpos.go

@@ -22,6 +22,7 @@ var (
 	BoldOffCmd     = []byte{ESC, 'E', 0}                // 取消加粗
 	FontBCmd       = []byte{ESC, 'M', 1}                // Font B (9×17, 42 chars/line)
 	PaperStatusCmd = []byte{ESC, 'v'}                   // 查询纸张状态
+	FeedLineCmd    = []byte{0x0A}                        // 换行
 )
 
 // ESCPOS_Text 打印一行文字(自动加换行符)
@@ -29,27 +30,15 @@ func ESCPOS_Text(text string) []byte {
 	return append([]byte(text), '\n')
 }
 
-// ESCPOS_QRCode 打印二维码(GS ( k 指令,兼容 EMD807)
+// ESCPOS_QRCode 打印二维码(EMD807 使用 US Q 指令
 func ESCPOS_QRCode(data string) []byte {
-	// GS ( k pL pH cn fn [params]
-	// cn=49 (QR Code), fn=65 (model), fn=67 (size), fn=80 (store), fn=81 (print)
-
-	pL := byte(len(data) + 3)
-	pH := byte((len(data) + 3) >> 8)
-
-	cmd := []byte{GS, '('} // 模型选择
-
-	cmd = append(cmd, 0x04, 0x00, 0x31, 0x41, 0x32, 0x00) // QR Model 2
-	cmd = append(cmd, 0x03, 0x00, 0x31, 0x43, 0x08)         // Cell size 8
-
-	// Store data
-	cmd = append(cmd, GS, '(')
-	cmd = append(cmd, pL, pH, 0x31, 0x50, 0x30) // fn=80 store
+	// US Q n m <data> — EMD807 二维码指令
+	// n = len(data) + 3 (pL + pH + m)
+	// m = 0x31 (QR code)
+	n := byte(len(data) + 3)
+	cmd := []byte{0x1F, 'Q'} // US Q
+	cmd = append(cmd, n, 0x00) // pL, pH
+	cmd = append(cmd, 0x31)    // m = QR code
 	cmd = append(cmd, []byte(data)...)
-
-	// Print QR
-	cmd = append(cmd, GS, '(')
-	cmd = append(cmd, 0x03, 0x00, 0x31, 0x51, 0x30) // fn=81 print
-
 	return cmd
 }

+ 35 - 10
internal/modules/printer/service/service.go

@@ -54,30 +54,55 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
 	slipNo := fmt.Sprintf("%d", ticketID)
 
 	if useCSN {
-		// ESC/POS → WriteData 直发
 		var buf []byte
 		add := func(b []byte) { buf = append(buf, b...) }
-		add(InitCmd); add(AlignCenterCmd); add(DoubleHeightCmd); add(BoldOnCmd)
+		line := "--------------------------------" // 32 chars
+
+		// 标题
+		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(FeedLineCmd)
+
+		// 停车场信息
+		add(ESCPOS_Text(lotName))
+		add(ESCPOS_Text("A-General Car"))
+		add(FeedLineCmd)
+
+		// 风险提示
+		add(BoldOnCmd)
 		add(ESCPOS_Text("PARK AT YOUR OWN RISK"))
-		add(ESCPOS_Text("================================"))
+		add(BoldOffCmd)
+		add(ESCPOS_Text(line))
+
+		// 入场信息(左对齐)
 		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(line))
+
+		// 票号
 		add(ESCPOS_Text("Slip No::" + slipNo))
-		add(ESCPOS_Text("================================"))
-		add(AlignCenterCmd); add(ESCPOS_Text(""))
+		add(ESCPOS_Text(line))
+
+		// 二维码(居中)
+		add(FeedLineCmd)
+		add(AlignCenterCmd)
 		add(ESCPOS_QRCode(ticketNo))
-		add(ESCPOS_Text(""))
+		add(FeedLineCmd)
+
+		// 支付提示(居中)
+		add(AlignCenterCmd)
 		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(InitCmd)
+		add(FeedLineCmd); add(FeedLineCmd); add(FeedLineCmd)
 		add(CutPaperCmd)
+
 		Csn_WriteData(buf)
 		global.GVA_DB.Model(&printer).Update("status", "online")
 		return nil