264 lines
6.5 KiB
Go
264 lines
6.5 KiB
Go
package cms
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"git.rosy.net.cn/baseapi/utils"
|
||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||
"net"
|
||
"os"
|
||
"regexp"
|
||
"time"
|
||
)
|
||
|
||
const (
|
||
sounda = "sounda" //提示音a
|
||
soundb = "soundb" //提示音b
|
||
soundc = "soundc" //提示音c
|
||
soundd = "soundd" //提示音d
|
||
sounde = "sounde" //报警音e
|
||
soundf = "soundf" //报警音f
|
||
soundg = "soundg" //报警音g
|
||
)
|
||
|
||
type PrintInfo struct {
|
||
PrintNo string
|
||
AppID int
|
||
}
|
||
|
||
var (
|
||
regexpMobile = regexp.MustCompile("^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\\d{8}$")
|
||
soundMap = map[string]string{
|
||
"sounda": "sounda",
|
||
"soundb": "soundb",
|
||
"soundc": "soundc",
|
||
"soundd": "soundd",
|
||
"sounde": "sounde",
|
||
"soundf": "soundf",
|
||
"soundg": "soundg",
|
||
}
|
||
)
|
||
|
||
func AddPrinter(appID int, printers []*model.Printer) (err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
errs []error
|
||
)
|
||
if len(printers) > 50 {
|
||
return fmt.Errorf("一次最多只能绑定50台!")
|
||
}
|
||
for _, v := range printers {
|
||
if printers2, _ := dao.GetPrinters(db, appID, v.PrintNo); len(printers2) > 0 {
|
||
errs = append(errs, fmt.Errorf("此应用已经绑定了该打印机!print_no : %v ", v.PrintNo))
|
||
continue
|
||
}
|
||
//验证手机号
|
||
if v.SIM != "" {
|
||
if regexpMobile.FindString(v.SIM) == "" {
|
||
errs = append(errs, fmt.Errorf("请输入正确的sim卡号码!print_no : %v ", v.PrintNo))
|
||
continue
|
||
}
|
||
}
|
||
if v.Volume != 0 {
|
||
if v.Volume < 0 || v.Volume > 5 {
|
||
errs = append(errs, fmt.Errorf("请输入正确的音量!print_no : %v ", v.PrintNo))
|
||
continue
|
||
}
|
||
}
|
||
if v.Sound != "" {
|
||
if soundMap[v.Sound] == "" {
|
||
errs = append(errs, fmt.Errorf("请输入正确的提示音!print_no : %v ", v.PrintNo))
|
||
continue
|
||
}
|
||
}
|
||
printer := &model.Printer{
|
||
AppID: appID,
|
||
PrintNo: v.PrintNo,
|
||
Name: v.Name,
|
||
SIM: v.SIM,
|
||
Status: model.PrinterStatusOffline,
|
||
Sound: v.Sound,
|
||
}
|
||
if v.Volume == 0 {
|
||
printer.Volume = 4
|
||
}
|
||
dao.WrapAddIDCULDEntity(printer, "")
|
||
if err = dao.CreateEntity(db, printer); err != nil {
|
||
errs = append(errs, err)
|
||
continue
|
||
}
|
||
}
|
||
if len(errs) > 0 {
|
||
err = jxutils.BuildErr(errs)
|
||
}
|
||
return err
|
||
}
|
||
|
||
func DelPrinter(appID int, printNos []string) (err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
errs []error
|
||
)
|
||
for _, v := range printNos {
|
||
if printers, _ := dao.GetPrinters(db, appID, v); len(printers) == 0 {
|
||
errs = append(errs, fmt.Errorf("该应用下未找到该打印机!print_no : %v ", v))
|
||
continue
|
||
} else {
|
||
printers[0].DeletedAt = time.Now()
|
||
if _, err = dao.UpdateEntity(db, printers[0], "DeletedAt"); err != nil {
|
||
errs = append(errs, err)
|
||
continue
|
||
}
|
||
}
|
||
}
|
||
if len(errs) > 0 {
|
||
err = jxutils.BuildErr(errs)
|
||
}
|
||
return err
|
||
}
|
||
|
||
func UpdatePrinter(appID int, printNo string, name, sim, sound *string, volume *int) (err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
fields []string
|
||
)
|
||
//看有没有
|
||
if printers, _ := dao.GetPrinters(db, appID, printNo); len(printers) == 0 {
|
||
return fmt.Errorf("该应用下未找到该打印机!print_no : %v", printNo)
|
||
} else {
|
||
if printers[0].Name != *name {
|
||
printers[0].Name = *name
|
||
fields = append(fields, "name")
|
||
}
|
||
if printers[0].SIM != *sim {
|
||
printers[0].SIM = *sim
|
||
fields = append(fields, "sim")
|
||
}
|
||
if printers[0].Sound != *sound {
|
||
printers[0].Sound = *sound
|
||
fields = append(fields, "sound")
|
||
}
|
||
if printers[0].Volume != *volume {
|
||
printers[0].Volume = *volume
|
||
fields = append(fields, "volume")
|
||
}
|
||
if _, err = dao.UpdateEntity(db, printers[0], fields...); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return err
|
||
}
|
||
|
||
func DelPrinterSeq(appID int, printNo string) (err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
)
|
||
//看有没有
|
||
if printers, _ := dao.GetPrinters(db, appID, printNo); len(printers) == 0 {
|
||
return fmt.Errorf("该应用下未找到该打印机!print_no : %v", printNo)
|
||
} else {
|
||
printMsgs, _ := dao.GetPrintMsgs(db, printNo, "", model.PrintMsgWait)
|
||
for _, v := range printMsgs {
|
||
v.DeletedAt = time.Now()
|
||
if _, err = dao.UpdateEntity(db, v, "DeletedAt"); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
}
|
||
return err
|
||
}
|
||
|
||
func DoPrint(appID int, msgID, printNo, content string, orderNo int) (err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
)
|
||
//打印机必须绑定在该应用下才能打印
|
||
if printers, _ := dao.GetPrinters(db, appID, printNo); len(printers) == 0 {
|
||
return fmt.Errorf("未在该应用下获取到此打印机!print_no %v", printNo)
|
||
}
|
||
printMsg := &model.PrintMsg{
|
||
PrintNo: printNo,
|
||
Content: content,
|
||
OrderNo: orderNo,
|
||
MsgID: msgID,
|
||
}
|
||
dao.WrapAddIDCULDEntity(printMsg, "")
|
||
if err = dao.CreateEntity(db, printMsg); err != nil {
|
||
return err
|
||
}
|
||
return err
|
||
}
|
||
|
||
type GetPrintMsgResult struct {
|
||
MsgID string `json:"msg_id"` //消息ID
|
||
PrintNo string `json:"print_no"` //打印机编号
|
||
OrderNo int `json:"order_no"` //订单序号
|
||
Content string `json:"content"` //订单内容
|
||
Status int `json:"status"` //打印状态
|
||
Comment string `json:"comment"` //失败原因
|
||
}
|
||
|
||
func GetPrintMsg(appID int, msgID string) (printMsg *GetPrintMsgResult, err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
)
|
||
if printMsgs, _ := dao.GetPrintMsgs(db, "", msgID, model.PrintMsgAll); len(printMsgs) > 0 {
|
||
result := printMsgs[0]
|
||
printMsg = &GetPrintMsgResult{
|
||
MsgID: result.MsgID,
|
||
PrintNo: result.PrintNo,
|
||
OrderNo: result.OrderNo,
|
||
Content: result.Content,
|
||
Status: result.Status,
|
||
Comment: result.Comment,
|
||
}
|
||
return printMsg, err
|
||
} else {
|
||
return printMsg, fmt.Errorf("未找到该消息!msg_id :%v", msgID)
|
||
}
|
||
return printMsg, err
|
||
}
|
||
|
||
func GetPrinterStatus(appID int, printNo string) (status int, err error) {
|
||
var (
|
||
db = dao.GetDB()
|
||
)
|
||
//看有没有
|
||
if printers, _ := dao.GetPrinters(db, appID, printNo); len(printers) == 0 {
|
||
return status, fmt.Errorf("该应用下未找到该打印机!print_no : %v", printNo)
|
||
} else {
|
||
server := "print.jxcs.net:8000"
|
||
tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
|
||
if err != nil {
|
||
os.Exit(1)
|
||
return status, err
|
||
}
|
||
conn, err := net.DialTCP("tcp", nil, tcpAddr)
|
||
if err != nil {
|
||
return status, err
|
||
}
|
||
status = connHandler(conn, &PrintInfo{
|
||
PrintNo: printNo,
|
||
AppID: appID,
|
||
})
|
||
}
|
||
return status, err
|
||
}
|
||
|
||
func connHandler(c net.Conn, printInfo *PrintInfo) (status int) {
|
||
defer c.Close()
|
||
//缓冲
|
||
buf := make([]byte, 1024)
|
||
data, _ := json.Marshal(printInfo)
|
||
//写入数据
|
||
c.Write(data)
|
||
//服务器端返回的数据写入buf
|
||
n, _ := c.Read(buf)
|
||
status = utils.Str2Int(string(buf[:n]))
|
||
//服务器端回传的信息
|
||
fmt.Println("server response:", string(buf[:n]))
|
||
return status
|
||
}
|