service.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 {
  10. return &PrintService{}
  11. }
  12. // PrintTicket 打印入场小票
  13. func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo string, ticketID uint, ticketNo string) error {
  14. var printer dao.Printer
  15. if err := global.GVA_DB.First(&printer, printerID).Error; err != nil {
  16. return fmt.Errorf("打印机未配置: id=%d", printerID)
  17. }
  18. // 根据 port_name 判断连接类型
  19. var err error
  20. var srl *SerialPrinter
  21. write := func(data []byte) {}
  22. if len(printer.PortName) >= 3 && printer.PortName[:3] == "COM" {
  23. srl, err = NewSerialPrinter(printer.PortName, printer.BaudRate)
  24. if err == nil { defer srl.Close(); write = func(data []byte) { srl.Write(data) } }
  25. } else {
  26. // USB/Windows 打印机 → COPY /B 到共享路径
  27. write = func(data []byte) {
  28. err = copyToPrinter(printer.Name, data)
  29. }
  30. }
  31. if err != nil {
  32. global.GVA_DB.Model(&printer).Update("status", "offline")
  33. return fmt.Errorf("连接打印机失败: %w", err)
  34. }
  35. now := time.Now().Format("02-01-2006 15:04:05")
  36. slipNo := fmt.Sprintf("%d", ticketID)
  37. // ── 打印入场小票 (79.5mm纸, Font A 32字/行) ──
  38. // 顶部分割线
  39. line32 := "================================" // 32 chars
  40. write(InitCmd)
  41. write(AlignCenterCmd)
  42. write(DoubleHeightCmd)
  43. write(BoldOnCmd)
  44. write(ESCPOS_Text("PARKING TICKET"))
  45. write(BoldOffCmd)
  46. write(NormalCmd)
  47. write(ESCPOS_Text(""))
  48. write(ESCPOS_Text(lotName))
  49. if len(lotName) > 32 {
  50. write(FontBCmd) // 长名称切 Font B 小字体
  51. write(AlignCenterCmd)
  52. write(ESCPOS_Text(lotName))
  53. write(NormalCmd)
  54. }
  55. write(ESCPOS_Text("A-General Car"))
  56. write(ESCPOS_Text(""))
  57. write(ESCPOS_Text("PARK AT YOUR OWN RISK"))
  58. write(ESCPOS_Text(line32))
  59. write(AlignLeftCmd)
  60. write(ESCPOS_Text("In-Time::" + now))
  61. if channelCode != "" {
  62. write(ESCPOS_Text("InGate::" + channelCode))
  63. }
  64. if plateNo != "" {
  65. write(ESCPOS_Text("Veh No::" + plateNo))
  66. }
  67. write(ESCPOS_Text(line32))
  68. write(ESCPOS_Text("Slip No::" + slipNo))
  69. write(ESCPOS_Text(line32))
  70. write(AlignCenterCmd)
  71. write(ESCPOS_Text("")) // 空行:二维码前留白
  72. write(ESCPOS_QRCode(ticketNo))
  73. write(ESCPOS_Text(""))
  74. write(AlignCenterCmd)
  75. write(ESCPOS_Text("SCAN AND PAY WITH"))
  76. write(ESCPOS_Text("NEW THE CANADIA BANK APP"))
  77. // 纸尾留白 + 切纸
  78. write(InitCmd)
  79. write(ESCPOS_Text(""))
  80. write(ESCPOS_Text(""))
  81. write(ESCPOS_Text(""))
  82. write(CutPaperCmd)
  83. global.GVA_DB.Model(&printer).Update("status", "online")
  84. return nil
  85. }