huangjiajun 1 неделю назад
Родитель
Сommit
298615fa3b
17 измененных файлов: 1785 добавлений и 0 удалений
  1. +29
    -0
      app/db/db_printer_detail.go
  2. +188
    -0
      app/db/db_printer_list.go
  3. +60
    -0
      app/db/db_printer_module.go
  4. +19
    -0
      app/db/model/community_team_store_printer.go
  5. +21
    -0
      app/db/model/community_team_store_printer_detail.go
  6. +14
    -0
      app/db/model/community_team_store_printer_module.go
  7. +65
    -0
      app/hdl/hdl_printer_list.go
  8. +58
    -0
      app/hdl/hdl_store_index.go
  9. +113
    -0
      app/md/o2o_printer.go
  10. +29
    -0
      app/md/printer.go
  11. +16
    -0
      app/router/router.go
  12. +62
    -0
      app/svc/shorten_url.go
  13. +283
    -0
      app/svc/svc_printer.go
  14. +560
    -0
      app/svc/svc_printer_list.go
  15. +240
    -0
      app/svc/svc_replace_printer_content.go
  16. +2
    -0
      app/svc/svc_store.go
  17. +26
    -0
      app/svc/svc_store_order.go

+ 29
- 0
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
}

+ 188
- 0
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
}

+ 60
- 0
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
}

+ 19
- 0
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)"`
}

+ 21
- 0
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"`
}

+ 14
- 0
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"`
}

+ 65
- 0
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)
}

+ 58
- 0
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
}

+ 113
- 0
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"`
}

+ 29
- 0
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"`
}

+ 16
- 0
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) //订

}

+ 62
- 0
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
}

+ 283
- 0
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
}

+ 560
- 0
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, "<BR>", "\n")
list[k].PrintContent = strings.ReplaceAll(list[k].PrintContent, "<QR>", "<二维码标签左>")
list[k].PrintContent = strings.ReplaceAll(list[k].PrintContent, "</QR>", "<二维码标签右>")
}
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
}

+ 240
- 0
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, "{二维码标签左}", "<QR>")
content = strings.ReplaceAll(content, "{二维码标签右}", "</QR>")

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, "{居中放大左}", "<FS><center>")
content = strings.ReplaceAll(content, "{居中放大右}", "</center></FS>")
} else {
content = strings.ReplaceAll(content, "{居中放大左}", "<CB>")
content = strings.ReplaceAll(content, "{居中放大右}", "</CB>")
content = strings.ReplaceAll(content, "\n", "<BR>")
content = strings.ReplaceAll(content, "\\n", "<BR>")
}
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 += "<BR>"
}
if skuText != "" {
goodsInfoStr += CheckStr(skuText, 0, sub)
if printerType == "cloud" {
goodsInfoStr += "\n"
} else {
goodsInfoStr += "<BR>"
}
}

}
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 += "<BR>"
for i := 0; i < 15; i++ {
kw += " "
}
}
if lens > 32 {
if lens > 16*4 {
lens = 16 * 4
}
kw += str[0:lens]
kw += "<BR>"
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
}

+ 2
- 0
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"] != "" {


+ 26
- 0
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 {


Загрузка…
Отмена
Сохранить