diff --git a/business/jxstore/event/event_tcp.go b/business/jxstore/event/event_tcp.go index 5c4f4795a..34c0e2b31 100644 --- a/business/jxstore/event/event_tcp.go +++ b/business/jxstore/event/event_tcp.go @@ -3,6 +3,7 @@ package event import ( "encoding/hex" "fmt" + "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/globals" "github.com/astaxie/beego/client/orm" @@ -17,10 +18,20 @@ const ( heartText = "1e000f02000151" printText = "1e00180200" printSuccessText = "1e001802000150" + + printErrWithoutPaper = "05" + + printMsgSuccess = 1 //打印成功 + printMsgWait = 0 //待打印 + printMsgFail = -1 //打印失败 ) var ( tcpClient = &TcpClient{} + + printErrMap = map[string]string{ + printErrWithoutPaper: "打印机缺纸!", + } ) //连接的客户端,吧每个客户端都放进来 @@ -77,27 +88,85 @@ func handleConn(c net.Conn) { data := hex.EncodeToString(buffer[:n]) //证明是心跳 if strings.Contains(data, heartText) { - printNo = data[len(heartText) : len(data)-8] + printNoData, _ := hex.DecodeString(data[len(heartText) : len(data)-8]) + printNo = string(printNoData) if tcpClient.Clients[printNo] == nil { tcpClient.Clients[printNo] = c } else { //改变打印机状态 } } else if strings.Contains(data, printText) { - //证明是打印成功 - if strings.Contains(data, printSuccessText) { - //打印成功改变打印表的状态 + changePrintMsg(db, data) + } + } +} + +func changePrintMsg(db *dao.DaoDB, data string) (err error) { + var ( + printNo, comment string + orderNo int64 + status int + printMsg = &model.PrintMsg{} + ) + //1、先找出打印机编号和订单序列号,这两个确定唯一一条消息 + orderNo = h8l82int(data[len(data)-6:len(data)-4], data[len(data)-4:len(data)-2]) + printNoData, _ := hex.DecodeString(data[len(printSuccessText) : len(data)-6]) + printNo = string(printNoData) + //2、打印成功改变打印表的状态 + if strings.Contains(data, printSuccessText) { + //1e001802000150323032313036313530303030313000013c + status = printMsgSuccess + } else { + //打印失败也改变状态并更新失败原因 + status = printMsgFail + comment = printErrMap[data[12:14]] + } + if printMsg, err = dao.GetPrintMsg(db, printNo, orderNo); err != nil { + globals.SugarLogger.Debugf("changePrintMsg err :[%v]", err) + return + } else if printMsg == nil { + globals.SugarLogger.Debugf("changePrintMsg err ,not found printMsg printNo:[%v], orderNo :[%v]", printNo, orderNo) + } else { + printMsg.Comment = comment + printMsg.Status = status + dao.UpdateEntity(db, printMsg, "Comment", "Status") + } + return err +} + +func handleTcpMessages() { + var ( + db = dao.GetDB() + offset, pageSize = 0, 10 + ) + db.Db = orm.NewOrmUsingDB("api") //读写这个库 + for { + //一直读? + var err error + prints, _ := dao.GetPrintMsgs(db, printMsgWait, offset, pageSize) + for _, printMsg := range prints { + if printMsg != nil { + if err = checkPrintMsg(printMsg); err == nil { + + } } else { - //打印失败也改变状态并更新失败原因 + err = fmt.Errorf("未查询到此printMsg") } } } } -func handleTcpMessages() { - for { - +func checkPrintMsg(printMsg *model.PrintMsg) (err error) { + if printMsg.Content == "" { + return fmt.Errorf("此打印信息内容为空!printMsg printNo:[%v], orderNo :[%v]", printMsg.PrintNo, printMsg.OrderNo) } + if printMsg.PrintNo == "" { + return fmt.Errorf("此打印信息打印机编号为空!printMsg printNo:[%v], orderNo :[%v]", printMsg.PrintNo, printMsg.OrderNo) + } + if printMsg.OrderNo == 0 { + return fmt.Errorf("此打印信息订单序号为空!printMsg printNo:[%v], orderNo :[%v]", printMsg.PrintNo, printMsg.OrderNo) + } + return err } func Hextob(str string) []byte { @@ -136,3 +205,22 @@ func int2h8l8(i int64) (h, l string) { } return h, l } + +func h8l82int(h, l string) (i int64) { + s1, s2 := xtob(h), xtob(l) + flag1 := 8 - len(s1) + flag2 := 8 - len(s2) + for m := 0; m < flag1; m++ { + s1 = "0" + s1 + } + for j := 0; j < flag2; j++ { + s2 = "0" + s2 + } + i, _ = strconv.ParseInt(s1+s2, 2, 10) + return i +} + +func xtob(x string) string { + base, _ := strconv.ParseInt(x, 16, 10) + return strconv.FormatInt(base, 2) +} diff --git a/business/jxutils/tasksch/task.go b/business/jxutils/tasksch/task.go index 89f407e4a..90627c5b8 100644 --- a/business/jxutils/tasksch/task.go +++ b/business/jxutils/tasksch/task.go @@ -476,7 +476,9 @@ func (t *BaseTask) run(taskHandler func()) { if t.finishHook != nil { t.finishHook(t) } else { - SendMessage(t) + if globals.IsMainProductEnv() { + SendMessage(t) + } } }) } diff --git a/business/model/dao/dao_print.go b/business/model/dao/dao_print.go new file mode 100644 index 000000000..2a7983983 --- /dev/null +++ b/business/model/dao/dao_print.go @@ -0,0 +1,37 @@ +package dao + +import ( + "git.rosy.net.cn/jx-callback/business/model" +) + +func GetPrintMsg(db *DaoDB, printNo string, orderNo int64) (prints *model.PrintMsg, err error) { + sql := ` + SELECT * + FROM print_msg + WHERE 1 = 1 + ` + sqlParams := []interface{}{} + if printNo != "" { + sql += ` AND print_no = ?` + sqlParams = append(sqlParams, printNo) + } + if orderNo != 0 { + sql += ` AND order_no = ?` + sqlParams = append(sqlParams, orderNo) + } + err = GetRow(db, &prints, sql, sqlParams) + return prints, err +} + +func GetPrintMsgs(db *DaoDB, status, offset, pageSize int) (prints []*model.PrintMsg, err error) { + sql := ` + SELECT * + FROM print_msg + WHERE 1 = 1 + AND status = ? + LIMIT ? OFFSET + ` + sqlParams := []interface{}{status, pageSize, offset} + err = GetRows(db, &prints, sql, sqlParams) + return prints, err +} diff --git a/business/model/print.go b/business/model/print.go new file mode 100644 index 000000000..b23145e90 --- /dev/null +++ b/business/model/print.go @@ -0,0 +1,11 @@ +package model + +type PrintMsg struct { + ModelIDCULD + + PrintNo string `json:"print_no"` //打印机编号 + Content string `orm:"type(text)" json:"content"` //订单内容 + OrderNo int `json:"order_no"` //订单序号 + Status int `json:"status"` //打印状态 + Comment string `json:"comment"` //失败原因 +}