package service import ( "fmt" "time" "wails-app/internal/dao" "wails-app/internal/global" ) 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 { return &PrintService{} } func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo string, ticketID uint, ticketNo string) error { var printer dao.Printer if err := global.GVA_DB.First(&printer, printerID).Error; err != nil { return fmt.Errorf("打印机未配置: id=%d", printerID) } var err error var srl *SerialPrinter 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() } } else { // USB → CSN SDK 直连 err = InitCSN(sdkDllPath) if err != nil { return fmt.Errorf("加载 CSN DLL 失败: %w", err) } Csn_EnumUSB() // USB 子系统初始化 Csn_EnumPRN() name := printer.PortName usbHandle, err = csn_OpenUSB(name) if err != nil { usbHandle, err = csn_OpenPRN(name) } if err != nil { return fmt.Errorf("打开打印机失败: %w (name=%s)", err, name) } useCSN = true csn_SetPort(usbHandle) defer csn_Close(usbHandle) } now := time.Now().Format("02-01-2006 15:04:05") slipNo := fmt.Sprintf("%d", ticketID) if useCSN { var buf []byte add := func(b []byte) { buf = append(buf, b...) } line := "--------------------------------" // 标题 add(InitCmd) add(AlignCenterCmd); add(DoubleHeightCmd); add(BoldOnCmd) add(ESCPOS_Text("PARKING TICKET")) add(BoldOffCmd); add(NormalCmd) add(ESCPOS_Text("")) // 停车场 add(ESCPOS_Text(lotName)) add(ESCPOS_Text("A-General Car")) add(ESCPOS_Text("")) // 风险提示 add(BoldOnCmd) add(ESCPOS_Text("PARK AT YOUR OWN RISK")) add(BoldOffCmd) add(ESCPOS_Text(line)) // 入场信息 add(AlignLeftCmd) add(ESCPOS_Text("In-Time::" + now)) if channelCode != "" { add(ESCPOS_Text("InGate::" + channelCode)) } if plateNo != "" { add(ESCPOS_Text("Veh No::" + plateNo)) } add(ESCPOS_Text(line)) add(ESCPOS_Text("Slip No::" + slipNo)) add(ESCPOS_Text(line)) // 二维码 add(ESCPOS_Text("")) add(AlignCenterCmd) add(ESCPOS_QRCode(ticketNo)) add(ESCPOS_Text("")) // 支付提示 add(ESCPOS_Text("SCAN AND PAY WITH")) add(ESCPOS_Text("NEW THE CANADIA BANK APP")) // 切纸 add(InitCmd) add(ESCPOS_Text("")); add(ESCPOS_Text("")); add(ESCPOS_Text("")) add(CutPaperCmd) Csn_WriteData(buf) global.GVA_DB.Model(&printer).Update("status", "online") return nil } // 串口模式 write := func(data []byte) { srl.Write(data) } line32 := "================================" write(InitCmd); write(AlignCenterCmd); write(DoubleHeightCmd); write(BoldOnCmd) write(ESCPOS_Text("PARKING TICKET")) write(BoldOffCmd); write(NormalCmd) write(ESCPOS_Text("")); write(ESCPOS_Text(lotName)) write(ESCPOS_Text("A-General Car")); 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 != "" { write(ESCPOS_Text("InGate::" + channelCode)) } if plateNo != "" { write(ESCPOS_Text("Veh No::" + plateNo)) } write(ESCPOS_Text(line32)); write(ESCPOS_Text("Slip No::" + slipNo)); write(ESCPOS_Text(line32)) write(AlignCenterCmd); 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("")); write(ESCPOS_Text("")) write(CutPaperCmd) global.GVA_DB.Model(&printer).Update("status", "online") return nil }