瀏覽代碼

fix: EMD807适配——79.5mm纸宽/ESC i切纸/DC2 T自测/32字分割线

lq 1 月之前
父節點
當前提交
d9eabfa3e6
共有 2 個文件被更改,包括 31 次插入18 次删除
  1. 15 9
      internal/modules/printer/service/escpos.go
  2. 16 9
      internal/modules/printer/service/service.go

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

@@ -1,21 +1,27 @@
 package service
 
-// ESC/POS commands for 58mm thermal printer (EMD807 compatible)
+// ESC 指令集 for EMD807 (79.5mm 热敏打印机)
+// Font A = 12×24 dots, 每行 32 字符; Font B = 9×17 dots, 每行 42 字符
 
 const (
 	ESC = 0x1B
 	GS  = 0x1D
+	DC2 = 0x12 // 设备控制
 )
 
 var (
-	InitCmd       = []byte{ESC, '@'}        // 初始化打印机
-	AlignLeftCmd  = []byte{ESC, 'a', 0}     // 左对齐
-	AlignCenterCmd = []byte{ESC, 'a', 1}    // 居中对齐
-	CutPaperCmd   = []byte{GS, 'V', 66, 0}  // 切纸
-	DoubleHeightCmd = []byte{ESC, '!', 0x11} // 双倍高度
-	NormalCmd     = []byte{ESC, '!', 0x00}   // 正常大小
-	BoldOnCmd     = []byte{ESC, 'E', 1}      // 加粗
-	BoldOffCmd    = []byte{ESC, 'E', 0}      // 取消加粗
+	InitCmd        = []byte{ESC, '@'}                   // 初始化打印机
+	SelfTestCmd    = []byte{DC2, 'T'}                   // DC2 T — 打印自测页
+	AlignLeftCmd   = []byte{ESC, 'a', 0}                // 左对齐
+	AlignCenterCmd = []byte{ESC, 'a', 1}                // 居中对齐
+	CutPaperCmd    = []byte{ESC, 'i'}                   // ESC i — EMD807 全切纸
+	HalfCutCmd     = []byte{ESC, 'm'}                   // ESC m — 半切(留一点连接)
+	DoubleHeightCmd = []byte{ESC, '!', 0x11}            // 双倍高度+宽度
+	NormalCmd      = []byte{ESC, '!', 0x00}             // 正常大小
+	BoldOnCmd      = []byte{ESC, 'E', 1}                // 加粗
+	BoldOffCmd     = []byte{ESC, 'E', 0}                // 取消加粗
+	FontBCmd       = []byte{ESC, 'M', 1}                // Font B (9×17, 42 chars/line)
+	PaperStatusCmd = []byte{ESC, 'v'}                   // 查询纸张状态
 )
 
 // ESCPOS_Text 打印一行文字(自动加换行符)

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

@@ -42,7 +42,10 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
 	now := time.Now().Format("02-01-2006 15:04:05")
 	slipNo := fmt.Sprintf("%d", ticketID)
 
-	// Print ticket
+	// ── 打印入场小票 (79.5mm纸, Font A 32字/行) ──
+	// 顶部分割线
+	line32 := "================================" // 32 chars
+
 	write(InitCmd)
 	write(AlignCenterCmd)
 	write(DoubleHeightCmd)
@@ -52,13 +55,17 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
 	write(NormalCmd)
 	write(ESCPOS_Text(""))
 	write(ESCPOS_Text(lotName))
+	if len(lotName) > 32 {
+		write(FontBCmd) // 长名称切 Font B 小字体
+		write(AlignCenterCmd)
+		write(ESCPOS_Text(lotName))
+		write(NormalCmd)
+	}
 	write(ESCPOS_Text("A-General Car"))
 	write(ESCPOS_Text(""))
-	write(BoldOnCmd)
 	write(ESCPOS_Text("PARK AT YOUR OWN RISK"))
-	write(BoldOffCmd)
+	write(ESCPOS_Text(line32))
 
-	write(InitCmd)
 	write(AlignLeftCmd)
 	write(ESCPOS_Text("In-Time::" + now))
 	if channelCode != "" {
@@ -67,14 +74,12 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
 	if plateNo != "" {
 		write(ESCPOS_Text("Veh No::" + plateNo))
 	}
-
-	write(InitCmd)
-	write(ESCPOS_Text(""))
+	write(ESCPOS_Text(line32))
 	write(ESCPOS_Text("Slip No::" + slipNo))
+	write(ESCPOS_Text(line32))
 
-	write(InitCmd)
 	write(AlignCenterCmd)
-	write(ESCPOS_Text(""))
+	write(ESCPOS_Text("")) // 空行:二维码前留白
 	write(ESCPOS_QRCode(ticketNo))
 	write(ESCPOS_Text(""))
 
@@ -82,9 +87,11 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
 	write(ESCPOS_Text("SCAN AND PAY WITH"))
 	write(ESCPOS_Text("NEW THE CANADIA BANK APP"))
 
+	// 纸尾留白 + 切纸
 	write(InitCmd)
 	write(ESCPOS_Text(""))
 	write(ESCPOS_Text(""))
+	write(ESCPOS_Text(""))
 	write(CutPaperCmd)
 
 	global.GVA_DB.Model(&printer).Update("status", "online")