service.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package service
  2. import (
  3. "fmt"
  4. "time"
  5. "wails-app/internal/dao"
  6. "wails-app/internal/global"
  7. )
  8. type PrintService struct{}
  9. func NewPrintService() *PrintService { return &PrintService{} }
  10. type csnUSBDevice struct{}
  11. func (csnUSBDevice) Write(data []byte) int { return Csn_WriteData(data) }
  12. func (csnUSBDevice) FeedLines(n int) { csn_FeedLines(n) }
  13. func (csnUSBDevice) QRCode(data string, width int) bool { return csn_QRCode(data, width) }
  14. func (csnUSBDevice) FullCut() { csn_FullCut() }
  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. var err error
  21. var srl *SerialPrinter
  22. var usbHandle uintptr
  23. useCSN := false
  24. if len(printer.PortName) >= 3 && printer.PortName[:3] == "COM" {
  25. srl, err = NewSerialPrinter(printer.PortName, printer.BaudRate)
  26. if err == nil {
  27. defer srl.Close()
  28. }
  29. } else {
  30. // USB → CSN SDK 直连
  31. err = InitCSN(FindCsnDllPath())
  32. if err != nil {
  33. return fmt.Errorf("加载 CSN DLL 失败: %w", err)
  34. }
  35. Csn_EnumUSB()
  36. Csn_EnumPRN()
  37. name := printer.PortName
  38. usbHandle, err = Csn_OpenUSB(name)
  39. if err != nil {
  40. usbHandle, err = Csn_OpenPRN(name)
  41. }
  42. if err != nil {
  43. return fmt.Errorf("打开打印机失败: %w (name=%s)", err, name)
  44. }
  45. useCSN = true
  46. Csn_SetPort(usbHandle)
  47. defer csn_Close(usbHandle)
  48. }
  49. now := time.Now().Format("02-01-2006 15:04:05")
  50. slipNo := fmt.Sprintf("%d", ticketID)
  51. if useCSN {
  52. ops := buildUSBTicketLayout(usbTicketData{
  53. lotName: lotName, channelCode: channelCode, plateNo: plateNo,
  54. entryTime: now, slipNo: slipNo, ticketNo: ticketNo,
  55. })
  56. if err := executeUSBLayout(csnUSBDevice{}, ops); err != nil {
  57. return err
  58. }
  59. global.GVA_DB.Model(&printer).Update("status", "online")
  60. return nil
  61. }
  62. // === 串口模式 (保持不变) ===
  63. write := func(data []byte) { srl.Write(data) }
  64. line32 := "================================"
  65. write(InitCmd)
  66. write(AlignCenterCmd)
  67. write(DoubleHeightCmd)
  68. write(BoldOnCmd)
  69. write(ESCPOS_Text("PARKING TICKET"))
  70. write(BoldOffCmd)
  71. write(NormalCmd)
  72. write(ESCPOS_Text(""))
  73. write(ESCPOS_Text(lotName))
  74. write(ESCPOS_Text("A-General Car"))
  75. write(ESCPOS_Text(""))
  76. write(ESCPOS_Text("PARK AT YOUR OWN RISK"))
  77. write(ESCPOS_Text(line32))
  78. write(AlignLeftCmd)
  79. write(ESCPOS_Text("In-Time::" + now))
  80. if channelCode != "" {
  81. write(ESCPOS_Text("InGate::" + channelCode))
  82. }
  83. if plateNo != "" {
  84. write(ESCPOS_Text("Veh No::" + plateNo))
  85. }
  86. write(ESCPOS_Text(line32))
  87. write(ESCPOS_Text("Slip No::" + slipNo))
  88. write(ESCPOS_Text(line32))
  89. write(AlignCenterCmd)
  90. write(ESCPOS_Text(""))
  91. write(ESCPOS_QRCode(ticketNo))
  92. write(ESCPOS_Text(""))
  93. write(AlignCenterCmd)
  94. write(ESCPOS_Text("SCAN AND PAY WITH"))
  95. write(ESCPOS_Text("NEW THE CANADIA BANK APP"))
  96. write(InitCmd)
  97. write(ESCPOS_Text(""))
  98. write(ESCPOS_Text(""))
  99. write(ESCPOS_Text(""))
  100. write(CutPaperCmd)
  101. global.GVA_DB.Model(&printer).Update("status", "online")
  102. return nil
  103. }