@@ -0,0 +1,117 @@ | |||||
package db | |||||
import ( | |||||
"applet/app/db/model" | |||||
"applet/app/utils" | |||||
"applet/app/utils/logx" | |||||
"errors" | |||||
"fmt" | |||||
"reflect" | |||||
"xorm.io/xorm" | |||||
) | |||||
// BatchSelectMallOrdItems 批量查询数据 TODO::和下面的方法重复了,建议采用下面的 `MallOrdItemFindByParams` 方法 | |||||
func BatchSelectMallOrdItems(Db *xorm.Engine, params map[string]interface{}) (*[]model.MallOrdItem, error) { | |||||
var MallOrdItemData []model.MallOrdItem | |||||
if err := Db.In(utils.AnyToString(params["key"]), params["value"]). | |||||
Find(&MallOrdItemData); err != nil { | |||||
return nil, logx.Warn(err) | |||||
} | |||||
return &MallOrdItemData, nil | |||||
} | |||||
// MallOrdItemInsert 插入单条数据 | |||||
func MallOrdItemInsert(Db *xorm.Engine, MallOrdItem *model.MallOrdItem) (int64, error) { | |||||
_, err := Db.InsertOne(MallOrdItem) | |||||
if err != nil { | |||||
return 0, err | |||||
} | |||||
return MallOrdItem.OrdId, nil | |||||
} | |||||
// BatchAddMallOrdItems 批量新增数据 | |||||
func BatchAddMallOrdItems(Db *xorm.Engine, MallOrdItemData []*model.MallOrdItem) (int64, error) { | |||||
affected, err := Db.Insert(MallOrdItemData) | |||||
if err != nil { | |||||
return 0, err | |||||
} | |||||
return affected, nil | |||||
} | |||||
func GetMallOrdItemCount(Db *xorm.Engine) int { | |||||
var MallOrdItem model.MallOrdItem | |||||
session := Db.Where("") | |||||
count, err := session.Count(&MallOrdItem) | |||||
if err != nil { | |||||
return 0 | |||||
} | |||||
return int(count) | |||||
} | |||||
// MallOrdItemDelete 删除记录 | |||||
func MallOrdItemDelete(Db *xorm.Engine, id interface{}) (int64, error) { | |||||
if reflect.TypeOf(id).Kind() == reflect.Slice { | |||||
return Db.In("id", id).Delete(model.MallOrdItem{}) | |||||
} else { | |||||
return Db.Where("id = ?", id).Delete(model.MallOrdItem{}) | |||||
} | |||||
} | |||||
// MallOrdItemUpdate 更新记录 | |||||
func MallOrdItemUpdate(Db *xorm.Engine, id interface{}, MallOrdItem *model.MallOrdItem, forceColums ...string) (int64, error) { | |||||
var ( | |||||
affected int64 | |||||
err error | |||||
) | |||||
if forceColums != nil { | |||||
affected, err = Db.Where("id=?", id).Cols(forceColums...).Update(MallOrdItem) | |||||
} else { | |||||
affected, err = Db.Where("id=?", id).Update(MallOrdItem) | |||||
} | |||||
if err != nil { | |||||
return 0, err | |||||
} | |||||
return affected, nil | |||||
} | |||||
// MallOrdItemGetOneByParams 通过传入的参数查询数据(单条) | |||||
func MallOrdItemGetOneByParams(Db *xorm.Engine, params map[string]interface{}) (*model.MallOrdItem, error) { | |||||
var m model.MallOrdItem | |||||
var query = fmt.Sprintf("%s =?", params["key"]) | |||||
if has, err := Db.Where(query, params["value"]).Get(&m); err != nil || has == false { | |||||
return nil, logx.Error(err) | |||||
} | |||||
return &m, nil | |||||
} | |||||
// MallOrdItemFindByParams 通过传入的参数查询数据(多条) | |||||
func MallOrdItemFindByParams(Db *xorm.Engine, params map[string]interface{}) (*[]model.MallOrdItem, error) { | |||||
var m []model.MallOrdItem | |||||
if params["value"] == nil { | |||||
return nil, errors.New("参数有误") | |||||
} | |||||
if params["key"] == nil { | |||||
//查询全部数据 | |||||
err := Db.Find(&m) | |||||
if err != nil { | |||||
return nil, logx.Error(err) | |||||
} | |||||
return &m, nil | |||||
} else { | |||||
if reflect.TypeOf(params["value"]).Kind() == reflect.Slice { | |||||
//指定In查询 | |||||
if err := Db.In(utils.AnyToString(params["key"]), params["value"]).Find(&m); err != nil { | |||||
return nil, logx.Warn(err) | |||||
} | |||||
return &m, nil | |||||
} else { | |||||
var query = fmt.Sprintf("%s =?", params["key"]) | |||||
err := Db.Where(query, params["value"]).Find(&m) | |||||
if err != nil { | |||||
return nil, logx.Error(err) | |||||
} | |||||
return &m, nil | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,29 @@ | |||||
package model | |||||
import ( | |||||
"time" | |||||
) | |||||
type MallOrdItem struct { | |||||
Id int `json:"id" xorm:"not null pk autoincr INT(11)"` | |||||
OrdId int64 `json:"ord_id" xorm:"comment('订单id') BIGINT(20)"` | |||||
GoodsCopy string `json:"goods_copy" xorm:"comment('商品快照') TEXT"` | |||||
GoodsNum int `json:"goods_num" xorm:"comment('件数') INT(11)"` | |||||
OriginPrice string `json:"origin_price" xorm:"comment('商品金额(原价,乘以件数后的)') DECIMAL(12,2)"` | |||||
GoodsPrice string `json:"goods_price" xorm:"comment('商品金额(实付价,乘以件数后的)') DECIMAL(12,2)"` | |||||
GoodsTitle string `json:"goods_title" xorm:"comment('商品标题') VARCHAR(255)"` | |||||
GoodsImg string `json:"goods_img" xorm:"comment('商品图片') VARCHAR(255)"` | |||||
CouponDiscount string `json:"coupon_discount" xorm:"not null default 0.00 comment('优惠券折扣额') DECIMAL(12,2)"` | |||||
DiscountPrice string `json:"discount_price" xorm:"not null default 0.00 comment('立减') DECIMAL(12,2)"` | |||||
ReturnInsuranceFee string `json:"return_insurance_fee" xorm:"not null default 0.00 comment('退货无忧费用') DECIMAL(12,2)"` | |||||
ShippingFee string `json:"shipping_fee" xorm:"not null default 0.00 comment('运费') DECIMAL(12,2)"` | |||||
CreateTime time.Time `json:"create_time" xorm:"created not null default 'CURRENT_TIMESTAMP' comment('创建时间') DATETIME"` | |||||
UpdateTime time.Time `json:"update_time" xorm:"updated not null default 'CURRENT_TIMESTAMP' comment('更新时间') DATETIME"` | |||||
SkuId int64 `json:"sku_id" xorm:"comment('sku') BIGINT(20)"` | |||||
SkuText string `json:"sku_text" xorm:"not null comment('sku文字显示') VARCHAR(1024)"` | |||||
GoodsId int `json:"goods_id" xorm:"not null comment('商品id') INT(11)"` | |||||
SupplierPrice string `json:"supplier_price" xorm:"not null comment('') VARCHAR(100)"` | |||||
SupplierAddPrice string `json:"supplier_add_price" xorm:"not null comment('') VARCHAR(100)"` | |||||
SupplierMerchantName string `json:"supplier_merchant_name" xorm:"not null comment('') VARCHAR(100)"` | |||||
SupplierGoodsId string `json:"supplier_goods_id" xorm:"not null comment('') VARCHAR(100)"` | |||||
} |
@@ -1,104 +0,0 @@ | |||||
package svc | |||||
import ( | |||||
"fmt" | |||||
"strings" | |||||
"applet/app/e" | |||||
"applet/app/lib/qiniu" | |||||
"applet/app/md" | |||||
"applet/app/utils" | |||||
"applet/app/utils/logx" | |||||
"github.com/gin-gonic/gin" | |||||
) | |||||
// 请求文件上传 | |||||
func ImgReqUpload(c *gin.Context, uid, dirName, fname, callbackUrl string, fsize int64) (interface{}, error) { | |||||
ext := utils.FileExt(fname) | |||||
if err := initStg(c, fsize, ext); err != nil { | |||||
return nil, err | |||||
} | |||||
// logx.Warn(uid) | |||||
newName := dirName + "_" + fmt.Sprintf("%010s", uid) | |||||
// if dirName == md.FILE_DIR_FEEDBACK || dirName == md.FILE_DIR_STYLE { | |||||
// newName += "_" + utils.FormatNanoUnix() + utils.RandString(4, "0123456789") | |||||
// } | |||||
// 默认都加时间戳 | |||||
newName += "_" + utils.FormatNanoUnix() + utils.RandString(4, "0123456789") | |||||
newName += ".png" // 因为可能存在多种图像格式,这里统一后缀为png | |||||
f := &md.FileCallback{ | |||||
Uid: uid, | |||||
DirId: md.FileUserDir[dirName], | |||||
FileName: newName, | |||||
} | |||||
// logx.Warn(f.Uid) | |||||
return qiniu.ReqImgUpload(f, callbackUrl), nil | |||||
} | |||||
func initStg(c *gin.Context, fsize int64, ext string) error { | |||||
// 获取上传配置 | |||||
stgInfo := SysCfgFind( | |||||
c, | |||||
md.KEY_CFG_FILE_BUCKET, | |||||
md.KEY_CFG_FILE_HOST, | |||||
md.KEY_CFG_FILE_AK, | |||||
md.KEY_CFG_FILE_SK, | |||||
md.KEY_CFG_FILE_PVD, | |||||
md.KEY_CFG_FILE_REGION, | |||||
md.KEY_CFG_FILE_MAX_SIZE, | |||||
md.KEY_CFG_FILE_EXT, | |||||
md.KEY_CFG_FILE_SCHEME, | |||||
md.KEY_CFG_FILE_AVATAR_THUMBNAIL, | |||||
) | |||||
//?imageView2/1/w/120/h/120/format/webp/interlace/1 | |||||
if stgInfo == nil { | |||||
return e.NewErrCode(e.ERR_CFG) | |||||
} | |||||
// todo 目前仅支持七牛 | |||||
if v, ok := stgInfo[md.KEY_CFG_FILE_PVD]; !ok || v != "qiniu" { | |||||
return e.NewErrCode(e.ERR_CFG) | |||||
} | |||||
if v, ok := stgInfo[md.KEY_CFG_FILE_REGION]; !ok || v == "" { | |||||
return e.NewErrCode(e.ERR_CFG) | |||||
} | |||||
if v, ok := stgInfo[md.KEY_CFG_FILE_AK]; !ok || v == "" { | |||||
return e.NewErrCode(e.ERR_CFG) | |||||
} | |||||
if v, ok := stgInfo[md.KEY_CFG_FILE_SK]; !ok || v == "" { | |||||
return e.NewErrCode(e.ERR_CFG) | |||||
} | |||||
if v, ok := stgInfo[md.KEY_CFG_FILE_BUCKET]; !ok || v == "" { | |||||
return e.NewErrCode(e.ERR_CFG) | |||||
} | |||||
if v, ok := stgInfo[md.KEY_CFG_FILE_SCHEME]; !ok || v == "" { | |||||
stgInfo[md.KEY_CFG_FILE_SCHEME] = "http" | |||||
SysCfgSet(c, md.KEY_CFG_FILE_SCHEME, stgInfo[md.KEY_CFG_FILE_SCHEME], "文件域名HTTP协议") | |||||
} | |||||
qiniu.Init(stgInfo[md.KEY_CFG_FILE_AK], stgInfo[md.KEY_CFG_FILE_SK], stgInfo[md.KEY_CFG_FILE_BUCKET], stgInfo[md.KEY_CFG_FILE_REGION], stgInfo[md.KEY_CFG_FILE_SCHEME]) | |||||
if v, ok := stgInfo[md.KEY_CFG_FILE_HOST]; !ok || v == "" { | |||||
var err error | |||||
stgInfo[md.KEY_CFG_FILE_HOST], err = qiniu.BucketGetDomain(stgInfo[md.KEY_CFG_FILE_BUCKET]) | |||||
if err != nil { | |||||
logx.Error(err) | |||||
return e.NewErrCode(e.ERR_CFG) | |||||
} | |||||
SysCfgSet(c, md.KEY_CFG_FILE_HOST, stgInfo[md.KEY_CFG_FILE_HOST], "文件域名地址") | |||||
} | |||||
// 头像缩略图参数 | |||||
if v, ok := stgInfo[md.KEY_CFG_FILE_AVATAR_THUMBNAIL]; !ok || v == "" { | |||||
SysCfgSet(c, md.KEY_CFG_FILE_AVATAR_THUMBNAIL, "?imageView2/1/w/200/h/200/format/png", "文件用户头像缩略图参数") | |||||
} | |||||
// 检查文件大小限制 | |||||
if v, ok := stgInfo[md.KEY_CFG_FILE_MAX_SIZE]; ok && v != "" && utils.StrToInt64(v) < fsize { | |||||
return e.NewErrCode(e.ERR_FILE_MAX_SIZE) | |||||
} | |||||
// 检查文件后缀 | |||||
if v, ok := stgInfo[md.KEY_CFG_FILE_EXT]; ok && v != "" && !strings.Contains(v, ext) { | |||||
return e.NewErrCode(e.ERR_FILE_EXT) | |||||
} | |||||
return nil | |||||
} |
@@ -85,6 +85,7 @@ func handleGuideOrdTable(msg []byte) error { | |||||
CostPrice: utils.StrToFloat64(data.CostPrice), | CostPrice: utils.StrToFloat64(data.CostPrice), | ||||
State: int32(utils.StrToInt(data.State)), | State: int32(utils.StrToInt(data.State)), | ||||
StateZh: md.CanalGuideOrderState(int32(utils.StrToInt(data.State))).String(), | StateZh: md.CanalGuideOrderState(int32(utils.StrToInt(data.State))).String(), | ||||
GoodsNum: utils.StrToInt(data.ItemNum), | |||||
PayChannel: 0, | PayChannel: 0, | ||||
PayChannelZh: "", | PayChannelZh: "", | ||||
ReceiverPhone: user.Phone, | ReceiverPhone: user.Phone, | ||||
@@ -64,6 +64,23 @@ func handleMallOrdTable(msg []byte) error { | |||||
//4、构造数据结构体 && 插入es文档 | //4、构造数据结构体 && 插入es文档 | ||||
masterId := strings.Split(canalMsg.Database, "_")[1] | masterId := strings.Split(canalMsg.Database, "_")[1] | ||||
var ordList []string | |||||
for _, data := range canalMsg.Data { | |||||
ordList = append(ordList, data.OrdId) | |||||
} | |||||
ordItemList, err := db.MallOrdItemFindByParams(db.DBs[masterId], map[string]interface{}{ | |||||
"key": "ord_id", | |||||
"value": ordList, | |||||
}) | |||||
if err != nil { | |||||
return err | |||||
} | |||||
var ordItemListMap map[string]int | |||||
for _, item := range *ordItemList { | |||||
ordItemListMap[utils.AnyToString(item.OrdId)] = item.GoodsNum | |||||
} | |||||
for _, data := range canalMsg.Data { | for _, data := range canalMsg.Data { | ||||
var uniqueId = masterId + "_" + data.OrdId //es的唯一键,每个文档必须要有唯一键 | var uniqueId = masterId + "_" + data.OrdId //es的唯一键,每个文档必须要有唯一键 | ||||
province, err := db.ProvinceGetOne(data.ProvinceId) | province, err := db.ProvinceGetOne(data.ProvinceId) | ||||
@@ -79,6 +96,10 @@ func handleMallOrdTable(msg []byte) error { | |||||
return err | return err | ||||
} | } | ||||
now := time.Now() | now := time.Now() | ||||
var goodsNum = 1 | |||||
if ordItemListMap[data.OrdId] != 0 { | |||||
goodsNum = ordItemListMap[data.OrdId] | |||||
} | |||||
esData := esMd.ZhiosOrdersEs{ | esData := esMd.ZhiosOrdersEs{ | ||||
OrdKind: "mall", | OrdKind: "mall", | ||||
MasterId: utils.StrToInt(masterId), | MasterId: utils.StrToInt(masterId), | ||||
@@ -103,6 +124,7 @@ func handleMallOrdTable(msg []byte) error { | |||||
City: city.Name, | City: city.Name, | ||||
County: county.Name, | County: county.Name, | ||||
OrderType: int32(utils.StrToInt(data.OrderType)), | OrderType: int32(utils.StrToInt(data.OrderType)), | ||||
GoodsNum: goodsNum, | |||||
EstimateCommission: utils.StrToFloat64(data.EstimateCommission), | EstimateCommission: utils.StrToFloat64(data.EstimateCommission), | ||||
LogisticCompany: data.LogisticCompany, | LogisticCompany: data.LogisticCompany, | ||||
PayTime: data.PayTime, | PayTime: data.PayTime, | ||||
@@ -11,6 +11,7 @@ type CanalGuideOrder struct { | |||||
CostPrice string `json:"cost_price"` | CostPrice string `json:"cost_price"` | ||||
State string `json:"state"` | State string `json:"state"` | ||||
OrderType string `json:"order_type"` | OrderType string `json:"order_type"` | ||||
ItemNum string `json:"item_num"` | |||||
SysCommission string `json:"sys_commission"` | SysCommission string `json:"sys_commission"` | ||||
CreateAt string `json:"create_at"` | CreateAt string `json:"create_at"` | ||||
} | } | ||||
@@ -14,6 +14,7 @@ type ZhiosOrdersEs struct { | |||||
StateZh string `json:"state_zh"` | StateZh string `json:"state_zh"` | ||||
PayTime interface{} `json:"pay_time"` | PayTime interface{} `json:"pay_time"` | ||||
PayChannel int32 `json:"pay_channel"` | PayChannel int32 `json:"pay_channel"` | ||||
GoodsNum int `json:"goods_num"` | |||||
PayChannelZh string `json:"pay_channel_zh"` | PayChannelZh string `json:"pay_channel_zh"` | ||||
ReceiverPhone string `json:"receiver_phone"` | ReceiverPhone string `json:"receiver_phone"` | ||||
ReceiverName string `json:"receiver_name"` | ReceiverName string `json:"receiver_name"` | ||||