From 298615fa3b686ac320e41daef40124f9b279e278 Mon Sep 17 00:00:00 2001 From: huangjiajun <582604932@qq.com> Date: Mon, 28 Oct 2024 13:34:33 +0800 Subject: [PATCH] 1 --- app/db/db_printer_detail.go | 29 + app/db/db_printer_list.go | 188 ++++++ app/db/db_printer_module.go | 60 ++ app/db/model/community_team_store_printer.go | 19 + .../community_team_store_printer_detail.go | 21 + .../community_team_store_printer_module.go | 14 + app/hdl/hdl_printer_list.go | 65 ++ app/hdl/hdl_store_index.go | 58 ++ app/md/o2o_printer.go | 113 ++++ app/md/printer.go | 29 + app/router/router.go | 16 + app/svc/shorten_url.go | 62 ++ app/svc/svc_printer.go | 283 +++++++++ app/svc/svc_printer_list.go | 560 ++++++++++++++++++ app/svc/svc_replace_printer_content.go | 240 ++++++++ app/svc/svc_store.go | 2 + app/svc/svc_store_order.go | 26 + 17 files changed, 1785 insertions(+) create mode 100644 app/db/db_printer_detail.go create mode 100644 app/db/db_printer_list.go create mode 100644 app/db/db_printer_module.go create mode 100644 app/db/model/community_team_store_printer.go create mode 100644 app/db/model/community_team_store_printer_detail.go create mode 100644 app/db/model/community_team_store_printer_module.go create mode 100644 app/hdl/hdl_printer_list.go create mode 100644 app/hdl/hdl_store_index.go create mode 100644 app/md/o2o_printer.go create mode 100644 app/md/printer.go create mode 100644 app/svc/shorten_url.go create mode 100644 app/svc/svc_printer.go create mode 100644 app/svc/svc_printer_list.go create mode 100644 app/svc/svc_replace_printer_content.go diff --git a/app/db/db_printer_detail.go b/app/db/db_printer_detail.go new file mode 100644 index 0000000..d639e0f --- /dev/null +++ b/app/db/db_printer_detail.go @@ -0,0 +1,29 @@ +package db + +import ( + "applet/app/db/model" + "xorm.io/xorm" +) + +func DetailInsert(Db *xorm.Engine, data *model.CommunityTeamStorePrinterDetail) (int64, error) { + affected, err := Db.InsertOne(data) + if err != nil { + return 0, err + } + return affected, nil +} +func DetailUpdate(Db *xorm.Engine, id interface{}, data *model.CommunityTeamStorePrinterDetail, forceColums ...string) (int64, error) { + var ( + affected int64 + err error + ) + if forceColums != nil { + affected, err = Db.Where("id=?", id).Cols(forceColums...).Update(data) + } else { + affected, err = Db.Where("id=?", id).Update(data) + } + if err != nil { + return 0, err + } + return affected, nil +} diff --git a/app/db/db_printer_list.go b/app/db/db_printer_list.go new file mode 100644 index 0000000..8f4b367 --- /dev/null +++ b/app/db/db_printer_list.go @@ -0,0 +1,188 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/md" + "applet/app/utils" + "applet/app/utils/logx" + "time" + "xorm.io/xorm" +) + +func GetPrinterIndexAll(Db *xorm.Engine, storeId string) ([]model.CommunityTeamStorePrinter, error) { + var list []model.CommunityTeamStorePrinter + session := Db.Where("store_id= ? ", storeId) + //排序 + err := session.Desc("create_time").Find(&list) + if err != nil { + return nil, err + } + return list, err +} +func GetPrinterIndexById(Db *xorm.Engine, id, storeId string) (*model.CommunityTeamStorePrinter, error) { + var list model.CommunityTeamStorePrinter + session := Db.Where("id=? and store_id=?", id, storeId) + //排序 + has, err := session.Desc("create_time").Get(&list) + if has == false || err != nil { + return nil, err + } + return &list, err +} + +func GetPrinterIndexByBluetooth(Db *xorm.Engine, storeId string) (*model.CommunityTeamStorePrinter, error) { + var list model.CommunityTeamStorePrinter + session := Db.Where("type=? and store_id=?", "bluetooth", storeId) + //排序 + has, err := session.Desc("create_time").Get(&list) + if has == false || err != nil { + return nil, err + } + return &list, err +} + +// 分页查询方案 +func GetPrinterIndexList(Db *xorm.Engine, parameter *md.IndexRequest) ([]md.IndexResList, error) { + var list []model.CommunityTeamStorePrinter + var webList []md.IndexResList + + session := Db.Where("store_id= ? ", parameter.StoreId) + //分页 + if utils.StrToInt(parameter.P) > 0 && utils.StrToInt(parameter.PageSize) > 0 { + session = session.Limit(utils.StrToInt(parameter.PageSize), (utils.StrToInt(parameter.P)-1)*utils.StrToInt(parameter.PageSize)) + } + //排序 + err := session.Desc("create_time").Find(&list) + if err != nil { + return nil, err + } + var typeList = map[string]string{ + "ordinary": "普通打印机", + "cloud": "云打印机", + "bluetooth": "蓝牙打印机", + } + var locationTypeList = map[string]string{ + "reception": "前台", + "kitchen": "后厨", + } + for _, v := range list { + var tmp = md.IndexResList{ + Id: utils.IntToStr(v.Id), + Name: v.Name, + IsUse: utils.IntToStr(v.IsUse), + StoreId: utils.IntToStr(v.StoreId), + SnNum: v.SnNum, + IdentificationCode: v.IdentificationCode, + ModuleId: utils.IntToStr(v.ModuleId), + Type: v.Type, + TypeStr: typeList[v.Type], + LocationType: v.LocationType, + LocationTypeStr: locationTypeList[v.LocationType], + } + webList = append(webList, tmp) + } + return webList, nil +} + +func indexGetCount(Db *xorm.Engine, parameter *md.IndexRequest) int { + var ord model.CommunityTeamStorePrinter + session := Db.Where("store_id= ? ", parameter.StoreId) + count, err := session.Count(&ord) + if err != nil { + return 0 + } + return int(count) +} +func IndexExists(Db *xorm.Engine, parameter *md.IndexSaveRequest) int { + var ord model.CommunityTeamStorePrinter + session := Db.Where("sn_num= ? ", parameter.SnNum) + count, err := session.Count(&ord) + if err != nil { + return 0 + } + return int(count) +} +func IndexById(Db *xorm.Engine, parameter *md.IndexSaveRequest) (*model.CommunityTeamStorePrinter, error) { + var ord model.CommunityTeamStorePrinter + session := Db.Where("id= ? ", parameter.Id) + _, err := session.Get(&ord) + return &ord, err +} + +// 写入数据 +func IndexInsert(eg *xorm.Engine, m *model.CommunityTeamStorePrinter) (int64, error) { + if m.Id > 0 { //编辑 + id, err := IndexUpdate(eg, m, "type,is_use,sn_num,identification_code,name,update_time,location_type") + if id == 0 || err != nil { + return 0, logx.Warn("cannot insert data :", err) + } + return id, nil + } + m.CreateTime = time.Now() + //写入 + id, err := eg.InsertOne(m) + if id == 0 || err != nil { + return 0, logx.Warn("cannot insert data :", err) + } + return id, nil +} + +// 修改数据 +func IndexUpdate(eg *xorm.Engine, m *model.CommunityTeamStorePrinter, cols ...string) (int64, error) { + update, err := eg.ID(m.Id).Cols(cols...).Update(m) + if err != nil || update == 0 { + return int64(m.Id), err + } + return int64(m.Id), nil + +} + +// 分页查询打印明细 +func GetPrinterRecordList(Db *xorm.Engine, parameter *md.RecordRequest) ([]md.RecordResList, error) { + var list []model.CommunityTeamStorePrinterDetail + var webList []md.RecordResList + session := Db.Where("store_id >0 and store_id=?", parameter.StoreId) + if utils.StrToInt(parameter.PrinterId) > 0 { + session.And("printer_id=? ", parameter.PrinterId) + } + if parameter.StartTime != "" { + session.And("create_time>=? ", parameter.StartTime) + } + if parameter.EndTime != "" { + session.And("create_time<=? ", parameter.EndTime) + } + //分页 + if utils.StrToInt(parameter.P) > 0 && utils.StrToInt(parameter.PageSize) > 0 { + session = session.Limit(utils.StrToInt(parameter.PageSize), (utils.StrToInt(parameter.P)-1)*utils.StrToInt(parameter.PageSize)) + } + //排序 + if parameter.Sort == "printer_time_desc" { + session.Desc("create_time") + } else if parameter.Sort == "printer_time_asc" { + session.Asc("create_time") + } else { + session.Desc("id") + } + //排序 + err := session.Find(&list) + if err != nil { + return nil, err + } + for _, v := range list { + + var tmp = md.RecordResList{ + Id: utils.IntToStr(v.Id), + OrdId: v.OrdId, + OrdType: utils.IntToStr(v.OrdType), + PrintContent: v.PrintContent, + State: utils.IntToStr(v.State), + PrintTime: v.PrintTime.Format("2006-01-02 15:04:05"), + CreateTime: v.CreateTime.Format("2006-01-02 15:04:05"), + } + if tmp.PrintTime == "0001-01-01 00:00:00" { + tmp.PrintTime = "" + } + webList = append(webList, tmp) + } + return webList, nil +} diff --git a/app/db/db_printer_module.go b/app/db/db_printer_module.go new file mode 100644 index 0000000..1c42edc --- /dev/null +++ b/app/db/db_printer_module.go @@ -0,0 +1,60 @@ +package db + +import ( + "applet/app/db/model" + "applet/app/md" + "applet/app/utils" + "xorm.io/xorm" +) + +// 查询所有的模板 +func GetAllPrinterModuleList(Db *xorm.Engine) ([]model.CommunityTeamStorePrinterModule, error) { + var list []model.CommunityTeamStorePrinterModule + err := Db.Desc("create_time").Find(&list) + if err != nil { + return nil, err + } + return list, nil +} +func GetAllPrinterModuleListByModuleId(Db *xorm.Engine, moduleIds []int) ([]model.CommunityTeamStorePrinterModule, error) { + var list []model.CommunityTeamStorePrinterModule + err := Db.In("id", moduleIds).Find(&list) + if err != nil { + return nil, err + } + return list, nil +} + +func GetAllPrinterModuleListByModuleIdOne(Db *xorm.Engine, moduleId int) (*model.CommunityTeamStorePrinterModule, error) { + var list model.CommunityTeamStorePrinterModule + has, err := Db.Where("id=?", moduleId).Get(&list) + if has == false || err != nil { + return nil, err + } + return &list, nil +} + +// 分页查询方案 +func GetPrinterModuleList(Db *xorm.Engine, parameter *md.IndexRequest) ([]md.ModuleResList, error) { + var list []model.CommunityTeamStorePrinterModule + var webList []md.ModuleResList + session := Db.Where("is_use= 1 ") + //分页 + if utils.StrToInt(parameter.P) > 0 && utils.StrToInt(parameter.PageSize) > 0 { + session = session.Limit(utils.StrToInt(parameter.PageSize), (utils.StrToInt(parameter.P)-1)*utils.StrToInt(parameter.PageSize)) + } + //排序 + err := session.Desc("create_time").Find(&list) + if err != nil { + return nil, err + } + for _, v := range list { + var tmp = md.ModuleResList{ + Id: utils.IntToStr(v.Id), + Name: v.Name, + Content: v.Content, + } + webList = append(webList, tmp) + } + return webList, nil +} diff --git a/app/db/model/community_team_store_printer.go b/app/db/model/community_team_store_printer.go new file mode 100644 index 0000000..e1f5104 --- /dev/null +++ b/app/db/model/community_team_store_printer.go @@ -0,0 +1,19 @@ +package model + +import ( + "time" +) + +type CommunityTeamStorePrinter struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + StoreId int `json:"store_id" xorm:"not null comment('店铺id') INT(11)"` + SnNum string `json:"sn_num" xorm:"not null comment('打印机SN编号') VARCHAR(255)"` + IdentificationCode string `json:"identification_code" xorm:"not null comment('打印机识别码') VARCHAR(255)"` + Name string `json:"name" xorm:"not null comment('打印机名字') VARCHAR(255)"` + ModuleId int `json:"module_id" xorm:"comment('打印模版id') INT(11)"` + IsUse int `json:"is_use" xorm:"not null comment('是否使用') TINYINT(1)"` + CreateTime time.Time `json:"create_time" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` + UpdateTime time.Time `json:"update_time" xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` + Type string `json:"type" xorm:"not null default 'ordinary' comment('打印机类型 ordinary普通打印机 cloud云打印机') VARCHAR(255)"` + LocationType string `json:"location_type" xorm:"not null default '' comment('打印机位置') VARCHAR(255)"` +} diff --git a/app/db/model/community_team_store_printer_detail.go b/app/db/model/community_team_store_printer_detail.go new file mode 100644 index 0000000..02e6109 --- /dev/null +++ b/app/db/model/community_team_store_printer_detail.go @@ -0,0 +1,21 @@ +package model + +import ( + "time" +) + +type CommunityTeamStorePrinterDetail struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键id') INT(11)"` + OrdId string `json:"ord_id" xorm:"not null comment('订单id') VARCHAR(255)"` + OrdType int `json:"ord_type" xorm:"not null comment('订单类型') INT(11)"` + PrinterId int `json:"printer_id" xorm:"not null comment('打印机id') INT(11)"` + PrinterModuleId int `json:"printer_module_id" xorm:"not null comment('模版id') INT(11)"` + PrintContent string `json:"print_content" xorm:"not null comment('打印内容') TEXT"` + FailMsg string `json:"fail_msg" xorm:"not null comment('打印失败原因') TEXT"` + PrinterOid string `json:"printer_oid" xorm:"not null comment('打印订单号') VARCHAR(255)"` + State int `json:"state" xorm:"not null comment('状态') INT(11)"` + StoreId int `json:"store_id" xorm:"not null comment('店铺id') INT(11)"` + PrintTime time.Time `json:"print_time" xorm:"comment('打印时间') DATETIME"` + CreateTime time.Time `json:"create_time" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` + UpdateTime time.Time `json:"update_time" xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` +} diff --git a/app/db/model/community_team_store_printer_module.go b/app/db/model/community_team_store_printer_module.go new file mode 100644 index 0000000..129c3bf --- /dev/null +++ b/app/db/model/community_team_store_printer_module.go @@ -0,0 +1,14 @@ +package model + +import ( + "time" +) + +type CommunityTeamStorePrinterModule struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Name string `json:"name" xorm:"not null comment('模版名称') VARCHAR(255)"` + IsUse int `json:"is_use" xorm:"not null comment('是否使用') TINYINT(1)"` + Content string `json:"content" xorm:"not null comment('模版内容') TEXT"` + CreateTime time.Time `json:"create_time" xorm:"not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` + UpdateTime time.Time `json:"update_time" xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` +} diff --git a/app/hdl/hdl_printer_list.go b/app/hdl/hdl_printer_list.go new file mode 100644 index 0000000..3646420 --- /dev/null +++ b/app/hdl/hdl_printer_list.go @@ -0,0 +1,65 @@ +package hdl + +import ( + "applet/app/e" + "applet/app/svc" + "github.com/gin-gonic/gin" +) + +func PrinterCateList(c *gin.Context) { + svc.PrinterCateList(c) +} +func PrinterLocationList(c *gin.Context) { + svc.PrinterLocationList(c) +} + +// 打印机 +func PrinterIndex(c *gin.Context) { + svc.PrinterIndexList(c) +} + +// 模板列表 +func PrinterModule(c *gin.Context) { + svc.PrinterModuleList(c) +} + +// 保存 +func PrinterIndexSave(c *gin.Context) { + svc.PrinterIndexSave(c) +} + +// 保存模板id +func PrinterIndexModuleSave(c *gin.Context) { + svc.PrinterIndexModuleSave(c) +} + +// 使用状态保存 +func PrinterIndexStateSave(c *gin.Context) { + svc.PrinterIndexStateSave(c) +} + +// 删除接口 +func PrinterIndexDel(c *gin.Context) { + var idsMap map[string]string + if err := c.ShouldBindJSON(&idsMap); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + svc.PrinterDelIndex(c, idsMap["id"], idsMap["store_id"]) +} + +// 明细 +func PrinterIndexRecord(c *gin.Context) { + svc.PrinterIndexRecordList(c) +} + +// 明细筛选 +func PrinterIndexRecordScreen(c *gin.Context) { + svc.PrinterIndexRecordScreen(c) +} +func PrinterIndexToSend(c *gin.Context) { + svc.PrinterIndexToSend(c) +} +func PrinterIndexCheck(c *gin.Context) { + svc.PrinterIndexCheck(c) +} diff --git a/app/hdl/hdl_store_index.go b/app/hdl/hdl_store_index.go new file mode 100644 index 0000000..89a3ea3 --- /dev/null +++ b/app/hdl/hdl_store_index.go @@ -0,0 +1,58 @@ +package hdl + +import ( + "applet/app/db" + "applet/app/e" + "applet/app/svc" + "applet/app/utils" + "fmt" + "github.com/gin-gonic/gin" +) + +func StoreIndexTotal(c *gin.Context) { + var arg map[string]string + if err := c.ShouldBindJSON(&arg); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS, err) + return + } + user := svc.GetUser(c) + stime, etime := svc.GetDate(c, arg) + sql := `select SUM(amount-agent_commission-platform_commission) AS money,SUM(amount) AS amount,SUM(commission) AS commission,SUM(IF(state=3,1,0)) as count,SUM(IF(state in(1,2),1,0)) as success_count, + SUM(IF(state=1,1,0)) as wait_count + from community_team_order + where %s +` + where := "store_uid=" + utils.IntToStr(user.Info.Uid) + " and state>0" + wherePay := where + " and create_at>='" + stime.Format("2006-01-02 15:04:05") + "' and create_at<'" + etime.Format("2006-01-02 15:04:05") + "'" + sqlPay := fmt.Sprintf(sql, wherePay) + nativeString, _ := db.QueryNativeString(svc.MasterDb(c), sqlPay) + amount := "0" + money := "0" + commission := "0" + count := "0" + successCount := "0" + waitCount := "0" + for _, v := range nativeString { + amount = v["amount"] + money = v["money"] + commission = v["commission"] + count = v["count"] + successCount = v["success_count"] + waitCount = v["wait_count"] + } + store := db.GetStoreIdEg(svc.MasterDb(c), utils.IntToStr(user.Info.Uid)) + tmp := []map[string]string{ + {"name": "营业总额", "value": svc.GetCommissionPrec(c, amount, "2", "1")}, + } + if store.StoreType == 0 { + tmp = append(tmp, map[string]string{"name": "佣金收益", "value": svc.GetCommissionPrec(c, commission, "2", "1")}) + } + if store.StoreType > 0 { + tmp = append(tmp, map[string]string{"name": "订单收益", "value": svc.GetCommissionPrec(c, money, "2", "1")}) + } + tmp = append(tmp, map[string]string{"name": "已付款订单量", "value": successCount}) + tmp = append(tmp, map[string]string{"name": "已取消订单量", "value": count}) + tmp = append(tmp, map[string]string{"name": "待提货订单量", "value": waitCount}) + e.OutSuc(c, tmp, nil) + return +} diff --git a/app/md/o2o_printer.go b/app/md/o2o_printer.go new file mode 100644 index 0000000..8202c89 --- /dev/null +++ b/app/md/o2o_printer.go @@ -0,0 +1,113 @@ +package md + +// 模板列表请求参数 +type ModuleRequest struct { + Name string `json:"name"` //名称 + IsUse string `json:"is_use"` //是否使用(否:0;是:1) + P string `json:"p"` + PageSize string `json:"page_size"` //页大小 + +} + +// 模板列表请求参数 +type ModuleSaveRequest struct { + Name string `json:"name"` //名称 + IsUse string `json:"is_use"` //是否使用(否:0;是:1) + Id string `json:"id"` // + Content string `json:"content"` // +} + +// 打印机列表请求参数 +type IndexSaveRequest struct { + Id string `json:"id"` // + StoreId string `json:"store_id" ` + SnNum string `json:"sn_num" ` + IdentificationCode string `json:"identification_code" ` + Name string `json:"name"` + ModuleId string `json:"module_id" ` + IsUse string `json:"is_use" ` + Type string `json:"type"` + LocationType string `json:"location_type"` +} + +// 打印机列表请求参数 +type IndexRequest struct { + StoreId string `json:"store_id"` //店铺id + P string `json:"p"` + PageSize string `json:"size"` //页大小 + +} + +// 打印机测试打印请求参数 +type IndexTestRequest struct { + StoreId string `json:"store_id"` //店铺id + PrinterId string `json:"printer_id"` //打印机id +} + +// 打印机明细请求参数 +type RecordRequest struct { + StoreId string `json:"store_id"` //店铺id + PrinterId string `json:"printer_id"` //打印机id + StartTime string `json:"start_time"` //打印开始时间 + EndTime string `json:"end_time"` //打印结束时间 + P string `json:"p"` + PageSize string `json:"size"` //页大小 + Sort string `json:"sort"` +} + +// 打印机列表返回数据 +type IndexResList struct { + Id string `json:"id"` + Name string `json:"name"` + IsUse string `json:"is_use"` + StoreId string `json:"store_id" ` + ModuleId string `json:"module_id" ` + ModuleStr string `json:"module_str" ` + UseStr string `json:"use_str" ` + SnNum string `json:"sn_num" ` + IdentificationCode string `json:"identification_code" ` + Content string `json:"content" ` + Img string `json:"img" ` + TypeStr string `json:"type_str"` + Type string `json:"type"` + LocationTypeStr string `json:"location_type_str"` + LocationType string `json:"location_type"` +} + +// 打印机模板返回数据 +type ModuleResList struct { + Id string `json:"id"` + Name string `json:"name"` + Content string `json:"content"` +} + +// 打印机列表返回数据 +type RecordResList struct { + Id string `json:"id"` + OrdId string `json:"ord_id"` + OrdType string `json:"ord_type"` + Title string `json:"title" ` + PrintContent string `json:"print_content" ` + State string `json:"state" ` + PrintTime string `json:"print_time" ` + CreateTime string `json:"create_time"` + OrdTypeStr string `json:"ord_type_str"` + StateStr string `json:"state_str"` +} + +type RecordPrinterScreen struct { + TimeSort []NewSelectList `json:"time_sort"` + PrinterList []NewSelectList `json:"printer_list"` +} + +type PrinterRequest struct { + StoreId string `json:"store_id"` + PrinterId string `json:"printer_id"` + MasterId string `json:"master_id"` + Ord map[string]string `json:"ord"` + GoodsInfo []map[string]string `json:"goods_info"` +} +type NewSelectList struct { + Key string `json:"key"` + Name string `json:"name"` +} diff --git a/app/md/printer.go b/app/md/printer.go new file mode 100644 index 0000000..4cd87f5 --- /dev/null +++ b/app/md/printer.go @@ -0,0 +1,29 @@ +package md + +type PrinterReq struct { + Sn string `json:"sn"` + Key string `json:"key"` + Remark string `json:"remark"` + PhoneNum string `json:"phone_num"` + Content string `json:"content"` + Name string `json:"name"` + Oid string `json:"oid"` + PrinterType string `json:"printer_type"` +} + +type AddPrinterResult struct { + Data struct { + No []string `json:"no"` + Ok []string `json:"ok"` + } `json:"data"` + Msg string `json:"msg"` + Ret int64 `json:"ret"` + ServerExecutedTime int64 `json:"serverExecutedTime"` +} + +type PrinterStateResult struct { + Data interface{} `json:"data"` + Msg string `json:"msg"` + Ret int64 `json:"ret"` + ServerExecutedTime int64 `json:"serverExecutedTime"` +} diff --git a/app/router/router.go b/app/router/router.go index d4dfda2..cc82c17 100644 --- a/app/router/router.go +++ b/app/router/router.go @@ -187,4 +187,20 @@ func routeCommunityTeam(r *gin.RouterGroup) { r.POST("/store/order/detail", hdl.StoreOrderDetail) r.POST("/store/order/confirm", hdl.StoreOrderConfirm) r.GET("/store/order/cate", hdl.StoreOrderCate) + + r.POST("/store/index/total", hdl.StoreIndexTotal) + + r.GET("/printer/cate/list", hdl.PrinterCateList) //打印机类型列表 + r.GET("/printer/location/list", hdl.PrinterLocationList) //打印机位置列表 + r.POST("/printer/list", hdl.PrinterIndex) //打印机列表 + r.POST("/printer/save", hdl.PrinterIndexSave) //打印机添加编辑 + r.POST("/printer/del", hdl.PrinterIndexDel) //打印机删除 + r.POST("/printer/module/list", hdl.PrinterModule) //打印机模板 + r.POST("/printer/module/save", hdl.PrinterIndexModuleSave) //打印机模板选择 + r.POST("/printer/use/save", hdl.PrinterIndexStateSave) //打印机使用状态调整 + r.POST("/printer/record/list", hdl.PrinterIndexRecord) //打印机明细 + r.POST("/printer/record/screen", hdl.PrinterIndexRecordScreen) //打印机筛选 + r.POST("/printer/send", hdl.PrinterIndexToSend) //打印机测试 + r.POST("/printer/check", hdl.PrinterIndexCheck) //订 + } diff --git a/app/svc/shorten_url.go b/app/svc/shorten_url.go new file mode 100644 index 0000000..c6bf750 --- /dev/null +++ b/app/svc/shorten_url.go @@ -0,0 +1,62 @@ +package svc + +import ( + "applet/app/lib/zhimeng" + "encoding/json" + "github.com/gin-gonic/gin" + "github.com/tidwall/gjson" + + "applet/app/utils" + "applet/app/utils/logx" +) + +var DWZ_TOKEN = "eecdf4b18f416b0cf26fef98f7e1f4ff" + +// KuaiZhanShortURL is 快站短链 +func KuaiZhanShortURL(c *gin.Context, url string) string { + args := map[string]interface{}{ + "appkey": SysCfgGet(c, "third_zm_app_key"), + "secret_key": SysCfgGet(c, "third_zm_app_key"), + "url": utils.Base64StdEncode(url), + } + resp, err := zhimeng.Send("kuaizhan", "short_url", args) + if err != nil { + return "" + } + kurl := gjson.GetBytes(resp, "data.shortUrl").String() + if kurl == "" { + kurl = url + } + return kurl +} + +func ShortenUrl(url string) (string, error) { + host := "https://dwz.cn/admin/v2/create" + args := map[string]string{ + "Url": url, + "TermOfValidity": "1-year", + } + + resp, err := utils.CurlPost(host, utils.Serialize(args), map[string]string{ + "Content-Type": "application/json", + "Token": DWZ_TOKEN, + }) + // {"Code":0,"IsNew":true,"ShortUrl":"https://dwz.cn/4kSgiKVl","LongUrl":"https://open.taobao.com/search.htm?q=taobao.tbk.sc.material","ErrMsg":""} + if err != nil { + return "", logx.Warn(err) + } + var tmp struct { + Code int `json:"Code"` + IsNew bool `json:"IsNew"` + ShortURL string `json:"ShortUrl"` + LongURL string `json:"LongUrl"` + ErrMsg string `json:"ErrMsg"` + } + if err = json.Unmarshal(resp, &tmp); err != nil { + return url, logx.Warn("resp: " + string(resp) + ", err:" + err.Error()) + } + if tmp.ShortURL == "" { + tmp.ShortURL = url + } + return tmp.ShortURL, nil +} diff --git a/app/svc/svc_printer.go b/app/svc/svc_printer.go new file mode 100644 index 0000000..0e6e92a --- /dev/null +++ b/app/svc/svc_printer.go @@ -0,0 +1,283 @@ +package svc + +import ( + "applet/app/e" + "applet/app/md" + "applet/app/utils" + "crypto/sha1" + "encoding/hex" + "encoding/json" + "fmt" + "github.com/gin-gonic/gin" + "github.com/syyongx/php2go" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "strings" + "time" +) + +var ( + USER = "1157453392@qq.com" //必填,飞鹅云后台注册的账号名 + UKEY = "apXI36MYv6rkY8ft" //必填,飞鹅云后台注册账号后生成的UKEY + //SN = "xxxxxxxxx" //必填,打印机编号,必须要在管理后台里手动添加打印机或者通过API添加之后,才能调用API + + URL = "http://api.feieyun.cn/Api/Open/" //不需要修改 +) + +// 添加打印机 +func AddPrinter(c *gin.Context, args md.PrinterReq) error { + //提示:打印机编号(必填) # 打印机识别码(必填) # 备注名称(选填) # 流量卡号码(选填),多台打印机请换行(\n)添加新打印机信息,每次最多100行(台)。 + if args.PrinterType == "cloud" { //云打印 + //AddCloudPrinter(c, args) + } else { + //拼接参数 + snList := fmt.Sprintf("%s#%s#%s", args.Sn, args.Key, args.Remark) + //请求接口 + postValues := url.Values{} + postValues.Add("apiname", "Open_printerAddlist") //固定 + postValues.Add("printerContent", snList) //打印机 + data := post(postValues) + fmt.Println(data) + var res md.AddPrinterResult + err := json.Unmarshal([]byte(data), &res) + if err != nil { + return e.NewErr(400, "添加失败") + } + //处理错误信息 + if len(res.Data.No) > 0 { + msg := res.Data.No[0] + msgArr := strings.Split(msg, " ") + msg = "" + if len(msgArr) > 0 { + msg = msgArr[1] + } + //被添加过的 默认成功 + if strings.Contains(msg, "已被添加过") { + e.OutSuc(c, "success", nil) + return nil + } + return e.NewErr(400, "添加失败,"+msg) + } + return nil + } + return nil + +} + +// 打印机状态 +func PrinterState(c *gin.Context) { + var args md.PrinterReq + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + if args.PrinterType == "cloud" { //云打印 + //GetPrinterStatus(c, args) + } else { + //调用接口 + postValues := url.Values{} + postValues.Add("apiname", "Open_queryPrinterStatus") //固定 + postValues.Add("sn", args.Sn) //打印机编号 + data := post(postValues) + fmt.Println(data) + var res md.PrinterStateResult + err := json.Unmarshal([]byte(data), &res) + //处理返回信息 + r := make(map[string]string, 0) + if err != nil { + r["state"] = "0" + r["msg"] = err.Error() + } + if res.Ret != 0 { + r["state"] = "0" + r["msg"] = res.Msg + } + data1 := utils.AnyToString(res.Data) + r["msg"] = data1 + if strings.Contains(data, "离线") { + r["state"] = "1" + } + if strings.Contains(data, "在线,工作状态正常") { + r["state"] = "2" + } + if strings.Contains(data, "在线,工作状态不正常") { + r["state"] = "3" + } + e.OutSuc(c, r, nil) + return + } +} + +// 删除打印机 +func DelPrinter(c *gin.Context, args md.PrinterReq) error { + + if args.PrinterType == "cloud" { //云打印 + //DelCloudPrinter(c, args) + } else { + //拼接参数 + snList := args.Sn + //请求接口 + postValues := url.Values{} + postValues.Add("apiname", "Open_printerDelList") //固定 + postValues.Add("snlist", snList) //打印机 + data := post(postValues) + fmt.Println(data) + var res md.AddPrinterResult + err := json.Unmarshal([]byte(data), &res) + if err != nil { + return e.NewErr(400, "删除失败") + } + //处理错误信息 + if len(res.Data.No) > 0 { + msg := res.Data.No[0] + return e.NewErr(400, "删除失败,"+msg) + } + return nil + } + return nil +} + +// 修改打印机 +func EditPrinter(c *gin.Context, args md.PrinterReq) error { + if args.PrinterType == "cloud" { //云打印 + //AddCloudPrinter(c, args) + } else { + //请求接口 + postValues := url.Values{} + postValues.Add("apiname", "Open_printerEdit") //固定 + postValues.Add("sn", args.Sn) //打印机编号 + postValues.Add("name", args.Remark) //打印机备注名称 + if args.PhoneNum != "" { + postValues.Add("phonenum", args.PhoneNum) + } //打印机流量卡号码 + data := post(postValues) + fmt.Println(data) + var res md.PrinterStateResult + err := json.Unmarshal([]byte(data), &res) + if err != nil { + return e.NewErr(400, "修改失败") + } + //处理错误信息 + if res.Ret != 0 { + return e.NewErr(400, "修改失败,"+res.Msg) + } + return nil + } + return nil +} + +// 打印机操作 +func PrinterDoing(c *gin.Context) { + var args md.PrinterReq + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + data, msg := CommDoing(c, args.Content, args.Sn, args.PrinterType, args.Oid) + if msg != "" { + e.OutErr(c, 400, e.NewErr(400, msg)) + return + } + e.OutSuc(c, map[string]string{"oid": utils.AnyToString(data)}, nil) + return + +} +func CommDoing(c *gin.Context, content, sn, printerType, oid string) (string, string) { + if printerType == "cloud" { //云打印 + //args := md.PrinterReq{ + // Sn: sn, + // Content: content, + // Oid: oid, + // PrinterType: printerType, + //} + //oids, err := CloudPrintDoing(c, args) + //if err != nil || oids == "" { + // return "", "打印失败" + //} + return "", "" + } else { + content1, _ := php2go.Base64Decode(content) + if content1 != "" { + content = content1 + } + //请求接口 + postValues := url.Values{} + postValues.Add("apiname", "Open_printMsg") //固定 + postValues.Add("sn", sn) //打印机编号 + postValues.Add("content", content) //打印内容 + postValues.Add("times", "1") //打印次数,默认为1。 + data := post(postValues) + fmt.Println(data) + var res md.PrinterStateResult + err := json.Unmarshal([]byte(data), &res) + if err != nil { + return "", "打印失败" + } + //处理错误信息 + if res.Ret != 0 { + return "", "打印失败," + res.Msg + } + return res.Data.(string), "" + } +} + +// 订单打印状态 +func PrinterOrderState(c *gin.Context) { + var args md.PrinterReq + if err := c.ShouldBindJSON(&args); err != nil { + e.OutErr(c, e.ERR_INVALID_ARGS) + return + } + if args.PrinterType == "cloud" { //云打印 + //GetOrdStatus(c, args) + } else { + //请求接口 + postValues := url.Values{} + postValues.Add("apiname", "Open_queryOrderState") //固定 + postValues.Add("orderid", args.Oid) //订单ID + data := post(postValues) + fmt.Println(data) + var res md.PrinterStateResult + err := json.Unmarshal([]byte(data), &res) + if err != nil { + e.OutErr(c, 400, e.NewErr(400, "查询失败")) + return + } + //处理错误信息 + if res.Ret != 0 { + e.OutErr(c, 400, e.NewErr(400, "查询失败,"+res.Msg)) + return + } + reqState := utils.AnyToBool(res.Data) + state := "0" + if reqState { + state = "1" + } + e.OutSuc(c, map[string]string{"state": state}, nil) + return + } + +} + +func post(postValues url.Values) string { + itime := time.Now().Unix() + stime := strconv.FormatInt(itime, 10) + sig := SHA1(USER + UKEY + stime) //生成签名 + client := http.Client{} + postValues.Add("user", USER) //账号名 + postValues.Add("stime", stime) //当前时间的秒数,请求时间 + postValues.Add("sig", sig) //签名 + res, _ := client.PostForm(URL, postValues) + data, _ := ioutil.ReadAll(res.Body) + fmt.Println(string(data)) //服务器返回的JSON字符串,建议要当做日志记录起来 + res.Body.Close() + return string(data) +} + +func SHA1(str string) string { + s := sha1.Sum([]byte(str)) + strsha1 := hex.EncodeToString(s[:]) + return strsha1 +} diff --git a/app/svc/svc_printer_list.go b/app/svc/svc_printer_list.go new file mode 100644 index 0000000..be8b78e --- /dev/null +++ b/app/svc/svc_printer_list.go @@ -0,0 +1,560 @@ +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 + } + 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 + } + } + + var module = model.CommunityTeamStorePrinter{ + Id: utils.StrToInt(search.Id), + StoreId: utils.StrToInt(search.StoreId), + 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 + } + + e.OutSuc(c, "success", nil) + 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, storeId string) { + engine := MasterDb(c) + //查出这条记录拿sn码 + 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) { + 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 + } + printer, _ := db.GetPrinterIndexAll(engine, search.StoreId) + 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 + } + 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 + } + // 加锁 防止并发 + 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 +} diff --git a/app/svc/svc_replace_printer_content.go b/app/svc/svc_replace_printer_content.go new file mode 100644 index 0000000..c10106a --- /dev/null +++ b/app/svc/svc_replace_printer_content.go @@ -0,0 +1,240 @@ +package svc + +import ( + "applet/app/db" + "applet/app/db/model" + "applet/app/md" + "applet/app/utils" + "applet/app/utils/logx" + "fmt" + "github.com/gin-gonic/gin" + "strings" + "time" + "xorm.io/xorm" +) + +// 替换 +func ReplaceOne(c *gin.Context, args *md.PrinterRequest) { + eg := MasterDb(c) + printerOne, _ := db.GetPrinterIndexById(eg, args.PrinterId, args.StoreId) + if printerOne.Type == "bluetooth" { + return + } + module, _ := db.GetAllPrinterModuleListByModuleIdOne(eg, printerOne.ModuleId) + ReplaceStr(c, eg, args, printerOne, module.Content) +} + +func GetReplaceContent(c *gin.Context, args *md.PrinterRequest) string { + eg := MasterDb(c) + printerOne, _ := db.GetPrinterIndexByBluetooth(eg, args.StoreId) + if printerOne == nil { + return "" + } + module, _ := db.GetAllPrinterModuleListByModuleIdOne(eg, printerOne.ModuleId) + content := GetCommContent(args, printerOne, module.Content) + return content +} + +// 替换 +func ReplaceMore(c *gin.Context, args *md.PrinterRequest) { + eg := MasterDb(c) + fmt.Println(args) + + //查出这个店铺下的所有打印机 + list, err := db.GetPrinterIndexAll(eg, args.StoreId) + if err != nil { + logx.Info(err) + return + } + //循环拿出模板id + var moduleIds = make([]int, 0) + for _, v := range list { + if v.IsUse == 0 || v.Type == "bluetooth" || (args.Ord["order_type"] == "face_to_pay" && v.LocationType != "reception") { + continue + } + if v.ModuleId > 0 { + moduleIds = append(moduleIds, v.ModuleId) + } + } + if moduleIds == nil || len(moduleIds) == 0 { + return + } + //查出对应模板数据 + moduleList, err := db.GetAllPrinterModuleListByModuleId(eg, moduleIds) + if err != nil { + logx.Info(err) + return + } + moduleArr := make(map[int]model.CommunityTeamStorePrinterModule, 0) + for _, v := range moduleList { + moduleArr[v.Id] = v + } + //处理数据内容 + for _, v := range list { + if v.IsUse == 0 { + continue + } + moduleId := v.ModuleId + moduleData := moduleArr[moduleId] + if moduleData.Content == "" { + continue + } + content := moduleData.Content + ReplaceStr(c, eg, args, &v, content) + } +} +func GetCommContent(arg *md.PrinterRequest, list *model.CommunityTeamStorePrinter, content string) string { + goodsInfoStr := ReplaceGoodsInfo(arg.GoodsInfo, list.Type, 15, 22, 26, 32) + content = strings.ReplaceAll(content, "{商品信息}", goodsInfoStr) + content = strings.ReplaceAll(content, "{付款金额}", arg.Ord["payment"]) + content = strings.ReplaceAll(content, "{取餐号}", arg.Ord["num"]) + content = strings.ReplaceAll(content, "{桌号}", arg.Ord["table_num"]) + content = strings.ReplaceAll(content, "{订单号}", arg.Ord["main_ord_id"]) + content = strings.ReplaceAll(content, "{姓名}", arg.Ord["name"]) + content = strings.ReplaceAll(content, "{电话}", arg.Ord["phone"]) + content = strings.ReplaceAll(content, "{打印时间}", time.Now().Format("2006-01-02 15:04:05")) + content = strings.ReplaceAll(content, "{收货地址}", arg.Ord["address"]) + content = strings.ReplaceAll(content, "{二维码链接}", arg.Ord["qrcode_url"]) + content = strings.ReplaceAll(content, "{二维码标签左}", "") + content = strings.ReplaceAll(content, "{二维码标签右}", "") + + content = strings.ReplaceAll(content, "{商家名称}", arg.Ord["store_name"]) + content = strings.ReplaceAll(content, "{商家店铺首页二维码链接}", arg.Ord["store_qrcode_url"]) + + if list.Type == "cloud" { + content = strings.ReplaceAll(content, "{居中放大左}", "
") + content = strings.ReplaceAll(content, "{居中放大右}", "
") + } else { + content = strings.ReplaceAll(content, "{居中放大左}", "") + content = strings.ReplaceAll(content, "{居中放大右}", "") + content = strings.ReplaceAll(content, "\n", "
") + content = strings.ReplaceAll(content, "\\n", "
") + } + return content +} + +// 字符替换 +func ReplaceStr(c *gin.Context, eg *xorm.Engine, arg *md.PrinterRequest, list *model.CommunityTeamStorePrinter, content string) { + content = GetCommContent(arg, list, content) + fmt.Println(content) + if arg.Ord["order_type"] == "face_to_pay" { + arg.Ord["order_type"] = "3" + } + //加入打印明细 + var detailData = model.CommunityTeamStorePrinterDetail{ + OrdId: arg.Ord["main_ord_id"], + OrdType: utils.StrToInt(arg.Ord["order_type"]), + PrinterId: list.Id, + PrinterModuleId: list.ModuleId, + PrintContent: content, + StoreId: utils.StrToInt(arg.StoreId), + CreateTime: time.Now(), + UpdateTime: time.Now(), + } + has, err := db.DetailInsert(eg, &detailData) + if has == 0 || err != nil { + return + } + fmt.Println(detailData.Id) + //调用打印机打印 + oids := fmt.Sprintf("%s%d%d", detailData.OrdId, detailData.PrinterId, detailData.CreateTime.Unix()) + oid, msg := CommDoing(c, content, list.SnNum, list.Type, oids) + if msg != "" { + return + } + detailData.State = 1 + if msg != "" { + logx.Info(msg) + detailData.State = 2 + detailData.FailMsg = msg + } else { + detailData.PrinterOid = oid + } + detailData.PrintTime = time.Now() + detailData.UpdateTime = time.Now() + _, err = db.DetailUpdate(eg, detailData.Id, &detailData, "printer_oid,print_time,update_time,state,fail_msg") + logx.Info(err) +} + +// 处理商品信息 +func ReplaceGoodsInfo(goodsInfo []map[string]string, printerType string, nameLen, priceLen, numLen, pricesLen int) string { + goodsInfoStr := "" + var sub = []int{0, nameLen, priceLen, numLen, pricesLen} + for _, v := range goodsInfo { + name := v["name"] + skuText := v["sku_text"] + price := v["price"] + num := v["num"] + prices := v["prices"] + goodsInfoStr += CheckStr(name, 0, sub) + goodsInfoStr += CheckStr(price, 1, sub) + goodsInfoStr += CheckStr(num, 2, sub) + goodsInfoStr += CheckStr(prices, 3, sub) + if printerType == "cloud" { + goodsInfoStr += "\n" + } else { + goodsInfoStr += "
" + } + if skuText != "" { + goodsInfoStr += CheckStr(skuText, 0, sub) + if printerType == "cloud" { + goodsInfoStr += "\n" + } else { + goodsInfoStr += "
" + } + } + + } + return goodsInfoStr +} +func CheckStr(str string, index int, sub []int) string { + kw := "" + lens := len(str) + if lens > 15 && index == 0 { + if lens > 15 && lens <= 32 { + kw += str + for i := 0; i < 32-lens; i++ { + kw += " " + } + kw += "
" + for i := 0; i < 15; i++ { + kw += " " + } + } + if lens > 32 { + if lens > 16*4 { + lens = 16 * 4 + } + kw += str[0:lens] + kw += "
" + str2 := str[lens:] + str2Len := len(str2) + kw += str2 + key := sub[index+1] - str2Len - sub[index] + for i := 0; i < key; i++ { + kw += " " + } + } + } else { + kw += str + key := sub[index+1] - lens - sub[index] + if index == 0 { + key = 20 - lens + if lens < 15 { + key = 19 - lens + } + if lens < 10 { + key = 18 - lens + } + if lens < 7 { + key = 17 - lens + } + fmt.Println(lens) + fmt.Println(key) + } + for i := 0; i < key; i++ { + kw += " " + } + } + return kw +} diff --git a/app/svc/svc_store.go b/app/svc/svc_store.go index 4c90a19..52f972d 100644 --- a/app/svc/svc_store.go +++ b/app/svc/svc_store.go @@ -305,6 +305,7 @@ func BankCard(c *gin.Context) { list := make([]map[string]string, 0) data := db.GetCard(MasterDb(c), arg) if data != nil { + scheme, host := ImageBucket(c) for _, v := range *data { tmp := map[string]string{ "id": utils.IntToStr(v.Id), @@ -312,6 +313,7 @@ func BankCard(c *gin.Context) { "first_tip": v.FirstTip, "second_tip": v.SecondTip, "time_str": "", + "img": ImageFormatWithBucket(scheme, host, v.Img), "type": "0", } if tmp["time_str"] != "" { diff --git a/app/svc/svc_store_order.go b/app/svc/svc_store_order.go index 9d4a146..520aafe 100644 --- a/app/svc/svc_store_order.go +++ b/app/svc/svc_store_order.go @@ -10,6 +10,7 @@ import ( "encoding/json" "fmt" "github.com/gin-gonic/gin" + "strings" "time" "xorm.io/xorm" ) @@ -25,6 +26,31 @@ func StoreOrderCate(c *gin.Context) { e.OutSuc(c, cate, nil) return } +func GetDate(c *gin.Context, arg map[string]string) (time.Time, time.Time) { + var stime, etime time.Time + t := time.Now() + if arg["type"] == "day" { + stime = utils.TimeParseStd(arg["date"] + " 00:00:00") + etime = time.Unix(stime.Unix()+86400, 0) + } + if arg["type"] == "month" { + ex := strings.Split(arg["date"], "-") + year := utils.StrToInt(ex[0]) + stime = time.Date(year, time.Month(utils.StrToInt(ex[1])-1), 1, 0, 0, 0, 0, t.Location()) + if utils.StrToInt(ex[1]) == 12 { + year++ + ex[1] = "1" + } + etime = time.Date(year, time.Month(utils.StrToInt(ex[1])), 1, 0, 0, 0, 0, t.Location()) + } + if arg["type"] == "year" { + year := utils.StrToInt(arg["date"]) + stime = time.Date(year, time.Month(0), 1, 0, 0, 0, 0, t.Location()) + etime = time.Date(year+1, time.Month(0), 1, 0, 0, 0, 0, t.Location()) + } + return stime, etime +} + func StoreOrderList(c *gin.Context) { var arg map[string]string if err := c.ShouldBindJSON(&arg); err != nil {