service.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package service
  2. import (
  3. "fmt"
  4. "time"
  5. "wails-app/internal/dao"
  6. "wails-app/internal/global"
  7. )
  8. // EMD807 CSN SDK DLL 路径 (x64)
  9. const sdkDllPath = `D:\lq\资料\停车场 道闸 车牌识别 收费机\票机自制\打印机\EMD807嵌入式热敏票据打印模组\5、SDK指令集\Win_SDK_Demo_2023_08_14\Win_SDK_Demo_2023_08_14\lib\x64\CsnPrinterLibs.dll`
  10. type PrintService struct{}
  11. func NewPrintService() *PrintService {
  12. return &PrintService{}
  13. }
  14. // PrintTicket 打印入场小票
  15. func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo string, ticketID uint, ticketNo string) error {
  16. var printer dao.Printer
  17. if err := global.GVA_DB.First(&printer, printerID).Error; err != nil {
  18. return fmt.Errorf("打印机未配置: id=%d", printerID)
  19. }
  20. // 根据 port_name 判断连接类型
  21. var err error
  22. var srl *SerialPrinter
  23. var usbHandle uintptr
  24. useCSN := false
  25. if len(printer.PortName) >= 3 && printer.PortName[:3] == "COM" {
  26. srl, err = NewSerialPrinter(printer.PortName, printer.BaudRate)
  27. if err == nil {
  28. defer srl.Close()
  29. }
  30. } else {
  31. // USB → 使用 CSN SDK 直连
  32. err = initCSN(sdkDllPath)
  33. if err == nil {
  34. name := printer.PortName
  35. // 如果配置的是 "USB" 或 "auto",自动枚举
  36. if name == "USB" || name == "auto" || name == "" {
  37. name = csn_EnumUSB()
  38. if name == "" {
  39. name = printer.PortName
  40. }
  41. }
  42. usbHandle, err = csn_OpenUSB(name)
  43. if err == nil {
  44. useCSN = true
  45. defer csn_Close(usbHandle)
  46. }
  47. }
  48. if !useCSN {
  49. err = fmt.Errorf("无法连接打印机: %s", printer.PortName)
  50. }
  51. }
  52. if err != nil {
  53. global.GVA_DB.Model(&printer).Update("status", "offline")
  54. return fmt.Errorf("连接打印机失败: %w", err)
  55. }
  56. now := time.Now().Format("02-01-2006 15:04:05")
  57. slipNo := fmt.Sprintf("%d", ticketID)
  58. // ── CSN SDK 模式 ──
  59. if useCSN {
  60. csn_Reset()
  61. csn_Align(1) // 居中
  62. csn_Text("PARKING TICKET", 2, 2, 0, 0)
  63. csn_Text("", 1, 1, 0, 0)
  64. csn_Text(lotName, 1, 1, 0, 0)
  65. csn_Text("A-General Car", 1, 1, 0, 0)
  66. csn_Text("", 1, 1, 0, 0)
  67. csn_Text("PARK AT YOUR OWN RISK", 1, 1, 0, 1)
  68. csn_Text("================================", 1, 1, 0, 0)
  69. csn_Align(0) // 左对齐
  70. csn_Text("In-Time::"+now, 1, 1, 0, 0)
  71. if channelCode != "" {
  72. csn_Text("InGate::"+channelCode, 1, 1, 0, 0)
  73. }
  74. if plateNo != "" {
  75. csn_Text("Veh No::"+plateNo, 1, 1, 0, 0)
  76. }
  77. csn_Text("================================", 1, 1, 0, 0)
  78. csn_Text("Slip No::"+slipNo, 1, 1, 0, 0)
  79. csn_Text("================================", 1, 1, 0, 0)
  80. csn_Align(1) // 居中
  81. csn_FeedLine()
  82. csn_QRCode(ticketNo, 4)
  83. csn_FeedLine()
  84. csn_Text("SCAN AND PAY WITH", 1, 1, 0, 0)
  85. csn_Text("NEW THE CANADIA BANK APP", 1, 1, 0, 0)
  86. csn_FeedLines(3)
  87. csn_FullCut()
  88. global.GVA_DB.Model(&printer).Update("status", "online")
  89. return nil
  90. }
  91. // ── 串口模式(原有 ESC/POS)──
  92. write := func(data []byte) { srl.Write(data) }
  93. line32 := "================================"
  94. write(InitCmd)
  95. write(AlignCenterCmd)
  96. write(DoubleHeightCmd)
  97. write(BoldOnCmd)
  98. write(ESCPOS_Text("PARKING TICKET"))
  99. write(BoldOffCmd)
  100. write(NormalCmd)
  101. write(ESCPOS_Text(""))
  102. write(ESCPOS_Text(lotName))
  103. if len(lotName) > 32 {
  104. write(FontBCmd)
  105. write(AlignCenterCmd)
  106. write(ESCPOS_Text(lotName))
  107. write(NormalCmd)
  108. }
  109. write(ESCPOS_Text("A-General Car"))
  110. write(ESCPOS_Text(""))
  111. write(ESCPOS_Text("PARK AT YOUR OWN RISK"))
  112. write(ESCPOS_Text(line32))
  113. write(AlignLeftCmd)
  114. write(ESCPOS_Text("In-Time::" + now))
  115. if channelCode != "" {
  116. write(ESCPOS_Text("InGate::" + channelCode))
  117. }
  118. if plateNo != "" {
  119. write(ESCPOS_Text("Veh No::" + plateNo))
  120. }
  121. write(ESCPOS_Text(line32))
  122. write(ESCPOS_Text("Slip No::" + slipNo))
  123. write(ESCPOS_Text(line32))
  124. write(AlignCenterCmd)
  125. write(ESCPOS_Text(""))
  126. write(ESCPOS_QRCode(ticketNo))
  127. write(ESCPOS_Text(""))
  128. write(AlignCenterCmd)
  129. write(ESCPOS_Text("SCAN AND PAY WITH"))
  130. write(ESCPOS_Text("NEW THE CANADIA BANK APP"))
  131. write(InitCmd)
  132. write(ESCPOS_Text(""))
  133. write(ESCPOS_Text(""))
  134. write(ESCPOS_Text(""))
  135. write(CutPaperCmd)
  136. global.GVA_DB.Model(&printer).Update("status", "online")
  137. return nil
  138. }