package cms import ( "encoding/json" "errors" "fmt" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxstore/event" "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" "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.AddPrinterParam) (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, 0, 0); len(printers2) > 0 { // 代表打印机已经在小程序注册了,查询打印机授权门店 bindStoreList, err := dao.QueryPrintBindStore(v.PrintNo) if err != nil { errs = append(errs, fmt.Errorf("QueryPrintBindStore err : %v ", err)) continue } if len(bindStoreList) >= 5 { errs = append(errs, fmt.Errorf("当前打印机绑定门店数据超过五个,无法继续绑定")) continue } have := false userId := "" for _, bsl := range bindStoreList { if bsl.StoreID == v.StoreId { have = true userId = bsl.UserId } } if !have { if err := dao.BindStoreList(printers[0], userId); err != nil { errs = append(errs, fmt.Errorf("BindStoreList err : %v ", err)) continue } } continue } //验证 if err = checkPrinterInfo(v.PrintNo, v.Name, "", "", 0); err != nil { errs = append(errs, err) continue } // 检查心跳 exits, err := dao.CheckHeard(v.PrintNo) if err != nil { errs = append(errs, fmt.Errorf("CheckHeard err : %v ", err)) continue } if !exits { errs = append(errs, fmt.Errorf("打印机未激活,请激活后在绑定")) continue } printer := &model.Printer{ AppID: appID, PrintNo: v.PrintNo, Name: v.Name, IccID: "", Status: model.PrinterStatusOffline, Sound: "sounda", PrintKey: v.SIM, IsOnline: 0, Volume: 1, FlowFlag: 0, OfflineCount: 0, UserId: "system_user", } // 创建打印机 if err := InitPrint(printer, v); err != nil { return err } } if len(errs) > 0 { err = jxutils.BuildErr(errs) } return err } func InitPrint(printer *model.Printer, printParam *model.AddPrinterParam) error { txDb, _ := dao.Begin(dao.GetDB()) // 创建打印机 dao.WrapAddIDCULDEntity(printer, "") if err := dao.CreateEntityTx(txDb, printer); err != nil { txDb.Rollback() return err } // 赋予打印机默认配置 day := time.Now() param, err := MarshalJson2String(&model.PrintSetting{ CreatedAt: day, UpdatedAt: day, DeletedAt: utils.DefaultTimeValue, PrintNo: printer.PrintNo, CallNameSetting: 64, // 老板 BusinessOffLineVoice: 1, // 离线开关 BalanceNotEnoughVoice: 1, // 余额不足 EveryDayGreetVoice: 1, // 问好 BusinessPrintNum: 1, // 商户侧打印次数 CustomerPrintNum: 1, // 用户侧打印次数 }) if err != nil { return err } if err := dao.CreateEntityTx(txDb, param); err != nil { txDb.Rollback() return err } // 初始化打印机账户 if err := dao.CreateEntityTx(txDb, &model.PrintBill{ CreatedAt: time.Now(), UpdatedAt: time.Now(), PrintNo: param.PrintNo, PrintBalance: 20000, UserId: "system", }); err != nil { txDb.Rollback() return err } // 初始化绑定信息 if err := dao.BindStoreList(printParam, ""); err != nil { txDb.Rollback() return err } defer txDb.Commit() return err } // MarshalJson2String 工具类 func MarshalJson2String(param *model.PrintSetting) (*model.PrintSetting, error) { // 语音设置 voiceSetting := &model.VoiceSettingDetail{ WaitOrderVoice: model.SettingOpen, RiderTakeOrderVoice: model.SettingOpen, ApplyUserOrderCancelVoice: model.SettingOpen, ApplyRefundOrderVoice: model.SettingOpen, ApplyRefundGoodsVoice: model.SettingOpen, RefundGoodsVoice: model.SettingOpen, ConfirmGoodsVoice: model.SettingOpen, SuccessGoodsVoice: model.SettingOpen, ConsultingPrint: model.SettingOpen, ReminderVoice: model.SettingOpen, CustomerRejectionVoice: model.SettingOpen, CusterRefundVoice: model.SettingOpen, LoseAuthorization: model.SettingOpen, } customerVoiceSettingByte, err := json.Marshal(voiceSetting) if err != nil { return nil, err } param.VoiceSetting = string(customerVoiceSettingByte) // 打印设置 printSetting := &model.PrintSettingDetail{ UserOrderCancel: model.SettingOpen, RefundOrder: model.SettingOpen, BusinessOrderCancel: model.SettingOpen, RiderTakeOrder: model.SettingOpen, CusterRefundPrint: model.SettingOpen, WaitOrderPrint: model.SettingOpen, ApplyUserCancelOrder: model.SettingOpen, ApplyUserRefund: model.SettingOpen, OrderCancelSuccess: model.SettingOpen, } pickingSettingByte, err := json.Marshal(printSetting) if err != nil { return nil, err } param.PrintSetting = string(pickingSettingByte) return param, nil } func checkPrinterInfo(printNo, name, sound, sim string, volume int) (err error) { if printNo != "" { } if sim != "" { //if regexpMobile.FindString(sim) == "" { return fmt.Errorf("暂不支持修改sim卡号码!print_no : %v ", printNo) //} } if volume != 0 { if volume <= 0 || volume > 5 { return fmt.Errorf("请输入正确的音量1-5!print_no : %v ", printNo) } } if sound != "" { if soundMap[sound] == "" { return fmt.Errorf("请输入正确的提示音!print_no : %v ", printNo) } } if name != "" { if len(name) > 255 { return fmt.Errorf("打印机备注不能超过255个字符!print_no : %v ", printNo) } } return err } func DelPrinter(appID int, printNos []string, storeId string) (err error) { var ( db = dao.GetDB() errs []error ) for _, v := range printNos { if printers, _ := dao.GetPrinters(db, appID, v, 0, 0); len(printers) == 0 { errs = append(errs, fmt.Errorf("该应用下未找到该打印机!print_no : %v ", v)) continue } else { if err := dao.DeleteStoreList(printers[0].PrintNo, storeId); 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, 0, 0); len(printers) == 0 { return fmt.Errorf("该应用下未找到该打印机!print_no : %v", printNo) } else { if name != nil { if *name != "" { if len(*name) > 20 { return fmt.Errorf("打印机备注不能超过20个字符!print_no : %v ", printNo) } } if printers[0].Name != *name { printers[0].Name = *name fields = append(fields, "name") } } if sim != nil { if *sim != "" { //if regexpMobile.FindString(*sim) == "" { return fmt.Errorf("暂不支持修改sim卡号码!print_no : %v ", printNo) //} } //if printers[0].SIM != *sim { // printers[0].SIM = *sim // fields = append(fields, "sim") //} } if sound != nil { if *sound != "" { if soundMap[*sound] == "" { return fmt.Errorf("请输入正确的提示音!print_no : %v ", printNo) } } if printers[0].Sound != *sound { printers[0].Sound = *sound fields = append(fields, "sound") } } if volume != nil { if *volume <= 0 || *volume > 5 { return fmt.Errorf("请输入正确的音量 1-5!print_no : %v ", printNo) } 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, 0, 0); len(printers) == 0 { return fmt.Errorf("该应用下未找到该打印机!print_no : %v", printNo) } else { printMsgs, _ := dao.GetPrintMsgs2(db, printNo, "", model.PrintMsgAll, model.PrintMsgSuccess) for _, v := range printMsgs { v.DeletedAt = time.Now() if _, err = dao.UpdateEntity(db, v, "DeletedAt"); err != nil { return err } } } // 简历连接 conn, err := net.Dial("tcp", "www.jxcs.net:8000") if err != nil { return err } clearPrint := fmt.Sprintf(`{"print_no_clear":%s}`, printNo) // 发送数据 if _, err := conn.Write([]byte(clearPrint)); err != nil { return err } // 等待数据 buf := make([]byte, 1024) n, err := conn.Read(buf) if err != nil { return err } if string(buf[:n]) != "ok" { return errors.New("缓存清理失败") } defer conn.Close() return err } func DoPrintMsg(appID int, msgID, printNo, content string, orderNo string) (err error) { var ( db = dao.GetDB() ) //打印机必须绑定在该应用下才能打印 if printers, _ := dao.GetPrinters(db, appID, printNo, 0, 0); len(printers) == 0 { return fmt.Errorf("未在该应用下获取到此打印机!print_no %v", printNo) } printMsg := &model.PrintMsg{ PrintNo: printNo, Content: content, OrderNo: orderNo, MsgID: msgID, Status: event.PrintMsgWait, } t, ok := event.PrintObject.GetPrintObj(printNo) if ok { t.Lock() defer t.Unlock() t.MsgMap[printNo] <- printMsg printMsg.Status = event.PrintMsgAlreadyLoad } /*else { t = event.NewTcpClient() event.BuildAllMap(t, printNo) event.PrintObject[printNo] = t t.Lock() defer t.Unlock() t.MsgMap[printNo] <- printMsg printMsg.Status = event.PrintMsgAlreadyLoad }*/ 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 string `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.GetPrintMsgs2(db, "", msgID, model.PrintMsgAll, 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) } } func GetPrinterStatus(appID int, printNo string) (status int, err error) { var ( db = dao.GetDB() ) //看有没有 printers, _ := dao.GetPrinters(db, appID, printNo, 0, 0) if len(printers) == 0 { return status, fmt.Errorf("该应用下未找到该打印机!print_no : %v", printNo) } else { return printers[0].Status + printers[0].IsOnline, nil // 当两个值都唯一时->在线正常 //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, nil } }