250 lines
6.3 KiB
Go
250 lines
6.3 KiB
Go
package event
|
||
|
||
import (
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/globals"
|
||
"net"
|
||
"regexp"
|
||
"sync"
|
||
"time"
|
||
)
|
||
|
||
const (
|
||
heartText = "1e000f02000151"
|
||
printText = "1e00180200"
|
||
printSuccessText = "1e001802000150"
|
||
|
||
printErrWithoutPaper = "05"
|
||
|
||
printMsgAlreadySend = 2 //已经发出打印消息
|
||
printMsgSuccess = 1 //打印成功
|
||
printMsgWait = 0 //待打印
|
||
printMsgFail = -1 //打印失败(打印机报出)
|
||
printMsgErr = -2 //京西报出
|
||
printMsgAlreadyLoad = 3 //已放入队列
|
||
|
||
heartErrNormal = "00" //正常
|
||
heartErrWithoutPaper = "04" //心跳错,缺纸
|
||
heartErrHot = "08" //过热
|
||
|
||
printerStatusOnlineWithoutPaper = 2 //在线缺纸
|
||
printerStatusOnline = 1 //在线
|
||
printerStatusOffline = -1 //离线
|
||
)
|
||
|
||
//标签
|
||
const (
|
||
signBR = "<br>" //换行
|
||
signCenter = "<center>" //居中
|
||
signLeft = "<left>" //居左
|
||
signRight = "<right>" //居右
|
||
signBig = "<b>" //字体放大
|
||
signHighBig = "<hb>" //字体纵向放大
|
||
signWideBig = "<wb>" //字体横向放大
|
||
signQrCenter = "<qrc>" //二维码居中
|
||
signQrLeft = "<qrl>" //二维码居左
|
||
signQrRight = "<qrr>" //二维码居右
|
||
signSound = "<sound>" //声音
|
||
|
||
hexSignBROrEXE = "0a"
|
||
hexSignCenter = "1b6101"
|
||
hexSignLeft = "1b6100"
|
||
hexSignRight = "1b6102"
|
||
hexSignNormal = "1b2100"
|
||
hexSignBig = "1b2130"
|
||
hexSignHighBig = "1b2110"
|
||
hexSignWideBig = "1b2120"
|
||
hexSignQrCenter = "1d5802"
|
||
hexSignQrLeft = "1d5800"
|
||
hexSignQrRight = "1d5804"
|
||
hexSignQr = "1b5a000106" //"1b5a000106" 0600 : 后面二维码的字节数
|
||
hexSignQrEnd = "000a1b40" //000a0a0a1b40
|
||
hexSignSound = "1d6b40"
|
||
|
||
byteSignBR = "3c62723e" //换行
|
||
byteSignCenter = "3c63656e7465723e" //居中
|
||
byteSignLeft = "3c6c6566743e" //居左
|
||
byteSignRight = "3c72696768743e" //居右
|
||
byteSignBig = "3c623e" //字体放大
|
||
byteSignHighBig = "3c68623e" //字体纵向放大
|
||
byteSignWideBig = "3c77623e" //字体横向放大
|
||
byteSignQrCenter = "3c7172633e"
|
||
byteSignQrLeft = "3c71726c3e"
|
||
byteSignQrRight = "3c7172723e"
|
||
byteSignSound = "3c736f756e643e"
|
||
|
||
byteSignCenterE = "3c2f63656e7465723e" //居中
|
||
byteSignLeftE = "3c2f6c6566743e" //居左
|
||
byteSignRightE = "3c2f72696768743e" //居右
|
||
byteSignBigE = "3c2f623e" //字体放大
|
||
byteSignHighBigE = "3c2f68623e" //字体纵向放大
|
||
byteSignWideBigE = "3c2f77623e" //字体横向放大
|
||
byteSignQrCenterE = "3c2f7172633e"
|
||
byteSignQrLeftE = "3c2f71726c3e"
|
||
byteSignQrRightE = "3c2f7172723e"
|
||
byteSignSoundE = "3c2f736f756e643e"
|
||
)
|
||
|
||
var (
|
||
//t = &TcpClient{}
|
||
printErrMap = map[string]string{
|
||
printErrWithoutPaper: "打印机缺纸!",
|
||
}
|
||
|
||
signMap = map[string]string{
|
||
byteSignBR: hexSignBROrEXE,
|
||
}
|
||
|
||
regexpQrc = regexp.MustCompile(byteSignQrCenter + "(.*?)" + byteSignQrCenterE)
|
||
regexpQrl = regexp.MustCompile(byteSignQrLeft + "(.*?)" + byteSignQrLeftE)
|
||
regexpQrr = regexp.MustCompile(byteSignQrRight + "(.*?)" + byteSignQrRightE)
|
||
regexpSound = regexp.MustCompile(byteSignSound + "(.*?)" + byteSignSoundE)
|
||
|
||
//printMsgChan = make(chan *model.PrintMsg, 1024)
|
||
//printMsgCallbackMap = make(map[string]chan string, 1024)
|
||
//printMsgChanFail = make(chan *model.PrintMsg, 1024)
|
||
timeoutChan = make(chan int, 10)
|
||
)
|
||
|
||
type PrintInfo struct {
|
||
C net.Conn
|
||
Status int // 2 //在线缺纸 1 //在线 -1 //离线
|
||
StatusTime time.Time
|
||
}
|
||
|
||
//连接的客户端,吧每个客户端都放进来
|
||
type TcpClient struct {
|
||
Clients map[string]*PrintInfo //放tcp连接的,printNo 为key
|
||
MsgMap map[string]chan *model.PrintMsg //放打印信息的,printNo为key
|
||
CallBackMap map[string]chan string //放打印信息回调信息的,printNo为key
|
||
*sync.RWMutex
|
||
}
|
||
|
||
type GetPrintStatus struct {
|
||
PrintNo string //打印机编号
|
||
AppID int
|
||
}
|
||
|
||
//从连接池删除,并关闭连接
|
||
func (t *TcpClient) delConn(key string) {
|
||
t.Lock()
|
||
defer t.Unlock()
|
||
if t.Clients[key].C != nil {
|
||
t.Clients[key].C.Close()
|
||
}
|
||
delete(t.Clients, key)
|
||
}
|
||
|
||
//添加到连接池中
|
||
func (t *TcpClient) addConn(c net.Conn, key string, status int) {
|
||
t.Lock()
|
||
defer t.Unlock()
|
||
globals.SugarLogger.Debugf("addConn key: %s", key)
|
||
t.Clients[key] = &PrintInfo{
|
||
C: c,
|
||
Status: status,
|
||
StatusTime: time.Now(),
|
||
}
|
||
}
|
||
|
||
func (t *TcpClient) buildMsgMap(key string) {
|
||
t.Lock()
|
||
defer t.Unlock()
|
||
dataChan := make(chan *model.PrintMsg, 1024)
|
||
t.MsgMap[key] = dataChan
|
||
}
|
||
|
||
func (t *TcpClient) buildCallBackMap(key string) {
|
||
t.Lock()
|
||
defer t.Unlock()
|
||
dataChan := make(chan string, 1024)
|
||
t.CallBackMap[key] = dataChan
|
||
}
|
||
|
||
func (t *TcpClient) getPrintStatus(key string) int {
|
||
t.RLock()
|
||
defer t.RUnlock()
|
||
if t.isExist(key) {
|
||
return t.Clients[key].Status
|
||
} else {
|
||
return printerStatusOffline
|
||
}
|
||
}
|
||
|
||
func (t *TcpClient) getPrintConn(key string) net.Conn {
|
||
t.RLock()
|
||
defer t.RUnlock()
|
||
if t.isExist(key) {
|
||
return t.Clients[key].C
|
||
} else {
|
||
return nil
|
||
}
|
||
}
|
||
|
||
func (t *TcpClient) isExistMsg(key string) bool {
|
||
t.RLock()
|
||
defer t.RUnlock()
|
||
if t.MsgMap[key] == nil {
|
||
return false
|
||
} else {
|
||
return true
|
||
}
|
||
}
|
||
|
||
func (t *TcpClient) isExistCallback(key string) bool {
|
||
t.RLock()
|
||
defer t.RUnlock()
|
||
if t.CallBackMap[key] == nil {
|
||
return false
|
||
} else {
|
||
return true
|
||
}
|
||
}
|
||
|
||
func (t *TcpClient) isExist(key string) bool {
|
||
t.RLock()
|
||
defer t.RUnlock()
|
||
if t.Clients[key] == nil {
|
||
return false
|
||
} else {
|
||
return true
|
||
}
|
||
}
|
||
|
||
func (t *TcpClient) setPrintStatus(key string, status int) {
|
||
t.Lock()
|
||
defer t.Unlock()
|
||
if t.isExist(key) {
|
||
t.Clients[key].Status = status
|
||
t.Clients[key].StatusTime = time.Now()
|
||
}
|
||
}
|
||
|
||
func (t *TcpClient) addMsgChan(printMsg *model.PrintMsg) {
|
||
t.Lock()
|
||
defer t.Unlock()
|
||
if !t.isExistMsg(printMsg.PrintNo) {
|
||
t.buildMsgMap(printMsg.PrintNo)
|
||
}
|
||
t.MsgMap[printMsg.PrintNo] <- printMsg
|
||
}
|
||
|
||
func (t *TcpClient) addCallbackChan(key, data string) {
|
||
t.Lock()
|
||
defer t.Unlock()
|
||
if !t.isExistCallback(key) {
|
||
t.buildCallBackMap(key)
|
||
}
|
||
t.CallBackMap[key] <- data
|
||
}
|
||
|
||
func NewTcpClient() *TcpClient {
|
||
t := &TcpClient{
|
||
Clients: make(map[string]*PrintInfo),
|
||
CallBackMap: make(map[string]chan string),
|
||
MsgMap: make(map[string]chan *model.PrintMsg),
|
||
}
|
||
t.RWMutex = new(sync.RWMutex)
|
||
return t
|
||
}
|