package svc import ( "applet/app/db" "applet/app/db/model" "applet/app/e" "applet/app/md" "applet/app/utils" "applet/app/utils/cache" "encoding/json" "fmt" "github.com/gin-gonic/gin" "strings" "time" "xorm.io/xorm" ) func PrinterCateList(c *gin.Context) { var list = []map[string]string{ { "name": "普通打印机", "key": "ordinary", }, } e.OutSuc(c, list, nil) return } func PrinterLocationList(c *gin.Context) { var list = []map[string]string{ { "name": "前台", "key": "reception", }, { "name": "后厨", "key": "kitchen", }, } e.OutSuc(c, list, nil) return } // 打印机列表 func PrinterIndexList(c *gin.Context) { var search md.IndexRequest if err := c.ShouldBindJSON(&search); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } engine := MasterDb(c) if engine == nil { e.OutErr(c, e.ERR_MASTER_ID, nil) return } user := GetUser(c) search.StoreId = utils.IntToStr(user.Info.Uid) list, err := db.GetPrinterIndexList(engine, &search) fmt.Println(err) fmt.Println(list) if err != nil { e.OutErr(c, e.ERR_BAD_REQUEST, err) return } if list == nil { list = make([]md.IndexResList, 0) } printerModule, _ := db.GetAllPrinterModuleList(engine) //处理模板数据 var moduleArr = make(map[int]string, 0) var moduleContentArr = make(map[int]string, 0) if printerModule != nil { for _, v := range printerModule { moduleArr[v.Id] = v.Name moduleContentArr[v.Id] = v.Content } } var useArr = []string{"离线", "在线"} for k, v := range list { isUse := utils.StrToInt(v.IsUse) list[k].UseStr = useArr[isUse] ModuleId := utils.StrToInt(v.ModuleId) list[k].ModuleStr = moduleArr[ModuleId] list[k].Content = moduleContentArr[ModuleId] list[k].Img = "http://ossn.izhim.net/o2o_printer.png" } e.OutSuc(c, &list, nil) return } // 模板列表 func PrinterModuleList(c *gin.Context) { var search md.IndexRequest if err := c.ShouldBindJSON(&search); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } engine := MasterDb(c) if engine == nil { e.OutErr(c, e.ERR_MASTER_ID, nil) return } list, err := db.GetPrinterModuleList(engine, &search) if err != nil { e.OutErr(c, e.ERR_BAD_REQUEST, err) return } if list == nil { list = make([]md.ModuleResList, 0) } e.OutSuc(c, &list, nil) return } func PrinterIndexSave(c *gin.Context) { var search md.IndexSaveRequest if err := c.ShouldBindJSON(&search); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } if search.Type == "" { search.Type = "ordinary" } eg := MasterDb(c) //判断是不是有人绑过了 if search.Type != "bluetooth" { count := db.IndexExists(eg, &search) check := 1 if utils.StrToInt(search.Id) > 0 { //判断下是不是同一条记录保存 data, _ := db.IndexById(eg, &search) if data != nil && data.SnNum == search.SnNum { check = 0 } } if count > 0 && check == 1 { e.OutErr(c, 400, e.NewErr(400, "该打印机已被绑定过")) return } } user := GetUser(c) var module = model.CommunityTeamStorePrinter{ Id: utils.StrToInt(search.Id), StoreId: user.Info.Uid, SnNum: search.SnNum, IdentificationCode: search.IdentificationCode, Name: search.Name, IsUse: utils.StrToInt(search.IsUse), UpdateTime: time.Now(), Type: search.Type, LocationType: search.LocationType, } if search.Type != "bluetooth" { args := md.PrinterReq{ Sn: search.SnNum, Key: search.IdentificationCode, Remark: search.Name, PrinterType: search.Type, } //调用公共代码 调用打印机添加与编辑 if utils.StrToInt(search.Id) > 0 { //编辑 err := EditPrinter(c, args) if err != nil { e.OutErr(c, 400, err) return } } else { err := AddPrinter(c, args) if err != nil { e.OutErr(c, 400, err) return } } } id, err := db.IndexInsert(eg, &module) if id == 0 || err != nil { e.OutErr(c, 400, e.NewErr(400, "保存失败")) return } return } // 模板id修改 func PrinterIndexModuleSave(c *gin.Context) { var search md.IndexSaveRequest if err := c.ShouldBindJSON(&search); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } var module = model.CommunityTeamStorePrinter{ Id: utils.StrToInt(search.Id), ModuleId: utils.StrToInt(search.ModuleId), UpdateTime: time.Now(), } id, err := db.IndexUpdate(MasterDb(c), &module, "module_id,update_time") if id == 0 || err != nil { e.OutErr(c, 400, e.NewErr(400, "保存失败")) return } e.OutSuc(c, "success", nil) return } // 使用状态修改 func PrinterIndexStateSave(c *gin.Context) { var search md.IndexSaveRequest if err := c.ShouldBindJSON(&search); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } var module = model.CommunityTeamStorePrinter{ Id: utils.StrToInt(search.Id), IsUse: utils.StrToInt(search.IsUse), UpdateTime: time.Now(), } id, err := db.IndexUpdate(MasterDb(c), &module, "is_use,update_time") if id == 0 || err != nil { e.OutErr(c, 400, e.NewErr(400, "保存失败")) return } e.OutSuc(c, "success", nil) return } // 删除打印机 func PrinterDelIndex(c *gin.Context, ids string) { engine := MasterDb(c) //查出这条记录拿sn码 user := GetUser(c) storeId := utils.IntToStr(user.Info.Uid) printerOne, _ := db.GetPrinterIndexById(engine, ids, storeId) if printerOne.Id == 0 { e.OutErr(c, 400, e.NewErr(400, "删除失败")) return } if printerOne.Type != "bluetooth" { //调用打印机删除 args := md.PrinterReq{ Sn: printerOne.SnNum, PrinterType: printerOne.Type, } err := DelPrinter(c, args) if err != nil { e.OutErr(c, 400, err) return } } has, err := engine.Where("id=? and store_id=?", ids, storeId).Delete(new(model.CommunityTeamStorePrinter)) if err != nil { e.OutErr(c, e.ERR_DB_ORM, err) return } if has == 0 { e.OutErr(c, 400, e.NewErr(400, "删除失败")) return } e.OutSuc(c, []int{}, nil) return } // 明细筛选条件 func PrinterIndexRecordScreen(c *gin.Context) { engine := MasterDb(c) if engine == nil { e.OutErr(c, e.ERR_MASTER_ID, nil) return } user := GetUser(c) printer, _ := db.GetPrinterIndexAll(engine, utils.IntToStr(user.Info.Uid)) var r md.RecordPrinterScreen r.TimeSort = []md.NewSelectList{ { Key: "", Name: "默认排序", }, { Key: "printer_time_desc", Name: "时间由近到远", }, { Key: "printer_time_asc", Name: "时间由远到近", }, } r.PrinterList = make([]md.NewSelectList, 0) for _, v := range printer { var tmp = md.NewSelectList{ Key: utils.IntToStr(v.Id), Name: v.Name, } r.PrinterList = append(r.PrinterList, tmp) } e.OutSuc(c, r, nil) return } // 明细 func PrinterIndexRecordList(c *gin.Context) { var search md.RecordRequest if err := c.ShouldBindJSON(&search); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } engine := MasterDb(c) if engine == nil { e.OutErr(c, e.ERR_MASTER_ID, nil) return } user := GetUser(c) search.StoreId = utils.IntToStr(user.Info.Uid) list, err := db.GetPrinterRecordList(engine, &search) if err != nil { e.OutErr(c, e.ERR_BAD_REQUEST, err) return } if list == nil { list = make([]md.RecordResList, 0) } var stateArr = []string{"正在打印", "打印成功", "打印失败"} var ordTypeArr = []string{"聚合收款订单", "外卖订单", "到店订单", "聚合收款订单"} for k, v := range list { State := utils.StrToInt(v.State) list[k].StateStr = stateArr[State] OrdType := utils.StrToInt(v.OrdType) list[k].OrdTypeStr = ordTypeArr[OrdType] list[k].Title = "#" + v.Id + " " + ordTypeArr[OrdType] if v.OrdId == "XXX" { list[k].Title = "#" + v.Id + " 测试" } list[k].PrintContent = strings.ReplaceAll(v.PrintContent, "
", "\n") list[k].PrintContent = strings.ReplaceAll(list[k].PrintContent, "", "<二维码标签左>") list[k].PrintContent = strings.ReplaceAll(list[k].PrintContent, "", "<二维码标签右>") } e.OutSuc(c, &list, nil) return } func PrinterIndexToSend(c *gin.Context) { var search md.IndexTestRequest if err := c.ShouldBindJSON(&search); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } user := GetUser(c) search.StoreId = utils.IntToStr(user.Info.Uid) // 加锁 防止并发 mutexKey := fmt.Sprintf("%s:printer_send:p%ss%s", c.GetString("mid"), search.PrinterId, search.StoreId) withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX") if err != nil { e.OutErr(c, e.ERR, err) return } if withdrawAvailable != "OK" { e.OutErr(c, e.ERR, e.NewErr(400000, "操作过于频繁,请稍后再试")) return } eg := MasterDb(c) printerOne, _ := db.GetPrinterIndexById(eg, search.PrinterId, search.StoreId) if printerOne.Id == 0 { e.OutErr(c, 400, e.NewErr(400, "打印机不存在")) return } if printerOne.ModuleId == 0 { e.OutErr(c, 400, e.NewErr(400, "请选择打印模板")) return } ord := make(map[string]string, 0) ord["name"] = "XXX" ord["payment"] = "XXX" ord["phone"] = "XXX" ord["address"] = "XXX" ord["main_ord_id"] = "XXX" ord["num"] = "XXX" ord["table_num"] = "XXX" ord["store_name"] = "XXX" ord["store_qrcode_url"] = getStoreUrl(c, search.StoreId, "") ord["qrcode_url"] = getDownUrl(c, "") goodsInfo := make([]map[string]string, 0) one := map[string]string{ "name": "测试", "price": "10", "num": "1", "prices": "10", } goodsInfo = append(goodsInfo, one) var args = &md.PrinterRequest{ StoreId: search.StoreId, PrinterId: search.PrinterId, MasterId: c.GetString("mid"), Ord: ord, GoodsInfo: goodsInfo, } ReplaceOne(c, args) e.OutSuc(c, "success", nil) return } // 处理订单打印内容 func ReplacePrinterContent(c *gin.Context) { var maps map[string]string if err := c.ShouldBindJSON(&maps); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } mainOrdId := maps["main_ord_id"] // 加锁 防止并发 mutexKey := fmt.Sprintf("%s:printer_content:%s", c.GetString("mid"), mainOrdId) withdrawAvailable, err := cache.Do("SET", mutexKey, 1, "EX", 5, "NX") if err != nil { e.OutErr(c, e.ERR, err) return } if withdrawAvailable != "OK" { e.OutErr(c, e.ERR, e.NewErr(400000, "操作过于频繁,请稍后再试")) return } engine := MasterDb(c) storeId, ord, goodsInfo, err := CommGetPrinterContent(c, mainOrdId) if err != nil { e.OutErr(c, 400, err) return } //打印操作 go ReplaceDoing(c, engine, storeId, ord, goodsInfo) e.OutSuc(c, "success", nil) return } func CommGetPrinterContent(c *gin.Context, mainOrdId string) (int, map[string]string, []map[string]string, error) { var storeId int ord := make(map[string]string, 0) var goodsInfo = make([]map[string]string, 0) engine := MasterDb(c) mainOrd := db.GetOrderByOid(engine, mainOrdId) if mainOrd == nil { return storeId, ord, goodsInfo, e.NewErr(400, "未查询到订单!") } ordItem := db.GetOrderInfoAllEg(engine, mainOrdId) if ordItem == nil { return storeId, ord, goodsInfo, e.NewErr(400, "未查询到订单!") } //查出订单id storeId = mainOrd.StoreUid ord["name"] = mainOrd.BuyName ord["phone"] = mainOrd.BuyPhone ord["address"] = mainOrd.Address ord["main_ord_id"] = utils.Int64ToStr(mainOrd.Oid) ord["order_type"] = "2" if mainOrd.Code != "" { ord["num"] = mainOrd.Code } if mainOrd.TableNum != "" { ord["table_num"] = mainOrd.TableNum } var storeInfo model.CommunityTeamStore engine.Where("uid = ?", storeId).Get(&storeInfo) ord["store_name"] = storeInfo.Name userProfile, _ := db.UserProfileFindByID(engine, storeId) inviteCode := "" if userProfile != nil && userProfile.Uid > 0 { inviteCode = userProfile.InviteCode } ord["qrcode_url"] = getDownUrl(c, inviteCode) ord["store_qrcode_url"] = getStoreUrl(c, utils.IntToStr(storeId), inviteCode) //查出对应商品的信息 var payment float64 = 0 for _, v := range *ordItem { one := map[string]string{ "name": v.Title, "price": utils.Float64ToStr(utils.FloatFormat(utils.StrToFloat64(v.Price)/float64(v.Num), 2)), "num": utils.IntToStr(v.Num), "prices": v.Price, } payment += utils.StrToFloat64(v.Price) one["sku_text"] = "" skuText := make([]map[string]string, 0) json.Unmarshal([]byte(v.SkuInfo), &skuText) if len(skuText) > 0 { skuText1 := "" for _, v1 := range skuText { skuText1 += v1["name"] + ":" + v1["value"] + " " } one["sku_text"] = skuText1 } goodsInfo = append(goodsInfo, one) } payment = utils.FloatFormat(payment, 2) ord["payment"] = utils.Float64ToStr(payment) return storeId, ord, goodsInfo, nil } // 替换打印 func ReplaceDoing(c *gin.Context, eg *xorm.Engine, storeId int, ord map[string]string, goodsInfo []map[string]string) { var args = &md.PrinterRequest{ StoreId: utils.IntToStr(storeId), PrinterId: "", MasterId: c.GetString("mid"), Ord: ord, GoodsInfo: goodsInfo, } ReplaceMore(c, args) } func getDownUrl(c *gin.Context, inviteCode string) string { downLoadRoute := "/#/zy-landing-page/pages/lading-page-download/lading-page-download?invited_code=" + inviteCode h5Domain := GetWebSiteDomainInfo(c, "wap") shareUrl := h5Domain + downLoadRoute //判断生成短链 shareUrl = CommShareShorUrl(c, shareUrl) return shareUrl } func getStoreUrl(c *gin.Context, storeId, invitedCode string) string { downLoadRoute := "%s/#/zy-o2o-base/pages/store-page/store-page?id=%s&invited_code=%s" h5Domain := GetWebSiteDomainInfo(c, "wap") shareUrl := fmt.Sprintf(downLoadRoute, h5Domain, storeId, invitedCode) //判断生成短链 shareUrl = CommShareShorUrl(c, shareUrl) return shareUrl } func CommShareShorUrl(c *gin.Context, shareUrl string) string { val := SysCfgFind(c, "share_link_type") if val["share_link_type"] == "1" { //百度短链 shareUrl, _ = ShortenUrl(shareUrl) } else if val["share_link_type"] == "2" { //快站短链 shareUrl = KuaiZhanShortURL(c, shareUrl) } return shareUrl } func PrinterIndexCheck(c *gin.Context) { var maps map[string]string if err := c.ShouldBindJSON(&maps); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } mainOrdId := maps["main_ord_id"] engine := MasterDb(c) storeId, ord, goodsInfo, err := CommGetPrinterContent(c, mainOrdId) if err != nil { e.OutErr(c, 400, err) return } printerOne, _ := db.GetPrinterIndexByBluetooth(engine, utils.IntToStr(storeId)) var res = map[string]interface{}{ "is_has_bluetooth": "0", "content": "", } if printerOne != nil { res["is_has_bluetooth"] = "1" } var args = &md.PrinterRequest{ StoreId: utils.IntToStr(storeId), PrinterId: "", MasterId: c.GetString("mid"), Ord: ord, GoodsInfo: goodsInfo, } res["content"] = GetReplaceContent(c, args) e.OutSuc(c, res, nil) return }