package event import ( "git.rosy.net.cn/jx-callback/business/model" "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 = "
" //换行 signCenter = "
" //居中 signLeft = "" //居左 signRight = "" //居右 signBig = "" //字体放大 signHighBig = "" //字体纵向放大 signWideBig = "" //字体横向放大 signQrCenter = "" //二维码居中 signQrLeft = "" //二维码居左 signQrRight = "" //二维码居右 signSound = "" //声音 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 CallBackMap sync.Map *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() t.Clients[key] = &PrintInfo{ C: c, Status: status, StatusTime: time.Now(), } } func (t *TcpClient) buildCallBackMap(key string) { dataChan := make(chan string, 1024) t.CallBackMap.Store(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) 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 NewTcpClient() *TcpClient { t := &TcpClient{ Clients: make(map[string]*PrintInfo), //CallBackMap: new(sync.Map), } t.RWMutex = new(sync.RWMutex) return t }