|
|
@@ -7,6 +7,9 @@ import (
|
|
|
"wails-app/internal/global"
|
|
|
)
|
|
|
|
|
|
+// EMD807 CSN SDK DLL 路径 (x64)
|
|
|
+const sdkDllPath = `D:\lq\资料\停车场 道闸 车牌识别 收费机\票机自制\打印机\EMD807嵌入式热敏票据打印模组\5、SDK指令集\Win_SDK_Demo_2023_08_14\Win_SDK_Demo_2023_08_14\lib\x64\CsnPrinterLibs.dll`
|
|
|
+
|
|
|
type PrintService struct{}
|
|
|
|
|
|
func NewPrintService() *PrintService {
|
|
|
@@ -23,15 +26,34 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
// 根据 port_name 判断连接类型
|
|
|
var err error
|
|
|
var srl *SerialPrinter
|
|
|
- write := func(data []byte) {}
|
|
|
+ var usbHandle uintptr
|
|
|
+ useCSN := false
|
|
|
|
|
|
if len(printer.PortName) >= 3 && printer.PortName[:3] == "COM" {
|
|
|
srl, err = NewSerialPrinter(printer.PortName, printer.BaudRate)
|
|
|
- if err == nil { defer srl.Close(); write = func(data []byte) { srl.Write(data) } }
|
|
|
+ if err == nil {
|
|
|
+ defer srl.Close()
|
|
|
+ }
|
|
|
} else {
|
|
|
- // USB/Windows 打印机 → COPY /B 到共享路径
|
|
|
- write = func(data []byte) {
|
|
|
- err = copyToPrinter(printer.Name, data)
|
|
|
+ // USB → 使用 CSN SDK 直连
|
|
|
+ err = initCSN(sdkDllPath)
|
|
|
+ if err == nil {
|
|
|
+ name := printer.PortName
|
|
|
+ // 如果配置的是 "USB" 或 "auto",自动枚举
|
|
|
+ if name == "USB" || name == "auto" || name == "" {
|
|
|
+ name = csn_EnumUSB()
|
|
|
+ if name == "" {
|
|
|
+ name = printer.PortName
|
|
|
+ }
|
|
|
+ }
|
|
|
+ usbHandle, err = csn_OpenUSB(name)
|
|
|
+ if err == nil {
|
|
|
+ useCSN = true
|
|
|
+ defer csn_Close(usbHandle)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if !useCSN {
|
|
|
+ err = fmt.Errorf("无法连接打印机: %s", printer.PortName)
|
|
|
}
|
|
|
}
|
|
|
if err != nil {
|
|
|
@@ -42,9 +64,47 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
now := time.Now().Format("02-01-2006 15:04:05")
|
|
|
slipNo := fmt.Sprintf("%d", ticketID)
|
|
|
|
|
|
- // ── 打印入场小票 (79.5mm纸, Font A 32字/行) ──
|
|
|
- // 顶部分割线
|
|
|
- line32 := "================================" // 32 chars
|
|
|
+ // ── CSN SDK 模式 ──
|
|
|
+ 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()
|
|
|
+
|
|
|
+ global.GVA_DB.Model(&printer).Update("status", "online")
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ // ── 串口模式(原有 ESC/POS)──
|
|
|
+ write := func(data []byte) { srl.Write(data) }
|
|
|
+ line32 := "================================"
|
|
|
|
|
|
write(InitCmd)
|
|
|
write(AlignCenterCmd)
|
|
|
@@ -56,7 +116,7 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
write(ESCPOS_Text(""))
|
|
|
write(ESCPOS_Text(lotName))
|
|
|
if len(lotName) > 32 {
|
|
|
- write(FontBCmd) // 长名称切 Font B 小字体
|
|
|
+ write(FontBCmd)
|
|
|
write(AlignCenterCmd)
|
|
|
write(ESCPOS_Text(lotName))
|
|
|
write(NormalCmd)
|
|
|
@@ -65,7 +125,6 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
write(ESCPOS_Text(""))
|
|
|
write(ESCPOS_Text("PARK AT YOUR OWN RISK"))
|
|
|
write(ESCPOS_Text(line32))
|
|
|
-
|
|
|
write(AlignLeftCmd)
|
|
|
write(ESCPOS_Text("In-Time::" + now))
|
|
|
if channelCode != "" {
|
|
|
@@ -77,17 +136,13 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
write(ESCPOS_Text(line32))
|
|
|
write(ESCPOS_Text("Slip No::" + slipNo))
|
|
|
write(ESCPOS_Text(line32))
|
|
|
-
|
|
|
write(AlignCenterCmd)
|
|
|
- write(ESCPOS_Text("")) // 空行:二维码前留白
|
|
|
+ write(ESCPOS_Text(""))
|
|
|
write(ESCPOS_QRCode(ticketNo))
|
|
|
write(ESCPOS_Text(""))
|
|
|
-
|
|
|
write(AlignCenterCmd)
|
|
|
write(ESCPOS_Text("SCAN AND PAY WITH"))
|
|
|
write(ESCPOS_Text("NEW THE CANADIA BANK APP"))
|
|
|
-
|
|
|
- // 纸尾留白 + 切纸
|
|
|
write(InitCmd)
|
|
|
write(ESCPOS_Text(""))
|
|
|
write(ESCPOS_Text(""))
|