service.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package service
  2. import (
  3. "fmt"
  4. "time"
  5. "wails-app/internal/dao"
  6. "wails-app/internal/global"
  7. )
  8. const sdkDllPath = `D:\lq\资料\停车场 道闸 车牌识别 收费机\票机自制\打印机\EMD807嵌入式热敏票据打印模组\5、SDK指令集\Win_SDK_Demo_2023_08_14\Win_SDK_Demo_2023_08_14\lib\x64\CsnPrinterLibs.dll`
  9. type PrintService struct{}
  10. func NewPrintService() *PrintService { return &PrintService{} }
  11. func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo string, ticketID uint, ticketNo string) error {
  12. var printer dao.Printer
  13. if err := global.GVA_DB.First(&printer, printerID).Error; err != nil {
  14. return fmt.Errorf("打印机未配置: id=%d", printerID)
  15. }
  16. var err error
  17. var srl *SerialPrinter
  18. var usbHandle uintptr
  19. useCSN := false
  20. if len(printer.PortName) >= 3 && printer.PortName[:3] == "COM" {
  21. srl, err = NewSerialPrinter(printer.PortName, printer.BaudRate)
  22. if err == nil {
  23. defer srl.Close()
  24. }
  25. } else {
  26. // USB → CSN SDK 直连
  27. err = InitCSN(sdkDllPath)
  28. if err != nil {
  29. return fmt.Errorf("加载 CSN DLL 失败: %w", err)
  30. }
  31. Csn_EnumUSB() // USB 子系统初始化
  32. Csn_EnumPRN()
  33. name := printer.PortName
  34. usbHandle, err = csn_OpenUSB(name)
  35. if err != nil {
  36. usbHandle, err = csn_OpenPRN(name)
  37. }
  38. if err != nil {
  39. return fmt.Errorf("打开打印机失败: %w (name=%s)", err, name)
  40. }
  41. useCSN = true
  42. csn_SetPort(usbHandle)
  43. defer csn_Close(usbHandle)
  44. }
  45. now := time.Now().Format("02-01-2006 15:04:05")
  46. slipNo := fmt.Sprintf("%d", ticketID)
  47. if useCSN {
  48. // ESC/POS → WriteData 直发
  49. var buf []byte
  50. add := func(b []byte) { buf = append(buf, b...) }
  51. add(InitCmd); add(AlignCenterCmd); add(DoubleHeightCmd); add(BoldOnCmd)
  52. add(ESCPOS_Text("PARKING TICKET"))
  53. add(BoldOffCmd); add(NormalCmd)
  54. add(ESCPOS_Text("")); add(ESCPOS_Text(lotName))
  55. add(ESCPOS_Text("A-General Car")); add(ESCPOS_Text(""))
  56. add(ESCPOS_Text("PARK AT YOUR OWN RISK"))
  57. add(ESCPOS_Text("================================"))
  58. add(AlignLeftCmd)
  59. add(ESCPOS_Text("In-Time::" + now))
  60. if channelCode != "" { add(ESCPOS_Text("InGate::" + channelCode)) }
  61. if plateNo != "" { add(ESCPOS_Text("Veh No::" + plateNo)) }
  62. add(ESCPOS_Text("================================"))
  63. add(ESCPOS_Text("Slip No::" + slipNo))
  64. add(ESCPOS_Text("================================"))
  65. add(AlignCenterCmd); add(ESCPOS_Text(""))
  66. add(ESCPOS_QRCode(ticketNo))
  67. add(ESCPOS_Text(""))
  68. add(ESCPOS_Text("SCAN AND PAY WITH"))
  69. add(ESCPOS_Text("NEW THE CANADIA BANK APP"))
  70. add(InitCmd); add(ESCPOS_Text("")); add(ESCPOS_Text("")); add(ESCPOS_Text(""))
  71. add(CutPaperCmd)
  72. Csn_WriteData(buf)
  73. global.GVA_DB.Model(&printer).Update("status", "online")
  74. return nil
  75. }
  76. // 串口模式
  77. write := func(data []byte) { srl.Write(data) }
  78. line32 := "================================"
  79. write(InitCmd); write(AlignCenterCmd); write(DoubleHeightCmd); write(BoldOnCmd)
  80. write(ESCPOS_Text("PARKING TICKET"))
  81. write(BoldOffCmd); write(NormalCmd)
  82. write(ESCPOS_Text("")); write(ESCPOS_Text(lotName))
  83. write(ESCPOS_Text("A-General Car")); write(ESCPOS_Text(""))
  84. write(ESCPOS_Text("PARK AT YOUR OWN RISK")); write(ESCPOS_Text(line32))
  85. write(AlignLeftCmd)
  86. write(ESCPOS_Text("In-Time::" + now))
  87. if channelCode != "" { write(ESCPOS_Text("InGate::" + channelCode)) }
  88. if plateNo != "" { write(ESCPOS_Text("Veh No::" + plateNo)) }
  89. write(ESCPOS_Text(line32)); write(ESCPOS_Text("Slip No::" + slipNo)); write(ESCPOS_Text(line32))
  90. write(AlignCenterCmd); write(ESCPOS_Text(""))
  91. write(ESCPOS_QRCode(ticketNo)); write(ESCPOS_Text(""))
  92. write(AlignCenterCmd)
  93. write(ESCPOS_Text("SCAN AND PAY WITH"))
  94. write(ESCPOS_Text("NEW THE CANADIA BANK APP"))
  95. write(InitCmd); write(ESCPOS_Text("")); write(ESCPOS_Text("")); write(ESCPOS_Text(""))
  96. write(CutPaperCmd)
  97. global.GVA_DB.Model(&printer).Update("status", "online")
  98. return nil
  99. }