aa
This commit is contained in:
@@ -53,7 +53,7 @@ func (t *TcpClient) handleConn(c net.Conn) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
//也可能是查状态的
|
//也可能是查状态的(openAPI外部查询,一次性的)
|
||||||
if err = json.Unmarshal(buffer[:n], &printStatus); err == nil {
|
if err = json.Unmarshal(buffer[:n], &printStatus); err == nil {
|
||||||
fmt.Println("handleConn msg: ", string(buffer[:n]))
|
fmt.Println("handleConn msg: ", string(buffer[:n]))
|
||||||
if printStatus != nil {
|
if printStatus != nil {
|
||||||
@@ -62,7 +62,7 @@ func (t *TcpClient) handleConn(c net.Conn) {
|
|||||||
c.Close()
|
c.Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//看是心跳还是打印返回
|
//看是心跳还是打印回调
|
||||||
data := hex.EncodeToString(buffer[:n])
|
data := hex.EncodeToString(buffer[:n])
|
||||||
//证明是心跳
|
//证明是心跳
|
||||||
if strings.Contains(data, heartText) {
|
if strings.Contains(data, heartText) {
|
||||||
@@ -71,6 +71,13 @@ func (t *TcpClient) handleConn(c net.Conn) {
|
|||||||
printNo = string(printNoData)
|
printNo = string(printNoData)
|
||||||
globals.SugarLogger.Debugf("handleConn printno :[%v]", printNo)
|
globals.SugarLogger.Debugf("handleConn printno :[%v]", printNo)
|
||||||
status := printStatus2JxStatus(data[len(data)-8 : len(data)-6])
|
status := printStatus2JxStatus(data[len(data)-8 : len(data)-6])
|
||||||
|
//如果没在连接池里
|
||||||
|
//1、加到连接池中,不同的打印机no开不同的go
|
||||||
|
//2、初始化channel,每个打印机一个,放打印消息和打印回调消息
|
||||||
|
//3、读数据库里的待打印信息,放到打印channel中
|
||||||
|
//4、读打印channel并打印,并切等待回调channel中的消息
|
||||||
|
//5、修改数据库中打印机状态(没在连接池中说明是重新连接的)
|
||||||
|
//6、监听心跳时间,超过2分钟就clear掉
|
||||||
if t.Clients[printNo] == nil {
|
if t.Clients[printNo] == nil {
|
||||||
t.addConn(c, printNo, status)
|
t.addConn(c, printNo, status)
|
||||||
t.buildCallBackMap(printNo)
|
t.buildCallBackMap(printNo)
|
||||||
@@ -83,15 +90,19 @@ func (t *TcpClient) handleConn(c net.Conn) {
|
|||||||
changePrinterStatus(printNo, status)
|
changePrinterStatus(printNo, status)
|
||||||
t.HandleCheckTcpHeart(printNo)
|
t.HandleCheckTcpHeart(printNo)
|
||||||
} else {
|
} else {
|
||||||
|
//在加到连接池中已经更新了时间,所以放在else里
|
||||||
t.setPrintStatusTime(printNo)
|
t.setPrintStatusTime(printNo)
|
||||||
}
|
}
|
||||||
|
//状态不一致再更新状态(可能缺纸了,过热了等)
|
||||||
if t.getPrintStatus(printNo) != status {
|
if t.getPrintStatus(printNo) != status {
|
||||||
t.setPrintStatus(printNo, status)
|
t.setPrintStatus(printNo, status)
|
||||||
changePrinterStatus(printNo, status)
|
changePrinterStatus(printNo, status)
|
||||||
}
|
}
|
||||||
globals.SugarLogger.Debugf("handleConn print model %v", utils.Format4Output(t.Clients[printNo], true))
|
globals.SugarLogger.Debugf("handleConn print model %v", utils.Format4Output(t.Clients[printNo], true))
|
||||||
} else if strings.Contains(data, printText) {
|
} else if strings.Contains(data, printText) { //打印回调
|
||||||
globals.SugarLogger.Debugf("handleConn print callback: %v", data)
|
globals.SugarLogger.Debugf("handleConn print callback: %v", data)
|
||||||
|
//打印消息发送后,打印机会回调该条打印消息的状态(打印成功or失败,失败原因..)
|
||||||
|
//将回调的信息放到回调channel中,打印成功后再打印下一条消息
|
||||||
_, printNo = getCallbackMsgInfo(data)
|
_, printNo = getCallbackMsgInfo(data)
|
||||||
t.addCallbackChan(printNo, data)
|
t.addCallbackChan(printNo, data)
|
||||||
}
|
}
|
||||||
@@ -117,15 +128,17 @@ func (t *TcpClient) changePrintMsg(data string, orderNo int64, printNo string) (
|
|||||||
status int
|
status int
|
||||||
)
|
)
|
||||||
//1、先找出打印机编号和订单序列号,这两个确定唯一一条消息?
|
//1、先找出打印机编号和订单序列号,这两个确定唯一一条消息?
|
||||||
|
//通过参数传进来
|
||||||
//2、打印成功改变打印表的状态
|
//2、打印成功改变打印表的状态
|
||||||
if strings.Contains(data, printSuccessText) {
|
if strings.Contains(data, printSuccessText) {
|
||||||
//1e001802000150323032313036313530303030313000013c
|
//1e001802000150323032313036313530303030313000013c 成功消息例子
|
||||||
status = printMsgSuccess
|
status = printMsgSuccess
|
||||||
} else {
|
} else {
|
||||||
//打印失败也改变状态并更新失败原因
|
//打印失败也改变状态并更新失败原因
|
||||||
status = printMsgFail
|
status = printMsgFail
|
||||||
comment = printErrMap[data[12:14]]
|
comment = printErrMap[data[12:14]]
|
||||||
}
|
}
|
||||||
|
//这里序号重复会有问题
|
||||||
if printMsgs, err := dao.GetPrintMsgNoPage(db, printNo, orderNo); err != nil {
|
if printMsgs, err := dao.GetPrintMsgNoPage(db, printNo, orderNo); err != nil {
|
||||||
globals.SugarLogger.Debugf("changePrintMsg err :[%v]", err)
|
globals.SugarLogger.Debugf("changePrintMsg err :[%v]", err)
|
||||||
return err
|
return err
|
||||||
@@ -152,12 +165,18 @@ func (t *TcpClient) HandleTcpMessages(printNo string) {
|
|||||||
globals.SugarLogger.Debugf("build HandleTcpMessages printNo: %s", printNo)
|
globals.SugarLogger.Debugf("build HandleTcpMessages printNo: %s", printNo)
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
//一直读?
|
select {
|
||||||
prints, _ := dao.GetPrintMsgs(db, printNo, []int{printMsgWait}, time.Now().Add(-time.Hour*3), time.Now(), offset, pageSize)
|
case <-timeoutChan:
|
||||||
for _, printMsg := range prints {
|
return
|
||||||
printMsg.Status = printMsgAlreadyLoad
|
default:
|
||||||
if _, err := dao.UpdateEntity(db, printMsg, "Status"); err == nil {
|
//一直读?
|
||||||
t.addMsgChan(printMsg)
|
prints, _ := dao.GetPrintMsgs(db, printNo, []int{printMsgWait}, time.Now().Add(-time.Hour*3), time.Now(), offset, pageSize)
|
||||||
|
for _, printMsg := range prints {
|
||||||
|
printMsg.Status = printMsgAlreadyLoad
|
||||||
|
//先避免重复读再插到channel?
|
||||||
|
if _, err := dao.UpdateEntity(db, printMsg, "Status"); err == nil {
|
||||||
|
t.addMsgChan(printMsg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -175,7 +194,13 @@ func (t *TcpClient) doPrint(key string) (err error) {
|
|||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case printMsg := <-t.MsgMap[key]:
|
case <-timeoutChan:
|
||||||
|
return
|
||||||
|
default:
|
||||||
|
printMsg, ok := <-t.MsgMap[key]
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
var (
|
var (
|
||||||
data []byte
|
data []byte
|
||||||
c net.Conn
|
c net.Conn
|
||||||
@@ -184,6 +209,7 @@ func (t *TcpClient) doPrint(key string) (err error) {
|
|||||||
if err = checkPrintMsg(db, printMsg); err == nil {
|
if err = checkPrintMsg(db, printMsg); err == nil {
|
||||||
status := t.getPrintStatus(printMsg.PrintNo)
|
status := t.getPrintStatus(printMsg.PrintNo)
|
||||||
switch status {
|
switch status {
|
||||||
|
//只有在线才打印内容
|
||||||
case printerStatusOnline:
|
case printerStatusOnline:
|
||||||
if c = t.getPrintConn(printMsg.PrintNo); c != nil {
|
if c = t.getPrintConn(printMsg.PrintNo); c != nil {
|
||||||
data, err = buildMsg(printMsg)
|
data, err = buildMsg(printMsg)
|
||||||
@@ -209,6 +235,7 @@ func (t *TcpClient) doPrint(key string) (err error) {
|
|||||||
t.delConn(printMsg.PrintNo)
|
t.delConn(printMsg.PrintNo)
|
||||||
} else {
|
} else {
|
||||||
globals.SugarLogger.Debugf("handleTcpMessages success, data: %v", hex.EncodeToString(data))
|
globals.SugarLogger.Debugf("handleTcpMessages success, data: %v", hex.EncodeToString(data))
|
||||||
|
//等待回调
|
||||||
dataStr := <-t.CallBackMap[printMsg.PrintNo]
|
dataStr := <-t.CallBackMap[printMsg.PrintNo]
|
||||||
a, b := getCallbackMsgInfo(dataStr)
|
a, b := getCallbackMsgInfo(dataStr)
|
||||||
t.changePrintMsg(dataStr, a, b)
|
t.changePrintMsg(dataStr, a, b)
|
||||||
@@ -233,6 +260,7 @@ func (t *TcpClient) HandleCheckTcpHeart(key string) {
|
|||||||
if t.isExist(key) {
|
if t.isExist(key) {
|
||||||
globals.SugarLogger.Debugf("HandleCheckTcpHeart del key,%v", key)
|
globals.SugarLogger.Debugf("HandleCheckTcpHeart del key,%v", key)
|
||||||
t.clear(key)
|
t.clear(key)
|
||||||
|
timeoutChan <- 1
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ const (
|
|||||||
hexSignQrEnd = "000a1b40" //000a0a0a1b40
|
hexSignQrEnd = "000a1b40" //000a0a0a1b40
|
||||||
hexSignSound = "1d6b40"
|
hexSignSound = "1d6b40"
|
||||||
|
|
||||||
|
//起始标签
|
||||||
byteSignBR = "3c62723e" //换行
|
byteSignBR = "3c62723e" //换行
|
||||||
byteSignCenter = "3c63656e7465723e" //居中
|
byteSignCenter = "3c63656e7465723e" //居中
|
||||||
byteSignLeft = "3c6c6566743e" //居左
|
byteSignLeft = "3c6c6566743e" //居左
|
||||||
@@ -80,6 +81,7 @@ const (
|
|||||||
byteSignQrRight = "3c7172723e"
|
byteSignQrRight = "3c7172723e"
|
||||||
byteSignSound = "3c736f756e643e"
|
byteSignSound = "3c736f756e643e"
|
||||||
|
|
||||||
|
//结束标签
|
||||||
byteSignCenterE = "3c2f63656e7465723e" //居中
|
byteSignCenterE = "3c2f63656e7465723e" //居中
|
||||||
byteSignLeftE = "3c2f6c6566743e" //居左
|
byteSignLeftE = "3c2f6c6566743e" //居左
|
||||||
byteSignRightE = "3c2f72696768743e" //居右
|
byteSignRightE = "3c2f72696768743e" //居右
|
||||||
@@ -106,7 +108,7 @@ var (
|
|||||||
regexpQrr = regexp.MustCompile(byteSignQrRight + "(.*?)" + byteSignQrRightE)
|
regexpQrr = regexp.MustCompile(byteSignQrRight + "(.*?)" + byteSignQrRightE)
|
||||||
regexpSound = regexp.MustCompile(byteSignSound + "(.*?)" + byteSignSoundE)
|
regexpSound = regexp.MustCompile(byteSignSound + "(.*?)" + byteSignSoundE)
|
||||||
|
|
||||||
timeoutChan = make(chan int, 10)
|
timeoutChan = make(chan int)
|
||||||
)
|
)
|
||||||
|
|
||||||
type PrintInfo struct {
|
type PrintInfo struct {
|
||||||
@@ -326,6 +328,7 @@ func changePrinterStatus(printNo string, status int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//按打印机方提供的文档来的
|
||||||
func buildMsg(printMsg *model.PrintMsg) (data []byte, err error) {
|
func buildMsg(printMsg *model.PrintMsg) (data []byte, err error) {
|
||||||
var (
|
var (
|
||||||
content = printMsg.Content
|
content = printMsg.Content
|
||||||
@@ -349,6 +352,7 @@ func buildMsg(printMsg *model.PrintMsg) (data []byte, err error) {
|
|||||||
return jxutils.Hextob(dataStr + check), err
|
return jxutils.Hextob(dataStr + check), err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//替换特殊字符,上面那个hextob转不了,先替换一下
|
||||||
func replaceContentOther(content string) string {
|
func replaceContentOther(content string) string {
|
||||||
return strings.ReplaceAll(content, "⃣️", " ")
|
return strings.ReplaceAll(content, "⃣️", " ")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user