|
@@ -2,8 +2,6 @@ package service
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"fmt"
|
|
"fmt"
|
|
|
- "os"
|
|
|
|
|
- "os/exec"
|
|
|
|
|
"time"
|
|
"time"
|
|
|
"wails-app/internal/dao"
|
|
"wails-app/internal/dao"
|
|
|
"wails-app/internal/global"
|
|
"wails-app/internal/global"
|
|
@@ -32,18 +30,14 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
defer srl.Close()
|
|
defer srl.Close()
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
|
|
|
+ // USB → CSN SDK 直连
|
|
|
err = InitCSN(sdkDllPath)
|
|
err = InitCSN(sdkDllPath)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
- return fmt.Errorf("加载 CSN DLL 失败: %w (path=%s)", err, sdkDllPath)
|
|
|
|
|
|
|
+ return fmt.Errorf("加载 CSN DLL 失败: %w", err)
|
|
|
}
|
|
}
|
|
|
- // 枚举初始化(C# Demo 在 initForm() 中调用,可能是必要的初始化步骤)
|
|
|
|
|
- Csn_EnumUSB()
|
|
|
|
|
|
|
+ Csn_EnumUSB() // USB 子系统初始化
|
|
|
Csn_EnumPRN()
|
|
Csn_EnumPRN()
|
|
|
- // 尝试 OpenUSB → OpenPRN
|
|
|
|
|
name := printer.PortName
|
|
name := printer.PortName
|
|
|
- if name == "USB" || name == "auto" || name == "" {
|
|
|
|
|
- name = Csn_EnumUSB()
|
|
|
|
|
- }
|
|
|
|
|
usbHandle, err = csn_OpenUSB(name)
|
|
usbHandle, err = csn_OpenUSB(name)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
usbHandle, err = csn_OpenPRN(name)
|
|
usbHandle, err = csn_OpenPRN(name)
|
|
@@ -52,7 +46,7 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
return fmt.Errorf("打开打印机失败: %w (name=%s)", err, name)
|
|
return fmt.Errorf("打开打印机失败: %w (name=%s)", err, name)
|
|
|
}
|
|
}
|
|
|
useCSN = true
|
|
useCSN = true
|
|
|
- csn_SetPort(usbHandle) // 激活端口!
|
|
|
|
|
|
|
+ csn_SetPort(usbHandle)
|
|
|
defer csn_Close(usbHandle)
|
|
defer csn_Close(usbHandle)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -60,7 +54,7 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
slipNo := fmt.Sprintf("%d", ticketID)
|
|
slipNo := fmt.Sprintf("%d", ticketID)
|
|
|
|
|
|
|
|
if useCSN {
|
|
if useCSN {
|
|
|
- // 构造 ESC/POS 数据 → 写成临时文件 → 调 32 位辅助工具打印
|
|
|
|
|
|
|
+ // ESC/POS → WriteData 直发
|
|
|
var buf []byte
|
|
var buf []byte
|
|
|
add := func(b []byte) { buf = append(buf, b...) }
|
|
add := func(b []byte) { buf = append(buf, b...) }
|
|
|
add(InitCmd); add(AlignCenterCmd); add(DoubleHeightCmd); add(BoldOnCmd)
|
|
add(InitCmd); add(AlignCenterCmd); add(DoubleHeightCmd); add(BoldOnCmd)
|
|
@@ -71,11 +65,11 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
add(ESCPOS_Text("PARK AT YOUR OWN RISK"))
|
|
add(ESCPOS_Text("PARK AT YOUR OWN RISK"))
|
|
|
add(ESCPOS_Text("================================"))
|
|
add(ESCPOS_Text("================================"))
|
|
|
add(AlignLeftCmd)
|
|
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("In-Time::" + now))
|
|
|
|
|
+ if channelCode != "" { add(ESCPOS_Text("InGate::" + channelCode)) }
|
|
|
|
|
+ if plateNo != "" { add(ESCPOS_Text("Veh No::" + plateNo)) }
|
|
|
add(ESCPOS_Text("================================"))
|
|
add(ESCPOS_Text("================================"))
|
|
|
- add(ESCPOS_Text("Slip No::"+slipNo))
|
|
|
|
|
|
|
+ add(ESCPOS_Text("Slip No::" + slipNo))
|
|
|
add(ESCPOS_Text("================================"))
|
|
add(ESCPOS_Text("================================"))
|
|
|
add(AlignCenterCmd); add(ESCPOS_Text(""))
|
|
add(AlignCenterCmd); add(ESCPOS_Text(""))
|
|
|
add(ESCPOS_QRCode(ticketNo))
|
|
add(ESCPOS_QRCode(ticketNo))
|
|
@@ -84,21 +78,12 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
add(ESCPOS_Text("NEW THE CANADIA BANK APP"))
|
|
add(ESCPOS_Text("NEW THE CANADIA BANK APP"))
|
|
|
add(InitCmd); add(ESCPOS_Text("")); add(ESCPOS_Text("")); add(ESCPOS_Text(""))
|
|
add(InitCmd); add(ESCPOS_Text("")); add(ESCPOS_Text("")); add(ESCPOS_Text(""))
|
|
|
add(CutPaperCmd)
|
|
add(CutPaperCmd)
|
|
|
- // 先尝试 CSN DLL WriteData,失败则用 32 位辅助工具
|
|
|
|
|
- n := Csn_WriteData(buf)
|
|
|
|
|
- if n == 0 {
|
|
|
|
|
- tmp, _ := os.CreateTemp("", "ticket_*.bin")
|
|
|
|
|
- if tmp != nil {
|
|
|
|
|
- tmp.Write(buf); tmp.Close()
|
|
|
|
|
- exec.Command("build/bin/ticket-print.exe", printer.PortName, tmp.Name()).Run()
|
|
|
|
|
- os.Remove(tmp.Name())
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ Csn_WriteData(buf)
|
|
|
global.GVA_DB.Model(&printer).Update("status", "online")
|
|
global.GVA_DB.Model(&printer).Update("status", "online")
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // Serial ESC/POS fallback
|
|
|
|
|
|
|
+ // 串口模式
|
|
|
write := func(data []byte) { srl.Write(data) }
|
|
write := func(data []byte) { srl.Write(data) }
|
|
|
line32 := "================================"
|
|
line32 := "================================"
|
|
|
write(InitCmd); write(AlignCenterCmd); write(DoubleHeightCmd); write(BoldOnCmd)
|
|
write(InitCmd); write(AlignCenterCmd); write(DoubleHeightCmd); write(BoldOnCmd)
|
|
@@ -108,10 +93,10 @@ func (s *PrintService) PrintTicket(printerID uint, lotName, channelCode, plateNo
|
|
|
write(ESCPOS_Text("A-General Car")); write(ESCPOS_Text(""))
|
|
write(ESCPOS_Text("A-General Car")); write(ESCPOS_Text(""))
|
|
|
write(ESCPOS_Text("PARK AT YOUR OWN RISK")); write(ESCPOS_Text(line32))
|
|
write(ESCPOS_Text("PARK AT YOUR OWN RISK")); write(ESCPOS_Text(line32))
|
|
|
write(AlignLeftCmd)
|
|
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(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(AlignCenterCmd); write(ESCPOS_Text(""))
|
|
|
write(ESCPOS_QRCode(ticketNo)); write(ESCPOS_Text(""))
|
|
write(ESCPOS_QRCode(ticketNo)); write(ESCPOS_Text(""))
|
|
|
write(AlignCenterCmd)
|
|
write(AlignCenterCmd)
|