Merge remote-tracking branch 'origin/mark'
This commit is contained in:
@@ -243,7 +243,6 @@ func LoginInternal(ctx *Context, authType, authID, authIDType, authSecret string
|
|||||||
realAuthID = user.GetID()
|
realAuthID = user.GetID()
|
||||||
}
|
}
|
||||||
if authBindEx, err = handler.VerifySecret(realAuthID, authSecret); err == nil {
|
if authBindEx, err = handler.VerifySecret(realAuthID, authSecret); err == nil {
|
||||||
// globals.SugarLogger.Debugf("auth2 Login authBindEx:%s", utils.Format4Output(authBindEx, false))
|
|
||||||
if authBindEx == nil { // mobile, email会返回nil(表示不会新建AuthBind实体)
|
if authBindEx == nil { // mobile, email会返回nil(表示不会新建AuthBind实体)
|
||||||
user = userProvider.GetUser(authID, authIDType)
|
user = userProvider.GetUser(authID, authIDType)
|
||||||
authBindEx = &AuthBindEx{
|
authBindEx = &AuthBindEx{
|
||||||
@@ -275,9 +274,9 @@ func LoginInternal(ctx *Context, authType, authID, authIDType, authSecret string
|
|||||||
userProvider.UpdateLastLogin(user.GetID(), authType, ctx.GetRealRemoteIP())
|
userProvider.UpdateLastLogin(user.GetID(), authType, ctx.GetRealRemoteIP())
|
||||||
}
|
}
|
||||||
//如果是小程序
|
//如果是小程序
|
||||||
if authType == "weixinmini" {
|
if authType == "weixinmini" || authType == "weixinapp" {
|
||||||
appID := strings.Split(authSecret, ",")[0]
|
appID := strings.Split(authSecret, ",")[0]
|
||||||
if appID == "wx08a5c2a8581414ff" || appID == "wx2d6949f724b2541d" { //菜市或者果园
|
if appID == "wx08a5c2a8581414ff" || appID == "wx2d6949f724b2541d" || appID == "wx18111a41fd17f24f" { //菜市或者果园
|
||||||
if user != nil {
|
if user != nil {
|
||||||
binds, err := dao.GetUserBindAuthInfo(dao.GetDB(), user.GetID(), 0, nil, "", "", "wx2bb99eb5d2c9b82c")
|
binds, err := dao.GetUserBindAuthInfo(dao.GetDB(), user.GetID(), 0, nil, "", "", "wx2bb99eb5d2c9b82c")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ const (
|
|||||||
AuthTypeWeixin = "wxqrcode" // 微信扫码
|
AuthTypeWeixin = "wxqrcode" // 微信扫码
|
||||||
AuthTypeMP = "weixinsns" // 公众号
|
AuthTypeMP = "weixinsns" // 公众号
|
||||||
AuthTypeWXNative = "wxnative" // 微信APP
|
AuthTypeWXNative = "wxnative" // 微信APP
|
||||||
|
AuthTypeWxApp = "weixinapp" //app微信登录
|
||||||
)
|
)
|
||||||
|
|
||||||
type Auther struct {
|
type Auther struct {
|
||||||
@@ -26,6 +27,7 @@ var (
|
|||||||
AutherObjWX *Auther
|
AutherObjWX *Auther
|
||||||
AutherObjMP *Auther
|
AutherObjMP *Auther
|
||||||
AutherObjNative *Auther
|
AutherObjNative *Auther
|
||||||
|
AutherObjApp *Auther
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -47,10 +49,15 @@ func init() {
|
|||||||
authType: AuthTypeWXNative,
|
authType: AuthTypeWXNative,
|
||||||
}
|
}
|
||||||
auth2.RegisterAuther(AuthTypeWXNative, AutherObjNative)
|
auth2.RegisterAuther(AuthTypeWXNative, AutherObjNative)
|
||||||
|
|
||||||
|
AutherObjApp = &Auther{
|
||||||
|
authType: AuthTypeWxApp,
|
||||||
|
}
|
||||||
|
auth2.RegisterAuther(AuthTypeWxApp, AutherObjApp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *Auther) VerifySecret(id, secret string) (authBindEx *auth2.AuthBindEx, err error) {
|
func (a *Auther) VerifySecret(id, secret string) (authBindEx *auth2.AuthBindEx, err error) {
|
||||||
globals.SugarLogger.Debugf("weixin VerifySecret id:%s secret:%s", secret, secret)
|
globals.SugarLogger.Debugf("weixin VerifySecret id:%s secret:%s", id, secret)
|
||||||
var openID, accessToken string
|
var openID, accessToken string
|
||||||
if a.authType != AuthTypeWXNative {
|
if a.authType != AuthTypeWXNative {
|
||||||
state := id
|
state := id
|
||||||
@@ -71,7 +78,7 @@ func (a *Auther) VerifySecret(id, secret string) (authBindEx *auth2.AuthBindEx,
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
wxUserinfo, err2 := a.getAPI().SNSGetUserInfo(accessToken, openID)
|
wxUserinfo, err2 := a.getAPI().SNSGetUserInfo(accessToken, openID)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
if authBindEx, err = a.UnionFindAuthBind(a.authType, a.getAPI().GetAppID(), []string{AuthTypeWeixin, AuthTypeMP, AuthTypeMini, AuthTypeWXNative}, wxUserinfo.OpenID, wxUserinfo.UnionID, wxUserinfo); err == nil {
|
if authBindEx, err = a.UnionFindAuthBind(a.authType, a.getAPI().GetAppID(), []string{AuthTypeWeixin, AuthTypeMP, AuthTypeMini, AuthTypeWXNative, AuthTypeWxApp}, wxUserinfo.OpenID, wxUserinfo.UnionID, wxUserinfo); err == nil {
|
||||||
authBindEx.UserHint = &auth2.UserBasic{
|
authBindEx.UserHint = &auth2.UserBasic{
|
||||||
Name: wxUserinfo.NickName,
|
Name: wxUserinfo.NickName,
|
||||||
Avatar: wxUserinfo.HeadImgURL,
|
Avatar: wxUserinfo.HeadImgURL,
|
||||||
@@ -86,6 +93,9 @@ func (a *Auther) getAPI() *weixinapi.API {
|
|||||||
if a.authType == AuthTypeWeixin {
|
if a.authType == AuthTypeWeixin {
|
||||||
return api.WeixinPageAPI
|
return api.WeixinPageAPI
|
||||||
}
|
}
|
||||||
|
if a.authType == AuthTypeWxApp {
|
||||||
|
return api.WeixinApp
|
||||||
|
}
|
||||||
return api.WeixinAPI
|
return api.WeixinAPI
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,9 @@ func getWxApp(appID string) (miniApi *weixinapi.API) {
|
|||||||
if len(appID) > 0 && appID == api.WeixinMiniAppID2 {
|
if len(appID) > 0 && appID == api.WeixinMiniAppID2 {
|
||||||
miniApi = api.WeixinMiniAPI2
|
miniApi = api.WeixinMiniAPI2
|
||||||
}
|
}
|
||||||
|
if len(appID) > 0 && appID == api.WeixinMiniAppIDsc {
|
||||||
|
miniApi = api.WeixinMiniAPIsc
|
||||||
|
}
|
||||||
return miniApi
|
return miniApi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ func (c *OrderManager) OnNewFakeJdOrder(vendorOrderID string) (err error) {
|
|||||||
|
|
||||||
func (c *OrderManager) notifyNewFakeJdOrder(order *model.GoodsOrder) (err error) {
|
func (c *OrderManager) notifyNewFakeJdOrder(order *model.GoodsOrder) (err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, model.VendorIDJD)
|
storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, order.VendorStoreID, model.VendorIDJD, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -69,6 +69,6 @@ func notifyWxNewFakeJdOrder(order *model.GoodsOrder, storeID int) (err error) {
|
|||||||
title := fmt.Sprintf("你有到家菜市新订单%d", order.OrderSeq)
|
title := fmt.Sprintf("你有到家菜市新订单%d", order.OrderSeq)
|
||||||
content := sb.String()
|
content := sb.String()
|
||||||
// globals.SugarLogger.Debugf("notifyWxNewFakeJdOrder, orderID:%s, content:%s", order.VendorOrderID, content)
|
// globals.SugarLogger.Debugf("notifyWxNewFakeJdOrder, orderID:%s, content:%s", order.VendorOrderID, content)
|
||||||
_, err = weixinmsg.SendStoreMessage(jxcontext.AdminCtx, title, content, []int{storeID}, true, true)
|
_, err = weixinmsg.SendStoreMessage(jxcontext.AdminCtx, title, content, []int{storeID}, "", model.MessageTypeStore, true, true)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -258,3 +258,5 @@ func (c *OrderManager) UpdataOrderFinancialInfo(orderFinancial *model.OrderFinan
|
|||||||
// orderFinancial 和 OrderSkuFinancial 数据计算完毕,准备进行更新
|
// orderFinancial 和 OrderSkuFinancial 数据计算完毕,准备进行更新
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -54,7 +54,7 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode
|
|||||||
if order, _ := c.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID); order != nil {
|
if order, _ := c.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID); order != nil {
|
||||||
if order.ConsigneeMobile2 == "" {
|
if order.ConsigneeMobile2 == "" {
|
||||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID); handler != nil {
|
if handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID); handler != nil {
|
||||||
if order2, _ := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID); order2 != nil && order.ConsigneeMobile != order2.ConsigneeMobile {
|
if order2, _ := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID); order2 != nil && order.ConsigneeMobile != order2.ConsigneeMobile {
|
||||||
order.ConsigneeMobile = order2.ConsigneeMobile
|
order.ConsigneeMobile = order2.ConsigneeMobile
|
||||||
c.UpdateOrderFields(order, []string{"ConsigneeMobile"})
|
c.UpdateOrderFields(order, []string{"ConsigneeMobile"})
|
||||||
}
|
}
|
||||||
@@ -100,6 +100,7 @@ func (c *OrderManager) onAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *mode
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dao.Commit(db)
|
dao.Commit(db)
|
||||||
scheduler.CurrentScheduler.OnAfsOrderNew(afsOrder, false)
|
scheduler.CurrentScheduler.OnAfsOrderNew(afsOrder, false)
|
||||||
return err
|
return err
|
||||||
@@ -261,7 +262,13 @@ func (c *OrderManager) updateAfsOrderSkuOtherInfo(db *dao.DaoDB, order *model.Af
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(vendorSkuIDs) > 0 {
|
if len(vendorSkuIDs) > 0 {
|
||||||
l, err := dao.GetStoreSkuPriceAndWeight(db, order.VendorStoreID, order.VendorID, vendorSkuIDs)
|
var vendorStoreID string
|
||||||
|
if order.VendorID == model.VendorIDJDShop {
|
||||||
|
vendorStoreID = model.JdShopMainVendorStoreID
|
||||||
|
} else {
|
||||||
|
vendorStoreID = order.VendorStoreID
|
||||||
|
}
|
||||||
|
l, err := dao.GetStoreSkuPriceAndWeight(db, vendorStoreID, order.VendorID, vendorSkuIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
globals.SugarLogger.Warnf("updateAfsOrderSkuOtherInfo orderID:%s failed with err:%v", order.VendorOrderID, err)
|
globals.SugarLogger.Warnf("updateAfsOrderSkuOtherInfo orderID:%s failed with err:%v", order.VendorOrderID, err)
|
||||||
return err
|
return err
|
||||||
@@ -295,6 +302,7 @@ func (c *OrderManager) updateAfsOrderSkuOtherInfo(db *dao.DaoDB, order *model.Af
|
|||||||
globals.SugarLogger.Infof("updateAfsOrderSkuOtherInfo [运营%s]%s订单sku找不到门店价格(或商品映射),orderID:%s, StoreID:%d, VendorSkuID:%s, sku:%v", opNumStr, model.VendorChineseNames[order.VendorID], order.VendorOrderID, jxStoreID, v.VendorSkuID, v)
|
globals.SugarLogger.Infof("updateAfsOrderSkuOtherInfo [运营%s]%s订单sku找不到门店价格(或商品映射),orderID:%s, StoreID:%d, VendorSkuID:%s, sku:%v", opNumStr, model.VendorChineseNames[order.VendorID], order.VendorOrderID, jxStoreID, v.VendorSkuID, v)
|
||||||
} else {
|
} else {
|
||||||
v.JxSkuID = skuBindInfo.SkuID
|
v.JxSkuID = skuBindInfo.SkuID
|
||||||
|
v.ShopPrice = int64(skuBindInfo.Price)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if actStoreSkuMap != nil {
|
if actStoreSkuMap != nil {
|
||||||
@@ -312,7 +320,7 @@ func (c *OrderManager) updateAfsOrderSkuOtherInfo(db *dao.DaoDB, order *model.Af
|
|||||||
func (c *OrderManager) updateAfsOrderOtherInfo(db *dao.DaoDB, afsOrder *model.AfsOrder) (err error) {
|
func (c *OrderManager) updateAfsOrderOtherInfo(db *dao.DaoDB, afsOrder *model.AfsOrder) (err error) {
|
||||||
globals.SugarLogger.Debugf("updateAfsOrderOtherInfo orderID:%s, VendorStoreID:%s", afsOrder.VendorOrderID, afsOrder.VendorStoreID)
|
globals.SugarLogger.Debugf("updateAfsOrderOtherInfo orderID:%s, VendorStoreID:%s", afsOrder.VendorOrderID, afsOrder.VendorStoreID)
|
||||||
if afsOrder.VendorStoreID != "" {
|
if afsOrder.VendorStoreID != "" {
|
||||||
if storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, afsOrder.VendorStoreID, 0); err == nil {
|
if storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, afsOrder.VendorStoreID, 0, ""); err == nil {
|
||||||
afsOrder.JxStoreID = storeDetail.Store.ID
|
afsOrder.JxStoreID = storeDetail.Store.ID
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ func (c *OrderManager) OnOrderComments(orderCommentList []*model.OrderComment) (
|
|||||||
err = nil
|
err = nil
|
||||||
isNewComment = true
|
isNewComment = true
|
||||||
if orderComment.IsReplied == 0 && time.Now().Sub(orderComment.CommentCreatedAt) < time.Duration(orderComment.ModifyDuration)*time.Hour {
|
if orderComment.IsReplied == 0 && time.Now().Sub(orderComment.CommentCreatedAt) < time.Duration(orderComment.ModifyDuration)*time.Hour {
|
||||||
if storeDetail, err2 := dao.GetStoreDetail(db, orderComment.StoreID, orderComment.VendorID); err2 == nil {
|
if storeDetail, err2 := dao.GetStoreDetail(db, orderComment.StoreID, orderComment.VendorID, ""); err2 == nil {
|
||||||
if storeDetail.AutoReplyType == model.AutoReplyAll ||
|
if storeDetail.AutoReplyType == model.AutoReplyAll ||
|
||||||
orderComment.Score > JX_BAD_COMMENTS_MAX_LEVEL && storeDetail.AutoReplyType == model.AutoReplyGoodComment {
|
orderComment.Score > JX_BAD_COMMENTS_MAX_LEVEL && storeDetail.AutoReplyType == model.AutoReplyGoodComment {
|
||||||
c.replyOrderComment(storeDetail.VendorOrgCode, orderComment)
|
c.replyOrderComment(storeDetail.VendorOrgCode, orderComment)
|
||||||
@@ -112,7 +112,7 @@ func (c *OrderManager) OnOrderComments(orderCommentList []*model.OrderComment) (
|
|||||||
orderComment.ConsigneeMobile = order.ConsigneeMobile2
|
orderComment.ConsigneeMobile = order.ConsigneeMobile2
|
||||||
} else {
|
} else {
|
||||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID); handler != nil {
|
if handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID); handler != nil {
|
||||||
if order2, _ := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID); order2 != nil && order.ConsigneeMobile != order2.ConsigneeMobile {
|
if order2, _ := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID); order2 != nil && order.ConsigneeMobile != order2.ConsigneeMobile {
|
||||||
order.ConsigneeMobile = order2.ConsigneeMobile
|
order.ConsigneeMobile = order2.ConsigneeMobile
|
||||||
partner.CurOrderManager.UpdateOrderFields(order, []string{"ConsigneeMobile"})
|
partner.CurOrderManager.UpdateOrderFields(order, []string{"ConsigneeMobile"})
|
||||||
}
|
}
|
||||||
@@ -120,7 +120,7 @@ func (c *OrderManager) OnOrderComments(orderCommentList []*model.OrderComment) (
|
|||||||
orderComment.ConsigneeMobile = order.ConsigneeMobile
|
orderComment.ConsigneeMobile = order.ConsigneeMobile
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, orderComment.VendorStoreID, orderComment.VendorID); err == nil {
|
if storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, orderComment.VendorStoreID, orderComment.VendorID, ""); err == nil {
|
||||||
orderComment.StoreID = storeDetail.ID
|
orderComment.StoreID = storeDetail.ID
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ func LoadPendingOrders() {
|
|||||||
for _, item := range sortOrders {
|
for _, item := range sortOrders {
|
||||||
if order, ok := item.(*model.GoodsOrder); ok {
|
if order, ok := item.(*model.GoodsOrder); ok {
|
||||||
jxutils.CallMsgHandlerAsync(func() {
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
scheduler.CurrentScheduler.OnOrderNew(order, true)
|
scheduler.CurrentScheduler.OnOrderNew(order, true, true)
|
||||||
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID))
|
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID))
|
||||||
} else if status, ok := item.(*model.OrderStatus); ok {
|
} else if status, ok := item.(*model.OrderStatus); ok {
|
||||||
jxutils.CallMsgHandlerAsync(func() {
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
|
|||||||
@@ -1,12 +1,17 @@
|
|||||||
package orderman
|
package orderman
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/globals/api"
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||||
@@ -62,11 +67,11 @@ type OrderCount struct {
|
|||||||
Flag bool `json:"flag"` //true表示可以买
|
Flag bool `json:"flag"` //true表示可以买
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours int, isIncludeFake bool) (countInfo []*model.GoodsOrderCountInfo, err error) {
|
func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, lastHours, lastMinutes int, isIncludeFake bool) (countInfo []*model.GoodsOrderCountInfo, err error) {
|
||||||
globals.SugarLogger.Debugf("GetStoreOrderCountInfo storeID:%d", storeID)
|
globals.SugarLogger.Debugf("GetStoreOrderCountInfo storeID:%d", storeID)
|
||||||
if lastHours > maxLastHours {
|
if lastHours > maxLastHours {
|
||||||
lastHours = maxLastHours
|
lastHours = maxLastHours
|
||||||
} else if lastHours == 0 {
|
} else if lastHours == 0 && lastMinutes == 0 {
|
||||||
lastHours = defLastHours
|
lastHours = defLastHours
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,7 +83,12 @@ func (c *OrderManager) GetStoreOrderCountInfo(ctx *jxcontext.Context, storeID, l
|
|||||||
AND t1.order_created_at >= ?`
|
AND t1.order_created_at >= ?`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
storeID,
|
storeID,
|
||||||
time.Now().Add(-time.Duration(lastHours) * time.Hour),
|
// time.Now().Add(-time.Duration(lastHours) * time.Hour),
|
||||||
|
}
|
||||||
|
if lastMinutes != 0 {
|
||||||
|
sqlParams = append(sqlParams, time.Now().Add(-time.Duration(lastMinutes)*time.Minute))
|
||||||
|
} else {
|
||||||
|
sqlParams = append(sqlParams, time.Now().Add(-time.Duration(lastHours)*time.Hour))
|
||||||
}
|
}
|
||||||
if !isIncludeFake {
|
if !isIncludeFake {
|
||||||
sql += " AND (t1.flag & ?) = 0"
|
sql += " AND (t1.flag & ?) = 0"
|
||||||
@@ -102,6 +112,7 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str
|
|||||||
if vendorID == model.VendorIDJD {
|
if vendorID == model.VendorIDJD {
|
||||||
fullSkuNameSQL = "CONCAT(t1.sku_name, IF(t3.is_spu = 1 AND LOCATE(';', t1.sku_name) = 0, CONCAT('[约', t2.spec_quality, t2.spec_unit, '/', t3.unit, ']'), ''))"
|
fullSkuNameSQL = "CONCAT(t1.sku_name, IF(t3.is_spu = 1 AND LOCATE(';', t1.sku_name) = 0, CONCAT('[约', t2.spec_quality, t2.spec_unit, '/', t3.unit, ']'), ''))"
|
||||||
}
|
}
|
||||||
|
// IF(t1.shop_price = 0, t1.sale_price, t1.shop_price) shop_price,
|
||||||
sql := fmt.Sprintf(`
|
sql := fmt.Sprintf(`
|
||||||
SELECT
|
SELECT
|
||||||
t1.id,
|
t1.id,
|
||||||
@@ -112,8 +123,8 @@ func (c *OrderManager) GetOrderSkuInfo(ctx *jxcontext.Context, vendorOrderID str
|
|||||||
t1.sku_id,
|
t1.sku_id,
|
||||||
t1.jx_sku_id,
|
t1.jx_sku_id,
|
||||||
t1.sku_name,
|
t1.sku_name,
|
||||||
IF(t1.shop_price = 0, t1.sale_price, t1.shop_price) shop_price,
|
|
||||||
t1.sale_price,
|
t1.sale_price,
|
||||||
|
t1.shop_price,
|
||||||
CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, ?) / 100) AS SIGNED) earning_price,
|
CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, ?) / 100) AS SIGNED) earning_price,
|
||||||
t1.weight,
|
t1.weight,
|
||||||
t1.sku_type,
|
t1.sku_type,
|
||||||
@@ -151,7 +162,9 @@ func (c *OrderManager) GetOrderInfo(ctx *jxcontext.Context, vendorOrderID string
|
|||||||
|
|
||||||
// 这里用QueryRows而不用QueryRow的原因是用QueryRow在这种情况下不能将数据读出,很奇怪。大概的原因是QueryRow对于GoodsOrderExt这种有嵌入的struct处理有问题
|
// 这里用QueryRows而不用QueryRow的原因是用QueryRow在这种情况下不能将数据读出,很奇怪。大概的原因是QueryRow对于GoodsOrderExt这种有嵌入的struct处理有问题
|
||||||
num, err := db.Raw(`
|
num, err := db.Raw(`
|
||||||
SELECT t3.*,ROUND(t3.shop_sum_price/t3.count) avg_price, t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile
|
SELECT t3.*,ROUND(t3.shop_sum_price/t3.count) avg_price, t1.*, t2.status waybill_status, t2.courier_name, t2.courier_mobile, t2.desired_fee,
|
||||||
|
CAST(t1.consignee_lng AS DECIMAL(15,6))/1000000 float_lng,
|
||||||
|
CAST(t1.consignee_lat AS DECIMAL(15,6))/1000000 float_lat
|
||||||
FROM goods_order t1
|
FROM goods_order t1
|
||||||
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id
|
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id
|
||||||
JOIN (
|
JOIN (
|
||||||
@@ -168,7 +181,7 @@ func (c *OrderManager) GetOrderInfo(ctx *jxcontext.Context, vendorOrderID string
|
|||||||
if err == nil && num > 0 {
|
if err == nil && num > 0 {
|
||||||
order = orders[0]
|
order = orders[0]
|
||||||
if isRefresh && vendorID == model.VendorIDJD {
|
if isRefresh && vendorID == model.VendorIDJD {
|
||||||
tmpOrder, err2 := partner.GetPurchaseOrderHandlerFromVendorID(vendorID).GetOrder(order.VendorOrgCode, vendorOrderID)
|
tmpOrder, err2 := partner.GetPurchaseOrderHandlerFromVendorID(vendorID).GetOrder(order.VendorOrgCode, vendorOrderID, order.VendorStoreID)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
order.CurrentConsigneeMobile = tmpOrder.ConsigneeMobile
|
order.CurrentConsigneeMobile = tmpOrder.ConsigneeMobile
|
||||||
} else {
|
} else {
|
||||||
@@ -275,6 +288,29 @@ func (c *OrderManager) ExportMTWaybills(ctx *jxcontext.Context, fromDateStr, toD
|
|||||||
|
|
||||||
func (c *OrderManager) GetOrders(ctx *jxcontext.Context, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, isJxFirst bool, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
func (c *OrderManager) GetOrders(ctx *jxcontext.Context, isIncludeFake bool, fromDateStr, toDateStr string, isDateFinish bool, skuIDs []int, isJxFirst bool, params map[string]interface{}, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
||||||
globals.SugarLogger.Debugf("GetOrders from:%s to:%s", fromDateStr, toDateStr)
|
globals.SugarLogger.Debugf("GetOrders from:%s to:%s", fromDateStr, toDateStr)
|
||||||
|
//权限
|
||||||
|
if permission.IsRoled(ctx) {
|
||||||
|
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
|
||||||
|
var storeIDs2 []int
|
||||||
|
if params["storeIDs"] != nil {
|
||||||
|
var storeIDs []int
|
||||||
|
if err = utils.UnmarshalUseNumber([]byte(params["storeIDs"].(string)), &storeIDs); err == nil {
|
||||||
|
for _, v := range storeIDs {
|
||||||
|
if storeIDsMap[v] != 0 {
|
||||||
|
storeIDs2 = append(storeIDs2, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for k, _ := range storeIDsMap {
|
||||||
|
storeIDs2 = append(storeIDs2, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if data, err := json.Marshal(storeIDs2); err == nil {
|
||||||
|
params["storeIDs"] = string(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
orders, totalCount, err := dao.GetOrders(dao.GetDB(), nil, false, isIncludeFake, fromDateStr, toDateStr, isDateFinish, skuIDs, isJxFirst, "", params, offset, pageSize)
|
orders, totalCount, err := dao.GetOrders(dao.GetDB(), nil, false, isIncludeFake, fromDateStr, toDateStr, isDateFinish, skuIDs, isJxFirst, "", params, offset, pageSize)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
pagedInfo = &model.PagedInfo{
|
pagedInfo = &model.PagedInfo{
|
||||||
@@ -296,6 +332,29 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS
|
|||||||
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||||
switch step {
|
switch step {
|
||||||
case 0:
|
case 0:
|
||||||
|
//权限
|
||||||
|
if permission.IsRoled(ctx) {
|
||||||
|
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
|
||||||
|
var storeIDs2 []int
|
||||||
|
if mapParams["storeIDs"] != nil {
|
||||||
|
var storeIDs []int
|
||||||
|
if err = utils.UnmarshalUseNumber([]byte(mapParams["storeIDs"].(string)), &storeIDs); err == nil {
|
||||||
|
for _, v := range storeIDs {
|
||||||
|
if storeIDsMap[v] != 0 {
|
||||||
|
storeIDs2 = append(storeIDs2, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for k, _ := range storeIDsMap {
|
||||||
|
storeIDs2 = append(storeIDs2, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if data, err := json.Marshal(storeIDs2); err == nil {
|
||||||
|
mapParams["storeIDs"] = string(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
orders, _, err = dao.GetOrders(dao.GetDB(), nil, true, true, fromDateStr, toDateStr, true, nil, false, "", mapParams, 0, model.UnlimitedPageSize)
|
orders, _, err = dao.GetOrders(dao.GetDB(), nil, true, true, fromDateStr, toDateStr, true, nil, false, "", mapParams, 0, model.UnlimitedPageSize)
|
||||||
globals.SugarLogger.Debugf("orders:%d, er:%v", len(orders), err)
|
globals.SugarLogger.Debugf("orders:%d, er:%v", len(orders), err)
|
||||||
case 1:
|
case 1:
|
||||||
@@ -314,111 +373,35 @@ func (c *OrderManager) ExportOrders(ctx *jxcontext.Context, fromDateStr, toDateS
|
|||||||
afsInfo[v.SkuID].Count -= minus
|
afsInfo[v.SkuID].Count -= minus
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if v.SkuCount2 == 1 {
|
|
||||||
// skuStr1 := strings.Join([]string{
|
|
||||||
// utils.Int2Str(v.SkuID),
|
|
||||||
// utils.Int2Str(v.SkuCount2),
|
|
||||||
// utils.Int2Str(v.SkuShopPrice),
|
|
||||||
// utils.Int2Str(v.SkuSalePrice),
|
|
||||||
// utils.Int2Str(v.SkuEarningPrice),
|
|
||||||
// }, ",")
|
|
||||||
// if order == nil || v.ID != order.ID {
|
|
||||||
// order = v
|
|
||||||
// v.CourierVendorName = model.VendorChineseNames[v.WaybillVendorID]
|
|
||||||
// v.Status2 = model.OrderStatusName[v.Status]
|
|
||||||
// v.SkuInfo = skuStr1
|
|
||||||
// v.SkuInfo2 = skuStr1
|
|
||||||
// orders2 = append(orders2, v)
|
|
||||||
// } else {
|
|
||||||
// order.SkuInfo += ";" + skuStr1
|
|
||||||
// order.SkuInfo2 += ";" + skuStr1
|
|
||||||
// }
|
|
||||||
// } else if v.SkuCount2 > 1 {
|
|
||||||
// storeID := 0
|
|
||||||
// if v.StoreID == 0 {
|
|
||||||
// storeID = v.JxStoreID
|
|
||||||
// } else {
|
|
||||||
// storeID = v.StoreID
|
|
||||||
// }
|
|
||||||
// result, _ := dao.GetEffectiveActStoreSkuInfo(dao.GetDB(), 0, nil, 0, []int{storeID}, []int{v.SkuID}, v.OrderCreatedAt, v.OrderCreatedAt)
|
|
||||||
// if len(result) > 0 {
|
|
||||||
// if result[0].EarningPrice != 0 {
|
|
||||||
// var (
|
|
||||||
// storePayPercentage, price int
|
|
||||||
// )
|
|
||||||
// stores, _ := dao.GetStoreList(dao.GetDB(), []int{v.StoreID}, nil, nil, nil, "")
|
|
||||||
// if len(stores) > 0 {
|
|
||||||
// storePayPercentage = stores[0].PayPercentage
|
|
||||||
// } else {
|
|
||||||
// storePayPercentage = 70
|
|
||||||
// }
|
|
||||||
// skuStr1 := strings.Join([]string{
|
|
||||||
// utils.Int2Str(v.SkuID),
|
|
||||||
// utils.Int2Str(v.SkuCount2),
|
|
||||||
// utils.Int2Str(v.SkuShopPrice),
|
|
||||||
// utils.Int2Str(v.SkuSalePrice),
|
|
||||||
// utils.Int2Str(v.SkuEarningPrice),
|
|
||||||
// }, ",")
|
|
||||||
// skuStr2 := strings.Join([]string{
|
|
||||||
// utils.Int2Str(v.SkuID),
|
|
||||||
// utils.Int2Str(1),
|
|
||||||
// utils.Int2Str(v.SkuShopPrice),
|
|
||||||
// utils.Int2Str(v.SkuSalePrice),
|
|
||||||
// utils.Int2Str(v.SkuEarningPrice),
|
|
||||||
// }, ",")
|
|
||||||
// if v.SkuShopPrice < v.SkuSalePrice {
|
|
||||||
// price = v.SkuShopPrice * storePayPercentage
|
|
||||||
// } else {
|
|
||||||
// price = v.SkuSalePrice * storePayPercentage
|
|
||||||
// }
|
|
||||||
// skuStr3 := strings.Join([]string{
|
|
||||||
// utils.Int2Str(v.SkuID),
|
|
||||||
// utils.Int2Str(v.SkuCount2 - 1),
|
|
||||||
// utils.Int2Str(v.SkuShopPrice),
|
|
||||||
// utils.Int2Str(v.SkuSalePrice),
|
|
||||||
// utils.Int2Str(price),
|
|
||||||
// }, ",")
|
|
||||||
// if order == nil || v.ID != order.ID {
|
|
||||||
// order = v
|
|
||||||
// v.CourierVendorName = model.VendorChineseNames[v.WaybillVendorID]
|
|
||||||
// v.Status2 = model.OrderStatusName[v.Status]
|
|
||||||
// v.SkuInfo2 = skuStr1
|
|
||||||
// v.SkuInfo = skuStr2 + ";" + skuStr3
|
|
||||||
// orders2 = append(orders2, v)
|
|
||||||
// } else {
|
|
||||||
// order.SkuInfo2 += ";" + skuStr1
|
|
||||||
// order.SkuInfo += ";" + skuStr2 + ";" + skuStr3
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// skuStr1 := strings.Join([]string{
|
|
||||||
// utils.Int2Str(v.SkuID),
|
|
||||||
// utils.Int2Str(v.SkuCount2),
|
|
||||||
// utils.Int2Str(v.SkuShopPrice),
|
|
||||||
// utils.Int2Str(v.SkuSalePrice),
|
|
||||||
// utils.Int2Str(v.SkuEarningPrice),
|
|
||||||
// }, ",")
|
|
||||||
// if order == nil || v.ID != order.ID {
|
|
||||||
// order = v
|
|
||||||
// v.CourierVendorName = model.VendorChineseNames[v.WaybillVendorID]
|
|
||||||
// v.Status2 = model.OrderStatusName[v.Status]
|
|
||||||
// v.SkuInfo = skuStr1
|
|
||||||
// v.SkuInfo2 = skuStr1
|
|
||||||
// orders2 = append(orders2, v)
|
|
||||||
// } else {
|
|
||||||
// order.SkuInfo += ";" + skuStr1
|
|
||||||
// order.SkuInfo2 += ";" + skuStr1
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
if v.SkuCount2 > 0 {
|
if v.SkuCount2 > 0 {
|
||||||
skuStr := strings.Join([]string{
|
var skuStr string
|
||||||
|
if beego.BConfig.RunMode == "jxgy" {
|
||||||
|
skuStr = strings.Join([]string{
|
||||||
utils.Int2Str(v.SkuID),
|
utils.Int2Str(v.SkuID),
|
||||||
utils.Int2Str(v.SkuCount2),
|
utils.Int2Str(v.SkuCount2),
|
||||||
utils.Int2Str(v.SkuShopPrice),
|
utils.Int2Str(v.SkuShopPrice),
|
||||||
utils.Int2Str(v.SkuSalePrice),
|
utils.Int2Str(v.SkuSalePrice),
|
||||||
utils.Int2Str(v.SkuEarningPrice),
|
utils.Int2Str(v.SkuEarningPrice),
|
||||||
}, ",")
|
}, ",")
|
||||||
|
} else {
|
||||||
|
if v.EarningType == model.EarningTypeQuote {
|
||||||
|
skuStr = strings.Join([]string{
|
||||||
|
utils.Int2Str(v.SkuID),
|
||||||
|
utils.Int2Str(v.SkuCount2),
|
||||||
|
utils.Int2Str(v.SkuEarningPrice),
|
||||||
|
utils.Int2Str(v.SkuSalePrice),
|
||||||
|
utils.Int2Str(v.SkuShopPrice),
|
||||||
|
}, ",")
|
||||||
|
} else {
|
||||||
|
skuStr = strings.Join([]string{
|
||||||
|
utils.Int2Str(v.SkuID),
|
||||||
|
utils.Int2Str(v.SkuCount2),
|
||||||
|
utils.Int2Str(v.SkuShopPrice),
|
||||||
|
utils.Int2Str(v.SkuSalePrice),
|
||||||
|
utils.Int2Str(v.SkuEarningPrice),
|
||||||
|
}, ",")
|
||||||
|
}
|
||||||
|
}
|
||||||
if order == nil || v.ID != order.ID {
|
if order == nil || v.ID != order.ID {
|
||||||
order = v
|
order = v
|
||||||
v.CourierVendorName = model.VendorChineseNames[v.WaybillVendorID]
|
v.CourierVendorName = model.VendorChineseNames[v.WaybillVendorID]
|
||||||
@@ -728,10 +711,10 @@ func (c *OrderManager) GetStoresOrderSaleInfo(ctx *jxcontext.Context, storeIDLis
|
|||||||
|
|
||||||
func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeIDList []int, fromTime time.Time, toTime time.Time, statusList []int) (saleInfoList []*dao.StoresOrderSaleInfo, err error) {
|
func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeIDList []int, fromTime time.Time, toTime time.Time, statusList []int) (saleInfoList []*dao.StoresOrderSaleInfo, err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
// var isFinish = true
|
var isLongTime = false
|
||||||
// if toTime.Sub(fromTime).Hours() > 24 {
|
if toTime.Sub(fromTime).Hours() > 24 {
|
||||||
// isFinish = false
|
isLongTime = true
|
||||||
// }
|
}
|
||||||
orderSkuList, err := dao.GetStoreOrderSkuList(db, storeIDList, fromTime, toTime, statusList, true)
|
orderSkuList, err := dao.GetStoreOrderSkuList(db, storeIDList, fromTime, toTime, statusList, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -753,6 +736,7 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
|
|||||||
flagVendorOrderID = skuList[0].VendorOrderID
|
flagVendorOrderID = skuList[0].VendorOrderID
|
||||||
}
|
}
|
||||||
for k, v := range skuList {
|
for k, v := range skuList {
|
||||||
|
storeDetail, _ := dao.GetStoreDetail(db, v.StoreID, v.VendorID, "")
|
||||||
if v.EarningPrice == 0 {
|
if v.EarningPrice == 0 {
|
||||||
v.EarningPrice = jxutils.CaculateSkuEarningPrice(v.ShopPrice, v.SalePrice, v.PayPercentage)
|
v.EarningPrice = jxutils.CaculateSkuEarningPrice(v.ShopPrice, v.SalePrice, v.PayPercentage)
|
||||||
}
|
}
|
||||||
@@ -771,6 +755,16 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
|
|||||||
}
|
}
|
||||||
saleInfoMap[index] = saleInfo
|
saleInfoMap[index] = saleInfo
|
||||||
}
|
}
|
||||||
|
//成都菜市
|
||||||
|
if beego.BConfig.RunMode == "prod" || beego.BConfig.RunMode == "beta" {
|
||||||
|
if v.EarningType == model.EarningTypeQuote {
|
||||||
|
saleInfo.RealEarningPrice += v.ShopPrice * int64(v.Count)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if v.OrderPayPercentage == 100 {
|
||||||
|
saleInfo.RealEarningPrice += v.ShopPrice * int64(v.Count)
|
||||||
|
}
|
||||||
|
}
|
||||||
saleInfo.ShopPrice += v.ShopPrice * int64(v.Count)
|
saleInfo.ShopPrice += v.ShopPrice * int64(v.Count)
|
||||||
saleInfo.VendorPrice += v.VendorPrice * int64(v.Count)
|
saleInfo.VendorPrice += v.VendorPrice * int64(v.Count)
|
||||||
saleInfo.SalePrice += v.SalePrice * int64(v.Count)
|
saleInfo.SalePrice += v.SalePrice * int64(v.Count)
|
||||||
@@ -778,10 +772,37 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
|
|||||||
if v.VendorOrderID == flagVendorOrderID {
|
if v.VendorOrderID == flagVendorOrderID {
|
||||||
if k == 0 {
|
if k == 0 {
|
||||||
saleInfo.EarningPrice = v.NewEarningPrice
|
saleInfo.EarningPrice = v.NewEarningPrice
|
||||||
|
if beego.BConfig.RunMode == "prod" || beego.BConfig.RunMode == "beta" {
|
||||||
|
if v.EarningType == model.EarningTypePoints {
|
||||||
|
if storeDetail.VendorPayPercentage != 0 && !isLongTime {
|
||||||
|
saleInfo.RealEarningPrice += 0
|
||||||
|
} else {
|
||||||
|
saleInfo.RealEarningPrice += v.NewEarningPrice
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if v.OrderPayPercentage < 100 {
|
||||||
|
saleInfo.RealEarningPrice += v.NewEarningPrice
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
flagVendorOrderID = v.VendorOrderID
|
flagVendorOrderID = v.VendorOrderID
|
||||||
saleInfo.EarningPrice += v.NewEarningPrice
|
saleInfo.EarningPrice += v.NewEarningPrice
|
||||||
|
if beego.BConfig.RunMode == "prod" || beego.BConfig.RunMode == "beta" {
|
||||||
|
if v.EarningType == model.EarningTypePoints {
|
||||||
|
if storeDetail.VendorPayPercentage != 0 && !isLongTime {
|
||||||
|
saleInfo.RealEarningPrice += 0
|
||||||
|
} else {
|
||||||
|
// && v.VendorID != model.VendorIDJD && v.CityCode != 510100
|
||||||
|
saleInfo.RealEarningPrice += v.NewEarningPrice
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if v.OrderPayPercentage < 100 {
|
||||||
|
saleInfo.RealEarningPrice += v.NewEarningPrice
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
universalOrderID := jxutils.ComposeUniversalOrderID(v.VendorOrderID, v.VendorID)
|
universalOrderID := jxutils.ComposeUniversalOrderID(v.VendorOrderID, v.VendorID)
|
||||||
@@ -868,7 +889,25 @@ func (c *OrderManager) GetStoresOrderSaleInfoNew(ctx *jxcontext.Context, storeID
|
|||||||
|
|
||||||
func (c *OrderManager) GetAfsOrders(ctx *jxcontext.Context, keyword, afsOrderID, vendorOrderID string, vendorIDList, appealTypeList, storeIDList, statusList, skuIDs []int, fromTime, toTime time.Time, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
func (c *OrderManager) GetAfsOrders(ctx *jxcontext.Context, keyword, afsOrderID, vendorOrderID string, vendorIDList, appealTypeList, storeIDList, statusList, skuIDs []int, fromTime, toTime time.Time, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
||||||
globals.SugarLogger.Debugf("GetAfsOrders")
|
globals.SugarLogger.Debugf("GetAfsOrders")
|
||||||
|
//权限
|
||||||
|
if permission.IsRoled(ctx) {
|
||||||
|
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
|
||||||
|
var storeIDs2 []int
|
||||||
|
if len(storeIDList) > 0 {
|
||||||
|
for _, v := range storeIDList {
|
||||||
|
if storeIDsMap[v] != 0 {
|
||||||
|
storeIDs2 = append(storeIDs2, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for k, _ := range storeIDsMap {
|
||||||
|
storeIDs2 = append(storeIDs2, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
storeIDList = nil
|
||||||
|
storeIDList = storeIDs2
|
||||||
|
}
|
||||||
|
}
|
||||||
pageSize = jxutils.FormalizePageSize(pageSize)
|
pageSize = jxutils.FormalizePageSize(pageSize)
|
||||||
offset = jxutils.FormalizePageOffset(offset)
|
offset = jxutils.FormalizePageOffset(offset)
|
||||||
sql := `
|
sql := `
|
||||||
@@ -993,11 +1032,11 @@ func (c *OrderManager) getAfsOrderSkuInfo4ExportOrders(ctx *jxcontext.Context, f
|
|||||||
if err = err2; err != nil {
|
if err = err2; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
toDate = toDate.Add(7 * 24 * time.Hour) // todo 售后单最多只可能延后7天吧
|
toDate = toDate.Add(30 * 24 * time.Hour) // todo 售后单最多只可能延后7天吧
|
||||||
sql := `
|
sql := `
|
||||||
SELECT t2.*
|
SELECT t2.*
|
||||||
FROM afs_order t1
|
FROM afs_order t1
|
||||||
JOIN order_sku_financial t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id AND t2.is_afs_order = 1
|
JOIN order_sku_financial t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id AND t2.is_afs_order = 1 AND t1.afs_order_id = t2.afs_order_id
|
||||||
WHERE t1.afs_finished_at >= ? AND t1.afs_finished_at <= ? AND t1.status = ?
|
WHERE t1.afs_finished_at >= ? AND t1.afs_finished_at <= ? AND t1.status = ?
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
@@ -1006,6 +1045,8 @@ func (c *OrderManager) getAfsOrderSkuInfo4ExportOrders(ctx *jxcontext.Context, f
|
|||||||
model.AfsOrderStatusFinished,
|
model.AfsOrderStatusFinished,
|
||||||
}
|
}
|
||||||
var skus []*model.OrderSkuFinancial
|
var skus []*model.OrderSkuFinancial
|
||||||
|
fmt.Println(sql)
|
||||||
|
fmt.Println(sqlParams)
|
||||||
if err = dao.GetRows(dao.GetDB(), &skus, sql, sqlParams...); err == nil {
|
if err = dao.GetRows(dao.GetDB(), &skus, sql, sqlParams...); err == nil {
|
||||||
skuMap = make(map[string]map[int]*model.OrderSkuFinancial)
|
skuMap = make(map[string]map[int]*model.OrderSkuFinancial)
|
||||||
for _, v := range skus {
|
for _, v := range skus {
|
||||||
@@ -1096,6 +1137,7 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
|
|||||||
VendorOrderID string
|
VendorOrderID string
|
||||||
VendorID int
|
VendorID int
|
||||||
VendorOrgCode string
|
VendorOrgCode string
|
||||||
|
VendorStoreID string
|
||||||
}
|
}
|
||||||
if len(dateVendorList) > 0 {
|
if len(dateVendorList) > 0 {
|
||||||
var missingOrderList []*tOrderVendorPair
|
var missingOrderList []*tOrderVendorPair
|
||||||
@@ -1104,7 +1146,7 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
|
|||||||
vendorStoreIDMap := make(map[int]string)
|
vendorStoreIDMap := make(map[int]string)
|
||||||
if storeID > 0 {
|
if storeID > 0 {
|
||||||
for _, vendorID := range vendorIDs {
|
for _, vendorID := range vendorIDs {
|
||||||
storeDetail, err2 := dao.GetStoreDetail(db, storeID, vendorID)
|
storeDetail, err2 := dao.GetStoreDetail(db, storeID, vendorID, "")
|
||||||
if err = err2; err != nil {
|
if err = err2; err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -1123,11 +1165,17 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
|
|||||||
if err = err2; err == nil && len(orderIDs) > 0 {
|
if err = err2; err == nil && len(orderIDs) > 0 {
|
||||||
var orderList []*tOrderVendorPair
|
var orderList []*tOrderVendorPair
|
||||||
for _, v := range orderIDs {
|
for _, v := range orderIDs {
|
||||||
|
var vendorStoreID string
|
||||||
|
if orders, _ := dao.QueryOrders(db, v, 0, nil, 0, utils.ZeroTimeValue, utils.ZeroTimeValue); len(orders) > 0 {
|
||||||
|
vendorStoreID = orders[0].VendorStoreID
|
||||||
|
}
|
||||||
orderList = append(orderList, &tOrderVendorPair{
|
orderList = append(orderList, &tOrderVendorPair{
|
||||||
VendorOrderID: v,
|
VendorOrderID: v,
|
||||||
VendorID: vendorDate.VendorID,
|
VendorID: vendorDate.VendorID,
|
||||||
VendorOrgCode: vendorDate.VendorOrgCode,
|
VendorOrgCode: vendorDate.VendorOrgCode,
|
||||||
|
VendorStoreID: vendorStoreID,
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
retVal = orderList
|
retVal = orderList
|
||||||
}
|
}
|
||||||
@@ -1172,7 +1220,7 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
|
|||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
pair := batchItemList[0].(*tOrderVendorPair)
|
pair := batchItemList[0].(*tOrderVendorPair)
|
||||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(pair.VendorID); handler != nil {
|
if handler := partner.GetPurchaseOrderHandlerFromVendorID(pair.VendorID); handler != nil {
|
||||||
order, err2 := handler.GetOrder(pair.VendorOrgCode, pair.VendorOrderID)
|
order, err2 := handler.GetOrder(pair.VendorOrgCode, pair.VendorOrderID, pair.VendorStoreID)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
isDuplicated, err2 := c.SaveOrder(order, false, dao.GetDB())
|
isDuplicated, err2 := c.SaveOrder(order, false, dao.GetDB())
|
||||||
if err2 == nil && !isDuplicated {
|
if err2 == nil && !isDuplicated {
|
||||||
@@ -1192,7 +1240,7 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
|
|||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
goodsOrder := batchItemList[0].(*model.GoodsOrder)
|
goodsOrder := batchItemList[0].(*model.GoodsOrder)
|
||||||
if handler := partner.GetPurchaseOrderHandlerFromVendorID(goodsOrder.VendorID); handler != nil {
|
if handler := partner.GetPurchaseOrderHandlerFromVendorID(goodsOrder.VendorID); handler != nil {
|
||||||
order, err2 := handler.GetOrder(goodsOrder.VendorOrgCode, goodsOrder.VendorOrderID)
|
order, err2 := handler.GetOrder(goodsOrder.VendorOrgCode, goodsOrder.VendorOrderID, goodsOrder.VendorStoreID)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
if model.IsOrderFinalStatus(order.Status) {
|
if model.IsOrderFinalStatus(order.Status) {
|
||||||
goodsOrder.Status = order.Status
|
goodsOrder.Status = order.Status
|
||||||
@@ -1246,7 +1294,7 @@ func (c *OrderManager) RefreshOrderFinancial(ctx *jxcontext.Context, fromTime, t
|
|||||||
order := batchItemList[0].(*model.GoodsOrder)
|
order := batchItemList[0].(*model.GoodsOrder)
|
||||||
handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID)
|
handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID)
|
||||||
if handler != nil {
|
if handler != nil {
|
||||||
remoteOrder, err2 := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID)
|
remoteOrder, err2 := handler.GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
order.TotalShopMoney = remoteOrder.TotalShopMoney
|
order.TotalShopMoney = remoteOrder.TotalShopMoney
|
||||||
order.PmSubsidyMoney = remoteOrder.PmSubsidyMoney
|
order.PmSubsidyMoney = remoteOrder.PmSubsidyMoney
|
||||||
@@ -1310,7 +1358,7 @@ func GetMatterStoreOrderCount(ctx *jxcontext.Context, storeID int) (result *Orde
|
|||||||
err = dao.GetRows(db, &orderPays, sql, sqlParams)
|
err = dao.GetRows(db, &orderPays, sql, sqlParams)
|
||||||
if len(orderPays) != 0 {
|
if len(orderPays) != 0 {
|
||||||
orderPay := orderPays[0]
|
orderPay := orderPays[0]
|
||||||
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "")
|
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, nil, "")
|
||||||
if len(stores) > 0 {
|
if len(stores) > 0 {
|
||||||
store := stores[0]
|
store := stores[0]
|
||||||
if store.IsBoughtMatter == model.YES {
|
if store.IsBoughtMatter == model.YES {
|
||||||
@@ -1352,17 +1400,27 @@ func RefreshJdShopOrdersEarningPrice(ctx *jxcontext.Context, orderStartTime, ord
|
|||||||
var (
|
var (
|
||||||
db = dao.GetDB()
|
db = dao.GetDB()
|
||||||
)
|
)
|
||||||
results, err := api.JdAPI.GetJdShopOrders(orderStartTime, orderEndTime, globals.JdOrgCode, globals.JdLoginName)
|
results, err := api.JdAPI.GetJdShopOrders(utils.Str2Time(orderStartTime).Format("20060102"), utils.Str2Time(orderEndTime).Format("20060102"), globals.JdOrgCode, globals.JdLoginName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, v := range results.BillList.Result {
|
for _, v := range results.BillList.Result {
|
||||||
if v.DueAmount != 0 {
|
if v.DueAmount != 0 {
|
||||||
order := &model.GoodsOrder{}
|
order, _ := partner.CurOrderManager.LoadOrder(utils.Int64ToStr(v.OrderID), model.VendorIDJD)
|
||||||
order.VendorOrderID = utils.Int64ToStr(v.OrderID)
|
if order == nil {
|
||||||
dao.GetEntity(db, order, "VendorOrderID")
|
continue
|
||||||
|
}
|
||||||
|
stores, _ := dao.GetStoreList(db, []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, nil, nil, nil, "")
|
||||||
|
if len(stores) > 0 {
|
||||||
|
store := stores[0]
|
||||||
|
if order.NewEarningPrice == 0 {
|
||||||
|
jxutils.RefreshOrderEarningPrice2(order, store.PayPercentage)
|
||||||
|
}
|
||||||
|
if order.TotalShopMoney == 0 {
|
||||||
order.TotalShopMoney = utils.Float64TwoInt64(v.DueAmount * 100)
|
order.TotalShopMoney = utils.Float64TwoInt64(v.DueAmount * 100)
|
||||||
dao.UpdateEntity(db, order, "TotalShopMoney")
|
}
|
||||||
|
dao.UpdateEntity(db, order, "TotalShopMoney", "NewEarningPrice")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ type BaseScheduler struct {
|
|||||||
|
|
||||||
func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
|
func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
|
||||||
globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt)
|
globals.SugarLogger.Infof("AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt)
|
||||||
if /*order.LockStatus == model.OrderStatusUnknown && */ order.Status == model.OrderStatusNew {
|
if /*order.LockStatus == model.OrderStatusUnknown && */ order.Status == model.OrderStatusNew || order.Status == model.OrderStatusWaitAccepted {
|
||||||
if c.IsReallyCallPlatformAPI {
|
if c.IsReallyCallPlatformAPI {
|
||||||
err = utils.CallFuncLogErrorWithInfo(func() error {
|
err = utils.CallFuncLogErrorWithInfo(func() error {
|
||||||
return partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt, userName)
|
return partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).AcceptOrRefuseOrder(order, isAcceptIt, userName)
|
||||||
@@ -34,7 +34,7 @@ func (c *BaseScheduler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
func (c *BaseScheduler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
||||||
globals.SugarLogger.Infof("PickupGoods orderID:%s", order.VendorOrderID)
|
globals.SugarLogger.Infof("PickupGoods orderID:%s,order :%v", order.VendorOrderID, utils.Format4Output(order, false))
|
||||||
if /*order.LockStatus == model.OrderStatusUnknown && */ order.Status == model.OrderStatusAccepted {
|
if /*order.LockStatus == model.OrderStatusUnknown && */ order.Status == model.OrderStatusAccepted {
|
||||||
if c.IsReallyCallPlatformAPI {
|
if c.IsReallyCallPlatformAPI {
|
||||||
handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID)
|
handler := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID)
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
|
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/baseapi/utils/errlist"
|
"git.rosy.net.cn/baseapi/utils/errlist"
|
||||||
@@ -27,7 +29,7 @@ const (
|
|||||||
func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs, excludeCourierVendorIDs []int, maxDeliveryFee int64, createOnlyOne bool) (bills []*model.Waybill, err error) {
|
func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *model.GoodsOrder, courierVendorIDs, excludeCourierVendorIDs []int, maxDeliveryFee int64, createOnlyOne bool) (bills []*model.Waybill, err error) {
|
||||||
userName := ctx.GetUserName()
|
userName := ctx.GetUserName()
|
||||||
globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s, courierVendorIDs:%v, excludeCourierVendorIDs:%v", order.VendorOrderID, userName, courierVendorIDs, excludeCourierVendorIDs)
|
globals.SugarLogger.Infof("CreateWaybillOnProviders orderID:%s userName:%s, courierVendorIDs:%v, excludeCourierVendorIDs:%v", order.VendorOrderID, userName, courierVendorIDs, excludeCourierVendorIDs)
|
||||||
storeCourierList, err := dao.GetStoreCourierList(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, model.StoreStatusOpened, model.StoreAuditStatusOnline)
|
storeCourierList, err := dao.GetStoreCourierList2(dao.GetDB(), []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, model.StoreStatusOpened, []int{model.StoreAuditStatusOnline, model.StoreAuditStatusUpdated})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -41,13 +43,6 @@ func (c *BaseScheduler) CreateWaybillOnProviders(ctx *jxcontext.Context, order *
|
|||||||
courierVendorID := storeCourier.VendorID
|
courierVendorID := storeCourier.VendorID
|
||||||
bill, err2 := c.CreateWaybill(courierVendorID, order, maxDeliveryFee)
|
bill, err2 := c.CreateWaybill(courierVendorID, order, maxDeliveryFee)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
stores, _ := dao.GetStoreList(dao.GetDB(), []int{order.StoreID}, nil, nil, nil, "")
|
|
||||||
if len(stores) > 0 {
|
|
||||||
if stores[0].PayPercentage <= 50 {
|
|
||||||
order.NewEarningPrice = (order.TotalShopMoney - bill.DesiredFee) * int64((100 - stores[0].PayPercentage/2)) / 100
|
|
||||||
dao.UpdateEntity(dao.GetDB(), order, "NewEarningPrice")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d bill:%v", order.VendorOrderID, userName, courierVendorID, bill)
|
globals.SugarLogger.Debugf("CreateWaybillOnProviders orderID:%s userName:%s vendorID:%d bill:%v", order.VendorOrderID, userName, courierVendorID, bill)
|
||||||
bills = append(bills, bill)
|
bills = append(bills, bill)
|
||||||
if createOnlyOne {
|
if createOnlyOne {
|
||||||
@@ -107,7 +102,8 @@ func (c *BaseScheduler) PickupGoodsAndUpdateStatus(ctx *jxcontext.Context, vendo
|
|||||||
globals.SugarLogger.Infof("PickupGoodsAndUpdateStatus orderID:%s userName:%s", vendorOrderID, userName)
|
globals.SugarLogger.Infof("PickupGoodsAndUpdateStatus orderID:%s userName:%s", vendorOrderID, userName)
|
||||||
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
|
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, vendorID)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
err = c.PickupGoods(order, model.IsOrderDeliveryByStore(order), userName)
|
flag := model.IsOrderDeliveryByStore(order) || model.IsOrderDeliveryBySelf(order)
|
||||||
|
err = c.PickupGoods(order, flag, userName)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
order.Status = model.OrderStatusFinishedPickup
|
order.Status = model.OrderStatusFinishedPickup
|
||||||
if err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order); err == nil {
|
if err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order); err == nil {
|
||||||
@@ -147,7 +143,7 @@ func (c *BaseScheduler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOr
|
|||||||
if globals.IsAddEvent {
|
if globals.IsAddEvent {
|
||||||
err = cms.AddEventDetail(dao.GetDB(), ctx, model.OperateUpdate, order.StoreID, model.ThingTypeOrder, order.StoreID, order.VendorOrderID, order.StoreName)
|
err = cms.AddEventDetail(dao.GetDB(), ctx, model.OperateUpdate, order.StoreID, model.ThingTypeOrder, order.StoreID, order.VendorOrderID, order.StoreName)
|
||||||
}
|
}
|
||||||
err = partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).CancelOrder(ctx, order, reason)
|
err = partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).CancelOrder(ctx, order, reason+","+ctx.GetUserName())
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -220,6 +216,37 @@ func (c *BaseScheduler) AgreeOrRefuseRefund(ctx *jxcontext.Context, afsOrderID s
|
|||||||
flag = model.AfsOrderFlagRefuseUserRefund
|
flag = model.AfsOrderFlagRefuseUserRefund
|
||||||
afsOrder.RefuseReason = reason
|
afsOrder.RefuseReason = reason
|
||||||
partner.CurOrderManager.UpdateAfsOrderFields(afsOrder, []string{"RefuseReason"})
|
partner.CurOrderManager.UpdateAfsOrderFields(afsOrder, []string{"RefuseReason"})
|
||||||
|
} else {
|
||||||
|
if order, _ := partner.CurOrderManager.LoadOrder(afsOrder.VendorOrderID, afsOrder.VendorID); order != nil {
|
||||||
|
if order.EarningType == model.EarningTypePoints {
|
||||||
|
var (
|
||||||
|
skuMap = make(map[int]*model.OrderSku)
|
||||||
|
diff int64
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
for _, sku := range order.Skus {
|
||||||
|
skuMap[sku.SkuID] = sku
|
||||||
|
}
|
||||||
|
storeDetail, _ := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
waybills, _ := dao.GetWaybills(db, order.VendorOrderID)
|
||||||
|
//京东商城和京西要重新算totalshopmoney等
|
||||||
|
if order.VendorID == model.VendorIDJDShop || order.VendorID == model.VendorIDJX {
|
||||||
|
skus, _ := dao.GetAfsOrderSkuInfo(db, order.VendorOrderID, afsOrderID, order.VendorID, false)
|
||||||
|
for _, v := range skus {
|
||||||
|
if skuMap[v.SkuID] != nil {
|
||||||
|
diff += skuMap[v.SkuID].SalePrice * int64(v.Count)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
order.TotalShopMoney = utils.Float64TwoInt64(float64(float64(order.TotalShopMoney)/jdshopapi.JdsPayPercentage-float64(diff)) * jdshopapi.JdsPayPercentage)
|
||||||
|
if len(waybills) > 0 {
|
||||||
|
jxutils.RefreshOrderEarningPrice3(order, storeDetail.PayPercentage, waybills[0])
|
||||||
|
} else {
|
||||||
|
jxutils.RefreshOrderEarningPrice2(order, storeDetail.PayPercentage)
|
||||||
|
}
|
||||||
|
dao.UpdateEntity(db, order, "TotalShopMoney", "NewEarningPrice")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dao.SetAfsOrderFlag(dao.GetDB(), ctx.GetUserName(), afsOrderID, vendorID, flag)
|
dao.SetAfsOrderFlag(dao.GetDB(), ctx.GetUserName(), afsOrderID, vendorID, flag)
|
||||||
}
|
}
|
||||||
@@ -285,7 +312,7 @@ func (c *BaseScheduler) SetOrderWaybillTipByOrder(ctx *jxcontext.Context, order
|
|||||||
}
|
}
|
||||||
|
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
storeDetail, err2 := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID)
|
storeDetail, err2 := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
if err = err2; err != nil {
|
if err = err2; err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,16 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
|
|
||||||
|
push "git.rosy.net.cn/jx-callback/business/jxutils/unipush"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/authz"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/authz/autils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
|
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
@@ -36,7 +46,7 @@ const (
|
|||||||
|
|
||||||
time2AutoPickupMin = 14 * time.Minute // 自动拣货等待时间,这个只有在没有PickDeadline信息才有用,否则会根据PickDeadline设置
|
time2AutoPickupMin = 14 * time.Minute // 自动拣货等待时间,这个只有在没有PickDeadline信息才有用,否则会根据PickDeadline设置
|
||||||
second2AutoPickupGap = 60 //随机60秒
|
second2AutoPickupGap = 60 //随机60秒
|
||||||
time2AutoPickupAhead = 20 * time.Second // 有最后拣货时间的提前值
|
time2AutoPickupAhead = 120 * time.Second // 有最后拣货时间的提前值
|
||||||
|
|
||||||
switch2SelfDeliverRetryGap = 3 * time.Second // 转自送失败尝试的时间间隙
|
switch2SelfDeliverRetryGap = 3 * time.Second // 转自送失败尝试的时间间隙
|
||||||
switch2SelfDeliverRetryCount = 2 // 转自送失败尝试次数
|
switch2SelfDeliverRetryCount = 2 // 转自送失败尝试次数
|
||||||
@@ -100,6 +110,7 @@ type WatchOrderInfo struct {
|
|||||||
timerList []*tTimerInfo
|
timerList []*tTimerInfo
|
||||||
|
|
||||||
retryCount int // 失败后尝试的次数,调试阶段可能出现死循化,阻止这种情况发生
|
retryCount int // 失败后尝试的次数,调试阶段可能出现死循化,阻止这种情况发生
|
||||||
|
storeDetail *dao.StoreDetail
|
||||||
}
|
}
|
||||||
|
|
||||||
type StatusActionConfig struct {
|
type StatusActionConfig struct {
|
||||||
@@ -156,7 +167,7 @@ func (s *WatchOrderInfo) updateOrderStoreFeature(order *model.GoodsOrder) (err e
|
|||||||
jxStoreID := jxutils.GetSaleStoreIDFromOrder(order)
|
jxStoreID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||||
if jxStoreID > 0 {
|
if jxStoreID > 0 {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
storeDetail, err2 := dao.GetStoreDetail(db, jxStoreID, order.VendorID)
|
storeDetail, err2 := dao.GetStoreDetail(db, jxStoreID, order.VendorID, "")
|
||||||
if err = err2; err != nil {
|
if err = err2; err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -218,15 +229,18 @@ func init() {
|
|||||||
FixedScheduler = sch
|
FixedScheduler = sch
|
||||||
sch.IsReallyCallPlatformAPI = globals.ReallyCallPlatformAPI
|
sch.IsReallyCallPlatformAPI = globals.ReallyCallPlatformAPI
|
||||||
scheduler.CurrentScheduler = sch
|
scheduler.CurrentScheduler = sch
|
||||||
sch.defWorkflowConfig = []map[int]*StatusActionConfig{
|
statusAccept := func(time time.Duration) *StatusActionConfig {
|
||||||
map[int]*StatusActionConfig{
|
return &StatusActionConfig{ // 自动接单
|
||||||
model.OrderStatusNew: &StatusActionConfig{ // 自动接单
|
|
||||||
StatusActionParams: partner.StatusActionParams{
|
StatusActionParams: partner.StatusActionParams{
|
||||||
TimerType: partner.TimerTypeBaseStatusTime,
|
TimerType: partner.TimerTypeBaseStatusTime,
|
||||||
Timeout: 10 * time.Millisecond,
|
Timeout: time,
|
||||||
},
|
},
|
||||||
TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) {
|
TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) {
|
||||||
order := savedOrderInfo.order
|
order := savedOrderInfo.order
|
||||||
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
if err == nil {
|
||||||
|
savedOrderInfo.storeDetail = storeDetail
|
||||||
|
}
|
||||||
mobile := order.ConsigneeMobile
|
mobile := order.ConsigneeMobile
|
||||||
if order.ConsigneeMobile2 != "" {
|
if order.ConsigneeMobile2 != "" {
|
||||||
mobile = order.ConsigneeMobile2
|
mobile = order.ConsigneeMobile2
|
||||||
@@ -236,7 +250,7 @@ func init() {
|
|||||||
partner.CurOrderManager.OnOrderMsg(order, "自动接单失败", err.Error())
|
partner.CurOrderManager.OnOrderMsg(order, "自动接单失败", err.Error())
|
||||||
// 为了解决京东新消息与接单消息乱序的问题
|
// 为了解决京东新消息与接单消息乱序的问题
|
||||||
if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 {
|
if errWithCode, ok := err.(*utils.ErrorWithCode); ok && errWithCode.Level() == 1 && errWithCode.IntCode() == -1 {
|
||||||
if order2, err2 := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrgCode, order.VendorOrderID); err2 == nil {
|
if order2, err2 := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID); err2 == nil {
|
||||||
if order2.Status > order.Status {
|
if order2.Status > order.Status {
|
||||||
order.Status = order2.Status
|
order.Status = order2.Status
|
||||||
jxutils.CallMsgHandlerAsync(func() {
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
@@ -251,7 +265,7 @@ func init() {
|
|||||||
}
|
}
|
||||||
if isAcceptIt {
|
if isAcceptIt {
|
||||||
if err == nil {
|
if err == nil {
|
||||||
sch.notifyNewOrder(order)
|
sch.notifyNewOrder(order, false)
|
||||||
msghub.OnNewOrder(order)
|
msghub.OnNewOrder(order)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -262,9 +276,14 @@ func init() {
|
|||||||
return nil
|
return nil
|
||||||
},
|
},
|
||||||
ShouldSetTimer: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) bool {
|
ShouldSetTimer: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) bool {
|
||||||
return savedOrderInfo.order.LockStatus == model.LockStatusUnlocked && savedOrderInfo.order.Status == model.OrderStatusNew
|
return savedOrderInfo.order.LockStatus == model.LockStatusUnlocked && (savedOrderInfo.order.Status == model.OrderStatusNew || savedOrderInfo.order.Status == model.OrderStatusWaitAccepted)
|
||||||
},
|
|
||||||
},
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sch.defWorkflowConfig = []map[int]*StatusActionConfig{
|
||||||
|
map[int]*StatusActionConfig{
|
||||||
|
model.OrderStatusWaitAccepted: statusAccept(2 * time.Minute), //饿百假的自动接单
|
||||||
|
model.OrderStatusNew: statusAccept(10 * time.Millisecond),
|
||||||
model.OrderStatusAccepted: &StatusActionConfig{ // 自动拣货
|
model.OrderStatusAccepted: &StatusActionConfig{ // 自动拣货
|
||||||
StatusActionParams: partner.StatusActionParams{
|
StatusActionParams: partner.StatusActionParams{
|
||||||
TimerType: partner.TimerTypeBaseStatusTime,
|
TimerType: partner.TimerTypeBaseStatusTime,
|
||||||
@@ -355,14 +374,38 @@ func Init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 以下是订单
|
// 以下是订单
|
||||||
func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool) (err error) {
|
func (s *DefScheduler) OnOrderNew(order *model.GoodsOrder, isPending bool, isAuto bool) (err error) {
|
||||||
globals.SugarLogger.Debugf("OnOrderNew orderID:%s", order.VendorOrderID)
|
globals.SugarLogger.Debugf("OnOrderNew orderID:%s", order.VendorOrderID)
|
||||||
savedOrderInfo := s.loadSavedOrderFromMap(model.Order2Status(order), false)
|
savedOrderInfo := s.loadSavedOrderFromMap(model.Order2Status(order), false)
|
||||||
savedOrderInfo.SetOrder(order)
|
savedOrderInfo.SetOrder(order)
|
||||||
|
if order.VendorID == model.VendorIDEBAI { //饿百订单待接单的时候就推所有东西
|
||||||
|
if order.Status == model.OrderStatusWaitAccepted || order.Status == model.OrderStatusFinishedPickup { //错序
|
||||||
|
s.resetTimer(savedOrderInfo, nil, isPending)
|
||||||
|
if order.Flag&model.OrderFlagMaskFake == 0 {
|
||||||
|
utils.CallFuncAsync(func() {
|
||||||
|
// order = setFakeActualPayPrice(order)
|
||||||
|
netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order)
|
||||||
|
//目前暂且认为AdjustCount > 0 就是调整单
|
||||||
|
if order.AdjustCount > 0 {
|
||||||
|
weixinmsg.NotifyAdjustOrder(order)
|
||||||
|
} else {
|
||||||
|
weixinmsg.NotifyNewOrder(order)
|
||||||
|
}
|
||||||
|
OrderProfitWarning(order)
|
||||||
|
if !isAuto {
|
||||||
|
smsmsg.NotifyNewOrder(order)
|
||||||
|
}
|
||||||
|
// smsmsg.NotifyNewUserOrder(order)
|
||||||
|
push.NotifyNewOrder(order)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
msghub.OnNewOrder(order)
|
||||||
|
}
|
||||||
|
}
|
||||||
if order.Status >= model.OrderStatusNew {
|
if order.Status >= model.OrderStatusNew {
|
||||||
s.resetTimer(savedOrderInfo, nil, isPending)
|
s.resetTimer(savedOrderInfo, nil, isPending)
|
||||||
if !isPending && order.Status >= model.OrderStatusAccepted { // 有订单消息错序,先收到接单消息,再收到新订单消息,导致接单TIMER不动作,这里补一下
|
if !isPending && order.Status >= model.OrderStatusAccepted { // 有订单消息错序,先收到接单消息,再收到新订单消息,导致接单TIMER不动作,这里补一下
|
||||||
s.notifyNewOrder(order)
|
s.notifyNewOrder(order, isAuto)
|
||||||
msghub.OnNewOrder(order)
|
msghub.OnNewOrder(order)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -403,7 +446,7 @@ func (s *DefScheduler) OnOrderStatusChanged(order *model.GoodsOrder, status *mod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, curWaybill, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrOrderAlreadyFinished)
|
s.cancelOtherWaybills(savedOrderInfo, curWaybill, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrOrderAlreadyFinished)
|
||||||
if status.Status >= model.OrderStatusEndBegin {
|
if status.Status >= model.OrderStatusEndBegin {
|
||||||
s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status))
|
s.orderMap.Delete(jxutils.GetUniversalOrderIDFromOrderStatus(status))
|
||||||
}
|
}
|
||||||
@@ -499,7 +542,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
|
|||||||
}
|
}
|
||||||
if needAddTip {
|
if needAddTip {
|
||||||
if handler := partner.GetWaybillTipUpdater(bill.WaybillVendorID); handler != nil {
|
if handler := partner.GetWaybillTipUpdater(bill.WaybillVendorID); handler != nil {
|
||||||
if storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID); err2 == nil {
|
if storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, ""); err2 == nil {
|
||||||
handler.UpdateWaybillTip(jxcontext.AdminCtx, order.VendorOrgCode, order.VendorStoreID, order.VendorOrderID, bill.VendorWaybillID, bill.VendorWaybillID2, utils.Int2Str(storeDetail.CityCode), order.WaybillTipMoney)
|
handler.UpdateWaybillTip(jxcontext.AdminCtx, order.VendorOrgCode, order.VendorStoreID, order.VendorOrderID, bill.VendorWaybillID, bill.VendorWaybillID2, utils.Int2Str(storeDetail.CityCode), order.WaybillTipMoney)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -516,7 +559,7 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
|
|||||||
s.resetTimer(savedOrderInfo, bill, isPending)
|
s.resetTimer(savedOrderInfo, bill, isPending)
|
||||||
s.saveDeliveryFeeFromAndStartWatch(savedOrderInfo, bill.StatusTime)
|
s.saveDeliveryFeeFromAndStartWatch(savedOrderInfo, bill.StatusTime)
|
||||||
}
|
}
|
||||||
s.sendCourierOrderSMS(bill)
|
// s.sendCourierOrderSMS(bill)
|
||||||
} else {
|
} else {
|
||||||
isBillExist := s.updateBillsInfo(savedOrderInfo, bill)
|
isBillExist := s.updateBillsInfo(savedOrderInfo, bill)
|
||||||
if !isBillExist {
|
if !isBillExist {
|
||||||
@@ -537,7 +580,16 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
|
|||||||
}
|
}
|
||||||
s.updateOrderByBill(order, bill, false)
|
s.updateOrderByBill(order, bill, false)
|
||||||
s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
|
s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
|
||||||
|
//若接单时间不在门店的营业时间范围内要取消运单
|
||||||
|
s.cancelWaybillNotInStoreOpentime(savedOrderInfo, bill)
|
||||||
|
//京东商城的话,需要去把订单出库,如果是转移过的订单,则需要修改转移订单号
|
||||||
|
if order.VendorID == model.VendorIDJDShop {
|
||||||
|
s.solutionJdsOrder(bill)
|
||||||
|
}
|
||||||
|
//订单已经是结束状态之后来的运单143945553920000001
|
||||||
|
if order.Status > model.OrderStatusEndBegin {
|
||||||
|
s.ProxyCancelWaybill(order, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
|
||||||
|
}
|
||||||
if model.IsWaybillPlatformOwn(bill) {
|
if model.IsWaybillPlatformOwn(bill) {
|
||||||
if bill.Status == model.WaybillStatusDelivering && order.Status < model.OrderStatusEndBegin {
|
if bill.Status == model.WaybillStatusDelivering && order.Status < model.OrderStatusEndBegin {
|
||||||
// 强制将订单状态置为配送中?
|
// 强制将订单状态置为配送中?
|
||||||
@@ -655,6 +707,30 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *DefScheduler) cancelWaybillNotInStoreOpentime(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) {
|
||||||
|
if savedOrderInfo != nil {
|
||||||
|
//TODO 2020-09-07 不在门店的营业时间内取消运单
|
||||||
|
if savedOrderInfo.storeDetail != nil {
|
||||||
|
if savedOrderInfo.storeDetail.OpenTime1 != 0 && savedOrderInfo.storeDetail.CloseTime1 != 0 {
|
||||||
|
time1 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime1, time.Now())
|
||||||
|
time2 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime1, time.Now())
|
||||||
|
if time.Now().Sub(time1) < 0 || time.Now().Sub(time2.Add(time.Hour)) > 0 {
|
||||||
|
if savedOrderInfo.storeDetail.OpenTime2 != 0 && savedOrderInfo.storeDetail.CloseTime2 != 0 {
|
||||||
|
time3 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime2, time.Now())
|
||||||
|
time4 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime2, time.Now())
|
||||||
|
if time.Now().Sub(time3) < 0 || time.Now().Sub(time4.Add(time.Hour)) > 0 {
|
||||||
|
s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
s.CancelWaybill(bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonNotInStoreOpenTime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (s *DefScheduler) sendCourierOrderSMS(bill *model.Waybill) (err error) {
|
func (s *DefScheduler) sendCourierOrderSMS(bill *model.Waybill) (err error) {
|
||||||
err = smsmsg.NotifyNewCourierOrder(bill)
|
err = smsmsg.NotifyNewCourierOrder(bill)
|
||||||
return err
|
return err
|
||||||
@@ -712,17 +788,80 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
|
|||||||
globals.SugarLogger.Debugf("createWaybillOn3rdProviders orderID:%s门店没有设置配送竞争", order.VendorOrderID)
|
globals.SugarLogger.Debugf("createWaybillOn3rdProviders orderID:%s门店没有设置配送竞争", order.VendorOrderID)
|
||||||
}
|
}
|
||||||
globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, status:%d, maxDeliveryFee:%d, excludeBill:%v", order.VendorOrderID, order.Status, maxDeliveryFee, excludeBill)
|
globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, status:%d, maxDeliveryFee:%d, excludeBill:%v", order.VendorOrderID, order.Status, maxDeliveryFee, excludeBill)
|
||||||
if err = s.canOrderCreateWaybillNormally(order); err == nil {
|
if err = s.canOrderCreateWaybillNormally(order, savedOrderInfo); err == nil {
|
||||||
if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
|
if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
|
||||||
if savedOrderInfo.retryCount <= maxWaybillRetryCount {
|
if savedOrderInfo.retryCount <= maxWaybillRetryCount {
|
||||||
|
var waybillVendorIDs = []int{model.VendorIDMTPS, model.VendorIDDada, model.VendorIDFengNiao}
|
||||||
savedOrderInfo.isNeedCreate3rdWaybill = true
|
savedOrderInfo.isNeedCreate3rdWaybill = true
|
||||||
excludeVendorIDs := savedOrderInfo.GetWaybillVendorIDs()
|
excludeVendorIDs := savedOrderInfo.GetWaybillVendorIDs()
|
||||||
if order.VendorID == model.VendorIDJX {
|
//TODO 取消京西不自动发美团 2020-06-02
|
||||||
excludeVendorIDs = append(excludeVendorIDs, model.VendorIDMTPS)
|
// if order.VendorID == model.VendorIDJX {
|
||||||
|
// excludeVendorIDs = append(excludeVendorIDs, model.VendorIDMTPS)
|
||||||
|
// }
|
||||||
|
//TODO 2020-08-18 饿百美团订单暂时不自动发送三方
|
||||||
|
if order.VendorID == model.VendorIDMTWM || order.VendorID == model.VendorIDEBAI {
|
||||||
|
if order.DeliveryType != model.OrderDeliveryTypeStoreSelf {
|
||||||
|
excludeVendorIDs = append(excludeVendorIDs, waybillVendorIDs...)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var income int64
|
||||||
|
if order.OrderPayPercentage < 50 {
|
||||||
|
income = order.TotalShopMoney * int64((order.OrderPayPercentage / 2))
|
||||||
|
} else if order.OrderPayPercentage > 50 && order.OrderPayPercentage < 100 {
|
||||||
|
income = order.TotalShopMoney - order.NewEarningPrice
|
||||||
|
} else if order.OrderPayPercentage == 100 {
|
||||||
|
income = order.TotalShopMoney - order.ShopPrice
|
||||||
|
}
|
||||||
|
//2020-11-16 预计收益-配送费 > 0 再发
|
||||||
|
for _, vendorID := range waybillVendorIDs {
|
||||||
|
var fee int64
|
||||||
|
handler := partner.GetDeliveryPlatformFromVendorID(vendorID)
|
||||||
|
if deliveryFeeInfo, err := handler.Handler.GetWaybillFee(order); err == nil {
|
||||||
|
if deliveryFeeInfo != nil {
|
||||||
|
if income-deliveryFeeInfo.DeliveryFee <= 0 {
|
||||||
|
excludeVendorIDs = append(excludeVendorIDs, vendorID)
|
||||||
|
}
|
||||||
|
fee = deliveryFeeInfo.DeliveryFee
|
||||||
|
}
|
||||||
|
}
|
||||||
|
globals.SugarLogger.Debugf("count order income, vendorID: %v, income :%v , deliveryFee : %v", vendorID, income, fee)
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO 2020-07-21 发单时间要在门店的营业时间内
|
||||||
|
var storeDetail *dao.StoreDetail
|
||||||
|
if savedOrderInfo.storeDetail != nil {
|
||||||
|
storeDetail = savedOrderInfo.storeDetail
|
||||||
|
} else {
|
||||||
|
storeDetail, err = dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
}
|
||||||
|
if storeDetail != nil {
|
||||||
|
globals.SugarLogger.Debugf("三方运单门店营业时间范围 :time1 %v ,time2 %v", storeDetail.OpenTime1, storeDetail.CloseTime1)
|
||||||
|
if storeDetail.OpenTime1 != 0 && storeDetail.CloseTime1 != 0 {
|
||||||
|
time1 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime1, time.Now())
|
||||||
|
time2 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime1, time.Now())
|
||||||
|
if time.Now().Sub(time1) < 0 || time.Now().Sub(time2.Add(30*time.Minute)) > 0 {
|
||||||
|
if storeDetail.OpenTime2 != 0 && storeDetail.CloseTime2 != 0 {
|
||||||
|
time3 := jxutils.JxOperationTime2TimeByDate(storeDetail.OpenTime2, time.Now())
|
||||||
|
time4 := jxutils.JxOperationTime2TimeByDate(storeDetail.CloseTime2, time.Now())
|
||||||
|
if time.Now().Sub(time3) < 0 || time.Now().Sub(time4.Add(30*time.Minute)) > 0 {
|
||||||
|
err = fmt.Errorf("不在门店营业时间范围内!")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("不在门店营业时间范围内!")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//TODO 2021-02-19 增加品牌配送开关
|
||||||
|
if storeDetail.BrandIsOpen == model.YES {
|
||||||
|
err = fmt.Errorf("此品牌已关闭配送! [%v]", storeDetail.BrandName)
|
||||||
|
}
|
||||||
|
if err == nil {
|
||||||
if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, excludeVendorIDs, false, maxDeliveryFee); err == nil {
|
if _, err = s.CreateWaybillOnProviders4SavedOrder(jxcontext.AdminCtx, savedOrderInfo, nil, excludeVendorIDs, false, maxDeliveryFee); err == nil {
|
||||||
savedOrderInfo.retryCount++
|
savedOrderInfo.retryCount++
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
errMsg := fmt.Sprintf("订单:%s已经自动创建过了%d次运单,仍然无法配送,请关注!", order.VendorOrderID, savedOrderInfo.retryCount)
|
errMsg := fmt.Sprintf("订单:%s已经自动创建过了%d次运单,仍然无法配送,请关注!", order.VendorOrderID, savedOrderInfo.retryCount)
|
||||||
err = fmt.Errorf(errMsg)
|
err = fmt.Errorf(errMsg)
|
||||||
@@ -751,6 +890,21 @@ func (s *DefScheduler) cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *DefScheduler) solutionJdsOrder(bill *model.Waybill) (err error) {
|
||||||
|
if len(bill.VendorOrderID) > 12 {
|
||||||
|
//表示此订单是京东商城2次转移的订单,不用出库,但要去修改运单号
|
||||||
|
// if utils.Str2Int(bill.VendorOrderID[12:len(bill.VendorOrderID)]) > 2 {
|
||||||
|
// err = jdshop.CurPurchaseHandler.OrderTransfer(jxcontext.AdminCtx, bill.VendorOrderID, bill.VendorWaybillID, true)
|
||||||
|
// if err != nil {
|
||||||
|
// globals.SugarLogger.Errorf("京东商城订单自动转移失败!", err)
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// err = jdshop.CurPurchaseHandler.OrderExport(jxcontext.AdminCtx, bill.VendorOrderID, bill.VendorWaybillID, true)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
func (s *DefScheduler) cancelOtherWaybills(savedOrderInfo *WatchOrderInfo, bill2Keep *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
||||||
globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep)
|
globals.SugarLogger.Debugf("cancelOtherWaybills, orderID:%s, bill:%v", savedOrderInfo.order.VendorOrderID, bill2Keep)
|
||||||
for _, v := range savedOrderInfo.waybills {
|
for _, v := range savedOrderInfo.waybills {
|
||||||
@@ -1146,6 +1300,13 @@ func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Wa
|
|||||||
} else {
|
} else {
|
||||||
order.WaybillVendorID = bill.WaybillVendorID
|
order.WaybillVendorID = bill.WaybillVendorID
|
||||||
order.VendorWaybillID = bill.VendorWaybillID
|
order.VendorWaybillID = bill.VendorWaybillID
|
||||||
|
if bill.Status == model.WaybillStatusDelivered {
|
||||||
|
storeDetail, _ := partner.CurOrderManager.LoadStoreDetail(jxutils.GetSaleStoreIDFromOrder(order), order.VendorID)
|
||||||
|
if storeDetail != nil {
|
||||||
|
jxutils.RefreshOrderEarningPrice3(order, storeDetail.PayPercentage, bill)
|
||||||
|
updateFields = append(updateFields, "NewEarningPrice")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if revertStatus {
|
if revertStatus {
|
||||||
order.Status = model.OrderStatusFinishedPickup
|
order.Status = model.OrderStatusFinishedPickup
|
||||||
@@ -1171,7 +1332,8 @@ func (s *DefScheduler) updateBillsInfo(savedOrderInfo *WatchOrderInfo, bill *mod
|
|||||||
|
|
||||||
func (s *DefScheduler) autoPickupGood(savedOrderInfo *WatchOrderInfo) (err error) {
|
func (s *DefScheduler) autoPickupGood(savedOrderInfo *WatchOrderInfo) (err error) {
|
||||||
order := savedOrderInfo.order
|
order := savedOrderInfo.order
|
||||||
if err = s.PickupGoods(order, model.IsOrderDeliveryByStore(order), ""); err == nil {
|
flag := model.IsOrderDeliveryByStore(order) || model.IsOrderDeliveryBySelf(order)
|
||||||
|
if err = s.PickupGoods(order, flag, ""); err == nil {
|
||||||
order.DeliveryFlag |= model.OrderDeliveryFlagMaskAutoPickup
|
order.DeliveryFlag |= model.OrderDeliveryFlagMaskAutoPickup
|
||||||
partner.CurOrderManager.UpdateOrderFields(order, []string{"DeliveryFlag"})
|
partner.CurOrderManager.UpdateOrderFields(order, []string{"DeliveryFlag"})
|
||||||
} else if err == scheduler.ErrOrderStatusAlreadySatisfyCurOperation {
|
} else if err == scheduler.ErrOrderStatusAlreadySatisfyCurOperation {
|
||||||
@@ -1314,6 +1476,7 @@ func (s *DefScheduler) isBillCandidate(order *model.GoodsOrder, bill *model.Wayb
|
|||||||
|
|
||||||
func (s *DefScheduler) ProxyCancelWaybill(order *model.GoodsOrder, bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
func (s *DefScheduler) ProxyCancelWaybill(order *model.GoodsOrder, bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
||||||
globals.SugarLogger.Debugf("ProxyCancelWaybill orderID:%s", order.VendorOrderID)
|
globals.SugarLogger.Debugf("ProxyCancelWaybill orderID:%s", order.VendorOrderID)
|
||||||
|
|
||||||
if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
|
if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
|
||||||
if err = s.CancelWaybill(bill, cancelReasonID, cancelReason); err != nil {
|
if err = s.CancelWaybill(bill, cancelReasonID, cancelReason); err != nil {
|
||||||
partner.CurOrderManager.OnOrderMsg(order, "取消三方运单失败", err.Error())
|
partner.CurOrderManager.OnOrderMsg(order, "取消三方运单失败", err.Error())
|
||||||
@@ -1341,7 +1504,7 @@ func OnDefSchConfChanged(key, value string) {
|
|||||||
|
|
||||||
func setFakeActualPayPrice(order *model.GoodsOrder) (newOrder *model.GoodsOrder) {
|
func setFakeActualPayPrice(order *model.GoodsOrder) (newOrder *model.GoodsOrder) {
|
||||||
orderCopy := *order
|
orderCopy := *order
|
||||||
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), order.JxStoreID, order.VendorID)
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), order.JxStoreID, order.VendorID, "")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if storeDetail.PayPercentage < 50 {
|
if storeDetail.PayPercentage < 50 {
|
||||||
orderCopy.ActualPayPrice = order.TotalShopMoney * (100 - int64(storeDetail.PayPercentage/2)) / 100
|
orderCopy.ActualPayPrice = order.TotalShopMoney * (100 - int64(storeDetail.PayPercentage/2)) / 100
|
||||||
@@ -1353,10 +1516,10 @@ func setFakeActualPayPrice(order *model.GoodsOrder) (newOrder *model.GoodsOrder)
|
|||||||
return newOrder
|
return newOrder
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) {
|
func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder, isAuto bool) {
|
||||||
if order.Flag&model.OrderFlagMaskFake == 0 {
|
if order.Flag&model.OrderFlagMaskFake == 0 && order.VendorID != model.VendorIDEBAI {
|
||||||
utils.CallFuncAsync(func() {
|
utils.CallFuncAsync(func() {
|
||||||
order = setFakeActualPayPrice(order)
|
// order = setFakeActualPayPrice(order)
|
||||||
netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order)
|
netprinter.PrintOrderByOrder(jxcontext.AdminCtx, order)
|
||||||
//目前暂且认为AdjustCount > 0 就是调整单
|
//目前暂且认为AdjustCount > 0 就是调整单
|
||||||
if order.AdjustCount > 0 {
|
if order.AdjustCount > 0 {
|
||||||
@@ -1364,16 +1527,19 @@ func (s *DefScheduler) notifyNewOrder(order *model.GoodsOrder) {
|
|||||||
} else {
|
} else {
|
||||||
weixinmsg.NotifyNewOrder(order)
|
weixinmsg.NotifyNewOrder(order)
|
||||||
}
|
}
|
||||||
smsmsg.NotifyNewOrder(order)
|
|
||||||
OrderProfitWarning(order)
|
OrderProfitWarning(order)
|
||||||
smsmsg.NotifyNewUserOrder(order)
|
if !isAuto {
|
||||||
|
smsmsg.NotifyNewOrder(order)
|
||||||
|
}
|
||||||
|
// smsmsg.NotifyNewUserOrder(order)
|
||||||
|
push.NotifyNewOrder(order)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DefScheduler) notifyUserApplyCancel(order *model.GoodsOrder, cancelReason string) {
|
func (s *DefScheduler) notifyUserApplyCancel(order *model.GoodsOrder, cancelReason string) {
|
||||||
utils.CallFuncAsync(func() {
|
utils.CallFuncAsync(func() {
|
||||||
order = setFakeActualPayPrice(order)
|
// order = setFakeActualPayPrice(order)
|
||||||
weixinmsg.NotifyUserApplyCancel(order, cancelReason)
|
weixinmsg.NotifyUserApplyCancel(order, cancelReason)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -1381,9 +1547,10 @@ func (s *DefScheduler) notifyUserApplyCancel(order *model.GoodsOrder, cancelReas
|
|||||||
func (s *DefScheduler) notifyOrderCanceled(order *model.GoodsOrder) {
|
func (s *DefScheduler) notifyOrderCanceled(order *model.GoodsOrder) {
|
||||||
if order.Flag&model.OrderFlagMaskFake == 0 {
|
if order.Flag&model.OrderFlagMaskFake == 0 {
|
||||||
utils.CallFuncAsync(func() {
|
utils.CallFuncAsync(func() {
|
||||||
order = setFakeActualPayPrice(order)
|
// order = setFakeActualPayPrice(order)
|
||||||
weixinmsg.NotifyOrderCanceled(order)
|
weixinmsg.NotifyOrderCanceled(order)
|
||||||
smsmsg.NotifyOrderCanceled(order)
|
smsmsg.NotifyOrderCanceled(order)
|
||||||
|
push.NotifyOrderCanceled(order)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1417,21 +1584,66 @@ func OrderProfitWarning(order *model.GoodsOrder) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
storeID := jxutils.GetShowStoreIDFromOrder(order)
|
storeID := jxutils.GetShowStoreIDFromOrder(order)
|
||||||
storeDetail, err := dao.GetStoreDetail(db, storeID, order.VendorID)
|
storeDetail, err := dao.GetStoreDetail(db, storeID, order.VendorID, "")
|
||||||
|
payPercentage := 0
|
||||||
if storeDetail != nil && err == nil {
|
if storeDetail != nil && err == nil {
|
||||||
payPercentage := storeDetail.PayPercentage
|
if storeDetail.VendorPayPercentage != 0 {
|
||||||
|
payPercentage = storeDetail.VendorPayPercentage
|
||||||
|
} else {
|
||||||
|
payPercentage = storeDetail.PayPercentage
|
||||||
|
}
|
||||||
|
if beego.BConfig.RunMode == "jxgy" {
|
||||||
if payPercentage >= 50 {
|
if payPercentage >= 50 {
|
||||||
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.EarningPrice)) / 100
|
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.EarningPrice)) / 100
|
||||||
} else {
|
} else {
|
||||||
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney*int64(payPercentage)/200)) / 100
|
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney*int64(payPercentage)/200)) / 100
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if payPercentage >= 50 {
|
||||||
|
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney-order.ShopPrice)) / 100
|
||||||
|
} else {
|
||||||
|
profit = utils.Str2Float64(utils.Int64ToStr(order.TotalShopMoney*int64(payPercentage)/200)) / 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
globals.SugarLogger.Debugf("OrderProfitWarning profit : %v", profit)
|
||||||
if profit < 0 {
|
if profit < 0 {
|
||||||
operatorPhone, operatorName := getOrderOperatorInfo(order, storeDetail)
|
operatorPhone, operatorName := getOrderOperatorInfo(order, storeDetail)
|
||||||
|
operatorRole := getOrderOperatorRoleInfo(order, storeDetail)
|
||||||
if operatorPhone != "" {
|
if operatorPhone != "" {
|
||||||
noticeMsg := fmt.Sprintf("利润 :[%v],运营负责人:[%v],门店ID:[%v],平台门店ID[%v],门店名:[%v],订单序号:[%v],订单号(点击进入详情):%v", profit, operatorName, order.StoreID, order.VendorStoreID, order.StoreName, order.OrderSeq, globals.BackstageHost+"/#/ordermanager/"+order.VendorOrderID)
|
var (
|
||||||
|
roleList []*authz.RoleInfo
|
||||||
|
userIDs []string
|
||||||
|
flag = false
|
||||||
|
)
|
||||||
|
if operatorRole != "" {
|
||||||
|
roleList = append(roleList, autils.NewRole(operatorRole, 0))
|
||||||
|
if userIDMap, err := cms.GetRolesUserList(jxcontext.AdminCtx, roleList); err == nil {
|
||||||
|
for _, v := range userIDMap {
|
||||||
|
for _, vv := range v {
|
||||||
|
userIDs = append(userIDs, vv)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
noticeMsg := fmt.Sprintf("利润 :[%v],运营负责人:[%v],商家负责人:[%v],门店ID:[%v],平台门店ID[%v],门店名:[%v],订单序号:[%v],订单号(点击进入详情):%v", profit, operatorName, storeDetail.MarketManName, order.StoreID, order.VendorStoreID, order.StoreName, order.OrderSeq, globals.BackstageHost+"/#/ordermanager/"+order.VendorOrderID)
|
||||||
user, err := dao.GetUserByID(db, "mobile", operatorPhone)
|
user, err := dao.GetUserByID(db, "mobile", operatorPhone)
|
||||||
|
user2, err := dao.GetUserByID(db, "mobile", storeDetail.MarketManPhone)
|
||||||
if user != nil && err == nil {
|
if user != nil && err == nil {
|
||||||
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, user.UserID, "警告!此订单利润低于0", noticeMsg)
|
for _, v := range userIDs {
|
||||||
|
if v == user.UserID {
|
||||||
|
flag = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !flag {
|
||||||
|
userIDs = append(userIDs, user.UserID)
|
||||||
|
}
|
||||||
|
userIDs = append(userIDs, user2.UserID)
|
||||||
|
for _, v := range userIDs {
|
||||||
|
if api.DingDingAPI.GetToken() != "" {
|
||||||
|
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, v, "警告!此订单利润低于0", noticeMsg)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1443,7 +1655,7 @@ func (s *DefScheduler) notifyOrderStakeHolder(order *model.GoodsOrder, msgTitle,
|
|||||||
// "18180948107",
|
// "18180948107",
|
||||||
}
|
}
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
storeDetail, err := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID)
|
storeDetail, err := dao.GetStoreDetail(db, jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
operatorPhone, _ := getOrderOperatorInfo(order, storeDetail)
|
operatorPhone, _ := getOrderOperatorInfo(order, storeDetail)
|
||||||
if operatorPhone != "" {
|
if operatorPhone != "" {
|
||||||
@@ -1480,3 +1692,15 @@ func getOrderOperatorInfo(order *model.GoodsOrder, storeDetail *dao.StoreDetail)
|
|||||||
}
|
}
|
||||||
return operatorPhone, operatorName
|
return operatorPhone, operatorName
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getOrderOperatorRoleInfo(order *model.GoodsOrder, storeDetail *dao.StoreDetail) (roleName string) {
|
||||||
|
switch order.VendorID {
|
||||||
|
case model.VendorIDJD:
|
||||||
|
roleName = storeDetail.OperatorRole
|
||||||
|
case model.VendorIDMTWM:
|
||||||
|
roleName = storeDetail.OperatorRole2
|
||||||
|
case model.VendorIDEBAI:
|
||||||
|
roleName = storeDetail.OperatorRole3
|
||||||
|
}
|
||||||
|
return roleName
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package defsch
|
|||||||
import (
|
import (
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
|
push "git.rosy.net.cn/jx-callback/business/jxutils/unipush"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg"
|
"git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
"git.rosy.net.cn/jx-callback/business/msghub"
|
"git.rosy.net.cn/jx-callback/business/msghub"
|
||||||
@@ -31,6 +32,7 @@ func (s *DefScheduler) OnAfsOrderNew(order *model.AfsOrder, isPending bool) (err
|
|||||||
}
|
}
|
||||||
msghub.OnNewWait4ApproveAfsOrder(order)
|
msghub.OnNewWait4ApproveAfsOrder(order)
|
||||||
weixinmsg.NotifyAfsOrderStatus(order)
|
weixinmsg.NotifyAfsOrderStatus(order)
|
||||||
|
push.NotifyAfsOrder(order)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import (
|
|||||||
"math"
|
"math"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
||||||
@@ -31,11 +33,12 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven
|
|||||||
if savedOrderInfo != nil {
|
if savedOrderInfo != nil {
|
||||||
order = savedOrderInfo.order
|
order = savedOrderInfo.order
|
||||||
if err = s.isPossibleSwitch2SelfDelivery(order); err == nil {
|
if err = s.isPossibleSwitch2SelfDelivery(order); err == nil {
|
||||||
|
globals.SugarLogger.Infof("SelfDeliveringAndUpdateStatus ordersavedOrderInfoID:%s", utils.Format4Output(savedOrderInfo, false))
|
||||||
err = s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive)
|
err = s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, nil, partner.CancelWaybillReasonOther, partner.CancelWaybillReasonStrActive)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if model.IsOrderDeliveryByStore(order) {
|
if model.IsOrderDeliveryByStore(order) {
|
||||||
if order.Status < model.OrderStatusDelivering {
|
if order.Status < model.OrderStatusDelivering {
|
||||||
storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), order.StoreID, order.VendorID)
|
storeDetail, err2 := dao.GetStoreDetail(dao.GetDB(), order.StoreID, order.VendorID, "")
|
||||||
phone := userName
|
phone := userName
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
phone = storeDetail.Tel1
|
phone = storeDetail.Tel1
|
||||||
@@ -81,7 +84,7 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder) (err error) {
|
func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder, savedOrderInfo *WatchOrderInfo) (err error) {
|
||||||
if !(order.LockStatus != model.OrderStatusLocked && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) {
|
if !(order.LockStatus != model.OrderStatusLocked && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) {
|
||||||
err = fmt.Errorf("当前订单%s没有处于拣货完成且没有结束没有锁定的订单才能进行召唤配送操作", order.VendorOrderID)
|
err = fmt.Errorf("当前订单%s没有处于拣货完成且没有结束没有锁定的订单才能进行召唤配送操作", order.VendorOrderID)
|
||||||
} else if model.IsOrderHaveWaybill(order) {
|
} else if model.IsOrderHaveWaybill(order) {
|
||||||
@@ -112,7 +115,7 @@ func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (e
|
|||||||
func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, courierVendorIDs, excludeCourierVendorIDs []int, forceCreate bool, maxDeliveryFee int64) (bills []*model.Waybill, err error) {
|
func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, courierVendorIDs, excludeCourierVendorIDs []int, forceCreate bool, maxDeliveryFee int64) (bills []*model.Waybill, err error) {
|
||||||
order := savedOrderInfo.order
|
order := savedOrderInfo.order
|
||||||
if !forceCreate {
|
if !forceCreate {
|
||||||
err = s.canOrderCreateWaybillNormally(order)
|
err = s.canOrderCreateWaybillNormally(order, nil)
|
||||||
}
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if forceCreate {
|
if forceCreate {
|
||||||
@@ -152,10 +155,28 @@ func (s *DefScheduler) CreateWaybillOnProvidersEx(ctx *jxcontext.Context, vendor
|
|||||||
if order.DeliveryType == model.OrderDeliveryTypeSelfTake {
|
if order.DeliveryType == model.OrderDeliveryTypeSelfTake {
|
||||||
return nil, fmt.Errorf("订单:%s是自提单", vendorOrderID)
|
return nil, fmt.Errorf("订单:%s是自提单", vendorOrderID)
|
||||||
}
|
}
|
||||||
|
//1表示为门店发单,需要验证门店账户余额情况
|
||||||
|
if order.CreateDeliveryType == model.YES {
|
||||||
|
//暂时这么认为,len courierVendorIDs 为1表示是老板或者运营从小程序上点的立即发单,因为小程序上是点哪个发哪个
|
||||||
|
//京西后台则是点一下发3个,len courierVendorIDs 是0
|
||||||
|
//如果是小程序上点哪个扣哪个平台的钱
|
||||||
|
//如果是后台,则选最高的那个扣
|
||||||
|
if len(courierVendorIDs) == 1 {
|
||||||
|
|
||||||
|
} else if len(courierVendorIDs) == 0 {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
if !forceCreate {
|
if !forceCreate {
|
||||||
err = s.isPossibleSwitch2SelfDelivery(order)
|
err = s.isPossibleSwitch2SelfDelivery(order)
|
||||||
}
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
if savedOrderInfo.order.VendorID == model.VendorIDEBAI {
|
||||||
|
courierVendorIDs = []int{model.VendorIDMTPS, model.VendorIDDada}
|
||||||
|
}
|
||||||
|
order := savedOrderInfo.order
|
||||||
|
order.DeliveryFlag = 0
|
||||||
|
err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order)
|
||||||
if bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, courierVendorIDs, nil, forceCreate, maxDeliveryFee); err == nil && len(bills) > 0 {
|
if bills, err = s.CreateWaybillOnProviders4SavedOrder(ctx, savedOrderInfo, courierVendorIDs, nil, forceCreate, maxDeliveryFee); err == nil && len(bills) > 0 {
|
||||||
partner.CurOrderManager.OnOrderMsg(order, "手动创建运单成功", fmt.Sprintf("%s创建%s平台运单,强发:%t,最高限价:%d", ctx.GetUserName(), model.VendorChineseNames[bills[0].WaybillVendorID], forceCreate, maxDeliveryFee))
|
partner.CurOrderManager.OnOrderMsg(order, "手动创建运单成功", fmt.Sprintf("%s创建%s平台运单,强发:%t,最高限价:%d", ctx.GetUserName(), model.VendorChineseNames[bills[0].WaybillVendorID], forceCreate, maxDeliveryFee))
|
||||||
}
|
}
|
||||||
@@ -210,7 +231,7 @@ func (s *DefScheduler) QueryOrderWaybillFeeInfoEx(ctx *jxcontext.Context, vendor
|
|||||||
if order.DeliveryType == model.OrderDeliveryTypeSelfTake {
|
if order.DeliveryType == model.OrderDeliveryTypeSelfTake {
|
||||||
return nil, fmt.Errorf("订单:%s是自提单", vendorOrderID)
|
return nil, fmt.Errorf("订单:%s是自提单", vendorOrderID)
|
||||||
}
|
}
|
||||||
storeCourierList, err := dao.GetStoreCourierList(db, []int{jxutils.GetSaleStoreIDFromOrder(order)}, model.StoreStatusAll, model.StoreAuditStatusOnline)
|
storeCourierList, err := dao.GetStoreCourierList(db, []int{jxutils.GetSaleStoreIDFromOrder(order)}, nil, model.StoreStatusAll, model.StoreAuditStatusOnline)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ var (
|
|||||||
|
|
||||||
type IScheduler interface {
|
type IScheduler interface {
|
||||||
// 以下是订单
|
// 以下是订单
|
||||||
OnOrderNew(order *model.GoodsOrder, isPending bool) (err error)
|
OnOrderNew(order *model.GoodsOrder, isPending bool, isAuto bool) (err error)
|
||||||
OnOrderStatusChanged(order *model.GoodsOrder, status *model.OrderStatus, isPending bool) (err error)
|
OnOrderStatusChanged(order *model.GoodsOrder, status *model.OrderStatus, isPending bool) (err error)
|
||||||
|
|
||||||
// 以下是运单
|
// 以下是运单
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import (
|
|||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/baseapi/utils/errlist"
|
"git.rosy.net.cn/baseapi/utils/errlist"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
|
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner"
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
@@ -137,6 +138,10 @@ var (
|
|||||||
MinDiscount: 0,
|
MinDiscount: 0,
|
||||||
MaxDiscount: 80,
|
MaxDiscount: 80,
|
||||||
},
|
},
|
||||||
|
model.ActSkuDiscount: &tActRuleInfo{
|
||||||
|
MinDiscount: 100,
|
||||||
|
MaxDiscount: 100,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -215,7 +220,7 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Ac
|
|||||||
validVendorMap := make(map[int]int)
|
validVendorMap := make(map[int]int)
|
||||||
validSkuMap := make(map[int]int)
|
validSkuMap := make(map[int]int)
|
||||||
for _, vendorID := range vendorIDs {
|
for _, vendorID := range vendorIDs {
|
||||||
storeDetail, err2 := dao.GetStoreDetail(db, storeID, vendorID)
|
storeDetail, err2 := dao.GetStoreDetail(db, storeID, vendorID, "")
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
if storeDetail.IsSync != 0 {
|
if storeDetail.IsSync != 0 {
|
||||||
if act.Type == model.ActSkuFake ||
|
if act.Type == model.ActSkuFake ||
|
||||||
@@ -456,6 +461,13 @@ func checkActValidation(act *model.Act, vendorIDs []int) (err error) {
|
|||||||
}
|
}
|
||||||
} else if act.Type == model.ActSkuFake {
|
} else if act.Type == model.ActSkuFake {
|
||||||
|
|
||||||
|
} else if act.Type == model.ActSkuDiscount {
|
||||||
|
if act.DiscountType == 0 {
|
||||||
|
errList.AddErr(fmt.Errorf("折扣活动必须选择折扣类型"))
|
||||||
|
}
|
||||||
|
if act.DiscountValue1 == 0 || act.DiscountValue2 == 0 {
|
||||||
|
errList.AddErr(fmt.Errorf("折扣活动必须填入两档"))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
errList.AddErr(fmt.Errorf("当前只支持%s与%s活动", model.ActTypeName[model.ActSkuDirectDown], model.ActTypeName[model.ActSkuSecKill]))
|
errList.AddErr(fmt.Errorf("当前只支持%s与%s活动", model.ActTypeName[model.ActSkuDirectDown], model.ActTypeName[model.ActSkuSecKill]))
|
||||||
}
|
}
|
||||||
@@ -515,6 +527,19 @@ func PreCreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRu
|
|||||||
}
|
}
|
||||||
|
|
||||||
func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, vendorOrgCode string, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam, isAsync bool) (hint string, err error) {
|
func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, vendorOrgCode string, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam, isAsync bool) (hint string, err error) {
|
||||||
|
//权限
|
||||||
|
if permission.IsRoled(ctx) {
|
||||||
|
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
|
||||||
|
var actStoreSku2 []*ActStoreSkuParam
|
||||||
|
for _, v := range actStoreSku {
|
||||||
|
if storeIDsMap[v.StoreID] != 0 {
|
||||||
|
actStoreSku2 = append(actStoreSku2, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
actStoreSku = nil
|
||||||
|
actStoreSku = actStoreSku2
|
||||||
|
}
|
||||||
|
}
|
||||||
if err = checkActValidation(act, vendorIDs); err != nil {
|
if err = checkActValidation(act, vendorIDs); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -770,6 +795,16 @@ func CancelAct(ctx *jxcontext.Context, actID int) (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
_, err = SyncAct(ctx, nil, actID, nil, false)
|
_, err = SyncAct(ctx, nil, actID, nil, false)
|
||||||
|
act := &model.Act{}
|
||||||
|
act.ID = actID
|
||||||
|
if err == nil {
|
||||||
|
if _, err = dao.UpdateEntityLogically(db, act,
|
||||||
|
map[string]interface{}{
|
||||||
|
model.FieldStatus: model.ActStatusCanceled,
|
||||||
|
}, ctx.GetUserName(), nil); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -872,14 +907,16 @@ func DeleteActStoreSkuBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, act
|
|||||||
}
|
}
|
||||||
|
|
||||||
if isNeedCancelAct {
|
if isNeedCancelAct {
|
||||||
act := &model.Act{}
|
// act := &model.Act{}
|
||||||
act.ID = actID
|
// act.ID = actID
|
||||||
if _, err = dao.UpdateEntityLogically(db, act,
|
// if err == nil {
|
||||||
map[string]interface{}{
|
// if _, err = dao.UpdateEntityLogically(db, act,
|
||||||
model.FieldStatus: model.ActStatusCanceled,
|
// map[string]interface{}{
|
||||||
}, ctx.GetUserName(), nil); err != nil {
|
// model.FieldStatus: model.ActStatusCanceled,
|
||||||
return 0, err
|
// }, ctx.GetUserName(), nil); err != nil {
|
||||||
}
|
// return 0, err
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
dao.Commit(db)
|
dao.Commit(db)
|
||||||
return originSyncStatus, err
|
return originSyncStatus, err
|
||||||
@@ -1057,6 +1094,46 @@ func RefreshPageActs(ctx *jxcontext.Context, vendorIDs []int, createdFrom time.T
|
|||||||
return hint, err
|
return hint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DeleteStoresFromAct(ctx *jxcontext.Context, vendorID int, actTypes, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||||
|
db := dao.GetDB()
|
||||||
|
task := tasksch.NewParallelTask("将门店从所有活动中删除", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||||
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
|
storeID := batchItemList[0].(int)
|
||||||
|
acts, _ := dao.QueryActs(db, 0, 0, 50, -1, "", vendorID, []int{1}, actTypes, nil, storeID, nil, 0, utils.ZeroTimeValue, utils.ZeroTimeValue, time.Now().AddDate(0, -3, 0), time.Now())
|
||||||
|
for _, v := range acts.Data {
|
||||||
|
var actStoreSkuParam []*ActStoreSkuParam
|
||||||
|
_, actStoreSkus, _ := dao.GetActStoreSkuVendorList(db, v.ID, []int{vendorID}, nil, nil, "", 0, 99999)
|
||||||
|
for _, actStoreSku := range actStoreSkus {
|
||||||
|
if actStoreSku.StoreID == storeID {
|
||||||
|
aa := &ActStoreSkuParam{
|
||||||
|
ActStoreSku: model.ActStoreSku{
|
||||||
|
StoreID: storeID,
|
||||||
|
SkuID: actStoreSku.SkuID,
|
||||||
|
ActID: v.ID,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
actStoreSkuParam = append(actStoreSkuParam, aa)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_, err = DeleteActStoreSkuBind(ctx, db, v.ID, actStoreSkuParam)
|
||||||
|
if err == nil {
|
||||||
|
_, err = SyncAct(ctx, nil, v.ID, nil, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retVal, err
|
||||||
|
}, storeIDs)
|
||||||
|
tasksch.HandleTask(task, nil, true).Run()
|
||||||
|
if isAsync {
|
||||||
|
hint = task.GetID()
|
||||||
|
} else {
|
||||||
|
resultList, err2 := task.GetResult(0)
|
||||||
|
if err = err2; err == nil {
|
||||||
|
hint = utils.Int2Str(len(resultList))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hint, err
|
||||||
|
}
|
||||||
|
|
||||||
func DeleteSkusFromAct(ctx *jxcontext.Context, vendorID int, actTypes, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
func DeleteSkusFromAct(ctx *jxcontext.Context, vendorID int, actTypes, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
actMap := make(map[int]*model.Act)
|
actMap := make(map[int]*model.Act)
|
||||||
@@ -1180,7 +1257,7 @@ func ForceUpdateVendorPrice(ctx *jxcontext.Context, vendorID int, actType int, s
|
|||||||
for _, storeSkuBind := range storeSkuBindList {
|
for _, storeSkuBind := range storeSkuBindList {
|
||||||
if _, err2 := dao.UpdateEntity(db, storeSkuBind); err2 == nil {
|
if _, err2 := dao.UpdateEntity(db, storeSkuBind); err2 == nil {
|
||||||
if storeVendorIDMap[storeSkuBind.StoreID] == "" {
|
if storeVendorIDMap[storeSkuBind.StoreID] == "" {
|
||||||
if storeDetail, err2 := dao.GetStoreDetail(db, storeSkuBind.StoreID, vendorID); err2 == nil {
|
if storeDetail, err2 := dao.GetStoreDetail(db, storeSkuBind.StoreID, vendorID, ""); err2 == nil {
|
||||||
storeVendorIDMap[storeSkuBind.StoreID] = storeDetail.VendorStoreID
|
storeVendorIDMap[storeSkuBind.StoreID] = storeDetail.VendorStoreID
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1198,7 +1275,7 @@ func ForceUpdateVendorPrice(ctx *jxcontext.Context, vendorID int, actType int, s
|
|||||||
subTask := tasksch.NewParallelTask("同步平台价格", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
|
subTask := tasksch.NewParallelTask("同步平台价格", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
|
||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
storeID := batchItemList[0].(int)
|
storeID := batchItemList[0].(int)
|
||||||
_, err = cms.SyncStoreSkuNew2(ctx, task, 0 /*model.SyncFlagPriceMask*/, vendorID, storeID, storeVendorIDMap[storeID], nil, storeSkuIDMap[storeID], nil, true, false, true)
|
_, err = cms.SyncStoreSkuNew2(ctx, task, 0 /*model.SyncFlagPriceMask*/, vendorID, storeID, storeVendorIDMap[storeID], "", nil, storeSkuIDMap[storeID], nil, true, false, true)
|
||||||
return retVal, err
|
return retVal, err
|
||||||
}, storeIDs)
|
}, storeIDs)
|
||||||
tasksch.HandleTask(subTask, task, true).Run()
|
tasksch.HandleTask(subTask, task, true).Run()
|
||||||
@@ -1453,3 +1530,181 @@ func loadExcelForCreateAct(rowNum, mixType int, row []string, sheetParam *SheetP
|
|||||||
}
|
}
|
||||||
actStoreSkuList = append(actStoreSkuList, actStoreSku)
|
actStoreSkuList = append(actStoreSkuList, actStoreSku)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ChangeJxPriceByDiscountAct(ctx *jxcontext.Context) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
pageSize = 9999
|
||||||
|
)
|
||||||
|
globals.SugarLogger.Debug("ChangeJxPriceByDiscountAct begin:")
|
||||||
|
page, err := dao.QueryActs(db, 0, 0, pageSize, -1, "", model.VendorIDJX, []int{model.YES}, []int{model.ActSkuDiscount}, nil, 0, nil, 0, utils.ZeroTimeValue, utils.ZeroTimeValue, time.Now().AddDate(0, -3, 0), time.Now())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(page.Data) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, act := range page.Data {
|
||||||
|
_, actStoreSkus, _ := dao.GetActStoreSkuVendorList(db, act.ID, nil, nil, nil, "", 0, pageSize)
|
||||||
|
if len(actStoreSkus) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, actStoreSku2 := range actStoreSkus {
|
||||||
|
actStoreSkuMap := &model.ActStoreSkuMap{
|
||||||
|
ModelIDCULD: model.ModelIDCULD{
|
||||||
|
ID: actStoreSku2.MapID,
|
||||||
|
},
|
||||||
|
ActID: actStoreSku2.ActID,
|
||||||
|
StoreID: actStoreSku2.StoreID,
|
||||||
|
SkuID: actStoreSku2.SkuID,
|
||||||
|
TrendPrice: actStoreSku2.TrendPrice,
|
||||||
|
TrendType: actStoreSku2.TrendType,
|
||||||
|
ActualActPrice: actStoreSku2.ActualActPrice,
|
||||||
|
VendorPrice: actStoreSku2.VendorPrice,
|
||||||
|
}
|
||||||
|
storeSkus, _ := dao.GetStoresSkusInfo(db, []int{actStoreSkuMap.StoreID}, []int{actStoreSkuMap.SkuID})
|
||||||
|
if len(storeSkus) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var (
|
||||||
|
storeSku = storeSkus[0]
|
||||||
|
shouldStockOut = utils.Float64TwoInt64(math.Ceil(float64(storeSku.Stock) / float64(60))) //每个时间点应出货 = 总库存/60 = N
|
||||||
|
actualStockOut int64 //每个时间点实际出货 = C
|
||||||
|
pricePercentage float64 //每次涨跌值为 原价的 2%,即原价100,每个时间点降价为2,涨价也为2
|
||||||
|
actualPrice int64
|
||||||
|
minJxPrice int64
|
||||||
|
)
|
||||||
|
if storeSku.Stock == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
actualStockOut, err = dao.GetOrderStoreSkusCount(db, actStoreSkuMap.StoreID, actStoreSkuMap.SkuID, time.Now().Add(-time.Minute*10), time.Now())
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil || err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
if r != nil {
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
//第一档时间内
|
||||||
|
if (time.Now().Hour() >= 10 && time.Now().Hour() < 20) || (time.Now().Hour() == 20 && time.Now().Minute() < 1) {
|
||||||
|
pricePercentage = 0.02
|
||||||
|
actualPrice = utils.Float64TwoInt64(float64(actStoreSkuMap.VendorPrice) * pricePercentage)
|
||||||
|
if actStoreSkuMap.TrendType == model.TrendTypeUp {
|
||||||
|
actStoreSkuMap.ActualActPrice = actStoreSkuMap.ActualActPrice + actualPrice
|
||||||
|
// storeSku.JxPrice = storeSku.JxPrice + int(actualPrice)
|
||||||
|
} else if actStoreSkuMap.TrendType == model.TrendTypeDown {
|
||||||
|
actStoreSkuMap.ActualActPrice = actStoreSkuMap.ActualActPrice - actualPrice
|
||||||
|
//判断活动的折扣类型是最低价还是最低折扣(第一档)
|
||||||
|
if act.DiscountType == model.ActDiscountTypePrice {
|
||||||
|
minJxPrice = int64(act.DiscountValue1)
|
||||||
|
} else if act.DiscountType == model.ActDiscountTypePercentage {
|
||||||
|
minJxPrice = actStoreSkuMap.VendorPrice * int64(act.DiscountValue1) / 100
|
||||||
|
}
|
||||||
|
if actStoreSkuMap.ActualActPrice <= minJxPrice {
|
||||||
|
actStoreSkuMap.ActualActPrice = minJxPrice
|
||||||
|
}
|
||||||
|
// storeSku.JxPrice = storeSku.JxPrice - int(actualPrice)
|
||||||
|
stock := checkPriceDefendOrderByPrice(db, storeSku.StoreID, storeSku.SkuID, storeSku.Stock, int(actStoreSkuMap.ActualActPrice))
|
||||||
|
if stock != -1 {
|
||||||
|
storeSku.Stock = stock
|
||||||
|
if _, err = dao.UpdateEntity(db, storeSku, "Stock"); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if actStoreSkuMap.ActualActPrice >= actStoreSkuMap.VendorPrice {
|
||||||
|
actStoreSkuMap.ActualActPrice = actStoreSkuMap.VendorPrice
|
||||||
|
}
|
||||||
|
// if _, err = dao.UpdateEntity(db, actStoreSkuMap, "ActualActPrice"); err != nil {
|
||||||
|
// dao.Rollback(db)
|
||||||
|
// }
|
||||||
|
//C >= 2N 涨价趋势,最高涨价到无折扣
|
||||||
|
if actualStockOut >= 2*shouldStockOut {
|
||||||
|
actStoreSkuMap.TrendType = model.TrendTypeUp
|
||||||
|
if actStoreSkuMap.ActualActPrice == actStoreSkuMap.VendorPrice {
|
||||||
|
actStoreSkuMap.TrendType = model.TrendTypeNothing
|
||||||
|
}
|
||||||
|
} else if actualStockOut < utils.Float64TwoInt64(math.Ceil(float64(shouldStockOut)/float64(2))) { //C <= N/2 降价趋势,最低降价到设置到最低折扣
|
||||||
|
actStoreSkuMap.TrendType = model.TrendTypeDown
|
||||||
|
if actStoreSkuMap.ActualActPrice == minJxPrice {
|
||||||
|
actStoreSkuMap.TrendType = model.TrendTypeNothing
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
actStoreSkuMap.TrendType = model.TrendTypeNothing
|
||||||
|
}
|
||||||
|
actStoreSkuMap.TrendPrice = int(actualPrice)
|
||||||
|
if _, err = dao.UpdateEntity(db, actStoreSkuMap, "ActualActPrice", "TrendType", "TrendPrice"); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
}
|
||||||
|
} else { //第二档时间内
|
||||||
|
pricePercentage = 0.1
|
||||||
|
actualPrice = utils.Float64TwoInt64(float64(actStoreSkuMap.VendorPrice) * pricePercentage)
|
||||||
|
//判断活动的折扣类型是最低价还是最低折扣(第二档)
|
||||||
|
if act.DiscountType == model.ActDiscountTypePrice {
|
||||||
|
minJxPrice = int64(act.DiscountValue2)
|
||||||
|
} else if act.DiscountType == model.ActDiscountTypePercentage {
|
||||||
|
minJxPrice = actStoreSkuMap.VendorPrice * int64(act.DiscountValue2) / 100
|
||||||
|
}
|
||||||
|
if actStoreSkuMap.ActualActPrice == minJxPrice {
|
||||||
|
actStoreSkuMap.TrendType = model.TrendTypeNothing
|
||||||
|
} else {
|
||||||
|
actStoreSkuMap.TrendType = model.TrendTypeDown
|
||||||
|
}
|
||||||
|
actStoreSkuMap.TrendPrice = int(actualPrice)
|
||||||
|
// if _, err = dao.UpdateEntity(db, actStoreSkuMap, "TrendType", "TrendPrcie"); err != nil {
|
||||||
|
// dao.Rollback(db)
|
||||||
|
// }
|
||||||
|
actStoreSkuMap.ActualActPrice = actStoreSkuMap.ActualActPrice - actualPrice
|
||||||
|
if actStoreSkuMap.ActualActPrice <= minJxPrice {
|
||||||
|
actStoreSkuMap.ActualActPrice = minJxPrice
|
||||||
|
}
|
||||||
|
stock := checkPriceDefendOrderByPrice(db, storeSku.StoreID, storeSku.SkuID, storeSku.Stock, int(actStoreSkuMap.ActualActPrice))
|
||||||
|
if stock != -1 {
|
||||||
|
storeSku.Stock = stock
|
||||||
|
if _, err = dao.UpdateEntity(db, storeSku, "Stock"); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//22:00 恢复库存为100,价格恢复原价
|
||||||
|
if time.Now().Hour() == 22 && time.Now().Minute() < 1 {
|
||||||
|
storeSku.Stock = 100
|
||||||
|
if _, err = dao.UpdateEntity(db, storeSku, "Stock"); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
}
|
||||||
|
actStoreSkuMap.ActualActPrice = actStoreSkuMap.VendorPrice
|
||||||
|
actStoreSkuMap.TrendType = model.TrendTypeNothing
|
||||||
|
actStoreSkuMap.TrendPrice = 0
|
||||||
|
}
|
||||||
|
if _, err = dao.UpdateEntity(db, actStoreSkuMap, "ActualActPrice", "TrendType", "TrendPrice"); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkPriceDefendOrderByPrice(db *dao.DaoDB, storeID, skuID, stock, jxPrice int) (realStock int) {
|
||||||
|
priceDefends, _ := dao.GetPriceDefendOrder(db, "", []int{storeID}, []int{skuID}, []int{jxutils.GetDefendPriceIssue()}, 0, 0, 0, 1, "", utils.ZeroTimeValue, utils.ZeroTimeValue, false)
|
||||||
|
if len(priceDefends) == 0 {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
for _, v := range priceDefends {
|
||||||
|
//如果刚好守的价和降的价一样,再判断库存够不够
|
||||||
|
if v.DefendPrice > int64(jxPrice) {
|
||||||
|
if v.Count <= stock {
|
||||||
|
stock -= v.Count
|
||||||
|
v.IsSuccess = model.YES
|
||||||
|
v.RealPrice = int64(jxPrice)
|
||||||
|
dao.UpdateEntity(db, v, "IsSuccess", "RealPrice")
|
||||||
|
} else {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return stock
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/ebai"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils/errlist"
|
"git.rosy.net.cn/baseapi/utils/errlist"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/globals/api2"
|
"git.rosy.net.cn/jx-callback/globals/api2"
|
||||||
@@ -148,6 +150,10 @@ func InitServiceInfo(version string, buildTime time.Time, gitCommit string) {
|
|||||||
"operateType": model.OperateTypeName,
|
"operateType": model.OperateTypeName,
|
||||||
"thingType": model.ThingTypeName,
|
"thingType": model.ThingTypeName,
|
||||||
"apiFunctionName": model.ApiFunctionName,
|
"apiFunctionName": model.ApiFunctionName,
|
||||||
|
"vendorStatus": model.VendorStatus,
|
||||||
|
"couponsStatus": model.CouponStatusName,
|
||||||
|
"ebaiSupplierID": ebai.EbaiSupplierIDMap,
|
||||||
|
"ebaiSupplierInfo": ebai.EbaiSupplierInfo,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -221,6 +227,11 @@ func GetCoordinateDistrictCode(ctx *jxcontext.Context, lng, lat float64) (code i
|
|||||||
return api.AutonaviAPI.GetCoordinateDistrictCode(lng, lat), nil
|
return api.AutonaviAPI.GetCoordinateDistrictCode(lng, lat), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetCoordinateCityInfo(ctx *jxcontext.Context, lng, lat float64) (name string, err error) {
|
||||||
|
name, _ = api.AutonaviAPI.GetCoordinateCityInfo(lng, lat)
|
||||||
|
return name, err
|
||||||
|
}
|
||||||
|
|
||||||
func SendMsg2Somebody(ctx *jxcontext.Context, mobileNum, verifyCode, msgType, msgContent string) (err error) {
|
func SendMsg2Somebody(ctx *jxcontext.Context, mobileNum, verifyCode, msgType, msgContent string) (err error) {
|
||||||
if needConfirmRequestMap[msgType] == 1 {
|
if needConfirmRequestMap[msgType] == 1 {
|
||||||
if _, err = mobile.AutherObj.VerifySecret(mobileNum, verifyCode); err != nil {
|
if _, err = mobile.AutherObj.VerifySecret(mobileNum, verifyCode); err != nil {
|
||||||
@@ -380,6 +391,7 @@ func checkConfig(opFlag int, configType, key, value string) (err error) {
|
|||||||
}
|
}
|
||||||
case model.ConfigTypeJxStore:
|
case model.ConfigTypeJxStore:
|
||||||
case model.ConfigTypeCookie:
|
case model.ConfigTypeCookie:
|
||||||
|
case model.ConfigTypeDiscountCard:
|
||||||
default:
|
default:
|
||||||
err = fmt.Errorf("当前只支持配置:%s, 传入的配置类型:%s", utils.Format4Output(model.ConfigTypeName, true), configType)
|
err = fmt.Errorf("当前只支持配置:%s, 传入的配置类型:%s", utils.Format4Output(model.ConfigTypeName, true), configType)
|
||||||
}
|
}
|
||||||
@@ -412,7 +424,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
|
|||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
switch configType {
|
switch configType {
|
||||||
case model.ConfigTypePricePack:
|
case model.ConfigTypePricePack:
|
||||||
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key)
|
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key, "", "")
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
var storeInfo []string
|
var storeInfo []string
|
||||||
for _, v := range storeMapList {
|
for _, v := range storeMapList {
|
||||||
@@ -423,7 +435,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case model.ConfigTypeFreightPack:
|
case model.ConfigTypeFreightPack:
|
||||||
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
|
storeMapList, err2 := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "")
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
var storeInfo []string
|
var storeInfo []string
|
||||||
for _, v := range storeMapList {
|
for _, v := range storeMapList {
|
||||||
@@ -450,7 +462,7 @@ func DeleteConfig(ctx *jxcontext.Context, key, configType string) (err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
errList.AddErr(err)
|
errList.AddErr(err)
|
||||||
storeList, err2 := dao.GetStoreList(db, nil, nil, nil, nil, key)
|
storeList, err2 := dao.GetStoreList(db, nil, nil, nil, nil, nil, key)
|
||||||
if err = err2; err == nil && len(storeList) > 0 {
|
if err = err2; err == nil && len(storeList) > 0 {
|
||||||
storeIDs := make([]int, len(storeList))
|
storeIDs := make([]int, len(storeList))
|
||||||
for k, v := range storeList {
|
for k, v := range storeList {
|
||||||
@@ -503,7 +515,7 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (hint s
|
|||||||
}
|
}
|
||||||
switch configType {
|
switch configType {
|
||||||
case model.ConfigTypePricePack:
|
case model.ConfigTypePricePack:
|
||||||
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key)
|
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, key, "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
dao.Rollback(db)
|
dao.Rollback(db)
|
||||||
return "", err
|
return "", err
|
||||||
@@ -522,7 +534,7 @@ func UpdateConfig(ctx *jxcontext.Context, key, configType, value string) (hint s
|
|||||||
}
|
}
|
||||||
case model.ConfigTypeFreightPack:
|
case model.ConfigTypeFreightPack:
|
||||||
dao.Commit(db)
|
dao.Commit(db)
|
||||||
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
|
storeMapList, err := dao.GetStoresMapList(db, nil, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ func GetStoreMessages(ctx *jxcontext.Context, msgIDs, storeIDs, types []int, fro
|
|||||||
return pagedInfo, err
|
return pagedInfo, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetStoreMessageStatuses(ctx *jxcontext.Context, msgIDs, storeIDs []int, fromReadCount, toReadCount int, fromTime, toTime time.Time, keyword string, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
func GetStoreMessageStatuses(ctx *jxcontext.Context, msgIDs, storeIDs, confirmStatuss []int, fromReadCount, toReadCount int, fromTime, toTime time.Time, keyword string, offset, pageSize int) (pagedInfo *model.PagedInfo, err error) {
|
||||||
sql := `
|
sql := `
|
||||||
SELECT SQL_CALC_FOUND_ROWS
|
SELECT SQL_CALC_FOUND_ROWS
|
||||||
t1.*,
|
t1.*,
|
||||||
@@ -92,6 +92,10 @@ func GetStoreMessageStatuses(ctx *jxcontext.Context, msgIDs, storeIDs []int, fro
|
|||||||
sql += " AND t1.store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")"
|
sql += " AND t1.store_id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
sqlParams = append(sqlParams, storeIDs)
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
}
|
}
|
||||||
|
if len(confirmStatuss) > 0 {
|
||||||
|
sql += " AND t1.confirm_status IN (" + dao.GenQuestionMarks(len(confirmStatuss)) + ")"
|
||||||
|
sqlParams = append(sqlParams, confirmStatuss)
|
||||||
|
}
|
||||||
if len(msgIDs) > 0 {
|
if len(msgIDs) > 0 {
|
||||||
sql += " AND t1.message_id IN (" + dao.GenQuestionMarks(len(msgIDs)) + ")"
|
sql += " AND t1.message_id IN (" + dao.GenQuestionMarks(len(msgIDs)) + ")"
|
||||||
sqlParams = append(sqlParams, msgIDs)
|
sqlParams = append(sqlParams, msgIDs)
|
||||||
|
|||||||
@@ -11,6 +11,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/aliupcapi"
|
"git.rosy.net.cn/baseapi/platformapi/aliupcapi"
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
|
||||||
@@ -112,8 +114,8 @@ func GetCategories(ctx *jxcontext.Context, parentID int, isExd bool) (catList []
|
|||||||
|
|
||||||
func AddCategory(ctx *jxcontext.Context, cat *model.SkuCategory, userName string) (outCat *model.SkuCategory, err error) {
|
func AddCategory(ctx *jxcontext.Context, cat *model.SkuCategory, userName string) (outCat *model.SkuCategory, err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
if cat.Level < 0 || cat.Level > 2 {
|
if cat.Level < 0 || cat.Level > 3 {
|
||||||
return nil, errors.New("Level必须为1或2")
|
return nil, errors.New("Level必须为1或2,3")
|
||||||
} else if cat.Level == 1 && cat.ParentID != 0 {
|
} else if cat.Level == 1 && cat.ParentID != 0 {
|
||||||
return nil, errors.New("Level1的分类其父分类必须为0")
|
return nil, errors.New("Level1的分类其父分类必须为0")
|
||||||
} else if cat.Level == 2 {
|
} else if cat.Level == 2 {
|
||||||
@@ -128,8 +130,24 @@ func AddCategory(ctx *jxcontext.Context, cat *model.SkuCategory, userName string
|
|||||||
if parentCat.Level != 1 {
|
if parentCat.Level != 1 {
|
||||||
return nil, errors.New("Level2的分类其父分类必须为Level1分类")
|
return nil, errors.New("Level2的分类其父分类必须为Level1分类")
|
||||||
}
|
}
|
||||||
|
} else if cat.Level == 3 {
|
||||||
|
if cat.ParentID == 0 {
|
||||||
|
return nil, errors.New("Level3的分类其父分类必须不为0")
|
||||||
|
}
|
||||||
|
parentCat := &model.SkuCategory{}
|
||||||
|
parentCat.ID = cat.ParentID
|
||||||
|
if err = dao.GetEntity(db, parentCat); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if parentCat.Level != 2 {
|
||||||
|
return nil, errors.New("Level3的分类其父分类必须为Level2分类")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if catsByName, err := dao.GetCategoriesByName(db, cat.Name); err == nil && len(catsByName) > 0 {
|
||||||
|
return nil, fmt.Errorf("已有分类名:[%v],分类名不允许重复!", cat.Name)
|
||||||
|
} else if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
dao.WrapAddIDCULDEntity(cat, userName)
|
dao.WrapAddIDCULDEntity(cat, userName)
|
||||||
// cat.JdSyncStatus = model.SyncFlagNewMask
|
// cat.JdSyncStatus = model.SyncFlagNewMask
|
||||||
// cat.JdID = 0
|
// cat.JdID = 0
|
||||||
@@ -163,7 +181,7 @@ func AddCategory(ctx *jxcontext.Context, cat *model.SkuCategory, userName string
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if cat.IsExdSpec == model.NO {
|
if cat.IsExdSpec == model.NO {
|
||||||
if err = OnCreateThing(ctx, db, nil, int64(cat.ID), model.ThingTypeCategory); err != nil {
|
if err = OnCreateThing(ctx, db, nil, int64(cat.ID), model.ThingTypeCategory, model.SyncFlagNewMask, false); err != nil {
|
||||||
dao.Rollback(db)
|
dao.Rollback(db)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -588,6 +606,9 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
|||||||
t1.price,
|
t1.price,
|
||||||
t1.img,
|
t1.img,
|
||||||
t1.img2,
|
t1.img2,
|
||||||
|
t1.img3,
|
||||||
|
t1.img_watermark,
|
||||||
|
t1.img_mix,
|
||||||
t1.status,
|
t1.status,
|
||||||
t1.is_spu,
|
t1.is_spu,
|
||||||
t1.desc_img,
|
t1.desc_img,
|
||||||
@@ -595,7 +616,10 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
|||||||
t1.ex_prefix,
|
t1.ex_prefix,
|
||||||
t1.ex_prefix_begin,
|
t1.ex_prefix_begin,
|
||||||
t1.ex_prefix_end,
|
t1.ex_prefix_end,
|
||||||
t1.yb_name_suffix
|
t1.yb_name_suffix,
|
||||||
|
t1.jds_stock_switch,
|
||||||
|
t1.preparation_time,
|
||||||
|
t1.best_seller
|
||||||
`
|
`
|
||||||
if isQueryMidPrice {
|
if isQueryMidPrice {
|
||||||
sql += `,
|
sql += `,
|
||||||
@@ -623,6 +647,9 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
|||||||
t1.price,
|
t1.price,
|
||||||
t1.img,
|
t1.img,
|
||||||
t1.img2,
|
t1.img2,
|
||||||
|
t1.img3,
|
||||||
|
t1.img_watermark,
|
||||||
|
t1.img_mix,
|
||||||
t1.status,
|
t1.status,
|
||||||
t1.is_spu,
|
t1.is_spu,
|
||||||
t1.desc_img,
|
t1.desc_img,
|
||||||
@@ -635,6 +662,9 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
|||||||
t1.ex_prefix_begin,
|
t1.ex_prefix_begin,
|
||||||
t1.ex_prefix_end,
|
t1.ex_prefix_end,
|
||||||
t1.yb_name_suffix,
|
t1.yb_name_suffix,
|
||||||
|
t1.jds_stock_switch,
|
||||||
|
t1.preparation_time,
|
||||||
|
t1.best_seller,
|
||||||
`
|
`
|
||||||
if isQueryMidPrice {
|
if isQueryMidPrice {
|
||||||
sqlData += " t4.mid_unit_price,"
|
sqlData += " t4.mid_unit_price,"
|
||||||
@@ -648,6 +678,9 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
|||||||
'","eclpID":"', t2.eclp_id,
|
'","eclpID":"', t2.eclp_id,
|
||||||
'","weight":', t2.weight, ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id,
|
'","weight":', t2.weight, ',"categoryID":', t2.category_id, ',"nameID":', t2.name_id,
|
||||||
', "seq":', t2.seq,
|
', "seq":', t2.seq,
|
||||||
|
', "minOrderCount":', t2.min_order_count,
|
||||||
|
', "ladderBoxNum":', t2.ladder_box_num,
|
||||||
|
', "ladderBoxPrice":', t2.ladder_box_price,
|
||||||
"}")), "]") skus_str,
|
"}")), "]") skus_str,
|
||||||
CONCAT("[", GROUP_CONCAT(DISTINCT t3.place_code), "]") places_str
|
CONCAT("[", GROUP_CONCAT(DISTINCT t3.place_code), "]") places_str
|
||||||
` + sql + `
|
` + sql + `
|
||||||
@@ -689,6 +722,23 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
skuVendorCats, _ := dao.GetSkuVendorCategoryMaps(db, []int{skuName.ID}, []int{model.VendorIDMTWM, model.VendorIDEBAI, model.VendorIDJDShop, model.VendorIDJD}, nil)
|
||||||
|
if len(skuVendorCats) > 0 {
|
||||||
|
for _, v := range skuVendorCats {
|
||||||
|
if v.VendorID == model.VendorIDJD {
|
||||||
|
skuName.JdCategoryID = v.VendorCategoryID
|
||||||
|
}
|
||||||
|
if v.VendorID == model.VendorIDEBAI {
|
||||||
|
skuName.EbaiCategoryID = v.VendorCategoryID
|
||||||
|
}
|
||||||
|
if v.VendorID == model.VendorIDMTWM {
|
||||||
|
skuName.MtwmCategoryID = v.VendorCategoryID
|
||||||
|
}
|
||||||
|
if v.VendorID == model.VendorIDJDShop {
|
||||||
|
skuName.JdsCategoryID = v.VendorCategoryID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if len(skuIDs) > 0 {
|
if len(skuIDs) > 0 {
|
||||||
thingMapMap, err2 := dao.GetThingMapMap(db, model.ThingTypeSku, nil, skuIDs)
|
thingMapMap, err2 := dao.GetThingMapMap(db, model.ThingTypeSku, nil, skuIDs)
|
||||||
@@ -706,23 +756,37 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
|
|||||||
return skuNamesInfo, err
|
return skuNamesInfo, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func CheckHasSensitiveWord(word string) (bool, error) {
|
func CheckHasSensitiveWord(word string) (bool, string) {
|
||||||
if hasSensitiveWord, sensitiveWord := IsSensitiveWordInList(word); hasSensitiveWord {
|
if hasSensitiveWord, sensitiveWord := IsSensitiveWordInList(word); hasSensitiveWord {
|
||||||
return true, errors.New(fmt.Sprintf("不能包含敏感词:[%s]", sensitiveWord))
|
return true, sensitiveWord
|
||||||
}
|
}
|
||||||
|
|
||||||
return false, nil
|
return false, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsSensitiveWordInList(str string) (bool, string) {
|
func IsSensitiveWordInList(str string) (bool, string) {
|
||||||
wordList, err := dao.GetSensitiveWordList()
|
wordList, err := dao.GetSensitiveWordList(-1)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
for _, value := range wordList {
|
for _, value := range wordList {
|
||||||
keyWord := value.Word
|
keyWord := value.Word
|
||||||
|
if value.VendorID != -2 {
|
||||||
checkHas := strings.Contains(str, keyWord)
|
checkHas := strings.Contains(str, keyWord)
|
||||||
if checkHas {
|
if checkHas {
|
||||||
return true, keyWord
|
return true, keyWord
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
var index int
|
||||||
|
for index > 0 {
|
||||||
|
index = strings.Index(keyWord, ",")
|
||||||
|
keyWord = keyWord[:index-1]
|
||||||
|
globals.SugarLogger.Debug("keyWord", keyWord)
|
||||||
|
checkHas := strings.Contains(str, keyWord)
|
||||||
|
if checkHas {
|
||||||
|
return true, keyWord
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -742,8 +806,8 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s
|
|||||||
}
|
}
|
||||||
|
|
||||||
skuNameExt.Name = utils.TrimBlankChar(skuNameExt.Name)
|
skuNameExt.Name = utils.TrimBlankChar(skuNameExt.Name)
|
||||||
if hasSensitiveWord, err := CheckHasSensitiveWord(skuNameExt.Name); hasSensitiveWord {
|
if hasSensitiveWord, word := CheckHasSensitiveWord(skuNameExt.Name); hasSensitiveWord {
|
||||||
return nil, err
|
skuNameExt.Name = strings.ReplaceAll(skuNameExt.Name, word, "")
|
||||||
}
|
}
|
||||||
upc := utils.Pointer2String(skuNameExt.Upc)
|
upc := utils.Pointer2String(skuNameExt.Upc)
|
||||||
if upc == "" {
|
if upc == "" {
|
||||||
@@ -824,7 +888,7 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s
|
|||||||
dao.Rollback(db)
|
dao.Rollback(db)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err = OnCreateThing(ctx, db, nil, int64(skuNameExt.SkuName.ID), model.ThingTypeSkuName); err != nil {
|
if err = OnCreateThing(ctx, db, nil, int64(skuNameExt.SkuName.ID), model.ThingTypeSkuName, model.SyncFlagNewMask, false); err != nil {
|
||||||
dao.Rollback(db)
|
dao.Rollback(db)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -832,14 +896,18 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s
|
|||||||
sku := v.Sku
|
sku := v.Sku
|
||||||
dao.WrapAddIDCULDEntity(sku, userName)
|
dao.WrapAddIDCULDEntity(sku, userName)
|
||||||
sku.NameID = skuNameExt.ID
|
sku.NameID = skuNameExt.ID
|
||||||
// sku.JdSyncStatus = model.SyncFlagNewMask
|
if beego.BConfig.RunMode == "jxgy" {
|
||||||
// sku.JdID = 0
|
sku.LadderBoxPrice = 0
|
||||||
|
} else if beego.BConfig.RunMode == "prod" {
|
||||||
|
sku.LadderBoxPrice = 10
|
||||||
|
}
|
||||||
|
sku.LadderBoxNum = 1
|
||||||
if err = dao.CreateEntity(db, sku); err != nil {
|
if err = dao.CreateEntity(db, sku); err != nil {
|
||||||
dao.Rollback(db)
|
dao.Rollback(db)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if sku.EclpID == "" {
|
if sku.EclpID == "" {
|
||||||
if err = OnCreateThing(ctx, db, nil, int64(sku.ID), model.ThingTypeSku); err != nil {
|
if err = OnCreateThing(ctx, db, nil, int64(sku.ID), model.ThingTypeSku, 0, false); err != nil {
|
||||||
dao.Rollback(db)
|
dao.Rollback(db)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -866,6 +934,8 @@ func AddSkuName(ctx *jxcontext.Context, skuNameExt *model.SkuNameExt, userName s
|
|||||||
}
|
}
|
||||||
outSkuNameExt = tmpInfo.SkuNames[0]
|
outSkuNameExt = tmpInfo.SkuNames[0]
|
||||||
_, err = CurVendorSync.SyncSku(ctx, db, outSkuNameExt.SkuName.ID, -1, false, false, userName)
|
_, err = CurVendorSync.SyncSku(ctx, db, outSkuNameExt.SkuName.ID, -1, false, false, userName)
|
||||||
|
|
||||||
|
updateOrCreateSkuVendorCategoryMap(db, ctx, outSkuNameExt.SkuName.ID, nil, skuNameExt, false)
|
||||||
return outSkuNameExt, err
|
return outSkuNameExt, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -880,11 +950,12 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
|
|||||||
var beforSkuName = *skuName
|
var beforSkuName = *skuName
|
||||||
if payload["name"] != nil {
|
if payload["name"] != nil {
|
||||||
newSkuName := utils.TrimBlankChar(utils.Interface2String(payload["name"]))
|
newSkuName := utils.TrimBlankChar(utils.Interface2String(payload["name"]))
|
||||||
if hasSensitiveWord, err := CheckHasSensitiveWord(newSkuName); hasSensitiveWord {
|
if hasSensitiveWord, word := CheckHasSensitiveWord(newSkuName); hasSensitiveWord {
|
||||||
return 0, err
|
payload["name"] = strings.ReplaceAll(payload["name"].(string), word, "")
|
||||||
}
|
} else {
|
||||||
payload["name"] = newSkuName
|
payload["name"] = newSkuName
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
delete(payload, "isSpu")
|
delete(payload, "isSpu")
|
||||||
delete(payload, "seq")
|
delete(payload, "seq")
|
||||||
@@ -892,7 +963,8 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
|
|||||||
valid := dao.StrictMakeMapByStructObject(payload, skuName, userName)
|
valid := dao.StrictMakeMapByStructObject(payload, skuName, userName)
|
||||||
valid = utils.RemoveGeneralMapKeys(valid, model.FieldSpecQuality, model.FieldSpecUnit)
|
valid = utils.RemoveGeneralMapKeys(valid, model.FieldSpecQuality, model.FieldSpecUnit)
|
||||||
_, hasPlaces := payload["places"]
|
_, hasPlaces := payload["places"]
|
||||||
if len(valid) > 0 || hasPlaces {
|
flag := updateOrCreateSkuVendorCategoryMap(db, ctx, nameID, payload, nil, false)
|
||||||
|
if len(valid) > 0 || hasPlaces || flag {
|
||||||
if valid["Upc"] != nil {
|
if valid["Upc"] != nil {
|
||||||
if upc, _ := valid["Upc"].(string); upc == "" {
|
if upc, _ := valid["Upc"].(string); upc == "" {
|
||||||
valid["Upc"] = nil
|
valid["Upc"] = nil
|
||||||
@@ -901,7 +973,7 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
globals.SugarLogger.Debugf("UpdateSkuName valid:%s", utils.Format4Output(valid, false))
|
globals.SugarLogger.Debugf("UpdateSkuName valid:%s", utils.Format4Output(valid, false))
|
||||||
for _, imgName := range []string{"img", "img2"} {
|
for _, imgName := range []string{"img", "img2", "img3"} {
|
||||||
if valid[imgName] != nil {
|
if valid[imgName] != nil {
|
||||||
if imgStr := utils.Interface2String(valid[imgName]); imgStr != "" {
|
if imgStr := utils.Interface2String(valid[imgName]); imgStr != "" {
|
||||||
_, err2 := datares.TryRegisterDataResource(ctx, skuName.Name, valid[imgName].(string), model.ImgTypeMain, true)
|
_, err2 := datares.TryRegisterDataResource(ctx, skuName.Name, valid[imgName].(string), model.ImgTypeMain, true)
|
||||||
@@ -992,6 +1064,12 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
|
|||||||
dao.Rollback(db)
|
dao.Rollback(db)
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
if valid["jdsStockSwitch"] != nil {
|
||||||
|
if _, err = SetStoreSkuSyncStatus2(db, []int{model.JdShopMainStoreID}, []int{model.VendorIDJDShop}, skuIDs, model.SyncFlagSaleMask); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dao.Commit(db)
|
dao.Commit(db)
|
||||||
|
|
||||||
@@ -1008,6 +1086,70 @@ func UpdateSkuName(ctx *jxcontext.Context, nameID int, payload map[string]interf
|
|||||||
return num, err
|
return num, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, nameID int, payload map[string]interface{}, skuNameExt *model.SkuNameExt, isDelete bool) (flag bool) {
|
||||||
|
if isDelete {
|
||||||
|
skuVendorCatMaps, _ := dao.GetSkuVendorCategoryMaps(db, []int{nameID}, nil, nil)
|
||||||
|
for _, v := range skuVendorCatMaps {
|
||||||
|
v.DeletedAt = time.Now()
|
||||||
|
v.LastOperator = ctx.GetUserName()
|
||||||
|
dao.UpdateEntity(db, v, "DeletedAt", "LastOperator")
|
||||||
|
}
|
||||||
|
flag = true
|
||||||
|
} else {
|
||||||
|
updateOrCreate := func(vendorID, nameID int, vendorCatID string) {
|
||||||
|
skuVendorCatMaps, _ := dao.GetSkuVendorCategoryMaps(db, []int{nameID}, []int{vendorID}, nil)
|
||||||
|
if len(skuVendorCatMaps) > 0 {
|
||||||
|
skuVendorCatMaps[0].VendorCategoryID = vendorCatID
|
||||||
|
dao.UpdateEntity(db, skuVendorCatMaps[0], "VendorCategoryID")
|
||||||
|
} else {
|
||||||
|
skuVendorCatMap := &model.SkuVendorCategoryMap{
|
||||||
|
NameID: nameID,
|
||||||
|
VendorID: vendorID,
|
||||||
|
VendorCategoryID: vendorCatID,
|
||||||
|
}
|
||||||
|
dao.WrapAddIDCULDEntity(skuVendorCatMap, ctx.GetUserName())
|
||||||
|
dao.CreateEntity(db, skuVendorCatMap)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if skuNameExt != nil {
|
||||||
|
if skuNameExt.JdCategoryID != "" {
|
||||||
|
updateOrCreate(model.VendorIDJD, nameID, skuNameExt.JdCategoryID)
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
if skuNameExt.JdsCategoryID != "" {
|
||||||
|
updateOrCreate(model.VendorIDJDShop, nameID, skuNameExt.JdsCategoryID)
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
if skuNameExt.EbaiCategoryID != "" {
|
||||||
|
updateOrCreate(model.VendorIDEBAI, nameID, skuNameExt.EbaiCategoryID)
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
if skuNameExt.MtwmCategoryID != "" {
|
||||||
|
updateOrCreate(model.VendorIDMTWM, nameID, skuNameExt.MtwmCategoryID)
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if payload["jdCategoryID"] != nil {
|
||||||
|
updateOrCreate(model.VendorIDJD, nameID, payload["jdCategoryID"].(string))
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
if payload["jdsCategoryID"] != nil {
|
||||||
|
updateOrCreate(model.VendorIDJDShop, nameID, payload["jdsCategoryID"].(string))
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
if payload["ebaiCategoryID"] != nil {
|
||||||
|
updateOrCreate(model.VendorIDEBAI, nameID, payload["ebaiCategoryID"].(string))
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
if payload["mtwmCategoryID"] != nil {
|
||||||
|
updateOrCreate(model.VendorIDMTWM, nameID, payload["mtwmCategoryID"].(string))
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return flag
|
||||||
|
}
|
||||||
|
|
||||||
func SetStoreSkuSyncStatus2(db *dao.DaoDB, storeIDs []int, vendorIDs, skuIDs []int, syncStatus int) (num int64, err error) {
|
func SetStoreSkuSyncStatus2(db *dao.DaoDB, storeIDs []int, vendorIDs, skuIDs []int, syncStatus int) (num int64, err error) {
|
||||||
for _, vendorID := range vendorIDs {
|
for _, vendorID := range vendorIDs {
|
||||||
num2, err2 := dao.SetStoreSkuSyncStatus(db, vendorID, storeIDs, skuIDs, syncStatus)
|
num2, err2 := dao.SetStoreSkuSyncStatus(db, vendorID, storeIDs, skuIDs, syncStatus)
|
||||||
@@ -1075,6 +1217,7 @@ func DeleteSkuName(ctx *jxcontext.Context, nameID int, userName string) (num int
|
|||||||
if len(skuList) > 0 {
|
if len(skuList) > 0 {
|
||||||
_, err = CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, false, userName)
|
_, err = CurVendorSync.SyncSku(ctx, db, skuName.ID, -1, false, false, userName)
|
||||||
}
|
}
|
||||||
|
updateOrCreateSkuVendorCategoryMap(db, ctx, nameID, nil, nil, true)
|
||||||
return num, err
|
return num, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1093,7 +1236,12 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string)
|
|||||||
// sku.JdSyncStatus = model.SyncFlagNewMask
|
// sku.JdSyncStatus = model.SyncFlagNewMask
|
||||||
// sku.JdID = 0
|
// sku.JdID = 0
|
||||||
sku.NameID = nameID
|
sku.NameID = nameID
|
||||||
|
if beego.BConfig.RunMode == "jxgy" {
|
||||||
|
sku.LadderBoxPrice = 0
|
||||||
|
} else if beego.BConfig.RunMode == "prod" {
|
||||||
|
sku.LadderBoxPrice = 10
|
||||||
|
}
|
||||||
|
sku.LadderBoxNum = 1
|
||||||
dao.Begin(db)
|
dao.Begin(db)
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
@@ -1105,7 +1253,7 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string)
|
|||||||
dao.Rollback(db)
|
dao.Rollback(db)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err = OnCreateThing(ctx, db, nil, int64(sku.ID), model.ThingTypeSku); err != nil {
|
if err = OnCreateThing(ctx, db, nil, int64(sku.ID), model.ThingTypeSku, 0, false); err != nil {
|
||||||
dao.Rollback(db)
|
dao.Rollback(db)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -1124,7 +1272,7 @@ func AddSku(ctx *jxcontext.Context, nameID int, sku *model.Sku, userName string)
|
|||||||
storeSkus, err := dao.GetStoreSkusByNameIDs(db, []int{model.JdShopMainStoreID}, nameID)
|
storeSkus, err := dao.GetStoreSkusByNameIDs(db, []int{model.JdShopMainStoreID}, nameID)
|
||||||
if len(storeSkus) > 0 {
|
if len(storeSkus) > 0 {
|
||||||
storeIDs := make(map[int]int)
|
storeIDs := make(map[int]int)
|
||||||
storeMaps, err2 := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
|
storeMaps, err2 := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
|
||||||
err = err2
|
err = err2
|
||||||
for _, v := range storeMaps {
|
for _, v := range storeMaps {
|
||||||
storeSkus2, err2 := dao.GetStoreSkusByNameIDs(db, []int{v.StoreID}, nameID)
|
storeSkus2, err2 := dao.GetStoreSkusByNameIDs(db, []int{v.StoreID}, nameID)
|
||||||
@@ -1207,6 +1355,9 @@ func UpdateSku(ctx *jxcontext.Context, skuID int, payload map[string]interface{}
|
|||||||
if maskValue&model.SyncFlagSpecMask != 0 {
|
if maskValue&model.SyncFlagSpecMask != 0 {
|
||||||
err = refreshStoreSkuPrice(ctx, db, skuID)
|
err = refreshStoreSkuPrice(ctx, db, skuID)
|
||||||
}
|
}
|
||||||
|
if valid["status"] != nil {
|
||||||
|
SetStoreSkuSyncStatus2(db, nil, partner.GetSingleStoreVendorIDs(), []int{skuID}, model.SyncFlagSaleMask)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
errList := errlist.New()
|
errList := errlist.New()
|
||||||
errList.AddErr(err)
|
errList.AddErr(err)
|
||||||
@@ -1227,7 +1378,7 @@ func refreshStoreSkuPrice(ctx *jxcontext.Context, db *dao.DaoDB, skuID int) (err
|
|||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
v := batchItemList[0].(*dao.StoreSkuAndName)
|
v := batchItemList[0].(*dao.StoreSkuAndName)
|
||||||
storeID := v.StoreID
|
storeID := v.StoreID
|
||||||
storeDetail, _ := dao.GetStoreDetail(db, storeID, model.VendorIDJX)
|
storeDetail, _ := dao.GetStoreDetail(db, storeID, model.VendorIDJX, "")
|
||||||
if storeDetail == nil {
|
if storeDetail == nil {
|
||||||
return retVal, err
|
return retVal, err
|
||||||
}
|
}
|
||||||
@@ -1509,7 +1660,7 @@ func GetJdUpcCodeByName(ctx *jxcontext.Context, name, upcCode string) (productIn
|
|||||||
return productInfos, err
|
return productInfos, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fromTime, toTime string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, imgWaterMark string, vendorID int, exPrefix, fromTime, toTime string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||||
var (
|
var (
|
||||||
fromTimeP time.Time
|
fromTimeP time.Time
|
||||||
toTimeP time.Time
|
toTimeP time.Time
|
||||||
@@ -1537,24 +1688,30 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro
|
|||||||
"exPrefix": exPrefix,
|
"exPrefix": exPrefix,
|
||||||
"exPrefixBegin": fromTimeP,
|
"exPrefixBegin": fromTimeP,
|
||||||
"exPrefixEnd": toTimeP,
|
"exPrefixEnd": toTimeP,
|
||||||
|
"imgWaterMark": imgWaterMark,
|
||||||
|
"exVendorID": vendorID,
|
||||||
}
|
}
|
||||||
if now.Sub(toTimeP) <= 0 && now.Sub(fromTimeP) >= 0 {
|
if now.Sub(toTimeP) <= 0 && now.Sub(fromTimeP) <= 0 {
|
||||||
_, err = UpdateSkuName(ctx, nameID, payload, false)
|
_, err = UpdateSkuName(ctx, nameID, payload, false)
|
||||||
} else if now.Sub(fromTimeP) > 0 && now.Sub(toTimeP) > 0 {
|
} else if now.Sub(fromTimeP) > 0 && now.Sub(toTimeP) > 0 {
|
||||||
payload["exPrefixBegin"] = nil
|
payload["exPrefixBegin"] = nil
|
||||||
payload["exPrefixEnd"] = nil
|
payload["exPrefixEnd"] = nil
|
||||||
|
payload["imgWaterMark"] = nil
|
||||||
|
payload["exVendorID"] = nil
|
||||||
_, err = UpdateSkuName(ctx, nameID, payload, false)
|
_, err = UpdateSkuName(ctx, nameID, payload, false)
|
||||||
} else {
|
} else {
|
||||||
skuList, err := dao.GetSkus(db, nil, []int{nameID}, nil, nil, nil)
|
skuList, err := dao.GetSkus(db, nil, []int{nameID}, nil, nil, nil)
|
||||||
if err == nil && len(skuList) > 0 {
|
if err == nil && len(skuList) > 0 {
|
||||||
if skuList[0].ExPrefixBegin != nil {
|
if skuList[0].ExPrefixBegin != nil {
|
||||||
_, err = UpdateSkuName(ctx, nameID, payload, false)
|
_, err = UpdateSkuName(ctx, nameID, payload, false)
|
||||||
CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, partner.GetSingleStoreVendorIDs(), nil, false, []int{skuList[0].ID}, nil, model.SyncFlagModifiedMask, true, true)
|
CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, []int{vendorID}, nil, false, []int{skuList[0].ID}, nil, model.SyncFlagModifiedMask, true, true)
|
||||||
} else {
|
} else {
|
||||||
skuName := &model.SkuName{
|
skuName := &model.SkuName{
|
||||||
ExPrefix: exPrefix,
|
ExPrefix: exPrefix,
|
||||||
ExPrefixBegin: &fromTimeP,
|
ExPrefixBegin: &fromTimeP,
|
||||||
ExPrefixEnd: &toTimeP,
|
ExPrefixEnd: &toTimeP,
|
||||||
|
ImgWatermark: imgWaterMark,
|
||||||
|
ExVendorID: vendorID,
|
||||||
}
|
}
|
||||||
skuName.ID = nameID
|
skuName.ID = nameID
|
||||||
skuName.LastOperator = ctx.GetLoginID()
|
skuName.LastOperator = ctx.GetLoginID()
|
||||||
@@ -1566,7 +1723,7 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro
|
|||||||
panic(r)
|
panic(r)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
_, err = dao.UpdateEntity(db, skuName, "ExPrefix", "ExPrefixBegin", "ExPrefixEnd", "LastOperator", "UpdatedAt")
|
_, err = dao.UpdateEntity(db, skuName, "ImgWatermark", "ExVendorID", "ExPrefix", "ExPrefixBegin", "ExPrefixEnd", "LastOperator", "UpdatedAt")
|
||||||
dao.Commit(db)
|
dao.Commit(db)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1584,7 +1741,7 @@ func UpdateSkuNamesExPrefix(ctx *jxcontext.Context, nameIDs []int, exPrefix, fro
|
|||||||
for _, v := range skuList {
|
for _, v := range skuList {
|
||||||
skuIDs = append(skuIDs, v.ID)
|
skuIDs = append(skuIDs, v.ID)
|
||||||
}
|
}
|
||||||
CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, partner.GetSingleStoreVendorIDs(), nil, false, skuIDs, nil, model.SyncFlagModifiedMask, true, true)
|
CurVendorSync.SyncStoresSkus2(ctx, nil, 0, db, []int{vendorID}, nil, false, skuIDs, nil, model.SyncFlagModifiedMask, true, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2507,8 +2664,318 @@ func getImgFromNet(db *dao.DaoDB, upc string) (img string) {
|
|||||||
|
|
||||||
func deleteJdsSku(db *dao.DaoDB, skuID int) (err error) {
|
func deleteJdsSku(db *dao.DaoDB, skuID int) (err error) {
|
||||||
storeBinds, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, []int{skuID})
|
storeBinds, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, []int{skuID})
|
||||||
if err == nil {
|
if err == nil && len(storeBinds) > 0 {
|
||||||
err = api.JdShopAPI.DeleteSku(storeBinds[0].JdsID)
|
err = api.JdShopAPI.DeleteSku(storeBinds[0].JdsID)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func UpdateSkuExinfoMap(ctx *jxcontext.Context, nameIDs []int, imgWaterMark string, brandID, vendorID int, vendorOrgCode, exPrefix, fromTime, toTime string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||||
|
var (
|
||||||
|
fromTimeP time.Time
|
||||||
|
toTimeP time.Time
|
||||||
|
db = dao.GetDB()
|
||||||
|
// skuIDs []int
|
||||||
|
)
|
||||||
|
if fromTime != "" {
|
||||||
|
fromTimeP = utils.Time2Date(utils.Str2Time(fromTime))
|
||||||
|
}
|
||||||
|
if toTime != "" {
|
||||||
|
toTimeP = utils.Time2Date(utils.Str2Time(toTime))
|
||||||
|
}
|
||||||
|
if toTimeP.Before(fromTimeP) {
|
||||||
|
return "", fmt.Errorf("结束时间不可以小于开始时间!开始时间:[%v],结束时间:[%v]", fromTimeP, toTimeP)
|
||||||
|
}
|
||||||
|
task := tasksch.NewParallelTask("刷新商品前缀水印图", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||||
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
|
nameID := batchItemList[0].(int)
|
||||||
|
skuEx := &model.SkuExinfoMap{
|
||||||
|
NameID: nameID,
|
||||||
|
ImgWatermark: imgWaterMark,
|
||||||
|
ExPrefix: exPrefix,
|
||||||
|
VendorID: vendorID,
|
||||||
|
BeginAt: fromTimeP,
|
||||||
|
EndAt: toTimeP,
|
||||||
|
BrandID: brandID,
|
||||||
|
}
|
||||||
|
dao.WrapAddIDCULDEntity(skuEx, ctx.GetUserName())
|
||||||
|
if imgWaterMark != "" {
|
||||||
|
if skuNames, err := dao.GetSkuNames(db, []int{nameID}, nil, "", false); err == nil {
|
||||||
|
if ImgMix := jxutils.MixWatermarkImg(imgWaterMark, skuNames[0].Img, &fromTimeP, &toTimeP); ImgMix != "" {
|
||||||
|
skuEx.ImgWatermarkMix = ImgMix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
skuExs, _ := dao.GetSkuExinfos(db, []int{nameID}, []int{vendorID}, "", utils.ZeroTimeValue, utils.ZeroTimeValue)
|
||||||
|
if len(skuExs) > 0 {
|
||||||
|
skuEx2 := skuExs[0]
|
||||||
|
skuEx2.DeletedAt = time.Now()
|
||||||
|
skuEx2.LastOperator = ctx.GetUserName()
|
||||||
|
dao.UpdateEntity(db, skuEx2, "DeletedAt", "LastOperator")
|
||||||
|
dao.CreateEntity(db, skuEx)
|
||||||
|
} else {
|
||||||
|
dao.CreateEntity(db, skuEx)
|
||||||
|
}
|
||||||
|
now := utils.Time2Date(time.Now())
|
||||||
|
if now.Sub(fromTimeP) >= 0 && now.Sub(toTimeP) <= 0 {
|
||||||
|
var skuIDs []int
|
||||||
|
skuList, err2 := dao.GetSkus(db, nil, []int{nameID}, nil, nil, nil)
|
||||||
|
if err = err2; err == nil {
|
||||||
|
if len(skuList) > 0 {
|
||||||
|
for _, v := range skuList {
|
||||||
|
skuIDs = append(skuIDs, v.ID)
|
||||||
|
}
|
||||||
|
if partner.IsMultiStore(vendorID) {
|
||||||
|
for _, v := range skuIDs {
|
||||||
|
OnUpdateThing(ctx, db, nil, int64(v), model.ThingTypeSku)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
var storeIDs []int
|
||||||
|
if brandID != 0 {
|
||||||
|
if stores, _ := dao.GetStoreList(db, nil, nil, nil, []int{brandID}, nil, ""); len(stores) > 0 {
|
||||||
|
for _, v := range stores {
|
||||||
|
storeIDs = append(storeIDs, v.ID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SetStoreSkuSyncStatus2(db, storeIDs, []int{vendorID}, skuIDs, model.SyncFlagModifiedMask)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retVal, err
|
||||||
|
}, nameIDs)
|
||||||
|
tasksch.HandleTask(task, nil, true).Run()
|
||||||
|
if isAsync {
|
||||||
|
hint = task.GetID()
|
||||||
|
} else {
|
||||||
|
_, err = task.GetResult(0)
|
||||||
|
hint = "1"
|
||||||
|
}
|
||||||
|
return hint, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetVendorCategoryMap(ctx *jxcontext.Context, parentID, level, vendorID int, vendorOrgCode string) (vendorMaps []*model.VendorCategoryMap, err error) {
|
||||||
|
db := dao.GetDB()
|
||||||
|
vendorMaps, err = dao.GetVendorCategoryMap(db, parentID, level, vendorID, vendorOrgCode, 0)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return vendorMaps, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddVendorCategoryMap(ctx *jxcontext.Context, vendorCategoryMap *model.VendorCategoryMap) (result *model.VendorCategoryMap, err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
if vendorCategoryMap.Level != 1 {
|
||||||
|
storeCatMaps, _ := dao.GetVendorCategoryMap(db, -1, 0, vendorCategoryMap.VendorID, vendorCategoryMap.VendorOrgCode, vendorCategoryMap.CategoryID)
|
||||||
|
if len(storeCatMaps) > 0 {
|
||||||
|
return nil, fmt.Errorf("已存在绑定的京西分类,分类名:[%v]", storeCatMaps[0].VendorCategoryName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vendorOrgCodes, _ := dao.GetVendorOrgCode(db, vendorCategoryMap.VendorID, vendorCategoryMap.VendorOrgCode, model.VendorOrgTypePlatform)
|
||||||
|
vendorCategoryMap.VendorCategoryName = strings.Trim(vendorCategoryMap.VendorCategoryName, " ")
|
||||||
|
dao.WrapAddIDCULDEntity(vendorCategoryMap, ctx.GetUserName())
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if err = dao.CreateEntity(db, vendorCategoryMap); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
//如果传了京西绑定,要去thingmap里改同步标志
|
||||||
|
if vendorCategoryMap.CategoryID != 0 {
|
||||||
|
if err = OnCreateThing(ctx, db, vendorOrgCodes, int64(vendorCategoryMap.CategoryID), model.ThingTypeCategory, model.SyncFlagNewMask, true); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
result = vendorCategoryMap
|
||||||
|
if vendorCategoryMap.CategoryID != 0 {
|
||||||
|
SyncCategories(ctx, nil, []int{vendorCategoryMap.VendorID}, []string{vendorCategoryMap.VendorOrgCode}, []int{vendorCategoryMap.CategoryID}, true)
|
||||||
|
// _, err = CurVendorSync.SyncCategory(ctx, nil, vendorCategoryMap.CategoryID, false, ctx.GetUserName())
|
||||||
|
}
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateVendorCategoryMap(ctx *jxcontext.Context, ID int, vendorCategoryMap *model.VendorCategoryMap, isDelete bool) (num int64, err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
valid = make(map[string]interface{})
|
||||||
|
vendorCategoryMap2 = &model.VendorCategoryMap{}
|
||||||
|
vendorCategoryID int
|
||||||
|
)
|
||||||
|
vendorCategoryMap2.ID = ID
|
||||||
|
if err = dao.GetEntity(db, vendorCategoryMap2); err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if vendorCategoryMap.VendorCategoryName != "" {
|
||||||
|
valid["vendorCategoryName"] = vendorCategoryMap.VendorCategoryName
|
||||||
|
}
|
||||||
|
if vendorCategoryMap.CategoryID != 0 {
|
||||||
|
valid["categoryID"] = vendorCategoryMap.CategoryID
|
||||||
|
if !isDelete {
|
||||||
|
storeCatMaps, _ := dao.GetVendorCategoryMap(db, -1, 0, vendorCategoryMap2.VendorID, vendorCategoryMap2.VendorOrgCode, vendorCategoryMap.CategoryID)
|
||||||
|
if len(storeCatMaps) > 0 {
|
||||||
|
for _, v := range storeCatMaps {
|
||||||
|
if v.ID != ID {
|
||||||
|
return 0, fmt.Errorf("已存在绑定的京西分类,分类名:[%v]", storeCatMaps[0].VendorCategoryName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vendorCategoryID = vendorCategoryMap.CategoryID
|
||||||
|
} else {
|
||||||
|
vendorCategoryID = vendorCategoryMap2.CategoryID
|
||||||
|
}
|
||||||
|
if vendorCategoryMap.Level != 0 {
|
||||||
|
valid["level"] = vendorCategoryMap.Level
|
||||||
|
if vendorCategoryMap.Level == 2 {
|
||||||
|
cat2, _ := dao.GetCategories(db, -1, 0, []int{vendorCategoryMap.CategoryID}, false)
|
||||||
|
if len(cat2) > 0 {
|
||||||
|
if cat2[0].ParentID != vendorCategoryMap.ParentID {
|
||||||
|
return 0, fmt.Errorf("此二级分类只能绑定到对应一级分类下!")
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if isDelete {
|
||||||
|
valid["deletedAt"] = time.Now()
|
||||||
|
valid["updatedAt"] = time.Now()
|
||||||
|
valid["lastOperator"] = ctx.GetUserName()
|
||||||
|
//如果是1级分类则删除下面的子分类
|
||||||
|
var catIDs []int
|
||||||
|
if vendorCategoryMap2.Level == 1 {
|
||||||
|
storeCatMaps, _ := dao.GetVendorCategoryMap(db, vendorCategoryMap2.CategoryID, 2, vendorCategoryMap2.VendorID, vendorCategoryMap2.VendorOrgCode, 0)
|
||||||
|
if len(storeCatMaps) > 0 {
|
||||||
|
for _, v := range storeCatMaps {
|
||||||
|
catIDs = append(catIDs, v.CategoryID)
|
||||||
|
v.DeletedAt = time.Now()
|
||||||
|
v.LastOperator = ctx.GetUserName()
|
||||||
|
dao.UpdateEntity(db, v, "DeletedAt", "LastOperator")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vendorOrgCodes, err := dao.GetVendorOrgCode(db, vendorCategoryMap2.VendorID, vendorCategoryMap2.VendorOrgCode, model.VendorOrgTypePlatform)
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if num, err = dao.UpdateEntityLogically(db, vendorCategoryMap2, valid, ctx.GetUserName(), nil); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
if err = OnUpdateThing(ctx, db, vendorOrgCodes, int64(vendorCategoryID), model.ThingTypeCategory); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
SyncCategories(ctx, nil, []int{vendorCategoryMap.VendorID}, []string{vendorCategoryMap.VendorOrgCode}, []int{vendorCategoryID}, true)
|
||||||
|
return num, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReorderVendorCategories(ctx *jxcontext.Context, parentID, vendorID int, vendorOrgCode string, categoryIDs []int) (err error) {
|
||||||
|
var (
|
||||||
|
vendorCatsMap []*model.VendorCategoryMap
|
||||||
|
)
|
||||||
|
db := dao.GetDB()
|
||||||
|
vendorCatsMap, err = dao.GetVendorCategoryMap(db, parentID, 0, vendorID, vendorOrgCode, 0)
|
||||||
|
catsLen := len(vendorCatsMap)
|
||||||
|
if catsLen != len(categoryIDs) {
|
||||||
|
return ErrInputCatsDoesntMatch
|
||||||
|
}
|
||||||
|
catsMap := make(map[int]*model.VendorCategoryMap, catsLen)
|
||||||
|
for _, cat := range vendorCatsMap {
|
||||||
|
catsMap[cat.CategoryID] = cat
|
||||||
|
}
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
for k, v := range categoryIDs {
|
||||||
|
if catsMap[v] == nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return fmt.Errorf("分类:%d不在%d分类下", v, parentID)
|
||||||
|
}
|
||||||
|
catsMap[v].VendorCategorySeq = k
|
||||||
|
catsMap[v].LastOperator = ctx.GetUserName()
|
||||||
|
if _, err = dao.UpdateEntity(db, catsMap[v]); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
err = SyncReorderCategories2(ctx, parentID, vendorID, vendorOrgCode)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadStoreVendorCategories(ctx *jxcontext.Context, vendorOrgCode string, vendorID, storeID int) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
|
||||||
|
storeCats, err := dao.GetStoreCategoryMap(db, -1, 0, storeID, 0)
|
||||||
|
if len(storeCats) == 0 {
|
||||||
|
return fmt.Errorf("未查询到该门店有门店分类,请重新选择! [%v]", storeID)
|
||||||
|
}
|
||||||
|
vendorOrgCodes, _ := dao.GetVendorOrgCode(db, vendorID, vendorOrgCode, model.VendorOrgTypePlatform)
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
sql := `
|
||||||
|
DELETE FROM vendor_category_map WHERE vendor_id = ? AND vendor_org_code = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
vendorID, vendorOrgCode,
|
||||||
|
}
|
||||||
|
if _, err = dao.ExecuteSQL(db, sql, sqlParams); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
sql2 := `
|
||||||
|
INSERT INTO vendor_category_map
|
||||||
|
(created_at, updated_at, last_operator, deleted_at, vendor_id, vendor_org_code, category_id, vendor_category_name, vendor_category_seq, level, parent_id)
|
||||||
|
SELECT ?, ?, ?, ?, ?, ?, category_id, store_category_name, store_category_seq, level, parent_id
|
||||||
|
FROM store_category_map
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
AND store_id = ?
|
||||||
|
`
|
||||||
|
sqlParams2 := []interface{}{
|
||||||
|
time.Now(), time.Now(), ctx.GetUserName(), utils.DefaultTimeValue,
|
||||||
|
vendorID, vendorOrgCode,
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
storeID,
|
||||||
|
}
|
||||||
|
if _, err = dao.ExecuteSQL(db, sql2, sqlParams2); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
catList, _ := dao.GetSkuCategoryWithVendor(db, []int{vendorID}, []string{vendorOrgCode}, -1, nil, false)
|
||||||
|
for _, v := range storeCats {
|
||||||
|
if len(catList) > 0 {
|
||||||
|
OnUpdateThing(ctx, db, vendorOrgCodes, int64(v.CategoryID), model.ThingTypeCategory)
|
||||||
|
} else {
|
||||||
|
OnCreateThing(ctx, db, vendorOrgCodes, int64(v.CategoryID), model.ThingTypeCategory, model.SyncFlagNewMask, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
107
business/jxstore/cms/store_acct.go
Normal file
107
business/jxstore/cms/store_acct.go
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
package cms
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
|
)
|
||||||
|
|
||||||
|
type StoreAcctManager struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
FixedStoreAcctManager *StoreAcctManager
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
FixedStoreAcctManager = &StoreAcctManager{}
|
||||||
|
partner.InitStoreAcctManager(FixedStoreAcctManager)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StoreAcctManager) InsertStoreAcctIncome(ctx *jxcontext.Context, db *dao.DaoDB, storeID, price, acctType int) (err error) {
|
||||||
|
storeAcctIncome := &model.StoreAcctIncome{
|
||||||
|
StoreID: storeID,
|
||||||
|
IncomePrice: price,
|
||||||
|
Type: acctType,
|
||||||
|
UserID: ctx.GetUserID(),
|
||||||
|
}
|
||||||
|
dao.WrapAddIDCULEntity(storeAcctIncome, ctx.GetUserName())
|
||||||
|
err = dao.CreateEntity(db, storeAcctIncome)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StoreAcctManager) InsertStoreAcctExpend(ctx *jxcontext.Context, db *dao.DaoDB, storeID, price, acctType int, vendorOrderID string) (err error) {
|
||||||
|
storeAcctExpend := &model.StoreAcctExpend{
|
||||||
|
StoreID: storeID,
|
||||||
|
ExpendPrice: price,
|
||||||
|
Type: acctType,
|
||||||
|
UserID: ctx.GetUserID(),
|
||||||
|
VendorOrderID: vendorOrderID,
|
||||||
|
}
|
||||||
|
dao.WrapAddIDCULEntity(storeAcctExpend, ctx.GetUserName())
|
||||||
|
err = dao.CreateEntity(db, storeAcctExpend)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StoreAcctManager) UpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price int, isIncome bool) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
storeAcct := &model.StoreAcct{
|
||||||
|
StoreID: storeID,
|
||||||
|
}
|
||||||
|
if isIncome {
|
||||||
|
storeAcct.AccountBalance += price
|
||||||
|
} else {
|
||||||
|
storeAcct.AccountBalance -= price
|
||||||
|
}
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil || err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
if r != nil {
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if err = dao.GetEntity(db, storeAcct, "StoreID"); err != nil && dao.IsNoRowsError(err) {
|
||||||
|
//新增门店账单
|
||||||
|
dao.WrapAddIDCULEntity(storeAcct, ctx.GetUserName())
|
||||||
|
if err = dao.CreateEntity(db, storeAcct); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if _, err = dao.UpdateEntity(db, storeAcct, "AccountBalance"); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StoreAcctManager) InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
if err = s.InsertStoreAcctExpend(ctx, db, storeID, price, acctType, vendorOrderID); err == nil {
|
||||||
|
s.UpdateStoreAcctBalance(ctx, storeID, price, false)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StoreAcctManager) InsertStoreAcctIncomeAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
if err = s.InsertStoreAcctIncome(ctx, db, storeID, price, acctType); err == nil {
|
||||||
|
s.UpdateStoreAcctBalance(ctx, storeID, price, true)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *StoreAcctManager) CheckStoreAcctExpendExist(storeID int, vendorOrderID string) (result bool, err error) {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,10 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils/ddmsg"
|
||||||
|
"github.com/astaxie/beego"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi"
|
"git.rosy.net.cn/baseapi"
|
||||||
@@ -22,7 +26,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
canWriteTolocal = false
|
canWriteTolocal = false
|
||||||
needStatistic = true
|
needStatistic = false
|
||||||
isFilterToBeCreateAndNotSale = true
|
isFilterToBeCreateAndNotSale = true
|
||||||
parallelCount = 5
|
parallelCount = 5
|
||||||
fileExt = ".xlsx"
|
fileExt = ".xlsx"
|
||||||
@@ -38,6 +42,8 @@ const (
|
|||||||
DatAanalyse6 = "京西商品库有,平台商品库没有"
|
DatAanalyse6 = "京西商品库有,平台商品库没有"
|
||||||
DatAanalyse7 = "同步状态异常"
|
DatAanalyse7 = "同步状态异常"
|
||||||
DatAanalyse8 = "平台门店未关注或平台门店商品库存为0,应添加对应的平台门店商品"
|
DatAanalyse8 = "平台门店未关注或平台门店商品库存为0,应添加对应的平台门店商品"
|
||||||
|
DatAanalyse9 = "平台门店价格与京西商品库价格不一致"
|
||||||
|
DatAanalyse10 = "平台商品的VendorSkuID与京西的VendorSkuID不一致"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -55,6 +61,8 @@ var (
|
|||||||
"平台门店ID",
|
"平台门店ID",
|
||||||
"门店名",
|
"门店名",
|
||||||
"SkuID",
|
"SkuID",
|
||||||
|
"京西美团外卖ID",
|
||||||
|
"京西饿百ID",
|
||||||
"同步状态",
|
"同步状态",
|
||||||
"待创建",
|
"待创建",
|
||||||
"待删除",
|
"待删除",
|
||||||
@@ -62,6 +70,8 @@ var (
|
|||||||
"平台商品名",
|
"平台商品名",
|
||||||
"京西可售状态",
|
"京西可售状态",
|
||||||
"平台可售状态",
|
"平台可售状态",
|
||||||
|
"京西价格",
|
||||||
|
"平台价格",
|
||||||
"数据分析",
|
"数据分析",
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,6 +139,8 @@ type DiffData struct {
|
|||||||
VendorStoreID string `json:"平台门店ID"`
|
VendorStoreID string `json:"平台门店ID"`
|
||||||
VendorStoreName string `json:"门店名"`
|
VendorStoreName string `json:"门店名"`
|
||||||
SkuID string `json:"SkuID"`
|
SkuID string `json:"SkuID"`
|
||||||
|
MtwmID string `json:"京西美团外卖ID"`
|
||||||
|
EbaiID string `json:"京西饿百ID"`
|
||||||
SyncStatus string `json:"同步状态"`
|
SyncStatus string `json:"同步状态"`
|
||||||
ToBeCreate string `json:"待创建"`
|
ToBeCreate string `json:"待创建"`
|
||||||
ToBeDel string `json:"待删除"`
|
ToBeDel string `json:"待删除"`
|
||||||
@@ -136,6 +148,8 @@ type DiffData struct {
|
|||||||
VendorSkuName string `json:"平台商品名"`
|
VendorSkuName string `json:"平台商品名"`
|
||||||
JxStatus string `json:"京西可售状态"`
|
JxStatus string `json:"京西可售状态"`
|
||||||
VendorStatus string `json:"平台可售状态"`
|
VendorStatus string `json:"平台可售状态"`
|
||||||
|
JxSkuPrice string `json:"京西价格"` /*哇,不能小写,不然会搞事情*/
|
||||||
|
VendorPrice string `json:"平台价格"`
|
||||||
DatAanalyse string `json:"数据分析"`
|
DatAanalyse string `json:"数据分析"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,7 +230,13 @@ func GetMultiStoreAllSkuInfo(ctx *jxcontext.Context, vendorMap map[int]bool) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
baseapi.SugarLogger.Errorf("GetMultiStoreAllSkuInfo error:%v", err)
|
baseapi.SugarLogger.Errorf("GetMultiStoreAllSkuInfo error:%v", err)
|
||||||
} else {
|
} else {
|
||||||
|
if multiStoreAllSkuInfoList[vendorID] != nil {
|
||||||
multiStoreAllSkuInfoList[vendorID][vendorOrgCode] = StoreSkuFullList2BareFilter(allSkuNameInfoList) //map[平台ID:[]StoreSkuInfo1,StoreSkuInfo2...]
|
multiStoreAllSkuInfoList[vendorID][vendorOrgCode] = StoreSkuFullList2BareFilter(allSkuNameInfoList) //map[平台ID:[]StoreSkuInfo1,StoreSkuInfo2...]
|
||||||
|
} else {
|
||||||
|
multiStoreAllSkuInfoList = make(map[int]map[string][]*partner.StoreSkuInfo)
|
||||||
|
multiStoreAllSkuInfoList[vendorID] = make(map[string][]*partner.StoreSkuInfo)
|
||||||
|
multiStoreAllSkuInfoList[vendorID][vendorOrgCode] = StoreSkuFullList2BareFilter(allSkuNameInfoList) //map[平台ID:[]StoreSkuInfo1,StoreSkuInfo2...]
|
||||||
|
}
|
||||||
tempMap := make(map[int]*partner.SkuNameInfo)
|
tempMap := make(map[int]*partner.SkuNameInfo)
|
||||||
for _, value := range allSkuNameInfoList {
|
for _, value := range allSkuNameInfoList {
|
||||||
for _, skuInfo := range value.SkuList {
|
for _, skuInfo := range value.SkuList {
|
||||||
@@ -332,24 +352,27 @@ func IsSkuCanSale(saleStatus int) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//京西平台和其他平台商品的对比
|
//京西平台和其他平台商品的对比
|
||||||
//storeIDStr 京西商家id ,vendorStoreID 平台商家id
|
//storeIDStr 京西商家id ,vendorStoreID 平台商家id ,isJd 京东比较的标记 0不是,1是
|
||||||
func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName string, filterJxSkuInfoMap map[int]*dao.StoreSkuNameExt, filterVendorSkuInfoMap map[int]*partner.SkuNameInfo) {
|
func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName string, filterJxSkuInfoMap map[int]*dao.StoreSkuNameExt, filterVendorSkuInfoMap map[int]*partner.SkuNameInfo, isJd int) {
|
||||||
|
//utils.Writelog("进入 CompareJxAndVendor 方法")
|
||||||
for skuID, jxSkuInfo := range filterJxSkuInfoMap {
|
for skuID, jxSkuInfo := range filterJxSkuInfoMap {
|
||||||
skuIDStr := utils.Int2Str(skuID)
|
skuIDStr := utils.Int2Str(skuID)
|
||||||
|
/*写京西skuIDStr*/
|
||||||
|
//utils.Writelog("skuIDStr" + skuIDStr)
|
||||||
var jxSkuDetailName string
|
var jxSkuDetailName string
|
||||||
//多规格商品不用比较数量单位
|
|
||||||
if jxSkuInfo.IsSpu == 0 {
|
|
||||||
//jxSkuDetailName : 前缀 ([荐]) + 分类名(xxx水饺) + 数量单位(约..g/份) + 注释 (补充..)
|
//jxSkuDetailName : 前缀 ([荐]) + 分类名(xxx水饺) + 数量单位(约..g/份) + 注释 (补充..)
|
||||||
jxSkuDetailName = jxutils.ComposeSkuNameOriginal(jxSkuInfo.SkuName.Prefix, jxSkuInfo.SkuName.Name, jxSkuInfo.Skus[0].Comment, jxSkuInfo.SkuName.Unit, jxSkuInfo.Skus[0].SkuSpecQuality, jxSkuInfo.Skus[0].SkuSpecUnit, 0)
|
jxSkuDetailName = jxutils.ComposeSkuNameOriginal(jxSkuInfo.SkuName.Prefix, jxSkuInfo.SkuName.Name, jxSkuInfo.Skus[0].Comment, jxSkuInfo.SkuName.Unit, jxSkuInfo.Skus[0].SkuSpecQuality, jxSkuInfo.Skus[0].SkuSpecUnit, 0)
|
||||||
} else {
|
//utils.Writelog("jxSkuDetailName:" + jxSkuDetailName)
|
||||||
//jxSkuDetailName : 前缀 ([荐]) + 分类名(xxx水饺) + 数量单位(约..g/份) + 注释 (补充..)
|
|
||||||
jxSkuDetailName = jxutils.ComposeSkuNameOriginal(jxSkuInfo.SkuName.Prefix, jxSkuInfo.SkuName.Name, jxSkuInfo.Skus[0].Comment, "", jxSkuInfo.Skus[0].SkuSpecQuality, "", 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
//jxSkuSaleStatus : 商品状态 ,skustatus 优先级高于 StoreSkuStatus
|
//jxSkuSaleStatus : 商品状态 ,skustatus 优先级高于 StoreSkuStatus
|
||||||
jxSkuSaleStatus := jxutils.MergeSkuStatus(jxSkuInfo.Skus[0].SkuStatus, jxSkuInfo.Skus[0].StoreSkuStatus)
|
jxSkuSaleStatus := jxutils.MergeSkuStatus(jxSkuInfo.Skus[0].SkuStatus, jxSkuInfo.Skus[0].StoreSkuStatus)
|
||||||
jxSkuSaleStatusName := GetSkuSaleStatusName(jxSkuSaleStatus)
|
jxSkuSaleStatusName := GetSkuSaleStatusName(jxSkuSaleStatus + 3)
|
||||||
|
/*京西价格*/
|
||||||
|
jxSkuPrice := fmt.Sprintf("%.2f", float64(jxSkuInfo.Skus[0].JxPrice)/float64(100))
|
||||||
|
/*饿了吗编码*/
|
||||||
|
ebaiid := jxSkuInfo.Skus[0].EbaiID
|
||||||
|
/*美团编码*/
|
||||||
|
mtwmid := jxSkuInfo.Skus[0].MtwmID
|
||||||
|
//jxSkuPrice := strconv.Itoa(jxSkuInfo.Skus[0].JxPrice)
|
||||||
vendorSkuInfo := filterVendorSkuInfoMap[skuID]
|
vendorSkuInfo := filterVendorSkuInfoMap[skuID]
|
||||||
var status int8
|
var status int8
|
||||||
if vendorID == model.VendorIDMTWM {
|
if vendorID == model.VendorIDMTWM {
|
||||||
@@ -365,14 +388,25 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
|
|||||||
|
|
||||||
if vendorSkuInfo != nil {
|
if vendorSkuInfo != nil {
|
||||||
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
|
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
|
||||||
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status)
|
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status + 3)
|
||||||
|
/* 供货商价格 */
|
||||||
|
vendorPrice := fmt.Sprintf("%.2f", float64(vendorSkuInfo.SkuList[0].StoreSkuInfo.VendorPrice)/float64(100))
|
||||||
|
var IdMark bool
|
||||||
|
if isJd == 0 {
|
||||||
|
IdMark = skuIDStr != ebaiid && skuIDStr != mtwmid
|
||||||
|
} else {
|
||||||
|
IdMark = false
|
||||||
|
}
|
||||||
isSaleStatusDiff := jxSkuSaleStatusName != vendorSkuSaleStatusName
|
isSaleStatusDiff := jxSkuSaleStatusName != vendorSkuSaleStatusName
|
||||||
isNameDiff := jxSkuDetailName != vendorSkuDetailName
|
isNameDiff := jxSkuDetailName != vendorSkuDetailName
|
||||||
|
/*比较价格*/
|
||||||
|
isPriceDiff := vendorPrice != jxSkuPrice
|
||||||
|
//utils.Writelog("isSaleStatusDiff:" + strconv.FormatBool(isSaleStatusDiff))
|
||||||
|
//utils.Writelog("isNameDiff:" + strconv.FormatBool(isNameDiff))
|
||||||
if jxSkuDetailName != "" && vendorSkuDetailName != "" && strings.Contains(jxSkuDetailName, vendorSkuDetailName) {
|
if jxSkuDetailName != "" && vendorSkuDetailName != "" && strings.Contains(jxSkuDetailName, vendorSkuDetailName) {
|
||||||
isNameDiff = false
|
isNameDiff = false
|
||||||
}
|
}
|
||||||
if isSaleStatusDiff || isNameDiff {
|
if isSaleStatusDiff || isNameDiff || isPriceDiff {
|
||||||
reason := ""
|
reason := ""
|
||||||
if isNameDiff {
|
if isNameDiff {
|
||||||
reason += DatAanalyse3
|
reason += DatAanalyse3
|
||||||
@@ -380,15 +414,21 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
|
|||||||
if isSaleStatusDiff {
|
if isSaleStatusDiff {
|
||||||
reason += DatAanalyse4
|
reason += DatAanalyse4
|
||||||
}
|
}
|
||||||
|
if isPriceDiff {
|
||||||
|
reason += DatAanalyse9
|
||||||
|
}
|
||||||
|
if IdMark {
|
||||||
|
reason += DatAanalyse10
|
||||||
|
}
|
||||||
if status != model.SkuStatusDontSale {
|
if status != model.SkuStatusDontSale {
|
||||||
reason += DatAanalyse7
|
reason += DatAanalyse7
|
||||||
}
|
}
|
||||||
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName, reason}
|
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, mtwmid, ebaiid, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName, jxSkuPrice, vendorPrice, reason}
|
||||||
diffData.AppendData(vendorID, outPutData)
|
diffData.AppendData(vendorID, outPutData)
|
||||||
}
|
}
|
||||||
if !isSaleStatusDiff && !isNameDiff {
|
if !isSaleStatusDiff && !isNameDiff {
|
||||||
if status != model.SkuStatusDontSale {
|
if status != model.SkuStatusDontSale {
|
||||||
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName, DatAanalyse7}
|
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, mtwmid, ebaiid, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName, jxSkuPrice, vendorPrice, DatAanalyse7}
|
||||||
diffData.AppendData(vendorID, outPutData)
|
diffData.AppendData(vendorID, outPutData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -405,7 +445,7 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
|
|||||||
if status != model.SkuStatusDontSale {
|
if status != model.SkuStatusDontSale {
|
||||||
reason += DatAanalyse7
|
reason += DatAanalyse7
|
||||||
}
|
}
|
||||||
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, "", jxSkuSaleStatusName, "", reason}
|
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, mtwmid, ebaiid, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, "", jxSkuSaleStatusName, "", jxSkuPrice, "", reason}
|
||||||
diffData.AppendData(vendorID, outPutData)
|
diffData.AppendData(vendorID, outPutData)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -414,18 +454,21 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin
|
|||||||
if len(vendorSkuInfo.SkuList) > 0 {
|
if len(vendorSkuInfo.SkuList) > 0 {
|
||||||
skuIDStr := utils.Int2Str(skuID)
|
skuIDStr := utils.Int2Str(skuID)
|
||||||
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
|
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
|
||||||
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status)
|
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status + 3)
|
||||||
|
/* 供货商价格 */
|
||||||
|
vendorPrice := fmt.Sprintf("%.2f", float64(vendorSkuInfo.SkuList[0].StoreSkuInfo.VendorPrice)/float64(100))
|
||||||
|
/* 供货商价格 */
|
||||||
jxSkuInfo := filterJxSkuInfoMap[skuID]
|
jxSkuInfo := filterJxSkuInfoMap[skuID]
|
||||||
|
/*平台有,京西没有*/
|
||||||
if jxSkuInfo == nil {
|
if jxSkuInfo == nil {
|
||||||
outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", "", "", "", vendorSkuDetailName, "", vendorSkuSaleStatusName, DatAanalyse1}
|
outPutData := DiffData{storeIDStr, vendorStoreID, "", "", storeName, skuIDStr, "", "", "", "", vendorSkuDetailName, "", vendorSkuSaleStatusName, "", vendorPrice, DatAanalyse1}
|
||||||
diffData.AppendData(vendorID, outPutData)
|
diffData.AppendData(vendorID, outPutData)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
globals.SugarLogger.Warnf("CompareJxAndVendor vendorSkuInfo.SkuList:%d is nil", skuID)
|
globals.SugarLogger.Debugf("CompareJxAndVendor vendorSkuInfo.SkuList:%d is nil", skuID)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
globals.SugarLogger.Warnf("CompareJxAndVendor skuID:%d is nil", skuID)
|
globals.SugarLogger.Debugf("CompareJxAndVendor skuID:%d is nil", skuID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -497,7 +540,7 @@ func CompareJxAndMultiVenderDepot(ctx *jxcontext.Context, vendorMap map[int]bool
|
|||||||
if len(vendorSkuInfo.SkuList) > 0 {
|
if len(vendorSkuInfo.SkuList) > 0 {
|
||||||
skuIDStr := utils.Int2Str(skuID)
|
skuIDStr := utils.Int2Str(skuID)
|
||||||
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
|
vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName
|
||||||
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status)
|
vendorSkuSaleStatusName := GetSkuSaleStatusName(vendorSkuInfo.SkuList[0].Status + 3)
|
||||||
|
|
||||||
jxSkuInfo := filterJxSkuInfoMap2[skuID]
|
jxSkuInfo := filterJxSkuInfoMap2[skuID]
|
||||||
if jxSkuInfo == nil {
|
if jxSkuInfo == nil {
|
||||||
@@ -505,16 +548,575 @@ func CompareJxAndMultiVenderDepot(ctx *jxcontext.Context, vendorMap map[int]bool
|
|||||||
depotDiffData.AppendData2(vendorID, outPutData)
|
depotDiffData.AppendData2(vendorID, outPutData)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
globals.SugarLogger.Warnf("CompareJxAndMultiVenderDepot vendorSkuInfo.SkuList:%d is nil", skuID)
|
globals.SugarLogger.Debugf("CompareJxAndMultiVenderDepot vendorSkuInfo.SkuList:%d is nil", skuID)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
globals.SugarLogger.Warnf("CompareJxAndMultiVenderDepot skuID:%d is nil", skuID)
|
globals.SugarLogger.Debugf("CompareJxAndMultiVenderDepot skuID:%d is nil", skuID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func StoreOpenAll(ctx *jxcontext.Context) {
|
||||||
|
AutoFocusStoreSkusForTopSkus(ctx, true, true)
|
||||||
|
//globals.SugarLogger.Debug("StoreOpenAll skuID is start")
|
||||||
|
///*获取美团门店信息*/
|
||||||
|
//StoreInfoList, _ := api.MtpsAPI.GetStoreStatusAll()
|
||||||
|
//StoreInfoList2 := make(map[string]string)
|
||||||
|
//for _, store := range StoreInfoList {
|
||||||
|
// for _, data := range store.DataList {
|
||||||
|
// StoreInfoList2[data.OuterPoiID] = data.PoiName
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//db := dao.GetDB()
|
||||||
|
///*比较营业状态*/
|
||||||
|
///*把获取的京西状态和名称存一下*/
|
||||||
|
//StoreCourierList, _ := dao.GetStoreCourierList(db, []int{}, model.StoreStatusAll, model.StoreStatusAll)
|
||||||
|
///*循环美团*/
|
||||||
|
//for _, StoreInfoList1 := range StoreInfoList {
|
||||||
|
// for _, StoreInfoList11 := range StoreInfoList1.DataList {
|
||||||
|
// /*循环京西*/
|
||||||
|
// for _, StoreCourierList1 := range StoreCourierList {
|
||||||
|
// /*只比较美团*/
|
||||||
|
// if StoreCourierList1.VendorID != model.VendorIDMTPS {
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// /*如果门店ID相同的时候进入判断,一个门店只用判断一次就行*/
|
||||||
|
// if StoreCourierList1.VendorStoreID == StoreInfoList11.OuterPoiID {
|
||||||
|
// if StoreCourierList1.Status != StoreInfoList11.OpenType {
|
||||||
|
// sl := make(map[string]interface{})
|
||||||
|
// sl["vendorStoreID"] = StoreInfoList11.OuterPoiID
|
||||||
|
// sl["status"] = StoreInfoList11.OpenType
|
||||||
|
// sl["vendorStatus"] = StoreInfoList11.OpenType
|
||||||
|
// globals.SugarLogger.Debugf("被修改配送状态的VendorStoreID是:%s,名称是:%s,美团状态是:%s,本地状态是:%s",
|
||||||
|
// StoreInfoList11.OuterPoiID, StoreInfoList11.PoiName, strconv.Itoa(StoreInfoList11.OpenType), strconv.Itoa(StoreCourierList1.Status))
|
||||||
|
// UpdateStoreCourierMap(ctx, nil, StoreCourierList1.StoreID, StoreCourierList1.VendorID, sl, ctx.GetUserName())
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
///* 美团配送的门店是否存在,调用美团配送的api(有可能接了),查询京西门店对应的美团配送门店是否存在,若不存在则要在京西这边解绑美团配送门店
|
||||||
|
// 怎么解绑可以在网页上门店管理那点一下看看调的什么接口,传的什么参数*/
|
||||||
|
///*获取所有门店信息*/
|
||||||
|
////test:
|
||||||
|
//for _, StoreCourierList1 := range StoreCourierList {
|
||||||
|
// diff := false
|
||||||
|
// StoreLists, _ := dao.GetStoreList(db, []int{StoreCourierList1.StoreID}, nil, nil, nil, "")
|
||||||
|
// if StoreLists == nil {
|
||||||
|
// globals.SugarLogger.Debugf("StoreID为:%s,在store表未找到", StoreCourierList1.StoreID)
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// if StoreCourierList1.VendorID != model.VendorIDMTPS || StoreCourierList1.VendorStoreID == "" {
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// if StoreCourierList1.Status == model.StoreStatusDisabled || StoreCourierList1.Status == model.StoreStatusClosed {
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// /*京西不为空,容错*/
|
||||||
|
// //if {
|
||||||
|
// /*调用API获取美团的商店信息*/
|
||||||
|
// MTPSInfo := new(mtpsapi.ShopInfo)
|
||||||
|
// MTPSInfo, _ = api.MtpsAPI.ShopQuery(StoreCourierList1.VendorStoreID)
|
||||||
|
// if MTPSInfo == nil {
|
||||||
|
// globals.SugarLogger.Debug("美团未找到该门店," + StoreLists[0].Name + strconv.Itoa(StoreCourierList1.StoreID) + " 被解绑,关联的ID为:" + StoreCourierList1.VendorStoreID)
|
||||||
|
// diff = true
|
||||||
|
// }
|
||||||
|
// if MTPSInfo != nil && MTPSInfo.ShopName == "" {
|
||||||
|
// MTPSInfo.ShopName = StoreInfoList2[MTPSInfo.ShopID]
|
||||||
|
// }
|
||||||
|
// if MTPSInfo != nil && MTPSInfo.ShopLng != StoreCourierList1.Lng && MTPSInfo.ShopLat == StoreCourierList1.Lat {
|
||||||
|
// /*平台上但是坐标不同,解绑*/
|
||||||
|
// globals.SugarLogger.Debug("商店与美团配送上的坐标不同," + StoreLists[0].Name + strconv.Itoa(StoreCourierList1.StoreID) + " 被解绑,关联的ID为:" + StoreCourierList1.VendorStoreID)
|
||||||
|
// if _, err := DeleteStoreCourierMap(ctx, db, StoreCourierList1.StoreID, StoreCourierList1.VendorID, ctx.GetUserName()); err != nil {
|
||||||
|
// globals.SugarLogger.Debug(err.Error())
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// diff = true
|
||||||
|
// }
|
||||||
|
// if diff {
|
||||||
|
// if _, err := DeleteStoreCourierMap(ctx, db, StoreCourierList1.StoreID, StoreCourierList1.VendorID, ctx.GetUserName()); err != nil {
|
||||||
|
// globals.SugarLogger.Debug(err.Error())
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
// //break test
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//globals.SugarLogger.Debug("StoreOpenAll skuID is Complete")
|
||||||
|
}
|
||||||
|
|
||||||
|
//func StoreOpenAll(ctx *jxcontext.Context) {
|
||||||
|
//db := dao.GetDB()
|
||||||
|
///*获取所有门店信息*/
|
||||||
|
//StoreLists, err := dao.GetStoreList(db, nil, nil, []int{}, nil, "")
|
||||||
|
//if err != nil {
|
||||||
|
// globals.SugarLogger.Debugf("商店列表获取失败")
|
||||||
|
//}
|
||||||
|
///*距离结构体*/
|
||||||
|
//type Distance struct {
|
||||||
|
// StoreID string `json:"门店ID"`
|
||||||
|
// StoreStatus string `json:"门店状态"`
|
||||||
|
// StoreName string `json:"门店名"`
|
||||||
|
// Tel string `json:"电话"`
|
||||||
|
// City string `json:"城市"`
|
||||||
|
// Address string `json:"地址"`
|
||||||
|
// DistanceId string `json:"附近门店ID"`
|
||||||
|
// DistanceStatus string `json:"附近门店状态"`
|
||||||
|
// DistanceName string `json:"附近门店名"`
|
||||||
|
// DistanceAddress string `json:"附近门店地址"`
|
||||||
|
// DistanceValue string `json:"距离附近门店距离(m)"`
|
||||||
|
//}
|
||||||
|
//distanceStore := make(map[int][]Distance)
|
||||||
|
//var isCloud []string
|
||||||
|
//var CloudBool bool
|
||||||
|
//for _, StoreList := range StoreLists {
|
||||||
|
// /*循环内部声明,1对多*/
|
||||||
|
// var a []Distance
|
||||||
|
// lng := jxutils.IntCoordinate2Standard(StoreList.Lng)
|
||||||
|
// lat := jxutils.IntCoordinate2Standard(StoreList.Lat)
|
||||||
|
// for _, StoreList1 := range StoreLists {
|
||||||
|
// if StoreList1.ID == StoreList.ID {
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// /*把s与提前存好的字段对比,如果相同说明 A+B=B+A的情况,直接跳过*/
|
||||||
|
// s := strconv.Itoa(StoreList1.ID) + strconv.Itoa(StoreList.ID)
|
||||||
|
// for _, x := range isCloud {
|
||||||
|
// if s == x {
|
||||||
|
// CloudBool = true
|
||||||
|
// break
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if CloudBool == true{
|
||||||
|
// CloudBool = false
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// lng1 := jxutils.IntCoordinate2Standard(StoreList1.Lng)
|
||||||
|
// lat1 := jxutils.IntCoordinate2Standard(StoreList1.Lat)
|
||||||
|
// if jxutils.EarthDistance(lng, lat, lng1, lat1) < 0.5 {
|
||||||
|
// //门店ID,门店名,电话,城市,地址,附近门店ID,附近门店名,距离附近门店距离(m)
|
||||||
|
// b := &Distance{
|
||||||
|
// strconv.Itoa(StoreList.ID),
|
||||||
|
// strconv.Itoa(StoreList.Status),
|
||||||
|
// StoreList.Name,
|
||||||
|
// StoreList.Tel1,
|
||||||
|
// strconv.Itoa(StoreList.CityCode),
|
||||||
|
// StoreList.Address,
|
||||||
|
// strconv.Itoa(StoreList1.ID),
|
||||||
|
// strconv.Itoa(StoreList1.Status),
|
||||||
|
// StoreList1.Name,
|
||||||
|
// StoreList1.Address,
|
||||||
|
// fmt.Sprintf("%.2f", jxutils.EarthDistance(lng, lat, lng1, lat1)*1000),
|
||||||
|
// }
|
||||||
|
// a = append(a, *b)
|
||||||
|
// distanceStore[StoreList.ID] = a
|
||||||
|
// isCloud = append(isCloud, strconv.Itoa(StoreList.ID)+strconv.Itoa(StoreList1.ID))
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
////DistanceTitle := []string{
|
||||||
|
//// "门店ID",
|
||||||
|
//// "门店名",
|
||||||
|
//// "电话",
|
||||||
|
//// "城市",
|
||||||
|
//// "地址",
|
||||||
|
//// "附近门店ID",
|
||||||
|
//// "附近门店名",
|
||||||
|
//// "距离附近门店距离(m)",
|
||||||
|
////}
|
||||||
|
//fmt.Println(len(distanceStore))
|
||||||
|
//xlsx := excelize.NewFile()
|
||||||
|
//index := xlsx.NewSheet("Sheet1")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "A1", "门店ID")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "B1", "门店状态")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "C1", "门店名")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "D1", "电话")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "E1", "城市")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "F1", "地址")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "G1", "附近门店ID")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "H1", "附近门店状态")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "I1", "附近门店名")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "J1", "附近门店地址")
|
||||||
|
//xlsx.SetCellValue("Sheet1", "K1", "距离附近门店距离(M)")
|
||||||
|
//i := 2
|
||||||
|
//for _, value := range distanceStore {
|
||||||
|
// for _, value1 := range value {
|
||||||
|
// xlsx.SetCellValue("Sheet1", "A"+strconv.Itoa(i), value1.StoreID)
|
||||||
|
// xlsx.SetCellValue("Sheet1", "B"+strconv.Itoa(i), value1.StoreStatus)
|
||||||
|
// xlsx.SetCellValue("Sheet1", "C"+strconv.Itoa(i), value1.StoreName)
|
||||||
|
// xlsx.SetCellValue("Sheet1", "D"+strconv.Itoa(i), value1.Tel)
|
||||||
|
// xlsx.SetCellValue("Sheet1", "E"+strconv.Itoa(i), value1.City)
|
||||||
|
// xlsx.SetCellValue("Sheet1", "F"+strconv.Itoa(i), value1.Address)
|
||||||
|
// xlsx.SetCellValue("Sheet1", "G"+strconv.Itoa(i), value1.DistanceId)
|
||||||
|
// xlsx.SetCellValue("Sheet1", "H"+strconv.Itoa(i), value1.DistanceStatus)
|
||||||
|
// xlsx.SetCellValue("Sheet1", "I"+strconv.Itoa(i), value1.DistanceName)
|
||||||
|
// xlsx.SetCellValue("Sheet1", "J"+strconv.Itoa(i), value1.DistanceAddress)
|
||||||
|
// xlsx.SetCellValue("Sheet1", "K"+strconv.Itoa(i), value1.DistanceValue)
|
||||||
|
// i++
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//// Set active sheet of the workbook.
|
||||||
|
//xlsx.SetActiveSheet(index)
|
||||||
|
//// Save xlsx file by the given path.
|
||||||
|
//err = xlsx.SaveAs("C:\\Users\\86159\\Desktop\\WorkForTemp\\距离小于500米门店信息.xlsx")
|
||||||
|
//if err != nil {
|
||||||
|
// fmt.Println(err)
|
||||||
|
//}
|
||||||
|
//var sheetList []*excel.Obj2ExcelSheetConfig
|
||||||
|
//sheetName := "附近500米门店信息"
|
||||||
|
//for _, value := range distanceStore {
|
||||||
|
// excelConf := &excel.Obj2ExcelSheetConfig{
|
||||||
|
// Title: sheetName,
|
||||||
|
// Data: value,
|
||||||
|
// CaptionList: DistanceTitle,
|
||||||
|
// }
|
||||||
|
// file,err := os.OpenFile("C:\\Users\\86159\\Desktop\\WorkForTemp\\haha.txt",os.O_APPEND|os.O_RDWR,6660)
|
||||||
|
// if err != nil{
|
||||||
|
// fmt.Println(err.Error())
|
||||||
|
// }
|
||||||
|
// file.WriteString(fmt.Sprintln(excelConf.Data))
|
||||||
|
// sheetList = append(sheetList, excelConf)
|
||||||
|
// baseapi.SugarLogger.Debugf("WriteToExcel:append:%s count:%d", sheetName, len(value))
|
||||||
|
//}
|
||||||
|
//if len(sheetList) > 0 {
|
||||||
|
// excelBin := excel.Obj2Excel(sheetList)
|
||||||
|
// sheetList = nil
|
||||||
|
// timeStr := utils.Int64ToStr(time.Now().Unix())
|
||||||
|
// diffFullFileName := "附近500米门店信息数据" + timeStr + fileExt
|
||||||
|
// baseapi.SugarLogger.Debugf("WriteToExcel:save %s success", diffFullFileName)
|
||||||
|
// //上传
|
||||||
|
// downloadURL, err := jxutils.UploadExportContent(excelBin, diffFullFileName)
|
||||||
|
// if err != nil {
|
||||||
|
// baseapi.SugarLogger.Errorf("WriteToExcel:upload %s failed error:%v", diffFullFileName, err)
|
||||||
|
// } else {
|
||||||
|
// baseapi.SugarLogger.Debugf("WriteToExcel:upload %s success, downloadURL: %s", diffFullFileName, downloadURL)
|
||||||
|
// /*************发送钉钉消息**************/
|
||||||
|
// //ddmsg.SendUserMessage(dingdingapi.MsgTyeText, "", "异步任务完成", "附近500米门店信息数据上传成功:Excel下载地址是 "+downloadURL)
|
||||||
|
// }
|
||||||
|
//} else {
|
||||||
|
// baseapi.SugarLogger.Debug("WriteToExcel:No diff data!!!")
|
||||||
|
//}
|
||||||
|
//}
|
||||||
|
|
||||||
|
//func StoreOpenAll(ctx *jxcontext.Context) {
|
||||||
|
// db := dao.GetDB()
|
||||||
|
// StoreLists, err := dao.GetStoreList(db, nil, nil, []int{1}, nil, "")
|
||||||
|
// if err != nil {
|
||||||
|
// globals.SugarLogger.Debugf("商店列表获取失败")
|
||||||
|
// }
|
||||||
|
// var StoreMapLists []*model.StoreMap
|
||||||
|
// for _, StoreList := range StoreLists {
|
||||||
|
// if StoreList.StoreLevel == "E" {
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
// if StoreMapLists, err = dao.GetStoresMapList(db, []int{0, 1, 3}, []int{StoreList.ID}, nil, 1, -1, "", ""); err != nil {
|
||||||
|
// globals.SugarLogger.Debugf("商店列表获取失败")
|
||||||
|
// }
|
||||||
|
// if len(StoreMapLists) > 0 {
|
||||||
|
// /*将map查询的结果全部放进数组*/
|
||||||
|
// for _, StoreMapList := range StoreMapLists {
|
||||||
|
// /*二元运算符*/
|
||||||
|
// StoreMapList.SyncStatus = StoreMapList.SyncStatus | model.SyncFlagModifiedMask
|
||||||
|
// StoreMapList.UpdatedAt = time.Now()
|
||||||
|
// StoreMapList.LastOperator = ctx.GetUserName()
|
||||||
|
// dao.UpdateEntity(db, StoreMapList, "SyncStatus", "UpdatedAt", "LastOperator")
|
||||||
|
// //}
|
||||||
|
// /*同步*/
|
||||||
|
// if _, err = CurVendorSync.SyncStore(ctx, db, StoreMapList.VendorID, StoreList.ID, false, ctx.GetUserName()); err != nil {
|
||||||
|
// globals.SugarLogger.Debugf("同步失败")
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if StoreMapLists, err = dao.GetStoresMapList(db, []int{9}, []int{StoreList.ID}, nil, 1, -1, "", ""); err != nil {
|
||||||
|
// globals.SugarLogger.Debugf("商店列表获取失败")
|
||||||
|
// }
|
||||||
|
// if len(StoreMapLists) == 0 {
|
||||||
|
// /*遍历,绑定*/
|
||||||
|
// Map := &model.StoreMap{}
|
||||||
|
// Map.VendorStoreID = strconv.Itoa(StoreList.ID)
|
||||||
|
// Map.AutoPickup = 1
|
||||||
|
// Map.DeliveryCompetition = 1
|
||||||
|
// Map.PricePercentage = 100
|
||||||
|
// Map.IsSync = 1
|
||||||
|
// Map.PricePercentagePack = "京西100-100"
|
||||||
|
// Map.DeliveryFeeDeductionSill = 0
|
||||||
|
// Map.DeliveryFeeDeductionFee = 0
|
||||||
|
// Map.IsOrder = 0
|
||||||
|
// if _, err := AddStoreVendorMap(ctx, db, 9, "", StoreList.ID, Map); err != nil {
|
||||||
|
// globals.SugarLogger.Debugf("AddStoreVendorMap调用出错,StoreID是" + strconv.Itoa(StoreList.ID))
|
||||||
|
// globals.SugarLogger.Debugf(err.Error())
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// /*改配送范围*/
|
||||||
|
// //deliverrangetype 3
|
||||||
|
// //deliverrange 3000
|
||||||
|
// StoreList.DeliveryRange = "3000"
|
||||||
|
// StoreList.DeliveryRangeType = 3
|
||||||
|
// StoreList.UpdatedAt = time.Now()
|
||||||
|
// StoreList.LastOperator = ctx.GetUserName()
|
||||||
|
// dao.UpdateEntity(db, StoreList, "DeliveryRange", "DeliveryRangeType", "LastOperator", "UpdatedAt")
|
||||||
|
// }
|
||||||
|
// globals.SugarLogger.Debug("StoreOpenAll skuID is Complete")
|
||||||
|
//}
|
||||||
|
|
||||||
|
func TestDiff(ctx *jxcontext.Context, vendorIDList []int, storeIDList []int) {
|
||||||
|
baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor start time: %v", time.Now())
|
||||||
|
startProcessTime := time.Now().Unix()
|
||||||
|
vendorMap := make(map[int]bool)
|
||||||
|
for _, vendorID := range vendorIDList {
|
||||||
|
vendorMap[vendorID] = true //map[平台ID:true]
|
||||||
|
}
|
||||||
|
storeIDMap := make(map[int]bool)
|
||||||
|
for _, storeID := range storeIDList {
|
||||||
|
storeIDMap[storeID] = true //map[门店ID:true]
|
||||||
|
}
|
||||||
|
/************************************************update**************************************************/
|
||||||
|
//自己存值
|
||||||
|
a := func() {
|
||||||
|
for vendorID, _ := range vendorNameList {
|
||||||
|
//filter for vendorID
|
||||||
|
if len(vendorMap) > 0 {
|
||||||
|
if _, ok := vendorMap[vendorID]; !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if partner.IsMultiStore(vendorID) {
|
||||||
|
multiHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler)
|
||||||
|
for _, vendorOrgCode := range apimanager.CurAPIManager.GetAppOrgCodeList(vendorID) {
|
||||||
|
allSkuNameInfoList, err := multiHandler.GetSkus(ctx, vendorOrgCode, 0, "")
|
||||||
|
//获取单个表格对比的物品信息列表
|
||||||
|
skuNameInfoList = allSkuNameInfoList
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("allSkuNameInfoList赋值错误,error信息" + err.Error())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
//*partner.StoreSkuInfo skuNameList []*SkuNameInfo
|
||||||
|
var bareStoreSkuList []*partner.StoreSkuInfo
|
||||||
|
for _, v := range allSkuNameInfoList {
|
||||||
|
for _, v2 := range v.SkuList {
|
||||||
|
if v2.Status > model.SkuStatusDontSale {
|
||||||
|
for _, v2 := range v.SkuList {
|
||||||
|
bareStoreSkuList = append(bareStoreSkuList, &v2.StoreSkuInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//if multiStoreAllSkuInfoList[vendorID][vendorOrgCode] != nil && bareStoreSkuList != nil {
|
||||||
|
if multiStoreAllSkuInfoList[vendorID] != nil && bareStoreSkuList != nil {
|
||||||
|
multiStoreAllSkuInfoList[vendorID][vendorOrgCode] = bareStoreSkuList
|
||||||
|
//}else if multiStoreAllSkuInfoList[vendorID][vendorOrgCode] == nil{
|
||||||
|
} else if multiStoreAllSkuInfoList[vendorID] == nil {
|
||||||
|
multiStoreAllSkuInfoList = make(map[int]map[string][]*partner.StoreSkuInfo)
|
||||||
|
multiStoreAllSkuInfoList[vendorID] = make(map[string][]*partner.StoreSkuInfo)
|
||||||
|
multiStoreAllSkuInfoList[vendorID][vendorOrgCode] = bareStoreSkuList
|
||||||
|
}
|
||||||
|
tempMap := make(map[int]*partner.SkuNameInfo)
|
||||||
|
for _, value := range allSkuNameInfoList {
|
||||||
|
for _, skuInfo := range value.SkuList {
|
||||||
|
//表示平台商品库未下架的
|
||||||
|
if skuInfo.Status > model.SkuStatusDontSale {
|
||||||
|
filterVendorDepotUnSaleSkuIds = append(filterVendorDepotUnSaleSkuIds, skuInfo.SkuID)
|
||||||
|
tempMap[skuInfo.SkuID] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//商品信息
|
||||||
|
if multiStoreAllSkuInfoMap[vendorID] == nil {
|
||||||
|
multiStoreAllSkuInfoMap = make(map[int]map[string]map[int]*partner.SkuNameInfo)
|
||||||
|
multiStoreAllSkuInfoMap[vendorID] = make(map[string]map[int]*partner.SkuNameInfo)
|
||||||
|
//multiStoreAllSkuInfoMap[vendorID][vendorOrgCode] = make(map[int]*partner.SkuNameInfo)
|
||||||
|
multiStoreAllSkuInfoMap[vendorID][vendorOrgCode] = tempMap
|
||||||
|
} else {
|
||||||
|
multiStoreAllSkuInfoMap[vendorID][vendorOrgCode] = tempMap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/************************************************update****************************************************/
|
||||||
|
//1.获取京西本地所有门店信息 store、place、user表联查 jxStoreInfoList
|
||||||
|
//2.过滤所有门店信息,只留下传进来的vendorMap,storeIDMap中对应的平台和门台信息 filterStoreList
|
||||||
|
//3.判断是否多平台门店,两种情况两种处理
|
||||||
|
b := func() {
|
||||||
|
jxStoreInfoList, err := GetStores(ctx, "", map[string]interface{}{}, 0, -1, utils.DefaultTimeValue, utils.DefaultTimeValue, 0, 0)
|
||||||
|
if err != nil {
|
||||||
|
baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStores error:%v", err)
|
||||||
|
} else {
|
||||||
|
//获取总共几个门店任务
|
||||||
|
filterStoreList := GetFilterStoreList(jxStoreInfoList.Stores, vendorMap, storeIDMap)
|
||||||
|
diffData.InitData()
|
||||||
|
for i := range filterStoreList {
|
||||||
|
jxStoreInfoListValue := filterStoreList[i]
|
||||||
|
storeID := jxStoreInfoListValue.ID
|
||||||
|
storeIDStr := utils.Int2Str(storeID)
|
||||||
|
storeName := jxStoreInfoListValue.Name
|
||||||
|
jxSkuInfoDataSingle := &dao.StoreSkuNamesInfo{}
|
||||||
|
jxSkuInfoDataMulti := &dao.StoreSkuNamesInfo{}
|
||||||
|
if jxStoreInfoListValue.StoreMaps != nil {
|
||||||
|
var multiFlag = false
|
||||||
|
var singleFlag = false
|
||||||
|
var filterJxSkuInfoMapSingle map[int]*dao.StoreSkuNameExt
|
||||||
|
var filterJxSkuInfoMapMulti map[int]*dao.StoreSkuNameExt
|
||||||
|
for _, vendorListValue := range jxStoreInfoListValue.StoreMaps {
|
||||||
|
vendorID := vendorListValue.VendorID
|
||||||
|
if partner.IsMultiStore(vendorID) {
|
||||||
|
if multiFlag == false {
|
||||||
|
jxSkuInfoDataMulti, _ = GetStoreSkus(ctx, storeID, filterJxDepotUnSaleSkuIds, true, "", true, false, map[string]interface{}{}, 0, -1)
|
||||||
|
/*重新计算价格*/
|
||||||
|
SetJxPrice(jxSkuInfoDataMulti, storeID, vendorID)
|
||||||
|
filterJxSkuInfoMapMulti = GetFilterJxSkuInfoMap(jxSkuInfoDataMulti.SkuNames) //map[京西商品ID:StoreSkuNameExt]
|
||||||
|
multiFlag = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if singleFlag == false {
|
||||||
|
jxSkuInfoDataSingle, _ = GetStoreSkus(ctx, storeID, nil, true, "", true, false, map[string]interface{}{}, 0, -1)
|
||||||
|
/*重新计算价格*/
|
||||||
|
SetJxPrice(jxSkuInfoDataSingle, storeID, vendorID)
|
||||||
|
filterJxSkuInfoMapSingle = GetFilterJxSkuInfoMap(jxSkuInfoDataSingle.SkuNames) //map[京西商品ID:StoreSkuNameExt]
|
||||||
|
singleFlag = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vendorStoreID := vendorListValue.VendorStoreID
|
||||||
|
baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor storeID:%d vendorID:%d vendorStoreID:%s vendorListValue:%v", storeID, vendorID, vendorStoreID, vendorListValue)
|
||||||
|
|
||||||
|
if partner.IsMultiStore(vendorID) {
|
||||||
|
singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler)
|
||||||
|
allSkuInfoList := GetMultiStoreAllSkuInfoList(vendorID, vendorListValue.VendorOrgCode)
|
||||||
|
skuBareInfoList, err := singleStoreHandler.GetStoreSkusBareInfo(ctx, vendorListValue.VendorOrgCode, nil, storeID, vendorStoreID, allSkuInfoList)
|
||||||
|
if err != nil {
|
||||||
|
baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err)
|
||||||
|
} else if len(skuBareInfoList) > 0 {
|
||||||
|
//获取京东的商品
|
||||||
|
filterSkuInfoMap := GetFilterMultiStoreSkuInfoMap(vendorID, vendorListValue.VendorOrgCode, skuBareInfoList) //map[京东商品ID:SkuNameInfo]
|
||||||
|
CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMapMulti, filterSkuInfoMap, 1)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
||||||
|
vendorSkuInfoList, err := singleStoreHandler.GetStoreSkusFullInfo(ctx, nil, storeID, vendorStoreID, nil)
|
||||||
|
if err != nil {
|
||||||
|
baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err)
|
||||||
|
} else if len(vendorSkuInfoList) > 0 {
|
||||||
|
//获取京东的商品
|
||||||
|
filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(vendorSkuInfoList) //map[平台商品ID:SkuNameInfo]
|
||||||
|
CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMapSingle, filterVendorSkuInfoMap, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/********************************第三步****************************/
|
||||||
|
c := func(data map[int][]DiffData, depotData map[int][]DepotDiffData) {
|
||||||
|
var sheetList []*excel.Obj2ExcelSheetConfig
|
||||||
|
for key, value := range data {
|
||||||
|
sheetName := vendorNameList[key]
|
||||||
|
if partner.IsMultiStore(key) {
|
||||||
|
excelConfDepot := &excel.Obj2ExcelSheetConfig{
|
||||||
|
Title: sheetName + "商品库与京西商品库对比",
|
||||||
|
Data: depotData[key],
|
||||||
|
CaptionList: deoptTitleList,
|
||||||
|
}
|
||||||
|
sheetList = append(sheetList, excelConfDepot)
|
||||||
|
}
|
||||||
|
excelConf := &excel.Obj2ExcelSheetConfig{
|
||||||
|
Title: sheetName,
|
||||||
|
Data: value,
|
||||||
|
CaptionList: titleList,
|
||||||
|
}
|
||||||
|
sheetList = append(sheetList, excelConf)
|
||||||
|
if needStatistic {
|
||||||
|
statisticSheet := AddStatisticSheet(sheetName, value)
|
||||||
|
sheetList = append(sheetList, statisticSheet)
|
||||||
|
}
|
||||||
|
baseapi.SugarLogger.Debugf("WriteToExcel:append:%s count:%d", sheetName, len(value))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(sheetList) > 0 {
|
||||||
|
excelBin := excel.Obj2Excel(sheetList)
|
||||||
|
sheetList = nil
|
||||||
|
timeStr := utils.Int64ToStr(time.Now().Unix())
|
||||||
|
diffFullFileName := diffFileName[IsJXCS()] + timeStr + fileExt
|
||||||
|
if canWriteTolocal {
|
||||||
|
jxutils.WriteFile(diffFullFileName, excelBin)
|
||||||
|
}
|
||||||
|
baseapi.SugarLogger.Debugf("WriteToExcel:save %s success", diffFullFileName)
|
||||||
|
//上传
|
||||||
|
downloadURL, err := jxutils.UploadExportContent(excelBin, diffFullFileName)
|
||||||
|
if err != nil {
|
||||||
|
baseapi.SugarLogger.Errorf("WriteToExcel:upload %s failed error:%v", diffFullFileName, err)
|
||||||
|
} else {
|
||||||
|
baseapi.SugarLogger.Debugf("WriteToExcel:upload %s success, downloadURL: %s", diffFullFileName, downloadURL)
|
||||||
|
/*************发送钉钉消息**************/
|
||||||
|
ddmsg.SendUserMessage(dingdingapi.MsgTyeText, ctx.GetUserID(), "异步任务完成", "京西平台对比数据上传成功:Excel下载地址是 "+downloadURL)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
baseapi.SugarLogger.Debug("WriteToExcel:No diff data!!!")
|
||||||
|
}
|
||||||
|
//}
|
||||||
|
endProcessTime := time.Now().Unix()
|
||||||
|
diff := endProcessTime - startProcessTime
|
||||||
|
baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor end time: %v", time.Now())
|
||||||
|
baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor cost time: %d sec", diff)
|
||||||
|
}
|
||||||
|
apiover := make(chan int, 1)
|
||||||
|
compover := make(chan int, 1)
|
||||||
|
over := false
|
||||||
|
/********************************第三步****************************/
|
||||||
|
/*异步任务*/
|
||||||
|
/************************************************************************************/
|
||||||
|
go func() {
|
||||||
|
defer func() {
|
||||||
|
if recover() != nil {
|
||||||
|
beego.Info("执行任务失败")
|
||||||
|
panic("API调用失败")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
a()
|
||||||
|
depotDiffData.InitData2()
|
||||||
|
CompareJxAndMultiVenderDepot(ctx, vendorMap)
|
||||||
|
apiover <- 0
|
||||||
|
}()
|
||||||
|
/*a等待a现成执行完*/
|
||||||
|
go func() {
|
||||||
|
for !over {
|
||||||
|
select {
|
||||||
|
case <-apiover:
|
||||||
|
/*第二步 为了获取 filterJxDepotUnSaleSkuIds*/
|
||||||
|
go func() {
|
||||||
|
defer func() {
|
||||||
|
if recover() != nil {
|
||||||
|
beego.Info("比较任务失败")
|
||||||
|
panic("比较任务失败")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
b()
|
||||||
|
compover <- 0 //比较任务完成
|
||||||
|
}()
|
||||||
|
/*第二步*/
|
||||||
|
case <-compover:
|
||||||
|
go func() {
|
||||||
|
defer func() {
|
||||||
|
if recover() != nil {
|
||||||
|
beego.Info("写入任务失败")
|
||||||
|
panic("写入任务失败")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
c(diffData.diffDataMap, depotDiffData.diffDataMap)
|
||||||
|
fmt.Println("任务执行完成")
|
||||||
|
over = true
|
||||||
|
}()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
/************************************************************************************/
|
||||||
|
}
|
||||||
|
|
||||||
//入口函数,校验本地商品京西和其他平台的差异
|
//入口函数,校验本地商品京西和其他平台的差异
|
||||||
func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, storeIDList []int) {
|
func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, storeIDList []int) {
|
||||||
startProcessTime := time.Now().Unix()
|
startProcessTime := time.Now().Unix()
|
||||||
@@ -588,7 +1190,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int,
|
|||||||
baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err)
|
baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err)
|
||||||
} else if len(skuBareInfoList) > 0 {
|
} else if len(skuBareInfoList) > 0 {
|
||||||
filterSkuInfoMap := GetFilterMultiStoreSkuInfoMap(vendorID, vendorListValue.VendorOrgCode, skuBareInfoList) //map[京东商品ID:SkuNameInfo]
|
filterSkuInfoMap := GetFilterMultiStoreSkuInfoMap(vendorID, vendorListValue.VendorOrgCode, skuBareInfoList) //map[京东商品ID:SkuNameInfo]
|
||||||
CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMapMulti, filterSkuInfoMap)
|
CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMapMulti, filterSkuInfoMap, 1)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
||||||
@@ -597,7 +1199,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int,
|
|||||||
baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err)
|
baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err)
|
||||||
} else if len(vendorSkuInfoList) > 0 {
|
} else if len(vendorSkuInfoList) > 0 {
|
||||||
filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(vendorSkuInfoList) //map[平台商品ID:SkuNameInfo]
|
filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(vendorSkuInfoList) //map[平台商品ID:SkuNameInfo]
|
||||||
CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMapSingle, filterVendorSkuInfoMap)
|
CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMapSingle, filterVendorSkuInfoMap, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -719,6 +1321,7 @@ func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData, depotData map[
|
|||||||
jxutils.WriteFile(diffFullFileName, excelBin)
|
jxutils.WriteFile(diffFullFileName, excelBin)
|
||||||
}
|
}
|
||||||
baseapi.SugarLogger.Debugf("WriteToExcel:save %s success", diffFullFileName)
|
baseapi.SugarLogger.Debugf("WriteToExcel:save %s success", diffFullFileName)
|
||||||
|
//上传
|
||||||
downloadURL, err := jxutils.UploadExportContent(excelBin, diffFullFileName)
|
downloadURL, err := jxutils.UploadExportContent(excelBin, diffFullFileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
baseapi.SugarLogger.Errorf("WriteToExcel:upload %s failed error:%v", diffFullFileName, err)
|
baseapi.SugarLogger.Errorf("WriteToExcel:upload %s failed error:%v", diffFullFileName, err)
|
||||||
@@ -731,3 +1334,20 @@ func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData, depotData map[
|
|||||||
baseapi.SugarLogger.Debug("WriteToExcel:No diff data!!!")
|
baseapi.SugarLogger.Debug("WriteToExcel:No diff data!!!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetJxPrice(jxSkuInfoDataMulti *dao.StoreSkuNamesInfo, storeId int, vendorid int) (err error) {
|
||||||
|
db := dao.GetDB()
|
||||||
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), storeId, vendorid, "")
|
||||||
|
if err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
/*重新计算京西价格*/
|
||||||
|
for _, values := range jxSkuInfoDataMulti.SkuNames {
|
||||||
|
for _, value := range values.Skus {
|
||||||
|
value.JxPrice = jxutils.CaculatePriceByPricePack(storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage), value.BindPrice)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*重新计算京西价格*/
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
package cms
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestCheckSkuDiffBetweenJxAndVendor(t *testing.T) {
|
|
||||||
vendorIDList := []int{}
|
|
||||||
storeIDList := []int{}
|
|
||||||
CheckSkuDiffBetweenJxAndVendor(jxcontext.AdminCtx, vendorIDList, storeIDList)
|
|
||||||
}
|
|
||||||
@@ -25,7 +25,7 @@ func (s *StoreManager) OnStoreStatusChanged(vendorStoreID string, vendorID int,
|
|||||||
return err
|
return err
|
||||||
globals.SugarLogger.Debugf("OnStoreStatusChanged venvendorStoreID:%s, storeStatus:%d", vendorStoreID, storeStatus)
|
globals.SugarLogger.Debugf("OnStoreStatusChanged venvendorStoreID:%s, storeStatus:%d", vendorStoreID, storeStatus)
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, vendorStoreID, vendorID)
|
storeDetail, err := dao.GetStoreDetailByVendorStoreID(db, vendorStoreID, vendorID, "")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
var storeKV, storeMapKV map[string]interface{}
|
var storeKV, storeMapKV map[string]interface{}
|
||||||
if storeStatus == model.StoreStatusOpened {
|
if storeStatus == model.StoreStatusOpened {
|
||||||
@@ -102,18 +102,23 @@ func (s *StoreManager) OnStoreStatusChanged(vendorStoreID string, vendorID int,
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StoreManager) OnCourierStoreStatusChanged(ctx *jxcontext.Context, vendorStoreID string, vendorID int, auditStatus int) (err error) {
|
func (s *StoreManager) OnCourierStoreStatusChanged(ctx *jxcontext.Context, vendorStoreID string, vendorID int, auditStatus int, message string) (err error) {
|
||||||
if vendorStoreID != "" {
|
if vendorStoreID != "" {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
_, err2 := dao.GetStoreDetail2(db, 0, vendorStoreID, vendorID)
|
_, err2 := dao.GetStoreDetail2(db, 0, vendorStoreID, vendorID)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
status := model.StoreStatusOpened
|
status := model.StoreStatusOpened
|
||||||
if auditStatus != model.StoreAuditStatusOnline {
|
if auditStatus != model.StoreAuditStatusOnline && auditStatus != model.StoreAuditStatusUpdated {
|
||||||
status = model.StoreStatusDisabled
|
status = model.StoreStatusDisabled
|
||||||
}
|
}
|
||||||
|
comment := ""
|
||||||
|
if auditStatus == model.StoreAuditStatusRejected {
|
||||||
|
comment = message
|
||||||
|
}
|
||||||
_, err = dao.UpdateEntityLogically(db, &model.StoreCourierMap{}, map[string]interface{}{
|
_, err = dao.UpdateEntityLogically(db, &model.StoreCourierMap{}, map[string]interface{}{
|
||||||
model.FieldStatus: status,
|
model.FieldStatus: status,
|
||||||
"AuditStatus": auditStatus,
|
"AuditStatus": auditStatus,
|
||||||
|
"Comment": comment,
|
||||||
}, ctx.GetUserName(), map[string]interface{}{
|
}, ctx.GetUserName(), map[string]interface{}{
|
||||||
model.FieldVendorStoreID: vendorStoreID,
|
model.FieldVendorStoreID: vendorStoreID,
|
||||||
model.FieldVendorID: vendorID,
|
model.FieldVendorID: vendorID,
|
||||||
|
|||||||
@@ -3,10 +3,16 @@ package cms
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/putils"
|
"git.rosy.net.cn/jx-callback/business/partner/putils"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi"
|
"git.rosy.net.cn/baseapi"
|
||||||
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
|
"git.rosy.net.cn/baseapi/platformapi/dingdingapi"
|
||||||
@@ -240,7 +246,7 @@ func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs
|
|||||||
db2 = dao.GetDB()
|
db2 = dao.GetDB()
|
||||||
}
|
}
|
||||||
if model.IsSyncStatusNew(storeMap.SyncStatus) {
|
if model.IsSyncStatusNew(storeMap.SyncStatus) {
|
||||||
if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName); err == nil {
|
if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName, nil, nil); err == nil {
|
||||||
resultList = append(resultList, 1)
|
resultList = append(resultList, 1)
|
||||||
} else {
|
} else {
|
||||||
failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店")
|
failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店")
|
||||||
@@ -278,7 +284,7 @@ func (v *VendorSync) SyncStore2(ctx *jxcontext.Context, db *dao.DaoDB, vendorIDs
|
|||||||
var vendorStoreID string
|
var vendorStoreID string
|
||||||
storeMap := loopMapInfo.StoreMapList[0]
|
storeMap := loopMapInfo.StoreMapList[0]
|
||||||
if model.IsSyncStatusNew(storeMap.SyncStatus) {
|
if model.IsSyncStatusNew(storeMap.SyncStatus) {
|
||||||
if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName); err == nil {
|
if vendorStoreID, err = handler.CreateStore2(db2, storeMap.StoreID, userName, nil, nil); err == nil {
|
||||||
resultList = append(resultList, 1)
|
resultList = append(resultList, 1)
|
||||||
} else {
|
} else {
|
||||||
failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店")
|
failedList = putils.GetErrMsg2FailedSingleList(nil, err, storeMap.StoreID, model.VendorChineseNames[storeMap.VendorID], "创建门店")
|
||||||
@@ -494,7 +500,7 @@ func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, parentTask tasksch.
|
|||||||
if setSyncStatus != 0 {
|
if setSyncStatus != 0 {
|
||||||
dao.SetStoreSkuSyncStatus(db, storeMap.VendorID, []int{storeMap.StoreID}, skuIDs, setSyncStatus)
|
dao.SetStoreSkuSyncStatus(db, storeMap.VendorID, []int{storeMap.StoreID}, skuIDs, setSyncStatus)
|
||||||
}
|
}
|
||||||
if _, err = SyncStoreSkuNew(ctx, task, causeFlag, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, nil, skuIDs, excludeSkuIDs, false, isContinueWhenError); err != nil {
|
if _, err = SyncStoreSkuNew(ctx, task, causeFlag, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, storeMap.VendorOrgCode, nil, skuIDs, excludeSkuIDs, false, isContinueWhenError); err != nil {
|
||||||
globals.SugarLogger.Debugf("SyncStoresSkus2 failed2 store:%d failed with error:%v", storeMap.StoreID, err)
|
globals.SugarLogger.Debugf("SyncStoresSkus2 failed2 store:%d failed with error:%v", storeMap.StoreID, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -516,6 +522,25 @@ func (v *VendorSync) SyncStoresSkus(ctx *jxcontext.Context, parentTask tasksch.I
|
|||||||
if isForce {
|
if isForce {
|
||||||
setSyncStatus = model.SyncFlagStoreSkuModifiedMask
|
setSyncStatus = model.SyncFlagStoreSkuModifiedMask
|
||||||
}
|
}
|
||||||
|
//权限
|
||||||
|
if permission.IsRoled(ctx) {
|
||||||
|
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
|
||||||
|
var storeIDs2 []int
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
for _, v := range storeIDs {
|
||||||
|
if storeIDsMap[v] != 0 {
|
||||||
|
storeIDs2 = append(storeIDs2, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for k, _ := range storeIDsMap {
|
||||||
|
storeIDs2 = append(storeIDs2, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
storeIDs = nil
|
||||||
|
storeIDs = storeIDs2
|
||||||
|
}
|
||||||
|
}
|
||||||
return v.SyncStoresSkus2(ctx, parentTask, causeFlag, db, vendorIDs, storeIDs, true, skuIDs, nil, setSyncStatus, isAsync, isContinueWhenError)
|
return v.SyncStoresSkus2(ctx, parentTask, causeFlag, db, vendorIDs, storeIDs, true, skuIDs, nil, setSyncStatus, isAsync, isContinueWhenError)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -645,7 +670,7 @@ func (v *VendorSync) AmendAndPruneStoreStuff(ctx *jxcontext.Context, vendorIDs [
|
|||||||
|
|
||||||
func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, parentTask tasksch.ITask, db *dao.DaoDB, taskName string, isAsync, isManageIt bool, vendorIDs []int, storeIDs []int, mustDirty bool, handler tasksch.WorkFunc, isContinueWhenError bool) (task tasksch.ITask, hint string, err error) {
|
func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, parentTask tasksch.ITask, db *dao.DaoDB, taskName string, isAsync, isManageIt bool, vendorIDs []int, storeIDs []int, mustDirty bool, handler tasksch.WorkFunc, isContinueWhenError bool) (task tasksch.ITask, hint string, err error) {
|
||||||
var storeMapList []*model.StoreMap
|
var storeMapList []*model.StoreMap
|
||||||
if storeMapList, err = dao.GetStoresMapList2(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", mustDirty); err != nil {
|
if storeMapList, err = dao.GetStoresMapList2(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "", mustDirty); err != nil {
|
||||||
return nil, "", err
|
return nil, "", err
|
||||||
}
|
}
|
||||||
if len(storeMapList) == 0 {
|
if len(storeMapList) == 0 {
|
||||||
@@ -677,6 +702,7 @@ func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, parentTask tasksch.I
|
|||||||
resultList, err2 := task.GetResult(0)
|
resultList, err2 := task.GetResult(0)
|
||||||
if len(task.GetFailedList()) > 0 {
|
if len(task.GetFailedList()) > 0 {
|
||||||
err2 = buildErrMsg(task)
|
err2 = buildErrMsg(task)
|
||||||
|
err = err2
|
||||||
}
|
}
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
if len(resultList) == 0 {
|
if len(resultList) == 0 {
|
||||||
@@ -711,6 +737,7 @@ func buildSetFinishHook(task tasksch.ITask, ctx *jxcontext.Context) {
|
|||||||
globals.SugarLogger.Debugf("同步错误发送钉钉消息失败, authinfo [%v] , [%v]", *authInfo, err)
|
globals.SugarLogger.Debugf("同步错误发送钉钉消息失败, authinfo [%v] , [%v]", *authInfo, err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if len(task.GetFailedList()) > 1 {
|
||||||
if time.Now().Hour() >= 20 || time.Now().Hour() < 7 {
|
if time.Now().Hour() >= 20 || time.Now().Hour() < 7 {
|
||||||
downloadURL, _, _ := WirteToExcelBySyncFailed(task)
|
downloadURL, _, _ := WirteToExcelBySyncFailed(task)
|
||||||
user, err := dao.GetUserByID(dao.GetDB(), "mobile", "18160030913")
|
user, err := dao.GetUserByID(dao.GetDB(), "mobile", "18160030913")
|
||||||
@@ -720,6 +747,7 @@ func buildSetFinishHook(task tasksch.ITask, ctx *jxcontext.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -952,8 +980,8 @@ func syncStoreSkusFromYb(ctx *jxcontext.Context, storeID, vendorID int, vendorSt
|
|||||||
db = dao.GetDB()
|
db = dao.GetDB()
|
||||||
localSkuMap = make(map[string]*dao.StoreSkuSyncInfo)
|
localSkuMap = make(map[string]*dao.StoreSkuSyncInfo)
|
||||||
vendorSkuMap = make(map[string]*partner.SkuNameInfo)
|
vendorSkuMap = make(map[string]*partner.SkuNameInfo)
|
||||||
skuBindInfosDel []*StoreSkuBindInfo
|
// skuBindInfosDel []*StoreSkuBindInfo
|
||||||
skuBindInfosUpt []*StoreSkuBindInfo
|
// skuBindInfosUpt []*StoreSkuBindInfo
|
||||||
addList []*partner.SkuNameInfo
|
addList []*partner.SkuNameInfo
|
||||||
updateList []*partner.SkuNameInfo
|
updateList []*partner.SkuNameInfo
|
||||||
deleteList []*dao.StoreSkuSyncInfo
|
deleteList []*dao.StoreSkuSyncInfo
|
||||||
@@ -986,101 +1014,102 @@ func syncStoreSkusFromYb(ctx *jxcontext.Context, storeID, vendorID int, vendorSt
|
|||||||
deleteList = append(deleteList, v)
|
deleteList = append(deleteList, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// fmt.Println("remoteSkuList", len(remoteSkuList))
|
fmt.Println("remoteSkuList", len(remoteSkuList))
|
||||||
// fmt.Println("addList", len(addList))
|
fmt.Println("addList", len(addList))
|
||||||
// fmt.Println("updateList", len(updateList))
|
fmt.Println("updateList", utils.Format4Output(updateList, false))
|
||||||
taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
fmt.Println("deleteList", utils.Format4Output(deleteList, false))
|
||||||
store, _ := dao.GetStoreDetail(db, storeID, vendorID)
|
// taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||||
switch step {
|
// store, _ := dao.GetStoreDetail(db, storeID, vendorID)
|
||||||
case 0:
|
// switch step {
|
||||||
if len(addList) > 0 {
|
// case 0:
|
||||||
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
// if len(addList) > 0 {
|
||||||
var (
|
// taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
v = batchItemList[0].(*partner.SkuNameInfo)
|
// var (
|
||||||
upc = v.YbBarCode
|
// v = batchItemList[0].(*partner.SkuNameInfo)
|
||||||
)
|
// upc = v.YbBarCode
|
||||||
err = AddSkuNameByUpc(ctx, upc, store, v)
|
// )
|
||||||
if err != nil {
|
// err = AddSkuNameByUpc(ctx, upc, store, v)
|
||||||
task.AddFailedList(putils.GetErrMsg2FailedSingleList(nil, err, storeID, model.VendorChineseNames[vendorID], "根据upc创建京西商品"))
|
// if err != nil {
|
||||||
}
|
// task.AddFailedList(putils.GetErrMsg2FailedSingleList(nil, err, storeID, model.VendorChineseNames[vendorID], "根据upc创建京西商品"))
|
||||||
return retVal, err
|
// }
|
||||||
}
|
// return retVal, err
|
||||||
taskParallel := tasksch.NewParallelTask("创建商品", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, taskFunc, addList)
|
// }
|
||||||
tasksch.HandleTask(taskParallel, task, true).Run()
|
// taskParallel := tasksch.NewParallelTask("创建商品", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, taskFunc, addList)
|
||||||
_, err = taskParallel.GetResult(0)
|
// tasksch.HandleTask(taskParallel, task, true).Run()
|
||||||
}
|
// _, err = taskParallel.GetResult(0)
|
||||||
case 1:
|
// }
|
||||||
if len(deleteList) > 0 {
|
// case 1:
|
||||||
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
// if len(deleteList) > 0 {
|
||||||
var (
|
// taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
v = batchItemList[0].(*dao.StoreSkuSyncInfo)
|
// var (
|
||||||
)
|
// v = batchItemList[0].(*dao.StoreSkuSyncInfo)
|
||||||
skuBindInfo := &StoreSkuBindInfo{
|
// )
|
||||||
NameID: v.NameID,
|
// skuBindInfo := &StoreSkuBindInfo{
|
||||||
IsFocus: -1,
|
// NameID: v.NameID,
|
||||||
}
|
// IsFocus: -1,
|
||||||
retVal = []*StoreSkuBindInfo{skuBindInfo}
|
// }
|
||||||
return retVal, err
|
// retVal = []*StoreSkuBindInfo{skuBindInfo}
|
||||||
}
|
// return retVal, err
|
||||||
taskParallel := tasksch.NewParallelTask("删除商品", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, taskFunc, deleteList)
|
// }
|
||||||
tasksch.HandleTask(taskParallel, task, true).Run()
|
// taskParallel := tasksch.NewParallelTask("删除商品", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, taskFunc, deleteList)
|
||||||
resultDel, _ := taskParallel.GetResult(0)
|
// tasksch.HandleTask(taskParallel, task, true).Run()
|
||||||
for _, v := range resultDel {
|
// resultDel, _ := taskParallel.GetResult(0)
|
||||||
skuBindInfosDel = append(skuBindInfosDel, v.(*StoreSkuBindInfo))
|
// for _, v := range resultDel {
|
||||||
}
|
// skuBindInfosDel = append(skuBindInfosDel, v.(*StoreSkuBindInfo))
|
||||||
_, err = updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosDel, false)
|
// }
|
||||||
}
|
// _, err = updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosDel, false, false)
|
||||||
case 2:
|
// }
|
||||||
if len(updateList) > 0 {
|
// case 2:
|
||||||
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
// if len(updateList) > 0 {
|
||||||
var (
|
// taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
v = batchItemList[0].(*partner.SkuNameInfo)
|
// var (
|
||||||
skuBindInfo = &StoreSkuBindInfo{}
|
// v = batchItemList[0].(*partner.SkuNameInfo)
|
||||||
storeSkus []*dao.StoreSkuExt
|
// skuBindInfo = &StoreSkuBindInfo{}
|
||||||
pricePercentagePack []*model.PricePercentageItem
|
// storeSkus []*dao.StoreSkuExt
|
||||||
)
|
// pricePercentagePack []*model.PricePercentageItem
|
||||||
sql := `
|
// )
|
||||||
SELECT a.*, c.id name_id
|
// sql := `
|
||||||
FROM store_sku_bind a
|
// SELECT a.*, c.id name_id
|
||||||
JOIN sku b ON a.sku_id = b.id
|
// FROM store_sku_bind a
|
||||||
JOIN sku_name c ON c.id = b.name_id
|
// JOIN sku b ON a.sku_id = b.id
|
||||||
WHERE a.store_id = ? AND a.yb_id = ? AND a.deleted_at = ?
|
// JOIN sku_name c ON c.id = b.name_id
|
||||||
`
|
// WHERE a.store_id = ? AND a.yb_id = ? AND a.deleted_at = ?
|
||||||
sqlParams := []interface{}{storeID, v.SkuList[0].VendorSkuID, utils.DefaultTimeValue}
|
// `
|
||||||
err = dao.GetRows(db, &storeSkus, sql, sqlParams)
|
// sqlParams := []interface{}{storeID, v.SkuList[0].VendorSkuID, utils.DefaultTimeValue}
|
||||||
if len(storeSkus) > 0 {
|
// err = dao.GetRows(db, &storeSkus, sql, sqlParams)
|
||||||
if storeSkus[0].YbPrice != int(v.SkuList[0].VendorPrice) {
|
// if len(storeSkus) > 0 {
|
||||||
err = jxutils.Strings2Objs(store.PricePercentagePackStr, &pricePercentagePack)
|
// if storeSkus[0].YbPrice != int(v.SkuList[0].VendorPrice) {
|
||||||
skuBindInfo.UnitPrice = jxutils.CaculateJxPriceByPricePack(pricePercentagePack, 0, int(v.SkuList[0].VendorPrice))
|
// err = jxutils.Strings2Objs(store.PricePercentagePackStr, &pricePercentagePack)
|
||||||
}
|
// skuBindInfo.UnitPrice = jxutils.CaculateJxPriceByPricePack(pricePercentagePack, 0, int(v.SkuList[0].VendorPrice))
|
||||||
} else {
|
// }
|
||||||
return retVal, fmt.Errorf("未查询到门店商品,yb_id [%v]", v.SkuList[0].VendorSkuID)
|
// } else {
|
||||||
}
|
// return retVal, fmt.Errorf("未查询到门店商品,yb_id [%v]", v.SkuList[0].VendorSkuID)
|
||||||
if v.SkuList[0].Stock < 1 {
|
// }
|
||||||
skuBindInfo.IsSale = model.StoreSkuBindStatusDontSale
|
// if v.SkuList[0].Stock < 1 {
|
||||||
} else {
|
// skuBindInfo.IsSale = model.StoreSkuBindStatusDontSale
|
||||||
skuBindInfo.IsSale = model.StoreSkuBindStatusNormal
|
// } else {
|
||||||
}
|
// skuBindInfo.IsSale = model.StoreSkuBindStatusNormal
|
||||||
skuBindInfo.NameID = storeSkus[0].NameID
|
// }
|
||||||
retVal = []*StoreSkuBindInfo{skuBindInfo}
|
// skuBindInfo.NameID = storeSkus[0].NameID
|
||||||
return retVal, err
|
// retVal = []*StoreSkuBindInfo{skuBindInfo}
|
||||||
}
|
// return retVal, err
|
||||||
taskParallel := tasksch.NewParallelTask("更新商品价格和库存", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, taskFunc, updateList)
|
// }
|
||||||
tasksch.HandleTask(taskParallel, task, true).Run()
|
// taskParallel := tasksch.NewParallelTask("更新商品价格和库存", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, taskFunc, updateList)
|
||||||
resultUpt, _ := taskParallel.GetResult(0)
|
// tasksch.HandleTask(taskParallel, task, true).Run()
|
||||||
for _, v := range resultUpt {
|
// resultUpt, _ := taskParallel.GetResult(0)
|
||||||
skuBindInfosUpt = append(skuBindInfosUpt, v.(*StoreSkuBindInfo))
|
// for _, v := range resultUpt {
|
||||||
}
|
// skuBindInfosUpt = append(skuBindInfosUpt, v.(*StoreSkuBindInfo))
|
||||||
_, err = updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosUpt, false)
|
// }
|
||||||
}
|
// _, err = updateStoresSkusWithoutSync(ctx, db, []int{storeID}, skuBindInfosUpt, false, false)
|
||||||
case 3:
|
// }
|
||||||
_, err = CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{0, 1, 3}, nil, false, nil, nil, 0, true, true)
|
// case 3:
|
||||||
}
|
// _, err = CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{0, 1, 3}, nil, false, nil, nil, 0, true, true)
|
||||||
return result, err
|
// }
|
||||||
}
|
// return result, err
|
||||||
taskSeq := tasksch.NewSeqTask2("同步银豹商品到京西", ctx, true, taskSeqFunc, 3)
|
// }
|
||||||
tasksch.HandleTask(taskSeq, nil, true).Run()
|
// taskSeq := tasksch.NewSeqTask2("同步银豹商品到京西", ctx, true, taskSeqFunc, 3)
|
||||||
hint = taskSeq.GetID()
|
// tasksch.HandleTask(taskSeq, nil, true).Run()
|
||||||
|
// hint = taskSeq.GetID()
|
||||||
return hint, err
|
return hint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1088,114 +1117,162 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i
|
|||||||
var (
|
var (
|
||||||
db = dao.GetDB()
|
db = dao.GetDB()
|
||||||
)
|
)
|
||||||
_, hint, err = v.LoopStoresMap2(ctx, nil, db, fmt.Sprintf("同步京东商城库存商品信息:%v", storeIDs), isAsync, true, []int{model.VendorIDJDShop}, storeIDs, false,
|
// storeSkus, _ := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil)
|
||||||
|
_, hint, err = v.LoopStoresMap2(ctx, nil, db, fmt.Sprintf("同步京东商城门店的可售信息:%v", storeIDs), isAsync, true, []int{model.VendorIDJDShop}, storeIDs, false,
|
||||||
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
|
||||||
loopMapInfo := batchItemList[0].(*LoopStoreMapInfo)
|
loopMapInfo := batchItemList[0].(*LoopStoreMapInfo)
|
||||||
if handler := v.GetStoreHandler(loopMapInfo.VendorID); handler != nil {
|
if handler := v.GetStoreHandler(loopMapInfo.VendorID); handler != nil {
|
||||||
parallelCount := 5
|
for _, storeMap := range loopMapInfo.StoreMapList {
|
||||||
if model.MultiStoresVendorMap[loopMapInfo.VendorID] == 1 {
|
|
||||||
parallelCount = 2
|
|
||||||
}
|
|
||||||
loopStoreTask := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[loopMapInfo.VendorID]),
|
|
||||||
tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(isContinueWhenError), ctx,
|
|
||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
|
||||||
storeMap := batchItemList[0].(*model.StoreMap)
|
|
||||||
if storeMap.Status > model.StoreStatusDisabled && storeMap.StoreID != model.JdShopMainStoreID && storeMap.SyncRule != 0 {
|
if storeMap.Status > model.StoreStatusDisabled && storeMap.StoreID != model.JdShopMainStoreID && storeMap.SyncRule != 0 {
|
||||||
_, err = syncJdsStoresSkus(ctx, db, task, storeMap, isAsync, isContinueWhenError)
|
err = syncJdsStoresSkus(ctx, db, t, storeMap, isAsync, isContinueWhenError)
|
||||||
|
}
|
||||||
|
// err = syncJdsStoreStock(ctx, db, t, storeSkus, storeMap, isAsync, isContinueWhenError)
|
||||||
}
|
}
|
||||||
return nil, err
|
|
||||||
}, loopMapInfo.StoreMapList)
|
|
||||||
t.AddChild(loopStoreTask).Run()
|
|
||||||
_, err = loopStoreTask.GetResult(0)
|
|
||||||
}
|
}
|
||||||
return nil, partner.AddVendorInfo2Err(err, loopMapInfo.VendorID)
|
return nil, partner.AddVendorInfo2Err(err, loopMapInfo.VendorID)
|
||||||
}, isContinueWhenError)
|
}, isContinueWhenError)
|
||||||
return hint, err
|
return hint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (hint string, err error) {
|
func syncJdsStoreStock(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeSkus []*model.StoreSkuBind, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (err error) {
|
||||||
|
task := tasksch.NewParallelTask("syncJdsStoreStock", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||||
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
|
storeSku := batchItemList[0].(*model.StoreSkuBind)
|
||||||
|
stock := 0
|
||||||
|
storeSku2, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{storeSku.SkuID})
|
||||||
|
if storeSku.JdsID != 0 {
|
||||||
|
if len(storeSku2) > 0 {
|
||||||
|
if storeSku2[0].Status == model.StoreSkuBindStatusNormal && storeSku.Status == model.StoreSkuBindStatusNormal {
|
||||||
|
stock = 9999
|
||||||
|
}
|
||||||
|
if storeMap.VendorStoreID != "" {
|
||||||
|
err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, stock, utils.Str2Int(storeMap.VendorStoreID))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, 0, utils.Str2Int(storeMap.VendorStoreID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retVal, err
|
||||||
|
}, storeSkus)
|
||||||
|
tasksch.HandleTask(task, parentTask, true).Run()
|
||||||
|
_, err = task.GetResult(0)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func SyncJdsStoreStock(ctx *jxcontext.Context, isAsync, isContinueWhenError bool) (err error) {
|
||||||
var (
|
var (
|
||||||
mainSkusMap = make(map[int]*model.StoreSkuBind)
|
db = dao.GetDB()
|
||||||
skusMap = make(map[int]*model.StoreSkuBind)
|
storeMaps []*model.StoreMap
|
||||||
updateList []*model.StoreSkuBind
|
)
|
||||||
addList []*model.StoreSkuBind
|
sql := `
|
||||||
|
SELECT * FROM store_map WHERE vendor_id = ? AND vendor_store_id <> '' AND store_id <> ? AND vendor_org_code = 1
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
model.VendorIDJDShop, model.JdShopMainStoreID,
|
||||||
|
}
|
||||||
|
err = dao.GetRows(db, &storeMaps, sql, sqlParams)
|
||||||
|
storeSkus, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
task1 := tasksch.NewParallelTask("syncJdsStoreStock1", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||||
|
func(task1 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
|
storeMap := batchItemList[0].(*model.StoreMap)
|
||||||
|
task2 := tasksch.NewParallelTask("syncJdsStoreStock2", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||||
|
func(task2 *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
|
storeSku := batchItemList[0].(*model.StoreSkuBind)
|
||||||
|
stock := 0
|
||||||
|
storeSku2, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{storeSku.SkuID})
|
||||||
|
if storeSku.JdsID != 0 {
|
||||||
|
if len(storeSku2) > 0 {
|
||||||
|
if storeSku2[0].Status == model.StoreSkuBindStatusNormal && storeSku.Status == model.StoreSkuBindStatusNormal {
|
||||||
|
stock = 9999
|
||||||
|
}
|
||||||
|
if storeMap.VendorStoreID != "" {
|
||||||
|
err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, stock, utils.Str2Int(storeMap.VendorStoreID))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, 0, utils.Str2Int(storeMap.VendorStoreID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retVal, err
|
||||||
|
}, storeSkus)
|
||||||
|
tasksch.HandleTask(task2, task1, true).Run()
|
||||||
|
_, err = task2.GetResult(0)
|
||||||
|
return retVal, err
|
||||||
|
}, storeMaps)
|
||||||
|
tasksch.HandleTask(task1, nil, true).Run()
|
||||||
|
_, err = task1.GetResult(0)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func syncJdsStoresSkus(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (err error) {
|
||||||
|
globals.SugarLogger.Debugf("syncJdsStoresSkus")
|
||||||
|
var (
|
||||||
|
mainSkusMap = make(map[int][]*dao.StoreSkuSyncInfo)
|
||||||
|
skusMap = make(map[int][]*dao.StoreSkuSyncInfo)
|
||||||
|
updateList []*dao.StoreSkuSyncInfo
|
||||||
|
addList []*dao.StoreSkuSyncInfo
|
||||||
skuBindInfos1 []*StoreSkuBindInfo
|
skuBindInfos1 []*StoreSkuBindInfo
|
||||||
skuBindInfos2 []*StoreSkuBindInfo
|
skuBindInfos2 []*StoreSkuBindInfo
|
||||||
resultInterface1 []interface{}
|
|
||||||
resultInterface2 []interface{}
|
|
||||||
)
|
)
|
||||||
storeSkusMain, err := dao.GetStoresSkusInfo(db, []int{model.JdShopMainStoreID}, nil)
|
storeSkusMain, err := dao.GetStoreSkusByNameIDs(db, []int{model.JdShopMainStoreID}, 0)
|
||||||
for _, v := range storeSkusMain {
|
for _, v := range storeSkusMain {
|
||||||
mainSkusMap[v.SkuID] = v
|
mainSkusMap[v.NameID] = append(mainSkusMap[v.NameID], v)
|
||||||
}
|
}
|
||||||
storeSkus, err := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, nil)
|
storeSkus, err := dao.GetStoreSkusByNameIDs(db, []int{storeMap.StoreID}, 0)
|
||||||
for _, v := range storeSkus {
|
for _, v := range storeSkus {
|
||||||
skusMap[v.SkuID] = v
|
skusMap[v.NameID] = append(skusMap[v.NameID], v)
|
||||||
if mainSkusMap[v.SkuID] != nil && mainSkusMap[v.SkuID].Status != v.Status {
|
}
|
||||||
updateList = append(updateList, mainSkusMap[v.SkuID])
|
for k, v := range skusMap {
|
||||||
|
if mainSkusMap[k] != nil {
|
||||||
|
flag := false
|
||||||
|
for _, storeSku := range v {
|
||||||
|
if storeSku.StoreSkuStatus == model.StoreSkuBindStatusNormal {
|
||||||
|
flag = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !flag {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, storeSku := range v {
|
||||||
|
for _, storeSkuMain := range mainSkusMap[k] {
|
||||||
|
if storeSkuMain.StoreSkuStatus == model.StoreSkuBindStatusNormal && storeSku.StoreSkuStatus == model.StoreSkuBindStatusDontSale &&
|
||||||
|
storeSkuMain.SkuID == storeSku.SkuID {
|
||||||
|
updateList = append(updateList, storeSkuMain)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for k, v := range mainSkusMap {
|
for k, v := range mainSkusMap {
|
||||||
if skusMap[k] == nil {
|
if skusMap[k] == nil {
|
||||||
if storeMap.SyncRule == 2 {
|
if storeMap.SyncRule == 2 {
|
||||||
addList = append(addList, v)
|
for _, storeSkuMain := range v {
|
||||||
|
addList = append(addList, storeSkuMain)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// fmt.Println("updateList", utils.Format4Output(updateList, false))
|
// fmt.Println("updateList", utils.Format4Output(updateList, false))
|
||||||
// fmt.Println("addList", utils.Format4Output(addList, false))
|
// fmt.Println("addList", utils.Format4Output(addList, false))
|
||||||
task := tasksch.NewParallelTask("正在同步京东商城的库存商品", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
|
|
||||||
func(ptTask *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
|
||||||
step := batchItemList[0].(int)
|
|
||||||
switch step {
|
|
||||||
case 0:
|
|
||||||
if len(updateList) > 0 {
|
if len(updateList) > 0 {
|
||||||
task := tasksch.NewParallelTask("同步门店库存", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
|
for _, v := range updateList {
|
||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
skuBindInfos1 = append(skuBindInfos1, buildStoreSkuBindInfo(db, storeMap.StoreID, v, false))
|
||||||
storeBind := batchItemList[0].(*model.StoreSkuBind)
|
|
||||||
retVal = []*StoreSkuBindInfo{buildStoreSkuBindInfo(db, storeMap.StoreID, storeBind, false)}
|
|
||||||
return retVal, err
|
|
||||||
}, updateList)
|
|
||||||
tasksch.HandleTask(task, ptTask, false).Run()
|
|
||||||
resultInterface1, err = task.GetResult(0)
|
|
||||||
for _, v := range resultInterface1 {
|
|
||||||
skuBindInfos1 = append(skuBindInfos1, v.(*StoreSkuBindInfo))
|
|
||||||
}
|
}
|
||||||
hint, err = UpdateStoresSkusByBind(ctx, ptTask, skuBindInfos1, isAsync, isContinueWhenError, false)
|
UpdateStoresSkusByBind(ctx, parentTask, skuBindInfos1, isAsync, isContinueWhenError, false)
|
||||||
}
|
|
||||||
case 1:
|
|
||||||
if len(addList) > 0 {
|
|
||||||
task := tasksch.NewParallelTask("同步门店商品", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
|
|
||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
|
||||||
storeBind := batchItemList[0].(*model.StoreSkuBind)
|
|
||||||
retVal = []*StoreSkuBindInfo{buildStoreSkuBindInfo(db, storeMap.StoreID, storeBind, true)}
|
|
||||||
return retVal, err
|
|
||||||
}, addList)
|
|
||||||
tasksch.HandleTask(task, ptTask, false).Run()
|
|
||||||
resultInterface2, err = task.GetResult(0)
|
|
||||||
for _, v := range resultInterface2 {
|
|
||||||
skuBindInfos2 = append(skuBindInfos2, v.(*StoreSkuBindInfo))
|
|
||||||
}
|
|
||||||
hint, err = UpdateStoresSkusByBind(ctx, ptTask, skuBindInfos2, isAsync, isContinueWhenError, false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return retVal, err
|
|
||||||
}, []int{0, 1})
|
|
||||||
tasksch.HandleTask(task, nil, true).Run()
|
|
||||||
if isAsync {
|
|
||||||
hint = task.GetID()
|
|
||||||
} else {
|
|
||||||
_, err = task.GetResult(0)
|
|
||||||
hint = "1"
|
|
||||||
}
|
|
||||||
return hint, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *model.StoreSkuBind, isFocus bool) (skuBindInfo *StoreSkuBindInfo) {
|
if len(addList) > 0 {
|
||||||
result, err := dao.GetSkus(db, []int{storeBind.SkuID}, nil, nil, nil, nil)
|
for _, v := range addList {
|
||||||
if err != nil || len(result) == 0 {
|
skuBindInfos2 = append(skuBindInfos2, buildStoreSkuBindInfo(db, storeMap.StoreID, v, true))
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
UpdateStoresSkusByBind(ctx, parentTask, skuBindInfos2, isAsync, isContinueWhenError, false)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *dao.StoreSkuSyncInfo, isFocus bool) (skuBindInfo *StoreSkuBindInfo) {
|
||||||
skus := []*StoreSkuBindSkuInfo{
|
skus := []*StoreSkuBindSkuInfo{
|
||||||
&StoreSkuBindSkuInfo{
|
&StoreSkuBindSkuInfo{
|
||||||
SkuID: storeBind.SkuID,
|
SkuID: storeBind.SkuID,
|
||||||
@@ -1203,12 +1280,12 @@ func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *model.StoreSku
|
|||||||
}
|
}
|
||||||
skuBindInfo = &StoreSkuBindInfo{
|
skuBindInfo = &StoreSkuBindInfo{
|
||||||
StoreID: storeID,
|
StoreID: storeID,
|
||||||
NameID: result[0].NameID,
|
NameID: storeBind.NameID,
|
||||||
}
|
}
|
||||||
if isFocus {
|
if isFocus {
|
||||||
skuBindInfo.IsFocus = 1
|
skuBindInfo.IsFocus = 1
|
||||||
}
|
}
|
||||||
if storeBind.Status == model.SkuStatusNormal {
|
if storeBind.StoreSkuStatus == model.SkuStatusNormal {
|
||||||
skus[0].IsSale = 1
|
skus[0].IsSale = 1
|
||||||
} else {
|
} else {
|
||||||
skus[0].IsSale = -1
|
skus[0].IsSale = -1
|
||||||
@@ -1216,3 +1293,235 @@ func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *model.StoreSku
|
|||||||
skuBindInfo.Skus = skus
|
skuBindInfo.Skus = skus
|
||||||
return skuBindInfo
|
return skuBindInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SyncSkuExperfixAndWatermark(ctx *jxcontext.Context) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
skuExinfos, err := dao.GetSkuExinfos(db, nil, []int{model.VendorIDMTWM, model.VendorIDEBAI, model.VendorIDJD, model.VendorIDJDShop}, "", utils.ZeroTimeValue, utils.ZeroTimeValue)
|
||||||
|
task := tasksch.NewParallelTask("SyncSkuExperfixAndWatermark", tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx,
|
||||||
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
|
skuExinfo := batchItemList[0].(*model.SkuExinfoMap)
|
||||||
|
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(skuExinfo.EndAt) > 0 {
|
||||||
|
skuExinfo.DeletedAt = time.Now()
|
||||||
|
dao.UpdateEntity(db, skuExinfo, "DeletedAt")
|
||||||
|
goto setModifiyFlag
|
||||||
|
}
|
||||||
|
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(skuExinfo.BeginAt) == 0 {
|
||||||
|
goto setModifiyFlag
|
||||||
|
}
|
||||||
|
setModifiyFlag:
|
||||||
|
{
|
||||||
|
skus, _ := dao.GetSkus(db, nil, []int{skuExinfo.NameID}, nil, nil, nil)
|
||||||
|
var skuIDs []int
|
||||||
|
for _, v := range skus {
|
||||||
|
skuIDs = append(skuIDs, v.ID)
|
||||||
|
}
|
||||||
|
if partner.IsMultiStore(skuExinfo.VendorID) {
|
||||||
|
for _, v := range skuIDs {
|
||||||
|
OnUpdateThing(ctx, db, nil, int64(v), model.ThingTypeSku)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if len(skuIDs) > 0 {
|
||||||
|
SetStoreSkuSyncStatus2(db, nil, []int{skuExinfo.VendorID}, skuIDs, model.SyncFlagModifiedMask)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retVal, err
|
||||||
|
}, skuExinfos)
|
||||||
|
tasksch.HandleTask(task, nil, true).Run()
|
||||||
|
_, err = task.GetResult(0)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetMTPSStatus(ctx *jxcontext.Context, storeId, courierStatus int) {
|
||||||
|
globals.SugarLogger.Debug("SetMTPSStatus is start ")
|
||||||
|
globals.SugarLogger.Debug("StoreId", "CourierStatus", storeId, courierStatus)
|
||||||
|
/*获取美团门店信息*/
|
||||||
|
//&& CourierStatus != 0
|
||||||
|
if storeId != 0 {
|
||||||
|
var ShopName string
|
||||||
|
StoreLists, _ := dao.GetStoreList(nil, []int{storeId}, nil, nil, nil, nil, "")
|
||||||
|
ShopName = StoreLists[0].Name
|
||||||
|
StoreInfoList := new(mtpsapi.GetStoreStatusResultAll)
|
||||||
|
StoreInfoList, _ = api.MtpsAPI.GetStoreStatus(ShopName)
|
||||||
|
/*通过名字找到了,正常情况*/
|
||||||
|
if StoreInfoList != nil && StoreInfoList.DataList != nil {
|
||||||
|
goto ifExist
|
||||||
|
} else {
|
||||||
|
/*如果通过名字找不到,那就先通过ID去找名字*/
|
||||||
|
ShopInfo, _ := api.MtpsAPI.GetStoreInfo(storeId)
|
||||||
|
if ShopInfo != nil {
|
||||||
|
ShopName = ShopInfo[0].PoiName
|
||||||
|
if ShopName == "" {
|
||||||
|
ShopName = StoreLists[0].Name[:len(StoreLists[0].Name)-3]
|
||||||
|
}
|
||||||
|
StoreInfoList, _ = api.MtpsAPI.GetStoreStatus(ShopName)
|
||||||
|
if StoreInfoList != nil && StoreInfoList.DataList != nil {
|
||||||
|
goto ifExist
|
||||||
|
} else {
|
||||||
|
/*如果通过API返回的名字也找不到*/
|
||||||
|
goto ifNotExist
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
StoreCourierList, _ := dao.GetStoreCourierList(dao.GetDB(), []int{storeId}, []int{model.VendorIDMTPS}, model.StoreStatusAll, model.StoreAuditStatusAll)
|
||||||
|
if len(StoreCourierList) > 0 {
|
||||||
|
ShopInfo, _ := api.MtpsAPI.GetStoreInfo(utils.Str2Int(StoreCourierList[0].VendorStoreID))
|
||||||
|
if ShopInfo != nil {
|
||||||
|
ShopName = ShopInfo[0].PoiName
|
||||||
|
StoreInfoList, _ = api.MtpsAPI.GetStoreStatus(ShopName)
|
||||||
|
if StoreInfoList != nil && StoreInfoList.DataList != nil {
|
||||||
|
goto ifExist
|
||||||
|
} else {
|
||||||
|
/*如果通过API返回的名字也找不到*/
|
||||||
|
goto ifNotExist
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/*如果通过ID找不到,那就直接去判断名字*/
|
||||||
|
goto NameProblem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NameProblem:
|
||||||
|
{
|
||||||
|
var NotOpen int
|
||||||
|
if strings.Contains(StoreLists[0].Name, "不做") || strings.Contains(StoreLists[0].Name, "不想做") {
|
||||||
|
NotOpen = strings.Index(StoreLists[0].Name, "-")
|
||||||
|
if strings.Index(StoreLists[0].Name, "-") > 0 {
|
||||||
|
StoreLists[0].Name = StoreLists[0].Name[:NotOpen-1]
|
||||||
|
}
|
||||||
|
NotOpen = strings.Index(StoreLists[0].Name, "不")
|
||||||
|
if strings.Index(StoreLists[0].Name, "不") > 0 {
|
||||||
|
StoreLists[0].Name = StoreLists[0].Name[:NotOpen-1]
|
||||||
|
}
|
||||||
|
NotOpen = strings.Index(StoreLists[0].Name, "(")
|
||||||
|
if strings.Index(StoreLists[0].Name, "(") > 0 {
|
||||||
|
StoreLists[0].Name = StoreLists[0].Name[:NotOpen-1]
|
||||||
|
}
|
||||||
|
NotOpen = strings.Index(StoreLists[0].Name, "(")
|
||||||
|
if strings.Index(StoreLists[0].Name, "(") > 0 {
|
||||||
|
StoreLists[0].Name = StoreLists[0].Name[:NotOpen-1]
|
||||||
|
}
|
||||||
|
NotOpen = strings.Index(StoreLists[0].Name, " ")
|
||||||
|
if NotOpen > 0 {
|
||||||
|
StoreLists[0].Name = StoreLists[0].Name[:NotOpen-1]
|
||||||
|
}
|
||||||
|
ShopName = StoreLists[0].Name
|
||||||
|
StoreInfoList, _ = api.MtpsAPI.GetStoreStatus(ShopName)
|
||||||
|
if StoreInfoList != nil && StoreInfoList.DataList != nil {
|
||||||
|
goto ifExist
|
||||||
|
} else {
|
||||||
|
goto ifNotExist
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ifNotExist:
|
||||||
|
{
|
||||||
|
sl := make(map[string]interface{})
|
||||||
|
sl["vendorStatus"] = 0
|
||||||
|
globals.SugarLogger.Debug("因为没找到被修改配送状态的VendorStoreID是", ShopName, storeId)
|
||||||
|
UpdateStoreCourierMap(ctx, nil, storeId, model.VendorIDMTPS, sl, ctx.GetUserName())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
ifExist:
|
||||||
|
{
|
||||||
|
if StoreInfoList.DataList[0].OuterPoiID != "" {
|
||||||
|
//若存在且名字不为空,就是找到了
|
||||||
|
// if StoreInfoList.DataList[0].OpenType != courierStatus ||{
|
||||||
|
sl := make(map[string]interface{})
|
||||||
|
sl["vendorStoreID"] = StoreInfoList.DataList[0].OuterPoiID
|
||||||
|
sl["status"] = StoreInfoList.DataList[0].OpenType
|
||||||
|
sl["vendorStatus"] = StoreInfoList.DataList[0].OpenType
|
||||||
|
globals.SugarLogger.Debugf("被修改配送状态的VendorStoreID是:%s,名称是:%s,美团状态是:%s,本地状态是:%s",
|
||||||
|
StoreInfoList.DataList[0].OuterPoiID, StoreInfoList.DataList[0].PoiName, strconv.Itoa(StoreInfoList.DataList[0].OpenType), strconv.Itoa(StoreLists[0].Status))
|
||||||
|
UpdateStoreCourierMap(ctx, nil, storeId, model.VendorIDMTPS, sl, ctx.GetUserName())
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
StoreInfoList, _ := api.MtpsAPI.GetStoreStatusAll()
|
||||||
|
StoreInfoList2 := make(map[string]string)
|
||||||
|
for _, store := range StoreInfoList {
|
||||||
|
for _, data := range store.DataList {
|
||||||
|
StoreInfoList2[data.OuterPoiID] = data.PoiName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
db := dao.GetDB()
|
||||||
|
/*比较营业状态*/
|
||||||
|
/*把获取的京西状态和名称存一下*/
|
||||||
|
StoreCourierList, _ := dao.GetStoreCourierList(db, []int{}, nil, model.StoreStatusAll, model.StoreStatusAll)
|
||||||
|
/*循环美团*/
|
||||||
|
for _, StoreInfoList1 := range StoreInfoList {
|
||||||
|
for _, StoreInfoList11 := range StoreInfoList1.DataList {
|
||||||
|
/*循环京西*/
|
||||||
|
for _, StoreCourierList1 := range StoreCourierList {
|
||||||
|
/*只比较美团*/
|
||||||
|
if StoreCourierList1.VendorID != model.VendorIDMTPS {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
/*如果门店ID相同的时候进入判断,一个门店只用判断一次就行*/
|
||||||
|
if StoreCourierList1.VendorStoreID == StoreInfoList11.OuterPoiID {
|
||||||
|
if StoreCourierList1.Status != StoreInfoList11.OpenType {
|
||||||
|
sl := make(map[string]interface{})
|
||||||
|
sl["vendorStoreID"] = StoreInfoList11.OuterPoiID
|
||||||
|
sl["status"] = StoreInfoList11.OpenType
|
||||||
|
sl["vendorStatus"] = StoreInfoList11.OpenType
|
||||||
|
globals.SugarLogger.Debugf("被修改配送状态的VendorStoreID是:%s,名称是:%s,美团状态是:%s,本地状态是:%s",
|
||||||
|
StoreInfoList11.OuterPoiID, StoreInfoList11.PoiName, strconv.Itoa(StoreInfoList11.OpenType), strconv.Itoa(StoreCourierList1.Status))
|
||||||
|
UpdateStoreCourierMap(ctx, nil, StoreCourierList1.StoreID, StoreCourierList1.VendorID, sl, ctx.GetUserName())
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* 美团配送的门店是否存在,调用美团配送的api(有可能接了),查询京西门店对应的美团配送门店是否存在,若不存在则要在京西这边解绑美团配送门店
|
||||||
|
怎么解绑可以在网页上门店管理那点一下看看调的什么接口,传的什么参数*/
|
||||||
|
/*获取所有门店信息*/
|
||||||
|
//test:
|
||||||
|
for _, StoreCourierList1 := range StoreCourierList {
|
||||||
|
diff := false
|
||||||
|
StoreLists, _ := dao.GetStoreList(db, []int{StoreCourierList1.StoreID}, nil, nil, nil, nil, "")
|
||||||
|
if StoreLists == nil {
|
||||||
|
globals.SugarLogger.Debugf("StoreID为:%s,在store表未找到", StoreCourierList1.StoreID)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if StoreCourierList1.VendorID != model.VendorIDMTPS || StoreCourierList1.VendorStoreID == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if StoreCourierList1.Status == model.StoreStatusDisabled || StoreCourierList1.Status == model.StoreStatusClosed {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
/*京西不为空,容错*/
|
||||||
|
//if {
|
||||||
|
/*调用API获取美团的商店信息*/
|
||||||
|
MTPSInfo := new(mtpsapi.ShopInfo)
|
||||||
|
MTPSInfo, _ = api.MtpsAPI.ShopQuery(StoreCourierList1.VendorStoreID)
|
||||||
|
if MTPSInfo == nil {
|
||||||
|
globals.SugarLogger.Debug("美团未找到该门店," + StoreLists[0].Name + strconv.Itoa(StoreCourierList1.StoreID) + " 被解绑,关联的ID为:" + StoreCourierList1.VendorStoreID)
|
||||||
|
diff = true
|
||||||
|
}
|
||||||
|
if MTPSInfo != nil && MTPSInfo.ShopName == "" {
|
||||||
|
MTPSInfo.ShopName = StoreInfoList2[MTPSInfo.ShopID]
|
||||||
|
}
|
||||||
|
if MTPSInfo != nil && MTPSInfo.ShopLng != StoreCourierList1.Lng && MTPSInfo.ShopLat == StoreCourierList1.Lat {
|
||||||
|
/*平台上但是坐标不同,解绑*/
|
||||||
|
globals.SugarLogger.Debug("商店与美团配送上的坐标不同," + StoreLists[0].Name + strconv.Itoa(StoreCourierList1.StoreID) + " 被解绑,关联的ID为:" + StoreCourierList1.VendorStoreID)
|
||||||
|
if _, err := DeleteStoreCourierMap(ctx, db, StoreCourierList1.StoreID, StoreCourierList1.VendorID, ctx.GetUserName()); err != nil {
|
||||||
|
globals.SugarLogger.Debug(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
diff = true
|
||||||
|
}
|
||||||
|
if diff {
|
||||||
|
if _, err := DeleteStoreCourierMap(ctx, db, StoreCourierList1.StoreID, StoreCourierList1.VendorID, ctx.GetUserName()); err != nil {
|
||||||
|
globals.SugarLogger.Debug(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//break test
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
globals.SugarLogger.Debug("SetMTPSStatus is Complete")
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package cms
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
@@ -51,6 +52,13 @@ func syncCategories(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.IT
|
|||||||
if catVendorInfo.MapID == 0 {
|
if catVendorInfo.MapID == 0 {
|
||||||
return nil, fmt.Errorf("分类:%d的数据异常", catVendorInfo.ID)
|
return nil, fmt.Errorf("分类:%d的数据异常", catVendorInfo.ID)
|
||||||
}
|
}
|
||||||
|
//表示是不用京西分类,要用平台分类
|
||||||
|
if catVendorInfo.IsJxCat == model.YES {
|
||||||
|
if catVendorInfo.VendorCategoryID != 0 {
|
||||||
|
catVendorInfo.Seq = catVendorInfo.VendorCategorySeq
|
||||||
|
catVendorInfo.Name = catVendorInfo.VendorCategoryName
|
||||||
|
}
|
||||||
|
}
|
||||||
if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(catVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok {
|
if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(catVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok {
|
||||||
if model.IsSyncStatusDelete(catVendorInfo.CatSyncStatus) { //删除
|
if model.IsSyncStatusDelete(catVendorInfo.CatSyncStatus) { //删除
|
||||||
if !dao.IsVendorThingIDEmpty(catVendorInfo.VendorCatID) &&
|
if !dao.IsVendorThingIDEmpty(catVendorInfo.VendorCatID) &&
|
||||||
@@ -138,16 +146,24 @@ func SyncSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs []int,
|
|||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
skuVendorInfo := batchItemList[0].(*dao.StoreSkuSyncInfo)
|
skuVendorInfo := batchItemList[0].(*dao.StoreSkuSyncInfo)
|
||||||
var failedList []*partner.StoreSkuInfoWithErr
|
var failedList []*partner.StoreSkuInfoWithErr
|
||||||
if skuVendorInfo.VendorCatID == "" {
|
// if skuVendorInfo.VendorCatID == "" {
|
||||||
return nil, fmt.Errorf("商品:%d的商家分类没有同步", skuVendorInfo.SkuID)
|
// return nil, fmt.Errorf("商品:%d的商家分类没有同步", skuVendorInfo.SkuID)
|
||||||
}
|
// }
|
||||||
if skuVendorInfo.BindID == 0 {
|
if skuVendorInfo.BindID == 0 {
|
||||||
return nil, fmt.Errorf("商品:%d的数据异常", skuVendorInfo.SkuID)
|
return nil, fmt.Errorf("商品:%d的数据异常", skuVendorInfo.SkuID)
|
||||||
}
|
}
|
||||||
if skuVendorInfo.ExdSkuID != "" {
|
if skuVendorInfo.ExdSkuID != "" {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
skuVendorInfo.SkuName = jxutils.ComposeSkuName(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd)
|
if skuVendorInfo.SkuVendorMapCatID != "" {
|
||||||
|
skuVendorInfo.VendorVendorCatID = utils.Str2Int64(skuVendorInfo.SkuVendorMapCatID)
|
||||||
|
}
|
||||||
|
skuVendorInfo.SkuName = jxutils.ComposeSkuNameSync(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0, skuVendorInfo.ExPrefix, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd, true)
|
||||||
|
skuVendorInfo.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuVendorInfo.Prefix, skuVendorInfo.Name, skuVendorInfo.Comment, skuVendorInfo.Unit, skuVendorInfo.SpecQuality, skuVendorInfo.SpecUnit, 0)
|
||||||
|
if skuVendorInfo.ImgWatermark != "" {
|
||||||
|
downLoad, _ := uploadImgStandard(skuVendorInfo.ImgWatermark)
|
||||||
|
skuVendorInfo.ImgMix = jxutils.MixWatermarkImg(downLoad, skuVendorInfo.Img, skuVendorInfo.ExPrefixBegin, skuVendorInfo.ExPrefixEnd)
|
||||||
|
}
|
||||||
skuVendorInfo.MergedStatus = jxutils.MergeSkuStatus(skuVendorInfo.Status, skuVendorInfo.NameStatus)
|
skuVendorInfo.MergedStatus = jxutils.MergeSkuStatus(skuVendorInfo.Status, skuVendorInfo.NameStatus)
|
||||||
if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(skuVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok {
|
if multiStoresHandler, ok := partner.GetPurchasePlatformFromVendorID(skuVendorInfo.VendorID).(partner.IMultipleStoresHandler); ok {
|
||||||
if model.IsSyncStatusDelete(skuVendorInfo.SkuSyncStatus) { //删除
|
if model.IsSyncStatusDelete(skuVendorInfo.SkuSyncStatus) { //删除
|
||||||
@@ -207,19 +223,34 @@ func SyncReorderCategories(ctx *jxcontext.Context, parentCatID int, isAsync bool
|
|||||||
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
vendorInfo := batchItemList[0].(*MultiStoreVendorInfo)
|
vendorInfo := batchItemList[0].(*MultiStoreVendorInfo)
|
||||||
multiStoresHandler := CurVendorSync.GetMultiStoreHandler(vendorInfo.VendorID)
|
multiStoresHandler := CurVendorSync.GetMultiStoreHandler(vendorInfo.VendorID)
|
||||||
|
vendorOrgCode, err := dao.GetVendorOrgCode(db, vendorInfo.VendorID, vendorInfo.OrgCode, "")
|
||||||
if multiStoresHandler != nil {
|
if multiStoresHandler != nil {
|
||||||
|
var vendorCatIDList []string
|
||||||
|
var parentVendorCatID string
|
||||||
|
//如果用平台分类就走else,用京西分类就还是原来的if
|
||||||
|
if vendorOrgCode[0].IsJxCat == model.NO {
|
||||||
catList, err2 := dao.GetSkuCategoryWithVendor(db, []int{vendorInfo.VendorID}, []string{vendorInfo.OrgCode}, parentCatID, nil, false)
|
catList, err2 := dao.GetSkuCategoryWithVendor(db, []int{vendorInfo.VendorID}, []string{vendorInfo.OrgCode}, parentCatID, nil, false)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
var vendorCatIDList []string
|
|
||||||
for _, v := range catList {
|
for _, v := range catList {
|
||||||
if v.VendorCatID != "" {
|
if v.VendorCatID != "" {
|
||||||
vendorCatIDList = append(vendorCatIDList, v.VendorCatID)
|
vendorCatIDList = append(vendorCatIDList, v.VendorCatID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(vendorCatIDList) > 0 {
|
|
||||||
if err = multiStoresHandler.ReorderCategories2(ctx, vendorInfo.OrgCode, catList[0].ParentVendorCatID, vendorCatIDList); err == nil {
|
|
||||||
retVal = []int{len(vendorCatIDList)}
|
|
||||||
}
|
}
|
||||||
|
parentVendorCatID = catList[0].ParentVendorCatID
|
||||||
|
} else {
|
||||||
|
vendorCatList, _ := dao.GetVendorCategoryMapExt(db, parentCatID, 0, vendorInfo.VendorID, vendorInfo.OrgCode, 0)
|
||||||
|
for _, v := range vendorCatList {
|
||||||
|
if v.VendorThingID != "" {
|
||||||
|
vendorCatIDList = append(vendorCatIDList, v.VendorThingID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
thingMaps, _ := dao.GetThingMapList(db, model.ThingTypeCategory, []int{vendorInfo.VendorID}, []int{parentCatID}, []string{vendorInfo.OrgCode})
|
||||||
|
parentVendorCatID = thingMaps[0].VendorThingID
|
||||||
|
}
|
||||||
|
if len(vendorCatIDList) > 0 {
|
||||||
|
if err = multiStoresHandler.ReorderCategories2(ctx, vendorInfo.OrgCode, parentVendorCatID, vendorCatIDList); err == nil {
|
||||||
|
retVal = []int{len(vendorCatIDList)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -230,16 +261,43 @@ func SyncReorderCategories(ctx *jxcontext.Context, parentCatID int, isAsync bool
|
|||||||
return hint, err
|
return hint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SyncReorderCategories2(ctx *jxcontext.Context, parentCatID, vendorID int, vendorOrgCode string) (err error) {
|
||||||
|
globals.SugarLogger.Debugf("SyncReorderCategories parentCatID:%d", parentCatID)
|
||||||
|
db := dao.GetDB()
|
||||||
|
multiStoresHandler := CurVendorSync.GetMultiStoreHandler(vendorID)
|
||||||
|
if multiStoresHandler != nil {
|
||||||
|
var vendorCatIDList []string
|
||||||
|
var parentVendorCatID string
|
||||||
|
vendorCatList, _ := dao.GetVendorCategoryMapExt(db, parentCatID, 0, vendorID, vendorOrgCode, 0)
|
||||||
|
for _, v := range vendorCatList {
|
||||||
|
if v.VendorThingID != "" {
|
||||||
|
vendorCatIDList = append(vendorCatIDList, v.VendorThingID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
thingMaps, _ := dao.GetThingMapList(db, model.ThingTypeCategory, []int{vendorID}, []int{parentCatID}, []string{vendorOrgCode})
|
||||||
|
if len(thingMaps) > 0 {
|
||||||
|
parentVendorCatID = thingMaps[0].VendorThingID
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(vendorCatIDList) > 0 {
|
||||||
|
err = multiStoresHandler.ReorderCategories2(ctx, vendorOrgCode, parentVendorCatID, vendorCatIDList)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = fmt.Errorf("非法平台:%d", vendorID)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func getThingMap(db *dao.DaoDB, thingMap *model.ThingMap) (err error) {
|
func getThingMap(db *dao.DaoDB, thingMap *model.ThingMap) (err error) {
|
||||||
return dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt)
|
return dao.GetEntity(db, thingMap, "ThingID", "ThingType", "VendorID", "VendorOrgCode", model.FieldDeletedAt)
|
||||||
}
|
}
|
||||||
|
|
||||||
func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*MultiStoreVendorInfo, thingID int64, thingType int8) (err error) {
|
func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*model.VendorOrgCode, thingID int64, thingType, syncFlag int8, vendorFlag bool) (err error) {
|
||||||
if thingType == model.ThingTypeSkuName {
|
if thingType == model.ThingTypeSkuName {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if len(vendorInfoList) == 0 {
|
if len(vendorInfoList) == 0 {
|
||||||
vendorInfoList = getMultiStoreVendorInfoList()
|
vendorInfoList, err = dao.GetVendorOrgCode(db, model.VendorIDJD, "", model.VendorOrgTypePlatform)
|
||||||
}
|
}
|
||||||
errList := errlist.New()
|
errList := errlist.New()
|
||||||
for _, v := range vendorInfoList {
|
for _, v := range vendorInfoList {
|
||||||
@@ -247,13 +305,18 @@ func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult
|
|||||||
ThingID: thingID,
|
ThingID: thingID,
|
||||||
ThingType: thingType,
|
ThingType: thingType,
|
||||||
VendorID: v.VendorID,
|
VendorID: v.VendorID,
|
||||||
VendorOrgCode: v.OrgCode,
|
VendorOrgCode: v.VendorOrgCode,
|
||||||
SyncStatus: model.SyncFlagNewMask,
|
|
||||||
}
|
}
|
||||||
|
if thingType == model.ThingTypeCategory && !vendorFlag {
|
||||||
|
if v.IsJxCat == model.YES {
|
||||||
|
syncFlag = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
thingMap.SyncStatus = syncFlag
|
||||||
dao.WrapAddIDCULDEntity(thingMap, ctx.GetUserName())
|
dao.WrapAddIDCULDEntity(thingMap, ctx.GetUserName())
|
||||||
if err2 := dao.CreateEntity(db, thingMap); err2 != nil {
|
if err2 := dao.CreateEntity(db, thingMap); err2 != nil {
|
||||||
if dao.IsDuplicateError(err2) {
|
if dao.IsDuplicateError(err2) {
|
||||||
errList.AddErr(onUpdateThing(ctx, db, vendorInfoList, thingID, thingType, model.SyncFlagNewMask))
|
errList.AddErr(onUpdateThing(ctx, db, vendorInfoList, thingID, thingType, syncFlag))
|
||||||
} else {
|
} else {
|
||||||
errList.AddErr(err2)
|
errList.AddErr(err2)
|
||||||
}
|
}
|
||||||
@@ -264,12 +327,12 @@ func OnCreateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func onUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*MultiStoreVendorInfo, thingID int64, thingType int8, syncStatus int8) (err error) {
|
func onUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*model.VendorOrgCode, thingID int64, thingType int8, syncStatus int8) (err error) {
|
||||||
if thingType == model.ThingTypeSkuName {
|
if thingType == model.ThingTypeSkuName {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if len(vendorInfoList) == 0 {
|
if len(vendorInfoList) == 0 {
|
||||||
vendorInfoList = getMultiStoreVendorInfoList()
|
vendorInfoList, err = dao.GetVendorOrgCode(db, model.VendorIDJD, "", model.VendorOrgTypePlatform)
|
||||||
}
|
}
|
||||||
errList := errlist.New()
|
errList := errlist.New()
|
||||||
for _, v := range vendorInfoList {
|
for _, v := range vendorInfoList {
|
||||||
@@ -277,7 +340,7 @@ func onUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult
|
|||||||
ThingID: thingID,
|
ThingID: thingID,
|
||||||
ThingType: thingType,
|
ThingType: thingType,
|
||||||
VendorID: v.VendorID,
|
VendorID: v.VendorID,
|
||||||
VendorOrgCode: v.OrgCode,
|
VendorOrgCode: v.VendorOrgCode,
|
||||||
}
|
}
|
||||||
thingMap.DeletedAt = utils.DefaultTimeValue
|
thingMap.DeletedAt = utils.DefaultTimeValue
|
||||||
if err2 := getThingMap(db, thingMap); err2 == nil {
|
if err2 := getThingMap(db, thingMap); err2 == nil {
|
||||||
@@ -287,15 +350,19 @@ func onUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*Mult
|
|||||||
errList.AddErr(err2)
|
errList.AddErr(err2)
|
||||||
|
|
||||||
updateThingMapEntity(db, thingMap)
|
updateThingMapEntity(db, thingMap)
|
||||||
|
} else {
|
||||||
|
if dao.IsNoRowsError(err2) {
|
||||||
|
err2 = nil
|
||||||
} else {
|
} else {
|
||||||
errList.AddErr(err2)
|
errList.AddErr(err2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
err = errList.GetErrListAsOne()
|
err = errList.GetErrListAsOne()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*MultiStoreVendorInfo, thingID int64, thingType int8) (err error) {
|
func OnUpdateThing(ctx *jxcontext.Context, db *dao.DaoDB, vendorInfoList []*model.VendorOrgCode, thingID int64, thingType int8) (err error) {
|
||||||
return onUpdateThing(ctx, db, vendorInfoList, thingID, thingType, model.SyncFlagModifiedMask)
|
return onUpdateThing(ctx, db, vendorInfoList, thingID, thingType, model.SyncFlagModifiedMask)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -370,6 +437,12 @@ func OnThingSync(ctx *jxcontext.Context, db *dao.DaoDB, thingMap *model.ThingMap
|
|||||||
err = syncErr
|
err = syncErr
|
||||||
thingMap.Remark = utils.LimitUTF8StringLen(err.Error(), 255)
|
thingMap.Remark = utils.LimitUTF8StringLen(err.Error(), 255)
|
||||||
dao.UpdateEntity(db, thingMap, "Remark")
|
dao.UpdateEntity(db, thingMap, "Remark")
|
||||||
|
|
||||||
|
if thingMap.VendorOrgCode == globals.JdcsOrgCode {
|
||||||
|
if strings.Contains(err.Error(), "店内分类信息不存在") {
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
updateFields := []string{
|
updateFields := []string{
|
||||||
model.FieldSyncStatus,
|
model.FieldSyncStatus,
|
||||||
@@ -415,18 +488,13 @@ func updateThingMapEntity(db *dao.DaoDB, thingMap *model.ThingMap) {
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, isAsync, isContinueWhenError bool, opType int, isForceUpdate bool) (hint string, err error) {
|
func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID, vendorID int, vendorOrgCode string, isAsync, isContinueWhenError bool, opType int, isForceUpdate bool) (hint string, err error) {
|
||||||
handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler)
|
handler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler)
|
||||||
if handler == nil {
|
if handler == nil {
|
||||||
return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID])
|
return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID])
|
||||||
}
|
}
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
vendorInfo := []*MultiStoreVendorInfo{
|
vendorOrgCodes, _ := dao.GetVendorOrgCode(db, vendorID, vendorOrgCode, model.VendorOrgTypePlatform)
|
||||||
&MultiStoreVendorInfo{
|
|
||||||
VendorID: vendorID,
|
|
||||||
OrgCode: vendorOrgCode,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
var sku2Delete []*partner.StoreSkuInfo
|
var sku2Delete []*partner.StoreSkuInfo
|
||||||
var cat2Delete []*partner.BareCategoryInfo
|
var cat2Delete []*partner.BareCategoryInfo
|
||||||
task := tasksch.NewParallelTask(fmt.Sprintf("平台:%s,账号:%s上的商品与商家分类", model.VendorChineseNames[vendorID], vendorOrgCode),
|
task := tasksch.NewParallelTask(fmt.Sprintf("平台:%s,账号:%s上的商品与商家分类", model.VendorChineseNames[vendorID], vendorOrgCode),
|
||||||
@@ -466,7 +534,21 @@ func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
StoreSkuMap := make(map[int]*dao.StoreSkuSyncInfo)
|
||||||
|
if storeID != 0 {
|
||||||
|
skuList2, _ := dao.GetStoreSkuListWithVendor(db, storeID, vendorID, vendorOrgCode)
|
||||||
|
for _, v := range skuList2 {
|
||||||
|
if _, ok := StoreSkuMap[v.ID]; !ok {
|
||||||
|
StoreSkuMap[v.ID] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getSyncFlag := func(skuID int) int8 {
|
||||||
|
if StoreSkuMap[skuID] != nil {
|
||||||
|
return model.SyncFlagNewMask
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
if opType == AmendPruneOnlyAmend || opType == AmendPruneAll {
|
if opType == AmendPruneOnlyAmend || opType == AmendPruneAll {
|
||||||
for _, v := range localSkuList {
|
for _, v := range localSkuList {
|
||||||
if v.ExdSkuID == "" {
|
if v.ExdSkuID == "" {
|
||||||
@@ -474,14 +556,17 @@ func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
|
|||||||
if !model.IsSyncStatusDelete(v.SkuSyncStatus) {
|
if !model.IsSyncStatusDelete(v.SkuSyncStatus) {
|
||||||
if remoteSkuMap[v.VendorSkuID] == 0 {
|
if remoteSkuMap[v.VendorSkuID] == 0 {
|
||||||
if !model.IsSyncStatusNew(v.SkuSyncStatus) {
|
if !model.IsSyncStatusNew(v.SkuSyncStatus) {
|
||||||
OnCreateThing(ctx, db, vendorInfo, int64(v.SkuID), model.ThingTypeSku)
|
OnCreateThing(ctx, db, vendorOrgCodes, int64(v.SkuID), model.ThingTypeSku, getSyncFlag(v.SkuID), false)
|
||||||
}
|
}
|
||||||
} else if isForceUpdate {
|
} else if isForceUpdate {
|
||||||
OnUpdateThing(ctx, db, vendorInfo, int64(v.SkuID), model.ThingTypeSku)
|
OnUpdateThing(ctx, db, vendorOrgCodes, int64(v.SkuID), model.ThingTypeSku)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
OnCreateThing(ctx, db, vendorInfo, int64(v.SkuID), model.ThingTypeSku)
|
//表示根据某门店的门店商品同步京东商品库中,这个门店关注并可售了这个商品,插到thingmap里同步标志是待创建(SyncFlagNewMask)才会创建
|
||||||
|
//若该门店没关注可售,那插到thingmap里的话就该同步标志为0,就不会创建
|
||||||
|
//getSyncFlag
|
||||||
|
OnCreateThing(ctx, db, vendorOrgCodes, int64(v.SkuID), model.ThingTypeSku, getSyncFlag(v.SkuID), false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -509,6 +594,21 @@ func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
|
|||||||
localCatMap[utils.Int2Str(v.ID)] = v
|
localCatMap[utils.Int2Str(v.ID)] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vendorCatMap := make(map[int]*model.VendorCategoryMap)
|
||||||
|
if vendorOrgCodes[0].IsJxCat == model.YES {
|
||||||
|
vendorCats, _ := dao.GetVendorCategoryMap(db, -1, 0, vendorID, vendorOrgCode, 0)
|
||||||
|
for _, v := range vendorCats {
|
||||||
|
if _, ok := vendorCatMap[v.CategoryID]; !ok {
|
||||||
|
vendorCatMap[v.CategoryID] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getSyncFlagCat := func(categoryID int) int8 {
|
||||||
|
if vendorCatMap[categoryID] != nil {
|
||||||
|
return model.SyncFlagNewMask
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
remoteCatList, err2 := handler.GetAllCategories(ctx, vendorOrgCode)
|
remoteCatList, err2 := handler.GetAllCategories(ctx, vendorOrgCode)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
remoteCatMap := make(map[string]int)
|
remoteCatMap := make(map[string]int)
|
||||||
@@ -520,14 +620,14 @@ func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
|
|||||||
if !model.IsSyncStatusDelete(v.CatSyncStatus) {
|
if !model.IsSyncStatusDelete(v.CatSyncStatus) {
|
||||||
if remoteCatMap[v.VendorCatID] == 0 {
|
if remoteCatMap[v.VendorCatID] == 0 {
|
||||||
if !model.IsSyncStatusNew(v.CatSyncStatus) {
|
if !model.IsSyncStatusNew(v.CatSyncStatus) {
|
||||||
OnCreateThing(ctx, db, vendorInfo, int64(v.ID), model.ThingTypeCategory)
|
OnCreateThing(ctx, db, vendorOrgCodes, int64(v.ID), model.ThingTypeCategory, getSyncFlagCat(v.ID), true)
|
||||||
}
|
}
|
||||||
} else if isForceUpdate && !model.IsSyncStatusUpdate(v.CatSyncStatus) {
|
} else if isForceUpdate && !model.IsSyncStatusUpdate(v.CatSyncStatus) {
|
||||||
OnUpdateThing(ctx, db, vendorInfo, int64(v.ID), model.ThingTypeCategory)
|
OnUpdateThing(ctx, db, vendorOrgCodes, int64(v.ID), model.ThingTypeCategory)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
OnCreateThing(ctx, db, vendorInfo, int64(v.ID), model.ThingTypeCategory)
|
OnCreateThing(ctx, db, vendorOrgCodes, int64(v.ID), model.ThingTypeCategory, getSyncFlagCat(v.ID), true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -568,7 +668,7 @@ func amendAndPruneVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask,
|
|||||||
return hint, err
|
return hint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func FullSyncVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
func FullSyncVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID, vendorID int, vendorOrgCode string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||||
multiStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler)
|
multiStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler)
|
||||||
if multiStoreHandler == nil {
|
if multiStoreHandler == nil {
|
||||||
return "", fmt.Errorf("vendorID:%d不是多门店平台", vendorID)
|
return "", fmt.Errorf("vendorID:%d不是多门店平台", vendorID)
|
||||||
@@ -578,7 +678,7 @@ func FullSyncVendorStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
|
|||||||
step := batchItemList[0].(int)
|
step := batchItemList[0].(int)
|
||||||
switch step {
|
switch step {
|
||||||
case 0:
|
case 0:
|
||||||
_, err = amendAndPruneVendorStuff(ctx, task, vendorID, vendorOrgCode, false, isContinueWhenError, AmendPruneAll, false)
|
_, err = amendAndPruneVendorStuff(ctx, task, storeID, vendorID, vendorOrgCode, false, isContinueWhenError, AmendPruneAll, false)
|
||||||
case 1:
|
case 1:
|
||||||
_, err = SyncCategories(ctx, task, []int{vendorID}, []string{vendorOrgCode}, nil, false)
|
_, err = SyncCategories(ctx, task, []int{vendorID}, []string{vendorOrgCode}, nil, false)
|
||||||
case 2:
|
case 2:
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func OpenRemoteStoreByJxStatus(ctx *jxcontext.Context, vendorIDs, storeIDs []int
|
|||||||
if !isForce {
|
if !isForce {
|
||||||
status = model.StoreStatusClosed
|
status = model.StoreStatusClosed
|
||||||
}
|
}
|
||||||
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, nil, status, model.StoreIsSyncYes, "")
|
storeMapList, err := dao.GetStoresMapList(db, vendorIDs, storeIDs, nil, status, model.StoreIsSyncYes, "", "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -34,7 +34,7 @@ func OpenRemoteStoreByJxStatus(ctx *jxcontext.Context, vendorIDs, storeIDs []int
|
|||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
storeMap := batchItemList[0].(*model.StoreMap)
|
storeMap := batchItemList[0].(*model.StoreMap)
|
||||||
if handler, _ := partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.IStoreHandler); handler != nil {
|
if handler, _ := partner.GetPurchasePlatformFromVendorID(storeMap.VendorID).(partner.IStoreHandler); handler != nil {
|
||||||
storeDetail, err := dao.GetStoreDetail(db, storeMap.StoreID, storeMap.VendorID)
|
storeDetail, err := dao.GetStoreDetail(db, storeMap.StoreID, storeMap.VendorID, "")
|
||||||
if err == nil && storeDetail.Status == model.StoreStatusOpened {
|
if err == nil && storeDetail.Status == model.StoreStatusOpened {
|
||||||
if err = handler.UpdateStoreStatus(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, model.StoreStatusOpened); err == nil {
|
if err = handler.UpdateStoreStatus(ctx, storeMap.VendorOrgCode, storeMap.StoreID, storeMap.VendorStoreID, model.StoreStatusOpened); err == nil {
|
||||||
storeMap.Status = model.StoreStatusOpened
|
storeMap.Status = model.StoreStatusOpened
|
||||||
|
|||||||
@@ -71,6 +71,9 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
|
|||||||
handler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
handler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
||||||
num := 0
|
num := 0
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
|
if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie2", model.ConfigTypeCookie, ""); err == nil {
|
||||||
|
api.JdShop2API.SetCookieWithStr(configs[0].Value)
|
||||||
|
}
|
||||||
rootTask := tasksch.NewSeqTask(fmt.Sprintf("%s SyncStoreCategory step1", model.VendorChineseNames[vendorID]), ctx,
|
rootTask := tasksch.NewSeqTask(fmt.Sprintf("%s SyncStoreCategory step1", model.VendorChineseNames[vendorID]), ctx,
|
||||||
func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
func(rootTask *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||||
level := step + 1
|
level := step + 1
|
||||||
@@ -78,7 +81,7 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
|
|||||||
if len(catList) > 0 {
|
if len(catList) > 0 {
|
||||||
num += len(catList)
|
num += len(catList)
|
||||||
task := tasksch.NewParallelTask(fmt.Sprintf("%s SyncStoreCategory step2, level=%d", model.VendorChineseNames[vendorID], level),
|
task := tasksch.NewParallelTask(fmt.Sprintf("%s SyncStoreCategory step2, level=%d", model.VendorChineseNames[vendorID], level),
|
||||||
tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[vendorID])}
|
updateFields := []string{dao.GetSyncStatusStructField(model.VendorNames[vendorID])}
|
||||||
idFieldName := dao.GetVendorThingIDStructField(model.VendorNames[vendorID])
|
idFieldName := dao.GetVendorThingIDStructField(model.VendorNames[vendorID])
|
||||||
@@ -91,6 +94,16 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if vendorID == model.VendorIDEBAI && catInfo.VendorOrgCode == "34665" && catInfo.CityCode == 510100 && catInfo.IsExdSync == 0 {
|
||||||
|
catInfo.Name = catInfo.ExdName
|
||||||
|
catInfo.Seq = catInfo.ExdSeq
|
||||||
|
}
|
||||||
|
if vendorID != model.VendorIDJD && vendorID != model.VendorIDJDShop {
|
||||||
|
if catInfo.IsSysCat == model.YES && catInfo.StoreCatID != 0 {
|
||||||
|
catInfo.Name = catInfo.StoreCatName
|
||||||
|
catInfo.Seq = catInfo.StoreCatSeq
|
||||||
|
}
|
||||||
|
}
|
||||||
if model.IsSyncStatusDelete(catInfo.CatSyncStatus) { // 删除
|
if model.IsSyncStatusDelete(catInfo.CatSyncStatus) { // 删除
|
||||||
if model.IsSyncStatusDelete(catInfo.CatSyncStatus) && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) {
|
if model.IsSyncStatusDelete(catInfo.CatSyncStatus) && !dao.IsVendorThingIDEmpty(catInfo.VendorCatID) {
|
||||||
err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, catInfo.VendorCatID, level)
|
err = handler.DeleteStoreCategory(ctx, storeID, vendorStoreID, catInfo.VendorCatID, level)
|
||||||
@@ -155,13 +168,13 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
|
|||||||
return hint, err
|
return hint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func SyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, vendorID, storeID int, vendorStoreID string, nameIDs, skuIDs, excludeSkuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
func SyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, vendorID, storeID int, vendorStoreID, vendorOrgCode string, nameIDs, skuIDs, excludeSkuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||||
return SyncStoreSkuNew2(ctx, parentTask, causeFlag, vendorID, storeID, vendorStoreID, nameIDs, skuIDs, excludeSkuIDs, false, isAsync, isContinueWhenError)
|
return SyncStoreSkuNew2(ctx, parentTask, causeFlag, vendorID, storeID, vendorStoreID, vendorOrgCode, nameIDs, skuIDs, excludeSkuIDs, false, isAsync, isContinueWhenError)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SyncStoreSkuNew2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, vendorID, storeID int, vendorStoreID string, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isAsync, isContinueWhenError bool) (hint string, err error) {
|
func SyncStoreSkuNew2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, vendorID, storeID int, vendorStoreID, vendorOrgCode string, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||||
singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
||||||
if singleStoreHandler != nil {
|
if singleStoreHandler != nil && vendorID != model.VendorIDJDShop {
|
||||||
if err = CreateStoreCategoryByStoreSku(ctx, vendorID, storeID, vendorStoreID, nameIDs, skuIDs); err != nil {
|
if err = CreateStoreCategoryByStoreSku(ctx, vendorID, storeID, vendorStoreID, nameIDs, skuIDs); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -170,11 +183,11 @@ func SyncStoreSkuNew2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFla
|
|||||||
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) {
|
||||||
switch step {
|
switch step {
|
||||||
case 0:
|
case 0:
|
||||||
if singleStoreHandler != nil {
|
if singleStoreHandler != nil && vendorID != model.VendorIDJDShop {
|
||||||
_, err = SyncStoreCategories(ctx, task, vendorID, storeID, vendorStoreID, nameIDs, skuIDs, false, isContinueWhenError)
|
_, err = SyncStoreCategories(ctx, task, vendorID, storeID, vendorStoreID, nameIDs, skuIDs, false, isContinueWhenError)
|
||||||
}
|
}
|
||||||
case 1:
|
case 1:
|
||||||
err = syncStoreSkuNew(ctx, task, causeFlag, false, vendorID, storeID, nameIDs, skuIDs, excludeSkuIDs, useVendorPriceDirectly, isContinueWhenError)
|
err = syncStoreSkuNew(ctx, task, causeFlag, false, vendorID, storeID, vendorOrgCode, nameIDs, skuIDs, excludeSkuIDs, useVendorPriceDirectly, isContinueWhenError)
|
||||||
}
|
}
|
||||||
return result, err
|
return result, err
|
||||||
}, 2)
|
}, 2)
|
||||||
@@ -196,15 +209,15 @@ func FullSyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
|
|||||||
case 0:
|
case 0:
|
||||||
if singleStoreHandler != nil {
|
if singleStoreHandler != nil {
|
||||||
// _, err = ClearRemoteStoreStuffAndSetNew(ctx, task, vendorID, storeID, vendorStoreID, false, isContinueWhenError)
|
// _, err = ClearRemoteStoreStuffAndSetNew(ctx, task, vendorID, storeID, vendorStoreID, false, isContinueWhenError)
|
||||||
_, err = amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, false, isContinueWhenError, AmendPruneAll, true)
|
_, err = amendAndPruneStoreStuff(ctx, parentTask, vendorID, storeID, vendorStoreID, false, isContinueWhenError, AmendPruneAll, false)
|
||||||
} else {
|
} else {
|
||||||
_, err = dao.SetStoreSkuSyncStatus(dao.GetDB(), vendorID, []int{storeID}, nil, model.SyncFlagStoreSkuOnlyMask)
|
_, err = dao.SetStoreSkuSyncStatus(dao.GetDB(), vendorID, []int{storeID}, nil, model.SyncFlagStoreSkuOnlyMask)
|
||||||
}
|
}
|
||||||
case 1:
|
case 1:
|
||||||
if singleStoreHandler != nil {
|
if singleStoreHandler != nil {
|
||||||
_, err = SyncStoreSkuNew(ctx, task, 0, vendorID, storeID, vendorStoreID, nil, nil, excludeSkuIDs, false, isContinueWhenError)
|
_, err = SyncStoreSkuNew(ctx, task, 0, vendorID, storeID, vendorStoreID, "", nil, nil, excludeSkuIDs, false, isContinueWhenError)
|
||||||
} else {
|
} else {
|
||||||
err = syncStoreSkuNew(ctx, task, 0, true, vendorID, storeID, nil, nil, excludeSkuIDs, false, isContinueWhenError)
|
err = syncStoreSkuNew(ctx, task, 0, true, vendorID, storeID, "", nil, nil, excludeSkuIDs, false, isContinueWhenError)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return retVal, err
|
return retVal, err
|
||||||
@@ -219,9 +232,16 @@ func FullSyncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
|
|||||||
}
|
}
|
||||||
|
|
||||||
func isStoreSkuSyncNeedDelete(storeSku *dao.StoreSkuSyncInfo) bool {
|
func isStoreSkuSyncNeedDelete(storeSku *dao.StoreSkuSyncInfo) bool {
|
||||||
return model.IsSyncStatusDelete(storeSku.SkuSyncStatus) ||
|
if model.IsSyncStatusDelete(storeSku.SkuSyncStatus) ||
|
||||||
storeSku.BindDeletedAt != utils.DefaultTimeValue || storeSku.BindID == 0 ||
|
storeSku.BindDeletedAt != utils.DefaultTimeValue || storeSku.BindID == 0 ||
|
||||||
storeSku.NameID == 0 || storeSku.NameStatus != model.SkuStatusNormal || storeSku.Status != model.SkuStatusNormal
|
storeSku.NameID == 0 || storeSku.NameStatus != model.SkuStatusNormal {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// if storeSku.Status != model.SkuStatusNormal {
|
||||||
|
// storeSku.IsDeletedBySku = true
|
||||||
|
// return true
|
||||||
|
// }
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSkuInfo) {
|
func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSkuInfo) {
|
||||||
@@ -237,10 +257,14 @@ func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSk
|
|||||||
JxPrice: inSku.Price,
|
JxPrice: inSku.Price,
|
||||||
JxUnitPrice: inSku.UnitPrice,
|
JxUnitPrice: inSku.UnitPrice,
|
||||||
VendorSkuID2: utils.Int64ToStr(inSku.JdsWareID),
|
VendorSkuID2: utils.Int64ToStr(inSku.JdsWareID),
|
||||||
|
JdsStockSwitch: inSku.JdsStockSwitch,
|
||||||
|
IsDeletedBySku: inSku.IsDeletedBySku,
|
||||||
|
Stock: inSku.Stock,
|
||||||
|
VendorOrgCode: inSku.VendorOrgCode,
|
||||||
}
|
}
|
||||||
if !isStoreSkuSyncNeedDelete(inSku) {
|
// if !isStoreSkuSyncNeedDelete(inSku) {
|
||||||
outSku.Stock = model.MaxStoreSkuStockQty
|
// outSku.Stock = model.MaxStoreSkuStockQty
|
||||||
}
|
// }
|
||||||
return outSku
|
return outSku
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,15 +285,6 @@ func getSkuBoxFee(vendorID int) (boxFee int64) {
|
|||||||
return boxFee
|
return boxFee
|
||||||
}
|
}
|
||||||
|
|
||||||
func formalizeStoreSkuListForJds(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyncInfo {
|
|
||||||
if len(inSkuList) > 0 {
|
|
||||||
for _, skuItem := range inSkuList {
|
|
||||||
skuItem.SkuName = jxutils.ComposeSkuNameSync2(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return inSkuList
|
|
||||||
}
|
|
||||||
|
|
||||||
func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyncInfo {
|
func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyncInfo {
|
||||||
if len(inSkuList) > 0 {
|
if len(inSkuList) > 0 {
|
||||||
boxFee := getSkuBoxFee(inSkuList[0].VendorID)
|
boxFee := getSkuBoxFee(inSkuList[0].VendorID)
|
||||||
@@ -277,8 +292,31 @@ func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyn
|
|||||||
if skuItem.VendorPrice > skuItem.BoxFee {
|
if skuItem.VendorPrice > skuItem.BoxFee {
|
||||||
skuItem.BoxFee = boxFee
|
skuItem.BoxFee = boxFee
|
||||||
}
|
}
|
||||||
|
//如果商品上绑定了映射,就用商品上的
|
||||||
|
if skuItem.SkuVendorMapCatID != "" {
|
||||||
|
skuItem.VendorVendorCatID = utils.Str2Int64(skuItem.SkuVendorMapCatID)
|
||||||
|
}
|
||||||
skuItem.MergedStatus = jxutils.MergeSkuStatus(jxutils.MergeSkuStatus(skuItem.NameStatus, skuItem.Status), skuItem.StoreSkuStatus)
|
skuItem.MergedStatus = jxutils.MergeSkuStatus(jxutils.MergeSkuStatus(skuItem.NameStatus, skuItem.Status), skuItem.StoreSkuStatus)
|
||||||
skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
|
//美团的商品名字非标品中间不能有 ‘约’
|
||||||
|
if skuItem.VendorID == model.VendorIDMTWM {
|
||||||
|
skuItem.SkuName = jxutils.ComposeSkuNameSync2(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd, (skuItem.BrandID == skuItem.ExBrandID && skuItem.ExBrandID != 0) || skuItem.ExBrandID == 0)
|
||||||
|
} else {
|
||||||
|
skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd, (skuItem.BrandID == skuItem.ExBrandID && skuItem.ExBrandID != 0) || skuItem.ExBrandID == 0)
|
||||||
|
}
|
||||||
|
skuItem.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0)
|
||||||
|
// if skuItem.ImgWatermark != "" && model.IsSyncStatusUpdate(skuItem.SkuSyncStatus) && skuItem.VendorID != model.VendorIDJD {
|
||||||
|
if skuItem.VendorID == model.VendorIDJD {
|
||||||
|
skuItem.ImgMix = ""
|
||||||
|
}
|
||||||
|
// if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) == 0 {
|
||||||
|
// // if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*skuItem.ExPrefixEnd) <= 0 {
|
||||||
|
// downLoad, _ := uploadImgStandard(skuItem.ImgWatermark)
|
||||||
|
// skuItem.ImgMix = jxutils.MixWatermarkImg(skuItem.ImgWatermark, skuItem.ImgOrigin, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd)
|
||||||
|
// }
|
||||||
|
// if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixEnd) > 0 {
|
||||||
|
// skuItem.ImgMix = ""
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return inSkuList
|
return inSkuList
|
||||||
@@ -294,13 +332,13 @@ func sku2Update(vendorID int, sku *dao.StoreSkuSyncInfo, syncStatus int8) (item
|
|||||||
sku.SkuSyncStatus = 0
|
sku.SkuSyncStatus = 0
|
||||||
kvs[dao.GetVendorThingIDStructField(model.VendorNames[vendorID])] = utils.Str2Int64WithDefault(sku.VendorSkuID, 0)
|
kvs[dao.GetVendorThingIDStructField(model.VendorNames[vendorID])] = utils.Str2Int64WithDefault(sku.VendorSkuID, 0)
|
||||||
} else if model.IsSyncStatusDelete(syncStatus) {
|
} else if model.IsSyncStatusDelete(syncStatus) {
|
||||||
sku.SkuSyncStatus = 0
|
|
||||||
if utils.IsTimeZero(sku.BindDeletedAt) && (sku.NameID == 0) {
|
if utils.IsTimeZero(sku.BindDeletedAt) && (sku.NameID == 0) {
|
||||||
kvs[model.FieldDeletedAt] = time.Now()
|
kvs[model.FieldDeletedAt] = time.Now()
|
||||||
}
|
}
|
||||||
if !dao.IsVendorThingIDEmpty(sku.VendorSkuID) && !partner.IsMultiStore(vendorID) {
|
if !dao.IsVendorThingIDEmpty(sku.VendorSkuID) && !partner.IsMultiStore(vendorID) {
|
||||||
kvs[dao.GetVendorThingIDStructField(model.VendorNames[vendorID])] = 0
|
kvs[dao.GetVendorThingIDStructField(model.VendorNames[vendorID])] = 0
|
||||||
}
|
}
|
||||||
|
sku.SkuSyncStatus = sku.SkuSyncStatus & model.SyncFlagNewMask
|
||||||
} else {
|
} else {
|
||||||
sku.SkuSyncStatus = sku.SkuSyncStatus & model.SyncFlagPriceMask
|
sku.SkuSyncStatus = sku.SkuSyncStatus & model.SyncFlagPriceMask
|
||||||
}
|
}
|
||||||
@@ -380,10 +418,10 @@ func isSkuLockTimeValid(sku *dao.StoreSkuSyncInfo) bool {
|
|||||||
return sku.LockTime != nil && time.Now().Sub(*sku.LockTime) < 0
|
return sku.LockTime != nil && time.Now().Sub(*sku.LockTime) < 0
|
||||||
}
|
}
|
||||||
|
|
||||||
func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, isFull bool, vendorID, storeID int, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isContinueWhenError bool) (err error) {
|
func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, isFull bool, vendorID, storeID int, vendorOrgCode string, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isContinueWhenError bool) (err error) {
|
||||||
globals.SugarLogger.Debugf("syncStoreSkuNew causeFlag:%d", causeFlag)
|
globals.SugarLogger.Debugf("syncStoreSkuNew causeFlag:%d ,vendorOrgCode:%s", causeFlag, vendorOrgCode)
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID)
|
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID, vendorOrgCode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -397,6 +435,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
if err != nil || len(skus) == 0 {
|
if err != nil || len(skus) == 0 {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
globals.SugarLogger.Debugf("syncStoreSkuNew len(skus):%v", len(skus))
|
||||||
if len(excludeSkuIDs) > 0 {
|
if len(excludeSkuIDs) > 0 {
|
||||||
excludeSkuMap := jxutils.IntList2Map(excludeSkuIDs)
|
excludeSkuMap := jxutils.IntList2Map(excludeSkuIDs)
|
||||||
var skus2 []*dao.StoreSkuSyncInfo
|
var skus2 []*dao.StoreSkuSyncInfo
|
||||||
@@ -413,7 +452,6 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
// if vendorID == model.VendorIDJDShop {
|
// if vendorID == model.VendorIDJDShop {
|
||||||
// formalizeStoreSkuListForJds(skus)
|
// formalizeStoreSkuListForJds(skus)
|
||||||
// }
|
// }
|
||||||
|
|
||||||
singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
singleStoreHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler)
|
||||||
storeSkuHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler)
|
storeSkuHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler)
|
||||||
reorderHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IStoreSkuSorter)
|
reorderHandler, _ := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IStoreSkuSorter)
|
||||||
@@ -431,11 +469,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
now := jxutils.OperationTime2HourMinuteFormat(time.Now())
|
now := jxutils.OperationTime2HourMinuteFormat(time.Now())
|
||||||
var failedList []*partner.StoreSkuInfoWithErr
|
var failedList []*partner.StoreSkuInfoWithErr
|
||||||
for _, sku := range skus {
|
for _, sku := range skus {
|
||||||
if vendorID == model.VendorIDJDShop && storeID != model.JdShopMainStoreID {
|
globals.SugarLogger.Debugf("syncStoreSkuNew sku sync:%v", sku.SkuSyncStatus)
|
||||||
if sku.SkuSyncStatus != 0 {
|
|
||||||
sku.SkuSyncStatus = model.SyncFlagSaleMask
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !useVendorPriceDirectly &&
|
if !useVendorPriceDirectly &&
|
||||||
!isSkuLockTimeValid(sku) {
|
!isSkuLockTimeValid(sku) {
|
||||||
sku.VendorPrice = 0
|
sku.VendorPrice = 0
|
||||||
@@ -450,6 +484,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
if !dao.IsVendorThingIDEmpty(sku.VendorSkuID) {
|
if !dao.IsVendorThingIDEmpty(sku.VendorSkuID) {
|
||||||
bareSku = storeSkuSyncInfo2Bare(sku)
|
bareSku = storeSkuSyncInfo2Bare(sku)
|
||||||
if singleStoreHandler == nil {
|
if singleStoreHandler == nil {
|
||||||
|
bareSku.Stock = 0
|
||||||
stockList = append(stockList, bareSku)
|
stockList = append(stockList, bareSku)
|
||||||
} else {
|
} else {
|
||||||
deleteList = append(deleteList, bareSku)
|
deleteList = append(deleteList, bareSku)
|
||||||
@@ -476,9 +511,9 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
} else {
|
} else {
|
||||||
if sku.MergedStatus == model.SkuStatusNormal {
|
if sku.MergedStatus == model.SkuStatusNormal {
|
||||||
if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop {
|
if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop {
|
||||||
globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d,但没有平台分类ID", storeID, sku.SkuID)
|
// globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d,但没有平台分类ID", storeID, sku.SkuID)
|
||||||
} else if dao.IsVendorThingIDEmpty(utils.Int64ToStr(sku.VendorVendorCatID)) && vendorID == model.VendorIDJDShop {
|
} else if dao.IsVendorThingIDEmpty(utils.Int64ToStr(sku.VendorVendorCatID)) && vendorID == model.VendorIDJDShop {
|
||||||
globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d,但没有映射的平台ID", storeID, sku.SkuID)
|
// globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d,但没有映射的平台ID", storeID, sku.SkuID)
|
||||||
} else {
|
} else {
|
||||||
createList = append(createList, sku)
|
createList = append(createList, sku)
|
||||||
}
|
}
|
||||||
@@ -502,7 +537,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
// 修改商品信息时不改价(以免活动引起的失败),而用单独的改价来改
|
// 修改商品信息时不改价(以免活动引起的失败),而用单独的改价来改
|
||||||
if (model.IsSyncStatusUpdate(sku.SkuSyncStatus) || (model.IsSyncStatusSeq(sku.SkuSyncStatus) && reorderHandler == nil)) && singleStoreHandler != nil {
|
if (model.IsSyncStatusUpdate(sku.SkuSyncStatus) || (model.IsSyncStatusSeq(sku.SkuSyncStatus) && reorderHandler == nil)) && singleStoreHandler != nil {
|
||||||
if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop {
|
if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop {
|
||||||
globals.SugarLogger.Warnf("syncStoreSkuNew 修改门店:%d商品:%d,但没有平台分类ID", storeID, sku.SkuID)
|
// globals.SugarLogger.Warnf("syncStoreSkuNew 修改门店:%d商品:%d,但没有平台分类ID", storeID, sku.SkuID)
|
||||||
} else {
|
} else {
|
||||||
isAdded2Update = true
|
isAdded2Update = true
|
||||||
updateList = append(updateList, calVendorPrice4StoreSku(sku, storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage)))
|
updateList = append(updateList, calVendorPrice4StoreSku(sku, storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage)))
|
||||||
@@ -514,10 +549,10 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
}
|
}
|
||||||
if !isAdded2Update {
|
if !isAdded2Update {
|
||||||
if model.IsSyncStatusUpdate(sku.SkuSyncStatus) && singleStoreHandler == nil { // 正常就不应该进到这里
|
if model.IsSyncStatusUpdate(sku.SkuSyncStatus) && singleStoreHandler == nil { // 正常就不应该进到这里
|
||||||
if bareSku == nil {
|
// if bareSku == nil {
|
||||||
bareSku = storeSkuSyncInfo2Bare(sku)
|
// bareSku = storeSkuSyncInfo2Bare(sku)
|
||||||
}
|
// }
|
||||||
updateItems = append(updateItems, sku2Update(vendorID, sku, model.SyncFlagStockMask))
|
// updateItems = append(updateItems, sku2Update(vendorID, sku, model.SyncFlagStockMask))
|
||||||
}
|
}
|
||||||
if model.IsSyncStatusSale(sku.SkuSyncStatus) {
|
if model.IsSyncStatusSale(sku.SkuSyncStatus) {
|
||||||
if bareSku == nil {
|
if bareSku == nil {
|
||||||
@@ -525,14 +560,22 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
}
|
}
|
||||||
if sku.MergedStatus == model.SkuStatusNormal {
|
if sku.MergedStatus == model.SkuStatusNormal {
|
||||||
onlineList = append(onlineList, bareSku)
|
onlineList = append(onlineList, bareSku)
|
||||||
stockList = append(stockList, bareSku)
|
// stockList = append(stockList, bareSku)
|
||||||
} else {
|
} else {
|
||||||
offlineList = append(offlineList, bareSku)
|
offlineList = append(offlineList, bareSku)
|
||||||
// 因为京东平台以是否有库存表示是否关注,所以不论是否可售,都要设置库存
|
// 因为京东平台以是否有库存表示是否关注,所以不论是否可售,都要设置库存
|
||||||
if singleStoreHandler == nil {
|
// if singleStoreHandler == nil {
|
||||||
|
// stockList = append(stockList, bareSku)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if model.IsSyncStatusStock(sku.SkuSyncStatus) {
|
||||||
|
if bareSku == nil {
|
||||||
|
bareSku = storeSkuSyncInfo2Bare(sku)
|
||||||
|
}
|
||||||
|
globals.SugarLogger.Debugf("syncStoreSkuNew sku stock sync:%v", sku.SkuSyncStatus)
|
||||||
stockList = append(stockList, bareSku)
|
stockList = append(stockList, bareSku)
|
||||||
}
|
globals.SugarLogger.Debugf("syncStoreSkuNew stock len:%v", len(stockList))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
isNeedReorder = model.IsSyncStatusSeq(sku.SkuSyncStatus)
|
isNeedReorder = model.IsSyncStatusSeq(sku.SkuSyncStatus)
|
||||||
@@ -607,7 +650,11 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
updateList = updateList[:]
|
updateList = updateList[:]
|
||||||
updateList = rList2
|
updateList = rList2
|
||||||
}
|
}
|
||||||
|
// if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie2", model.ConfigTypeCookie, ""); err == nil {
|
||||||
|
// api.JdShop2API.SetCookieWithStr(configs[0].Value)
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx,
|
task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx,
|
||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
step := batchItemList[0].(int)
|
step := batchItemList[0].(int)
|
||||||
@@ -665,6 +712,10 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
//handle error for sensitive words, if find, then insert to table sensitive_words
|
//handle error for sensitive words, if find, then insert to table sensitive_words
|
||||||
if sensitiveWord := GetSensitiveWord(singleStoreHandler, err.Error()); sensitiveWord != "" {
|
if sensitiveWord := GetSensitiveWord(singleStoreHandler, err.Error()); sensitiveWord != "" {
|
||||||
dao.InsertSensitiveWord(sensitiveWord, vendorID, ctx.GetUserName())
|
dao.InsertSensitiveWord(sensitiveWord, vendorID, ctx.GetUserName())
|
||||||
|
// words, _ := dao.GetSensitiveWordList(vendorID)
|
||||||
|
// word := words[0]
|
||||||
|
// word.Word = word.Word + "," + sensitiveWord
|
||||||
|
// dao.UpdateSensitiveWord(word, vendorID, 0, ctx.GetUserName())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
successList := putils.UnselectStoreSkuSyncListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
|
successList := putils.UnselectStoreSkuSyncListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
|
||||||
@@ -691,8 +742,8 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
}, ctx, task, updateList, singleStoreHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkus), isContinueWhenError2)
|
}, ctx, task, updateList, singleStoreHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkus), isContinueWhenError2)
|
||||||
}
|
}
|
||||||
case 3:
|
case 3:
|
||||||
for k, list := range [][]*partner.StoreSkuInfo{stockList /*, onlineList*/} {
|
// for k, list := range [][]*partner.StoreSkuInfo{stockList /*, onlineList*/} {
|
||||||
if len(list) > 0 {
|
if len(stockList) > 0 {
|
||||||
_, err = putils.FreeBatchStoreSkuInfo("更新门店商品库存", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
_, err = putils.FreeBatchStoreSkuInfo("更新门店商品库存", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||||
var failedList []*partner.StoreSkuInfoWithErr
|
var failedList []*partner.StoreSkuInfoWithErr
|
||||||
failedList, err = storeSkuHandler.UpdateStoreSkusStock(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
|
failedList, err = storeSkuHandler.UpdateStoreSkusStock(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
|
||||||
@@ -701,13 +752,13 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
task.AddFailedList(failedList)
|
task.AddFailedList(failedList)
|
||||||
}
|
}
|
||||||
successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
|
successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
|
||||||
if k == 0 && len(successList) > 0 {
|
if len(successList) > 0 {
|
||||||
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagStockMask)
|
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagStockMask)
|
||||||
}
|
}
|
||||||
return nil, len(successList), err
|
return nil, len(successList), err
|
||||||
}, ctx, task, list, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusStock), isContinueWhenError2)
|
}, ctx, task, stockList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusStock), isContinueWhenError2)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// }
|
||||||
case 4, 5:
|
case 4, 5:
|
||||||
statusList := onlineList
|
statusList := onlineList
|
||||||
status := model.SkuStatusNormal
|
status := model.SkuStatusNormal
|
||||||
@@ -865,7 +916,7 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v
|
|||||||
return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID])
|
return "", fmt.Errorf("平台:%s不支持此操作", model.VendorChineseNames[vendorID])
|
||||||
}
|
}
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID)
|
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
@@ -908,7 +959,6 @@ func amendAndPruneStoreStuff(ctx *jxcontext.Context, parentTask tasksch.ITask, v
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if opType == AmendPruneOnlyAmend || opType == AmendPruneAll {
|
if opType == AmendPruneOnlyAmend || opType == AmendPruneAll {
|
||||||
for _, v := range localSkuList {
|
for _, v := range localSkuList {
|
||||||
if !model.IsSyncStatusDelete(v.SkuSyncStatus) && v.BindID != 0 {
|
if !model.IsSyncStatusDelete(v.SkuSyncStatus) && v.BindID != 0 {
|
||||||
@@ -1322,7 +1372,7 @@ func SyncStoreSkuBindAct(ctx *jxcontext.Context, parentTask tasksch.ITask, isCre
|
|||||||
subTask := tasksch.NewParallelTask(fmt.Sprintf("%s门店:%d", taskName, storeID), nil, ctx,
|
subTask := tasksch.NewParallelTask(fmt.Sprintf("%s门店:%d", taskName, storeID), nil, ctx,
|
||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
vendorID := batchItemList[0].(int)
|
vendorID := batchItemList[0].(int)
|
||||||
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID)
|
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID, "")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if isCreate {
|
if isCreate {
|
||||||
err = createStoreSkuActs2(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, storeSkuMap[storeID][vendorID], storeSkuActMap[storeID][vendorID])
|
err = createStoreSkuActs2(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID, storeSkuMap[storeID][vendorID], storeSkuActMap[storeID][vendorID])
|
||||||
@@ -1400,6 +1450,7 @@ func changeList2Jds(list []*dao.StoreSkuSyncInfo) (rList []*dao.StoreSkuSyncInfo
|
|||||||
storeSku.DescImg = v[0].DescImg
|
storeSku.DescImg = v[0].DescImg
|
||||||
storeSku.JdsWareID = v[0].JdsWareID
|
storeSku.JdsWareID = v[0].JdsWareID
|
||||||
storeSku.CategoryName = v[0].CategoryName
|
storeSku.CategoryName = v[0].CategoryName
|
||||||
|
storeSku.VendorOrgCode = v[0].VendorOrgCode
|
||||||
rList = append(rList, storeSku)
|
rList = append(rList, storeSku)
|
||||||
}
|
}
|
||||||
return rList
|
return rList
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ func getStoreSkus(db *dao.DaoDB, storeID int, skuIDs []int) (skus []*dao.StoreSk
|
|||||||
func SyncStoreSku4FakeJD(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, inSkuMap map[int]string, isContinueWhenError bool) (err error) {
|
func SyncStoreSku4FakeJD(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, inSkuMap map[int]string, isContinueWhenError bool) (err error) {
|
||||||
vendorID := model.VendorIDJD
|
vendorID := model.VendorIDJD
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID)
|
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -227,7 +227,7 @@ func TryAddStoreBossRole4User(ctx *jxcontext.Context, user *model.User) (err err
|
|||||||
if user.Type&model.UserTypeStoreBoss != 0 {
|
if user.Type&model.UserTypeStoreBoss != 0 {
|
||||||
userMobile := user.GetMobile()
|
userMobile := user.GetMobile()
|
||||||
if userMobile != "" {
|
if userMobile != "" {
|
||||||
if storeList, err := dao.GetStoreList(dao.GetDB(), nil, nil, nil, []string{userMobile}, ""); err == nil && len(storeList) > 0 {
|
if storeList, err := dao.GetStoreList(dao.GetDB(), nil, nil, nil, nil, []string{userMobile}, ""); err == nil && len(storeList) > 0 {
|
||||||
roleList := make([]*authz.RoleInfo, len(storeList))
|
roleList := make([]*authz.RoleInfo, len(storeList))
|
||||||
for k, v := range storeList {
|
for k, v := range storeList {
|
||||||
roleList[k] = autils.NewStoreBossRole(v.ID)
|
roleList[k] = autils.NewStoreBossRole(v.ID)
|
||||||
@@ -778,12 +778,18 @@ func LoadUserCart(ctx *jxcontext.Context, userID string, storeIDs []int) (cartIt
|
|||||||
return cartItems, err
|
return cartItems, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetSelfInfo(ctx *jxcontext.Context) (user *model.User, err error) {
|
func GetSelfInfo(ctx *jxcontext.Context) (getSelfInfoResult *dao.GetSelfInfoResult, err error) {
|
||||||
tokenInfo, err := auth2.GetTokenInfo(ctx.GetToken())
|
tokenInfo, err := auth2.GetTokenInfo(ctx.GetToken())
|
||||||
if err == nil {
|
if err == nil {
|
||||||
user, err = dao.GetUserByID(dao.GetDB(), "user_id", tokenInfo.GetID())
|
if getSelfInfoResult, err = dao.GetUserByIDWithMembers(dao.GetDB(), "user_id", tokenInfo.GetID()); err == nil {
|
||||||
|
if userMembers, err3 := dao.GetUserMember(dao.GetDB(), getSelfInfoResult.UserID, "", 0, model.YES); err3 == nil {
|
||||||
|
getSelfInfoResult.UserMembers = userMembers
|
||||||
|
} else {
|
||||||
|
err = err3
|
||||||
}
|
}
|
||||||
return user, err
|
}
|
||||||
|
}
|
||||||
|
return getSelfInfoResult, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func HandleUserWXRemark(db *dao.DaoDB, mobile string, mobileIsUerID bool) (err error) {
|
func HandleUserWXRemark(db *dao.DaoDB, mobile string, mobileIsUerID bool) (err error) {
|
||||||
@@ -1124,3 +1130,34 @@ func CleanUserOrderSMSMark(ctx *jxcontext.Context) (err error) {
|
|||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RefreshUserMemberStatus(ctx *jxcontext.Context) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
userMembers, err := dao.GetUserMember(db, "", "", model.MemberTypeDiscountCard, -1)
|
||||||
|
for _, userMember := range userMembers {
|
||||||
|
if time.Now().Sub(userMember.EndAt) > 0 {
|
||||||
|
userMember.DeletedAt = time.Now()
|
||||||
|
dao.UpdateEntity(db, userMember, "DeletedAt")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateUserLastInfo(ctx *jxcontext.Context, storeID, brandID int) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
if user, err := dao.GetUserByID(db, "user_id", ctx.GetUserID()); err == nil {
|
||||||
|
if storeID != 0 {
|
||||||
|
user.LastStoreID = storeID
|
||||||
|
_, err = dao.UpdateEntity(db, user, "LastStoreID")
|
||||||
|
}
|
||||||
|
if brandID != 0 {
|
||||||
|
user.LastBrandID = brandID
|
||||||
|
_, err = dao.UpdateEntity(db, user, "LastBrandID")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|||||||
261
business/jxstore/common/common.go
Normal file
261
business/jxstore/common/common.go
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/autonavi"
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Store4User struct {
|
||||||
|
model.ModelIDCULD
|
||||||
|
|
||||||
|
OriginalName string `orm:"-" json:"originalName"`
|
||||||
|
Name string `orm:"size(255)" json:"name"`
|
||||||
|
OpenTime1 int16 `json:"openTime1"` // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有
|
||||||
|
CloseTime1 int16 `json:"closeTime1"` // 格式同上
|
||||||
|
OpenTime2 int16 `json:"openTime2"` // 格式同上
|
||||||
|
CloseTime2 int16 `json:"closeTime2"` // 格式同上
|
||||||
|
Status int `json:"status"`
|
||||||
|
CityCode int `orm:"default(0);null" json:"cityCode"` // todo ?
|
||||||
|
DistrictCode int `orm:"default(0);null" json:"districtCode"` // todo ?
|
||||||
|
Address string `orm:"size(255)" json:"address"`
|
||||||
|
Tel1 string `orm:"size(32);index" json:"tel1"`
|
||||||
|
Tel2 string `orm:"size(32);index" json:"tel2"`
|
||||||
|
Lng int `json:"-"` // 乘了10的6次方
|
||||||
|
Lat int `json:"-"` // 乘了10的6次方
|
||||||
|
DeliveryRangeType int8 `json:"-"` // 参见相关常量定义
|
||||||
|
DeliveryRange string `orm:"type(text)" json:"-"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米
|
||||||
|
|
||||||
|
FloatLng float64 `json:"lng"`
|
||||||
|
FloatLat float64 `json:"lat"`
|
||||||
|
CityName string `json:"cityName"`
|
||||||
|
DistrictName string `json:"districtName"`
|
||||||
|
|
||||||
|
Distance int `json:"distance"`
|
||||||
|
WalkDistance int `json:"walkDistance"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Store4UserList []*Store4User
|
||||||
|
|
||||||
|
func (x Store4UserList) Len() int {
|
||||||
|
return len(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x Store4UserList) Less(i, j int) bool {
|
||||||
|
if x[i].Status != x[j].Status {
|
||||||
|
return x[i].Status > x[j].Status
|
||||||
|
}
|
||||||
|
if x[i].WalkDistance != x[j].WalkDistance {
|
||||||
|
return x[i].WalkDistance < x[j].WalkDistance
|
||||||
|
}
|
||||||
|
return x[i].Distance < x[j].Distance
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x Store4UserList) Swap(i, j int) {
|
||||||
|
x[i], x[j] = x[j], x[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetNearSupplyGoodsStoreByStoreID(ctx *jxcontext.Context, storeID int) (store *model.Store, err error) {
|
||||||
|
var (
|
||||||
|
stores []*model.Store
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
store2, _ := dao.GetStoreDetail(db, storeID, model.VendorIDJX, "")
|
||||||
|
if store2 == nil {
|
||||||
|
return nil, fmt.Errorf("该门店未绑定京西平台!storeID: %v", storeID)
|
||||||
|
}
|
||||||
|
if store2.IsSupplyGoods == model.YES {
|
||||||
|
return nil, fmt.Errorf("该门店已经是货源门店,无法从其他货源门店进货!storeID: %v", storeID)
|
||||||
|
}
|
||||||
|
sql := `
|
||||||
|
SELECT a.*
|
||||||
|
FROM store a
|
||||||
|
JOIN store_map b ON b.store_id = a.id
|
||||||
|
JOIN store c ON c.city_code = a.city_code AND c.id = ?
|
||||||
|
WHERE a.deleted_at = ?
|
||||||
|
AND b.deleted_at = ?
|
||||||
|
AND b.vendor_id = ?
|
||||||
|
AND b.is_supply_goods = ?
|
||||||
|
AND a.status = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
storeID,
|
||||||
|
utils.DefaultTimeValue, utils.DefaultTimeValue,
|
||||||
|
model.VendorIDJX, model.YES, model.StoreStatusOpened,
|
||||||
|
}
|
||||||
|
err = dao.GetRows(db, &stores, sql, sqlParams)
|
||||||
|
if len(stores) > 0 {
|
||||||
|
realDistance := float64(0)
|
||||||
|
for _, v := range stores {
|
||||||
|
distance := jxutils.EarthDistance(jxutils.IntCoordinate2Standard(v.Lng), jxutils.IntCoordinate2Standard(v.Lat), jxutils.IntCoordinate2Standard(store2.Lng), jxutils.IntCoordinate2Standard(store2.Lat))
|
||||||
|
if realDistance == 0 {
|
||||||
|
realDistance = distance
|
||||||
|
store = v
|
||||||
|
} else {
|
||||||
|
if realDistance > distance {
|
||||||
|
realDistance = distance
|
||||||
|
store = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return store, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreListByLocation(ctx *jxcontext.Context, lng, lat float64, maxRadius int, needWalkDistance, isJds bool, brandID int) (storeList []*Store4User, err error) {
|
||||||
|
const (
|
||||||
|
maxStoreCount4User = 5
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
sql string
|
||||||
|
sqlParams []interface{}
|
||||||
|
)
|
||||||
|
|
||||||
|
lng2, _ := jxutils.ConvertDistanceToLogLat(lng, lat, float64(maxRadius), 90)
|
||||||
|
_, lat2 := jxutils.ConvertDistanceToLogLat(lng, lat, float64(maxRadius), 0)
|
||||||
|
lng1 := lng - (lng2 - lng)
|
||||||
|
lat1 := lat - (lat2 - lat)
|
||||||
|
// globals.SugarLogger.Debugf("%f,%f,%f,%f\n", lng1, lng2, lat1, lat2)
|
||||||
|
if !isJds {
|
||||||
|
sql = `
|
||||||
|
SELECT t1.*,
|
||||||
|
city.name city_name
|
||||||
|
FROM store t1
|
||||||
|
JOIN place city ON city.code = t1.city_code
|
||||||
|
JOIN store_map sm ON sm.store_id = t1.id AND sm.vendor_id = ? AND sm.deleted_at = ? AND sm.status <> ?
|
||||||
|
WHERE t1.deleted_at = ? AND t1.status <> ? AND t1.lng > ? AND t1.lng < ? AND t1.lat > ? AND t1.lat < ?
|
||||||
|
AND sm.is_order <> ?
|
||||||
|
AND t1.id <> ?
|
||||||
|
`
|
||||||
|
sqlParams = append(sqlParams,
|
||||||
|
model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled,
|
||||||
|
utils.DefaultTimeValue, model.StoreStatusDisabled, jxutils.StandardCoordinate2Int(lng1), jxutils.StandardCoordinate2Int(lng2), jxutils.StandardCoordinate2Int(lat1), jxutils.StandardCoordinate2Int(lat2),
|
||||||
|
model.YES,
|
||||||
|
model.MatterStoreID,
|
||||||
|
)
|
||||||
|
if brandID != 0 {
|
||||||
|
sql += " AND t1.brand_id = ?"
|
||||||
|
sqlParams = append(sqlParams, brandID)
|
||||||
|
}
|
||||||
|
sql += `
|
||||||
|
ORDER BY t1.id
|
||||||
|
`
|
||||||
|
} else {
|
||||||
|
sql = `
|
||||||
|
SELECT t1.*,
|
||||||
|
city.name city_name
|
||||||
|
FROM store t1
|
||||||
|
JOIN place city ON city.code = t1.city_code
|
||||||
|
JOIN store_map sm ON sm.store_id = t1.id AND sm.vendor_id = ? AND sm.deleted_at = ? AND sm.status = ?
|
||||||
|
WHERE t1.deleted_at = ? AND t1.status = ? AND t1.lng > ? AND t1.lng < ? AND t1.lat > ? AND t1.lat < ?
|
||||||
|
AND sm.is_order <> ?
|
||||||
|
AND t1.id <> ?
|
||||||
|
ORDER BY t1.id
|
||||||
|
`
|
||||||
|
sqlParams = []interface{}{
|
||||||
|
model.VendorIDJDShop, utils.DefaultTimeValue, model.StoreStatusOpened,
|
||||||
|
utils.DefaultTimeValue, model.StoreStatusOpened, jxutils.StandardCoordinate2Int(lng1), jxutils.StandardCoordinate2Int(lng2), jxutils.StandardCoordinate2Int(lat1), jxutils.StandardCoordinate2Int(lat2),
|
||||||
|
model.YES,
|
||||||
|
model.MatterStoreID,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var storeList1 []*Store4User
|
||||||
|
if err = dao.GetRows(dao.GetDB(), &storeList1, sql, sqlParams...); err == nil {
|
||||||
|
var storeList2 []*Store4User
|
||||||
|
for _, v := range storeList1 {
|
||||||
|
distance := jxutils.Point2StoreDistance(lng, lat, v.Lng, v.Lat, v.DeliveryRangeType, v.DeliveryRange)
|
||||||
|
if distance > 0 || (lng == jxutils.IntCoordinate2Standard(v.Lng) && lat == jxutils.IntCoordinate2Standard(v.Lat)) {
|
||||||
|
v.Distance = distance
|
||||||
|
storeList2 = append(storeList2, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 为了审核用
|
||||||
|
if len(storeList2) == 0 {
|
||||||
|
sql2 := `
|
||||||
|
SELECT t1.*,
|
||||||
|
city.name city_name
|
||||||
|
FROM store t1
|
||||||
|
JOIN place city ON city.code = t1.city_code
|
||||||
|
WHERE t1.deleted_at = ? AND t1.id = ?
|
||||||
|
`
|
||||||
|
sqlParams2 := []interface{}{
|
||||||
|
// model.VendorIDJX, utils.DefaultTimeValue, model.StoreStatusDisabled,
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
// model.StoreStatusDisabled,
|
||||||
|
// jxutils.StandardCoordinate2Int(0),
|
||||||
|
// jxutils.StandardCoordinate2Int(10000),
|
||||||
|
// jxutils.StandardCoordinate2Int(0),
|
||||||
|
// jxutils.StandardCoordinate2Int(10000),
|
||||||
|
// model.YES,
|
||||||
|
102919, //商城模板店
|
||||||
|
}
|
||||||
|
dao.GetRows(dao.GetDB(), &storeList2, sql2, sqlParams2...)
|
||||||
|
// if len(storeList2) > 1 {
|
||||||
|
// storeList2 = storeList2[:1]
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果要求以步行距离来算
|
||||||
|
if needWalkDistance {
|
||||||
|
var coordList []*autonavi.Coordinate
|
||||||
|
for _, v := range storeList2 {
|
||||||
|
coordList = append(coordList, &autonavi.Coordinate{
|
||||||
|
Lng: v.FloatLng,
|
||||||
|
Lat: v.FloatLat,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if distanceList, err2 := api.AutonaviAPI.BatchWalkingDistance(lng, lat, coordList); err2 == nil {
|
||||||
|
for k, v := range storeList2 {
|
||||||
|
v.WalkDistance = int(distanceList[k])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil, err2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Sort(Store4UserList(storeList2))
|
||||||
|
storeList = storeList2
|
||||||
|
if len(storeList) > maxStoreCount4User {
|
||||||
|
storeList = storeList[:maxStoreCount4User]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return storeList, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetVendorOrgCode(ctx *jxcontext.Context, vendorID int, vendorOrgCode, vendorType string) (vendorOrgs []*model.VendorOrgCode, err error) {
|
||||||
|
return dao.GetVendorOrgCode(dao.GetDB(), vendorID, vendorOrgCode, vendorType)
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateVendorOrgCode(ctx *jxcontext.Context, ID int, payload map[string]interface{}) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
vendorOrgCode = &model.VendorOrgCode{}
|
||||||
|
)
|
||||||
|
vendorOrgCode.ID = ID
|
||||||
|
err = dao.GetEntity(db, vendorOrgCode)
|
||||||
|
valid := dao.StrictMakeMapByStructObject(payload, vendorOrgCode, ctx.GetUserName())
|
||||||
|
if len(valid) > 0 {
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if _, err = dao.UpdateEntityLogically(db, vendorOrgCode, valid, ctx.GetUserName(), nil); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -11,10 +11,8 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/jd"
|
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
"git.rosy.net.cn/jx-callback/globals/api"
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
"git.rosy.net.cn/jx-callback/globals/api/apimanager"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -149,9 +147,6 @@ func GetCheckVendorCookie(ctx *jxcontext.Context, vendorIDs []int, isAuto bool)
|
|||||||
errMsg = ""
|
errMsg = ""
|
||||||
)
|
)
|
||||||
for _, v := range vendorIDs {
|
for _, v := range vendorIDs {
|
||||||
appOrgCodeList := apimanager.CurAPIManager.GetAppOrgCodeList(v)
|
|
||||||
if len(appOrgCodeList) > 0 {
|
|
||||||
for _, vv := range appOrgCodeList {
|
|
||||||
cc := &CheckCookie{}
|
cc := &CheckCookie{}
|
||||||
var flag = false
|
var flag = false
|
||||||
switch v {
|
switch v {
|
||||||
@@ -159,60 +154,39 @@ func GetCheckVendorCookie(ctx *jxcontext.Context, vendorIDs []int, isAuto bool)
|
|||||||
resultMap, err := api.EbaiAPI.GetStoreOrderInfo(ebaiOrderID)
|
resultMap, err := api.EbaiAPI.GetStoreOrderInfo(ebaiOrderID)
|
||||||
if len(resultMap) < 1 && err != nil {
|
if len(resultMap) < 1 && err != nil {
|
||||||
if strings.Contains(err.Error(), ebaiErr) || strings.Contains(err.Error(), ebaiErr2) {
|
if strings.Contains(err.Error(), ebaiErr) || strings.Contains(err.Error(), ebaiErr2) {
|
||||||
errMsg += fmt.Sprintf(" 饿百账号:[%v]的Cookie无效了!", vv)
|
errMsg += fmt.Sprintf(" 饿百账号:[%v]的Cookie无效了!")
|
||||||
flag = true
|
flag = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// result, err := api.Ebai2API.GetEbaiDepotSku(ebaiapi.EbaiWholeCountryStore, "190700570")
|
|
||||||
// if err != nil || len(result) < 1 {
|
|
||||||
// cc := &CheckCookie{}
|
|
||||||
// cc.VendorID = v
|
|
||||||
// cc.VendorOrgCode = "饿百后台饿鲜达全国账号"
|
|
||||||
// cc.Status = "无效"
|
|
||||||
// ccList = append(ccList, cc)
|
|
||||||
// errMsg += fmt.Sprintf(" 饿百账号:[饿百后台饿鲜达全国账号]的Cookie无效了!", vv)
|
|
||||||
// flag = true
|
|
||||||
// }
|
|
||||||
// result2, err2 := api.EbaiAPI.GetExianDaSkuDepot("190600741")
|
|
||||||
// if err2 != nil || result2 == nil {
|
|
||||||
// cc := &CheckCookie{}
|
|
||||||
// cc.VendorID = v
|
|
||||||
// cc.VendorOrgCode = "饿鲜达供应链系统"
|
|
||||||
// cc.Status = "无效"
|
|
||||||
// ccList = append(ccList, cc)
|
|
||||||
// errMsg += fmt.Sprintf(" 饿百账号:[饿鲜达供应链系统]的Cookie无效了!", vv)
|
|
||||||
// flag = true
|
|
||||||
// }
|
|
||||||
case model.VendorIDMTWM:
|
case model.VendorIDMTWM:
|
||||||
_, err := api.MtwmAPI.PackagePriceGet(mtStoreID)
|
_, err := api.MtwmAPI.PackagePriceGet(mtStoreID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if strings.Contains(err.Error(), mtErr) {
|
if strings.Contains(err.Error(), mtErr) {
|
||||||
errMsg += fmt.Sprintf(" 美团账号:[%v]的Cookie无效了!", vv)
|
errMsg += fmt.Sprintf(" 美团账号:[%v]的Cookie无效了!")
|
||||||
flag = true
|
flag = true
|
||||||
}
|
}
|
||||||
globals.SugarLogger.Debugf("cookieCheck", err)
|
globals.SugarLogger.Debugf("cookieCheck", err)
|
||||||
}
|
}
|
||||||
case model.VendorIDJD:
|
case model.VendorIDJD:
|
||||||
result, err := jd.GetAPI(vv).GetJdUpcCodeByName("", jdUpcCode, 1, 5)
|
result, err := api.JdAPI.GetJdUpcCodeByName("", jdUpcCode, 1, 5)
|
||||||
if len(result) < 1 && err != nil {
|
if len(result) < 1 && err != nil {
|
||||||
if strings.Contains(err.Error(), jdErr) {
|
if strings.Contains(err.Error(), jdErr) {
|
||||||
errMsg += fmt.Sprintf(" 京东账号:[%v]的Cookie无效了!", vv)
|
errMsg += fmt.Sprintf(" 京东账号:[%v]的Cookie无效了!")
|
||||||
flag = true
|
flag = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result2, err2 := api.JdPageAPI.GetCorporationInfo("11926674", "92510108MA68KK3M8P")
|
case model.VendorIDJDShop:
|
||||||
if err2 != nil || result2 == nil {
|
_, err := api.JdShopAPI.OrderDetail("124350112427")
|
||||||
cc := &CheckCookie{}
|
if err != nil {
|
||||||
cc.VendorID = v
|
if strings.Contains(err.Error(), "登录") {
|
||||||
cc.VendorOrgCode = "京东page账号"
|
errMsg += fmt.Sprintf("京东商城:[%v]的Cookie无效了!")
|
||||||
cc.Status = "无效"
|
|
||||||
ccList = append(ccList, cc)
|
|
||||||
errMsg += fmt.Sprintf(" 京东page账号:的Cookie无效了!", vv)
|
|
||||||
flag = true
|
flag = true
|
||||||
}
|
}
|
||||||
|
globals.SugarLogger.Debugf("cookieCheck", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cc.VendorID = v
|
cc.VendorID = v
|
||||||
cc.VendorOrgCode = vv
|
cc.VendorOrgCode = ""
|
||||||
if flag {
|
if flag {
|
||||||
cc.Status = "无效"
|
cc.Status = "无效"
|
||||||
} else {
|
} else {
|
||||||
@@ -220,8 +194,6 @@ func GetCheckVendorCookie(ctx *jxcontext.Context, vendorIDs []int, isAuto bool)
|
|||||||
}
|
}
|
||||||
ccList = append(ccList, cc)
|
ccList = append(ccList, cc)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
if isAuto && errMsg != "" {
|
if isAuto && errMsg != "" {
|
||||||
globals.SugarLogger.Warnf("GetCheckVendorCookie:[%v]", errMsg)
|
globals.SugarLogger.Warnf("GetCheckVendorCookie:[%v]", errMsg)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/jdshop"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/jdapi"
|
"git.rosy.net.cn/baseapi/platformapi/jdapi"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx"
|
"git.rosy.net.cn/jx-callback/business/partner/purchase/jx/localjx"
|
||||||
@@ -43,10 +45,13 @@ var (
|
|||||||
"09:00:00",
|
"09:00:00",
|
||||||
}
|
}
|
||||||
dailyWorkTimeList = []string{
|
dailyWorkTimeList = []string{
|
||||||
"22:00:00",
|
"20:30:00",
|
||||||
|
}
|
||||||
|
dailyWorkTimeList2 = []string{
|
||||||
|
"02:00:00",
|
||||||
}
|
}
|
||||||
priceReferTimeList = []string{
|
priceReferTimeList = []string{
|
||||||
"01:00:00",
|
"03:00:00",
|
||||||
}
|
}
|
||||||
checkCookieList = []string{
|
checkCookieList = []string{
|
||||||
"08:00:00",
|
"08:00:00",
|
||||||
@@ -54,7 +59,7 @@ var (
|
|||||||
"18:00:00",
|
"18:00:00",
|
||||||
}
|
}
|
||||||
createStorePriceTimeList = []string{
|
createStorePriceTimeList = []string{
|
||||||
"02:00:00",
|
"04:00:00",
|
||||||
}
|
}
|
||||||
refreshPageActTimeList = []string{
|
refreshPageActTimeList = []string{
|
||||||
"7:00:00",
|
"7:00:00",
|
||||||
@@ -117,6 +122,7 @@ var (
|
|||||||
importantTaskMap = &sync.Map{}
|
importantTaskMap = &sync.Map{}
|
||||||
|
|
||||||
cancelPayTimeOutOrderList = localjx.GetHalfHoursList()
|
cancelPayTimeOutOrderList = localjx.GetHalfHoursList()
|
||||||
|
discountActJxList = localjx.GetDiscountActHoursList()
|
||||||
|
|
||||||
ebaiStorePageCookieExdTOKEN string
|
ebaiStorePageCookieExdTOKEN string
|
||||||
ebaiStorePageCookieWMUSS2 string
|
ebaiStorePageCookieWMUSS2 string
|
||||||
@@ -131,6 +137,7 @@ var (
|
|||||||
feiePageCookie string
|
feiePageCookie string
|
||||||
jdStorePageEarning string
|
jdStorePageEarning string
|
||||||
jdsCookie string
|
jdsCookie string
|
||||||
|
// jdsCookie2 string
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetImportantTaskID(taskName string) string {
|
func GetImportantTaskID(taskName string) string {
|
||||||
@@ -158,6 +165,17 @@ func Init() {
|
|||||||
if globals.IsProductEnv() {
|
if globals.IsProductEnv() {
|
||||||
ScheduleTimerFunc("doDailyWork", doDailyWork, dailyWorkTimeList)
|
ScheduleTimerFunc("doDailyWork", doDailyWork, dailyWorkTimeList)
|
||||||
|
|
||||||
|
ScheduleTimerFunc("doDailyWork2", doDailyWork2, dailyWorkTimeList2)
|
||||||
|
|
||||||
|
// ScheduleTimerFuncByInterval(func() {
|
||||||
|
// orderman.SaveJdsOrders(jxcontext.AdminCtx, time.Now().Add(-20*time.Minute), time.Now())
|
||||||
|
// }, 10*time.Second, 10*time.Minute)
|
||||||
|
|
||||||
|
//京东的订单信息解密密钥获取
|
||||||
|
ScheduleTimerFuncByInterval(func() {
|
||||||
|
jdshop.InitKey()
|
||||||
|
}, 10*time.Second, 8*time.Hour)
|
||||||
|
|
||||||
ScheduleTimerFuncByInterval(func() {
|
ScheduleTimerFuncByInterval(func() {
|
||||||
RefreshRealMobile(jxcontext.AdminCtx, model.VendorIDEBAI, time.Now().Add(-24*time.Hour), utils.DefaultTimeValue, false, true)
|
RefreshRealMobile(jxcontext.AdminCtx, model.VendorIDEBAI, time.Now().Add(-24*time.Hour), utils.DefaultTimeValue, false, true)
|
||||||
}, 5*time.Second, 1*time.Hour)
|
}, 5*time.Second, 1*time.Hour)
|
||||||
@@ -168,12 +186,12 @@ func Init() {
|
|||||||
|
|
||||||
ScheduleTimerFunc("auto enable remote store", func() {
|
ScheduleTimerFunc("auto enable remote store", func() {
|
||||||
cms.EnableHaveRestStores(jxcontext.AdminCtx, false, true)
|
cms.EnableHaveRestStores(jxcontext.AdminCtx, false, true)
|
||||||
cms.OpenRemoteStoreByJxStatus(jxcontext.AdminCtx, nil, nil, false, false, true)
|
// cms.OpenRemoteStoreByJxStatus(jxcontext.AdminCtx, nil, nil, false, false, true)
|
||||||
}, openRemoteStoreTimeList)
|
}, openRemoteStoreTimeList)
|
||||||
|
|
||||||
ScheduleTimerFunc("SaveAndSendAlarmVendorSnapshot", func() {
|
// ScheduleTimerFunc("SaveAndSendAlarmVendorSnapshot", func() {
|
||||||
cms.SaveAndSendAlarmVendorSnapshot(jxcontext.AdminCtx, nil, nil, false)
|
// cms.SaveAndSendAlarmVendorSnapshot(jxcontext.AdminCtx, nil, nil, false)
|
||||||
}, cms.WatchVendorStoreTimeList)
|
// }, cms.WatchVendorStoreTimeList)
|
||||||
|
|
||||||
ScheduleTimerFunc("RefreshPageActs", func() {
|
ScheduleTimerFunc("RefreshPageActs", func() {
|
||||||
act.RefreshPageActs(jxcontext.AdminCtx, []int{model.VendorIDEBAI}, time.Now().Add(-30*24*time.Hour), false)
|
act.RefreshPageActs(jxcontext.AdminCtx, []int{model.VendorIDEBAI}, time.Now().Add(-30*24*time.Hour), false)
|
||||||
@@ -196,7 +214,7 @@ func Init() {
|
|||||||
cms.AutoFocusStoreSkusForTopSkus(jxcontext.AdminCtx, true, true)
|
cms.AutoFocusStoreSkusForTopSkus(jxcontext.AdminCtx, true, true)
|
||||||
}, createStorePriceTimeList)
|
}, createStorePriceTimeList)
|
||||||
ScheduleTimerFunc("GetCheckVendorCookie", func() {
|
ScheduleTimerFunc("GetCheckVendorCookie", func() {
|
||||||
event.GetCheckVendorCookie(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM, model.VendorIDMTPS}, true)
|
event.GetCheckVendorCookie(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM, model.VendorIDMTPS, model.VendorIDJDShop}, true)
|
||||||
}, checkCookieList)
|
}, checkCookieList)
|
||||||
ScheduleTimerFunc("SendSeckillSkusCountMsg", func() {
|
ScheduleTimerFunc("SendSeckillSkusCountMsg", func() {
|
||||||
cms.SendSeckillSkusCountMsg(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM}, false, true)
|
cms.SendSeckillSkusCountMsg(jxcontext.AdminCtx, []int{model.VendorIDEBAI, model.VendorIDJD, model.VendorIDMTWM}, false, true)
|
||||||
@@ -222,26 +240,45 @@ func Init() {
|
|||||||
ScheduleTimerFunc("CleanUserOrderSMSMark", func() {
|
ScheduleTimerFunc("CleanUserOrderSMSMark", func() {
|
||||||
cms.CleanUserOrderSMSMark(jxcontext.AdminCtx)
|
cms.CleanUserOrderSMSMark(jxcontext.AdminCtx)
|
||||||
}, priceReferTimeList)
|
}, priceReferTimeList)
|
||||||
ScheduleTimerFunc("exSync", func() {
|
// ScheduleTimerFunc("exSync", func() {
|
||||||
var (
|
// var (
|
||||||
db = dao.GetDB()
|
// db = dao.GetDB()
|
||||||
storeList []int
|
// storeList []int
|
||||||
exSyncStoreIDList string
|
// exSyncStoreIDList string
|
||||||
syncFlag = 0
|
// syncFlag = 0
|
||||||
)
|
// )
|
||||||
syncFlag = model.SyncFlagPriceMask
|
// syncFlag = model.SyncFlagPriceMask
|
||||||
if (time.Now().Unix()/24*3600)%10 == 0 {
|
// if (time.Now().Unix()/24*3600)%10 == 0 {
|
||||||
syncFlag |= model.SyncFlagSaleMask
|
// syncFlag |= model.SyncFlagSaleMask
|
||||||
}
|
// }
|
||||||
if configs, err := dao.QueryConfigs(dao.GetDB(), "exSyncStoreIDList", model.ConfigTypeSys, ""); err == nil {
|
// if configs, err := dao.QueryConfigs(dao.GetDB(), "exSyncStoreIDList", model.ConfigTypeSys, ""); err == nil {
|
||||||
exSyncStoreIDList = configs[0].Value
|
// exSyncStoreIDList = configs[0].Value
|
||||||
}
|
// }
|
||||||
storeIDList := strings.Split(exSyncStoreIDList, ",")
|
// storeIDList := strings.Split(exSyncStoreIDList, ",")
|
||||||
for _, v := range storeIDList {
|
// for _, v := range storeIDList {
|
||||||
storeList = append(storeList, int(utils.Str2Int64(v)))
|
// storeList = append(storeList, int(utils.Str2Int64(v)))
|
||||||
}
|
// }
|
||||||
cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, partner.GetMultiStoreVendorIDs(), storeList, false, nil, []int{27379}, syncFlag, true, true)
|
// cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, partner.GetMultiStoreVendorIDs(), storeList, false, nil, []int{27379}, syncFlag, true, true)
|
||||||
}, exSyncList)
|
// }, exSyncList)
|
||||||
|
ScheduleTimerFunc("CreateOrderByPriceDefend", func() {
|
||||||
|
localjx.CreateOrderByPriceDefend(jxcontext.AdminCtx)
|
||||||
|
}, []string{
|
||||||
|
"22:00:00",
|
||||||
|
})
|
||||||
|
ScheduleTimerFunc("ChangeJxPriceByDiscountAct", func() {
|
||||||
|
act.ChangeJxPriceByDiscountAct(jxcontext.AdminCtx)
|
||||||
|
}, discountActJxList)
|
||||||
|
ScheduleTimerFunc("RefreshUserMemberStatus", func() {
|
||||||
|
cms.RefreshUserMemberStatus(jxcontext.AdminCtx)
|
||||||
|
}, updateActStatusTimeList)
|
||||||
|
//刷优惠券状态
|
||||||
|
ScheduleTimerFunc("RefreshCouponsStatus", func() {
|
||||||
|
localjx.RefreshCouponsStatus(jxcontext.AdminCtx)
|
||||||
|
}, updateActStatusTimeList)
|
||||||
|
//刷新美团商超门店Token
|
||||||
|
ScheduleTimerFunc("RefreshMTWMToken", func() {
|
||||||
|
cms.RefreshMTWMToken(jxcontext.AdminCtx)
|
||||||
|
}, updateActStatusTimeList)
|
||||||
}
|
}
|
||||||
ScheduleTimerFunc("AutoSaleStoreSku", func() {
|
ScheduleTimerFunc("AutoSaleStoreSku", func() {
|
||||||
cms.AutoSaleStoreSku(jxcontext.AdminCtx, nil, false)
|
cms.AutoSaleStoreSku(jxcontext.AdminCtx, nil, false)
|
||||||
@@ -261,6 +298,18 @@ func Init() {
|
|||||||
}, []string{
|
}, []string{
|
||||||
"04:05:06",
|
"04:05:06",
|
||||||
})
|
})
|
||||||
|
//京东的订单信息解密密钥获取
|
||||||
|
ScheduleTimerFuncByInterval(func() {
|
||||||
|
jdshop.InitKey()
|
||||||
|
}, 10*time.Second, 8*time.Hour)
|
||||||
|
ScheduleTimerFunc("ChangeJxPriceByDiscountAct", func() {
|
||||||
|
act.ChangeJxPriceByDiscountAct(jxcontext.AdminCtx)
|
||||||
|
}, discountActJxList)
|
||||||
|
ScheduleTimerFunc("CreateOrderByPriceDefend", func() {
|
||||||
|
localjx.CreateOrderByPriceDefend(jxcontext.AdminCtx)
|
||||||
|
}, []string{
|
||||||
|
"22:00:00",
|
||||||
|
})
|
||||||
}
|
}
|
||||||
if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieExdTOKEN", model.ConfigTypeCookie, ""); err == nil {
|
if configs, err := dao.QueryConfigs(dao.GetDB(), "ebaiStorePageCookieExdTOKEN", model.ConfigTypeCookie, ""); err == nil {
|
||||||
ebaiStorePageCookieExdTOKEN = configs[0].Value
|
ebaiStorePageCookieExdTOKEN = configs[0].Value
|
||||||
@@ -299,6 +348,9 @@ func Init() {
|
|||||||
jdsCookie = configs[0].Value
|
jdsCookie = configs[0].Value
|
||||||
api.JdShopAPI.SetCookieWithStr(jdsCookie)
|
api.JdShopAPI.SetCookieWithStr(jdsCookie)
|
||||||
}
|
}
|
||||||
|
if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie2", model.ConfigTypeCookie, ""); err == nil {
|
||||||
|
api.JdShop2API.SetCookieWithStr(configs[0].Value)
|
||||||
|
}
|
||||||
if configs, err := dao.QueryConfigs(dao.GetDB(), "yinbaoCookie", model.ConfigTypeCookie, ""); err == nil {
|
if configs, err := dao.QueryConfigs(dao.GetDB(), "yinbaoCookie", model.ConfigTypeCookie, ""); err == nil {
|
||||||
yinbaoCookie := configs[0].Value
|
yinbaoCookie := configs[0].Value
|
||||||
api.YinBaoAPI.SetCookie(".POSPALAUTH30220", yinbaoCookie)
|
api.YinBaoAPI.SetCookie(".POSPALAUTH30220", yinbaoCookie)
|
||||||
@@ -340,12 +392,12 @@ func syncStoreSku() {
|
|||||||
_, err = cms.CurVendorSync.LoopMultiStoresVendors(jxcontext.AdminCtx, db, "同步多门店平台商品库", false, true,
|
_, err = cms.CurVendorSync.LoopMultiStoresVendors(jxcontext.AdminCtx, db, "同步多门店平台商品库", false, true,
|
||||||
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
vendorInfo := batchItemList[0].(*cms.MultiStoreVendorInfo)
|
vendorInfo := batchItemList[0].(*cms.MultiStoreVendorInfo)
|
||||||
_, err = cms.FullSyncVendorStuff(jxcontext.AdminCtx, task, vendorInfo.VendorID, vendorInfo.OrgCode, false, true)
|
_, err = cms.FullSyncVendorStuff(jxcontext.AdminCtx, task, 0, vendorInfo.VendorID, vendorInfo.OrgCode, false, true)
|
||||||
return retVal, err
|
return retVal, err
|
||||||
})
|
})
|
||||||
errList.AddErr(err)
|
errList.AddErr(err)
|
||||||
|
|
||||||
_, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, partner.GetMultiStoreVendorIDs(), nil, false, nil, []int{27379}, syncFlag, true, true)
|
_, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{0}, nil, false, nil, []int{27379}, syncFlag, true, true)
|
||||||
// _, err = cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, db, partner.GetMultiStoreVendorIDs(), nil, false, []int{27379}, true, true)
|
// _, err = cms.CurVendorSync.FullSyncStoresSkus(jxcontext.AdminCtx, db, partner.GetMultiStoreVendorIDs(), nil, false, []int{27379}, true, true)
|
||||||
errList.AddErr(err)
|
errList.AddErr(err)
|
||||||
case 1:
|
case 1:
|
||||||
@@ -353,13 +405,13 @@ func syncStoreSku() {
|
|||||||
errList.AddErr(cms.SetSingleStoreSkuSyncModifyStatus(db, []int{1, 3}))
|
errList.AddErr(cms.SetSingleStoreSkuSyncModifyStatus(db, []int{1, 3}))
|
||||||
|
|
||||||
// errList.AddErr(cms.SetSingleStoreSkuSyncModifyStatus(db, partner.GetSingleStoreVendorIDs()))
|
// errList.AddErr(cms.SetSingleStoreSkuSyncModifyStatus(db, partner.GetSingleStoreVendorIDs()))
|
||||||
_, err = cms.CurVendorSync.AmendAndPruneStoreStuff(jxcontext.AdminCtx, []int{1, 3}, nil, false, true, cms.AmendPruneAll, false)
|
// _, err = cms.CurVendorSync.AmendAndPruneStoreStuff(jxcontext.AdminCtx, []int{1, 3}, nil, false, true, cms.AmendPruneAll, false)
|
||||||
|
|
||||||
// _, err = cms.CurVendorSync.AmendAndPruneStoreStuff(jxcontext.AdminCtx, partner.GetSingleStoreVendorIDs(), nil, false, true, cms.AmendPruneAll, false)
|
// _, err = cms.CurVendorSync.AmendAndPruneStoreStuff(jxcontext.AdminCtx, partner.GetSingleStoreVendorIDs(), nil, false, true, cms.AmendPruneAll, false)
|
||||||
errList.AddErr(err)
|
errList.AddErr(err)
|
||||||
|
|
||||||
SaveImportantTaskID(TaskNameSyncStoreSku, SpecialTaskID)
|
SaveImportantTaskID(TaskNameSyncStoreSku, SpecialTaskID)
|
||||||
taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{1, 3}, nil, false, nil, nil, syncFlag, true, true)
|
taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{1, 3, 5}, nil, false, nil, nil, syncFlag, true, true)
|
||||||
// taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, partner.GetSingleStoreVendorIDs(), nil, false, nil, nil, syncFlag, true, true)
|
// taskID, err2 := cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, partner.GetSingleStoreVendorIDs(), nil, false, nil, nil, syncFlag, true, true)
|
||||||
|
|
||||||
errList.AddErr(err2)
|
errList.AddErr(err2)
|
||||||
@@ -371,9 +423,23 @@ func syncStoreSku() {
|
|||||||
tasksch.HandleTask(task, nil, true).Run()
|
tasksch.HandleTask(task, nil, true).Run()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func doDailyWork2() {
|
||||||
|
globals.SugarLogger.Debug("doDailyWork2")
|
||||||
|
|
||||||
|
//同步京东商城门店的商品
|
||||||
|
cms.CurVendorSync.SyncJdsStoresSkus(jxcontext.AdminCtx, nil, true, true)
|
||||||
|
//刷新京东商城的门店库存
|
||||||
|
cms.SyncJdsStoreStock(jxcontext.AdminCtx, true, true)
|
||||||
|
//刷新京东商城订单结算价
|
||||||
|
orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, utils.Time2Str(time.Now().AddDate(0, 0, -2)), utils.Time2Str(time.Now()))
|
||||||
|
}
|
||||||
|
|
||||||
func doDailyWork() {
|
func doDailyWork() {
|
||||||
globals.SugarLogger.Debug("doDailyWork")
|
globals.SugarLogger.Debug("doDailyWork")
|
||||||
|
|
||||||
|
//同步商品额外前缀和水印图(打标记)
|
||||||
|
cms.SyncSkuExperfixAndWatermark(jxcontext.AdminCtx)
|
||||||
|
|
||||||
dao.SetStoresMapSyncStatus(dao.GetDB(), nil, nil, model.SyncFlagStoreStatus)
|
dao.SetStoresMapSyncStatus(dao.GetDB(), nil, nil, model.SyncFlagStoreStatus)
|
||||||
cms.CurVendorSync.SyncStore2(jxcontext.AdminCtx, dao.GetDB(), nil, nil, true, true)
|
cms.CurVendorSync.SyncStore2(jxcontext.AdminCtx, dao.GetDB(), nil, nil, true, true)
|
||||||
|
|
||||||
@@ -392,19 +458,36 @@ func doDailyWork() {
|
|||||||
//刷新京东门店的等级
|
//刷新京东门店的等级
|
||||||
cms.RefreshJdLevel(jxcontext.AdminCtx)
|
cms.RefreshJdLevel(jxcontext.AdminCtx)
|
||||||
//删除操作日志
|
//删除操作日志
|
||||||
event.DeleteOperateEventAndDetail(jxcontext.AdminCtx, time.Now().AddDate(0, -3, 0))
|
// event.DeleteOperateEventAndDetail(jxcontext.AdminCtx, time.Now().AddDate(0, -3, 0))
|
||||||
//禁用没有绑定的门店
|
//禁用没有绑定的门店
|
||||||
cms.DisabledStoreWithoutVendor(jxcontext.AdminCtx, true, true)
|
cms.DisabledStoreWithoutVendor(jxcontext.AdminCtx, true, true)
|
||||||
//刷新物料订单状态
|
//刷新物料订单状态
|
||||||
localjx.RefreshAllMatterOrderStatus(jxcontext.AdminCtx)
|
localjx.RefreshAllMatterOrderStatus(jxcontext.AdminCtx)
|
||||||
//同步银豹到京西
|
//同步银豹到京西
|
||||||
cms.CurVendorSync.SyncStoreSkusFromYb(jxcontext.AdminCtx, nil, true, true)
|
// cms.CurVendorSync.SyncStoreSkusFromYb(jxcontext.AdminCtx, nil, true, true)
|
||||||
//刷新京东商城订单结算价
|
|
||||||
orderman.RefreshJdShopOrdersEarningPrice(jxcontext.AdminCtx, time.Now().AddDate(0, 0, -3).Format("20060102"), time.Now().Format("20060102"))
|
|
||||||
//同步京东商城门店库存和商品
|
|
||||||
cms.CurVendorSync.SyncJdsStoresSkus(jxcontext.AdminCtx, nil, true, true)
|
|
||||||
//同步上架京东商城待售商品
|
//同步上架京东商城待售商品
|
||||||
cms.RefreshJdsSkusStatus(jxcontext.AdminCtx)
|
cms.RefreshJdsSkusStatus(jxcontext.AdminCtx)
|
||||||
|
//同步美团配送与否状态及美团门店是否存在
|
||||||
|
cms.SetMTPSStatus(jxcontext.AdminCtx, 0, 0)
|
||||||
|
//售后单如果超过12小时没有审核,就自动通过
|
||||||
|
RefreshAfsOrderStatusAccess(jxcontext.AdminCtx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RefreshAfsOrderStatusAccess(ctx *jxcontext.Context) {
|
||||||
|
var (
|
||||||
|
offset = 0
|
||||||
|
pageSize = 9999
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
afsOrderList, _, err := dao.GetAfsOrdersByPage(db, "", "", "", time.Now().AddDate(0, 0, -7), time.Now(), offset, pageSize)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, v := range afsOrderList {
|
||||||
|
if v.Status == model.AfsOrderStatusWait4Approve && time.Now().Sub(v.AfsCreatedAt).Hours() > 12 {
|
||||||
|
defsch.FixedScheduler.AgreeOrRefuseRefund(ctx, v.AfsOrderID, v.VendorID, model.AfsTypePartRefund, "超时系统同意")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func RefreshRealMobile(ctx *jxcontext.Context, vendorID int, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) {
|
func RefreshRealMobile(ctx *jxcontext.Context, vendorID int, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"git.rosy.net.cn/baseapi"
|
"git.rosy.net.cn/baseapi"
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
|
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||||
@@ -804,6 +805,7 @@ func GetWeeklyStoreScore(storeID, weekIndexParam int) (outWeeklyStoreScoreDataLi
|
|||||||
if weekIndexParam == -1 {
|
if weekIndexParam == -1 {
|
||||||
outWeeklyStoreScoreDataList = weeklyStoreScoreDataList
|
outWeeklyStoreScoreDataList = weeklyStoreScoreDataList
|
||||||
} else {
|
} else {
|
||||||
|
fmt.Println("testss", utils.Format4Output(weeklyStoreScoreDataList, false))
|
||||||
outWeeklyStoreScoreDataList = []*model.WeeklyStoreScore{weeklyStoreScoreDataList[weekIndexParam]}
|
outWeeklyStoreScoreDataList = []*model.WeeklyStoreScore{weeklyStoreScoreDataList[weekIndexParam]}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -811,8 +813,27 @@ func GetWeeklyStoreScore(storeID, weekIndexParam int) (outWeeklyStoreScoreDataLi
|
|||||||
return outWeeklyStoreScoreDataList, err
|
return outWeeklyStoreScoreDataList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetStoreTotalScoreList(storeIDList []int, cityCode int, keyWord string, beginTime, endTime time.Time, isDesc bool, checkScoreLow, checkScoreHigh, offset, pageSize int) (storeTotalScoreEx model.StoreTotalScoreEx, err error) {
|
func GetStoreTotalScoreList(ctx *jxcontext.Context, storeIDList []int, cityCode int, keyWord string, beginTime, endTime time.Time, isDesc bool, checkScoreLow, checkScoreHigh, offset, pageSize int) (storeTotalScoreEx model.StoreTotalScoreEx, err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
|
//权限
|
||||||
|
if permission.IsRoled(ctx) {
|
||||||
|
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
|
||||||
|
var storeIDs2 []int
|
||||||
|
if len(storeIDList) > 0 {
|
||||||
|
for _, v := range storeIDList {
|
||||||
|
if storeIDsMap[v] != 0 {
|
||||||
|
storeIDs2 = append(storeIDs2, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for k, _ := range storeIDsMap {
|
||||||
|
storeIDs2 = append(storeIDs2, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
storeIDList = nil
|
||||||
|
storeIDList = storeIDs2
|
||||||
|
}
|
||||||
|
}
|
||||||
storeTotalScoreMapData := make(map[int]*model.StoreTotalScore)
|
storeTotalScoreMapData := make(map[int]*model.StoreTotalScore)
|
||||||
storeTotalScoreList, err := dao.GetStoreTotalScoreList(db, storeIDList, cityCode, keyWord, beginTime, endTime)
|
storeTotalScoreList, err := dao.GetStoreTotalScoreList(db, storeIDList, cityCode, keyWord, beginTime, endTime)
|
||||||
var filterStoreTotalScoreList []*model.StoreTotalScore
|
var filterStoreTotalScoreList []*model.StoreTotalScore
|
||||||
|
|||||||
415
business/jxstore/permission/permission.go
Normal file
415
business/jxstore/permission/permission.go
Normal file
@@ -0,0 +1,415 @@
|
|||||||
|
package permission
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetMenu(ctx *jxcontext.Context, userID string) (menus []*model.Menu, err error) {
|
||||||
|
if userID == "" {
|
||||||
|
return dao.GetMenu(dao.GetDB(), "", 0, userID)
|
||||||
|
} else {
|
||||||
|
if user, err := dao.GetUserByID(dao.GetDB(), "user_id", userID); err == nil {
|
||||||
|
if user.Type&model.UserTypeRole != 0 {
|
||||||
|
return dao.GetMenuWithUser(dao.GetDB(), "", 0, userID)
|
||||||
|
} else {
|
||||||
|
return dao.GetMenu(dao.GetDB(), "", 0, "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dao.GetMenu(dao.GetDB(), "", 0, userID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddMenu(ctx *jxcontext.Context, menu *model.Menu) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
if menu == nil {
|
||||||
|
return fmt.Errorf("添加失败!menu nil")
|
||||||
|
}
|
||||||
|
if menu.Name == "" || menu.Level == 0 {
|
||||||
|
return fmt.Errorf("添加失败!menu 名称和等级必须有值!")
|
||||||
|
}
|
||||||
|
menus, err := dao.GetMenu(db, menu.Name, menu.Level, "")
|
||||||
|
if len(menus) > 0 {
|
||||||
|
return fmt.Errorf("添加失败!已存在相同名称的 menu name : %v", menu.Name)
|
||||||
|
}
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
dao.WrapAddIDCULDEntity(menu, ctx.GetUserName())
|
||||||
|
err = dao.CreateEntity(db, menu)
|
||||||
|
dao.Commit(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateMenu(ctx *jxcontext.Context, menuID int, payload map[string]interface{}, isDelete bool) (num int64, err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
menu := &model.Menu{}
|
||||||
|
menu.ID = menuID
|
||||||
|
err = dao.GetEntity(db, menu)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if !isDelete {
|
||||||
|
valid := dao.StrictMakeMapByStructObject(payload, menu, ctx.GetUserName())
|
||||||
|
if len(valid) > 0 {
|
||||||
|
if num, err = dao.UpdateEntityLogically(db, menu, valid, ctx.GetUserName(), nil); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
menu.DeletedAt = time.Now()
|
||||||
|
num, err = dao.UpdateEntity(db, menu, "DeletedAt")
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
return num, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRole(ctx *jxcontext.Context, name string) (roles []*model.Role, err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
roles, err = dao.GetRole(db, name, "")
|
||||||
|
for _, v := range roles {
|
||||||
|
if v.CityCodes != "" {
|
||||||
|
if cityInfos, err := dao.GetPlaces(db, jxutils.StrListToIntList(strings.Split(v.CityCodes, ","))); err == nil {
|
||||||
|
v.CityInfo = cityInfos
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if v.StoreIDs != "" {
|
||||||
|
if stores, err := dao.GetStoreList(db, jxutils.StrListToIntList(strings.Split(v.StoreIDs, ",")), nil, nil, nil, nil, ""); err == nil {
|
||||||
|
v.Stores = stores
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return roles, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddRole(ctx *jxcontext.Context, name string) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
roles, err := dao.GetRole(db, "", name)
|
||||||
|
if len(roles) > 0 {
|
||||||
|
return fmt.Errorf("添加失败!已存在相同名称的 role name : %v", name)
|
||||||
|
}
|
||||||
|
role := &model.Role{
|
||||||
|
Name: name,
|
||||||
|
}
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
dao.WrapAddIDCULDEntity(role, ctx.GetUserName())
|
||||||
|
err = dao.CreateEntity(db, role)
|
||||||
|
dao.Commit(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateRole(ctx *jxcontext.Context, roleID int, name string, isDelete bool, brandID int, cityCodes, storeIDs []int) (num int64, err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
cityCodesStr []string
|
||||||
|
storeIDsStr []string
|
||||||
|
)
|
||||||
|
for _, v := range cityCodes {
|
||||||
|
cityCodesStr = append(cityCodesStr, utils.Int2Str(v))
|
||||||
|
}
|
||||||
|
for _, v := range storeIDs {
|
||||||
|
storeIDsStr = append(storeIDsStr, utils.Int2Str(v))
|
||||||
|
}
|
||||||
|
if roleID == 1 {
|
||||||
|
return 0, fmt.Errorf("管理员不允许修改!")
|
||||||
|
}
|
||||||
|
role := &model.Role{}
|
||||||
|
role.ID = roleID
|
||||||
|
err = dao.GetEntity(db, role)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if !isDelete {
|
||||||
|
role.Name = name
|
||||||
|
role.UpdatedAt = time.Now()
|
||||||
|
role.LastOperator = ctx.GetUserName()
|
||||||
|
role.BrandID = brandID
|
||||||
|
role.CityCodes = strings.Join(cityCodesStr, ",")
|
||||||
|
role.StoreIDs = strings.Join(storeIDsStr, ",")
|
||||||
|
num, err = dao.UpdateEntity(db, role, "Name", "UpdatedAt", "LastOperator", "BrandID", "CityCodes", "StoreIDs")
|
||||||
|
} else {
|
||||||
|
role.DeletedAt = time.Now()
|
||||||
|
num, err = dao.UpdateEntity(db, role, "DeletedAt")
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
return num, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserRole(ctx *jxcontext.Context, userID string) (userRoles []*model.UserRole, err error) {
|
||||||
|
return dao.GetUserRole(dao.GetDB(), []string{userID}, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateUserRole(ctx *jxcontext.Context, userIDs []string, roleIDs []int) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
roleIDMap = make(map[int]int)
|
||||||
|
nowRoleIDMap = make(map[int]int)
|
||||||
|
userRoleMap = make(map[string][]int)
|
||||||
|
addUserRoleMap = make(map[string][]int)
|
||||||
|
deleteUserRoleMap = make(map[string][]int)
|
||||||
|
)
|
||||||
|
for _, v := range roleIDs {
|
||||||
|
roleIDMap[v] = 1
|
||||||
|
}
|
||||||
|
userRoles, err := dao.GetUserRole(db, userIDs, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(userRoles) > 0 {
|
||||||
|
for _, v := range userRoles {
|
||||||
|
userRoleMap[v.UserID] = append(userRoleMap[v.UserID], v.RoleID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, userID := range userIDs {
|
||||||
|
nowRoleIDs := userRoleMap[userID]
|
||||||
|
for _, nowRoleID := range nowRoleIDs {
|
||||||
|
if roleIDMap[nowRoleID] == 0 {
|
||||||
|
deleteUserRoleMap[userID] = append(deleteUserRoleMap[userID], nowRoleID)
|
||||||
|
}
|
||||||
|
nowRoleIDMap[nowRoleID] = 1
|
||||||
|
}
|
||||||
|
for roleID, _ := range roleIDMap {
|
||||||
|
if nowRoleIDMap[roleID] == 0 {
|
||||||
|
addUserRoleMap[userID] = append(addUserRoleMap[userID], roleID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if len(addUserRoleMap) > 0 {
|
||||||
|
for userID, roleIDs := range addUserRoleMap {
|
||||||
|
for _, roleID := range roleIDs {
|
||||||
|
userRole := &model.UserRole{
|
||||||
|
UserID: userID,
|
||||||
|
RoleID: roleID,
|
||||||
|
}
|
||||||
|
dao.WrapAddIDCULDEntity(userRole, ctx.GetUserName())
|
||||||
|
err = dao.CreateEntity(db, userRole)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(deleteUserRoleMap) > 0 {
|
||||||
|
for userID, roleIDs := range deleteUserRoleMap {
|
||||||
|
for _, roleID := range roleIDs {
|
||||||
|
userRoles, _ := dao.GetUserRole(db, []string{userID}, []int{roleID})
|
||||||
|
if len(userRoles) > 0 {
|
||||||
|
userRoles[0].DeletedAt = time.Now()
|
||||||
|
userRoles[0].LastOperator = ctx.GetUserName()
|
||||||
|
_, err = dao.UpdateEntity(db, userRoles[0], "DeletedAt", "LastOperator")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, v := range userIDs {
|
||||||
|
if user, err := dao.GetUserByID(db, "user_id", v); err == nil {
|
||||||
|
user.Type = user.Type | model.UserTypeRole
|
||||||
|
dao.UpdateEntity(db, user, "Type")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoleMenu(ctx *jxcontext.Context, roleID int) (roleMenus []*model.RoleMenu, err error) {
|
||||||
|
return dao.GetRoleMenu(dao.GetDB(), []int{roleID}, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateRoleMenu(ctx *jxcontext.Context, roleIDs, menuIDs []int) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
menuIDMap = make(map[int]int)
|
||||||
|
nowMenuIDMap = make(map[int]int)
|
||||||
|
roleMenuMap = make(map[int][]int)
|
||||||
|
addRoleMenuMap = make(map[int][]int)
|
||||||
|
deleteRoleMenuMap = make(map[int][]int)
|
||||||
|
)
|
||||||
|
for _, v := range menuIDs {
|
||||||
|
menuIDMap[v] = 1
|
||||||
|
}
|
||||||
|
roleMenus, err := dao.GetRoleMenu(db, roleIDs, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if len(roleMenus) > 0 {
|
||||||
|
for _, v := range roleMenus {
|
||||||
|
roleMenuMap[v.RoleID] = append(roleMenuMap[v.RoleID], v.MenuID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, roleID := range roleIDs {
|
||||||
|
nowMenuIDs := roleMenuMap[roleID]
|
||||||
|
for _, nowMenuID := range nowMenuIDs {
|
||||||
|
if menuIDMap[nowMenuID] == 0 {
|
||||||
|
deleteRoleMenuMap[roleID] = append(deleteRoleMenuMap[roleID], nowMenuID)
|
||||||
|
}
|
||||||
|
nowMenuIDMap[nowMenuID] = 1
|
||||||
|
}
|
||||||
|
for menuID, _ := range menuIDMap {
|
||||||
|
if nowMenuIDMap[menuID] == 0 {
|
||||||
|
addRoleMenuMap[roleID] = append(addRoleMenuMap[roleID], menuID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if len(addRoleMenuMap) > 0 {
|
||||||
|
for roleID, menuIDs := range addRoleMenuMap {
|
||||||
|
for _, menuID := range menuIDs {
|
||||||
|
roleMenu := &model.RoleMenu{
|
||||||
|
RoleID: roleID,
|
||||||
|
MenuID: menuID,
|
||||||
|
}
|
||||||
|
dao.WrapAddIDCULDEntity(roleMenu, ctx.GetUserName())
|
||||||
|
err = dao.CreateEntity(db, roleMenu)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(deleteRoleMenuMap) > 0 {
|
||||||
|
for roleID, menuIDs := range deleteRoleMenuMap {
|
||||||
|
for _, menuID := range menuIDs {
|
||||||
|
roleMenus, _ := dao.GetRoleMenu(db, []int{roleID}, []int{menuID})
|
||||||
|
if len(roleMenus) > 0 {
|
||||||
|
roleMenus[0].DeletedAt = time.Now()
|
||||||
|
roleMenus[0].LastOperator = ctx.GetUserName()
|
||||||
|
_, err = dao.UpdateEntity(db, roleMenus[0], "DeletedAt", "LastOperator")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserStoresResultMap(userID string) (resultMap map[int]int, err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
// brandIDMap = make(map[int]int)
|
||||||
|
// cityCodeMap = make(map[int]int)
|
||||||
|
// storeIDMap = make(map[int]int)
|
||||||
|
)
|
||||||
|
resultMap = make(map[int]int)
|
||||||
|
userRoles, err := dao.GetUserRole2(db, []string{userID}, nil)
|
||||||
|
for _, v := range userRoles {
|
||||||
|
var (
|
||||||
|
brandIDs, cityCodes, storeIDs []int
|
||||||
|
)
|
||||||
|
// if _, ok := brandIDMap[v.BrandID]; !ok {
|
||||||
|
// brandIDMap[v.BrandID] = 1
|
||||||
|
// }
|
||||||
|
// if v.CityCodes != "" {
|
||||||
|
// for _, cityCode := range jxutils.StrListToIntList(strings.Split(v.CityCodes, ",")) {
|
||||||
|
// if _, ok := cityCodeMap[cityCode]; !ok {
|
||||||
|
// cityCodeMap[cityCode] = 1
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if v.StoreIDs != "" {
|
||||||
|
// for _, storeID := range jxutils.StrListToIntList(strings.Split(v.StoreIDs, ",")) {
|
||||||
|
// if _, ok := storeIDMap[storeID]; !ok {
|
||||||
|
// storeIDMap[storeID] = 1
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
if v.CityCodes == "" && v.StoreIDs == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if v.BrandID != 0 {
|
||||||
|
brandIDs = append(brandIDs, v.BrandID)
|
||||||
|
}
|
||||||
|
if v.CityCodes != "0" && v.CityCodes != "" {
|
||||||
|
cityCodes = append(cityCodes, jxutils.StrListToIntList(strings.Split(v.CityCodes, ","))...)
|
||||||
|
}
|
||||||
|
if v.StoreIDs != "" {
|
||||||
|
storeIDs = append(storeIDs, jxutils.StrListToIntList(strings.Split(v.StoreIDs, ","))...)
|
||||||
|
}
|
||||||
|
if stores, err := dao.GetStoreList(db, storeIDs, cityCodes, nil, brandIDs, nil, ""); len(stores) > 0 && err == nil {
|
||||||
|
for _, v := range stores {
|
||||||
|
if _, ok := resultMap[v.ID]; !ok {
|
||||||
|
resultMap[v.ID] = v.ID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// for k, _ := range brandIDMap {
|
||||||
|
// brandIDs = append(brandIDs, k)
|
||||||
|
// }
|
||||||
|
// for k, _ := range cityCodeMap {
|
||||||
|
// cityCodes = append(cityCodes, k)
|
||||||
|
// }
|
||||||
|
// for k, _ := range storeIDMap {
|
||||||
|
// storeIDs = append(storeIDs, k)
|
||||||
|
// }
|
||||||
|
// if stores1, err := dao.GetStoreList(db, nil, nil, brandIDs, nil, nil, ""); len(stores1) > 0 && err == nil {
|
||||||
|
// stores = append(stores, stores1...)
|
||||||
|
// }
|
||||||
|
// if stores2, err := dao.GetStoreList(db, nil, cityCodes, nil, nil, nil, ""); len(stores2) > 0 && err == nil {
|
||||||
|
// stores = append(stores, stores2...)
|
||||||
|
// }
|
||||||
|
// if stores3, err := dao.GetStoreList(db, storeIDs, nil, nil, nil, nil, ""); len(stores3) > 0 && err == nil {
|
||||||
|
// stores = append(stores, stores3...)
|
||||||
|
// }
|
||||||
|
|
||||||
|
return resultMap, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsRoled(ctx *jxcontext.Context) bool {
|
||||||
|
if ctx.GetUserName() != "jxadmin" {
|
||||||
|
if user, err := dao.GetUserByID(dao.GetDB(), "user_id", ctx.GetUserID()); err == nil {
|
||||||
|
if user.Type&model.UserTypeRole != 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
@@ -97,7 +97,7 @@ func BeginSavePriceRefer(ctx *jxcontext.Context, cityCodes, skuIDs []int, isAsyn
|
|||||||
resultMap = make(map[int]map[int]*model.PriceReferSnapshot)
|
resultMap = make(map[int]map[int]*model.PriceReferSnapshot)
|
||||||
resultCountryMap = make(map[int]*model.PriceReferSnapshot)
|
resultCountryMap = make(map[int]*model.PriceReferSnapshot)
|
||||||
)
|
)
|
||||||
storeList, err := dao.GetStoreList(db, nil, nil, nil, nil, "")
|
storeList, err := dao.GetStoreList(db, nil, nil, nil, nil, nil, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
@@ -283,3 +283,103 @@ func BeginSavePriceRefer(ctx *jxcontext.Context, cityCodes, skuIDs []int, isAsyn
|
|||||||
}
|
}
|
||||||
return hint, err
|
return hint, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GetManageStateResult struct {
|
||||||
|
OpenStoreCount int `json:"openStoreCount"` //营业店铺数
|
||||||
|
HaveRestStoreCount int `json:"haveRestStoreCount"` //临时休息店铺数
|
||||||
|
RestStoreCount int `json:"restStoreCount"` //休息店铺数
|
||||||
|
FinishOrderState *GetManageStateOrderInfo //完成订单情况
|
||||||
|
IngOrderState *GetManageStateOrderInfo //进行中订单情况
|
||||||
|
CancelOrderState *GetManageStateOrderInfo //取消订单情况
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetManageStateOrderInfo struct {
|
||||||
|
ActualPayPrice int `json:"actualPayPrice"` //支付总额
|
||||||
|
TotalShopMoney int `json:"totalShopMoney"` //平台结算
|
||||||
|
DesiredFee int `json:"desiredFee"` //配送费
|
||||||
|
Yhld string `json:"yhld"` //优惠力度(支付总额-平台结算-配送支出)/支付总额*100%
|
||||||
|
}
|
||||||
|
|
||||||
|
func getStoreStatusCount(db *dao.DaoDB, cityCodes []int, vendorID, status int) (count int, err error) {
|
||||||
|
countType := &struct{ Count int }{}
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
sql := `
|
||||||
|
SELECT COUNT(DISTINCT a.id) count
|
||||||
|
FROM store a
|
||||||
|
LEFT JOIN store_map b ON a.id = b.store_id AND b.deleted_at = ?
|
||||||
|
WHERE a.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams = append(sqlParams, utils.DefaultTimeValue, utils.DefaultTimeValue)
|
||||||
|
if len(cityCodes) > 0 {
|
||||||
|
sql += " AND a.city_code IN (" + dao.GenQuestionMarks(len(cityCodes)) + ")"
|
||||||
|
sqlParams = append(sqlParams, cityCodes)
|
||||||
|
}
|
||||||
|
if vendorID != -1 {
|
||||||
|
sql += " AND b.vendor_id = ? AND b.status = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorID, status)
|
||||||
|
} else {
|
||||||
|
sql += " AND a.status = ?"
|
||||||
|
sqlParams = append(sqlParams, status)
|
||||||
|
}
|
||||||
|
err = dao.GetRow(db, &countType, sql, sqlParams)
|
||||||
|
return countType.Count, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func getOrderStateCount(db *dao.DaoDB, cityCodes []int, vendorID, status int) (getManageStateOrderInfo *GetManageStateOrderInfo, err error) {
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
getManageStateOrderInfo = &GetManageStateOrderInfo{}
|
||||||
|
endTime := time.Now().AddDate(0, -3, 0)
|
||||||
|
sql := `
|
||||||
|
SELECT SUM(b.actual_pay_price) actual_pay_price, SUM(b.total_shop_money) total_shop_money, SUM(IFNULL(c.desired_fee, 0)) desired_fee
|
||||||
|
FROM store a
|
||||||
|
LEFT JOIN goods_order b ON a.id = IF(b.jx_store_id = 0, b.store_id, b.jx_store_id)
|
||||||
|
LEFT JOIN waybill c ON IF(b.waybill_vendor_id = -1,b.vendor_order_id,b.vendor_waybill_id) = c.vendor_waybill_id
|
||||||
|
WHERE a.deleted_at = ? AND a.status <> ?
|
||||||
|
AND b.order_created_at < ? AND b.order_created_at > ?
|
||||||
|
`
|
||||||
|
sqlParams = append(sqlParams, utils.DefaultTimeValue, model.StoreStatusDisabled, time.Now(), endTime)
|
||||||
|
if len(cityCodes) > 0 {
|
||||||
|
sql += " AND a.city_code IN (" + dao.GenQuestionMarks(len(cityCodes)) + ")"
|
||||||
|
sqlParams = append(sqlParams, cityCodes)
|
||||||
|
}
|
||||||
|
if vendorID != -1 {
|
||||||
|
sql += " AND b.vendor_id = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorID)
|
||||||
|
}
|
||||||
|
if status != model.OrderStatusDelivering {
|
||||||
|
sql += " AND b.status = ?"
|
||||||
|
sqlParams = append(sqlParams, status)
|
||||||
|
} else {
|
||||||
|
sql += " AND b.status < ? AND b.status >= ?"
|
||||||
|
sqlParams = append(sqlParams, model.OrderStatusEndBegin, model.OrderStatusWait4Pay)
|
||||||
|
}
|
||||||
|
err = dao.GetRow(db, &getManageStateOrderInfo, sql, sqlParams)
|
||||||
|
getManageStateOrderInfo.Yhld = utils.Float64ToStr(math.Round((float64(getManageStateOrderInfo.ActualPayPrice-getManageStateOrderInfo.TotalShopMoney-getManageStateOrderInfo.DesiredFee) / float64(getManageStateOrderInfo.ActualPayPrice) * 100))) + "%"
|
||||||
|
return getManageStateOrderInfo, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetManageState(ctx *jxcontext.Context, cityCodes []int, vendorID int) (getManageStateResult *GetManageStateResult, err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
getManageStateResult = &GetManageStateResult{}
|
||||||
|
if openCount, err := getStoreStatusCount(db, cityCodes, vendorID, model.StoreStatusOpened); err == nil {
|
||||||
|
getManageStateResult.OpenStoreCount = openCount
|
||||||
|
}
|
||||||
|
if haveRestCount, err := getStoreStatusCount(db, cityCodes, vendorID, model.StoreStatusHaveRest); err == nil {
|
||||||
|
getManageStateResult.HaveRestStoreCount = haveRestCount
|
||||||
|
}
|
||||||
|
if restCount, err := getStoreStatusCount(db, cityCodes, vendorID, model.StoreStatusClosed); err == nil {
|
||||||
|
getManageStateResult.RestStoreCount = restCount
|
||||||
|
}
|
||||||
|
if finishCount, err := getOrderStateCount(db, cityCodes, vendorID, model.OrderStatusFinished); err == nil {
|
||||||
|
getManageStateResult.FinishOrderState = finishCount
|
||||||
|
}
|
||||||
|
if ingCount, err := getOrderStateCount(db, cityCodes, vendorID, model.OrderStatusDelivering); err == nil {
|
||||||
|
getManageStateResult.IngOrderState = ingCount
|
||||||
|
}
|
||||||
|
if cancelCount, err := getOrderStateCount(db, cityCodes, vendorID, model.OrderStatusCanceled); err == nil {
|
||||||
|
getManageStateResult.CancelOrderState = cancelCount
|
||||||
|
}
|
||||||
|
return getManageStateResult, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,8 +8,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/delivery"
|
"git.rosy.net.cn/jx-callback/business/partner/delivery"
|
||||||
"github.com/360EntSecGroup-Skylar/excelize"
|
"github.com/360EntSecGroup-Skylar/excelize"
|
||||||
@@ -1006,7 +1004,7 @@ func CreateConsumerFromOrders(ctx *jxcontext.Context, vendorIDs []int, fromDate,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if order2 == nil && order.VendorID == model.VendorIDMTWM && time.Now().Sub(curDate) < 60*24*time.Hour {
|
if order2 == nil && order.VendorID == model.VendorIDMTWM && time.Now().Sub(curDate) < 60*24*time.Hour {
|
||||||
order2, err = handler.GetOrder(order.VendorOrgCode, order.VendorOrderID)
|
order2, err = handler.GetOrder(order.VendorOrgCode, order.VendorOrderID, order.VendorStoreID)
|
||||||
}
|
}
|
||||||
if order2 != nil {
|
if order2 != nil {
|
||||||
if order2.VendorUserID != "" && order.VendorUserID != order2.VendorUserID {
|
if order2.VendorUserID != "" && order.VendorUserID != order2.VendorUserID {
|
||||||
@@ -1236,14 +1234,14 @@ func FixMtwmCategory(ctx *jxcontext.Context, mtwmStoreIDs []int, isAsync, isCont
|
|||||||
func JdStoreInfo1125() (hint string, err error) {
|
func JdStoreInfo1125() (hint string, err error) {
|
||||||
fileName := "老格恢复拓店进度.xlsx"
|
fileName := "老格恢复拓店进度.xlsx"
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "")
|
storeList, err := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "")
|
||||||
if err == nil {
|
if err == nil {
|
||||||
var validStoreList []*dao.StoreDetail
|
var validStoreList []*dao.StoreDetail
|
||||||
for _, v := range storeList {
|
for _, v := range storeList {
|
||||||
if v.Status != model.StoreStatusDisabled && v.CreatedAt.Sub(utils.Str2Time("2019-10-01")) > 0 {
|
if v.Status != model.StoreStatusDisabled && v.CreatedAt.Sub(utils.Str2Time("2019-10-01")) > 0 {
|
||||||
storeInfo, err := api.JdAPI.GetStoreInfoByStationNo2(v.VendorStoreID)
|
storeInfo, err := api.JdAPI.GetStoreInfoByStationNo2(v.VendorStoreID)
|
||||||
if err == nil && storeInfo.CreateTime.GoTime().Sub(utils.Str2Time("2019-10-25")) > 0 {
|
if err == nil && storeInfo.CreateTime.GoTime().Sub(utils.Str2Time("2019-10-25")) > 0 {
|
||||||
if storeDetail, err := dao.GetStoreDetail(db, v.StoreID, v.VendorID); err == nil {
|
if storeDetail, err := dao.GetStoreDetail(db, v.StoreID, v.VendorID, ""); err == nil {
|
||||||
validStoreList = append(validStoreList, storeDetail)
|
validStoreList = append(validStoreList, storeDetail)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1500,120 +1498,512 @@ func addSku(outSkuId string, cagtegoryId int, shopCategories []int64, brandId in
|
|||||||
}
|
}
|
||||||
|
|
||||||
func UploadJdsImage(ctx *jxcontext.Context) (err error) {
|
func UploadJdsImage(ctx *jxcontext.Context) (err error) {
|
||||||
// db := dao.GetDB()
|
// var (
|
||||||
// result1, _ := api.JdShopAPI.GetProvince()
|
// jdStoreIDs = []string{"12007046"}
|
||||||
// for _, v := range result1 {
|
// jdStoreIDxipu = "12005417"
|
||||||
// place1, _ := dao.GetPlaceByName(db, v.AreaName, 1, 0)
|
// skuMap = make(map[string]partner.StoreSkuInfo)
|
||||||
// place1.JdsCode = v.AreaID
|
// priceList = make(map[string][]*partner.StoreSkuInfo)
|
||||||
// dao.UpdateEntity(db, place1, "JdsCode")
|
// statusList1 = make(map[string][]*partner.StoreSkuInfo)
|
||||||
// result2, _ := api.JdShopAPI.GetCity(v.AreaID)
|
// statusList2 = make(map[string][]*partner.StoreSkuInfo)
|
||||||
// for _, vv := range result2 {
|
// stockList = make(map[string][]*partner.StoreSkuInfo)
|
||||||
// place2, _ := dao.GetPlaceByName(db, vv.AreaName, 2, 0)
|
// vendorOrgCode = "320406"
|
||||||
// place2.JdsCode = vv.AreaID
|
// vendorOrgCode = "82029"
|
||||||
// dao.UpdateEntity(db, place2, "JdsCode")
|
// )
|
||||||
// place22, _ := dao.GetPlaceByName(db, vv.AreaName, 3, 0)
|
|
||||||
// if place22 != nil {
|
|
||||||
// place22.JdsCode = vv.AreaID
|
|
||||||
// dao.UpdateEntity(db, place22, "JdsCode")
|
|
||||||
// }
|
|
||||||
// result3, _ := api.JdShopAPI.GetCounty(vv.AreaID)
|
|
||||||
// for _, vvv := range result3 {
|
|
||||||
// place3, _ := dao.GetPlaceByName(db, vvv.AreaName, 3, 0)
|
|
||||||
// place3.JdsCode = vvv.AreaID
|
|
||||||
// dao.UpdateEntity(db, place3, "JdsCode")
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
///建店
|
// handler := partner.GetPurchasePlatformFromVendorID(model.VendorIDJD).(partner.IPurchasePlatformStoreSkuHandler)
|
||||||
// beginTime := utils.Str2Time("2020-05-18")
|
// multiHandler := partner.GetPurchasePlatformFromVendorID(model.VendorIDJD).(partner.IMultipleStoresHandler)
|
||||||
// endTime := utils.Str2Time("2020-05-24")
|
// allSkuNameInfoList, err := multiHandler.GetSkus(ctx, vendorOrgCode, 0, "")
|
||||||
// result, _ := misc.GetStoreTotalScoreList(nil, 0, "", beginTime, endTime, true, 50, 100, 1, 700)
|
// skuInfos := storeSkuFullList2BareFilter(allSkuNameInfoList)
|
||||||
// for _, v := range result.StoreTotalScoreList {
|
// outStoreSkuList, err := handler.GetStoreSkusBareInfo(ctx, vendorOrgCode, nil, 0, jdStoreIDxipu, skuInfos)
|
||||||
// storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDJX}, []int{v.StoreID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
|
// for _, vv := range outStoreSkuList {
|
||||||
// if len(storeMaps) == 0 {
|
// skuMap[vv.VendorSkuID] = *vv
|
||||||
// stores, _ := dao.GetStoreList(db, []int{v.StoreID}, nil, nil, nil, "")
|
|
||||||
// store := stores[0]
|
|
||||||
// if store.Status != model.StoreStatusDisabled && !strings.Contains(store.Name, "不做") {
|
|
||||||
// pricePercentagePack := ""
|
|
||||||
// if store.PayPercentage >= 90 {
|
|
||||||
// pricePercentagePack = "京西100"
|
|
||||||
// } else if store.PayPercentage >= 80 {
|
|
||||||
// pricePercentagePack = "京西80"
|
|
||||||
// } else {
|
|
||||||
// pricePercentagePack = "京西70"
|
|
||||||
// }
|
// }
|
||||||
// storeMap := &model.StoreMap{
|
// for _, jdStoreID := range jdStoreIDs {
|
||||||
// Status: 1,
|
// skuInfos2 := storeSkuFullList2BareFilter(allSkuNameInfoList)
|
||||||
// VendorID: model.VendorIDJX,
|
// outStoreSkuList2, _ := handler.GetStoreSkusBareInfo(ctx, vendorOrgCode, nil, 0, jdStoreID, skuInfos2)
|
||||||
// AutoPickup: 1,
|
// for _, v := range outStoreSkuList2 {
|
||||||
// DeliveryCompetition: 1,
|
// v.VendorPrice = utils.Float64TwoInt64(float64(v.VendorPrice) * 1.05)
|
||||||
// PricePercentage: 100,
|
// priceList[jdStoreID] = append(priceList[jdStoreID], v)
|
||||||
// IsSync: 1,
|
// a := skuMap[v.VendorSkuID]
|
||||||
// VendorStoreID: utils.Int2Str(v.StoreID),
|
// if &a == nil {
|
||||||
// PricePercentagePack: pricePercentagePack,
|
|
||||||
// }
|
|
||||||
// _, err = cms.AddStoreVendorMap(ctx, db, model.VendorIDJX, "", v.StoreID, storeMap)
|
|
||||||
// if err != nil {
|
|
||||||
// continue
|
// continue
|
||||||
// }
|
// }
|
||||||
|
// if a.VendorPrice != v.VendorPrice {
|
||||||
|
// v.VendorPrice = a.VendorPrice
|
||||||
|
// priceList[jdStoreID] = append(priceList[jdStoreID], v)
|
||||||
|
// }
|
||||||
|
// if a.Status != v.Status {
|
||||||
|
// v.Status = a.Status
|
||||||
|
// if v.Status == model.SkuStatusNormal {
|
||||||
|
// statusList1[jdStoreID] = append(statusList1[jdStoreID], v)
|
||||||
|
// } else {
|
||||||
|
// statusList2[jdStoreID] = append(statusList2[jdStoreID], v)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if a.Stock != v.Stock {
|
||||||
|
// v.Stock = a.Stock
|
||||||
|
// stockList[jdStoreID] = append(stockList[jdStoreID], v)
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
// task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx,
|
||||||
//京东商城街道name
|
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
// var stores []*model.Store
|
// step := batchItemList[0].(int)
|
||||||
|
// switch step {
|
||||||
|
// case 0:
|
||||||
|
// if len(priceList) > 0 {
|
||||||
|
// for k, v := range priceList {
|
||||||
|
// _, err = putils.FreeBatchStoreSkuInfo("更新门店商品价格", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||||
|
// failedList, err := handler.UpdateStoreSkusPrice(ctx, vendorOrgCode, 0, k, batchedStoreSkuList)
|
||||||
|
// if len(failedList) > 0 {
|
||||||
|
// task.AddFailedList(failedList)
|
||||||
|
// }
|
||||||
|
// return nil, 1, err
|
||||||
|
// }, ctx, task, v, 50, true)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// case 1:
|
||||||
|
// if len(statusList1) > 0 {
|
||||||
|
// for k, v := range statusList1 {
|
||||||
|
// _, err = putils.FreeBatchStoreSkuInfo("更新门店商品状态", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||||
|
// failedList, err := handler.UpdateStoreSkusStatus(ctx, vendorOrgCode, 0, k, batchedStoreSkuList, batchedStoreSkuList[0].Status)
|
||||||
|
// if len(failedList) > 0 {
|
||||||
|
// task.AddFailedList(failedList)
|
||||||
|
// }
|
||||||
|
// return nil, 1, err
|
||||||
|
// }, ctx, task, v, 50, true)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// case 2:
|
||||||
|
// case 3:
|
||||||
|
// if len(stockList) > 0 {
|
||||||
|
// for k, v := range stockList {
|
||||||
|
// _, err = putils.FreeBatchStoreSkuInfo("更新门店商品库存", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
|
||||||
|
// failedList, err := handler.UpdateStoreSkusStock(ctx, vendorOrgCode, 0, k, batchedStoreSkuList)
|
||||||
|
// if len(failedList) > 0 {
|
||||||
|
// task.AddFailedList(failedList)
|
||||||
|
// }
|
||||||
|
// return nil, 1, err
|
||||||
|
// }, ctx, task, v, 50, true)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return retVal, err
|
||||||
|
// }, []int{0})
|
||||||
|
// tasksch.HandleTask(task, nil, true).Run()
|
||||||
|
// _, err = task.GetResult(0)
|
||||||
|
//建店
|
||||||
|
// var (
|
||||||
|
// storeMaps []*model.StoreMap
|
||||||
|
// db = dao.GetDB()
|
||||||
|
// )
|
||||||
|
// if configs, err := dao.QueryConfigs(dao.GetDB(), "jdsCookie2", model.ConfigTypeCookie, ""); err == nil {
|
||||||
|
// api.JdShop2API.SetCookieWithStr(configs[0].Value)
|
||||||
|
// }
|
||||||
// sql := `
|
// sql := `
|
||||||
// SELECT b.*
|
// SELECT * from store_map where vendor_id = 5 and deleted_at = '1970-01-01 00:00:00' and vendor_org_code = 2 and store_id <> 667281
|
||||||
// FROM store_map a, store b
|
// AND store_id <> 100000
|
||||||
// WHERE a.store_id = b.id
|
// AND store_id <> 102919
|
||||||
// AND a.vendor_store_id = '' AND a.vendor_id = 5 AND a.deleted_at = ?
|
// AND LENGTH(vendor_store_id) < 9
|
||||||
// AND b.deleted_at = ?
|
|
||||||
// `
|
// `
|
||||||
// sqlParams := []interface{}{utils.DefaultTimeValue, utils.DefaultTimeValue}
|
// err = dao.GetRows(db, &storeMaps, sql, nil)
|
||||||
// err = dao.GetRows(db, &stores, sql, sqlParams)
|
// for _, v := range storeMaps {
|
||||||
// for _, v := range stores {
|
// store, _ := dao.GetStoreDetail(db, v.StoreID, model.VendorIDJDShop, "2")
|
||||||
// result, _ := api.AutonaviAPI.GetCoordinateAreaInfo(jxutils.IntCoordinate2Standard(v.Lng), jxutils.IntCoordinate2Standard(v.Lat))
|
// err = api.JdShop2API.DeleteStoresByID(utils.Str2Int64(store.VendorStoreID))
|
||||||
|
// time.Sleep(time.Second)
|
||||||
|
// data, _, _ := jxutils.DownloadFileByURL(jdshopapi.JdsStoreImg)
|
||||||
|
// url, _ := api.JdShop2API.UploadImageNew(data, "2659335b16e3880e367759b8fc675933.tem.png")
|
||||||
|
// ex := store.LicenceExpire
|
||||||
|
// if ex == "" {
|
||||||
|
// ex = utils.Time2Str(utils.Str2Time(store.LicenceValid).AddDate(0, 6, 0))
|
||||||
|
// }
|
||||||
|
// if !strings.Contains(ex, "00:00:00") {
|
||||||
|
// ex += " 00:00:00"
|
||||||
|
// }
|
||||||
|
// var url2 string
|
||||||
|
// if store.Licence != "" {
|
||||||
|
// data2, _, _ := jxutils.DownloadFileByURL(store.Licence)
|
||||||
|
// fileName := store.Licence[strings.LastIndex(store.Licence, "/")+1 : len(store.Licence)]
|
||||||
|
// url2, _ = api.JdShop2API.UploadImageNew(data2, fileName)
|
||||||
|
// }
|
||||||
|
// storeName := store.Name
|
||||||
|
// if strings.Contains(storeName, "(") {
|
||||||
|
// storeName = storeName[0:strings.Index(storeName, "(")] + storeName[strings.Index(storeName, ")")+3:len(storeName)]
|
||||||
|
// }
|
||||||
|
// if strings.Contains(storeName, "(") {
|
||||||
|
// storeName = storeName[0:strings.Index(storeName, "(")] + storeName[strings.Index(storeName, ")")+3:len(storeName)]
|
||||||
|
// }
|
||||||
|
// if strings.Contains(storeName, ".") {
|
||||||
|
// storeName = strings.ReplaceAll(storeName, ".", "")
|
||||||
|
// }
|
||||||
|
// if strings.Contains(storeName, "-") {
|
||||||
|
// storeName = strings.ReplaceAll(storeName, "-", "")
|
||||||
|
// }
|
||||||
|
// if strings.Contains(storeName, " ") {
|
||||||
|
// storeName = strings.ReplaceAll(storeName, " ", "")
|
||||||
|
// }
|
||||||
|
// storeName = "京西菜市" + strings.ReplaceAll(storeName, "店", "") + "生鲜店"
|
||||||
|
// if len(storeName) > 30 {
|
||||||
|
// storeName = utils.LimitUTF8StringLen2(storeName, 30)
|
||||||
|
// }
|
||||||
|
// param := &jdshopapi.UpdateBasicParam{
|
||||||
|
// StoreName: storeName,
|
||||||
|
// CategoryID2: 4,
|
||||||
|
// Coordinate: utils.Float64ToStr(jxutils.IntCoordinate2Standard(store.Lat)) + "," + utils.Float64ToStr(jxutils.IntCoordinate2Standard(store.Lng)),
|
||||||
|
// BussinessBeginTime: int2TimeStr(int(store.OpenTime1)),
|
||||||
|
// BussinessEndTime: int2TimeStr(int(store.CloseTime1)),
|
||||||
|
// ImgURL: url,
|
||||||
|
// StorePhone: store.Tel1,
|
||||||
|
// AddName: store.Address,
|
||||||
|
// AddCode3: store.JdsCode,
|
||||||
|
// CategoryID1: 3,
|
||||||
|
// }
|
||||||
|
// if url2 != "" {
|
||||||
|
// param.CategoryID1 = 34
|
||||||
|
// param.CategoryID2 = 62
|
||||||
|
// param.QualificationRequests = []*jdshopapi.QualificationRequests{
|
||||||
|
// &jdshopapi.QualificationRequests{
|
||||||
|
// QualificationID: 41,
|
||||||
|
// QualificationName: "营业执照",
|
||||||
|
// QualificationNo: store.LicenceCode,
|
||||||
|
// QualificationURL: url2,
|
||||||
|
// StartTime: utils.Time2Str(utils.Str2Time(store.LicenceValid)),
|
||||||
|
// EndingTime: ex,
|
||||||
|
// Time: []string{utils.Time2Str(utils.Str2Time(store.LicenceValid)), ex},
|
||||||
|
// },
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if store.JdsStreetCode != 0 {
|
||||||
|
// param.AddCode3 = store.JdsStreetCode
|
||||||
|
// }
|
||||||
|
// if param.AddCode3 == 0 {
|
||||||
|
// param.AddCode3 = store.JdCode
|
||||||
|
// }
|
||||||
|
// //证明这个店可能隶属直辖市或者东莞
|
||||||
|
// if model.ZXCityCodeMap[store.CityCode] != "" {
|
||||||
|
// result, _ := api.AutonaviAPI.GetCoordinateAreaInfo(jxutils.IntCoordinate2Standard(store.Lng), jxutils.IntCoordinate2Standard(store.Lat))
|
||||||
// if result["regeocode"] != nil {
|
// if result["regeocode"] != nil {
|
||||||
// street := result["regeocode"].(map[string]interface{})["addressComponent"].(map[string]interface{})["township"].(string)
|
// street := result["regeocode"].(map[string]interface{})["addressComponent"].(map[string]interface{})["township"].(string)
|
||||||
// if street != "" {
|
// if street != "" {
|
||||||
// storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDJDShop}, []int{v.ID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
|
// result1, _ := api.JdShopAPI.GetProvince()
|
||||||
// storeMap := storeMaps[0]
|
// for _, v := range result1 {
|
||||||
// storeMap.JdsStreetName = street
|
// if strings.Contains(store.CityName, v.AreaName) {
|
||||||
// dao.UpdateEntity(db, storeMap, "JdsStreetName")
|
// result2, _ := api.JdShopAPI.GetCity(v.AreaID)
|
||||||
|
// for _, vv := range result2 {
|
||||||
|
// if strings.Contains(store.DistrictName, vv.AreaName) {
|
||||||
|
// result3, _ := api.JdShopAPI.GetCounty(vv.AreaID)
|
||||||
|
// for _, vvv := range result3 {
|
||||||
|
// if street == vvv.AreaName {
|
||||||
|
// param.AddCode3 = vvv.AreaID
|
||||||
|
// break
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if vendorStroeID, err := api.JdShop2API.SubmitBasic(param); err == nil {
|
||||||
|
// v.VendorStoreID = utils.Int64ToStr(vendorStroeID)
|
||||||
|
// dao.UpdateEntity(db, v, "VendorStoreID")
|
||||||
|
// time.Sleep(time.Second)
|
||||||
|
// err = api.JdShop2API.UpdateExpand(int(vendorStroeID))
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//分类
|
||||||
|
// var (
|
||||||
|
// db = dao.GetDB()
|
||||||
|
// )
|
||||||
|
// catResult, _ := api.JdShop2API.FindShopCategories()
|
||||||
|
// for _, v := range catResult {
|
||||||
|
// var skuCat *model.SkuCategory
|
||||||
|
// sql := `
|
||||||
|
// SELECT *
|
||||||
|
// FROM sku_category
|
||||||
|
// WHERE deleted_at = ?
|
||||||
|
// AND name = ?
|
||||||
|
// AND is_exd_spec = 0
|
||||||
|
// `
|
||||||
|
// sqlParams := []interface{}{utils.DefaultTimeValue, v.Name}
|
||||||
|
// err = dao.GetRow(db, &skuCat, sql, sqlParams)
|
||||||
|
// if skuCat != nil {
|
||||||
|
// var storeSkuCat *model.StoreSkuCategoryMap
|
||||||
|
// sql2 := `
|
||||||
|
// SELECT *
|
||||||
|
// FROM store_sku_category_map
|
||||||
|
// WHERE store_id = ?
|
||||||
|
// AND deleted_at = ?
|
||||||
|
// AND category_id = ?
|
||||||
|
// `
|
||||||
|
// sqlParams2 := []interface{}{100000, utils.DefaultTimeValue, skuCat.ID}
|
||||||
|
// err = dao.GetRow(db, &storeSkuCat, sql2, sqlParams2)
|
||||||
|
// if storeSkuCat != nil {
|
||||||
|
// storeSkuCat.JdsID = v.CID
|
||||||
|
// dao.UpdateEntity(db, storeSkuCat, "JdsID")
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//京东商城补身份证
|
||||||
|
// var (
|
||||||
|
// storeMaps []*model.StoreMap
|
||||||
|
// db = dao.GetDB()
|
||||||
|
// )
|
||||||
|
// sql := `
|
||||||
|
// SELECT * from store_map where vendor_id = 5 and deleted_at = '1970-01-01 00:00:00' and vendor_org_code = 2
|
||||||
|
// and store_id <> 100206
|
||||||
|
// `
|
||||||
|
// dao.GetRows(db, &storeMaps, sql, nil)
|
||||||
|
// for _, v := range storeMaps {
|
||||||
|
// detail, _ := api.JdShop2API.ShopDetail(utils.Str2Int(v.VendorStoreID))
|
||||||
|
// storeDetail, _ := dao.GetStoreDetail(db, v.StoreID, model.VendorIDJDShop, "2")
|
||||||
|
|
||||||
|
// var (
|
||||||
|
// url2 string
|
||||||
|
// idCode string
|
||||||
|
// startTime string
|
||||||
|
// )
|
||||||
|
// if storeDetail.IDCardFront != "" {
|
||||||
|
// data2, _, _ := jxutils.DownloadFileByURL(storeDetail.IDCardFront)
|
||||||
|
// fileName := storeDetail.IDCardFront[strings.LastIndex(storeDetail.IDCardFront, "/")+1 : len(storeDetail.IDCardFront)]
|
||||||
|
// url2, _ = api.JdShop2API.UploadImageNew(data2, fileName)
|
||||||
|
// } else {
|
||||||
|
// data2, _, _ := jxutils.DownloadFileByURL("http://image.jxc4.com/image/a9bfc170a950ab9a4c76bd10b48b222b.tem.jpg")
|
||||||
|
// fileName := "a9bfc170a950ab9a4c76bd10b48b222b.tem.jpg"
|
||||||
|
// url2, _ = api.JdShop2API.UploadImageNew(data2, fileName)
|
||||||
|
// }
|
||||||
|
// if storeDetail.IDCode == "" {
|
||||||
|
// idCode = "610126198012230014"
|
||||||
|
// } else {
|
||||||
|
// idCode = storeDetail.IDCode
|
||||||
|
// }
|
||||||
|
// if storeDetail.IDValid == "" {
|
||||||
|
// startTime = "2013-01-25 00:00:00"
|
||||||
|
// } else {
|
||||||
|
// startTime = utils.Time2Str(utils.Str2Time(storeDetail.IDValid))
|
||||||
|
// }
|
||||||
|
// ex := storeDetail.IDExpire
|
||||||
|
// if ex == "" {
|
||||||
|
// ex = utils.Time2Str(utils.Str2Time(storeDetail.IDValid).AddDate(20, 0, 0))
|
||||||
|
// }
|
||||||
|
// if !strings.Contains(ex, "00:00:00") {
|
||||||
|
// ex += " 00:00:00"
|
||||||
|
// }
|
||||||
|
// api.JdShop2API.UpdateBasic(&jdshopapi.UpdateBasicParam{
|
||||||
|
// StoreID: detail.StoreID,
|
||||||
|
// StoreName: detail.StoreName,
|
||||||
|
// CategoryID2: detail.CategoryID2,
|
||||||
|
// Coordinate: detail.Coordinate,
|
||||||
|
// BussinessBeginTime: detail.BussinessBeginTime,
|
||||||
|
// BussinessEndTime: detail.BussinessEndTime,
|
||||||
|
// ImgURL: detail.ImgURL,
|
||||||
|
// StorePhone: detail.StorePhone,
|
||||||
|
// AddName: storeDetail.Address,
|
||||||
|
// AddCode1: detail.AddCode1,
|
||||||
|
// AddCode2: detail.AddCode2,
|
||||||
|
// AddCode3: detail.AddCode3,
|
||||||
|
// CategoryID1: detail.CategoryID1,
|
||||||
|
// QualificationRequests: []*jdshopapi.QualificationRequests{
|
||||||
|
// &jdshopapi.QualificationRequests{
|
||||||
|
// QualificationID: 41,
|
||||||
|
// QualificationName: "营业执照",
|
||||||
|
// QualificationNo: detail.QualificationInfoTOList[0].QualificationNo,
|
||||||
|
// QualificationURL: detail.QualificationInfoTOList[0].QualificationURL,
|
||||||
|
// StartTime: detail.QualificationInfoTOList[0].StartTime,
|
||||||
|
// EndingTime: detail.QualificationInfoTOList[0].EndingTime,
|
||||||
|
// Time: []string{detail.QualificationInfoTOList[0].StartTime, detail.QualificationInfoTOList[0].EndingTime},
|
||||||
|
// },
|
||||||
|
// &jdshopapi.QualificationRequests{
|
||||||
|
// QualificationID: 42,
|
||||||
|
// QualificationName: "身份证件",
|
||||||
|
// QualificationNo: idCode,
|
||||||
|
// QualificationURL: url2,
|
||||||
|
// StartTime: startTime,
|
||||||
|
// EndingTime: ex,
|
||||||
|
// Time: []string{startTime, ex},
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
// var (
|
||||||
|
// db = dao.GetDB()
|
||||||
|
// vendorThingIDs []int64
|
||||||
|
// )
|
||||||
|
// storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDJD}, nil, []int{model.StoreStatusOpened, model.StoreStatusHaveRest, model.StoreStatusClosed}, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "320406")
|
||||||
|
// things, _ := dao.GetThingMapList(db, model.ThingTypeSku, []int{model.VendorIDJD}, nil, []string{"320406"})
|
||||||
|
// thingIDmap := make(map[int64]string)
|
||||||
|
|
||||||
|
// for _, v := range things {
|
||||||
|
// if v.VendorThingID != "" {
|
||||||
|
// // lists = append(lists, &jdapi.SkuIdEntity{
|
||||||
|
// // OutSkuId: utils.Int64ToStr(v.ThingID),
|
||||||
|
// // })
|
||||||
|
// vendorThingIDs = append(vendorThingIDs, utils.Str2Int64(v.VendorThingID))
|
||||||
|
// thingIDmap[utils.Str2Int64(v.VendorThingID)] = utils.Int64ToStr(v.ThingID)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
// var stores []*model.Store
|
// task := tasksch.NewParallelTask("uuuuu", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(true), ctx,
|
||||||
// sql := `
|
// func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
// SELECT a.*
|
// storeMap := batchItemList[0].(*model.StoreMap)
|
||||||
// FROM store a
|
// FreeBatchInfo("uuuuu2", func(task tasksch.ITask, batchedStoreSkuList []int64) (result interface{}, successCount int, err error) {
|
||||||
// LEFT JOIN store_map b ON a.id = b.store_id AND b.vendor_id = 5 AND b.deleted_at = '1970-01-01 00:00:00'
|
// priceInfo, _ := api.JdAPI.GetStationInfoList(storeMap.VendorStoreID, batchedStoreSkuList)
|
||||||
// WHERE 1=1
|
// var list []*jdapi.SkuIdEntity
|
||||||
// AND (a.status = 1 OR a.status = 0)
|
// for _, vv := range priceInfo {
|
||||||
// AND b.id IS NULL
|
// if vv.VipPrice != 0 {
|
||||||
// AND a.deleted_at = '1970-01-01 00:00:00'
|
// fmt.Println("vipPrice uuu", vv.SkuID)
|
||||||
// `
|
// list = append(list, &jdapi.SkuIdEntity{
|
||||||
// err = dao.GetRows(db, &stores, sql, nil)
|
// OutSkuId: thingIDmap[vv.SkuID],
|
||||||
// for _, v := range stores {
|
// })
|
||||||
// storeMap := &model.StoreMap{
|
|
||||||
// Status: 1,
|
|
||||||
// VendorID: model.VendorIDJDShop,
|
|
||||||
// AutoPickup: 1,
|
|
||||||
// DeliveryCompetition: 1,
|
|
||||||
// PricePercentage: 100,
|
|
||||||
// IsSync: 1,
|
|
||||||
// SyncRule: 1,
|
|
||||||
// }
|
|
||||||
// _, err = cms.AddStoreVendorMap(ctx, db, model.VendorIDJDShop, "", v.ID, storeMap)
|
|
||||||
// if err != nil {
|
|
||||||
// continue
|
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
_, err = api.JdShopAPI.AllOrders(&jdshopapi.AllOrdersParam{
|
// err = api.JdAPI.DelVipPrice(utils.Int2Str(storeMap.StoreID), list)
|
||||||
Current: 1,
|
// return result, 0, err
|
||||||
PageSize: 10,
|
// }, ctx, task, vendorThingIDs, 50, true)
|
||||||
})
|
// return retVal, err
|
||||||
|
// }, storeMaps)
|
||||||
|
// tasksch.HandleTask(task, nil, true).Run()
|
||||||
|
// _, err = task.GetResult(0)
|
||||||
|
stores := []int{}
|
||||||
|
for i := 1; i < 26; i++ {
|
||||||
|
result, _ := api.JdShop2API.ShopList(i)
|
||||||
|
for _, v := range result.List {
|
||||||
|
if v.Kilometres == "" {
|
||||||
|
if err = api.JdShop2API.CreateGisFence(v.StoreID, "1"); err != nil {
|
||||||
|
stores = append(stores, v.StoreID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println("resultstores112", stores)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FreeBatchInfo2(name string, handler func(tasksch.ITask, []*jdapi.SkuIdEntity) (interface{}, int, error), ctx *jxcontext.Context, parentTask tasksch.ITask, storeSkuList []*jdapi.SkuIdEntity, batchSize int, isContinueWhenError bool) (resultList []interface{}, err error) {
|
||||||
|
task := tasksch.NewParallelTask2(fmt.Sprintf("FreeBatchInfo:%s", name), tasksch.NewParallelConfig().SetParallelCount(1).SetBatchSize(batchSize).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||||
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error) {
|
||||||
|
batchStoreSkuList := make([]*jdapi.SkuIdEntity, len(batchItemList))
|
||||||
|
for k, v := range batchItemList {
|
||||||
|
batchStoreSkuList[k] = v.(*jdapi.SkuIdEntity)
|
||||||
|
}
|
||||||
|
retVal, successCount, err = handler(task, batchStoreSkuList)
|
||||||
|
if err != nil {
|
||||||
|
retVal = nil
|
||||||
|
}
|
||||||
|
return retVal, successCount, err
|
||||||
|
}, storeSkuList)
|
||||||
|
tasksch.HandleTask(task, parentTask, false).Run()
|
||||||
|
resultList, err = task.GetResult(0)
|
||||||
|
return resultList, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func FreeBatchInfo(name string, handler func(tasksch.ITask, []int64) (interface{}, int, error), ctx *jxcontext.Context, parentTask tasksch.ITask, storeSkuList []int64, batchSize int, isContinueWhenError bool) (resultList []interface{}, err error) {
|
||||||
|
task := tasksch.NewParallelTask2(fmt.Sprintf("FreeBatchInfo:%s", name), tasksch.NewParallelConfig().SetParallelCount(1).SetBatchSize(batchSize).SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||||
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, successCount int, err error) {
|
||||||
|
batchStoreSkuList := make([]int64, len(batchItemList))
|
||||||
|
for k, v := range batchItemList {
|
||||||
|
batchStoreSkuList[k] = v.(int64)
|
||||||
|
}
|
||||||
|
retVal, successCount, err = handler(task, batchStoreSkuList)
|
||||||
|
if err != nil {
|
||||||
|
retVal = nil
|
||||||
|
}
|
||||||
|
return retVal, successCount, err
|
||||||
|
}, storeSkuList)
|
||||||
|
tasksch.HandleTask(task, parentTask, false).Run()
|
||||||
|
resultList, err = task.GetResult(0)
|
||||||
|
return resultList, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func int2TimeStr(time int) (str string) {
|
||||||
|
str += utils.Int2Str(time / 1000)
|
||||||
|
str += utils.Int2Str(time % 1000 / 100)
|
||||||
|
str += ":"
|
||||||
|
str += utils.Int2Str(time % 100 / 10)
|
||||||
|
str += utils.Int2Str(time % 10)
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
|
||||||
|
func storeSkuFullList2BareFilter(storeSkuFull []*partner.SkuNameInfo) (bareStoreSkuList []*partner.StoreSkuInfo) {
|
||||||
|
for _, v := range storeSkuFull {
|
||||||
|
for _, v2 := range v.SkuList {
|
||||||
|
// if v2.Status > model.SkuStatusDontSale {
|
||||||
|
bareStoreSkuList = append(bareStoreSkuList, &v2.StoreSkuInfo)
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bareStoreSkuList
|
||||||
|
}
|
||||||
|
|
||||||
|
func RefreshJXPriceChange(ctx *jxcontext.Context, storeID int) (hint string, err error) {
|
||||||
|
db := dao.GetDB()
|
||||||
|
var (
|
||||||
|
stores []*model.Store
|
||||||
|
vendorIDs = []int{0, 1, 3, 5, 9}
|
||||||
|
isAsync = true
|
||||||
|
isContinueWhenError = true
|
||||||
|
)
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM store
|
||||||
|
WHERE deleted_at = ? AND pay_percentage > 50
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{utils.DefaultTimeValue}
|
||||||
|
if storeID != 0 {
|
||||||
|
sql += " AND id = ?"
|
||||||
|
sqlParams = append(sqlParams, storeID)
|
||||||
|
}
|
||||||
|
err = dao.GetRows(db, &stores, sql, sqlParams)
|
||||||
|
task := tasksch.NewParallelTask("刷新门店价格", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
|
||||||
|
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
|
store := batchItemList[0].(*model.Store)
|
||||||
|
var skuBindInfos []*cms.StoreSkuBindInfo
|
||||||
|
for _, v := range vendorIDs {
|
||||||
|
storeMaps, _ := dao.GetStoresMapList(db, []int{v}, []int{store.ID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
|
||||||
|
if len(storeMaps) > 0 {
|
||||||
|
storeMap := storeMaps[0]
|
||||||
|
switch v {
|
||||||
|
case model.VendorIDJD:
|
||||||
|
storeMap.PricePercentagePack = "京东测试报价=结算价"
|
||||||
|
dao.UpdateEntity(db, storeMap, "PricePercentagePack")
|
||||||
|
case model.VendorIDEBAI:
|
||||||
|
storeMap.PricePercentagePack = "美团测试报价=结算价"
|
||||||
|
dao.UpdateEntity(db, storeMap, "PricePercentagePack")
|
||||||
|
case model.VendorIDMTWM:
|
||||||
|
storeMap.PricePercentagePack = "饿百测试报价=结算价"
|
||||||
|
dao.UpdateEntity(db, storeMap, "PricePercentagePack")
|
||||||
|
case model.VendorIDJDShop:
|
||||||
|
storeMap.PricePercentagePack = "京西100-100"
|
||||||
|
dao.UpdateEntity(db, storeMap, "PricePercentagePack")
|
||||||
|
case model.VendorIDJX:
|
||||||
|
storeMap.PricePercentagePack = "京西100-100"
|
||||||
|
dao.UpdateEntity(db, storeMap, "PricePercentagePack")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
storeSkus, err := dao.GetStoresSkusInfo(db, []int{store.ID}, nil)
|
||||||
|
for _, v := range storeSkus {
|
||||||
|
skuAndName, _ := dao.GetSkus(db, []int{v.SkuID}, nil, nil, nil, nil)
|
||||||
|
skuBindInfo := &cms.StoreSkuBindInfo{
|
||||||
|
// StoreID: store.ID,
|
||||||
|
NameID: skuAndName[0].NameID,
|
||||||
|
UnitPrice: v.UnitPrice * store.PayPercentage / 100,
|
||||||
|
}
|
||||||
|
skuBindInfos = append(skuBindInfos, skuBindInfo)
|
||||||
|
}
|
||||||
|
// cms.UpdateStoresSkusByBind(ctx, task, skuBindInfos, isAsync, isContinueWhenError, false)
|
||||||
|
cms.UpdateStoresSkusWithoutSync(ctx, []int{store.ID}, skuBindInfos, false)
|
||||||
|
store.PayPercentage = 100
|
||||||
|
dao.UpdateEntity(db, store, "PayPercentage")
|
||||||
|
return retVal, err
|
||||||
|
}, stores)
|
||||||
|
tasksch.HandleTask(task, nil, true).Run()
|
||||||
|
if isAsync {
|
||||||
|
hint = task.GetID()
|
||||||
|
} else {
|
||||||
|
_, err = task.GetResult(0)
|
||||||
|
hint = "1"
|
||||||
|
}
|
||||||
|
return hint, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -851,7 +851,7 @@ func UpdateJxPriceByWeimob(ctx *jxcontext.Context, storeIDs []int, isAsync, isCo
|
|||||||
for _, v := range storeSkuBindInfoList {
|
for _, v := range storeSkuBindInfoList {
|
||||||
skuBindInfos = append(skuBindInfos, v.(*cms.StoreSkuBindInfo))
|
skuBindInfos = append(skuBindInfos, v.(*cms.StoreSkuBindInfo))
|
||||||
}
|
}
|
||||||
cms.UpdateStoresSkus(ctx, 0, storeIDs, skuBindInfos, false, isAsync, isContinueWhenError)
|
cms.UpdateStoresSkus(ctx, 0, storeIDs, skuBindInfos, false, false, isAsync, isContinueWhenError)
|
||||||
case 2:
|
case 2:
|
||||||
WriteToExcel3(task, dataStoreSkusSuccess.dataStoreSkusSuccessList, dataFailed.dataFailedList)
|
WriteToExcel3(task, dataStoreSkusSuccess.dataStoreSkusSuccessList, dataFailed.dataFailedList)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ const (
|
|||||||
|
|
||||||
MainImgWidth = 800
|
MainImgWidth = 800
|
||||||
MainImgHeight = 800
|
MainImgHeight = 800
|
||||||
|
MainImgWidth2 = 500
|
||||||
|
MainImgHeight2 = 500
|
||||||
)
|
)
|
||||||
|
|
||||||
type UploadResTokenInfo struct {
|
type UploadResTokenInfo struct {
|
||||||
@@ -81,7 +83,7 @@ func RegisterDataResource(ctx *jxcontext.Context, name, resourceURL, mimeType, h
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if imgType == model.ImgTypeMain {
|
if imgType == model.ImgTypeMain {
|
||||||
if img.Bounds().Dx() != MainImgWidth || img.Bounds().Dy() != MainImgHeight {
|
if (img.Bounds().Dx() != MainImgWidth || img.Bounds().Dy() != MainImgHeight) && (img.Bounds().Dx() != MainImgWidth2 || img.Bounds().Dy() != MainImgHeight2) {
|
||||||
return nil, fmt.Errorf("图片大小:%dx%d非法,要求必须:%dx%d", img.Bounds().Dx(), img.Bounds().Dy(), MainImgWidth, MainImgHeight)
|
return nil, fmt.Errorf("图片大小:%dx%d非法,要求必须:%dx%d", img.Bounds().Dx(), img.Bounds().Dy(), MainImgWidth, MainImgHeight)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,8 @@ const (
|
|||||||
|
|
||||||
EventTypeWXToken = "wxToken"
|
EventTypeWXToken = "wxToken"
|
||||||
EventTypeWX2Token = "wx2Token"
|
EventTypeWX2Token = "wx2Token"
|
||||||
|
EventTypeWX3Token = "wx3Token"
|
||||||
|
EventTypePushToken = "pushToken"
|
||||||
EventTypeYLYToken = "ylyToken"
|
EventTypeYLYToken = "ylyToken"
|
||||||
EventTypeWeimobToken = "weimobToken"
|
EventTypeWeimobToken = "weimobToken"
|
||||||
)
|
)
|
||||||
@@ -66,6 +67,20 @@ func (h *Hub) OnNewWX2Token(token string) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Hub) OnNewPushToken(token string) {
|
||||||
|
h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{
|
||||||
|
Type: EventTypePushToken,
|
||||||
|
Data: token,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *Hub) OnNewWX3Token(token string) {
|
||||||
|
h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{
|
||||||
|
Type: EventTypeWX3Token,
|
||||||
|
Data: token,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (h *Hub) OnNewYLYToken(token string) {
|
func (h *Hub) OnNewYLYToken(token string) {
|
||||||
h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{
|
h.eventHub.PostNewEvent(EventCategory, &eventhub.EventInfo{
|
||||||
Type: EventTypeYLYToken,
|
Type: EventTypeYLYToken,
|
||||||
@@ -91,6 +106,8 @@ func (h *Hub) GetToken(tokenType, oldToken string, waitTime time.Duration) (toke
|
|||||||
if weimobToken := api.WeimobAPI.GetToken(); weimobToken != nil {
|
if weimobToken := api.WeimobAPI.GetToken(); weimobToken != nil {
|
||||||
token = string(utils.MustMarshal(weimobToken))
|
token = string(utils.MustMarshal(weimobToken))
|
||||||
}
|
}
|
||||||
|
case EventTypePushToken:
|
||||||
|
token = api.PushAPI.CBGetToken()
|
||||||
case EventTypeWX2Token:
|
case EventTypeWX2Token:
|
||||||
token = api.WeixinMiniAPI2.CBGetToken()
|
token = api.WeixinMiniAPI2.CBGetToken()
|
||||||
}
|
}
|
||||||
@@ -128,3 +145,7 @@ func (h *Hub) GetYLYToken(oldToken string, waitTime time.Duration) (tokenInfo *T
|
|||||||
func (h *Hub) GetWeimobToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) {
|
func (h *Hub) GetWeimobToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) {
|
||||||
return h.GetToken(EventTypeWeimobToken, oldToken, waitTime)
|
return h.GetToken(EventTypeWeimobToken, oldToken, waitTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *Hub) GetPushToken(oldToken string, waitTime time.Duration) (tokenInfo *TokenInfo) {
|
||||||
|
return h.GetToken(EventTypePushToken, oldToken, waitTime)
|
||||||
|
}
|
||||||
|
|||||||
@@ -3,12 +3,11 @@ package excel
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"reflect"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
"github.com/360EntSecGroup-Skylar/excelize"
|
"github.com/360EntSecGroup-Skylar/excelize"
|
||||||
|
"io"
|
||||||
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Obj2ExcelSheetConfig struct {
|
type Obj2ExcelSheetConfig struct {
|
||||||
@@ -20,7 +19,8 @@ type Obj2ExcelSheetConfig struct {
|
|||||||
func Obj2Excel(sheetList []*Obj2ExcelSheetConfig) []byte {
|
func Obj2Excel(sheetList []*Obj2ExcelSheetConfig) []byte {
|
||||||
globals.SugarLogger.Debug("Obj2Excel")
|
globals.SugarLogger.Debug("Obj2Excel")
|
||||||
excelFile := excelize.NewFile()
|
excelFile := excelize.NewFile()
|
||||||
for sheetIndex, sheetConfig := range sheetList {
|
//for sheetIndex, sheetConfig := range sheetList {
|
||||||
|
for _, sheetConfig := range sheetList {
|
||||||
obj := sheetConfig.Data
|
obj := sheetConfig.Data
|
||||||
|
|
||||||
typeInfo := reflect.TypeOf(obj)
|
typeInfo := reflect.TypeOf(obj)
|
||||||
@@ -39,12 +39,14 @@ func Obj2Excel(sheetList []*Obj2ExcelSheetConfig) []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
valueInfo := reflect.Indirect(reflect.ValueOf(obj))
|
valueInfo := reflect.Indirect(reflect.ValueOf(obj))
|
||||||
if sheetIndex == 0 {
|
/*因爲默認是Sheet1,所以直接賦值就叫sheet1,然後再改名字就行了,不然會默認多一頁空白頁為sheet1*/
|
||||||
sheetName := excelFile.GetSheetName(1)
|
//if sheetIndex == 0 {
|
||||||
excelFile.SetSheetName(sheetName, sheetConfig.Title)
|
index := excelFile.NewSheet("Sheet1")
|
||||||
} else {
|
// sheetName := excelFile.GetSheetName(1)
|
||||||
excelFile.NewSheet(sheetConfig.Title)
|
excelFile.SetSheetName("Sheet1", sheetConfig.Title)
|
||||||
}
|
//} else {
|
||||||
|
// excelFile.NewSheet(sheetConfig.Title)
|
||||||
|
//}
|
||||||
isMemberStruct := typeInfo.Kind() == reflect.Struct
|
isMemberStruct := typeInfo.Kind() == reflect.Struct
|
||||||
colWithList := make([]float64, len(sheetConfig.CaptionList))
|
colWithList := make([]float64, len(sheetConfig.CaptionList))
|
||||||
if isMemberStruct {
|
if isMemberStruct {
|
||||||
@@ -63,9 +65,9 @@ func Obj2Excel(sheetList []*Obj2ExcelSheetConfig) []byte {
|
|||||||
for i := 0; i < valueInfo.Len(); i++ {
|
for i := 0; i < valueInfo.Len(); i++ {
|
||||||
for col, index := range indexSlice {
|
for col, index := range indexSlice {
|
||||||
str := fmt.Sprint(reflect.Indirect(valueInfo.Index(i)).FieldByIndex(index).Interface())
|
str := fmt.Sprint(reflect.Indirect(valueInfo.Index(i)).FieldByIndex(index).Interface())
|
||||||
// if colWith := float64(len(str)); colWith > colWithList[col] {
|
//// if colWith := float64(len(str)); colWith > colWithList[col] {
|
||||||
// colWithList[col] = colWith
|
//// colWithList[col] = colWith
|
||||||
// }
|
//// }
|
||||||
excelFile.SetCellStr(sheetConfig.Title, genAxis(i+1, col), str)
|
excelFile.SetCellStr(sheetConfig.Title, genAxis(i+1, col), str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,6 +106,7 @@ func Obj2Excel(sheetList []*Obj2ExcelSheetConfig) []byte {
|
|||||||
// colName, _ := excelize.ColumnNumberToName(col + 1)
|
// colName, _ := excelize.ColumnNumberToName(col + 1)
|
||||||
// excelFile.SetColWidth(sheetConfig.Title, colName, colName, colWithList[col])
|
// excelFile.SetColWidth(sheetConfig.Title, colName, colName, colWithList[col])
|
||||||
// }
|
// }
|
||||||
|
excelFile.SetActiveSheet(index)
|
||||||
}
|
}
|
||||||
buf := &bytes.Buffer{}
|
buf := &bytes.Buffer{}
|
||||||
excelFile.Write(buf)
|
excelFile.Write(buf)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/auth2"
|
"git.rosy.net.cn/jx-callback/business/auth2"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
@@ -56,7 +57,7 @@ func New(notUsed interface{}, token string, w http.ResponseWriter, r *http.Reque
|
|||||||
authInfo, err2 := auth2.GetTokenInfo(token)
|
authInfo, err2 := auth2.GetTokenInfo(token)
|
||||||
if err = err2; err == nil {
|
if err = err2; err == nil {
|
||||||
ctx.userInfo = authInfo
|
ctx.userInfo = authInfo
|
||||||
// globals.SugarLogger.Debugf("jxcontext New, V2 authInfo:%s", utils.Format4Output(authInfo, true))
|
globals.SugarLogger.Debugf("jxcontext New, V2 authInfo:%s", utils.Format4Output(authInfo, true))
|
||||||
if authInfo.TokenType != auth2.TokenTypeNormal {
|
if authInfo.TokenType != auth2.TokenTypeNormal {
|
||||||
err = errors.New("需要正式TOKEN")
|
err = errors.New("需要正式TOKEN")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ package jxutils
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/aes"
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math"
|
"math"
|
||||||
@@ -27,6 +30,7 @@ var (
|
|||||||
routinePool *routinepool.Pool
|
routinePool *routinepool.Pool
|
||||||
skuNamePat *regexp.Regexp
|
skuNamePat *regexp.Regexp
|
||||||
emailPat *regexp.Regexp
|
emailPat *regexp.Regexp
|
||||||
|
orderNoBeginTimestamp int64
|
||||||
|
|
||||||
resourceTypeMap = map[int][]string{
|
resourceTypeMap = map[int][]string{
|
||||||
model.VendorIDQiNiuCloud: []string{
|
model.VendorIDQiNiuCloud: []string{
|
||||||
@@ -73,6 +77,7 @@ func init() {
|
|||||||
// https://stackoverflow.com/questions/38933898/error-parsing-regexp-invalid-or-unsupported-perl-syntax
|
// https://stackoverflow.com/questions/38933898/error-parsing-regexp-invalid-or-unsupported-perl-syntax
|
||||||
skuNamePat = regexp.MustCompile(`([\((\[【][^\((\[【\))\]】]*[\))\]】])?(.*?)([((].*[))])?\s*约?([1-9][\d\.]*)(g|G|kg|kG|Kg|KG|l|L|ml|mL|Ml|ML|克)\s*([((].*[))])?\s*(?:\/|/|)\s*([^\s()()]{0,2})(\s.*)?$\s*([((].*[))])?$`)
|
skuNamePat = regexp.MustCompile(`([\((\[【][^\((\[【\))\]】]*[\))\]】])?(.*?)([((].*[))])?\s*约?([1-9][\d\.]*)(g|G|kg|kG|Kg|KG|l|L|ml|mL|Ml|ML|克)\s*([((].*[))])?\s*(?:\/|/|)\s*([^\s()()]{0,2})(\s.*)?$\s*([((].*[))])?$`)
|
||||||
emailPat = regexp.MustCompile(`[A-Za-z0-9_\-.]+@(?:[A-Za-z0-9_\-]+\.)+[A-Za-z]+`)
|
emailPat = regexp.MustCompile(`[A-Za-z0-9_\-.]+@(?:[A-Za-z0-9_\-]+\.)+[A-Za-z]+`)
|
||||||
|
orderNoBeginTimestamp = utils.Str2Time("2010-01-01 00:00:00").Unix()
|
||||||
}
|
}
|
||||||
|
|
||||||
func getJxStoreIDFromOrder(order *model.GoodsOrder) (retVal int) {
|
func getJxStoreIDFromOrder(order *model.GoodsOrder) (retVal int) {
|
||||||
@@ -159,11 +164,43 @@ func GetPossibleVendorIDFromVendorOrderID(vendorOrderID string) (vendorID int) {
|
|||||||
vendorID = model.VendorIDWSC
|
vendorID = model.VendorIDWSC
|
||||||
} else if orderIDLen == len("1000004390") {
|
} else if orderIDLen == len("1000004390") {
|
||||||
vendorID = model.VendorIDJX
|
vendorID = model.VendorIDJX
|
||||||
|
} else if orderIDLen == len("124557362562000001") || orderIDLen == len("13153183146800000100") {
|
||||||
|
vendorID = model.VendorIDJDShop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return vendorID
|
return vendorID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GenOrderNo() (orderNo int64) {
|
||||||
|
const prefix = 88
|
||||||
|
const randPartNum = 1000
|
||||||
|
orderNo = time.Now().Unix() - orderNoBeginTimestamp
|
||||||
|
orderNo = orderNo * randPartNum
|
||||||
|
md5Bytes := md5.Sum([]byte(utils.GetUUID()))
|
||||||
|
randPart := 0
|
||||||
|
for k, v := range md5Bytes {
|
||||||
|
randPart += int(v) << ((k % 3) * 8)
|
||||||
|
}
|
||||||
|
orderNo += int64(randPart % randPartNum)
|
||||||
|
orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix
|
||||||
|
return orderNo
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenAfsOrderNo() (orderNo int64) {
|
||||||
|
const prefix = 80
|
||||||
|
const randPartNum = 100
|
||||||
|
orderNo = time.Now().Unix() - orderNoBeginTimestamp
|
||||||
|
orderNo = orderNo * randPartNum
|
||||||
|
md5Bytes := md5.Sum([]byte(utils.GetUUID()))
|
||||||
|
randPart := 0
|
||||||
|
for k, v := range md5Bytes {
|
||||||
|
randPart += int(v) << ((k % 3) * 8)
|
||||||
|
}
|
||||||
|
orderNo += int64(randPart % randPartNum)
|
||||||
|
orderNo += int64(math.Pow10(int(math.Log10(float64(orderNo)))+1)) * prefix
|
||||||
|
return orderNo
|
||||||
|
}
|
||||||
|
|
||||||
func GetPossibleVendorIDFromAfsOrderID(afsOrderID string) (vendorID int) {
|
func GetPossibleVendorIDFromAfsOrderID(afsOrderID string) (vendorID int) {
|
||||||
vendorID = model.VendorIDUnknown
|
vendorID = model.VendorIDUnknown
|
||||||
if afsOrderIDInt64 := utils.Str2Int64WithDefault(afsOrderID, 0); afsOrderIDInt64 > 0 {
|
if afsOrderIDInt64 := utils.Str2Int64WithDefault(afsOrderID, 0); afsOrderIDInt64 > 0 {
|
||||||
@@ -359,7 +396,7 @@ func ComposeSkuNameOriginal(prefix, name, comment, unit string, spec_quality flo
|
|||||||
return skuName
|
return skuName
|
||||||
}
|
}
|
||||||
|
|
||||||
func ComposeSkuNameForJds(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int) (skuName string) {
|
func ComposeSkuNameForMTWM(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int) (skuName string) {
|
||||||
strBuilder := &strings.Builder{}
|
strBuilder := &strings.Builder{}
|
||||||
if prefix != "" {
|
if prefix != "" {
|
||||||
strBuilder.WriteString("[")
|
strBuilder.WriteString("[")
|
||||||
@@ -368,15 +405,15 @@ func ComposeSkuNameForJds(prefix, name, comment, unit string, spec_quality float
|
|||||||
}
|
}
|
||||||
skuName += name
|
skuName += name
|
||||||
strBuilder.WriteString(name)
|
strBuilder.WriteString(name)
|
||||||
if comment != "" {
|
|
||||||
strBuilder.WriteString(" ")
|
|
||||||
strBuilder.WriteString(comment)
|
|
||||||
}
|
|
||||||
if unit == "份" {
|
|
||||||
strBuilder.WriteString("约")
|
|
||||||
}
|
|
||||||
if unit != "" {
|
if unit != "" {
|
||||||
strBuilder.WriteString(ComposeSkuSpec(spec_quality, spec_unit))
|
strBuilder.WriteString(ComposeSkuSpec(spec_quality, spec_unit))
|
||||||
|
strBuilder.WriteString("/")
|
||||||
|
strBuilder.WriteString(unit)
|
||||||
|
}
|
||||||
|
if comment != "" {
|
||||||
|
strBuilder.WriteString("(")
|
||||||
|
strBuilder.WriteString(comment)
|
||||||
|
strBuilder.WriteString(")")
|
||||||
}
|
}
|
||||||
skuName = strBuilder.String()
|
skuName = strBuilder.String()
|
||||||
if maxLen > 0 {
|
if maxLen > 0 {
|
||||||
@@ -395,11 +432,13 @@ func ComposeSkuName(prefix, name, comment, unit string, spec_quality float32, sp
|
|||||||
return skuName
|
return skuName
|
||||||
}
|
}
|
||||||
|
|
||||||
func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time) (skuName string) {
|
func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time, isEx bool) (skuName string) {
|
||||||
if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil {
|
if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil {
|
||||||
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 {
|
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 {
|
||||||
|
if isEx {
|
||||||
skuName = exPrefix
|
skuName = exPrefix
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 {
|
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 {
|
||||||
skuName = ""
|
skuName = ""
|
||||||
}
|
}
|
||||||
@@ -408,16 +447,18 @@ func ComposeSkuNameSync(prefix, name, comment, unit string, spec_quality float32
|
|||||||
return skuName
|
return skuName
|
||||||
}
|
}
|
||||||
|
|
||||||
func ComposeSkuNameSync2(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time) (skuName string) {
|
func ComposeSkuNameSync2(prefix, name, comment, unit string, spec_quality float32, spec_unit string, maxLen int, exPrefix string, exPrefixBegin, exPrefixEnd *time.Time, isEx bool) (skuName string) {
|
||||||
if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil {
|
if exPrefix != "" && exPrefixBegin != nil && exPrefixEnd != nil {
|
||||||
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 {
|
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 {
|
||||||
|
if isEx {
|
||||||
skuName = exPrefix
|
skuName = exPrefix
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 {
|
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 {
|
||||||
skuName = ""
|
skuName = ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
skuName += ComposeSkuNameForJds(prefix, name, comment, unit, spec_quality, spec_unit, maxLen)
|
skuName += ComposeSkuNameForMTWM(prefix, name, comment, unit, spec_quality, spec_unit, maxLen)
|
||||||
return skuName
|
return skuName
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -585,8 +626,25 @@ func RefreshOrderSkuRelated(order *model.GoodsOrder) *model.GoodsOrder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func RefreshOrderEarningPrice2(order *model.GoodsOrder, payPercentage int) *model.GoodsOrder {
|
func RefreshOrderEarningPrice2(order *model.GoodsOrder, payPercentage int) *model.GoodsOrder {
|
||||||
if payPercentage <= 50 {
|
if order.EarningType == model.EarningTypePoints {
|
||||||
|
// if order.VendorID == model.VendorIDJDShop || order.VendorID == model.VendorIDJX {
|
||||||
|
// order.NewEarningPrice = order.TotalShopMoney * int64((100 - payPercentage)) / 100
|
||||||
|
// } else {
|
||||||
order.NewEarningPrice = order.TotalShopMoney * int64((100 - payPercentage/2)) / 100
|
order.NewEarningPrice = order.TotalShopMoney * int64((100 - payPercentage/2)) / 100
|
||||||
|
// }
|
||||||
|
} else {
|
||||||
|
order.NewEarningPrice = order.EarningPrice
|
||||||
|
}
|
||||||
|
return order
|
||||||
|
}
|
||||||
|
|
||||||
|
func RefreshOrderEarningPrice3(order *model.GoodsOrder, payPercentage int, bill *model.Waybill) *model.GoodsOrder {
|
||||||
|
if order.EarningType == model.EarningTypePoints {
|
||||||
|
// if order.VendorID == model.VendorIDJDShop || order.VendorID == model.VendorIDJX {
|
||||||
|
// order.NewEarningPrice = (order.TotalShopMoney - bill.DesiredFee) * int64((100 - payPercentage)) / 100
|
||||||
|
// } else {
|
||||||
|
order.NewEarningPrice = order.TotalShopMoney*int64((100-payPercentage/2))/100 - bill.DesiredFee
|
||||||
|
// }
|
||||||
} else {
|
} else {
|
||||||
order.NewEarningPrice = order.EarningPrice
|
order.NewEarningPrice = order.EarningPrice
|
||||||
}
|
}
|
||||||
@@ -882,3 +940,118 @@ func TranslateSoundSize(vendorID, soundPercentage int) (soundSize string) {
|
|||||||
}
|
}
|
||||||
return soundSize
|
return soundSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//ECB,AES模式解密
|
||||||
|
//目前就京东商城订单手机号解密用
|
||||||
|
func DecryptDESECB(d, key []byte) string {
|
||||||
|
data, err := base64.StdEncoding.DecodeString(string(d))
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
block, err := aes.NewCipher(key)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
bs := block.BlockSize()
|
||||||
|
if len(data)%bs != 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
out := make([]byte, len(data))
|
||||||
|
dst := out
|
||||||
|
for len(data) > 0 {
|
||||||
|
block.Decrypt(dst, data[:bs])
|
||||||
|
data = data[bs:]
|
||||||
|
dst = dst[bs:]
|
||||||
|
}
|
||||||
|
out = PKCS5UnPadding(out)
|
||||||
|
return string(out)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PKCS5UnPadding(origData []byte) []byte {
|
||||||
|
length := len(origData)
|
||||||
|
unpadding := int(origData[length-1])
|
||||||
|
return origData[:(length - unpadding)]
|
||||||
|
}
|
||||||
|
|
||||||
|
//合成水印图
|
||||||
|
func MixWatermarkImg(imgWatermark, img string, exPrefixBegin, exPrefixEnd *time.Time) (imgMix string) {
|
||||||
|
if exPrefixBegin != nil && exPrefixEnd != nil {
|
||||||
|
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*exPrefixEnd) <= 0 {
|
||||||
|
baseURL := base64.URLEncoding.EncodeToString([]byte(imgWatermark))
|
||||||
|
var imgUrl string
|
||||||
|
if strings.Contains(img, "?") {
|
||||||
|
imgUrl = img + "/imageView2/0/q/75|watermark/1/image/" + baseURL + "/dissolve/100/gravity/Center/dx/0/dy/0"
|
||||||
|
} else {
|
||||||
|
imgUrl = img + "?imageView2/0/q/75|watermark/1/image/" + baseURL + "/dissolve/100/gravity/Center/dx/0/dy/0"
|
||||||
|
}
|
||||||
|
if resBinary, _, err := DownloadFileByURL(imgUrl); err == nil {
|
||||||
|
if downloadURL, err := UploadExportContent(resBinary, utils.Int64ToStr(time.Now().Unix())+img[strings.LastIndex(img, "/")+1:len(img)]); err == nil {
|
||||||
|
if err == nil {
|
||||||
|
return downloadURL
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*exPrefixEnd) > 0 {
|
||||||
|
return imgMix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return imgMix
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetDefendPriceIssue() (issue int) {
|
||||||
|
if time.Now().Hour() >= 22 {
|
||||||
|
issue = utils.Str2Int(time.Now().AddDate(0, 0, 1).Format("20060102"))
|
||||||
|
} else {
|
||||||
|
issue = utils.Str2Int(time.Now().Format("20060102"))
|
||||||
|
}
|
||||||
|
return issue
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetLastDefendPriceIssue() (issue int) {
|
||||||
|
return utils.Str2Int(time.Now().AddDate(0, 0, 1).Format("20060102"))
|
||||||
|
}
|
||||||
|
|
||||||
|
//根据一堆坐标求面积
|
||||||
|
//有待考证,不过暂时拿来用
|
||||||
|
func ComputeSignedArea(path []string) (s float64) {
|
||||||
|
var (
|
||||||
|
radius = 6371009
|
||||||
|
len = len(path)
|
||||||
|
total float64
|
||||||
|
prev = path[len-1]
|
||||||
|
)
|
||||||
|
if len < 3 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
prevTanLat := math.Tan(((math.Pi/2 - utils.Str2Float64(strings.Split(prev, ",")[1])/180*math.Pi) / 2))
|
||||||
|
prevLng := utils.Str2Float64(strings.Split(prev, ",")[0]) / 180 * math.Pi
|
||||||
|
for i := 0; i < len; i++ {
|
||||||
|
tanLat := math.Tan(((math.Pi/2 - utils.Str2Float64(strings.Split(path[i], ",")[1])/180*math.Pi) / 2))
|
||||||
|
lng := utils.Str2Float64(strings.Split(path[i], ",")[0]) / 180 * math.Pi
|
||||||
|
total += polarTriangleArea(tanLat, lng, prevTanLat, prevLng)
|
||||||
|
prevTanLat = tanLat
|
||||||
|
prevLng = lng
|
||||||
|
}
|
||||||
|
return math.Abs(total * (float64(radius) * float64(radius)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func polarTriangleArea(tan1, lng1, tan2, lng2 float64) (s float64) {
|
||||||
|
deltaLng := lng1 - lng2
|
||||||
|
t := tan1 * tan2
|
||||||
|
return 2 * math.Atan2(t*math.Sin(deltaLng), 1+t*math.Cos(deltaLng))
|
||||||
|
}
|
||||||
|
|
||||||
|
func IntListToStrList(i []int) (s []string) {
|
||||||
|
for _, v := range i {
|
||||||
|
s = append(s, utils.Int2Str(v))
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func StrListToIntList(s []string) (i []int) {
|
||||||
|
for _, v := range s {
|
||||||
|
i = append(i, utils.Str2Int(v))
|
||||||
|
}
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
|||||||
@@ -488,7 +488,7 @@ func GuessVendorIDFromVendorStoreID(vendorStoreID int64) (vendorID int) {
|
|||||||
vendorID = model.VendorIDJD
|
vendorID = model.VendorIDJD
|
||||||
} else if vendorStoreID > 1234567 && vendorStoreID < 9876543 { // 美团外卖 2461713,7位
|
} else if vendorStoreID > 1234567 && vendorStoreID < 9876543 { // 美团外卖 2461713,7位
|
||||||
vendorID = model.VendorIDMTWM
|
vendorID = model.VendorIDMTWM
|
||||||
} else if vendorStoreID > 1234567890 && vendorStoreID < 99876543210 { // 饿百 2167002607,10位,11位
|
} else if vendorStoreID > 1234567890 && vendorStoreID < 998765432109 { // 饿百 2167002607,10位,12位
|
||||||
vendorID = model.VendorIDEBAI
|
vendorID = model.VendorIDEBAI
|
||||||
} else if false { //vendorStoreID > 123456789 && vendorStoreID < 987654321 { // 微盟微商城 132091048,9位
|
} else if false { //vendorStoreID > 123456789 && vendorStoreID < 987654321 { // 微盟微商城 132091048,9位
|
||||||
// vendorID = model.VendorIDWSC
|
// vendorID = model.VendorIDWSC
|
||||||
|
|||||||
@@ -81,7 +81,14 @@ func PrintOrderByOrder4Store(ctx *jxcontext.Context, order *model.GoodsOrder, st
|
|||||||
PrintResult: partner.PrintResultNoPrinter,
|
PrintResult: partner.PrintResultNoPrinter,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
printResult, err = handler.PrintOrder(ctx, store, order)
|
storeDetail, _ := dao.GetStoreDetail(db, storeID, order.VendorID, order.VendorOrgCode)
|
||||||
|
if storeDetail == nil && order.VendorOrderID == testVendorOrderID {
|
||||||
|
storeDetail = &dao.StoreDetail{
|
||||||
|
BrandName: testVendorOrderID,
|
||||||
|
BrandIsPrint: model.NO,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printResult, err = handler.PrintOrder(ctx, store, storeDetail, order)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
dao.SetOrderPrintFlag(db, ctx.GetUserName(), order.VendorOrderID, order.VendorID, true)
|
dao.SetOrderPrintFlag(db, ctx.GetUserName(), order.VendorOrderID, order.VendorID, true)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,11 +42,12 @@ func SendSMSMsg(mobileList []string, signName, templateCode string, templatePara
|
|||||||
} else {
|
} else {
|
||||||
globals.SugarLogger.Infof(errMsg)
|
globals.SugarLogger.Infof(errMsg)
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if order != nil {
|
|
||||||
err = updateStoreSMSNotifyMark(order)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
// else {
|
||||||
|
// if order != nil {
|
||||||
|
// err = updateStoreSMSNotifyMark(order)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,10 +62,29 @@ func getOrderNotifyPhone(order *model.GoodsOrder) (phoneList []string) {
|
|||||||
|
|
||||||
func NotifyNewOrder(order *model.GoodsOrder) (err error) {
|
func NotifyNewOrder(order *model.GoodsOrder) (err error) {
|
||||||
if isPushSMS(order) {
|
if isPushSMS(order) {
|
||||||
err = SendSMSMsg(getOrderNotifyPhone(order), globals.SMSSignName, globals.SMSNewOrderTemplate, map[string]interface{}{
|
temp := ""
|
||||||
|
var price int64
|
||||||
|
store, _ := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, order.VendorOrgCode)
|
||||||
|
if store.VendorPayPercentage < 50 && store.VendorPayPercentage != 0 {
|
||||||
|
temp = globals.SMSNewOrderTemplate
|
||||||
|
price = order.ActualPayPrice
|
||||||
|
} else if store.VendorPayPercentage > 50 {
|
||||||
|
temp = globals.SMSNewOrderTemplateQ
|
||||||
|
price = order.ShopPrice
|
||||||
|
} else if store.VendorPayPercentage == 0 {
|
||||||
|
if store.PayPercentage > 50 {
|
||||||
|
temp = globals.SMSNewOrderTemplateQ
|
||||||
|
price = order.ShopPrice
|
||||||
|
} else {
|
||||||
|
temp = globals.SMSNewOrderTemplate
|
||||||
|
price = order.ActualPayPrice
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = SendSMSMsg(getOrderNotifyPhone(order), globals.SMSSignName, temp, map[string]interface{}{
|
||||||
"daySeq": order.OrderSeq,
|
"daySeq": order.OrderSeq,
|
||||||
"consigneeName": order.ConsigneeName,
|
"consigneeName": order.ConsigneeName,
|
||||||
"payMoney": jxutils.IntPrice2StandardString(order.ActualPayPrice),
|
"payMoney": jxutils.IntPrice2StandardString(price),
|
||||||
}, order)
|
}, order)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
@@ -86,10 +106,10 @@ func isPushSMS(order *model.GoodsOrder) bool {
|
|||||||
} else {
|
} else {
|
||||||
storeID = order.StoreID
|
storeID = order.StoreID
|
||||||
}
|
}
|
||||||
stores, _ := dao.GetStoresMapList(dao.GetDB(), []int{order.VendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
|
stores, _ := dao.GetStoresMapList(dao.GetDB(), []int{order.VendorID}, []int{storeID}, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
|
||||||
if len(stores) > 0 {
|
if len(stores) > 0 {
|
||||||
if stores[0].IsOrder == model.NO {
|
if stores[0].IsOrder == model.NO {
|
||||||
if storeID == model.MatterStoreID {
|
if storeID == model.MatterStoreID || storeID == model.JdShopMainStoreID || storeID == model.JdShopMainStoreID2 {
|
||||||
return false
|
return false
|
||||||
} else {
|
} else {
|
||||||
return true
|
return true
|
||||||
@@ -104,7 +124,7 @@ func isPushSMS(order *model.GoodsOrder) bool {
|
|||||||
|
|
||||||
func updateStoreSMSNotifyMark(order *model.GoodsOrder) (err error) {
|
func updateStoreSMSNotifyMark(order *model.GoodsOrder) (err error) {
|
||||||
var db = dao.GetDB()
|
var db = dao.GetDB()
|
||||||
stores, _ := dao.GetStoreList(db, []int{order.StoreID}, nil, nil, nil, "")
|
stores, _ := dao.GetStoreList(db, []int{order.StoreID}, nil, nil, nil, nil, "")
|
||||||
if len(stores) > 0 {
|
if len(stores) > 0 {
|
||||||
stores[0].SMSNotifyMark = model.YES
|
stores[0].SMSNotifyMark = model.YES
|
||||||
_, err = dao.UpdateEntity(db, stores[0], "SMSNotifyMark")
|
_, err = dao.UpdateEntity(db, stores[0], "SMSNotifyMark")
|
||||||
@@ -128,7 +148,7 @@ func NotifyNewUserOrder(order *model.GoodsOrder) (err error) {
|
|||||||
if order.ConsigneeMobile2 != "" {
|
if order.ConsigneeMobile2 != "" {
|
||||||
mobile = order.ConsigneeMobile2
|
mobile = order.ConsigneeMobile2
|
||||||
uoSMS, err := dao.GetUserOrderSMS(db, mobile, "")
|
uoSMS, err := dao.GetUserOrderSMS(db, mobile, "")
|
||||||
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "")
|
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, nil, "")
|
||||||
if len(stores) > 0 {
|
if len(stores) > 0 {
|
||||||
if stores[0].Tel1 == "" {
|
if stores[0].Tel1 == "" {
|
||||||
storeTel = stores[0].Tel2
|
storeTel = stores[0].Tel2
|
||||||
@@ -185,7 +205,7 @@ func NotifyNewCourierOrder(bill *model.Waybill) (err error) {
|
|||||||
} else {
|
} else {
|
||||||
storeID = order.StoreID
|
storeID = order.StoreID
|
||||||
}
|
}
|
||||||
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, "")
|
stores, _ := dao.GetStoreList(db, []int{storeID}, nil, nil, nil, nil, "")
|
||||||
if len(stores) > 0 {
|
if len(stores) > 0 {
|
||||||
if stores[0].Tel1 == "" {
|
if stores[0].Tel1 == "" {
|
||||||
storeTel = stores[0].Tel2
|
storeTel = stores[0].Tel2
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ const (
|
|||||||
dingdingTokenExpires = 7200 * time.Second
|
dingdingTokenExpires = 7200 * time.Second
|
||||||
weimobTokenExpires = 7200 * time.Second
|
weimobTokenExpires = 7200 * time.Second
|
||||||
yilianyunTokenExpires = 30 * 24 * 3600 * time.Second
|
yilianyunTokenExpires = 30 * 24 * 3600 * time.Second
|
||||||
|
pushTokenExpires = 7200 * time.Second
|
||||||
|
fnTokenExpires = 1 * time.Hour
|
||||||
|
|
||||||
maxRefreshGap = 5 * 60 * time.Second
|
maxRefreshGap = 5 * 60 * time.Second
|
||||||
errRefreshGap = 10 * time.Second
|
errRefreshGap = 10 * time.Second
|
||||||
@@ -138,6 +140,44 @@ func RefreshWeixinToken() (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RefreshFnToken() (err error) {
|
||||||
|
if api.FnAPI != nil {
|
||||||
|
err = RefreshConfig("fn", fnTokenExpires, func() (token string, expireTimeStr string) {
|
||||||
|
globals.SugarLogger.Debugf("RefreshFnToken RunMode:%s", beego.BConfig.RunMode)
|
||||||
|
if globals.IsMainProductEnv() {
|
||||||
|
if tokenInfo, err := api.FnAPI.GetAccessToken(); err == nil {
|
||||||
|
globals.SugarLogger.Debugf("RefreshFnToken tokenInfo:%s", utils.Format4Output(tokenInfo, true))
|
||||||
|
token = tokenInfo.AccessToken
|
||||||
|
} else {
|
||||||
|
globals.SugarLogger.Errorf("RefreshFnToken RefreshToken failed with error:%v", err)
|
||||||
|
}
|
||||||
|
sql := `
|
||||||
|
UPDATE jxgy.config SET token = ? WHERE thirdparty = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
token, "fn",
|
||||||
|
}
|
||||||
|
dao.ExecuteSQL(dao.GetDB(), sql, sqlParams)
|
||||||
|
}
|
||||||
|
if beego.BConfig.RunMode == "jxgy" {
|
||||||
|
config := &legacymodel.Config{}
|
||||||
|
sql := `
|
||||||
|
SELECT * FROM config WHERE thirdparty = 'fn'
|
||||||
|
`
|
||||||
|
if err := dao.GetRow(dao.GetDB(), &config, sql, nil); err == nil {
|
||||||
|
token = config.Token
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return token, expireTimeStr
|
||||||
|
}, func(value string) {
|
||||||
|
globals.SugarLogger.Debugf("RefreshFnToken setter value:%s", value)
|
||||||
|
// syseventhub.SysEventHub.OnNewWXToken(value)
|
||||||
|
api.FnAPI.SetToken(value)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func RefreshWeixin2Token() (err error) {
|
func RefreshWeixin2Token() (err error) {
|
||||||
if api.WeixinMiniAPI2 != nil {
|
if api.WeixinMiniAPI2 != nil {
|
||||||
err = RefreshConfig("wechat2", weixinTokenExpires, func() (token string, expireTimeStr string) {
|
err = RefreshConfig("wechat2", weixinTokenExpires, func() (token string, expireTimeStr string) {
|
||||||
@@ -165,6 +205,60 @@ func RefreshWeixin2Token() (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RefreshPushToken() (err error) {
|
||||||
|
if api.PushAPI != nil {
|
||||||
|
err = RefreshConfig("push", pushTokenExpires, func() (token string, expireTimeStr string) {
|
||||||
|
globals.SugarLogger.Debugf("RefreshPushToken RunMode:%s", beego.BConfig.RunMode)
|
||||||
|
if globals.IsMainProductEnv() {
|
||||||
|
if tokenInfo, err := api.PushAPI.CBRetrieveToken(); err == nil {
|
||||||
|
globals.SugarLogger.Debugf("RefreshPushToken tokenInfo:%s", utils.Format4Output(tokenInfo, true))
|
||||||
|
token = tokenInfo.Token
|
||||||
|
} else {
|
||||||
|
globals.SugarLogger.Errorf("RefreshPushToken RefreshToken failed with error:%v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if tokenInfo := getPushTokenFromRemote(api.PushAPI.CBGetToken()); tokenInfo != nil {
|
||||||
|
expireTimeStr = utils.Time2Str(time.Now().Add(-pushTokenExpires))
|
||||||
|
token = tokenInfo.Token
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return token, expireTimeStr
|
||||||
|
}, func(value string) {
|
||||||
|
globals.SugarLogger.Debugf("RefreshPushToken setter value:%s", value)
|
||||||
|
syseventhub.SysEventHub.OnNewPushToken(value)
|
||||||
|
api.PushAPI.CBSetToken(value)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func RefreshWeixin3Token() (err error) {
|
||||||
|
// if api.WeixinMiniAPI3 != nil {
|
||||||
|
// err = RefreshConfig("wechat3", weixinTokenExpires, func() (token string, expireTimeStr string) {
|
||||||
|
// globals.SugarLogger.Debugf("RefreshWeixin3Token RunMode:%s", beego.BConfig.RunMode)
|
||||||
|
// if globals.IsMainProductEnv() {
|
||||||
|
// if tokenInfo, err := api.WeixinMiniAPI3.CBRetrieveToken(); err == nil {
|
||||||
|
// globals.SugarLogger.Debugf("RefreshWeixin3Token tokenInfo:%s", utils.Format4Output(tokenInfo, true))
|
||||||
|
// token = tokenInfo.AccessToken
|
||||||
|
// } else {
|
||||||
|
// globals.SugarLogger.Errorf("RefreshWeixin3Token RefreshToken failed with error:%v", err)
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// if tokenInfo := getWX3TokenFromRemote(api.WeixinMiniAPI3.CBGetToken()); tokenInfo != nil {
|
||||||
|
// expireTimeStr = utils.Time2Str(time.Now().Add(-weixinTokenExpires))
|
||||||
|
// token = tokenInfo.Token
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// return token, expireTimeStr
|
||||||
|
// }, func(value string) {
|
||||||
|
// globals.SugarLogger.Debugf("RefreshWeixinToken setter value:%s", value)
|
||||||
|
// syseventhub.SysEventHub.OnNewWX3Token(value)
|
||||||
|
// api.WeixinMiniAPI3.CBSetToken(value)
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func RefreshWeimobToken() (err error) {
|
func RefreshWeimobToken() (err error) {
|
||||||
if api.WeimobAPI != nil {
|
if api.WeimobAPI != nil {
|
||||||
err = RefreshConfig("weimob", weimobTokenExpires, func() (token string, expireTimeStr string) {
|
err = RefreshConfig("weimob", weimobTokenExpires, func() (token string, expireTimeStr string) {
|
||||||
@@ -315,6 +409,24 @@ func getWX2TokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) {
|
|||||||
return tokenInfo
|
return tokenInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getPushTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) {
|
||||||
|
if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetPushTokenURL != "" {
|
||||||
|
tokenInfo = PollingRemotEvent(globals.GetPushTokenURL, 0, map[string]interface{}{
|
||||||
|
"oldToken": oldToken,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return tokenInfo
|
||||||
|
}
|
||||||
|
|
||||||
|
func getWX3TokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) {
|
||||||
|
if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetWeixinTokenURL != "" {
|
||||||
|
tokenInfo = PollingRemotEvent(globals.GetWeixinTokenURL, 0, map[string]interface{}{
|
||||||
|
"oldToken": oldToken,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return tokenInfo
|
||||||
|
}
|
||||||
|
|
||||||
func getYLYTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) {
|
func getYLYTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo) {
|
||||||
if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetYLYTokenURL != "" {
|
if !globals.IsMainProductEnv() && globals.GetWeixinTokenKey != "" && globals.GetYLYTokenURL != "" {
|
||||||
tokenInfo = PollingRemotEvent(globals.GetYLYTokenURL, 0, map[string]interface{}{
|
tokenInfo = PollingRemotEvent(globals.GetYLYTokenURL, 0, map[string]interface{}{
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ func NewParallelTask2(taskName string, config *ParallelConfig, ctx *jxcontext.Co
|
|||||||
if config.ParallelCount > MaxParallelCount {
|
if config.ParallelCount > MaxParallelCount {
|
||||||
config.ParallelCount = MaxParallelCount
|
config.ParallelCount = MaxParallelCount
|
||||||
}
|
}
|
||||||
|
//??
|
||||||
realItemList := utils.Interface2Slice(itemList)
|
realItemList := utils.Interface2Slice(itemList)
|
||||||
jobList := jxutils.SplitSlice(realItemList, config.BatchSize)
|
jobList := jxutils.SplitSlice(realItemList, config.BatchSize)
|
||||||
jobListLen := len(jobList)
|
jobListLen := len(jobList)
|
||||||
|
|||||||
98
business/jxutils/unipush/push.go
Normal file
98
business/jxutils/unipush/push.go
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
package push
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/unipushapi"
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
|
"github.com/astaxie/beego"
|
||||||
|
)
|
||||||
|
|
||||||
|
func pushToSingle(content, title string, storeID int) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
if !globals.IsProductEnv() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
storePushs, err := dao.GetStorePushClient(db, storeID, "")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, v := range storePushs {
|
||||||
|
|
||||||
|
status, err2 := api.PushAPI.PushToSingle(v.ClientID, false, &unipushapi.Notification{
|
||||||
|
Title: title,
|
||||||
|
Body: content,
|
||||||
|
})
|
||||||
|
if err = err2; err != nil {
|
||||||
|
globals.SugarLogger.Debugf("NotifyNewOrder push error: [%v]", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if status == unipushapi.SuccessOffLine {
|
||||||
|
_, err = api.PushAPI.PushToSingle(v.ClientID, true, &unipushapi.Notification{
|
||||||
|
Body: content,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
globals.SugarLogger.Debugf("NotifyNewOrder push2 error: [%v]", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotifyNewOrder(order *model.GoodsOrder) {
|
||||||
|
globals.SugarLogger.Debugf("NotifyNewOrder push begin orderID :[%v]", order.VendorOrderID)
|
||||||
|
if order == nil || len(order.Skus) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
sb := new(strings.Builder)
|
||||||
|
sb.WriteString("老板,")
|
||||||
|
sb.WriteString(order.ConsigneeName)
|
||||||
|
sb.WriteString("购买了商品")
|
||||||
|
sb.WriteString(getOrderDetailBrief(order))
|
||||||
|
pushToSingle(sb.String(), "京西菜市新订单推送", jxutils.GetSaleStoreIDFromOrder(order))
|
||||||
|
}
|
||||||
|
|
||||||
|
func getOrderDetailBrief(order *model.GoodsOrder) (brief string) {
|
||||||
|
sb := new(strings.Builder)
|
||||||
|
sb.WriteString(order.Skus[0].SkuName)
|
||||||
|
sb.WriteString("等共")
|
||||||
|
sb.WriteString(utils.Int2Str(order.Skus[0].Count))
|
||||||
|
sb.WriteString("份(")
|
||||||
|
sb.WriteString(jxutils.IntPrice2StandardString(order.Skus[0].SalePrice))
|
||||||
|
sb.WriteString("元/份)等,预计收入")
|
||||||
|
//TODO 2020-07-20 果园和菜市不同
|
||||||
|
var price int64
|
||||||
|
if beego.BConfig.RunMode == "jxgy" {
|
||||||
|
price = order.EarningPrice
|
||||||
|
} else {
|
||||||
|
if order.EarningType == model.EarningTypePoints {
|
||||||
|
price = order.ActualPayPrice
|
||||||
|
} else {
|
||||||
|
price = order.ShopPrice
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.WriteString(jxutils.IntPrice2StandardString(price))
|
||||||
|
sb.WriteString("元")
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotifyAfsOrder(afsOrder *model.AfsOrder) (err error) {
|
||||||
|
globals.SugarLogger.Debugf("NotifyAfsOrder push begin orderID :[%v]", afsOrder.VendorOrderID)
|
||||||
|
pushToSingle("老板,您有新的售后单,请尽快处理!", "京西菜市售后单推送", jxutils.GetSaleStoreIDFromAfsOrder(afsOrder))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotifyOrderCanceled(order *model.GoodsOrder) (err error) {
|
||||||
|
title := fmt.Sprintf("老板,您的订单%s第%d号订单, %s被取消了!", model.VendorChineseNames[order.VendorID], order.OrderSeq, order.VendorOrderID)
|
||||||
|
pushToSingle(title, "京西菜市取消单推送", jxutils.GetSaleStoreIDFromOrder(order))
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -1,12 +1,17 @@
|
|||||||
package weixinmsg
|
package weixinmsg
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"math"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
"git.rosy.net.cn/jx-callback/business/auth2/authprovider/weixin"
|
||||||
"git.rosy.net.cn/jx-callback/business/authz/autils"
|
"git.rosy.net.cn/jx-callback/business/authz/autils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxstore/permission"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
|
"git.rosy.net.cn/jx-callback/business/jxutils/netprinter"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||||
@@ -56,11 +61,13 @@ const (
|
|||||||
|
|
||||||
WX_SALE_BILL_TEMPLATE_ID = "eTUuFZMWH7IsVBfcxNMpmaHYaxRkUaD6zG8wSGJDcic"
|
WX_SALE_BILL_TEMPLATE_ID = "eTUuFZMWH7IsVBfcxNMpmaHYaxRkUaD6zG8wSGJDcic"
|
||||||
|
|
||||||
|
WX_NORMAL_STORE_ACT_MSG_TEMPLATE_ID = "eXsfOMvDOKVSht0Q0v4IsDrx3MBlRCVYwYl7Hi2uuuI"
|
||||||
WX_NORMAL_STORE_MSG_TEMPLATE_ID = "EUeIJEz2TLUAn4TU2EffOGYLd3dEaYndD_y6Sw9FcSU"
|
WX_NORMAL_STORE_MSG_TEMPLATE_ID = "EUeIJEz2TLUAn4TU2EffOGYLd3dEaYndD_y6Sw9FcSU"
|
||||||
// WX_CHANGE_APPROVED_TEMPLATE_ID = "gIG2olBZtQbjXmp6doNB_dESu60By5xuXYOGxksLv3Y"
|
WX_CHANGE_APPROVED_TEMPLATE_ID = "gIG2olBZtQbjXmp6doNB_dESu60By5xuXYOGxksLv3Y"
|
||||||
// WX_CHANGE_REJECTED_TEMPLATE_ID = "tn2QXWi4HtSIwaztmtN6Bb2uzNL-jBxWltCZTDNJuYE"
|
WX_CHANGE_REJECTED_TEMPLATE_ID = "OBF4-d5inK95epHcUltpdb1zq9boVp2HESpASVRh1Oo"
|
||||||
WX_ORDER_APPLY_CANCEL_TEMPLATE_ID = "e6urTtcm4PL0rgDMG_1qWNOwrE3Qxqcm_dx0kWWCmEI"
|
WX_ORDER_APPLY_CANCEL_TEMPLATE_ID = "e6urTtcm4PL0rgDMG_1qWNOwrE3Qxqcm_dx0kWWCmEI"
|
||||||
WX_ORDER_ORDER_CANCELED_TEMPLATE_ID = "HXjuSAbIk77Xh18hjgwoxHzbciR9jX3Rn2CpLJz9dZw"
|
WX_ORDER_ORDER_CANCELED_TEMPLATE_ID = "HXjuSAbIk77Xh18hjgwoxHzbciR9jX3Rn2CpLJz9dZw"
|
||||||
|
WX_ORDER_CHANGE_INFO_TEMPLATE_ID = "cjmEQFEpvcOuBNqQpTfMU5FeBpGRbQh_gWKz-WPW8Ro"
|
||||||
|
|
||||||
WX_AFS_ORDER_WAIT4APPROVE_TEMPLATE_ID = "X29udtANvhX6x1Lyh-T40NGNjRXBbUj5oSBTfDhZAqU"
|
WX_AFS_ORDER_WAIT4APPROVE_TEMPLATE_ID = "X29udtANvhX6x1Lyh-T40NGNjRXBbUj5oSBTfDhZAqU"
|
||||||
WX_AFS_ORDER_STATUS_CHANGED_TEMPLATE_ID = "99T33rrXX0VboO1hljs4x8dDoLiSj3QX_rOikPHIXkg"
|
WX_AFS_ORDER_STATUS_CHANGED_TEMPLATE_ID = "99T33rrXX0VboO1hljs4x8dDoLiSj3QX_rOikPHIXkg"
|
||||||
@@ -68,6 +75,8 @@ const (
|
|||||||
WS_NOTIFY_STORE_STATUS_CHHANGED_TEMPLATE_ID = "Fl0vOnBKTQqRFx3-shGKxdCnxMdQXNeODzgkuwd7oxw"
|
WS_NOTIFY_STORE_STATUS_CHHANGED_TEMPLATE_ID = "Fl0vOnBKTQqRFx3-shGKxdCnxMdQXNeODzgkuwd7oxw"
|
||||||
|
|
||||||
WX_STORE_ALERT_TEMPLATE_ID = "0AjzVl1wPl6iO4nFOS4IEsJYSzBymlT37DciIvcCOxE"
|
WX_STORE_ALERT_TEMPLATE_ID = "0AjzVl1wPl6iO4nFOS4IEsJYSzBymlT37DciIvcCOxE"
|
||||||
|
|
||||||
|
WX_KNOWLEDGE_BASE_TEMPLATE_ID = "0qAvaN7g8oveRgNw127Q7NdnCmmcN0H1a-uaBVjJWzk" //知识库模板
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -173,7 +182,18 @@ func getOrderDetailBrief(order *model.GoodsOrder) (brief string) {
|
|||||||
sb.WriteString("份(")
|
sb.WriteString("份(")
|
||||||
sb.WriteString(jxutils.IntPrice2StandardString(order.Skus[0].SalePrice))
|
sb.WriteString(jxutils.IntPrice2StandardString(order.Skus[0].SalePrice))
|
||||||
sb.WriteString("元/份)等,预计收入")
|
sb.WriteString("元/份)等,预计收入")
|
||||||
sb.WriteString(jxutils.IntPrice2StandardString(order.ActualPayPrice))
|
//TODO 2020-07-20 果园和菜市不同
|
||||||
|
var price int64
|
||||||
|
if beego.BConfig.RunMode == "jxgy" {
|
||||||
|
price = order.NewEarningPrice
|
||||||
|
} else {
|
||||||
|
if order.EarningType == model.EarningTypePoints {
|
||||||
|
price = order.ActualPayPrice
|
||||||
|
} else {
|
||||||
|
price = order.ShopPrice
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.WriteString(jxutils.IntPrice2StandardString(price))
|
||||||
sb.WriteString("元")
|
sb.WriteString("元")
|
||||||
return sb.String()
|
return sb.String()
|
||||||
}
|
}
|
||||||
@@ -184,12 +204,21 @@ func NotifyNewOrder(order *model.GoodsOrder) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(order.Skus) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
if !model.IsOrderSolid(order) {
|
if !model.IsOrderSolid(order) {
|
||||||
globals.SugarLogger.Infof("NotifyNewOrder orderID:%s is not solid", order.VendorOrderID)
|
globals.SugarLogger.Infof("NotifyNewOrder orderID:%s is not solid", order.VendorOrderID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
suffix := ""
|
||||||
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
if err == nil && storeDetail != nil {
|
||||||
|
suffix = storeDetail.CityName + "," + storeDetail.Name
|
||||||
|
}
|
||||||
sb := new(strings.Builder)
|
sb := new(strings.Builder)
|
||||||
sb.WriteString("老板,")
|
sb.WriteString(suffix + "老板,")
|
||||||
sb.WriteString(order.ConsigneeName)
|
sb.WriteString(order.ConsigneeName)
|
||||||
sb.WriteString("购买了商品")
|
sb.WriteString("购买了商品")
|
||||||
sb.WriteString(getOrderDetailBrief(order))
|
sb.WriteString(getOrderDetailBrief(order))
|
||||||
@@ -234,6 +263,11 @@ func NotifyWaybillStatus(bill *model.Waybill, order *model.GoodsOrder, isBillAlr
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
var title string
|
var title string
|
||||||
|
suffix := ""
|
||||||
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
if err == nil && storeDetail != nil {
|
||||||
|
suffix = storeDetail.CityName + "," + storeDetail.Name
|
||||||
|
}
|
||||||
templateID := ""
|
templateID := ""
|
||||||
remark := ""
|
remark := ""
|
||||||
titleColor := ""
|
titleColor := ""
|
||||||
@@ -264,7 +298,7 @@ func NotifyWaybillStatus(bill *model.Waybill, order *model.GoodsOrder, isBillAlr
|
|||||||
if templateID != "" {
|
if templateID != "" {
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"first": map[string]interface{}{
|
"first": map[string]interface{}{
|
||||||
"value": title,
|
"value": suffix + title,
|
||||||
"color": titleColor,
|
"color": titleColor,
|
||||||
},
|
},
|
||||||
"keyword1": map[string]interface{}{
|
"keyword1": map[string]interface{}{
|
||||||
@@ -300,7 +334,12 @@ func NotifyUserApplyCancel(order *model.GoodsOrder, cancelReason string) (err er
|
|||||||
globals.SugarLogger.Infof("NotifyUserApplyCancel orderID:%s is not solid", order.VendorOrderID)
|
globals.SugarLogger.Infof("NotifyUserApplyCancel orderID:%s is not solid", order.VendorOrderID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
title := "老板,您有订单申请取消!请及时联系客户处理!"
|
suffix := ""
|
||||||
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
if err == nil && storeDetail != nil {
|
||||||
|
suffix = storeDetail.CityName + "," + storeDetail.Name
|
||||||
|
}
|
||||||
|
title := suffix + "老板,您有订单申请取消!请及时联系客户处理!"
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"first": map[string]interface{}{
|
"first": map[string]interface{}{
|
||||||
"value": title,
|
"value": title,
|
||||||
@@ -329,6 +368,49 @@ func NotifyUserApplyCancel(order *model.GoodsOrder, cancelReason string) (err er
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NotifyOrderChanged(order *model.GoodsOrder) (err error) {
|
||||||
|
globals.SugarLogger.Debugf("NotifyOrderChanged orderID:%s", order.VendorOrderID)
|
||||||
|
if order.VendorID == model.VendorIDELM {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
suffix := ""
|
||||||
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
if err == nil && storeDetail != nil {
|
||||||
|
suffix = storeDetail.CityName + "," + storeDetail.Name
|
||||||
|
}
|
||||||
|
title := fmt.Sprintf("您有订单的信息已被修改")
|
||||||
|
data := map[string]interface{}{
|
||||||
|
"first": map[string]interface{}{
|
||||||
|
"value": suffix + title,
|
||||||
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
},
|
||||||
|
"keyword1": map[string]interface{}{
|
||||||
|
"value": order.VendorOrderID,
|
||||||
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
},
|
||||||
|
"keyword2": map[string]interface{}{
|
||||||
|
"value": "用户修改订单",
|
||||||
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
},
|
||||||
|
"keyword3": map[string]interface{}{
|
||||||
|
"value": order.ConsigneeAddress + "," + order.ConsigneeName + "," + order.ConsigneeMobile + "," + order.BuyerComment,
|
||||||
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
},
|
||||||
|
"keyword4": map[string]interface{}{
|
||||||
|
"value": utils.Time2Str(order.OrderCreatedAt),
|
||||||
|
"color": VendorColors[order.VendorID],
|
||||||
|
},
|
||||||
|
"remark": map[string]interface{}{
|
||||||
|
"value": "请及时处理",
|
||||||
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
storeID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||||
|
err = SendMsgToStore(storeID, WX_ORDER_CHANGE_INFO_TEMPLATE_ID, "", "", data)
|
||||||
|
netprinter.NofityOrderMsg(jxcontext.AdminCtx, jxutils.GetSaleStoreIDFromOrder(order), order.VendorOrderID, title)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func NotifyOrderCanceled(order *model.GoodsOrder) (err error) {
|
func NotifyOrderCanceled(order *model.GoodsOrder) (err error) {
|
||||||
globals.SugarLogger.Debugf("NotifyOrderCanceled orderID:%s", order.VendorOrderID)
|
globals.SugarLogger.Debugf("NotifyOrderCanceled orderID:%s", order.VendorOrderID)
|
||||||
if order.VendorID == model.VendorIDELM {
|
if order.VendorID == model.VendorIDELM {
|
||||||
@@ -339,7 +421,12 @@ func NotifyOrderCanceled(order *model.GoodsOrder) (err error) {
|
|||||||
globals.SugarLogger.Infof("NotifyOrderCanceled orderID:%s is not solid", order.VendorOrderID)
|
globals.SugarLogger.Infof("NotifyOrderCanceled orderID:%s is not solid", order.VendorOrderID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
title := fmt.Sprintf("老板,您的订单%s第%d号订单, %s被取消了!", model.VendorChineseNames[order.VendorID], order.OrderSeq, order.VendorOrderID)
|
suffix := ""
|
||||||
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
if err == nil && storeDetail != nil {
|
||||||
|
suffix = storeDetail.CityName + "," + storeDetail.Name
|
||||||
|
}
|
||||||
|
title := fmt.Sprintf(suffix+"老板,您的订单%s第%d号订单, %s被取消了!", model.VendorChineseNames[order.VendorID], order.OrderSeq, order.VendorOrderID)
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"first": map[string]interface{}{
|
"first": map[string]interface{}{
|
||||||
"value": title,
|
"value": title,
|
||||||
@@ -374,9 +461,13 @@ func NotifyOrderCanceled(order *model.GoodsOrder) (err error) {
|
|||||||
|
|
||||||
func PushJDBadCommentToWeiXin(comment *legacymodel.JxBadComments, isBadComment bool, order *model.GoodsOrder) (err error) {
|
func PushJDBadCommentToWeiXin(comment *legacymodel.JxBadComments, isBadComment bool, order *model.GoodsOrder) (err error) {
|
||||||
globals.SugarLogger.Debugf("PushJDBadCommentToWeiXin orderID:%s", comment.OrderId)
|
globals.SugarLogger.Debugf("PushJDBadCommentToWeiXin orderID:%s", comment.OrderId)
|
||||||
|
suffix := ""
|
||||||
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
if err == nil && storeDetail != nil {
|
||||||
|
suffix = storeDetail.CityName + "," + storeDetail.Name
|
||||||
|
}
|
||||||
sb := new(strings.Builder)
|
sb := new(strings.Builder)
|
||||||
sb.WriteString(fmt.Sprintf("你收到了%s客户(", model.VendorChineseNames[int(utils.Str2Int64WithDefault(comment.OrderFlag, 0))]))
|
sb.WriteString(fmt.Sprintf(suffix+"你收到了%s客户(", model.VendorChineseNames[int(utils.Str2Int64WithDefault(comment.OrderFlag, 0))]))
|
||||||
sb.WriteString(comment.Userphone)
|
sb.WriteString(comment.Userphone)
|
||||||
sb.WriteString(")的一条")
|
sb.WriteString(")的一条")
|
||||||
sb.WriteString(utils.Int2Str(comment.Score))
|
sb.WriteString(utils.Int2Str(comment.Score))
|
||||||
@@ -460,64 +551,76 @@ func NotifySaleBill(storeID int, title, shopName, fileURL string) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NotifyStoreOpRequestStatus(isAccepted bool, storeID, nameID int, spuName string, originalUnitPrice, unitPrice int, rejectReason string) (err error) {
|
func NotifyStoreOpRequestStatus(isAccepted bool, storeID, nameID int, spuName string, originalUnitPrice, unitPrice int, rejectReason string) (err error) {
|
||||||
// globals.SugarLogger.Debugf("NotifyStoreOpRequestStatus isAccepted:%t, storeID:%d, nameID:%d, spuName:%s, originalUnitPrice:%d, unitPrice:%d, rejectReason:%s", isAccepted, storeID, nameID, spuName, originalUnitPrice, unitPrice, rejectReason)
|
globals.SugarLogger.Debugf("NotifyStoreOpRequestStatus isAccepted:%t, storeID:%d, nameID:%d, spuName:%s, originalUnitPrice:%d, unitPrice:%d, rejectReason:%s", isAccepted, storeID, nameID, spuName, originalUnitPrice, unitPrice, rejectReason)
|
||||||
// templateID := ""
|
templateID := ""
|
||||||
// fileURL := globals.WxBackstageHost + fmt.Sprintf("%s%d", WX_TO_STORE_SKU_PAGE_URL, storeID)
|
fileURL := globals.WxBackstageHost + fmt.Sprintf("%s%d", WX_TO_STORE_SKU_PAGE_URL, storeID)
|
||||||
// data := make(map[string]interface{})
|
data := make(map[string]interface{})
|
||||||
// if isAccepted {
|
if isAccepted {
|
||||||
// templateID = WX_CHANGE_APPROVED_TEMPLATE_ID
|
templateID = WX_CHANGE_APPROVED_TEMPLATE_ID
|
||||||
// data = map[string]interface{}{
|
data = map[string]interface{}{
|
||||||
// "first": map[string]interface{}{
|
|
||||||
// "value": fmt.Sprintf("%s%s元,修改为%s元,已经通过审核。^_^", spuName, jxutils.IntPrice2StandardString(int64(originalUnitPrice)), jxutils.IntPrice2StandardString(int64(unitPrice))),
|
|
||||||
// "color": "#333333",
|
|
||||||
// },
|
|
||||||
// "keyword1": map[string]interface{}{
|
|
||||||
// "value": "审核通过",
|
|
||||||
// "color": "#2E408E",
|
|
||||||
// },
|
|
||||||
// "keyword2": map[string]interface{}{
|
|
||||||
// "value": utils.Time2Str(time.Now()),
|
|
||||||
// "color": "#2E408E",
|
|
||||||
// },
|
|
||||||
// "remark": map[string]interface{}{
|
|
||||||
// "value": "点击查看详情",
|
|
||||||
// },
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// templateID = WX_CHANGE_REJECTED_TEMPLATE_ID
|
|
||||||
// data = map[string]interface{}{
|
|
||||||
// "first": map[string]interface{}{
|
|
||||||
// "value": fmt.Sprintf("您好!抱歉的通知您。%s%s元,修改为%s元,未通过审核。原因:%s", spuName, jxutils.IntPrice2StandardString(int64(originalUnitPrice)), jxutils.IntPrice2StandardString(int64(unitPrice)), rejectReason),
|
|
||||||
// "color": "#E80000",
|
|
||||||
// },
|
|
||||||
// "keyword1": map[string]interface{}{
|
|
||||||
// "value": "1",
|
|
||||||
// "color": "#2E408E",
|
|
||||||
// },
|
|
||||||
// "keyword2": map[string]interface{}{
|
|
||||||
// "value": utils.Time2Str(time.Now()),
|
|
||||||
// "color": "#2E408E",
|
|
||||||
// },
|
|
||||||
// "remark": map[string]interface{}{
|
|
||||||
// "value": "请您及时到商品管理修改价格,修改后请重新提交。",
|
|
||||||
// },
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// err = SendMsgToStore(storeID, templateID, fileURL, WX_MINI_TO_STORE_SKU_PAGE_URL, data)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func NotifyStoreMessage(storeID, msgID, msgStatusID int, title, content string) (err error) {
|
|
||||||
globals.SugarLogger.Debugf("NotifyStoreMessage storeID:%d, msgID:%d, title:%s, content:%s", storeID, msgID, title, content)
|
|
||||||
templateID := WX_NORMAL_STORE_MSG_TEMPLATE_ID
|
|
||||||
fileURL := globals.WxBackstageHost + fmt.Sprintf(WX_TO_SHOW_MSG, msgID, msgStatusID)
|
|
||||||
data := map[string]interface{}{
|
|
||||||
"first": map[string]interface{}{
|
"first": map[string]interface{}{
|
||||||
"value": content,
|
"value": fmt.Sprintf("%s%s元,修改为%s元,已经通过审核。^_^", spuName, jxutils.IntPrice2StandardString(int64(originalUnitPrice)), jxutils.IntPrice2StandardString(int64(unitPrice))),
|
||||||
"color": "#333333",
|
"color": "#333333",
|
||||||
},
|
},
|
||||||
"keyword1": map[string]interface{}{
|
"keyword1": map[string]interface{}{
|
||||||
"value": title,
|
"value": "审核通过",
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"keyword2": map[string]interface{}{
|
||||||
|
"value": utils.Time2Str(time.Now()),
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"remark": map[string]interface{}{
|
||||||
|
"value": "点击查看详情",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
templateID = WX_CHANGE_REJECTED_TEMPLATE_ID
|
||||||
|
data = map[string]interface{}{
|
||||||
|
"first": map[string]interface{}{
|
||||||
|
"value": fmt.Sprintf("您好!抱歉的通知您。%s%s元,修改为%s元,未通过审核。原因:%s", spuName, jxutils.IntPrice2StandardString(int64(originalUnitPrice)), jxutils.IntPrice2StandardString(int64(unitPrice)), rejectReason),
|
||||||
|
"color": "#E80000",
|
||||||
|
},
|
||||||
|
"keyword1": map[string]interface{}{
|
||||||
|
"value": "1",
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"keyword2": map[string]interface{}{
|
||||||
|
"value": "审核不通过",
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"keyword3": map[string]interface{}{
|
||||||
|
"value": utils.Time2Str(time.Now()),
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"keyword4": map[string]interface{}{
|
||||||
|
"value": "审核不通过",
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"remark": map[string]interface{}{
|
||||||
|
"value": "请您及时到商品管理修改价格,修改后请重新提交。",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = SendMsgToStore(storeID, templateID, fileURL, WX_MINI_TO_STORE_SKU_PAGE_URL, data)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotifyStoreMessage(storeID, msgID, msgStatusID int, msg *model.Message) (err error) {
|
||||||
|
globals.SugarLogger.Debugf("NotifyStoreMessage storeID:%d, msgID:%d, title:%s, content:%s", storeID, msgID, msg.Title, msg.Content)
|
||||||
|
templateID := ""
|
||||||
|
fileURL := globals.WxBackstageHost + fmt.Sprintf(WX_TO_SHOW_MSG, msgID, msgStatusID)
|
||||||
|
data := make(map[string]interface{})
|
||||||
|
switch msg.Type {
|
||||||
|
case model.MessageTypeStore:
|
||||||
|
templateID = WX_NORMAL_STORE_MSG_TEMPLATE_ID
|
||||||
|
data = map[string]interface{}{
|
||||||
|
"first": map[string]interface{}{
|
||||||
|
"value": msg.Content,
|
||||||
|
"color": "#333333",
|
||||||
|
},
|
||||||
|
"keyword1": map[string]interface{}{
|
||||||
|
"value": msg.Title,
|
||||||
"color": "#2E408E",
|
"color": "#2E408E",
|
||||||
},
|
},
|
||||||
"keyword2": map[string]interface{}{
|
"keyword2": map[string]interface{}{
|
||||||
@@ -528,6 +631,32 @@ func NotifyStoreMessage(storeID, msgID, msgStatusID int, title, content string)
|
|||||||
"value": "",
|
"value": "",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
case model.MessageTypeStoreAct:
|
||||||
|
actMap := &model.MessageActInfo{}
|
||||||
|
err = json.Unmarshal([]byte(msg.ActInfo), &actMap)
|
||||||
|
templateID = WX_NORMAL_STORE_ACT_MSG_TEMPLATE_ID
|
||||||
|
data = map[string]interface{}{
|
||||||
|
"first": map[string]interface{}{
|
||||||
|
"value": "即将开展[" + msg.Title + "]活动,详情点击",
|
||||||
|
"color": "#333333",
|
||||||
|
},
|
||||||
|
"keyword1": map[string]interface{}{
|
||||||
|
"value": msg.Title,
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"keyword2": map[string]interface{}{
|
||||||
|
"value": actMap.BeginAt + "-" + actMap.EndAt,
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"keyword3": map[string]interface{}{
|
||||||
|
"value": model.VendorNames[int(utils.Interface2Float64WithDefault((actMap.VendorID), 0))],
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"remark": map[string]interface{}{
|
||||||
|
"value": msg.Content,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
return SendMsgToStore(storeID, templateID, fileURL, fmt.Sprintf(WX_MINI_TO_SHOW_MSG, msgID, msgStatusID), data)
|
return SendMsgToStore(storeID, templateID, fileURL, fmt.Sprintf(WX_MINI_TO_SHOW_MSG, msgID, msgStatusID), data)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -536,7 +665,11 @@ func NotifyAfsOrderStatus(afsOrder *model.AfsOrder) (err error) {
|
|||||||
if afsOrder.VendorID == model.VendorIDELM {
|
if afsOrder.VendorID == model.VendorIDELM {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
suffix := ""
|
||||||
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromAfsOrder(afsOrder), afsOrder.VendorID, "")
|
||||||
|
if err == nil && storeDetail != nil {
|
||||||
|
suffix = storeDetail.CityName + "," + storeDetail.Name
|
||||||
|
}
|
||||||
var templateID, comment string
|
var templateID, comment string
|
||||||
if afsOrder.Status == model.AfsOrderStatusWait4Approve {
|
if afsOrder.Status == model.AfsOrderStatusWait4Approve {
|
||||||
templateID = WX_AFS_ORDER_WAIT4APPROVE_TEMPLATE_ID
|
templateID = WX_AFS_ORDER_WAIT4APPROVE_TEMPLATE_ID
|
||||||
@@ -554,7 +687,7 @@ func NotifyAfsOrderStatus(afsOrder *model.AfsOrder) (err error) {
|
|||||||
|
|
||||||
data := map[string]interface{}{
|
data := map[string]interface{}{
|
||||||
"first": map[string]interface{}{
|
"first": map[string]interface{}{
|
||||||
"value": fmt.Sprintf("%s 第%d号订单, %s", model.VendorChineseNames[afsOrder.VendorID], order.OrderSeq, afsOrder.VendorOrderID),
|
"value": suffix + fmt.Sprintf("%s 第%d号订单, %s", model.VendorChineseNames[afsOrder.VendorID], order.OrderSeq, afsOrder.VendorOrderID),
|
||||||
"color": WX_HIGHLEVEL_TEMPLATE_COLOR2,
|
"color": WX_HIGHLEVEL_TEMPLATE_COLOR2,
|
||||||
},
|
},
|
||||||
"keyword1": map[string]interface{}{
|
"keyword1": map[string]interface{}{
|
||||||
@@ -662,8 +795,27 @@ func NotifyStoreAlertMessage(storeID int, storeName, title, content string) (err
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func SendStoreMessage(ctx *jxcontext.Context, title, content string, storeIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
func SendStoreMessage(ctx *jxcontext.Context, title, content string, storeIDs []int, actInfo string, messageType int, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
|
//权限
|
||||||
|
if permission.IsRoled(ctx) {
|
||||||
|
if storeIDsMap, err := permission.GetUserStoresResultMap(ctx.GetUserID()); err == nil {
|
||||||
|
var storeIDs2 []int
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
for _, v := range storeIDs {
|
||||||
|
if storeIDsMap[v] != 0 {
|
||||||
|
storeIDs2 = append(storeIDs2, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for k, _ := range storeIDsMap {
|
||||||
|
storeIDs2 = append(storeIDs2, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
storeIDs = nil
|
||||||
|
storeIDs = storeIDs2
|
||||||
|
}
|
||||||
|
}
|
||||||
dao.Begin(db)
|
dao.Begin(db)
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
@@ -674,7 +826,8 @@ func SendStoreMessage(ctx *jxcontext.Context, title, content string, storeIDs []
|
|||||||
msg := &model.Message{
|
msg := &model.Message{
|
||||||
Title: title,
|
Title: title,
|
||||||
Content: content,
|
Content: content,
|
||||||
Type: model.MessageTypeStore,
|
Type: int8(messageType),
|
||||||
|
ActInfo: actInfo,
|
||||||
}
|
}
|
||||||
dao.WrapAddIDCULDEntity(msg, ctx.GetUserName())
|
dao.WrapAddIDCULDEntity(msg, ctx.GetUserName())
|
||||||
if err = dao.CreateEntity(db, msg); err != nil {
|
if err = dao.CreateEntity(db, msg); err != nil {
|
||||||
@@ -700,7 +853,7 @@ func SendStoreMessage(ctx *jxcontext.Context, title, content string, storeIDs []
|
|||||||
rootTask := tasksch.NewParallelTask("SendStoreMessage", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
rootTask := tasksch.NewParallelTask("SendStoreMessage", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
msgStatus := batchItemList[0].(*model.MessageStatus)
|
msgStatus := batchItemList[0].(*model.MessageStatus)
|
||||||
if err = NotifyStoreMessage(msgStatus.StoreID, msgStatus.MessageID, msgStatus.ID, msg.Title, msg.Content); err == nil {
|
if err = NotifyStoreMessage(msgStatus.StoreID, msgStatus.MessageID, msgStatus.ID, msg); err == nil {
|
||||||
msgStatus.Status = model.MessageStatusSendAllSuccess
|
msgStatus.Status = model.MessageStatusSendAllSuccess
|
||||||
} else {
|
} else {
|
||||||
msgStatus.Status = model.MessageStatusSendAllFailed
|
msgStatus.Status = model.MessageStatusSendAllFailed
|
||||||
@@ -725,13 +878,17 @@ func NotifyAdjustOrder(order *model.GoodsOrder) (err error) {
|
|||||||
if order.VendorID == model.VendorIDELM {
|
if order.VendorID == model.VendorIDELM {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
suffix := ""
|
||||||
|
storeDetail, err := dao.GetStoreDetail(dao.GetDB(), jxutils.GetSaleStoreIDFromOrder(order), order.VendorID, "")
|
||||||
|
if err == nil && storeDetail != nil {
|
||||||
|
suffix = storeDetail.CityName + "," + storeDetail.Name
|
||||||
|
}
|
||||||
if !model.IsOrderSolid(order) {
|
if !model.IsOrderSolid(order) {
|
||||||
globals.SugarLogger.Infof("NotifyAdjustOrder orderID:%s is not solid", order.VendorOrderID)
|
globals.SugarLogger.Infof("NotifyAdjustOrder orderID:%s is not solid", order.VendorOrderID)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
sb := new(strings.Builder)
|
sb := new(strings.Builder)
|
||||||
sb.WriteString("老板,")
|
sb.WriteString(suffix + "老板,")
|
||||||
sb.WriteString(order.ConsigneeName)
|
sb.WriteString(order.ConsigneeName)
|
||||||
sb.WriteString("调整了订单商品,请及时查看!")
|
sb.WriteString("调整了订单商品,请及时查看!")
|
||||||
sb.WriteString(getOrderDetailBrief(order))
|
sb.WriteString(getOrderDetailBrief(order))
|
||||||
@@ -741,7 +898,7 @@ func NotifyAdjustOrder(order *model.GoodsOrder) (err error) {
|
|||||||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
},
|
},
|
||||||
"keyword1": map[string]interface{}{
|
"keyword1": map[string]interface{}{
|
||||||
"value": jxutils.IntPrice2Standard(order.NewEarningPrice),
|
"value": math.Round(jxutils.IntPrice2Standard(order.NewEarningPrice)),
|
||||||
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
"color": WX_NEW_ORDER_TEMPLATE_COLOR,
|
||||||
},
|
},
|
||||||
"keyword2": map[string]interface{}{
|
"keyword2": map[string]interface{}{
|
||||||
@@ -756,3 +913,107 @@ func NotifyAdjustOrder(order *model.GoodsOrder) (err error) {
|
|||||||
storeID := jxutils.GetSaleStoreIDFromOrder(order)
|
storeID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||||
return SendMsgToStore(storeID, WX_ADJUSTORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
|
return SendMsgToStore(storeID, WX_ADJUSTORDER_TEMPLATE_ID, globals.WxBackstageHost+fmt.Sprintf("%s%d", WX_TO_ORDER_PAGE_URL, storeID), WX_MINI_TO_ORDER_PAGE_URL, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SendUserMessage(ctx *jxcontext.Context, title, content string, userIDs []string, isAsync, isContinueWhenError bool) (hint string, err error) {
|
||||||
|
db := dao.GetDB()
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
msg := &model.Message{
|
||||||
|
Title: title,
|
||||||
|
Content: content,
|
||||||
|
Type: model.MessageTypeUser,
|
||||||
|
}
|
||||||
|
dao.WrapAddIDCULDEntity(msg, ctx.GetUserName())
|
||||||
|
if err = dao.CreateEntity(db, msg); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
msgStatusList := make([]*model.MessageStatus, len(userIDs))
|
||||||
|
for k, userID := range userIDs {
|
||||||
|
msgStatus := &model.MessageStatus{
|
||||||
|
MessageID: msg.ID,
|
||||||
|
UserID: userID,
|
||||||
|
Status: model.MessageStatusNew,
|
||||||
|
}
|
||||||
|
dao.WrapAddIDCULDEntity(msgStatus, ctx.GetUserName())
|
||||||
|
if err = dao.CreateEntity(db, msgStatus); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
msgStatusList[k] = msgStatus
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
|
||||||
|
rootTask := tasksch.NewParallelTask("SendUserMessage", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
||||||
|
db := dao.GetDB()
|
||||||
|
msgStatus := batchItemList[0].(*model.MessageStatus)
|
||||||
|
if err = NotifyUserMessage(msgStatus.UserID, msg.Title, msg.Content); err == nil {
|
||||||
|
msgStatus.Status = model.MessageStatusSendAllSuccess
|
||||||
|
} else {
|
||||||
|
msgStatus.Status = model.MessageStatusSendAllFailed
|
||||||
|
}
|
||||||
|
dao.WrapUpdateULEntity(msgStatus, ctx.GetUserName())
|
||||||
|
_, err = dao.UpdateEntity(db, msgStatus)
|
||||||
|
return nil, err
|
||||||
|
}, msgStatusList)
|
||||||
|
tasksch.HandleTask(rootTask, nil, len(msgStatusList) > 5).Run()
|
||||||
|
if !isAsync {
|
||||||
|
_, err = rootTask.GetResult(0)
|
||||||
|
} else {
|
||||||
|
hint = rootTask.ID
|
||||||
|
}
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
func NotifyUserMessage(userID string, title, content string) (err error) {
|
||||||
|
globals.SugarLogger.Debugf("NotifyUserMessage userID:%d, title:%s, content:%s", userID, title, content)
|
||||||
|
templateID := WX_NORMAL_STORE_MSG_TEMPLATE_ID
|
||||||
|
data := map[string]interface{}{
|
||||||
|
"first": map[string]interface{}{
|
||||||
|
"value": content,
|
||||||
|
"color": "#333333",
|
||||||
|
},
|
||||||
|
"keyword1": map[string]interface{}{
|
||||||
|
"value": title,
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"keyword2": map[string]interface{}{
|
||||||
|
"value": utils.GetCurTimeStr(),
|
||||||
|
"color": "#2E408E",
|
||||||
|
},
|
||||||
|
"remark": map[string]interface{}{
|
||||||
|
"value": "",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return SendMsgToUser(userID, templateID, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendMsgToUser(userID string, templateID string, data interface{}) (err error) {
|
||||||
|
globals.SugarLogger.Debugf("SendMsgToUser userID:%d, templateID:%s", userID, templateID)
|
||||||
|
authBinds, err := dao.GetUserBindAuthInfo(dao.GetDB(), userID, model.AuthBindTypeAuth, []string{"weixinsns"}, "", "", "wx2bb99eb5d2c9b82c")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
successCount := 0
|
||||||
|
if len(authBinds) == 0 {
|
||||||
|
return fmt.Errorf("此用户未找到微信认证方式!userID: %v", userID)
|
||||||
|
}
|
||||||
|
globals.SugarLogger.Debugf("SendMsgToUser userID:%d, openID:%s, templateID:%s", userID, authBinds[0].AuthID, templateID)
|
||||||
|
if err2 := SmartMessageTemplateSend(authBinds[0].AuthID, templateID, "", "", data); err2 == nil {
|
||||||
|
successCount++
|
||||||
|
} else {
|
||||||
|
err = err2
|
||||||
|
}
|
||||||
|
if successCount > 0 {
|
||||||
|
err = nil // 只要成功一个都当成成功
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
globals.SugarLogger.Debugf("SendMsgToUser all failed userID:%d, templateID:%s, error:%v", userID, templateID, err)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|||||||
@@ -9,8 +9,16 @@ import (
|
|||||||
const (
|
const (
|
||||||
ActTypeAll = -1
|
ActTypeAll = -1
|
||||||
ActSkuFake = 0 // 假活动,只用于存储活动结算信息
|
ActSkuFake = 0 // 假活动,只用于存储活动结算信息
|
||||||
ActSkuDirectDown = 3 // 兼容之前的
|
ActSkuDirectDown = 3 // 直降
|
||||||
ActSkuSecKill = 4 // 兼容之前的
|
ActSkuSecKill = 4 // 秒杀
|
||||||
|
ActSkuDiscount = 5 // 折扣
|
||||||
|
|
||||||
|
ActDiscountTypePrice = 1 //折扣类型是最低价
|
||||||
|
ActDiscountTypePercentage = 2 //折扣类型是最低折扣
|
||||||
|
|
||||||
|
TrendTypeUp = 1 //涨价趋势
|
||||||
|
TrendTypeDown = 2 //降价趋势
|
||||||
|
TrendTypeNothing = 0 //不变
|
||||||
|
|
||||||
ActOrderBegin = 10
|
ActOrderBegin = 10
|
||||||
ActOrderMoneyOff = 11
|
ActOrderMoneyOff = 11
|
||||||
@@ -38,6 +46,7 @@ var (
|
|||||||
ActSkuFake: "结算",
|
ActSkuFake: "结算",
|
||||||
ActSkuDirectDown: "直降",
|
ActSkuDirectDown: "直降",
|
||||||
ActSkuSecKill: "秒杀",
|
ActSkuSecKill: "秒杀",
|
||||||
|
ActSkuDiscount: "折扣",
|
||||||
}
|
}
|
||||||
|
|
||||||
ActStatusName = map[int]string{
|
ActStatusName = map[int]string{
|
||||||
@@ -73,6 +82,9 @@ type Act struct {
|
|||||||
EndAt time.Time `orm:"type(datetime);index" json:"endAt"`
|
EndAt time.Time `orm:"type(datetime);index" json:"endAt"`
|
||||||
VendorMask int `json:"-"`
|
VendorMask int `json:"-"`
|
||||||
Remark string `orm:"size(255)" json:"remark"`
|
Remark string `orm:"size(255)" json:"remark"`
|
||||||
|
DiscountType int `json:"discountType"` //折扣类型,1为最低价,2为最低折扣
|
||||||
|
DiscountValue1 int `json:"DiscountValue1"` //第一档折扣
|
||||||
|
DiscountValue2 int `json:"DiscountValue2"` //第二档折扣
|
||||||
}
|
}
|
||||||
|
|
||||||
// test
|
// test
|
||||||
@@ -171,6 +183,8 @@ type ActStoreSkuMap struct {
|
|||||||
VendorPrice int64 `json:"vendorPrice"` // 创建活动时的平台价格
|
VendorPrice int64 `json:"vendorPrice"` // 创建活动时的平台价格
|
||||||
ActualActPrice int64 `json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格
|
ActualActPrice int64 `json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格
|
||||||
EarningPrice int64 `json:"earningPrice"` // 活动商品设置,结算给门店老板的钱
|
EarningPrice int64 `json:"earningPrice"` // 活动商品设置,结算给门店老板的钱
|
||||||
|
TrendType int `json:"trendType"` //折扣活动使用,涨跌趋势,1为涨,2为跌,0为不动
|
||||||
|
TrendPrice int `json:"trendPrice"` //涨跌具体多少
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*ActStoreSkuMap) TableUnique() [][]string {
|
func (*ActStoreSkuMap) TableUnique() [][]string {
|
||||||
@@ -190,6 +204,9 @@ type ActStoreSku2 struct {
|
|||||||
MapID int `orm:"column(map_id)"`
|
MapID int `orm:"column(map_id)"`
|
||||||
|
|
||||||
Type int `json:"type"`
|
Type int `json:"type"`
|
||||||
|
DiscountType int `json:"discountType"`
|
||||||
|
DiscountValue1 int `json:"discountValue1"`
|
||||||
|
DiscountValue2 int `json:"discountValue2"`
|
||||||
|
|
||||||
ActStoreSku
|
ActStoreSku
|
||||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||||
@@ -215,6 +232,8 @@ type ActStoreSku2 struct {
|
|||||||
SpecQuality float32 `json:"-"`
|
SpecQuality float32 `json:"-"`
|
||||||
SpecUnit string `json:"-"`
|
SpecUnit string `json:"-"`
|
||||||
Comment string `json:"-"`
|
Comment string `json:"-"`
|
||||||
|
TrendType int `json:"trendType"` //折扣活动使用,涨跌趋势,1为涨,2为跌,0为不动
|
||||||
|
TrendPrice int `json:"trendPrice"` //涨跌具体多少
|
||||||
}
|
}
|
||||||
|
|
||||||
type StoreSkuAct struct {
|
type StoreSkuAct struct {
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ type GoodsOrderExt struct {
|
|||||||
DistrictName string `json:"districtName"`
|
DistrictName string `json:"districtName"`
|
||||||
CityName string `json:"cityName"`
|
CityName string `json:"cityName"`
|
||||||
PayPercentage int `json:"payPercentage"`
|
PayPercentage int `json:"payPercentage"`
|
||||||
|
VendorPayPercentage int `json:"vendorPayPercentage"`
|
||||||
|
OldPayPercentage int `json:"oldPayPercentage"`
|
||||||
|
|
||||||
SkuInfo string `json:"skuInfo,omitempty"`
|
SkuInfo string `json:"skuInfo,omitempty"`
|
||||||
SkuInfo2 string `json:"skuInfo2,omitempty"`
|
SkuInfo2 string `json:"skuInfo2,omitempty"`
|
||||||
@@ -47,6 +49,9 @@ type GoodsOrderExt struct {
|
|||||||
ShopSumPrice int64 `json:"shopSumPrice"`
|
ShopSumPrice int64 `json:"shopSumPrice"`
|
||||||
AvgPrice int64 `json:"avgPrice"`
|
AvgPrice int64 `json:"avgPrice"`
|
||||||
BadCommentCount int `json:"badCommentCount"`
|
BadCommentCount int `json:"badCommentCount"`
|
||||||
|
|
||||||
|
FloatLng float64 `json:"floatLng"`
|
||||||
|
FloatLat float64 `json:"floatLat"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type OrderSkuExt struct {
|
type OrderSkuExt struct {
|
||||||
|
|||||||
@@ -26,7 +26,8 @@ const (
|
|||||||
VendorIDDada = 101
|
VendorIDDada = 101
|
||||||
VendorIDMTPS = 102
|
VendorIDMTPS = 102
|
||||||
VendorIDFengNiao = 103
|
VendorIDFengNiao = 103
|
||||||
VendorIDDeliveryEnd = 200
|
VendorIDJDWL = 401 //京东物流
|
||||||
|
VendorIDDeliveryEnd = 500
|
||||||
|
|
||||||
VendorIDPrinterBegin = 201
|
VendorIDPrinterBegin = 201
|
||||||
VendorIDFeiE = 201 // 飞鹅打印机
|
VendorIDFeiE = 201 // 飞鹅打印机
|
||||||
@@ -48,7 +49,6 @@ const (
|
|||||||
VendorIDQiNiuCloud = 323 // 七牛云
|
VendorIDQiNiuCloud = 323 // 七牛云
|
||||||
VendorIDShowAPI = 325 // 万维易源
|
VendorIDShowAPI = 325 // 万维易源
|
||||||
|
|
||||||
VendorIDJDWL = 401 //京东物流
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type VendorInfo struct {
|
type VendorInfo struct {
|
||||||
@@ -75,6 +75,7 @@ var (
|
|||||||
|
|
||||||
VendorIDDada: "Dada",
|
VendorIDDada: "Dada",
|
||||||
VendorIDMTPS: "Mtps",
|
VendorIDMTPS: "Mtps",
|
||||||
|
VendorIDFengNiao: "Fn",
|
||||||
|
|
||||||
VendorIDFeiE: "Feie",
|
VendorIDFeiE: "Feie",
|
||||||
VendorIDXiaoWM: "XiaoWM",
|
VendorIDXiaoWM: "XiaoWM",
|
||||||
@@ -82,6 +83,7 @@ var (
|
|||||||
VendorIDZhongWu: "ZhongWu",
|
VendorIDZhongWu: "ZhongWu",
|
||||||
|
|
||||||
VendorIDQiNiuCloud: "Qiniu",
|
VendorIDQiNiuCloud: "Qiniu",
|
||||||
|
VendorIDJDWL: "Jdwl",
|
||||||
}
|
}
|
||||||
|
|
||||||
VendorTypeName = map[int]string{
|
VendorTypeName = map[int]string{
|
||||||
@@ -104,6 +106,7 @@ var (
|
|||||||
VendorIDDada: "达达众包",
|
VendorIDDada: "达达众包",
|
||||||
VendorIDMTPS: "美团配送",
|
VendorIDMTPS: "美团配送",
|
||||||
VendorIDJDWL: "京东物流",
|
VendorIDJDWL: "京东物流",
|
||||||
|
VendorIDFengNiao: "蜂鸟配送",
|
||||||
|
|
||||||
VendorIDFeiE: "飞鹅",
|
VendorIDFeiE: "飞鹅",
|
||||||
VendorIDXiaoWM: "外卖管家",
|
VendorIDXiaoWM: "外卖管家",
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ var (
|
|||||||
|
|
||||||
OrderStatusWait4Pay: "待付款",
|
OrderStatusWait4Pay: "待付款",
|
||||||
OrderStatusNew: "新订单",
|
OrderStatusNew: "新订单",
|
||||||
|
OrderStatusWaitAccepted: "待接单",
|
||||||
OrderStatusAccepted: "待拣货",
|
OrderStatusAccepted: "待拣货",
|
||||||
OrderStatusFinishedPickup: "待配送",
|
OrderStatusFinishedPickup: "待配送",
|
||||||
OrderStatusApplyFailedGetGoods: "取货失败待审核",
|
OrderStatusApplyFailedGetGoods: "取货失败待审核",
|
||||||
@@ -76,6 +77,7 @@ var (
|
|||||||
WaybillStatusPending: "压单",
|
WaybillStatusPending: "压单",
|
||||||
WaybillStatusAcceptCanceled: "取消接受",
|
WaybillStatusAcceptCanceled: "取消接受",
|
||||||
WaybillStatusAccepted: "已接单",
|
WaybillStatusAccepted: "已接单",
|
||||||
|
WaybillStatusCourierAssigned: "已分配骑手",
|
||||||
WaybillStatusCourierArrived: "已到店",
|
WaybillStatusCourierArrived: "已到店",
|
||||||
WaybillStatusApplyFailedGetGoods: "取货失败待审核",
|
WaybillStatusApplyFailedGetGoods: "取货失败待审核",
|
||||||
WaybillStatusAgreeFailedGetGoods: "取货失败",
|
WaybillStatusAgreeFailedGetGoods: "取货失败",
|
||||||
@@ -151,6 +153,15 @@ var (
|
|||||||
VendorIDEBAI: 0,
|
VendorIDEBAI: 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ZXCityCodeMap = map[int]string{
|
||||||
|
310100: "上海市",
|
||||||
|
110100: "北京市",
|
||||||
|
120100: "天津市",
|
||||||
|
440300: "深圳市",
|
||||||
|
500100: "重庆市",
|
||||||
|
441900: "东莞",
|
||||||
|
}
|
||||||
|
|
||||||
PrinterVendorInfo = map[int][]string{
|
PrinterVendorInfo = map[int][]string{
|
||||||
VendorIDFeiE: []string{
|
VendorIDFeiE: []string{
|
||||||
VendorChineseNames[VendorIDFeiE],
|
VendorChineseNames[VendorIDFeiE],
|
||||||
@@ -191,6 +202,10 @@ var (
|
|||||||
AfsAppealTypeReturnAndRefund: "退款", // 这个其实是退货退款,强制显示成退款
|
AfsAppealTypeReturnAndRefund: "退款", // 这个其实是退货退款,强制显示成退款
|
||||||
AfsAppealTypeNewGoods: "退款.", // 这个其实是重发商品,强制显示成退款
|
AfsAppealTypeNewGoods: "退款.", // 这个其实是重发商品,强制显示成退款
|
||||||
}
|
}
|
||||||
|
VendorStatus = map[int]string{
|
||||||
|
0: "休息",
|
||||||
|
1: "营业",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -234,6 +249,7 @@ const (
|
|||||||
|
|
||||||
OrderStatusUnknown = 0
|
OrderStatusUnknown = 0
|
||||||
OrderStatusWait4Pay = 2 // 原值-60 下单待支付
|
OrderStatusWait4Pay = 2 // 原值-60 下单待支付
|
||||||
|
OrderStatusWaitAccepted = 3 // 待接单,目前饿百用
|
||||||
OrderStatusNew = 5 // 新订单,实际是已经支付
|
OrderStatusNew = 5 // 新订单,实际是已经支付
|
||||||
OrderStatusAccepted = 10 // 已经接单,也即待出库,待拣货
|
OrderStatusAccepted = 10 // 已经接单,也即待出库,待拣货
|
||||||
OrderStatusFinishedPickup = 15 // 拣货完成
|
OrderStatusFinishedPickup = 15 // 拣货完成
|
||||||
@@ -295,6 +311,7 @@ const (
|
|||||||
WaybillStatusPending = 7
|
WaybillStatusPending = 7
|
||||||
WaybillStatusAcceptCanceled = 8
|
WaybillStatusAcceptCanceled = 8
|
||||||
WaybillStatusAccepted = 10
|
WaybillStatusAccepted = 10
|
||||||
|
WaybillStatusCourierAssigned = 12 //已分配骑手
|
||||||
WaybillStatusCourierArrived = 15 // 此状态是可选的,明确写出来是因为还是较重要的状态,但业务逻辑不应依赖此状态
|
WaybillStatusCourierArrived = 15 // 此状态是可选的,明确写出来是因为还是较重要的状态,但业务逻辑不应依赖此状态
|
||||||
|
|
||||||
WaybillStatusApplyFailedGetGoods = 17 // 取货失败待审核
|
WaybillStatusApplyFailedGetGoods = 17 // 取货失败待审核
|
||||||
@@ -406,6 +423,8 @@ const (
|
|||||||
YES = 1 //通用
|
YES = 1 //通用
|
||||||
NO = 0
|
NO = 0
|
||||||
DISABLED = -1
|
DISABLED = -1
|
||||||
|
|
||||||
|
Nothing = "nothing"
|
||||||
)
|
)
|
||||||
|
|
||||||
func IsPurchaseVendorExist(vendorID int) bool {
|
func IsPurchaseVendorExist(vendorID int) bool {
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ func GetActStoreSkuVendorList(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs
|
|||||||
sql := fmt.Sprintf(`
|
sql := fmt.Sprintf(`
|
||||||
SELECT SQL_CALC_FOUND_ROWS
|
SELECT SQL_CALC_FOUND_ROWS
|
||||||
t1.*,
|
t1.*,
|
||||||
t2.id map_id, t2.vendor_id, t2.vendor_act_id, t2.sync_status, t2.actual_act_price, t2.vendor_price,
|
t2.id map_id, t2.vendor_id, t2.vendor_act_id, t2.sync_status, t2.actual_act_price, t2.vendor_price, t2.trend_type, t2.trend_price,
|
||||||
t3.vendor_store_id,
|
t3.vendor_store_id,
|
||||||
CASE t2.vendor_id
|
CASE t2.vendor_id
|
||||||
WHEN 0 THEN
|
WHEN 0 THEN
|
||||||
@@ -373,9 +373,9 @@ func GetEffectiveActStoreSkuInfo(db *DaoDB, actID int, vendorIDs []int, actType
|
|||||||
}
|
}
|
||||||
sql := `
|
sql := `
|
||||||
SELECT
|
SELECT
|
||||||
t1.type,
|
t1.type, t1.discount_type, t1.discount_value1, t1.discount_value2,
|
||||||
t2.*,
|
t2.*,
|
||||||
t3.actual_act_price, t3.sync_status, t3.vendor_price, t3.vendor_id
|
t3.actual_act_price, t3.sync_status, t3.vendor_price, t3.vendor_id, t3.trend_type, t3.trend_price
|
||||||
FROM act t1
|
FROM act t1
|
||||||
JOIN act_store_sku t2 ON t2.act_id = t1.id AND t2.deleted_at = ?
|
JOIN act_store_sku t2 ON t2.act_id = t1.id AND t2.deleted_at = ?
|
||||||
JOIN act_store_sku_map t3 ON t3.bind_id = t2.id AND t3.act_id = t1.id AND (t3.sync_status & ? = 0 OR t1.type = ?)
|
JOIN act_store_sku_map t3 ON t3.bind_id = t2.id AND t3.act_id = t1.id AND (t3.sync_status & ? = 0 OR t1.type = ?)
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package dao
|
package dao
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -30,3 +31,26 @@ func GetNeedUploadDataResource(db *DaoDB) (dataResList []*model.DataResource, er
|
|||||||
err = GetRows(db, &dataResList, sql)
|
err = GetRows(db, &dataResList, sql)
|
||||||
return dataResList, err
|
return dataResList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetVendorOrgCode(db *DaoDB, vendorID int, vendorOrgCode, vendorType string) (vendorOrgs []*model.VendorOrgCode, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM vendor_org_code
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{utils.DefaultTimeValue}
|
||||||
|
if vendorID != -1 {
|
||||||
|
sql += " AND vendor_id = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorID)
|
||||||
|
}
|
||||||
|
if vendorOrgCode != "" {
|
||||||
|
sql += " AND vendor_org_code = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorOrgCode)
|
||||||
|
}
|
||||||
|
if vendorType != "" {
|
||||||
|
sql += " AND vendor_type = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorType)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &vendorOrgs, sql, sqlParams)
|
||||||
|
return vendorOrgs, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ type StoresOrderSaleInfo struct {
|
|||||||
|
|
||||||
DistanceFreightMoney int64 `json:"distanceFreightMoney"` // 商户承担的远距离配送费(当前只有京东到家有值)
|
DistanceFreightMoney int64 `json:"distanceFreightMoney"` // 商户承担的远距离配送费(当前只有京东到家有值)
|
||||||
WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费
|
WaybillTipMoney int64 `json:"waybillTipMoney"` // 京西加的平台配送小费
|
||||||
|
|
||||||
|
RealEarningPrice int64 `json:"realEarningPrice"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type OrderSkuWithActualPayPrice struct {
|
type OrderSkuWithActualPayPrice struct {
|
||||||
@@ -44,7 +46,10 @@ type OrderSkuWithActualPayPrice struct {
|
|||||||
Status int `json:"status"` // 参见OrderStatus*相关的常量定义
|
Status int `json:"status"` // 参见OrderStatus*相关的常量定义
|
||||||
|
|
||||||
PayPercentage int `json:"payPercentage"`
|
PayPercentage int `json:"payPercentage"`
|
||||||
|
OrderPayPercentage int `json:"orderPayPercentage"`
|
||||||
NewEarningPrice int64 `json:"newEarningPrice"`
|
NewEarningPrice int64 `json:"newEarningPrice"`
|
||||||
|
EarningType int `json:"earningType"`
|
||||||
|
CityCode int `json:"cityCode"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type tGoodsAndOrder struct {
|
type tGoodsAndOrder struct {
|
||||||
@@ -337,7 +342,7 @@ func GetStoresOrderSaleInfo(db *DaoDB, storeIDList []int, fromTime time.Time, to
|
|||||||
return saleInfoList, err
|
return saleInfoList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAfsOrderSkuInfo(db *DaoDB, vendorOrderID, afsOrderID string, vendorID int) (skus []*model.OrderFinancialSkuExt, err error) {
|
func GetAfsOrderSkuInfo(db *DaoDB, vendorOrderID, afsOrderID string, vendorID int, isNotFaild bool) (skus []*model.OrderFinancialSkuExt, err error) {
|
||||||
if vendorOrderID == "" && afsOrderID == "" {
|
if vendorOrderID == "" && afsOrderID == "" {
|
||||||
return nil, fmt.Errorf("必须指定订单或售后单ID")
|
return nil, fmt.Errorf("必须指定订单或售后单ID")
|
||||||
}
|
}
|
||||||
@@ -346,6 +351,7 @@ func GetAfsOrderSkuInfo(db *DaoDB, vendorOrderID, afsOrderID string, vendorID in
|
|||||||
FROM order_sku_financial t1
|
FROM order_sku_financial t1
|
||||||
LEFT JOIN sku t2 ON t2.id = IF(t1.jx_sku_id <> 0, t1.jx_sku_id, t1.sku_id)
|
LEFT JOIN sku t2 ON t2.id = IF(t1.jx_sku_id <> 0, t1.jx_sku_id, t1.sku_id)
|
||||||
LEFT JOIN sku_name t3 ON t3.id = t2.name_id
|
LEFT JOIN sku_name t3 ON t3.id = t2.name_id
|
||||||
|
LEFT JOIN afs_order t4 ON t4.afs_order_id = t1.afs_order_id
|
||||||
WHERE t1.is_afs_order = 1 AND t1.vendor_id = ?`
|
WHERE t1.is_afs_order = 1 AND t1.vendor_id = ?`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
vendorID,
|
vendorID,
|
||||||
@@ -359,7 +365,10 @@ func GetAfsOrderSkuInfo(db *DaoDB, vendorOrderID, afsOrderID string, vendorID in
|
|||||||
sql += " AND t1.afs_order_id = ?"
|
sql += " AND t1.afs_order_id = ?"
|
||||||
sqlParams = append(sqlParams, afsOrderID)
|
sqlParams = append(sqlParams, afsOrderID)
|
||||||
}
|
}
|
||||||
|
if isNotFaild {
|
||||||
|
sql += " AND t4.status <> ?"
|
||||||
|
sqlParams = append(sqlParams, model.AfsOrderStatusFailed)
|
||||||
|
}
|
||||||
err = GetRows(db, &skus, sql, sqlParams...)
|
err = GetRows(db, &skus, sql, sqlParams...)
|
||||||
return skus, err
|
return skus, err
|
||||||
}
|
}
|
||||||
@@ -369,7 +378,7 @@ func GetStoreOrderSkuList(db *DaoDB, storeIDs []int, finishedAtBegin, finishedAt
|
|||||||
sql := `
|
sql := `
|
||||||
SELECT t1.*,
|
SELECT t1.*,
|
||||||
IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, t2.status, t2.actual_pay_price, t2.distance_freight_money, t2.waybill_tip_money, t2.new_earning_price,
|
IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id) store_id, t2.status, t2.actual_pay_price, t2.distance_freight_money, t2.waybill_tip_money, t2.new_earning_price,
|
||||||
t3.pay_percentage
|
t3.pay_percentage, t2.earning_type, t2.order_pay_percentage, t3.city_code
|
||||||
FROM order_sku t1
|
FROM order_sku t1
|
||||||
JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id
|
JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id
|
||||||
LEFT JOIN store t3 ON t3.id = IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id)
|
LEFT JOIN store t3 ON t3.id = IF(t2.jx_store_id > 0, t2.jx_store_id, t2.store_id)
|
||||||
@@ -763,11 +772,11 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
|
|||||||
|
|
||||||
sql := fmt.Sprintf(`
|
sql := fmt.Sprintf(`
|
||||||
SELECT SQL_CALC_FOUND_ROWS
|
SELECT SQL_CALC_FOUND_ROWS
|
||||||
t1.*,
|
DISTINCT t1.*,
|
||||||
CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) earning_price,
|
CAST(IF(t1.earning_price <> 0, t1.earning_price, IF(t1.shop_price <> 0 && t1.shop_price < t1.sale_price, t1.shop_price, t1.sale_price) * IF(t5.pay_percentage > 0, t5.pay_percentage, %d) / 100) AS SIGNED) earning_price,
|
||||||
t2.status waybill_status, t2.courier_name, t2.courier_mobile,
|
t2.status waybill_status, t2.courier_name, t2.courier_mobile,
|
||||||
t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at,
|
t2.actual_fee, t2.desired_fee, t2.waybill_created_at, t2.waybill_finished_at,
|
||||||
t5.pay_percentage,
|
t5.pay_percentage, t5.old_pay_percentage, t6.vendor_pay_percentage,
|
||||||
city.name city_name, district.name district_name`, model.DefaultEarningPricePercentage)
|
city.name city_name, district.name district_name`, model.DefaultEarningPricePercentage)
|
||||||
if isIncludeSku {
|
if isIncludeSku {
|
||||||
sql += `,
|
sql += `,
|
||||||
@@ -780,8 +789,9 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
|
|||||||
}
|
}
|
||||||
sql += `
|
sql += `
|
||||||
FROM goods_order t1
|
FROM goods_order t1
|
||||||
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id
|
LEFT JOIN waybill t2 ON t1.vendor_waybill_id = t2.vendor_waybill_id AND t1.waybill_vendor_id = t2.waybill_vendor_id AND t1.vendor_order_id = t2.vendor_order_id
|
||||||
LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id)
|
LEFT JOIN store t5 ON t5.id = IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id)
|
||||||
|
LEFT JOIN store_map t6 ON t6.store_id = t5.id AND t6.deleted_at = '1970-01-01 00:00:00' AND t6.vendor_id = t1.vendor_id
|
||||||
LEFT JOIN place city ON city.code = t5.city_code
|
LEFT JOIN place city ON city.code = t5.city_code
|
||||||
LEFT JOIN place district ON district.code = t5.district_code`
|
LEFT JOIN place district ON district.code = t5.district_code`
|
||||||
if isIncludeSku {
|
if isIncludeSku {
|
||||||
@@ -894,6 +904,12 @@ func GetOrders(db *DaoDB, ids []int64, isIncludeSku, isIncludeFake bool, fromDat
|
|||||||
sqlParams = append(sqlParams, lockStatuss)
|
sqlParams = append(sqlParams, lockStatuss)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if params["brandID"] != nil {
|
||||||
|
if utils.MustInterface2Int64(params["brandID"]) != 0 {
|
||||||
|
sqlWhere += " AND t5.brand_id = ?"
|
||||||
|
sqlParams = append(sqlParams, utils.MustInterface2Int64(params["brandID"]))
|
||||||
|
}
|
||||||
|
}
|
||||||
if params["cities"] != nil {
|
if params["cities"] != nil {
|
||||||
var cities []int
|
var cities []int
|
||||||
if err = utils.UnmarshalUseNumber([]byte(params["cities"].(string)), &cities); err != nil {
|
if err = utils.UnmarshalUseNumber([]byte(params["cities"].(string)), &cities); err != nil {
|
||||||
@@ -1259,12 +1275,12 @@ func GetWaybills(db *DaoDB, vendorOrderID string) (waybills []*model.Waybill, er
|
|||||||
func GetMatterChildOrders(db *DaoDB, vendorOrderID string) (goods []*model.GoodsOrder, err error) {
|
func GetMatterChildOrders(db *DaoDB, vendorOrderID string) (goods []*model.GoodsOrder, err error) {
|
||||||
sql := `SELECT *
|
sql := `SELECT *
|
||||||
FROM goods_order
|
FROM goods_order
|
||||||
WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ?
|
WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? OR vendor_order_id LIKE ?
|
||||||
AND vendor_id = ?
|
AND vendor_id = ?
|
||||||
ORDER BY vendor_order_id DESC
|
ORDER BY vendor_order_id DESC
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
vendorOrderID + "0%", vendorOrderID + "1%",
|
vendorOrderID + "0%", vendorOrderID + "1%", vendorOrderID + "2%",
|
||||||
model.VendorIDJX,
|
model.VendorIDJX,
|
||||||
}
|
}
|
||||||
err = GetRows(db, &goods, sql, sqlParams)
|
err = GetRows(db, &goods, sql, sqlParams)
|
||||||
@@ -1281,3 +1297,313 @@ func GetSimpleOrder(db *DaoDB, vendorOrderID string) (goods *model.GoodsOrder, e
|
|||||||
err = GetRow(db, &goods, sql, sqlParams)
|
err = GetRow(db, &goods, sql, sqlParams)
|
||||||
return goods, err
|
return goods, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetSimpleOrderSkus(db *DaoDB, vendorOrderID string, skuIDs []int) (skus []*model.OrderSku, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM order_sku
|
||||||
|
WHERE vendor_order_id = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{vendorOrderID}
|
||||||
|
if len(skuIDs) > 0 {
|
||||||
|
sql += " AND sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, skuIDs)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &skus, sql, sqlParams)
|
||||||
|
return skus, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetAfsOrdersByPage(db *DaoDB, vendorOrderID, afsOrderID, userID string, fromTime, toTime time.Time, offset, pageSize int) (afsOrderList []*model.AfsOrder, totalCount int, err error) {
|
||||||
|
pageSize = jxutils.FormalizePageSize(pageSize)
|
||||||
|
offset = jxutils.FormalizePageOffset(offset)
|
||||||
|
sql := `
|
||||||
|
SELECT SQL_CALC_FOUND_ROWS t1.*
|
||||||
|
FROM afs_order t1
|
||||||
|
LEFT JOIN goods_order t2 ON t2.vendor_order_id = t1.vendor_order_id AND t2.vendor_id = t1.vendor_id
|
||||||
|
WHERE 1 = 1
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
if vendorOrderID != "" {
|
||||||
|
sql += " AND t1.vendor_order_id = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorOrderID)
|
||||||
|
}
|
||||||
|
if afsOrderID != "" {
|
||||||
|
sql += " AND t1.afs_order_id = ?"
|
||||||
|
sqlParams = append(sqlParams, afsOrderID)
|
||||||
|
}
|
||||||
|
if !utils.IsTimeZero(fromTime) {
|
||||||
|
sql += " AND t1.afs_created_at >= ?"
|
||||||
|
sqlParams = append(sqlParams, fromTime)
|
||||||
|
}
|
||||||
|
if !utils.IsTimeZero(toTime) {
|
||||||
|
sql += " AND t1.afs_created_at <= ?"
|
||||||
|
sqlParams = append(sqlParams, toTime)
|
||||||
|
}
|
||||||
|
if userID != "" {
|
||||||
|
sql += " AND t2.user_id = ?"
|
||||||
|
sqlParams = append(sqlParams, userID)
|
||||||
|
}
|
||||||
|
sql += ` ORDER BY t1.afs_order_id DESC
|
||||||
|
LIMIT ? OFFSET ?
|
||||||
|
`
|
||||||
|
sqlParams = append(sqlParams, pageSize, offset)
|
||||||
|
Begin(db)
|
||||||
|
defer Commit(db)
|
||||||
|
if err = GetRows(db, &afsOrderList, sql, sqlParams...); err == nil {
|
||||||
|
totalCount = GetLastTotalRowCount(db)
|
||||||
|
}
|
||||||
|
return afsOrderList, totalCount, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOrderStoreSkusCount(db *DaoDB, storeID, skuID int, fromTime, toTime time.Time) (count int64, err error) {
|
||||||
|
tmpOrderSku := &model.OrderSku{}
|
||||||
|
sql := `
|
||||||
|
SELECT SUM(a.count) count
|
||||||
|
FROM order_sku a
|
||||||
|
JOIN goods_order b ON a.vendor_order_id = b.vendor_order_id AND a.vendor_id = b.vendor_id
|
||||||
|
WHERE IF(b.store_id = 0, b.jx_store_id, b.store_id) = ?
|
||||||
|
AND a.sku_id = ?
|
||||||
|
AND b.order_created_at BETWEEN ? AND ?
|
||||||
|
AND b.status >= ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
storeID,
|
||||||
|
skuID,
|
||||||
|
fromTime,
|
||||||
|
toTime,
|
||||||
|
model.OrderStatusDelivering,
|
||||||
|
}
|
||||||
|
if err = GetRow(db, &tmpOrderSku, sql, sqlParams); err == nil {
|
||||||
|
return int64(tmpOrderSku.Count), nil
|
||||||
|
}
|
||||||
|
return count, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetSupplySupportStoreSkusResult struct {
|
||||||
|
SkuID int `orm:"column(sku_id)" json:"skuID"`
|
||||||
|
Count int `json:"count"`
|
||||||
|
SalePrice int `json:"salePrice"`
|
||||||
|
Stock int `json:"stock"`
|
||||||
|
model.SkuName
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSupplySupportStoreSkus(db *DaoDB, fromDate, toDate time.Time, fromStoreID, storeID int, percentage float64) (getSupplySupportStoreSkusResult []*GetSupplySupportStoreSkusResult, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT c.sku_id,CEIL(c.count) count,CEIL(c.count) * d.jx_price sale_price, d.stock, f.*
|
||||||
|
FROM
|
||||||
|
(
|
||||||
|
SELECT a.sku_id,SUM(a.count * ? ) count FROM order_sku a
|
||||||
|
JOIN goods_order b ON b.vendor_order_id = a.vendor_order_id AND a.vendor_id = b.vendor_id
|
||||||
|
WHERE b.order_created_at > ?
|
||||||
|
AND b.order_created_at < ?
|
||||||
|
AND a.sku_id <> ?
|
||||||
|
AND IF(b.store_id = 0,b.jx_store_id,b.store_id) = ?
|
||||||
|
GROUP BY 1
|
||||||
|
)c
|
||||||
|
JOIN store_sku_bind d ON d.store_id = ? AND d.sku_id = c.sku_id AND d.deleted_at = ?
|
||||||
|
JOIN sku e ON e.id = d.sku_id
|
||||||
|
JOIN sku_name f ON f.id = e.name_id
|
||||||
|
WHERE d.status <> ?
|
||||||
|
AND d.stock <> ?
|
||||||
|
ORDER BY c.count desc
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
percentage,
|
||||||
|
fromDate,
|
||||||
|
toDate,
|
||||||
|
6039481, //葱姜蒜
|
||||||
|
fromStoreID,
|
||||||
|
storeID, utils.DefaultTimeValue,
|
||||||
|
model.StoreSkuBindStatusDontSale,
|
||||||
|
0,
|
||||||
|
}
|
||||||
|
if err = GetRows(db, &getSupplySupportStoreSkusResult, sql, sqlParams); err == nil {
|
||||||
|
return getSupplySupportStoreSkusResult, err
|
||||||
|
}
|
||||||
|
return getSupplySupportStoreSkusResult, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPriceDefendOrder(db *DaoDB, vendorOrderID string, storeIDs, skuIDs, issues []int, defendPrice, isBuyNowPrice, isSuccess, isPay int, userID string, beginAt, EndAt time.Time, isDesc bool) (priceDefendOrders []*model.PriceDefendOrder, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT a.*
|
||||||
|
FROM price_defend_order a
|
||||||
|
JOIN user_delivery_address b ON a.address_id = b.id AND b.deleted_at = ?
|
||||||
|
WHERE 1 = 1
|
||||||
|
AND a.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if vendorOrderID != "" {
|
||||||
|
sql += " AND a.vendor_order_id = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorOrderID)
|
||||||
|
}
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
|
}
|
||||||
|
if len(skuIDs) > 0 {
|
||||||
|
sql += " AND a.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, skuIDs)
|
||||||
|
}
|
||||||
|
if len(issues) > 0 {
|
||||||
|
sql += " AND a.issue IN (" + GenQuestionMarks(len(issues)) + ")"
|
||||||
|
sqlParams = append(sqlParams, issues)
|
||||||
|
}
|
||||||
|
if defendPrice != 0 {
|
||||||
|
sql += " AND a.defend_price = ?"
|
||||||
|
sqlParams = append(sqlParams, defendPrice)
|
||||||
|
}
|
||||||
|
if isBuyNowPrice != -1 {
|
||||||
|
sql += " AND a.is_buy_now_price = ?"
|
||||||
|
sqlParams = append(sqlParams, isBuyNowPrice)
|
||||||
|
}
|
||||||
|
if isSuccess != -1 {
|
||||||
|
sql += " AND a.is_success = ?"
|
||||||
|
sqlParams = append(sqlParams, isSuccess)
|
||||||
|
}
|
||||||
|
if isPay != -1 {
|
||||||
|
sql += " AND a.is_pay = ?"
|
||||||
|
sqlParams = append(sqlParams, isPay)
|
||||||
|
}
|
||||||
|
if userID != "" {
|
||||||
|
sql += " AND b.user_id = ?"
|
||||||
|
sqlParams = append(sqlParams, userID)
|
||||||
|
}
|
||||||
|
if beginAt != utils.ZeroTimeValue {
|
||||||
|
sql += " AND a.created_at >= ?"
|
||||||
|
sqlParams = append(sqlParams, beginAt)
|
||||||
|
}
|
||||||
|
if EndAt != utils.ZeroTimeValue {
|
||||||
|
sql += " AND a.created_at <= ?"
|
||||||
|
sqlParams = append(sqlParams, EndAt)
|
||||||
|
}
|
||||||
|
if isDesc {
|
||||||
|
sql += " ORDER BY a.created_at DESC"
|
||||||
|
} else {
|
||||||
|
sql += " ORDER BY a.created_at"
|
||||||
|
}
|
||||||
|
err = GetRows(db, &priceDefendOrders, sql, sqlParams)
|
||||||
|
return priceDefendOrders, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetCoupons(db *DaoDB, couponType int, couponStatuss, storeIDs []int, userID, mobile, keyword string) (coupons []*model.Coupons, err error) {
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
sql := `
|
||||||
|
SELECT DISTINCT a.*
|
||||||
|
FROM coupons a
|
||||||
|
`
|
||||||
|
if userID != "" || mobile != "" {
|
||||||
|
sql += " JOIN user_coupons b ON a.id = b.coupon_id"
|
||||||
|
if userID != "" {
|
||||||
|
sql += " AND b.user_id = ?"
|
||||||
|
sqlParams = append(sqlParams, userID)
|
||||||
|
}
|
||||||
|
if mobile != "" {
|
||||||
|
sql += " AND b.mobile = ?"
|
||||||
|
sqlParams = append(sqlParams, mobile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sql += `
|
||||||
|
WHERE a.is_all = ?
|
||||||
|
`
|
||||||
|
sqlParams = append(sqlParams, model.YES)
|
||||||
|
if couponType != 0 {
|
||||||
|
sql += " AND a.coupon_type = ?"
|
||||||
|
sqlParams = append(sqlParams, couponType)
|
||||||
|
}
|
||||||
|
if keyword != "" {
|
||||||
|
sql += " AND (a.name LIKE ? OR a.desc LIKE ?)"
|
||||||
|
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%")
|
||||||
|
}
|
||||||
|
if len(couponStatuss) > 0 {
|
||||||
|
sql += " AND a.coupon_status IN (" + GenQuestionMarks(len(couponStatuss)) + ")"
|
||||||
|
sqlParams = append(sqlParams, couponStatuss)
|
||||||
|
}
|
||||||
|
sql += `
|
||||||
|
UNION
|
||||||
|
SELECT DISTINCT a.*
|
||||||
|
FROM coupons a
|
||||||
|
LEFT JOIN store_coupons b ON a.id = b.coupon_id AND b.deleted_at = ?
|
||||||
|
`
|
||||||
|
if userID != "" || mobile != "" {
|
||||||
|
sql += " JOIN user_coupons c ON a.id = c.coupon_id"
|
||||||
|
if userID != "" {
|
||||||
|
sql += " AND c.user_id = ?"
|
||||||
|
sqlParams = append(sqlParams, userID)
|
||||||
|
}
|
||||||
|
if mobile != "" {
|
||||||
|
sql += " AND c.mobile = ?"
|
||||||
|
sqlParams = append(sqlParams, mobile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sql += `
|
||||||
|
WHERE 1 = 1
|
||||||
|
`
|
||||||
|
sqlParams = append(sqlParams, utils.DefaultTimeValue)
|
||||||
|
if couponType != 0 {
|
||||||
|
sql += " AND a.coupon_type = ?"
|
||||||
|
sqlParams = append(sqlParams, couponType)
|
||||||
|
}
|
||||||
|
if keyword != "" {
|
||||||
|
sql += " AND (a.name LIKE ? OR a.desc LIKE ?)"
|
||||||
|
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%")
|
||||||
|
}
|
||||||
|
if len(couponStatuss) > 0 {
|
||||||
|
sql += " AND a.coupon_status IN (" + GenQuestionMarks(len(couponStatuss)) + ")"
|
||||||
|
sqlParams = append(sqlParams, couponStatuss)
|
||||||
|
}
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
sql += " AND b.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &coupons, sql, sqlParams)
|
||||||
|
return coupons, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreCoupons(db *DaoDB, couponIDs, storeIDs []int) (storeCoupons []*model.StoreCoupons, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM store_coupons
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{utils.DefaultTimeValue}
|
||||||
|
if len(couponIDs) > 0 {
|
||||||
|
sql += " AND coupon_id IN (" + GenQuestionMarks(len(couponIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, couponIDs)
|
||||||
|
}
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
sql += " AND store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &storeCoupons, sql, sqlParams)
|
||||||
|
return storeCoupons, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserCoupons(db *DaoDB, couponIDs []int, userIDs, mobiles []string, userStatus int) (userCoupons []*model.UserCoupons, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM user_coupons
|
||||||
|
WHERE 1 = 1
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
if len(couponIDs) > 0 {
|
||||||
|
sql += " AND coupon_id IN (" + GenQuestionMarks(len(couponIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, couponIDs)
|
||||||
|
}
|
||||||
|
if len(userIDs) > 0 {
|
||||||
|
sql += " AND user_id IN (" + GenQuestionMarks(len(userIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, userIDs)
|
||||||
|
}
|
||||||
|
if len(mobiles) > 0 {
|
||||||
|
sql += " AND mobile IN (" + GenQuestionMarks(len(mobiles)) + ")"
|
||||||
|
sqlParams = append(sqlParams, mobiles)
|
||||||
|
}
|
||||||
|
if userStatus != 0 {
|
||||||
|
sql += " AND user_coupon_status = ?"
|
||||||
|
sqlParams = append(sqlParams, userStatus)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &userCoupons, sql, sqlParams)
|
||||||
|
return userCoupons, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,6 +20,12 @@ type UserDeliveryAddressEx struct {
|
|||||||
UserName string `json:"userName"`
|
UserName string `json:"userName"`
|
||||||
CityName string `json:"cityName"`
|
CityName string `json:"cityName"`
|
||||||
DistrictName string `json:"districtName"`
|
DistrictName string `json:"districtName"`
|
||||||
|
ParentCode int `json:"parentCode"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetSelfInfoResult struct {
|
||||||
|
model.User
|
||||||
|
UserMembers []*model.UserMember `json:"userMembers"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUserByID(db *DaoDB, fieldName, fieldValue string) (user *model.User, err error) {
|
func GetUserByID(db *DaoDB, fieldName, fieldValue string) (user *model.User, err error) {
|
||||||
@@ -38,6 +44,22 @@ func GetUserByID(db *DaoDB, fieldName, fieldValue string) (user *model.User, err
|
|||||||
return user, err
|
return user, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetUserByIDWithMembers(db *DaoDB, fieldName, fieldValue string) (getSelfInfoResult *GetSelfInfoResult, err error) {
|
||||||
|
sql := fmt.Sprintf(`
|
||||||
|
SELECT *
|
||||||
|
FROM user t1
|
||||||
|
WHERE t1.deleted_at = ? AND t1.status = ? AND t1.%s = ?
|
||||||
|
`, fieldName)
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
model.UserStatusNormal,
|
||||||
|
fieldValue,
|
||||||
|
}
|
||||||
|
// globals.SugarLogger.Debugf("GetUserByID sql:%s, sqlParams:%s", sql, utils.Format4Output(sqlParams, false))
|
||||||
|
err = GetRow(db, &getSelfInfoResult, sql, sqlParams...)
|
||||||
|
return getSelfInfoResult, err
|
||||||
|
}
|
||||||
|
|
||||||
func GetUsers(db *DaoDB, userType int, keyword string, userIDs, userID2s, mobiles []string, offset, pageSize int) (userList []*model.User, totalCount int, err error) {
|
func GetUsers(db *DaoDB, userType int, keyword string, userIDs, userID2s, mobiles []string, offset, pageSize int) (userList []*model.User, totalCount int, err error) {
|
||||||
offset = jxutils.FormalizePageOffset(offset)
|
offset = jxutils.FormalizePageOffset(offset)
|
||||||
pageSize = jxutils.FormalizePageSize(pageSize)
|
pageSize = jxutils.FormalizePageSize(pageSize)
|
||||||
@@ -162,11 +184,13 @@ func QueryUserDeliveryAddress(db *DaoDB, addressID int64, userIDs []string, offs
|
|||||||
t1.*,
|
t1.*,
|
||||||
t2.name user_name,
|
t2.name user_name,
|
||||||
district.name district_name,
|
district.name district_name,
|
||||||
city.name city_name
|
city.name city_name,
|
||||||
|
cp.code parent_code
|
||||||
FROM user_delivery_address t1
|
FROM user_delivery_address t1
|
||||||
LEFT JOIN user t2 ON t2.user_id = t1.user_id
|
LEFT JOIN user t2 ON t2.user_id = t1.user_id
|
||||||
LEFT JOIN place district ON district.code = t1.district_code
|
LEFT JOIN place district ON district.code = t1.district_code
|
||||||
LEFT JOIN place city ON city.code = t1.city_code
|
LEFT JOIN place city ON city.code = t1.city_code
|
||||||
|
LEFT JOIN place cp ON cp.code = city.parent_code
|
||||||
WHERE t1.deleted_at = ?
|
WHERE t1.deleted_at = ?
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
@@ -258,3 +282,30 @@ func GetUserOrderSMS(db *DaoDB, mobile, name string) (userOrderSms *model.UserOr
|
|||||||
err = GetRow(db, &userOrderSms, sql, sqlParams)
|
err = GetRow(db, &userOrderSms, sql, sqlParams)
|
||||||
return userOrderSms, err
|
return userOrderSms, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetUserMember(db *DaoDB, userID, vendorOrderID string, memberType, isPay int) (userMembers []*model.UserMember, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM user_member
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{utils.DefaultTimeValue}
|
||||||
|
if userID != "" {
|
||||||
|
sql += " AND user_id = ?"
|
||||||
|
sqlParams = append(sqlParams, userID)
|
||||||
|
}
|
||||||
|
if vendorOrderID != "" {
|
||||||
|
sql += " AND vendor_order_id = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorOrderID)
|
||||||
|
}
|
||||||
|
if memberType != 0 {
|
||||||
|
sql += " AND member_type = ?"
|
||||||
|
sqlParams = append(sqlParams, memberType)
|
||||||
|
}
|
||||||
|
if isPay != -1 {
|
||||||
|
sql += " AND is_pay = ?"
|
||||||
|
sqlParams = append(sqlParams, isPay)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &userMembers, sql, sqlParams)
|
||||||
|
return userMembers, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -141,3 +141,32 @@ func GetOperateEvents(db *DaoDB, name string, apiFunctions []string, operateType
|
|||||||
}
|
}
|
||||||
return operateEventExt, totalCount, err
|
return operateEventExt, totalCount, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetImMessageRecord(db *DaoDB, vendorOrderID, userID string, storeID, vendorID int) (msg []*model.ImMessageRecord, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM im_message_record
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if vendorOrderID != "" {
|
||||||
|
sql += " AND vendor_order_id = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorOrderID)
|
||||||
|
}
|
||||||
|
if userID != "" {
|
||||||
|
sql += " AND user_id = ?"
|
||||||
|
sqlParams = append(sqlParams, userID)
|
||||||
|
}
|
||||||
|
if storeID != 0 {
|
||||||
|
sql += " AND store_id = ?"
|
||||||
|
sqlParams = append(sqlParams, storeID)
|
||||||
|
}
|
||||||
|
if vendorID >= 0 {
|
||||||
|
sql += " AND vendor_id = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorID)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &msg, sql, sqlParams)
|
||||||
|
return msg, err
|
||||||
|
}
|
||||||
|
|||||||
141
business/model/dao/permission.go
Normal file
141
business/model/dao/permission.go
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
package dao
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetMenu(db *DaoDB, name string, level int, userID string) (menus []*model.Menu, err error) {
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
sql := `
|
||||||
|
SELECT DISTINCT a.*
|
||||||
|
FROM menu a
|
||||||
|
`
|
||||||
|
if userID != "" {
|
||||||
|
sql += `
|
||||||
|
JOIN menu d ON d.parent_id = a.id
|
||||||
|
JOIN user_role b ON b.user_id = ? AND b.deleted_at = ?
|
||||||
|
JOIN role_menu c ON c.menu_id = d.id AND c.role_id = b.role_id AND c.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams = append(sqlParams, userID, utils.DefaultTimeValue, utils.DefaultTimeValue)
|
||||||
|
}
|
||||||
|
sql += " WHERE a.deleted_at = ?"
|
||||||
|
sqlParams = append(sqlParams, utils.DefaultTimeValue)
|
||||||
|
if name != "" {
|
||||||
|
sql += " AND a.name LIKE ?"
|
||||||
|
sqlParams = append(sqlParams, "%"+name+"%")
|
||||||
|
}
|
||||||
|
if level != 0 {
|
||||||
|
sql += " AND a.level = ?"
|
||||||
|
sqlParams = append(sqlParams, level)
|
||||||
|
}
|
||||||
|
sql += " ORDER BY a.id"
|
||||||
|
err = GetRows(db, &menus, sql, sqlParams)
|
||||||
|
return menus, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMenuWithUser(db *DaoDB, name string, level int, userID string) (menus []*model.Menu, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT DISTINCT b.* FROM (
|
||||||
|
SELECT a.id,a.parent_id
|
||||||
|
FROM menu a
|
||||||
|
JOIN user_role b ON b.user_id = ? AND b.deleted_at = ?
|
||||||
|
JOIN role_menu c ON c.menu_id = a.id AND c.role_id = b.role_id AND c.deleted_at = ?
|
||||||
|
WHERE a.deleted_at = ?)a
|
||||||
|
JOIN menu b ON (b.id = a.id OR b.id = a.parent_id)
|
||||||
|
ORDER BY b.id
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{userID, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue}
|
||||||
|
err = GetRows(db, &menus, sql, sqlParams)
|
||||||
|
return menus, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRole(db *DaoDB, name, name2 string) (roles []*model.Role, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM role
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if name != "" {
|
||||||
|
sql += " AND name LIKE ?"
|
||||||
|
sqlParams = append(sqlParams, "%"+name+"%")
|
||||||
|
}
|
||||||
|
if name2 != "" {
|
||||||
|
sql += " AND name = ?"
|
||||||
|
sqlParams = append(sqlParams, name2)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &roles, sql, sqlParams)
|
||||||
|
return roles, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserRole(db *DaoDB, userIDs []string, roleIDs []int) (userRoles []*model.UserRole, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM user_role
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if len(userIDs) > 0 {
|
||||||
|
sql += " AND user_id IN (" + GenQuestionMarks(len(userIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, userIDs)
|
||||||
|
}
|
||||||
|
if len(roleIDs) > 0 {
|
||||||
|
sql += " AND role_id IN (" + GenQuestionMarks(len(roleIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, roleIDs)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &userRoles, sql, sqlParams)
|
||||||
|
return userRoles, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetUserRole2Result struct {
|
||||||
|
model.Role
|
||||||
|
model.UserRole
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserRole2(db *DaoDB, userIDs []string, roleIDs []int) (userRoles []*GetUserRole2Result, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM user_role a
|
||||||
|
JOIN role b ON a.role_id = b.id
|
||||||
|
WHERE a.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if len(userIDs) > 0 {
|
||||||
|
sql += " AND a.user_id IN (" + GenQuestionMarks(len(userIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, userIDs)
|
||||||
|
}
|
||||||
|
if len(roleIDs) > 0 {
|
||||||
|
sql += " AND a.role_id IN (" + GenQuestionMarks(len(roleIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, roleIDs)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &userRoles, sql, sqlParams)
|
||||||
|
return userRoles, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetRoleMenu(db *DaoDB, roleIDs, menuIDs []int) (roleMenus []*model.RoleMenu, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM role_menu
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if len(roleIDs) > 0 {
|
||||||
|
sql += " AND role_id IN (" + GenQuestionMarks(len(roleIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, roleIDs)
|
||||||
|
}
|
||||||
|
if len(menuIDs) > 0 {
|
||||||
|
sql += " AND menu_id IN (" + GenQuestionMarks(len(menuIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, menuIDs)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &roleMenus, sql, sqlParams)
|
||||||
|
return roleMenus, err
|
||||||
|
}
|
||||||
@@ -74,3 +74,29 @@ func GetPlaceByJdCode(db *DaoDB, jdCode int) (place *model.Place, err error) {
|
|||||||
err = db.Db.Read(place, "JdCode")
|
err = db.Db.Read(place, "JdCode")
|
||||||
return place, err
|
return place, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetPlaceByJdsCode(db *DaoDB, jdsCode int) (place *model.Place, err error) {
|
||||||
|
if db == nil {
|
||||||
|
db = GetDB()
|
||||||
|
}
|
||||||
|
place = &model.Place{
|
||||||
|
JdsCode: jdsCode,
|
||||||
|
}
|
||||||
|
err = db.Db.Read(place, "JdsCode")
|
||||||
|
return place, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPlaces(db *DaoDB, cityCodes []int) (places []*model.Place, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM place
|
||||||
|
WHERE 1 = 1
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
if len(cityCodes) > 0 {
|
||||||
|
sql += " AND code IN (" + GenQuestionMarks(len(cityCodes)) + ")"
|
||||||
|
sqlParams = append(sqlParams, cityCodes)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &places, sql, sqlParams)
|
||||||
|
return places, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ type StatisticsReportForOrdersList struct {
|
|||||||
OperatorName2 string `json:"operatorName2"`
|
OperatorName2 string `json:"operatorName2"`
|
||||||
OperatorName3 string `json:"operatorName3"`
|
OperatorName3 string `json:"operatorName3"`
|
||||||
|
|
||||||
|
Address string `json:"address"`
|
||||||
CityName string `json:"cityName"`
|
CityName string `json:"cityName"`
|
||||||
Status int `json:"status"`
|
Status int `json:"status"`
|
||||||
Tel1 string `orm:"size(32);index" json:"tel1"`
|
Tel1 string `orm:"size(32);index" json:"tel1"`
|
||||||
@@ -54,6 +55,7 @@ func GetStatisticsReportForOrders(db *DaoDB, storeIDs []int, fromDate time.Time,
|
|||||||
SELECT
|
SELECT
|
||||||
c.id store_id,
|
c.id store_id,
|
||||||
c.name store_name,
|
c.name store_name,
|
||||||
|
c.address,
|
||||||
s.order_counts,
|
s.order_counts,
|
||||||
s.sale_price,
|
s.sale_price,
|
||||||
s.actual_pay_price,
|
s.actual_pay_price,
|
||||||
|
|||||||
@@ -1,17 +1,71 @@
|
|||||||
package dao
|
package dao
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetSensitiveWordList() (wordList []*model.SensitiveWord, err error) {
|
/*VendorID = -2 的时候是通用,-1 查询所有,保留之前的1,看后面会不会有扩展*/
|
||||||
sql := `SELECT * FROM sensitive_word`
|
func GetSensitiveWordList(vendorID int) (wordList []*model.SensitiveWord, err error) {
|
||||||
err = GetRows(nil, &wordList, sql)
|
if vendorID == 0 {
|
||||||
|
vendorID = -2
|
||||||
|
}
|
||||||
|
if vendorID == -1 {
|
||||||
|
sql := `SELECT * FROM sensitive_word WHERE deleted_at = ?`
|
||||||
|
err = GetRows(nil, &wordList, sql, utils.DefaultTimeValue)
|
||||||
|
} else {
|
||||||
|
sql := `SELECT * FROM sensitive_word WHERE deleted_at = ? AND vendor_id = ?`
|
||||||
|
err = GetRows(nil, &wordList, sql, utils.DefaultTimeValue, vendorID)
|
||||||
|
}
|
||||||
return wordList, err
|
return wordList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func InsertSensitiveWord(word string, vendorID int, userName string) error {
|
func InsertSensitiveWord(word string, vendorID int, userName string) error {
|
||||||
|
if vendorID == 0 {
|
||||||
|
vendorID = -2
|
||||||
|
}
|
||||||
sensitiveWord := &model.SensitiveWord{Word: word, VendorID: vendorID}
|
sensitiveWord := &model.SensitiveWord{Word: word, VendorID: vendorID}
|
||||||
WrapAddIDCULDEntity(sensitiveWord, userName)
|
WrapAddIDCULDEntity(sensitiveWord, userName)
|
||||||
return CreateEntity(nil, sensitiveWord)
|
return CreateEntity(nil, sensitiveWord)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DeleteSensitiveWord(wordList *model.SensitiveWord, id int, userName string, vendorID int) (word *model.SensitiveWord, err error) {
|
||||||
|
if vendorID == 0 {
|
||||||
|
vendorID = -2
|
||||||
|
}
|
||||||
|
if id != 0 {
|
||||||
|
wordList.ID = id
|
||||||
|
}
|
||||||
|
wordList.VendorID = id
|
||||||
|
wordList.DeletedAt = time.Now()
|
||||||
|
wordList.LastOperator = userName
|
||||||
|
if _, err := UpdateEntity(nil, wordList, "deleted_at", "id", "last_operator", "vendor_id"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return wordList, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateSensitiveWord(wordList *model.SensitiveWord, vendorID int, id int, userName string) (word *model.SensitiveWord, err error) {
|
||||||
|
if vendorID == 0 {
|
||||||
|
vendorID = -2
|
||||||
|
}
|
||||||
|
if id != 0 {
|
||||||
|
wordList.ID = id
|
||||||
|
}
|
||||||
|
wordList.VendorID = vendorID
|
||||||
|
wordList.UpdatedAt = time.Now()
|
||||||
|
wordList.LastOperator = userName
|
||||||
|
globals.SugarLogger.Debug("wordList:", wordList)
|
||||||
|
if id != 0 {
|
||||||
|
if _, err := UpdateEntity(nil, wordList, "id", "word", "vendor_id", "last_operator"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if _, err := UpdateEntity(nil, wordList, "word", "vendor_id", "last_operator"); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return wordList, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package dao
|
package dao
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/aliupcapi"
|
"git.rosy.net.cn/baseapi/platformapi/aliupcapi"
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
@@ -48,6 +50,21 @@ func DeleteSkuNamePlace(db *DaoDB, nameID int, placeCodes []int) (num int64, err
|
|||||||
return ExecuteSQL(db, sql, sqlParams...)
|
return ExecuteSQL(db, sql, sqlParams...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetCategoriesByName(db *DaoDB, name string) (cats []*model.SkuCategory, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT t1.*
|
||||||
|
FROM sku_category t1
|
||||||
|
WHERE t1.deleted_at = ?`
|
||||||
|
params := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if name != "" {
|
||||||
|
sql += " AND t1.name = ?"
|
||||||
|
params = append(params, name)
|
||||||
|
}
|
||||||
|
return cats, GetRows(db, &cats, sql, params)
|
||||||
|
}
|
||||||
|
|
||||||
func GetCategories(db *DaoDB, parentID, level int, catIDs []int, isExd bool) (cats []*model.SkuCategory, err error) {
|
func GetCategories(db *DaoDB, parentID, level int, catIDs []int, isExd bool) (cats []*model.SkuCategory, err error) {
|
||||||
sql := `
|
sql := `
|
||||||
SELECT t1.*
|
SELECT t1.*
|
||||||
@@ -69,6 +86,8 @@ func GetCategories(db *DaoDB, parentID, level int, catIDs []int, isExd bool) (ca
|
|||||||
params = append(params, level)
|
params = append(params, level)
|
||||||
}
|
}
|
||||||
if isExd {
|
if isExd {
|
||||||
|
sql += " AND t1.is_exd_sync <> ?"
|
||||||
|
params = append(params, 1)
|
||||||
sql += " ORDER BY t1.level, t1.exd_seq"
|
sql += " ORDER BY t1.level, t1.exd_seq"
|
||||||
} else {
|
} else {
|
||||||
sql += ` AND t1.is_exd_spec = 0
|
sql += ` AND t1.is_exd_spec = 0
|
||||||
@@ -104,12 +123,13 @@ func GetSkus(db *DaoDB, skuIDs, nameIDs, statuss, catIDs []int, eclpIDs []string
|
|||||||
}
|
}
|
||||||
if len(catIDs) > 0 {
|
if len(catIDs) > 0 {
|
||||||
sql += `
|
sql += `
|
||||||
JOIN sku_category t3 ON t3.id = t2.category_id
|
JOIN sku_category t3 ON t3.id = t2.category_id AND t3.is_exd_spec = ?
|
||||||
LEFT JOIN sku_category t3p ON t3p.id = t3.parent_id
|
LEFT JOIN sku_category t3p ON t3p.id = t3.parent_id AND t3p.is_exd_spec = ?
|
||||||
`
|
`
|
||||||
sqlWhere += " AND (t3.id IN (" + GenQuestionMarks(len(catIDs)) + ")"
|
sqlWhere += " AND (t3.id IN (" + GenQuestionMarks(len(catIDs)) + ")"
|
||||||
sqlWhere += " OR t3p.id IN (" + GenQuestionMarks(len(catIDs)) + ") )"
|
sqlWhere += " OR t3p.id IN (" + GenQuestionMarks(len(catIDs)) + ") )"
|
||||||
sqlParams = append(sqlParams, catIDs, catIDs)
|
sqlWhere += " AND t1.exd_sku_id = ''"
|
||||||
|
sqlParams = append(sqlParams, model.NO, model.NO, catIDs, catIDs)
|
||||||
}
|
}
|
||||||
if len(eclpIDs) > 0 {
|
if len(eclpIDs) > 0 {
|
||||||
sqlWhere += " AND t1.eclp_id IN (" + GenQuestionMarks(len(eclpIDs)) + ")"
|
sqlWhere += " AND t1.eclp_id IN (" + GenQuestionMarks(len(eclpIDs)) + ")"
|
||||||
@@ -186,33 +206,34 @@ func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string,
|
|||||||
t1.*,
|
t1.*,
|
||||||
t1m.vendor_thing_id vendor_cat_id,
|
t1m.vendor_thing_id vendor_cat_id,
|
||||||
t1m.sync_status cat_sync_status,
|
t1m.sync_status cat_sync_status,
|
||||||
|
a.is_jx_cat,
|
||||||
|
b.vendor_category_name,
|
||||||
|
b.vendor_category_seq,
|
||||||
|
b.id vendor_category_id,
|
||||||
t1pm.id parent_map_id,
|
t1pm.id parent_map_id,
|
||||||
t1p.name parent_cat_name,
|
t1p.name parent_cat_name,
|
||||||
t1pm.vendor_thing_id parent_vendor_cat_id,
|
t1pm.vendor_thing_id parent_vendor_cat_id,
|
||||||
t1pm.sync_status parent_cat_sync_status
|
t1pm.sync_status parent_cat_sync_status
|
||||||
FROM sku_category t1
|
FROM sku_category t1
|
||||||
LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ?`
|
LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ?
|
||||||
|
LEFT JOIN vendor_org_code a ON a.vendor_org_code = t1m.vendor_org_code AND a.vendor_id = t1m.vendor_id AND a.deleted_at = ?
|
||||||
|
LEFT JOIN vendor_category_map b ON b.vendor_org_code = t1m.vendor_org_code AND b.vendor_id = t1m.vendor_id AND b.category_id = t1m.thing_id AND b.deleted_at = ?
|
||||||
|
`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
model.ThingTypeCategory,
|
model.ThingTypeCategory,
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
}
|
utils.DefaultTimeValue,
|
||||||
if len(vendorIDs) > 0 {
|
utils.DefaultTimeValue,
|
||||||
sql += " AND t1m.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
|
|
||||||
sqlParams = append(sqlParams, vendorIDs)
|
|
||||||
}
|
|
||||||
if len(appOrgCodes) > 0 {
|
|
||||||
sql += " AND t1m.vendor_org_code IN (" + GenQuestionMarks(len(appOrgCodes)) + ")"
|
|
||||||
sqlParams = append(sqlParams, appOrgCodes)
|
|
||||||
}
|
}
|
||||||
sql += `
|
sql += `
|
||||||
LEFT JOIN sku_category t1p ON t1p.id = t1.parent_id
|
LEFT JOIN sku_category t1p ON t1p.id = t1.parent_id
|
||||||
LEFT JOIN thing_map t1pm ON t1pm.thing_id = t1p.id AND t1pm.thing_type = ? AND t1m.deleted_at = ?
|
LEFT JOIN thing_map t1pm ON t1pm.thing_id = t1p.id AND t1pm.thing_type = ? AND t1m.deleted_at = ?
|
||||||
AND t1pm.vendor_id = t1m.vendor_id AND t1pm.vendor_org_code = t1m.vendor_org_code
|
AND t1pm.vendor_id = t1m.vendor_id AND t1pm.vendor_org_code = t1m.vendor_org_code
|
||||||
|
LEFT JOIN vendor_category_map c ON c.vendor_org_code = t1pm.vendor_org_code AND c.vendor_id = t1pm.vendor_id AND c.category_id = t1pm.thing_id AND c.deleted_at = ?
|
||||||
WHERE 1 = 1
|
WHERE 1 = 1
|
||||||
AND t1.is_sync <> ?
|
AND t1.is_sync <> ?
|
||||||
`
|
`
|
||||||
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, model.YES)
|
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue, model.YES)
|
||||||
if mustDirty {
|
if mustDirty {
|
||||||
sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0"
|
sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0"
|
||||||
} else {
|
} else {
|
||||||
@@ -227,6 +248,14 @@ func GetSkuCategoryWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string,
|
|||||||
sql += " AND t1.parent_id = ?"
|
sql += " AND t1.parent_id = ?"
|
||||||
sqlParams = append(sqlParams, parentCatID)
|
sqlParams = append(sqlParams, parentCatID)
|
||||||
}
|
}
|
||||||
|
if len(vendorIDs) > 0 {
|
||||||
|
sql += " AND t1m.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, vendorIDs)
|
||||||
|
}
|
||||||
|
if len(appOrgCodes) > 0 {
|
||||||
|
sql += " AND t1m.vendor_org_code IN (" + GenQuestionMarks(len(appOrgCodes)) + ")"
|
||||||
|
sqlParams = append(sqlParams, appOrgCodes)
|
||||||
|
}
|
||||||
sql += " ORDER BY t1.seq"
|
sql += " ORDER BY t1.seq"
|
||||||
err = GetRows(db, &catList, sql, sqlParams...)
|
err = GetRows(db, &catList, sql, sqlParams...)
|
||||||
return catList, err
|
return catList, err
|
||||||
@@ -255,13 +284,11 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs
|
|||||||
IF(t11.resource_type IS NULL OR t11.resource_type <> ?, t2.img, '') img,
|
IF(t11.resource_type IS NULL OR t11.resource_type <> ?, t2.img, '') img,
|
||||||
IF(t12.resource_type IS NULL OR t12.resource_type <> ?, t2.img2, '') img2,
|
IF(t12.resource_type IS NULL OR t12.resource_type <> ?, t2.img2, '') img2,
|
||||||
t2.desc_img,
|
t2.desc_img,
|
||||||
t2.ex_prefix,
|
|
||||||
t2.ex_prefix_begin,
|
|
||||||
t2.ex_prefix_end,
|
|
||||||
t3.jd_category_id vendor_vendor_cat_id,
|
t3.jd_category_id vendor_vendor_cat_id,
|
||||||
|
tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark,
|
||||||
t3m.sync_status cat_sync_status,
|
t3m.sync_status cat_sync_status,
|
||||||
t3m.vendor_thing_id vendor_cat_id
|
t3m.vendor_thing_id vendor_cat_id,
|
||||||
|
tsy.vendor_category_id sku_vendor_map_cat_id
|
||||||
|
|
||||||
FROM sku t1
|
FROM sku t1
|
||||||
LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ?`
|
LEFT JOIN thing_map t1m ON t1m.thing_id = t1.id AND t1m.thing_type = ? AND t1m.deleted_at = ?`
|
||||||
@@ -286,9 +313,11 @@ func GetSkusWithVendor(db *DaoDB, vendorIDs []int, appOrgCodes []string, nameIDs
|
|||||||
AND t3m.vendor_id = t1m.vendor_id AND t3m.vendor_org_code = t1m.vendor_org_code
|
AND t3m.vendor_id = t1m.vendor_id AND t3m.vendor_org_code = t1m.vendor_org_code
|
||||||
LEFT JOIN data_resource t11 ON t11.main_url = t2.img
|
LEFT JOIN data_resource t11 ON t11.main_url = t2.img
|
||||||
LEFT JOIN data_resource t12 ON t12.main_url = t2.img2
|
LEFT JOIN data_resource t12 ON t12.main_url = t2.img2
|
||||||
|
LEFT JOIN sku_exinfo_map tsu ON tsu.name_id = t2.id AND tsu.deleted_at = ? AND tsu.vendor_id = t1m.vendor_id
|
||||||
|
LEFT JOIN sku_vendor_category_map tsy ON tsy.name_id = t2.id AND tsy.vendor_id = ? AND tsy.deleted_at = ?
|
||||||
WHERE 1 = 1
|
WHERE 1 = 1
|
||||||
`
|
`
|
||||||
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue)
|
sqlParams = append(sqlParams, model.ThingTypeCategory, utils.DefaultTimeValue, utils.DefaultTimeValue, model.VendorIDJD, utils.DefaultTimeValue)
|
||||||
if mustDirty {
|
if mustDirty {
|
||||||
sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0"
|
sql += " AND t1m.sync_status IS NOT NULL AND t1m.sync_status <> 0"
|
||||||
} else {
|
} else {
|
||||||
@@ -379,3 +408,142 @@ func InsertUpcDepot(db *DaoDB, result *aliupcapi.GetAliUpcInfoResult) (err error
|
|||||||
_, err = ExecuteSQL(db, sql, sqlParams)
|
_, err = ExecuteSQL(db, sql, sqlParams)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetSkuExinfos(db *DaoDB, nameIDs []int, vendorIDs []int, exPrefix string, fromTime, toTime time.Time) (skuExinfoMaps []*model.SkuExinfoMap, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM sku_exinfo_map
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if len(nameIDs) > 0 {
|
||||||
|
sql += " AND name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, nameIDs)
|
||||||
|
}
|
||||||
|
if len(vendorIDs) > 0 {
|
||||||
|
sql += " AND vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, vendorIDs)
|
||||||
|
}
|
||||||
|
if exPrefix != "" {
|
||||||
|
sql += " AND ex_prefix LIKE ?"
|
||||||
|
sqlParams = append(sqlParams, "%"+exPrefix+"%")
|
||||||
|
}
|
||||||
|
if fromTime != utils.ZeroTimeValue && toTime != utils.ZeroTimeValue {
|
||||||
|
sql += " AND NOT (begin_at > ? OR end_at < ?)"
|
||||||
|
sqlParams = append(sqlParams, toTime, fromTime)
|
||||||
|
}
|
||||||
|
if err = GetRows(db, &skuExinfoMaps, sql, sqlParams...); err == nil {
|
||||||
|
return skuExinfoMaps, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSkuVendorCategoryMaps(db *DaoDB, nameIDs, vendorIDs []int, vendorCategoryIDs []string) (skuVendorCategoryMaps []*model.SkuVendorCategoryMap, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM sku_vendor_category_map
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if len(nameIDs) > 0 {
|
||||||
|
sql += " AND name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, nameIDs)
|
||||||
|
}
|
||||||
|
if len(vendorIDs) > 0 {
|
||||||
|
sql += " AND vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, vendorIDs)
|
||||||
|
}
|
||||||
|
if len(vendorCategoryIDs) > 0 {
|
||||||
|
sql += " AND vendor_category_id IN (" + GenQuestionMarks(len(vendorCategoryIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, vendorCategoryIDs)
|
||||||
|
}
|
||||||
|
if err = GetRows(db, &skuVendorCategoryMaps, sql, sqlParams...); err == nil {
|
||||||
|
return skuVendorCategoryMaps, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetVendorCategoryMap(db *DaoDB, parentID, level, vendorID int, vendorOrgCode string, categoryID int) (vendorMaps []*model.VendorCategoryMap, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT a.*
|
||||||
|
FROM vendor_category_map a
|
||||||
|
WHERE a.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if parentID >= 0 {
|
||||||
|
sql += " AND a.parent_id = ?"
|
||||||
|
sqlParams = append(sqlParams, parentID)
|
||||||
|
}
|
||||||
|
if level > 0 {
|
||||||
|
sql += " AND a.level = ?"
|
||||||
|
sqlParams = append(sqlParams, level)
|
||||||
|
}
|
||||||
|
if vendorID != -1 {
|
||||||
|
sql += " AND a.vendor_id = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorID)
|
||||||
|
}
|
||||||
|
if vendorOrgCode != "" {
|
||||||
|
sql += " AND a.vendor_org_code = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorOrgCode)
|
||||||
|
}
|
||||||
|
if categoryID > 0 {
|
||||||
|
sql += " AND a.category_id = ?"
|
||||||
|
sqlParams = append(sqlParams, categoryID)
|
||||||
|
}
|
||||||
|
sql += " ORDER BY a.level, a.vendor_category_seq"
|
||||||
|
err = GetRows(db, &vendorMaps, sql, sqlParams)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return vendorMaps, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetVendorCategoryMapExtResult struct {
|
||||||
|
model.VendorCategoryMap
|
||||||
|
VendorThingID string `orm:"column(vendor_thing_id)" json:"vendorThingID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetVendorCategoryMapExt(db *DaoDB, parentID, level, vendorID int, vendorOrgCode string, categoryID int) (vendorMaps []*GetVendorCategoryMapExtResult, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT a.*, b.vendor_thing_id
|
||||||
|
FROM vendor_category_map a
|
||||||
|
JOIN thing_map b ON b.thing_id = a.category_id AND b.vendor_org_code = a.vendor_org_code AND b.vendor_id = a.vendor_id AND b.thing_type = ?
|
||||||
|
WHERE a.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
model.ThingTypeCategory,
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if parentID >= 0 {
|
||||||
|
sql += " AND a.parent_id = ?"
|
||||||
|
sqlParams = append(sqlParams, parentID)
|
||||||
|
}
|
||||||
|
if level > 0 {
|
||||||
|
sql += " AND a.level = ?"
|
||||||
|
sqlParams = append(sqlParams, level)
|
||||||
|
}
|
||||||
|
if vendorID != -1 {
|
||||||
|
sql += " AND a.vendor_id = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorID)
|
||||||
|
}
|
||||||
|
if vendorOrgCode != "" {
|
||||||
|
sql += " AND a.vendor_org_code = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorOrgCode)
|
||||||
|
}
|
||||||
|
if categoryID > 0 {
|
||||||
|
sql += " AND a.category_id = ?"
|
||||||
|
sqlParams = append(sqlParams, categoryID)
|
||||||
|
}
|
||||||
|
sql += " ORDER BY a.vendor_category_seq"
|
||||||
|
err = GetRows(db, &vendorMaps, sql, sqlParams)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return vendorMaps, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ type StoreDetail struct {
|
|||||||
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
|
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
|
||||||
VendorStoreName string `json:"vendorStoreName"`
|
VendorStoreName string `json:"vendorStoreName"`
|
||||||
VendorStatus int `json:"vendor_status"` // 取值同Store.Status
|
VendorStatus int `json:"vendor_status"` // 取值同Store.Status
|
||||||
|
VendorPayPercentage int `json:"vendorPayPercentage"` //平台结算比例
|
||||||
DeliveryFeeDeductionSill int `json:"deliveryFeeDeductionSill"`
|
DeliveryFeeDeductionSill int `json:"deliveryFeeDeductionSill"`
|
||||||
DeliveryFeeDeductionFee int `json:"deliveryFeeDeductionFee"`
|
DeliveryFeeDeductionFee int `json:"deliveryFeeDeductionFee"`
|
||||||
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
|
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
|
||||||
@@ -26,6 +27,7 @@ type StoreDetail struct {
|
|||||||
PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格
|
PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格
|
||||||
PricePercentagePackStr string `orm:"size(4096)" json:"-"` //
|
PricePercentagePackStr string `orm:"size(4096)" json:"-"` //
|
||||||
PricePercentagePackObj model.PricePercentagePack `orm:"-" json:"-"`
|
PricePercentagePackObj model.PricePercentagePack `orm:"-" json:"-"`
|
||||||
|
CreateDeliveryType int `orm:"default(0)" json:"createDeliveryType"` //默认0系统发单,1为门店发单
|
||||||
|
|
||||||
FreightDeductionPackStr string `orm:"size(4096)" json:"-"` //
|
FreightDeductionPackStr string `orm:"size(4096)" json:"-"` //
|
||||||
FreightDeductionPackObj *model.FreightDeductionPack `orm:"-" json:"-"`
|
FreightDeductionPackObj *model.FreightDeductionPack `orm:"-" json:"-"`
|
||||||
@@ -38,7 +40,8 @@ type StoreDetail struct {
|
|||||||
DistrictName string `json:"districtName"`
|
DistrictName string `json:"districtName"`
|
||||||
CityName string `json:"cityName"`
|
CityName string `json:"cityName"`
|
||||||
ProvinceName string `json:"provinceName"` //省名
|
ProvinceName string `json:"provinceName"` //省名
|
||||||
JdCode int `json:"jdCode"`
|
JdCityCode int `json:"jdCityCode"` //京东市code
|
||||||
|
JdCode int `json:"jdCode"` //京东区code
|
||||||
JdsCode int `json:"jdsCode"` //京东商城地址代码
|
JdsCode int `json:"jdsCode"` //京东商城地址代码
|
||||||
JdsStreetCode int `json:"jdsStreetCode"` //京东商城直辖市街道code
|
JdsStreetCode int `json:"jdsStreetCode"` //京东商城直辖市街道code
|
||||||
JdsStreetName string `json:"jdsStreetName"` //京东商城直辖市街道
|
JdsStreetName string `json:"jdsStreetName"` //京东商城直辖市街道
|
||||||
@@ -51,10 +54,19 @@ type StoreDetail struct {
|
|||||||
|
|
||||||
JdStoreLevel string `json:"jdStoreLevel"` //京东门店等级
|
JdStoreLevel string `json:"jdStoreLevel"` //京东门店等级
|
||||||
IsOrder int `json:"isOrder"` //是否是下预订单门店
|
IsOrder int `json:"isOrder"` //是否是下预订单门店
|
||||||
|
IsSupplyGoods int `json:"isSupplyGoods"`
|
||||||
|
|
||||||
YbAppID string `orm:"column(yb_app_id)" json:"ybAppID"`
|
YbAppID string `orm:"column(yb_app_id)" json:"ybAppID"`
|
||||||
YbAppKey string `json:"ybAppKey"`
|
YbAppKey string `json:"ybAppKey"`
|
||||||
YbStorePrefix string `json:"ybStorePrefix"`
|
YbStorePrefix string `json:"ybStorePrefix"`
|
||||||
|
|
||||||
|
MtwmToken string `json:"mtwmToken"`
|
||||||
|
EbaiSupplierID string `json:"ebaiSupplierID"`
|
||||||
|
|
||||||
|
BrandName string `json:"brandName"` //品牌信息
|
||||||
|
BrandLogo string `json:"brandLogo"`
|
||||||
|
BrandIsOpen int `json:"brandIsOpen"`
|
||||||
|
BrandIsPrint int `json:"brandIsPrint"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 带快递门店信息的
|
// 带快递门店信息的
|
||||||
@@ -94,23 +106,28 @@ func (s *StoreDetail) GetPricePerentage(price int) (pricePercentage int) {
|
|||||||
return pricePercentage
|
return pricePercentage
|
||||||
}
|
}
|
||||||
|
|
||||||
func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (storeDetail *StoreDetail, err error) {
|
func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID, vendorOrgCode string) (storeDetail *StoreDetail, err error) {
|
||||||
sql := `
|
sql := `
|
||||||
SELECT t1.*,
|
SELECT t1.*,
|
||||||
t2.vendor_store_id, t2.status vendor_status, t2.delivery_fee_deduction_sill, t2.delivery_fee_deduction_fee, t2.sync_status, t2.vendor_org_code,
|
t2.vendor_store_id, t2.status vendor_status, t2.delivery_fee_deduction_sill, t2.delivery_fee_deduction_fee, t2.sync_status, t2.vendor_org_code,
|
||||||
t2.price_percentage, t2.auto_pickup, t2.delivery_type, t2.delivery_competition, t2.is_sync, t2.vendor_store_name, t2.is_order, t2.yb_app_id, t2.yb_app_key, t2.yb_store_prefix,
|
t2.price_percentage, t2.auto_pickup, t2.delivery_type, t2.delivery_competition, t2.is_sync, t2.vendor_store_name, t2.is_order, t2.yb_app_id, t2.yb_app_key, t2.yb_store_prefix,
|
||||||
t2.jds_street_code, t2.jds_street_name,
|
t2.jds_street_code, t2.jds_street_name, t2.is_supply_goods, t2.vendor_pay_percentage, t2.mtwm_token, t2.ebai_supplier_id, t2.create_delivery_type,
|
||||||
t3.value price_percentage_pack_str,
|
t3.value price_percentage_pack_str,
|
||||||
t4.value freight_deduction_pack_str,
|
t4.value freight_deduction_pack_str,
|
||||||
province.name province_name,
|
province.name province_name,
|
||||||
district.name district_name,
|
district.name district_name,
|
||||||
district.jds_code jds_code,
|
district.jds_code jds_code,
|
||||||
district.jd_code jd_code,
|
district.jd_code jd_code,
|
||||||
|
city.jd_code jd_city_code,
|
||||||
city.name city_name,
|
city.name city_name,
|
||||||
IF(mm.name <> '', mm.name, mm.user_id2) market_man_name,
|
IF(mm.name <> '', mm.name, mm.user_id2) market_man_name,
|
||||||
IF(om.name <> '', om.name, om.user_id2) operator_name,
|
IF(om.name <> '', om.name, om.user_id2) operator_name,
|
||||||
IF(om2.name <> '', om2.name, om2.user_id2) operator_name2,
|
IF(om2.name <> '', om2.name, om2.user_id2) operator_name2,
|
||||||
IF(om3.name <> '', om3.name, om3.user_id2) operator_name3
|
IF(om3.name <> '', om3.name, om3.user_id2) operator_name3,
|
||||||
|
b.name brand_name,
|
||||||
|
b.logo brand_logo,
|
||||||
|
b.is_open brand_is_open,
|
||||||
|
b.is_print brand_is_print
|
||||||
FROM store t1
|
FROM store t1
|
||||||
LEFT JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ?
|
LEFT JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ?
|
||||||
LEFT JOIN place city ON city.code = t1.city_code
|
LEFT JOIN place city ON city.code = t1.city_code
|
||||||
@@ -122,6 +139,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
|
|||||||
LEFT JOIN user om ON om.mobile <> '' AND om.mobile = t1.operator_phone
|
LEFT JOIN user om ON om.mobile <> '' AND om.mobile = t1.operator_phone
|
||||||
LEFT JOIN user om2 ON om2.mobile <> '' AND om2.mobile = t1.operator_phone2
|
LEFT JOIN user om2 ON om2.mobile <> '' AND om2.mobile = t1.operator_phone2
|
||||||
LEFT JOIN user om3 ON om3.mobile <> '' AND om3.mobile = t1.operator_phone3
|
LEFT JOIN user om3 ON om3.mobile <> '' AND om3.mobile = t1.operator_phone3
|
||||||
|
LEFT JOIN brand b ON b.id = t1.brand_id AND b.deleted_at = ?
|
||||||
WHERE t1.deleted_at = ?
|
WHERE t1.deleted_at = ?
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
@@ -132,6 +150,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
|
|||||||
model.ConfigTypeFreightPack,
|
model.ConfigTypeFreightPack,
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
|
utils.DefaultTimeValue,
|
||||||
}
|
}
|
||||||
// if vendorID != model.VendorIDJX {
|
// if vendorID != model.VendorIDJX {
|
||||||
// sql += " AND t2.id IS NOT NULL"
|
// sql += " AND t2.id IS NOT NULL"
|
||||||
@@ -144,6 +163,13 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
|
|||||||
sql += " AND t2.vendor_store_id = ?"
|
sql += " AND t2.vendor_store_id = ?"
|
||||||
sqlParams = append(sqlParams, vendorStoreID)
|
sqlParams = append(sqlParams, vendorStoreID)
|
||||||
}
|
}
|
||||||
|
if vendorOrgCode != "" {
|
||||||
|
sql += " AND t2.vendor_org_code = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorOrgCode)
|
||||||
|
}
|
||||||
|
if vendorID == model.VendorIDJDShop && vendorOrgCode == "" {
|
||||||
|
sql += " AND t2.vendor_org_code = 1"
|
||||||
|
}
|
||||||
if err = GetRow(db, &storeDetail, sql, sqlParams...); err == nil {
|
if err = GetRow(db, &storeDetail, sql, sqlParams...); err == nil {
|
||||||
storeDetail.PricePercentagePackObj = PricePercentagePack2Obj(storeDetail.PricePercentagePackStr)
|
storeDetail.PricePercentagePackObj = PricePercentagePack2Obj(storeDetail.PricePercentagePackStr)
|
||||||
storeDetail.FreightDeductionPackObj = FreightDeductionPack2Obj(storeDetail.FreightDeductionPackStr)
|
storeDetail.FreightDeductionPackObj = FreightDeductionPack2Obj(storeDetail.FreightDeductionPackStr)
|
||||||
@@ -162,15 +188,15 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetStoreDetail(db *DaoDB, storeID, vendorID int) (storeDetail *StoreDetail, err error) {
|
func GetStoreDetail(db *DaoDB, storeID, vendorID int, vendorOrgCode string) (storeDetail *StoreDetail, err error) {
|
||||||
return getStoreDetail(db, storeID, vendorID, "")
|
return getStoreDetail(db, storeID, vendorID, "", vendorOrgCode)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetStoreDetailByVendorStoreID(db *DaoDB, vendorStoreID string, vendorID int) (storeDetail *StoreDetail, err error) {
|
func GetStoreDetailByVendorStoreID(db *DaoDB, vendorStoreID string, vendorID int, vendorOrgCode string) (storeDetail *StoreDetail, err error) {
|
||||||
if vendorID != model.VendorIDJX {
|
if vendorID != model.VendorIDJX {
|
||||||
return getStoreDetail(db, 0, vendorID, vendorStoreID)
|
return getStoreDetail(db, 0, vendorID, vendorStoreID, vendorOrgCode)
|
||||||
}
|
}
|
||||||
if storeDetail, err = getStoreDetail(db, int(utils.Str2Int64WithDefault(vendorStoreID, 0)), vendorID, ""); err == nil {
|
if storeDetail, err = getStoreDetail(db, int(utils.Str2Int64WithDefault(vendorStoreID, 0)), vendorID, "", vendorOrgCode); err == nil {
|
||||||
storeDetail.VendorStoreID = vendorStoreID
|
storeDetail.VendorStoreID = vendorStoreID
|
||||||
}
|
}
|
||||||
return storeDetail, err
|
return storeDetail, err
|
||||||
@@ -204,7 +230,7 @@ func GetStoreDetail2(db *DaoDB, storeID int, vendorStoreID string, vendorID int)
|
|||||||
return storeDetail, err
|
return storeDetail, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetStoreCourierList(db *DaoDB, storeIDs []int, status, auditStatus int) (courierStoreList []*model.StoreCourierMap, err error) {
|
func GetStoreCourierList(db *DaoDB, storeIDs, vendorIDs []int, status, auditStatus int) (courierStoreList []*model.StoreCourierMap, err error) {
|
||||||
sql := `
|
sql := `
|
||||||
SELECT t1.*
|
SELECT t1.*
|
||||||
FROM store_courier_map t1
|
FROM store_courier_map t1
|
||||||
@@ -217,6 +243,10 @@ func GetStoreCourierList(db *DaoDB, storeIDs []int, status, auditStatus int) (co
|
|||||||
sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
sqlParams = append(sqlParams, storeIDs)
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
}
|
}
|
||||||
|
if len(vendorIDs) > 0 {
|
||||||
|
sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, vendorIDs)
|
||||||
|
}
|
||||||
if status != model.StoreStatusAll {
|
if status != model.StoreStatusAll {
|
||||||
sql += " AND t1.status = ?"
|
sql += " AND t1.status = ?"
|
||||||
sqlParams = append(sqlParams, status)
|
sqlParams = append(sqlParams, status)
|
||||||
@@ -231,7 +261,38 @@ func GetStoreCourierList(db *DaoDB, storeIDs []int, status, auditStatus int) (co
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack string, mustDirty bool) (storeMapList []*model.StoreMap, err error) {
|
func GetStoreCourierList2(db *DaoDB, storeIDs, vendorIDs []int, status int, auditStatuss []int) (courierStoreList []*model.StoreCourierMap, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT t1.*
|
||||||
|
FROM store_courier_map t1
|
||||||
|
WHERE t1.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
|
}
|
||||||
|
if len(vendorIDs) > 0 {
|
||||||
|
sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, vendorIDs)
|
||||||
|
}
|
||||||
|
if status != model.StoreStatusAll {
|
||||||
|
sql += " AND t1.status = ?"
|
||||||
|
sqlParams = append(sqlParams, status)
|
||||||
|
}
|
||||||
|
if len(auditStatuss) > 0 {
|
||||||
|
sql += " AND t1.audit_status IN (" + GenQuestionMarks(len(auditStatuss)) + ")"
|
||||||
|
sqlParams = append(sqlParams, auditStatuss)
|
||||||
|
}
|
||||||
|
if err = GetRows(db, &courierStoreList, sql, sqlParams...); err == nil {
|
||||||
|
return courierStoreList, nil
|
||||||
|
}
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack, name, vendorOrgCode string, mustDirty bool) (storeMapList []*model.StoreMap, err error) {
|
||||||
sql := `
|
sql := `
|
||||||
SELECT t1.*
|
SELECT t1.*
|
||||||
FROM store_map t1
|
FROM store_map t1
|
||||||
@@ -266,10 +327,18 @@ func GetStoresMapList2(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, statu
|
|||||||
sql += " AND t1.price_percentage_pack = ?"
|
sql += " AND t1.price_percentage_pack = ?"
|
||||||
sqlParams = append(sqlParams, pricePack)
|
sqlParams = append(sqlParams, pricePack)
|
||||||
}
|
}
|
||||||
|
if name != "" {
|
||||||
|
sql += " AND t2.name LIKE ?"
|
||||||
|
sqlParams = append(sqlParams, "%"+name+"%")
|
||||||
|
}
|
||||||
|
if vendorOrgCode != "" {
|
||||||
|
sql += " AND t1.vendor_org_code = ?"
|
||||||
|
sqlParams = append(sqlParams, vendorOrgCode)
|
||||||
|
}
|
||||||
if mustDirty {
|
if mustDirty {
|
||||||
sql += " AND t1.sync_status <> 0"
|
sql += " AND t1.sync_status <> 0"
|
||||||
}
|
}
|
||||||
sql += " ORDER BY t1.store_id DESC, t1.vendor_id"
|
sql += " ORDER BY t1.store_id , t1.vendor_id"
|
||||||
if err = GetRows(db, &storeMapList, sql, sqlParams...); err == nil {
|
if err = GetRows(db, &storeMapList, sql, sqlParams...); err == nil {
|
||||||
return storeMapList, nil
|
return storeMapList, nil
|
||||||
}
|
}
|
||||||
@@ -300,8 +369,8 @@ func SetStoresMapSyncStatus(db *DaoDB, vendorIDs, storeIDs []int, syncStatus int
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack string) (storeMapList []*model.StoreMap, err error) {
|
func GetStoresMapList(db *DaoDB, vendorIDs, storeIDs, storeStatuss []int, status, isSync int, pricePack, name, vendorOrgCode string) (storeMapList []*model.StoreMap, err error) {
|
||||||
return GetStoresMapList2(db, vendorIDs, storeIDs, storeStatuss, status, isSync, pricePack, false)
|
return GetStoresMapList2(db, vendorIDs, storeIDs, storeStatuss, status, isSync, pricePack, name, vendorOrgCode, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func StoreMapList2Map(storeMapList []*model.StoreMap) (storeMapMap map[int][]*model.StoreMap) {
|
func StoreMapList2Map(storeMapList []*model.StoreMap) (storeMapMap map[int][]*model.StoreMap) {
|
||||||
@@ -493,7 +562,7 @@ func GetOpenedStoreCouriersByStoreID(db *DaoDB, storeID, vendorID int) (storeMap
|
|||||||
return storeMaps, nil
|
return storeMaps, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetStoreList(db *DaoDB, idList, cityCodes, statuss []int, mobileList []string, shortRoleName string) (storeList []*model.Store, err error) {
|
func GetStoreList(db *DaoDB, idList, cityCodes, statuss, brandIDs []int, mobileList []string, shortRoleName string) (storeList []*model.Store, err error) {
|
||||||
sql := `
|
sql := `
|
||||||
SELECT t1.*
|
SELECT t1.*
|
||||||
FROM store t1
|
FROM store t1
|
||||||
@@ -513,6 +582,10 @@ func GetStoreList(db *DaoDB, idList, cityCodes, statuss []int, mobileList []stri
|
|||||||
sql += " AND t1.status IN (" + GenQuestionMarks(len(statuss)) + ")"
|
sql += " AND t1.status IN (" + GenQuestionMarks(len(statuss)) + ")"
|
||||||
sqlParams = append(sqlParams, statuss)
|
sqlParams = append(sqlParams, statuss)
|
||||||
}
|
}
|
||||||
|
if len(brandIDs) > 0 {
|
||||||
|
sql += " AND t1.brand_id IN (" + GenQuestionMarks(len(brandIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, brandIDs)
|
||||||
|
}
|
||||||
if len(mobileList) > 0 {
|
if len(mobileList) > 0 {
|
||||||
sql += " AND (t1.tel1 IN (" + GenQuestionMarks(len(mobileList)) + ") OR t1.tel2 IN (" + GenQuestionMarks(len(mobileList)) + "))"
|
sql += " AND (t1.tel1 IN (" + GenQuestionMarks(len(mobileList)) + ") OR t1.tel2 IN (" + GenQuestionMarks(len(mobileList)) + "))"
|
||||||
sqlParams = append(sqlParams, mobileList, mobileList)
|
sqlParams = append(sqlParams, mobileList, mobileList)
|
||||||
@@ -740,42 +813,44 @@ func GetRealLinkStoreID(db *DaoDB, linkStoreID int) (realLinkStoreID int, err er
|
|||||||
return realLinkStoreID, err
|
return realLinkStoreID, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// func GetStoreCategoryMap(db *DaoDB, parentID, storeID, categoryID int) (storeCatMaps []*StoreCatMap, err error) {
|
func GetStoreCategoryMap(db *DaoDB, parentID, level, storeID, categoryID int) (storeCatMaps []*model.StoreCategoryMap, err error) {
|
||||||
// sql := `
|
sql := `
|
||||||
// SELECT a.*, b.level, b.parent_id, b.seq, b.name
|
SELECT a.*
|
||||||
// FROM store_category_map a
|
FROM store_category_map a
|
||||||
// JOIN sku_category b ON b.id = a.category_id
|
WHERE a.deleted_at = ?
|
||||||
// AND a.deleted_at = ?
|
`
|
||||||
// AND b.deleted_at = ?
|
sqlParams := []interface{}{
|
||||||
// `
|
utils.DefaultTimeValue,
|
||||||
// sqlParams := []interface{}{
|
}
|
||||||
// utils.DefaultTimeValue,
|
if parentID >= 0 {
|
||||||
// utils.DefaultTimeValue,
|
sql += " AND a.parent_id = ?"
|
||||||
// }
|
sqlParams = append(sqlParams, parentID)
|
||||||
// if parentID != -1 {
|
}
|
||||||
// sql += " AND b.parent_id = ?"
|
if level > 0 {
|
||||||
// sqlParams = append(sqlParams, parentID)
|
sql += " AND a.level = ?"
|
||||||
// }
|
sqlParams = append(sqlParams, level)
|
||||||
// if storeID > 0 {
|
}
|
||||||
// sql += " AND a.store_id = ?"
|
if storeID > 0 {
|
||||||
// sqlParams = append(sqlParams, storeID)
|
sql += " AND a.store_id = ?"
|
||||||
// }
|
sqlParams = append(sqlParams, storeID)
|
||||||
// if categoryID > 0 {
|
}
|
||||||
// sql += " AND a.category_id = ?"
|
if categoryID > 0 {
|
||||||
// sqlParams = append(sqlParams, categoryID)
|
sql += " AND a.category_id = ?"
|
||||||
// }
|
sqlParams = append(sqlParams, categoryID)
|
||||||
// err = GetRows(db, &storeCatMaps, sql, sqlParams)
|
}
|
||||||
// if err != nil {
|
sql += " ORDER BY a.level, a.store_category_seq"
|
||||||
// return nil, err
|
err = GetRows(db, &storeCatMaps, sql, sqlParams)
|
||||||
// }
|
if err != nil {
|
||||||
// return storeCatMaps, err
|
return nil, err
|
||||||
// }
|
}
|
||||||
|
return storeCatMaps, err
|
||||||
|
}
|
||||||
|
|
||||||
func InsertStoreCategories(db *DaoDB, userName string, storeID int) (err error) {
|
func InsertStoreCategories(db *DaoDB, userName string, storeID int) (err error) {
|
||||||
sql := `
|
sql := `
|
||||||
INSERT INTO store_category_map
|
INSERT INTO store_category_map
|
||||||
(created_at, updated_at, last_operator, deleted_at, store_id, category_id, store_category_name, store_category_seq)
|
(created_at, updated_at, last_operator, deleted_at, store_id, category_id, store_category_name, store_category_seq, level, parent_id)
|
||||||
SELECT ?, ?, ?, ?, ?, id, name, seq
|
SELECT ?, ?, ?, ?, ?, id, name, seq, level, parent_id
|
||||||
FROM sku_category
|
FROM sku_category
|
||||||
WHERE deleted_at = ?
|
WHERE deleted_at = ?
|
||||||
AND is_exd_spec = ?
|
AND is_exd_spec = ?
|
||||||
@@ -803,3 +878,245 @@ func DeleteStoreCategroies(db *DaoDB, userName string, storeID int) (err error)
|
|||||||
_, err = ExecuteSQL(db, sql, sqlParams)
|
_, err = ExecuteSQL(db, sql, sqlParams)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DeleteStoreCategroies2(db *DaoDB, storeID int) (err error) {
|
||||||
|
sql := `
|
||||||
|
DELETE FROM store_category_map WHERE store_id = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
storeID,
|
||||||
|
}
|
||||||
|
_, err = ExecuteSQL(db, sql, sqlParams)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStorePushClient(db *DaoDB, storeID int, cID string) (storePushClient []*model.StorePushClient, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM store_push_client
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if storeID > 0 {
|
||||||
|
sql += " AND store_id = ?"
|
||||||
|
sqlParams = append(sqlParams, storeID)
|
||||||
|
}
|
||||||
|
if cID != "" {
|
||||||
|
sql += " AND client_id = ?"
|
||||||
|
sqlParams = append(sqlParams, cID)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &storePushClient, sql, sqlParams)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return storePushClient, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreAudit(db *DaoDB, auditStatuss []int, userID, keyword string) (storeAudit []*model.StoreAudit, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM store_audit
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if len(auditStatuss) > 0 {
|
||||||
|
sql += " AND audit_status IN (" + GenQuestionMarks(len(auditStatuss)) + ")"
|
||||||
|
sqlParams = append(sqlParams, auditStatuss)
|
||||||
|
}
|
||||||
|
if userID != "" {
|
||||||
|
sql += " AND user_id = ?"
|
||||||
|
sqlParams = append(sqlParams, userID)
|
||||||
|
}
|
||||||
|
if keyword != "" {
|
||||||
|
sql += " AND (user_id LIKE ? OR name LIKE ? OR tel1 LIKE ? OR tel2 LIKE ? OR address LIKE ?)"
|
||||||
|
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
|
||||||
|
}
|
||||||
|
err = GetRows(db, &storeAudit, sql, sqlParams)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return storeAudit, err
|
||||||
|
}
|
||||||
|
|
||||||
|
type tStoreAudit struct {
|
||||||
|
model.StoreAudit
|
||||||
|
UserName string `json:"userName"`
|
||||||
|
CityName string `json:"cityName"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreAuditPage(db *DaoDB, statuss []int, keyword string, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
|
||||||
|
var requestList []*tStoreAudit
|
||||||
|
sql := `
|
||||||
|
SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*, b.name user_name, c.name city_name
|
||||||
|
FROM store_audit a
|
||||||
|
LEFT JOIN user b ON b.user_id = a.user_id
|
||||||
|
LEFT JOIN place c ON c.code = a.city_code
|
||||||
|
WHERE a.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if len(statuss) > 0 {
|
||||||
|
sql += " AND a.audit_status IN (" + GenQuestionMarks(len(statuss)) + ")"
|
||||||
|
sqlParams = append(sqlParams, statuss)
|
||||||
|
}
|
||||||
|
if applyTimeStart != utils.ZeroTimeValue && applyTimeEnd != utils.ZeroTimeValue {
|
||||||
|
sql += " AND a.created_at BETWEEN ? AND ?"
|
||||||
|
sqlParams = append(sqlParams, applyTimeStart, applyTimeEnd)
|
||||||
|
}
|
||||||
|
if auditTimeStart != utils.ZeroTimeValue && auditTimeEnd != utils.ZeroTimeValue {
|
||||||
|
sql += " AND a.updated_at BETWEEN ? AND ?"
|
||||||
|
sqlParams = append(sqlParams, auditTimeStart, auditTimeEnd)
|
||||||
|
}
|
||||||
|
if keyword != "" {
|
||||||
|
sql += " AND (a.user_id LIKE ? OR a.name LIKE ? OR a.tel1 LIKE ? OR a.tel2 LIKE ? OR a.address LIKE ?)"
|
||||||
|
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
|
||||||
|
}
|
||||||
|
sql += " ORDER BY a.updated_at LIMIT ? OFFSET ?"
|
||||||
|
pageSize = jxutils.FormalizePageSize(pageSize)
|
||||||
|
sqlParams = append(sqlParams, pageSize, offset)
|
||||||
|
Begin(db)
|
||||||
|
defer Commit(db)
|
||||||
|
if err = GetRows(db, &requestList, sql, sqlParams...); err == nil {
|
||||||
|
return &model.PagedInfo{
|
||||||
|
TotalCount: GetLastTotalRowCount(db),
|
||||||
|
Data: requestList,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
return pagedInfo, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetBrands(db *DaoDB, name string, brandID int) (brands []*model.Brand, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM brand
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
}
|
||||||
|
if name != "" {
|
||||||
|
sql += " AND name LIKE ?"
|
||||||
|
sqlParams = append(sqlParams, "%"+name+"%")
|
||||||
|
}
|
||||||
|
if brandID != 0 {
|
||||||
|
sql += " AND id = ?"
|
||||||
|
sqlParams = append(sqlParams, brandID)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &brands, sql, sqlParams)
|
||||||
|
return brands, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreAcctIncome(db *DaoDB, storeID, incomeType int, fromTime, toTime time.Time) (storeAcctIncomes []*model.StoreAcctIncome, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM store_acct_income
|
||||||
|
WHERE 1 = 1
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
if storeID != 0 {
|
||||||
|
sql += " AND store_id = ?"
|
||||||
|
sqlParams = append(sqlParams, storeID)
|
||||||
|
}
|
||||||
|
if incomeType != 0 {
|
||||||
|
sql += " AND type = ?"
|
||||||
|
sqlParams = append(sqlParams, incomeType)
|
||||||
|
}
|
||||||
|
if utils.IsTimeZero(fromTime) {
|
||||||
|
sql += " AND created_at >= ?"
|
||||||
|
sqlParams = append(sqlParams, fromTime)
|
||||||
|
}
|
||||||
|
if utils.IsTimeZero(toTime) {
|
||||||
|
sql += " AND created_at <= ?"
|
||||||
|
sqlParams = append(sqlParams, toTime)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &storeAcctIncomes, sql, sqlParams)
|
||||||
|
return storeAcctIncomes, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreAcctIncomeTotal(db *DaoDB, storeID, incomeType int, fromTime, toTime time.Time) (incomeTotal int, err error) {
|
||||||
|
var income *model.StoreAcctIncome
|
||||||
|
sql := `
|
||||||
|
SELECT SUM(income_price) income_price
|
||||||
|
FROM store_acct_income
|
||||||
|
WHERE 1 = 1
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
if storeID != 0 {
|
||||||
|
sql += " AND store_id = ?"
|
||||||
|
sqlParams = append(sqlParams, storeID)
|
||||||
|
}
|
||||||
|
if incomeType != 0 {
|
||||||
|
sql += " AND type = ?"
|
||||||
|
sqlParams = append(sqlParams, incomeType)
|
||||||
|
}
|
||||||
|
if utils.IsTimeZero(fromTime) {
|
||||||
|
sql += " AND created_at >= ?"
|
||||||
|
sqlParams = append(sqlParams, fromTime)
|
||||||
|
}
|
||||||
|
if utils.IsTimeZero(toTime) {
|
||||||
|
sql += " AND created_at <= ?"
|
||||||
|
sqlParams = append(sqlParams, toTime)
|
||||||
|
}
|
||||||
|
err = GetRow(db, &income, sql, sqlParams)
|
||||||
|
return income.IncomePrice, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreAcctExpend(db *DaoDB, storeID, expendType int, fromTime, toTime time.Time) (storeAcctExpends []*model.StoreAcctExpend, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM store_acct_expend
|
||||||
|
WHERE 1 = 1
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
if storeID != 0 {
|
||||||
|
sql += " AND store_id = ?"
|
||||||
|
sqlParams = append(sqlParams, storeID)
|
||||||
|
}
|
||||||
|
if expendType != 0 {
|
||||||
|
sql += " AND type = ?"
|
||||||
|
sqlParams = append(sqlParams, expendType)
|
||||||
|
}
|
||||||
|
if utils.IsTimeZero(fromTime) {
|
||||||
|
sql += " AND created_at >= ?"
|
||||||
|
sqlParams = append(sqlParams, fromTime)
|
||||||
|
}
|
||||||
|
if utils.IsTimeZero(toTime) {
|
||||||
|
sql += " AND created_at <= ?"
|
||||||
|
sqlParams = append(sqlParams, toTime)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &storeAcctExpends, sql, sqlParams)
|
||||||
|
return storeAcctExpends, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreAcctExpendTotal(db *DaoDB, storeID, expendType int, fromTime, toTime time.Time) (expendTotal int, err error) {
|
||||||
|
var expend *model.StoreAcctExpend
|
||||||
|
sql := `
|
||||||
|
SELECT SUM(expend_price) expend_price
|
||||||
|
FROM store_acct_expend
|
||||||
|
WHERE 1 = 1
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{}
|
||||||
|
if storeID != 0 {
|
||||||
|
sql += " AND store_id = ?"
|
||||||
|
sqlParams = append(sqlParams, storeID)
|
||||||
|
}
|
||||||
|
if expendType != 0 {
|
||||||
|
sql += " AND type = ?"
|
||||||
|
sqlParams = append(sqlParams, expendType)
|
||||||
|
}
|
||||||
|
if utils.IsTimeZero(fromTime) {
|
||||||
|
sql += " AND created_at >= ?"
|
||||||
|
sqlParams = append(sqlParams, fromTime)
|
||||||
|
}
|
||||||
|
if utils.IsTimeZero(toTime) {
|
||||||
|
sql += " AND created_at <= ?"
|
||||||
|
sqlParams = append(sqlParams, toTime)
|
||||||
|
}
|
||||||
|
err = GetRow(db, &expend, sql, sqlParams)
|
||||||
|
return expend.ExpendPrice, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -41,6 +41,18 @@ type SkuStoreCatInfo struct {
|
|||||||
ParentCatName string
|
ParentCatName string
|
||||||
ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"`
|
ParentVendorCatID string `orm:"column(parent_vendor_cat_id)"`
|
||||||
ParentCatSyncStatus int8
|
ParentCatSyncStatus int8
|
||||||
|
|
||||||
|
StoreCatID int `orm:"column(store_category_id)"`
|
||||||
|
StoreCatName string
|
||||||
|
StoreCatSeq int
|
||||||
|
StoreParentCatName string
|
||||||
|
IsSysCat int
|
||||||
|
CityCode int
|
||||||
|
IsJxCat int
|
||||||
|
|
||||||
|
VendorCategoryName string
|
||||||
|
VendorCategorySeq int
|
||||||
|
VendorCategoryID int `orm:"column(vendor_category_id)"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type StoreSkuSyncInfo struct {
|
type StoreSkuSyncInfo struct {
|
||||||
@@ -57,6 +69,7 @@ type StoreSkuSyncInfo struct {
|
|||||||
|
|
||||||
Price int64
|
Price int64
|
||||||
UnitPrice int64
|
UnitPrice int64
|
||||||
|
Stock int
|
||||||
|
|
||||||
// 平台相关的store sku信息
|
// 平台相关的store sku信息
|
||||||
StoreSkuStatus int
|
StoreSkuStatus int
|
||||||
@@ -68,6 +81,8 @@ type StoreSkuSyncInfo struct {
|
|||||||
model.Sku
|
model.Sku
|
||||||
ExdSkuID string `orm:"column(exd_sku_id)"`
|
ExdSkuID string `orm:"column(exd_sku_id)"`
|
||||||
ExdCategoryThirdID int `orm:"column(exd_category_third_id)"`
|
ExdCategoryThirdID int `orm:"column(exd_category_third_id)"`
|
||||||
|
BrandID int `orm:"column(brand_id)"`
|
||||||
|
ExBrandID int `orm:"column(ex_brand_id)"`
|
||||||
StoreName string
|
StoreName string
|
||||||
|
|
||||||
// sku_name
|
// sku_name
|
||||||
@@ -75,6 +90,7 @@ type StoreSkuSyncInfo struct {
|
|||||||
ExPrefix string
|
ExPrefix string
|
||||||
ExPrefixBegin *time.Time
|
ExPrefixBegin *time.Time
|
||||||
ExPrefixEnd *time.Time
|
ExPrefixEnd *time.Time
|
||||||
|
|
||||||
// NameID int `orm:"column(name_id)"`
|
// NameID int `orm:"column(name_id)"`
|
||||||
VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用
|
VendorNameID string `orm:"column(vendor_name_id)"` // 暂时无用
|
||||||
Name string
|
Name string
|
||||||
@@ -86,11 +102,17 @@ type StoreSkuSyncInfo struct {
|
|||||||
NameCategoryID int `orm:"column(name_category_id)"`
|
NameCategoryID int `orm:"column(name_category_id)"`
|
||||||
YbNameSuffix string //银豹的商品条码后缀
|
YbNameSuffix string //银豹的商品条码后缀
|
||||||
YbBarCode string //银豹的商品条码
|
YbBarCode string //银豹的商品条码
|
||||||
|
JdsStockSwitch int
|
||||||
|
PreparationTime int
|
||||||
|
|
||||||
// 平台相关的图片信息
|
// 平台相关的图片信息
|
||||||
Img string
|
Img string
|
||||||
Img2 string
|
Img2 string
|
||||||
|
Img3 string
|
||||||
DescImg string
|
DescImg string
|
||||||
|
ImgWatermark string `json:"imgWatermark"` //图片水印
|
||||||
|
ImgMix string //合成水印后的图片
|
||||||
|
ImgOrigin string //skuname里的img
|
||||||
|
|
||||||
VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点)
|
VendorVendorCatID int64 `orm:"column(vendor_vendor_cat_id)"` // 平台商品分类(叶子结点)
|
||||||
CategoryName string `json:"categoryName"` //分类名
|
CategoryName string `json:"categoryName"` //分类名
|
||||||
@@ -101,12 +123,14 @@ type StoreSkuSyncInfo struct {
|
|||||||
// sku_name的商家分类信息
|
// sku_name的商家分类信息
|
||||||
CatSyncStatus int8
|
CatSyncStatus int8
|
||||||
VendorCatID string `orm:"column(vendor_cat_id)"`
|
VendorCatID string `orm:"column(vendor_cat_id)"`
|
||||||
|
SkuVendorMapCatID string `orm:"column(sku_vendor_map_cat_id)"`
|
||||||
|
|
||||||
VendorPrice int64
|
VendorPrice int64
|
||||||
LockTime *time.Time
|
LockTime *time.Time
|
||||||
|
|
||||||
MergedStatus int
|
MergedStatus int
|
||||||
SkuName string
|
SkuName string
|
||||||
|
SkuNameOrigin string
|
||||||
StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围
|
StatusSaleBegin int16 `json:"statusSaleBegin"` //商品可售时间范围
|
||||||
StatusSaleEnd int16 `json:"statusSaleEnd"`
|
StatusSaleEnd int16 `json:"statusSaleEnd"`
|
||||||
|
|
||||||
@@ -114,6 +138,8 @@ type StoreSkuSyncInfo struct {
|
|||||||
ActPercentage int `json:"actPercentage"` // 直降活动百分比
|
ActPercentage int `json:"actPercentage"` // 直降活动百分比
|
||||||
ActSyncStatus int8 `orm:"default(2)" json:"actSyncStatus"`
|
ActSyncStatus int8 `orm:"default(2)" json:"actSyncStatus"`
|
||||||
VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价
|
VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价
|
||||||
|
|
||||||
|
IsDeletedBySku bool `json:"isDeletedBySku"` //京东商城用,同步下架的商品库里的sku时,要做区分来决定调的api
|
||||||
}
|
}
|
||||||
|
|
||||||
type MissingStoreSkuInfo struct {
|
type MissingStoreSkuInfo struct {
|
||||||
@@ -155,6 +181,7 @@ type StoreSkuNameExt struct {
|
|||||||
RealMidUnitPrice int `json:"realMidUnitPrice"`
|
RealMidUnitPrice int `json:"realMidUnitPrice"`
|
||||||
Count int `json:"count"`
|
Count int `json:"count"`
|
||||||
YbSkuName string `json:"ybSkuName"`
|
YbSkuName string `json:"ybSkuName"`
|
||||||
|
AuditUnitPrice int `json:"auditUnitPrice"` //审核价格
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetStoreSkus用
|
// GetStoreSkus用
|
||||||
@@ -195,6 +222,7 @@ type StoreSkuExt struct {
|
|||||||
SkuSpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量
|
SkuSpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量
|
||||||
Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality
|
Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality
|
||||||
SkuStatus int `json:"status"`
|
SkuStatus int `json:"status"`
|
||||||
|
Stock int `json:"stock"`
|
||||||
|
|
||||||
BindCreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"`
|
BindCreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"`
|
||||||
BindUpdatedAt time.Time `orm:"auto_now;type(datetime)" json:"updatedAt"`
|
BindUpdatedAt time.Time `orm:"auto_now;type(datetime)" json:"updatedAt"`
|
||||||
@@ -244,11 +272,16 @@ type StoreSkuExt struct {
|
|||||||
ActPrice int `json:"actPrice"`
|
ActPrice int `json:"actPrice"`
|
||||||
ActID int `orm:"column(act_id)" json:"actID"`
|
ActID int `orm:"column(act_id)" json:"actID"`
|
||||||
ActType int `orm:"column(act_type)" json:"actType"`
|
ActType int `orm:"column(act_type)" json:"actType"`
|
||||||
|
DiscountType int `json:"discountType"`
|
||||||
|
DiscountValue1 int `json:"discountValue1"`
|
||||||
|
DiscountValue2 int `json:"discountValue2"`
|
||||||
|
|
||||||
EarningPrice int `json:"earningPrice"`
|
EarningPrice int `json:"earningPrice"`
|
||||||
EarningActID int `orm:"column(earning_act_id)" json:"earningActID"`
|
EarningActID int `orm:"column(earning_act_id)" json:"earningActID"`
|
||||||
|
|
||||||
EclpID string `orm:"column(eclp_id)" json:"eclpID"`
|
EclpID string `orm:"column(eclp_id)" json:"eclpID"`
|
||||||
|
TrendType int `json:"trendType"`
|
||||||
|
TrendPrice int `json:"trendPrice"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SkuNameAndPlace struct {
|
type SkuNameAndPlace struct {
|
||||||
@@ -267,6 +300,12 @@ type StoreSkuPriceAndWeight struct {
|
|||||||
SkuID int `orm:"column(sku_id)"`
|
SkuID int `orm:"column(sku_id)"`
|
||||||
Weight int
|
Weight int
|
||||||
Price int
|
Price int
|
||||||
|
Prefix string
|
||||||
|
Name string
|
||||||
|
Unit string
|
||||||
|
Comment string
|
||||||
|
SpecQuality float32
|
||||||
|
SpecUnit string
|
||||||
}
|
}
|
||||||
|
|
||||||
type StoreSkuAndName struct {
|
type StoreSkuAndName struct {
|
||||||
@@ -336,12 +375,16 @@ func GetSkusCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int
|
|||||||
func GetStoreCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int, mustDirty bool) (cats []*SkuStoreCatInfo, err error) {
|
func GetStoreCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level int, mustDirty bool) (cats []*SkuStoreCatInfo, err error) {
|
||||||
fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID])
|
fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[vendorID])
|
||||||
sql := `
|
sql := `
|
||||||
SELECT t4.*,
|
SELECT t4.*, ts.store_category_name store_cat_name, ts.store_category_seq store_cat_seq, ts.id store_category_id,
|
||||||
t5.id map_id, t5.%s_id vendor_cat_id, t5.%s_sync_status cat_sync_status,
|
t5.id map_id, t5.%s_id vendor_cat_id, t5.%s_sync_status cat_sync_status,
|
||||||
t4p.name parent_cat_name,
|
t4p.name parent_cat_name,
|
||||||
t5p.id parent_map_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status
|
tsp.store_category_name store_parent_cat_name,
|
||||||
|
t5p.id parent_map_id, t5p.%s_id parent_vendor_cat_id, t5p.%s_sync_status parent_cat_sync_status,
|
||||||
|
t1.is_sys_cat, t1.vendor_org_code,
|
||||||
|
t6.city_code
|
||||||
FROM store_sku_category_map t5
|
FROM store_sku_category_map t5
|
||||||
JOIN sku_category t4 ON t5.category_id = t4.id AND t4.deleted_at = ?
|
JOIN sku_category t4 ON t5.category_id = t4.id
|
||||||
|
LEFT JOIN store_category_map ts ON ts.store_id = t5.store_id AND ts.category_id = t4.id AND ts.deleted_at = ?
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
@@ -361,9 +404,12 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level in
|
|||||||
}
|
}
|
||||||
sql += `
|
sql += `
|
||||||
LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id
|
LEFT JOIN sku_category t4p ON t4.parent_id = t4p.id
|
||||||
LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5.store_id = t5p.store_id AND t5p.deleted_at = ?
|
LEFT JOIN store_category_map tsp ON tsp.store_id = t5.store_id AND tsp.category_id = t4p.id AND tsp.deleted_at = ?
|
||||||
|
LEFT JOIN store_sku_category_map t5p ON t4p.id = t5p.category_id AND t5.store_id = t5p.store_id
|
||||||
|
LEFT JOIN store_map t1 ON t1.store_id = t5.store_id AND t1.vendor_id = ?
|
||||||
|
LEFT JOIN store t6 ON t6.id = t5.store_id
|
||||||
WHERE t5.store_id = ? AND t5.deleted_at = ? AND t4.is_sync <> ?`
|
WHERE t5.store_id = ? AND t5.deleted_at = ? AND t4.is_sync <> ?`
|
||||||
sqlParams = append(sqlParams, utils.DefaultTimeValue, storeID, utils.DefaultTimeValue, model.YES)
|
sqlParams = append(sqlParams, utils.DefaultTimeValue, vendorID, storeID, utils.DefaultTimeValue, model.YES)
|
||||||
if mustDirty {
|
if mustDirty {
|
||||||
sql += " AND t5.%s_sync_status <> 0"
|
sql += " AND t5.%s_sync_status <> 0"
|
||||||
fieldPrefixParams = append(fieldPrefixParams, fieldPrefix)
|
fieldPrefixParams = append(fieldPrefixParams, fieldPrefix)
|
||||||
@@ -372,6 +418,11 @@ func GetStoreCategories(db *DaoDB, vendorID, storeID int, skuIDs []int, level in
|
|||||||
sql += " AND t4.level = ?"
|
sql += " AND t4.level = ?"
|
||||||
sqlParams = append(sqlParams, level)
|
sqlParams = append(sqlParams, level)
|
||||||
}
|
}
|
||||||
|
if storeID == 102902 {
|
||||||
|
fmt.Println(sql)
|
||||||
|
fmt.Println(sqlParams)
|
||||||
|
}
|
||||||
|
|
||||||
if err = GetRows(db, &cats, fmt.Sprintf(sql, fieldPrefixParams...), sqlParams...); err != nil {
|
if err = GetRows(db, &cats, fmt.Sprintf(sql, fieldPrefixParams...), sqlParams...); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -399,20 +450,26 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
|
|||||||
t14.vendor_id, t14.vendor_org_code,
|
t14.vendor_id, t14.vendor_org_code,
|
||||||
t1.id bind_id, t1.sku_id, t1.price, t1.unit_price, t1.status store_sku_status,
|
t1.id bind_id, t1.sku_id, t1.price, t1.unit_price, t1.status store_sku_status,
|
||||||
%s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time,
|
%s vendor_sku_id, t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time,
|
||||||
t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id,
|
t1.store_id, t1.deleted_at bind_deleted_at,t1.status_sale_begin,t1.status_sale_end, t1.jds_ware_id, t1.stock,
|
||||||
t2.*,
|
t2.*,
|
||||||
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, t3.category_id name_category_id, t3.yb_name_suffix,
|
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.category_id name_category_id, t3.yb_name_suffix,
|
||||||
|
t3.jds_stock_switch, t3.preparation_time, t3.img_watermark, t3.ex_vendor_id, t3.img img_origin,
|
||||||
IF(t11.%s <> '', t11.%s, t3.img) img,
|
IF(t11.%s <> '', t11.%s, t3.img) img,
|
||||||
IF(t12.%s <> '', t12.%s, t3.img2) img2,
|
IF(t12.%s <> '', t12.%s, t3.img2) img2,
|
||||||
|
IF(t15.%s <> '', t15.%s, t3.img3) img3,
|
||||||
IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img,
|
IF(t13.%s <> '', t13.%s, t3.desc_img) desc_img,
|
||||||
t4.%s_category_id vendor_vendor_cat_id,
|
t4.%s_category_id vendor_vendor_cat_id,
|
||||||
t4.name category_name,
|
t4.name category_name,
|
||||||
ts.name store_name`
|
ts.name store_name,
|
||||||
|
ts.brand_id,
|
||||||
|
tsu.ex_prefix, tsu.begin_at ex_prefix_begin, tsu.end_at ex_prefix_end, tsu.img_watermark, tsu.img_watermark_mix img_mix, tsu.brand_id ex_brand_id,
|
||||||
|
tsu1.vendor_category_id sku_vendor_map_cat_id`
|
||||||
fmtParams := []interface{}{
|
fmtParams := []interface{}{
|
||||||
skuVendorIDField, fieldPrefix, fieldPrefix, fieldPrefix,
|
skuVendorIDField, fieldPrefix, fieldPrefix, fieldPrefix,
|
||||||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||||||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||||||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||||||
|
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||||||
fieldPrefix,
|
fieldPrefix,
|
||||||
}
|
}
|
||||||
if isSingleStorePF {
|
if isSingleStorePF {
|
||||||
@@ -438,7 +495,10 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
|
|||||||
LEFT JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ?
|
LEFT JOIN sku_category t4 ON t3.category_id = t4.id AND t4.deleted_at = ?
|
||||||
LEFT JOIN data_resource t11 ON t11.main_url = t3.img
|
LEFT JOIN data_resource t11 ON t11.main_url = t3.img
|
||||||
LEFT JOIN data_resource t12 ON t12.main_url = t3.img2
|
LEFT JOIN data_resource t12 ON t12.main_url = t3.img2
|
||||||
|
LEFT JOIN data_resource t15 ON t15.main_url = t3.img3
|
||||||
LEFT JOIN data_resource t13 ON t13.main_url = t3.desc_img
|
LEFT JOIN data_resource t13 ON t13.main_url = t3.desc_img
|
||||||
|
LEFT JOIN sku_exinfo_map tsu ON tsu.name_id = t3.id AND tsu.deleted_at = ? AND tsu.vendor_id = t14.vendor_id
|
||||||
|
LEFT JOIN sku_vendor_category_map tsu1 ON tsu1.name_id = t3.id AND tsu1.deleted_at = ? AND tsu1.vendor_id = t14.vendor_id
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
vendorID, utils.DefaultTimeValue,
|
vendorID, utils.DefaultTimeValue,
|
||||||
@@ -446,6 +506,8 @@ func GetStoreSkus2(db *DaoDB, vendorID, storeID int, skuIDs []int, mustDirty boo
|
|||||||
utils.DefaultTimeValue, // model.SkuStatusNormal,
|
utils.DefaultTimeValue, // model.SkuStatusNormal,
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
|
utils.DefaultTimeValue,
|
||||||
|
utils.DefaultTimeValue,
|
||||||
}
|
}
|
||||||
if globals.IsStoreSkuAct {
|
if globals.IsStoreSkuAct {
|
||||||
sql += `
|
sql += `
|
||||||
@@ -523,7 +585,7 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf
|
|||||||
sm.vendor_id, sm.vendor_org_code, sm.yb_app_id, sm.yb_app_key,
|
sm.vendor_id, sm.vendor_org_code, sm.yb_app_id, sm.yb_app_key,
|
||||||
t1.id bind_id, t1.price, t1.unit_price, t1.status store_sku_status,
|
t1.id bind_id, t1.price, t1.unit_price, t1.status store_sku_status,
|
||||||
t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time,
|
t1.%s_sync_status sku_sync_status, t1.%s_price vendor_price, t1.%s_lock_time lock_time,
|
||||||
t1.store_id, t1.deleted_at bind_deleted_at,
|
t1.store_id, t1.deleted_at bind_deleted_at, t1.stock,
|
||||||
t2.*, t2.id sku_id, t2m.vendor_thing_id vendor_sku_id,
|
t2.*, t2.id sku_id, t2m.vendor_thing_id vendor_sku_id,
|
||||||
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, t3.category_id name_category_id,
|
t3.id name_id, t3.prefix, t3.name, t3.unit, t3.upc, t3.status name_status, t3.ex_prefix, t3.ex_prefix_begin, t3.ex_prefix_end, t3.category_id name_category_id,
|
||||||
IF(t11.%s <> '', t11.%s, t3.img) img,
|
IF(t11.%s <> '', t11.%s, t3.img) img,
|
||||||
@@ -563,8 +625,6 @@ func GetFullStoreSkus(db *DaoDB, vendorID, storeID int) (skus []*StoreSkuSyncInf
|
|||||||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||||||
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
GetDataResFieldName(vendorID), GetDataResFieldName(vendorID),
|
||||||
fieldPrefix)
|
fieldPrefix)
|
||||||
// globals.SugarLogger.Debug(sql)
|
|
||||||
// globals.SugarLogger.Debug(utils.Format4Output(sqlParams, false))
|
|
||||||
if err = GetRows(db, &skus, sql, sqlParams...); err != nil {
|
if err = GetRows(db, &skus, sql, sqlParams...); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -587,10 +647,12 @@ func GetStoreSkuPriceAndWeight(db *DaoDB, vendorStoreID string, vendorID int, ve
|
|||||||
vendorSkuIDField = fmt.Sprintf("t2.%s_id", ConvertDBFieldPrefix(model.VendorNames[vendorID]))
|
vendorSkuIDField = fmt.Sprintf("t2.%s_id", ConvertDBFieldPrefix(model.VendorNames[vendorID]))
|
||||||
}
|
}
|
||||||
sql := fmt.Sprintf(`
|
sql := fmt.Sprintf(`
|
||||||
SELECT %s vendor_sku_id, t1.id sku_id, t2.price, t1.weight
|
SELECT %s vendor_sku_id, t1.id sku_id, t2.price, t1.weight,
|
||||||
|
t5.prefix, t5.name, t1.comment, t5.unit, t1.spec_quality, t1.spec_unit
|
||||||
FROM sku t1
|
FROM sku t1
|
||||||
JOIN store_sku_bind t2 ON t2.sku_id = t1.id AND t2.deleted_at = ?
|
JOIN store_sku_bind t2 ON t2.sku_id = t1.id AND t2.deleted_at = ?
|
||||||
JOIN store_map t3 ON t3.store_id = t2.store_id AND t3.vendor_id = ? AND t3.vendor_store_id = ? AND t3.deleted_at = ?
|
JOIN store_map t3 ON t3.store_id = t2.store_id AND t3.vendor_id = ? AND t3.vendor_store_id = ? AND t3.deleted_at = ?
|
||||||
|
JOIN sku_name t5 ON t5.id = t1.name_id
|
||||||
%s
|
%s
|
||||||
WHERE %s IN (`+GenQuestionMarks(len(vendorSkuIDs))+`)`, vendorSkuIDField, sqlThingMap, vendorSkuIDField)
|
WHERE %s IN (`+GenQuestionMarks(len(vendorSkuIDs))+`)`, vendorSkuIDField, sqlThingMap, vendorSkuIDField)
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
@@ -603,7 +665,6 @@ func GetStoreSkuPriceAndWeight(db *DaoDB, vendorStoreID string, vendorID int, ve
|
|||||||
} else {
|
} else {
|
||||||
sqlParams = append(sqlParams, vendorSkuIDs)
|
sqlParams = append(sqlParams, vendorSkuIDs)
|
||||||
}
|
}
|
||||||
// globals.SugarLogger.Debugf(sql)
|
|
||||||
err = GetRows(db, &l, sql, sqlParams...)
|
err = GetRows(db, &l, sql, sqlParams...)
|
||||||
return l, err
|
return l, err
|
||||||
}
|
}
|
||||||
@@ -870,7 +931,8 @@ func UpdateStoreSkuBindSyncStatusForSaleStatus(db *DaoDB, vendorIDs []int, store
|
|||||||
if len(vendorIDs) > 0 {
|
if len(vendorIDs) > 0 {
|
||||||
for _, v := range vendorIDs {
|
for _, v := range vendorIDs {
|
||||||
fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[v])
|
fieldPrefix := ConvertDBFieldPrefix(model.VendorNames[v])
|
||||||
sql += ` %s_sync_status = ?,`
|
sql += ` %s_sync_status = %s_sync_status | ?,`
|
||||||
|
fmtParams = append(fmtParams, fieldPrefix)
|
||||||
fmtParams = append(fmtParams, fieldPrefix)
|
fmtParams = append(fmtParams, fieldPrefix)
|
||||||
sqlParams = append(sqlParams, model.SyncFlagSaleMask)
|
sqlParams = append(sqlParams, model.SyncFlagSaleMask)
|
||||||
}
|
}
|
||||||
@@ -962,22 +1024,27 @@ func DeleteSkuNameExPrefixOverdue(db *DaoDB) (num int64, err error) {
|
|||||||
|
|
||||||
func GetStoreSkusByNameIDs(db *DaoDB, storeIDs []int, nameID int) (skuList []*StoreSkuSyncInfo, err error) {
|
func GetStoreSkusByNameIDs(db *DaoDB, storeIDs []int, nameID int) (skuList []*StoreSkuSyncInfo, err error) {
|
||||||
sql := `
|
sql := `
|
||||||
SELECT a.*,c.unit,c.name
|
SELECT a.*, c.unit, c.name, b.name_id, a.status store_sku_status
|
||||||
FROM store_sku_bind a
|
FROM store_sku_bind a
|
||||||
JOIN sku b ON a.sku_id = b.id
|
JOIN sku b ON a.sku_id = b.id
|
||||||
JOIN sku_name c ON b.name_id = c.id
|
JOIN sku_name c ON b.name_id = c.id
|
||||||
WHERE b.name_id = ?
|
WHERE 1=1
|
||||||
AND a.deleted_at = ?
|
AND a.deleted_at = ?
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
nameID,
|
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
}
|
}
|
||||||
|
if nameID != 0 {
|
||||||
|
sql += " AND b.name_id = ?"
|
||||||
|
sqlParams = append(sqlParams, nameID)
|
||||||
|
}
|
||||||
if len(storeIDs) > 0 {
|
if len(storeIDs) > 0 {
|
||||||
sql += " AND a.store_id in (" + GenQuestionMarks(len(storeIDs)) + ")"
|
sql += " AND a.store_id in (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
sqlParams = append(sqlParams, storeIDs)
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
}
|
}
|
||||||
sql += " AND a.status != ?"
|
sql += ` AND a.status != ?
|
||||||
|
ORDER BY a.updated_at DESC
|
||||||
|
`
|
||||||
sqlParams = append(sqlParams, model.SkuStatusDeleted)
|
sqlParams = append(sqlParams, model.SkuStatusDeleted)
|
||||||
err = GetRows(db, &skuList, sql, sqlParams...)
|
err = GetRows(db, &skuList, sql, sqlParams...)
|
||||||
return skuList, err
|
return skuList, err
|
||||||
@@ -1060,7 +1127,8 @@ func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (storeSkuNameExt []*StoreSk
|
|||||||
t4.sub_store_id, t4.price bind_price, IF(t4.unit_price IS NOT NULL, t4.unit_price, t1.price) unit_price, t4.status store_sku_status, t4.auto_sale_at,
|
t4.sub_store_id, t4.price bind_price, IF(t4.unit_price IS NOT NULL, t4.unit_price, t1.price) unit_price, t4.status store_sku_status, t4.auto_sale_at,
|
||||||
t4.ebai_id, t4.mtwm_id,
|
t4.ebai_id, t4.mtwm_id,
|
||||||
t4.ebai_sync_status, t4.mtwm_sync_status,
|
t4.ebai_sync_status, t4.mtwm_sync_status,
|
||||||
t4.jd_price, t4.ebai_price, t4.mtwm_price, t4.jx_price, a.spec_quality sku_spec_quality, a.spec_unit sku_spec_unit
|
t4.jd_price, t4.ebai_price, t4.mtwm_price, t4.jx_price, t4.stock,
|
||||||
|
a.spec_quality sku_spec_quality, a.spec_unit sku_spec_unit
|
||||||
FROM sku a
|
FROM sku a
|
||||||
JOIN sku_name t1 ON a.name_id = t1.id AND t1.deleted_at = ?
|
JOIN sku_name t1 ON a.name_id = t1.id AND t1.deleted_at = ?
|
||||||
JOIN store_sku_bind t4 ON t4.sku_id = a.id AND t4.deleted_at = ?
|
JOIN store_sku_bind t4 ON t4.sku_id = a.id AND t4.deleted_at = ?
|
||||||
@@ -1156,6 +1224,7 @@ func GetTopCategoriesByStoreIDs(db *DaoDB, storeIDs []int, limit int) (skuCatego
|
|||||||
|
|
||||||
func GetStoreSkuCategories(db *DaoDB, storeID, parentID int) (catList []*model.SkuCategory, err error) {
|
func GetStoreSkuCategories(db *DaoDB, storeID, parentID int) (catList []*model.SkuCategory, err error) {
|
||||||
sql := `
|
sql := `
|
||||||
|
SELECT * FROM(
|
||||||
SELECT
|
SELECT
|
||||||
t1.*
|
t1.*
|
||||||
FROM sku_category t1
|
FROM sku_category t1
|
||||||
@@ -1178,19 +1247,35 @@ func GetStoreSkuCategories(db *DaoDB, storeID, parentID int) (catList []*model.S
|
|||||||
sql += " AND t1.parent_id = ?"
|
sql += " AND t1.parent_id = ?"
|
||||||
sqlParams = append(sqlParams, parentID)
|
sqlParams = append(sqlParams, parentID)
|
||||||
}
|
}
|
||||||
sql += " ORDER BY t1.level, t1.seq"
|
sql += ` UNION
|
||||||
if err = GetRows(db, &catList, sql, sqlParams...); err == nil && len(catList) > 0 {
|
SELECT
|
||||||
parentIDMap := make(map[int]int)
|
DISTINCT
|
||||||
for _, v := range catList {
|
t3.*
|
||||||
parentIDMap[v.ParentID] = 1
|
FROM sku_category t1
|
||||||
}
|
JOIN
|
||||||
paretnCats, err2 := GetCategories(db, -1, 0, jxutils.IntMap2List(parentIDMap), false)
|
(
|
||||||
if err = err2; err == nil {
|
SELECT DISTINCT t3.category_id
|
||||||
catList = append(catList, paretnCats...)
|
FROM store_sku_bind t1
|
||||||
} else {
|
JOIN sku t2 ON t2.id = t1.sku_id AND t2.deleted_at = ? AND t2.status = ?
|
||||||
catList = nil
|
JOIN sku_name t3 ON t3.id = t2.name_id AND t3.deleted_at = ? AND t3.status = ?
|
||||||
}
|
WHERE t1.deleted_at = ? AND t1.status = ? AND t1.store_id = ?
|
||||||
|
) t2 ON t2.category_id = t1.id
|
||||||
|
JOIN sku_category t3 ON t3.id = t1.parent_id AND t3.deleted_at = ?
|
||||||
|
WHERE t1.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams = append(sqlParams, utils.DefaultTimeValue, model.SkuStatusNormal,
|
||||||
|
utils.DefaultTimeValue, model.SkuStatusNormal,
|
||||||
|
utils.DefaultTimeValue, model.SkuStatusNormal, storeID,
|
||||||
|
utils.DefaultTimeValue, utils.DefaultTimeValue,
|
||||||
|
)
|
||||||
|
if parentID >= 0 {
|
||||||
|
sql += " AND t1.parent_id = ?"
|
||||||
|
sqlParams = append(sqlParams, parentID)
|
||||||
}
|
}
|
||||||
|
sql += `
|
||||||
|
) a
|
||||||
|
ORDER BY a.level, a.seq`
|
||||||
|
err = GetRows(db, &catList, sql, sqlParams...)
|
||||||
return catList, err
|
return catList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1288,7 +1373,7 @@ func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesI
|
|||||||
vendorIDs = []int{actVendorID}
|
vendorIDs = []int{actVendorID}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
storeMapList, err := GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "")
|
storeMapList, err := GetStoresMapList(db, nil, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -1319,6 +1404,11 @@ func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesI
|
|||||||
v.ActID = actStoreSku.ActID
|
v.ActID = actStoreSku.ActID
|
||||||
v.ActType = actStoreSku.Type
|
v.ActType = actStoreSku.Type
|
||||||
v.EarningPrice = int(jxutils.CaculateSkuEarningPrice(int64(v.BindPrice), int64(v.ActPrice), skuName.PayPercentage))
|
v.EarningPrice = int(jxutils.CaculateSkuEarningPrice(int64(v.BindPrice), int64(v.ActPrice), skuName.PayPercentage))
|
||||||
|
v.TrendType = actStoreSku.TrendType
|
||||||
|
v.TrendPrice = actStoreSku.TrendPrice
|
||||||
|
v.DiscountType = actStoreSku.DiscountType
|
||||||
|
v.DiscountValue1 = actStoreSku.DiscountValue1
|
||||||
|
v.DiscountValue2 = actStoreSku.DiscountValue2
|
||||||
}
|
}
|
||||||
if actStoreSku := actStoreSkuMap4EarningPrice.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil {
|
if actStoreSku := actStoreSkuMap4EarningPrice.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil {
|
||||||
v.EarningPrice = int(actStoreSku.EarningPrice)
|
v.EarningPrice = int(actStoreSku.EarningPrice)
|
||||||
@@ -1404,14 +1494,12 @@ func GetStoreSkuBindByNameID(db *DaoDB, storeID, nameID, status int) (storeSkuBi
|
|||||||
AND a.name_id = ?
|
AND a.name_id = ?
|
||||||
AND c.deleted_at = ?
|
AND c.deleted_at = ?
|
||||||
AND a.deleted_at = ?
|
AND a.deleted_at = ?
|
||||||
AND c.status = ?
|
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
storeID,
|
storeID,
|
||||||
nameID,
|
nameID,
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
status,
|
|
||||||
}
|
}
|
||||||
err = GetRows(db, &storeSkuBind, sql, sqlParams...)
|
err = GetRows(db, &storeSkuBind, sql, sqlParams...)
|
||||||
return storeSkuBind, err
|
return storeSkuBind, err
|
||||||
@@ -1519,13 +1607,14 @@ func UpdateYbOtherSku(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error)
|
|||||||
func UpdateJdsWareID(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error) {
|
func UpdateJdsWareID(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error) {
|
||||||
sql := `
|
sql := `
|
||||||
UPDATE store_sku_bind
|
UPDATE store_sku_bind
|
||||||
SET jds_ware_id = ?
|
SET jds_ware_id = ?, jds_id = ?
|
||||||
WHERE store_id = ?
|
WHERE store_id = ?
|
||||||
AND sku_id = ?
|
AND sku_id = ?
|
||||||
AND deleted_at = ?
|
AND deleted_at = ?
|
||||||
`
|
`
|
||||||
sqlParams := []interface{}{
|
sqlParams := []interface{}{
|
||||||
storeSkuSyncInfo.JdsWareID,
|
storeSkuSyncInfo.JdsWareID,
|
||||||
|
storeSkuSyncInfo.VendorSkuID,
|
||||||
storeSkuSyncInfo.StoreID,
|
storeSkuSyncInfo.StoreID,
|
||||||
storeSkuSyncInfo.SkuID,
|
storeSkuSyncInfo.SkuID,
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
@@ -1533,3 +1622,193 @@ func UpdateJdsWareID(db *DaoDB, storeSkuSyncInfo *StoreSkuSyncInfo) (err error)
|
|||||||
_, err = ExecuteSQL(db, sql, sqlParams)
|
_, err = ExecuteSQL(db, sql, sqlParams)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type tStoreSkuAudit struct {
|
||||||
|
model.StoreSkuAudit
|
||||||
|
SkuName string `orm:"size(255)" json:"skuName"`
|
||||||
|
StoreName string `json:"storeName"`
|
||||||
|
Prefix string `orm:"size(255)" json:"prefix"`
|
||||||
|
Unit string `orm:"size(8)" json:"unit"`
|
||||||
|
SpecQuality float32 `json:"-"` // 为份必然为500,这个主要作用只是用于确保SkuName的唯一性
|
||||||
|
SpecUnit string `orm:"size(8)" json:"-"` // 为份必然为克,这个主要作用只是用于确保SkuName的唯一性
|
||||||
|
Img string `orm:"size(512)" json:"img"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
MidUnitPrice int `json:"midUnitPrice"`
|
||||||
|
CityName string `json:"cityName"`
|
||||||
|
PayPercentage int `json:"payPercentage"`
|
||||||
|
StoreLevel string `json:"storeLevel"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreSkuAudit(db *DaoDB, storeIDs, nameIDs, skuIDs, statuss, types []int, name, remark, keyword, marketManPhone, cityName string, applyTimeStart, applyTimeEnd, auditTimeStart, auditTimeEnd time.Time, pageSize, offset int) (pagedInfo *model.PagedInfo, err error) {
|
||||||
|
var requestList []*tStoreSkuAudit
|
||||||
|
sql := `
|
||||||
|
SELECT SQL_CALC_FOUND_ROWS DISTINCT a.*,
|
||||||
|
c.name sku_name, c.prefix, c.unit, c.spec_quality, c.spec_unit, c.img,
|
||||||
|
d.name store_name, b.name, e.mid_unit_price, f.name city_name, d.pay_percentage, d.store_level
|
||||||
|
FROM store_sku_audit a
|
||||||
|
LEFT JOIN user b ON a.user_id = b.user_id
|
||||||
|
LEFT JOIN sku_name c ON c.id = a.name_id AND c.deleted_at = ?
|
||||||
|
LEFT JOIN store d ON d.id = a.store_id AND d.deleted_at = ?
|
||||||
|
LEFT JOIN place f ON f.code = d.city_code
|
||||||
|
LEFT JOIN price_refer_snapshot e ON e.name_id = c.id AND e.city_code = ? AND e.snapshot_at = ?
|
||||||
|
WHERE a.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue, utils.DefaultTimeValue,
|
||||||
|
0, utils.Time2Date(time.Now().AddDate(0, 0, -1)),
|
||||||
|
utils.DefaultTimeValue}
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
|
}
|
||||||
|
if len(nameIDs) > 0 {
|
||||||
|
sql += " AND a.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, nameIDs)
|
||||||
|
}
|
||||||
|
if len(statuss) > 0 {
|
||||||
|
sql += " AND a.status IN (" + GenQuestionMarks(len(statuss)) + ")"
|
||||||
|
sqlParams = append(sqlParams, statuss)
|
||||||
|
}
|
||||||
|
if remark != "" {
|
||||||
|
sql += " AND a.remark LIKE ? "
|
||||||
|
sqlParams = append(sqlParams, "%"+remark+"%")
|
||||||
|
}
|
||||||
|
if name != "" {
|
||||||
|
sql += " AND b.name LIKE ? "
|
||||||
|
sqlParams = append(sqlParams, "%"+name+"%")
|
||||||
|
}
|
||||||
|
if applyTimeStart != utils.ZeroTimeValue && applyTimeEnd != utils.ZeroTimeValue {
|
||||||
|
sql += " AND a.created_at BETWEEN ? AND ?"
|
||||||
|
sqlParams = append(sqlParams, applyTimeStart, applyTimeEnd)
|
||||||
|
}
|
||||||
|
if auditTimeStart != utils.ZeroTimeValue && auditTimeEnd != utils.ZeroTimeValue {
|
||||||
|
sql += " AND a.updated_at BETWEEN ? AND ?"
|
||||||
|
sqlParams = append(sqlParams, auditTimeStart, auditTimeEnd)
|
||||||
|
}
|
||||||
|
if len(types) > 0 {
|
||||||
|
sql += " AND a.type IN (" + GenQuestionMarks(len(types)) + ")"
|
||||||
|
sqlParams = append(sqlParams, types)
|
||||||
|
}
|
||||||
|
if keyword != "" {
|
||||||
|
sql += " AND (b.name LIKE ? OR a.remark LIKE ? OR a.name_id LIKE ? OR a.user_id LIKE ? OR a.store_id LIKE ? OR f.name LIKE ?)"
|
||||||
|
sqlParams = append(sqlParams, "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
|
||||||
|
}
|
||||||
|
if marketManPhone != "" {
|
||||||
|
sql += " AND d.market_man_phone LIKE ? "
|
||||||
|
sqlParams = append(sqlParams, "%"+marketManPhone+"%")
|
||||||
|
}
|
||||||
|
if cityName != "" {
|
||||||
|
sql += " AND f.name LIKE ? "
|
||||||
|
sqlParams = append(sqlParams, "%"+cityName+"%")
|
||||||
|
}
|
||||||
|
sql += " ORDER BY a.updated_at LIMIT ? OFFSET ?"
|
||||||
|
pageSize = jxutils.FormalizePageSize(pageSize)
|
||||||
|
sqlParams = append(sqlParams, pageSize, offset)
|
||||||
|
Begin(db)
|
||||||
|
defer Commit(db)
|
||||||
|
if err = GetRows(db, &requestList, sql, sqlParams...); err == nil {
|
||||||
|
return &model.PagedInfo{
|
||||||
|
TotalCount: GetLastTotalRowCount(db),
|
||||||
|
Data: requestList,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
return pagedInfo, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreSkuAuditLight(db *DaoDB, storeIDs, nameIDs []int, status int) (storeSkuAudit []*model.StoreSkuAudit, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT a.*
|
||||||
|
FROM store_sku_audit a
|
||||||
|
WHERE a.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{utils.DefaultTimeValue}
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
|
}
|
||||||
|
if len(nameIDs) > 0 {
|
||||||
|
sql += " AND a.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, nameIDs)
|
||||||
|
}
|
||||||
|
if status != model.StoreAuditStatusAll {
|
||||||
|
sql += " AND a.status = ? "
|
||||||
|
sqlParams = append(sqlParams, status)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &storeSkuAudit, sql, sqlParams...)
|
||||||
|
return storeSkuAudit, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetTopSkusByNoCityCode(db *DaoDB) (skuNameAndPlace []*SkuNameAndPlace, err error) {
|
||||||
|
var skuName1 []model.SkuName
|
||||||
|
_, err = db.Db.QueryTable("sku_name").Filter("best_seller", "1").All(&skuName1)
|
||||||
|
for k, _ := range skuName1 {
|
||||||
|
skuNameAndPlace1 := &SkuNameAndPlace{
|
||||||
|
SkuName: skuName1[k],
|
||||||
|
}
|
||||||
|
skuNameAndPlace = append(skuNameAndPlace, skuNameAndPlace1)
|
||||||
|
}
|
||||||
|
return skuNameAndPlace, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreSkuHistory(db *DaoDB, storeIDs, skuIDs []int, status int, snapShot time.Time) (storeSkuHistory []*model.StoreSkuBindHistory, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT a.*
|
||||||
|
FROM store_sku_bind_history a
|
||||||
|
WHERE a.deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{utils.DefaultTimeValue}
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
|
}
|
||||||
|
if len(skuIDs) > 0 {
|
||||||
|
sql += " AND a.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, skuIDs)
|
||||||
|
}
|
||||||
|
if status != model.StoreAuditStatusAll {
|
||||||
|
sql += " AND a.status = ? "
|
||||||
|
sqlParams = append(sqlParams, status)
|
||||||
|
}
|
||||||
|
if !utils.IsTimeZero(snapShot) {
|
||||||
|
sql += " AND a.snapshot_at = ? "
|
||||||
|
sqlParams = append(sqlParams, snapShot)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &storeSkuHistory, sql, sqlParams...)
|
||||||
|
return storeSkuHistory, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreSkuCategoryMap(db *DaoDB, categoryID, storeID int) (storeSkuCategoryMap *model.StoreSkuCategoryMap, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT *
|
||||||
|
FROM store_sku_category_map
|
||||||
|
WHERE deleted_at = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{utils.DefaultTimeValue}
|
||||||
|
if categoryID != 0 {
|
||||||
|
sql += " AND category_id = ? "
|
||||||
|
sqlParams = append(sqlParams, categoryID)
|
||||||
|
}
|
||||||
|
if storeID != 0 {
|
||||||
|
sql += " AND store_id = ? "
|
||||||
|
sqlParams = append(sqlParams, storeID)
|
||||||
|
}
|
||||||
|
GetRow(db, &storeSkuCategoryMap, sql, sqlParams)
|
||||||
|
return storeSkuCategoryMap, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoreSkuListWithVendor(db *DaoDB, storeID, vendorID int, vendorOrgCode string) (skuList []*StoreSkuSyncInfo, err error) {
|
||||||
|
sql := `
|
||||||
|
SELECT DISTINCT b.*, c.vendor_thing_id vendor_sku_id
|
||||||
|
FROM store_sku_bind a
|
||||||
|
JOIN sku b ON a.sku_id = b.id AND b.deleted_at = ? AND b.status = ?
|
||||||
|
LEFT JOIN thing_map c ON c.thing_id = b.id AND c.thing_type = ? AND c.vendor_id = ? AND c.vendor_org_code = ? AND c.deleted_at = ?
|
||||||
|
WHERE a.deleted_at = ? AND a.status = ? AND a.store_id = ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
utils.DefaultTimeValue, model.SkuStatusNormal,
|
||||||
|
model.ThingTypeSku, vendorID, vendorOrgCode, utils.DefaultTimeValue,
|
||||||
|
utils.DefaultTimeValue, model.StoreSkuBindStatusNormal, storeID,
|
||||||
|
}
|
||||||
|
err = GetRows(db, &skuList, sql, sqlParams)
|
||||||
|
return skuList, err
|
||||||
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ func TestGetStoreDetail(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetStoreCourierList(t *testing.T) {
|
func TestGetStoreCourierList(t *testing.T) {
|
||||||
storeCourierList, err := GetStoreCourierList(GetDB(), []int{100119}, model.StoreStatusOpened, model.StoreAuditStatusOnline)
|
storeCourierList, err := GetStoreCourierList(GetDB(), []int{100119}, nil, model.StoreStatusOpened, model.StoreAuditStatusOnline)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GetThingMapList(db *DaoDB, thingType int, vendorIDs, thingIDs []int) (cats []*model.ThingMap, err error) {
|
func GetThingMapList(db *DaoDB, thingType int, vendorIDs, thingIDs []int, vendorOrgCodes []string) (cats []*model.ThingMap, err error) {
|
||||||
sql := `
|
sql := `
|
||||||
SELECT t1.*
|
SELECT t1.*
|
||||||
FROM thing_map t1
|
FROM thing_map t1
|
||||||
@@ -19,13 +19,17 @@ func GetThingMapList(db *DaoDB, thingType int, vendorIDs, thingIDs []int) (cats
|
|||||||
if len(thingIDs) > 0 { // 必须要指定ID
|
if len(thingIDs) > 0 { // 必须要指定ID
|
||||||
sql += " AND t1.thing_id IN (" + GenQuestionMarks(len(thingIDs)) + ")"
|
sql += " AND t1.thing_id IN (" + GenQuestionMarks(len(thingIDs)) + ")"
|
||||||
sqlParams = append(sqlParams, thingIDs)
|
sqlParams = append(sqlParams, thingIDs)
|
||||||
err = GetRows(db, &cats, sql, sqlParams...)
|
|
||||||
}
|
}
|
||||||
|
if len(vendorOrgCodes) > 0 {
|
||||||
|
sql += " AND t1.vendor_org_code IN (" + GenQuestionMarks(len(vendorOrgCodes)) + ")"
|
||||||
|
sqlParams = append(sqlParams, vendorOrgCodes)
|
||||||
|
}
|
||||||
|
err = GetRows(db, &cats, sql, sqlParams...)
|
||||||
return cats, err
|
return cats, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetThingMapMap(db *DaoDB, thingType int, vendorIDs, thingIDs []int) (thingMapMap map[int64][]*model.ThingMap, err error) {
|
func GetThingMapMap(db *DaoDB, thingType int, vendorIDs, thingIDs []int) (thingMapMap map[int64][]*model.ThingMap, err error) {
|
||||||
thingMapList, err := GetThingMapList(db, thingType, vendorIDs, thingIDs)
|
thingMapList, err := GetThingMapList(db, thingType, vendorIDs, thingIDs, nil)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
thingMapMap = make(map[int64][]*model.ThingMap)
|
thingMapMap = make(map[int64][]*model.ThingMap)
|
||||||
for _, thingMap := range thingMapList {
|
for _, thingMap := range thingMapList {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package model
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
MessageTypeStore = 1
|
MessageTypeStore = 1
|
||||||
|
MessageTypeUser = 2
|
||||||
|
MessageTypeStoreAct = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -22,9 +24,10 @@ var (
|
|||||||
|
|
||||||
type Message struct {
|
type Message struct {
|
||||||
ModelIDCULD
|
ModelIDCULD
|
||||||
Type int8 `json:"type"`
|
Type int8 `json:"type"` //1发给门店,2发给用户,3发给门店的统计活动参与信息
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
Content string `orm:"type(text)" json:"content"`
|
Content string `orm:"type(text)" json:"content"`
|
||||||
|
ActInfo string `json:"actInfo"` //活动信息,时间平台等
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*Message) TableIndex() [][]string {
|
func (*Message) TableIndex() [][]string {
|
||||||
@@ -40,6 +43,8 @@ type MessageStatus struct {
|
|||||||
StoreID int `orm:"column(store_id)" json:"storeID"`
|
StoreID int `orm:"column(store_id)" json:"storeID"`
|
||||||
Status int8 `json:"status"`
|
Status int8 `json:"status"`
|
||||||
ReadCount int `json:"readCount"`
|
ReadCount int `json:"readCount"`
|
||||||
|
UserID string `orm:"column(user_id)" json:"userID"`
|
||||||
|
ConfirmStatus int `json:"confirmStatus"` //商家确认活动,默认0不确认,1确认
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*MessageStatus) TableIndex() [][]string {
|
func (*MessageStatus) TableIndex() [][]string {
|
||||||
@@ -48,3 +53,31 @@ func (*MessageStatus) TableIndex() [][]string {
|
|||||||
[]string{"StoreID", "MessageID", "Status"},
|
[]string{"StoreID", "MessageID", "Status"},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type MessageActInfo struct {
|
||||||
|
VendorID int `orm:"colmun(vendor_id)" json:"vendorID"`
|
||||||
|
BeginAt string `json:"beginAt"`
|
||||||
|
EndAt string `json:"endAt"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type ImMessageRecord struct {
|
||||||
|
ModelIDCULD
|
||||||
|
UserID string `orm:"size(48);column(user_id)" json:"userID"` //消息发送方userID
|
||||||
|
ReceiveID string `orm:"size(48);column(receive_id)" json:"receiveID"` //接收方ID,可以是userID,也可以是群ID
|
||||||
|
Name string `json:"name"`
|
||||||
|
Content string `orm:"type(text)" json:"content"` //消息内容
|
||||||
|
MessageType int `json:"messageType"` //消息类型,文字,图片
|
||||||
|
StoreID int `orm:"column(store_id)" json:"storeID"`
|
||||||
|
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||||
|
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*ImMessageRecord) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"UserID"},
|
||||||
|
[]string{"ReceiveID"},
|
||||||
|
[]string{"StoreID"},
|
||||||
|
[]string{"VendorID"},
|
||||||
|
[]string{"VendorOrderID"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ const (
|
|||||||
FieldVendorActID = "VendorActID"
|
FieldVendorActID = "VendorActID"
|
||||||
|
|
||||||
FieldSkuSeq = "Seq"
|
FieldSkuSeq = "Seq"
|
||||||
|
FieldVendorStatus = "VendorStatus"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ModelIDCUL struct {
|
type ModelIDCUL struct {
|
||||||
@@ -91,7 +92,7 @@ const (
|
|||||||
SyncFlagSeqMask = 64 // 门店商家分类下的排序顺序
|
SyncFlagSeqMask = 64 // 门店商家分类下的排序顺序
|
||||||
|
|
||||||
// combine
|
// combine
|
||||||
SyncFlagStoreSkuOnlyMask = SyncFlagSaleMask | SyncFlagPriceMask
|
SyncFlagStoreSkuOnlyMask = SyncFlagSaleMask | SyncFlagPriceMask | SyncFlagStockMask
|
||||||
SyncFlagStoreSkuModifiedMask = SyncFlagStoreSkuOnlyMask | SyncFlagModifiedMask
|
SyncFlagStoreSkuModifiedMask = SyncFlagStoreSkuOnlyMask | SyncFlagModifiedMask
|
||||||
SyncFlagChangedMask = SyncFlagSpecMask | SyncFlagNewMask | SyncFlagDeletedMask | SyncFlagStoreSkuModifiedMask
|
SyncFlagChangedMask = SyncFlagSpecMask | SyncFlagNewMask | SyncFlagDeletedMask | SyncFlagStoreSkuModifiedMask
|
||||||
)
|
)
|
||||||
@@ -116,6 +117,10 @@ func IsSyncStatusPrice(syncStatus int8) bool {
|
|||||||
return (syncStatus & SyncFlagPriceMask) != 0
|
return (syncStatus & SyncFlagPriceMask) != 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func IsSyncStatusStock(syncStatus int8) bool {
|
||||||
|
return (syncStatus & SyncFlagStockMask) != 0
|
||||||
|
}
|
||||||
|
|
||||||
func IsSyncStatusSeq(syncStatus int8) bool {
|
func IsSyncStatusSeq(syncStatus int8) bool {
|
||||||
return (syncStatus & SyncFlagSeqMask) != 0
|
return (syncStatus & SyncFlagSeqMask) != 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ const (
|
|||||||
ConfigTypeRole = "Role"
|
ConfigTypeRole = "Role"
|
||||||
ConfigTypeJxStore = "JxStore"
|
ConfigTypeJxStore = "JxStore"
|
||||||
ConfigTypeCookie = "Cookie"
|
ConfigTypeCookie = "Cookie"
|
||||||
|
ConfigTypeDiscountCard = "DiscountCard"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -26,6 +27,7 @@ var (
|
|||||||
ConfigTypeRole: "角色",
|
ConfigTypeRole: "角色",
|
||||||
ConfigTypeJxStore: "京西商城",
|
ConfigTypeJxStore: "京西商城",
|
||||||
ConfigTypeCookie: "Cookie",
|
ConfigTypeCookie: "Cookie",
|
||||||
|
ConfigTypeDiscountCard: "会员折扣卡",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package model
|
package model
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
OrderDeliveryTypePlatform = "platform" // 平台负责配送
|
OrderDeliveryTypePlatform = "platform" // 平台负责配送
|
||||||
@@ -11,6 +13,8 @@ const (
|
|||||||
const (
|
const (
|
||||||
PayTypeWX = 1 // 微信支付
|
PayTypeWX = 1 // 微信支付
|
||||||
PayTypeTL = 2 // 通联宝支付
|
PayTypeTL = 2 // 通联宝支付
|
||||||
|
PayTypeTL_DiscountCard = 3 // 通联宝支付(会员折扣卡)
|
||||||
|
PayTypeTL_StoreAcctPay = 4
|
||||||
|
|
||||||
PayStatusNo = 0
|
PayStatusNo = 0
|
||||||
PayStatusYes = 1
|
PayStatusYes = 1
|
||||||
@@ -21,6 +25,32 @@ const (
|
|||||||
RefundStatusNo = 0
|
RefundStatusNo = 0
|
||||||
RefundStatusYes = 1
|
RefundStatusYes = 1
|
||||||
RefundStatusFailed = 2
|
RefundStatusFailed = 2
|
||||||
|
|
||||||
|
EarningTypeQuote = 1 //报价模式
|
||||||
|
EarningTypePoints = 2 //扣点模式
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
OrderTypeAddressErr = -1 //地址异常订单
|
||||||
|
OrderTypeNormal = 0 //普通订单
|
||||||
|
OrderTypeMatter = 1 //物料订单
|
||||||
|
OrderTypeSupplyGoods = 2 //进货订单
|
||||||
|
OrderTypeDefendPrice = 3 //守价订单
|
||||||
|
OrderTypeStoreAcct = 4 //门店账户订单
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
CouponStatusRe = -2 //优惠券状态还没生效
|
||||||
|
CouponStatusOverdue = -1 //已过期
|
||||||
|
CouponStatusNormal = 0 //正常
|
||||||
|
CouponStatusDeleted = -4 //被删了
|
||||||
|
|
||||||
|
CouponTypeDiscount = 1 //优惠券类型,总额满减
|
||||||
|
CouponTypeDelivery = 2 //运费优惠
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
UserCouponStatusUsed = 1 // 已被使用
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -37,6 +67,14 @@ var (
|
|||||||
RefundStatusYes: "已退款",
|
RefundStatusYes: "已退款",
|
||||||
RefundStatusFailed: "退款失败",
|
RefundStatusFailed: "退款失败",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CouponStatusName = map[int]string{
|
||||||
|
CouponStatusRe: "还没生效",
|
||||||
|
CouponStatusOverdue: "已过期",
|
||||||
|
CouponStatusNormal: "正常",
|
||||||
|
UserCouponStatusUsed: "已被使用",
|
||||||
|
CouponStatusDeleted: "已删除",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
type ModelTimeInfo struct {
|
type ModelTimeInfo struct {
|
||||||
@@ -47,7 +85,7 @@ type ModelTimeInfo struct {
|
|||||||
type GoodsOrder struct {
|
type GoodsOrder struct {
|
||||||
ID int64 `orm:"column(id)" json:"id"`
|
ID int64 `orm:"column(id)" json:"id"`
|
||||||
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
|
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
|
||||||
VendorOrderID2 string `orm:"column(vendor_order_id2);size(48);index" json:"vendorOrderID2"`
|
VendorOrderID2 string `orm:"column(vendor_order_id2);size(200);index" json:"vendorOrderID2"`
|
||||||
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||||
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
|
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
|
||||||
StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid
|
StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid
|
||||||
@@ -87,6 +125,8 @@ type GoodsOrder struct {
|
|||||||
ExpectedDeliveredTime time.Time `orm:"type(datetime)" json:"expectedDeliveredTime"` // 预期送达时间
|
ExpectedDeliveredTime time.Time `orm:"type(datetime)" json:"expectedDeliveredTime"` // 预期送达时间
|
||||||
CancelApplyReason string `orm:"size(255)" json:"-"` // ""表示没有申请,不为null表示用户正在取消申请
|
CancelApplyReason string `orm:"size(255)" json:"-"` // ""表示没有申请,不为null表示用户正在取消申请
|
||||||
DeliveryType string `orm:"size(32)" json:"deliveryType"` // 订单配送方式,缺省是平台配送
|
DeliveryType string `orm:"size(32)" json:"deliveryType"` // 订单配送方式,缺省是平台配送
|
||||||
|
CreateDeliveryType int `orm:"default(0)" json:"createDeliveryType"` //默认0系统发单,1为门店发单
|
||||||
|
|
||||||
VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"`
|
VendorWaybillID string `orm:"column(vendor_waybill_id);size(48)" json:"vendorWaybillID"`
|
||||||
WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排
|
WaybillVendorID int `orm:"column(waybill_vendor_id)" json:"waybillVendorID"` // 表示当前承运商,-1表示还没有安排
|
||||||
AdjustCount int8 `json:"adjustCount"` // 调整单(次数)
|
AdjustCount int8 `json:"adjustCount"` // 调整单(次数)
|
||||||
@@ -107,6 +147,10 @@ type GoodsOrder struct {
|
|||||||
FromStoreID int `orm:"column(from_store_id)" json:"fromStoreID"` //物料配送门店
|
FromStoreID int `orm:"column(from_store_id)" json:"fromStoreID"` //物料配送门店
|
||||||
EclpOutID string `orm:"column(eclp_out_id)" json:"eclpOutID"` //物料配送的出库单号
|
EclpOutID string `orm:"column(eclp_out_id)" json:"eclpOutID"` //物料配送的出库单号
|
||||||
AddressID int64 `orm:"column(address_id)" json:"addressID"` //配送地址ID
|
AddressID int64 `orm:"column(address_id)" json:"addressID"` //配送地址ID
|
||||||
|
EarningType int `json:"earningType"` //订单结算方式,2为扣点,1为报价
|
||||||
|
OrderType int `json:"orderType"` //订单类型,0为普通订单,1为物料订单,2为进货订单
|
||||||
|
OrderPayPercentage int `json:"orderPayPercentage"`
|
||||||
|
CouponIDs string `orm:"column(coupon_ids)" json:"couponIDs"` //优惠券IDs(京西商城)
|
||||||
|
|
||||||
// 以下只是用于传递数据
|
// 以下只是用于传递数据
|
||||||
OriginalData string `orm:"-" json:"-"`
|
OriginalData string `orm:"-" json:"-"`
|
||||||
@@ -370,6 +414,97 @@ func (v *OrderSupplementFee) TableIndex() [][]string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PriceDefendOrder struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
|
||||||
|
StoreID int `orm:"column(store_id)" json:"storeID"`
|
||||||
|
SkuID int `orm:"column(sku_id)" json:"skuID"`
|
||||||
|
AddressID int64 `orm:"column(address_id)" json:"addressID"`
|
||||||
|
Count int `json:"count"`
|
||||||
|
DefendPrice int64 `json:"defendPrice"` //守的价格
|
||||||
|
OriginPrice int64 `json:"originPrice"` //商品原价
|
||||||
|
ActualPayPrice int64 `json:"actualPayPrice"` //单位为分 顾客实际支付
|
||||||
|
RealPrice int64 `json:"realPrice"` //实际成交价
|
||||||
|
IsBuyNowPrice int `json:"isBuyNowPrice"` //库存剩x(x=当前客户购买的数量)时以当时价抢购
|
||||||
|
Issue int `json:"issue"` //期数,每晚22:00以后的守价单是归在第二天的期数中
|
||||||
|
IsSuccess int `json:"isSuccess"` //是否抢购成功
|
||||||
|
IsPay int `json:"isPay"` //是否支付
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *PriceDefendOrder) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"StoreID", "VendorOrderID", "SkuID"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Coupons struct {
|
||||||
|
ModelIDCUL
|
||||||
|
|
||||||
|
CouponType int `json:"couponType"` //优惠券类型 ,1为总额满减, 2为运费优惠,
|
||||||
|
Name string `json:"name"` //优惠券名字
|
||||||
|
Desc string `json:"desc"` //优惠券详情描述
|
||||||
|
BeginAt time.Time `json:"beginAt"` //开始时间
|
||||||
|
EndAt time.Time `json:"endAt"` //到期时间
|
||||||
|
UpperLimit int `json:"upperLimit"` //满多少
|
||||||
|
Cut int `json:"cut"` //减多少
|
||||||
|
CouponStatus int `json:"couponStatus"` //优惠券状态,0为正常可使用,-1为已过期, -2为还没开始
|
||||||
|
IsAll int `json:"isAll"` //是否全国有效,1是
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Coupons) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"BeginAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserCoupons struct {
|
||||||
|
ModelIDCUL
|
||||||
|
|
||||||
|
CouponID int `orm:"column(coupon_id)" json:"couponID"` //优惠券ID
|
||||||
|
UserID string `orm:"column(user_id)" json:"userID"` //userID
|
||||||
|
Mobile string `json:"moblie"` //电话,可能他还没注册
|
||||||
|
UserCouponStatus int `json:"userCouponStatus"` //优惠券状态,0为正常可使用,-1为已过期, 1为已使用
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *UserCoupons) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"CouponID", "UserID", "Mobile"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type StoreCoupons struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
CouponID int `orm:"column(coupon_id)" json:"couponID"` //优惠券ID
|
||||||
|
StoreID int `orm:"column(store_id)" json:"storeID"` //storeID
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *StoreCoupons) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"CouponID", "StoreID"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type StoreAcctOrder struct {
|
||||||
|
ModelIDCUL
|
||||||
|
|
||||||
|
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
|
||||||
|
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||||
|
StoreID int `orm:"column(store_id)" json:"storeID"` // 外部系统里记录的 jxstoreid
|
||||||
|
ActualPayPrice int `json:"actualPayPrice"` // 单位为分 顾客实际支付
|
||||||
|
UserID string `orm:"column(user_id);size(48);index" json:"userID"`
|
||||||
|
OrderType int `json:"orderType"`
|
||||||
|
Status int `json:"status"` // 参见OrderStatus*相关的常量定义 // 重复新订单消息数,这个一般不是由于消息重发造成的(消息重发由OrderStatus过滤),一般是业务逻辑造成的
|
||||||
|
OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *StoreAcctOrder) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"VendorOrderID", "VendorID"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 判断是否是购买平台自有物流
|
// 判断是否是购买平台自有物流
|
||||||
// 对于京东,饿百来说,就是其自有的物流,对于微商城来说,是达达
|
// 对于京东,饿百来说,就是其自有的物流,对于微商城来说,是达达
|
||||||
func IsWaybillPlatformOwn(bill *Waybill) bool {
|
func IsWaybillPlatformOwn(bill *Waybill) bool {
|
||||||
@@ -396,6 +531,11 @@ func IsOrderDeliveryByPlatform(order *GoodsOrder) bool {
|
|||||||
return order.DeliveryType == OrderDeliveryTypePlatform
|
return order.DeliveryType == OrderDeliveryTypePlatform
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//订单是否是自提单
|
||||||
|
func IsOrderDeliveryBySelf(order *GoodsOrder) bool {
|
||||||
|
return order.DeliveryType == OrderDeliveryTypeStoreSelf
|
||||||
|
}
|
||||||
|
|
||||||
func IsOrderJXTemp(order *GoodsOrder) bool {
|
func IsOrderJXTemp(order *GoodsOrder) bool {
|
||||||
return order.VendorID == VendorIDJX && order.Flag&OrderFlagMaskTempJX != 0
|
return order.VendorID == VendorIDJX && order.Flag&OrderFlagMaskTempJX != 0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,6 +92,9 @@ var (
|
|||||||
SkuStatusDeleted: "删除",
|
SkuStatusDeleted: "删除",
|
||||||
SkuStatusDontSale: "下架",
|
SkuStatusDontSale: "下架",
|
||||||
SkuStatusNormal: "上架",
|
SkuStatusNormal: "上架",
|
||||||
|
2: "删除",
|
||||||
|
3: "不可售",
|
||||||
|
4: "可售",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -137,6 +140,8 @@ type SkuCategory struct {
|
|||||||
ExdName string `json:"exdName"` //饿鲜达对应分类名
|
ExdName string `json:"exdName"` //饿鲜达对应分类名
|
||||||
ExdSeq int `json:"exdSeq"`
|
ExdSeq int `json:"exdSeq"`
|
||||||
IsExdSpec int `json:"isExdSpec"` //是否是饿鲜达特有新建的分类
|
IsExdSpec int `json:"isExdSpec"` //是否是饿鲜达特有新建的分类
|
||||||
|
IsExdSync int `json:"isExdSync"` //饿鲜达分类是否同步到平台
|
||||||
|
|
||||||
// JdID int64 `orm:"column(jd_id);index" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID
|
// JdID int64 `orm:"column(jd_id);index" json:"jdID"` // 这个是指商家自己的商品类别在京东平台上的ID
|
||||||
// JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
|
// JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
|
||||||
IsSync int `json:"isSync"` //是否同步到平台
|
IsSync int `json:"isSync"` //是否同步到平台
|
||||||
@@ -153,10 +158,11 @@ type SkuName struct {
|
|||||||
|
|
||||||
Prefix string `orm:"size(255)" json:"prefix"`
|
Prefix string `orm:"size(255)" json:"prefix"`
|
||||||
Name string `orm:"size(255)" json:"name"`
|
Name string `orm:"size(255)" json:"name"`
|
||||||
ExPrefix string `orm:"size(255)" json:"exPrefix"`
|
|
||||||
|
|
||||||
|
ExPrefix string `orm:"size(255)" json:"exPrefix"`
|
||||||
ExPrefixBegin *time.Time `orm:"null" json:"exPrefixBegin"`
|
ExPrefixBegin *time.Time `orm:"null" json:"exPrefixBegin"`
|
||||||
ExPrefixEnd *time.Time `orm:"null" json:"exPrefixEnd"`
|
ExPrefixEnd *time.Time `orm:"null" json:"exPrefixEnd"`
|
||||||
|
ExVendorID int `orm:"column(ex_vendor_id)" json:"exVendorID"`
|
||||||
|
|
||||||
BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` // todo,此属性暂时没有使用,且有问题,应该是不同平台都有一个brandid
|
BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` // todo,此属性暂时没有使用,且有问题,应该是不同平台都有一个brandid
|
||||||
CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别
|
CategoryID int `orm:"column(category_id);index" json:"categoryID"` // 标准类别
|
||||||
@@ -170,6 +176,9 @@ type SkuName struct {
|
|||||||
|
|
||||||
Img string `orm:"size(512)" json:"img"`
|
Img string `orm:"size(512)" json:"img"`
|
||||||
Img2 string `orm:"size(512)" json:"img2"` // 第二张图片
|
Img2 string `orm:"size(512)" json:"img2"` // 第二张图片
|
||||||
|
Img3 string `orm:"size(512)" json:"img3"` //第三张图片
|
||||||
|
ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印
|
||||||
|
ImgMix string `orm:"size(512)" json:"imgMix"` //图片混合水印的图片
|
||||||
// ImgEbai string `orm:"size(255)" json:"imgEbai"` // 饿百图片地址
|
// ImgEbai string `orm:"size(255)" json:"imgEbai"` // 饿百图片地址
|
||||||
// ImgHashCode string `orm:"size(255);index" json:"img_hash_code"`
|
// ImgHashCode string `orm:"size(255);index" json:"img_hash_code"`
|
||||||
|
|
||||||
@@ -185,6 +194,9 @@ type SkuName struct {
|
|||||||
|
|
||||||
// LinkID int `orm:"column(link_id);null;index" json:"linkID"`
|
// LinkID int `orm:"column(link_id);null;index" json:"linkID"`
|
||||||
YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀
|
YbNameSuffix string `json:"ybNameSuffix"` //银豹商品后缀
|
||||||
|
JdsStockSwitch int8 `orm:"default(1)" json:"jdsStockSwitch"` //京东商城总库存
|
||||||
|
PreparationTime int `orm:"default(1)" json:"preparationTime"` //商品准备时长
|
||||||
|
BestSeller int `json:"bestSeller"` //畅销品 0不是 1是
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*SkuName) TableUnique() [][]string {
|
func (*SkuName) TableUnique() [][]string {
|
||||||
@@ -216,6 +228,9 @@ type Sku struct {
|
|||||||
ExdSkuID string `orm:"column(exd_sku_id)" json:"exdSkuID"` //饿鲜达商品ID
|
ExdSkuID string `orm:"column(exd_sku_id)" json:"exdSkuID"` //饿鲜达商品ID
|
||||||
ExdCategoryThirdID int `orm:"column(exd_category_third_id)" json:"exdCategoryThirdID"`
|
ExdCategoryThirdID int `orm:"column(exd_category_third_id)" json:"exdCategoryThirdID"`
|
||||||
EclpID string `orm:"column(eclp_id)" json:"eclpID"` //eclp物料商品ID
|
EclpID string `orm:"column(eclp_id)" json:"eclpID"` //eclp物料商品ID
|
||||||
|
MinOrderCount int `json:"minOrderCount"` //最少起购份数,美团用
|
||||||
|
LadderBoxNum int `json:"ladderBoxNum"` //包装费x件 ,美团用
|
||||||
|
LadderBoxPrice int `json:"ladderBoxPrice"` //包装费y元 ,美团用
|
||||||
// JdID int64 `orm:"column(jd_id);null;index" json:"jdID"`
|
// JdID int64 `orm:"column(jd_id);null;index" json:"jdID"`
|
||||||
// JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
|
// JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
|
||||||
|
|
||||||
@@ -274,4 +289,60 @@ type SkuNameExt struct {
|
|||||||
Places []int `orm:"-" json:"places"`
|
Places []int `orm:"-" json:"places"`
|
||||||
PlacesStr string `json:"-"`
|
PlacesStr string `json:"-"`
|
||||||
MidUnitPrice int `json:"midUnitPrice"`
|
MidUnitPrice int `json:"midUnitPrice"`
|
||||||
|
|
||||||
|
JdCategoryID string `json:"jdCategoryID"`
|
||||||
|
JdsCategoryID string `json:"jdsCategoryID"`
|
||||||
|
EbaiCategoryID string `json:"ebaiCategoryID"`
|
||||||
|
MtwmCategoryID string `json:"mtwmCategoryID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SkuExinfoMap struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
NameID int `orm:"column(name_id)" json:"nameID"`
|
||||||
|
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||||
|
BeginAt time.Time `orm:"type(datetime);index" json:"beginAt"` //设置起始时间
|
||||||
|
EndAt time.Time `orm:"type(datetime);index" json:"endAt"` //设置结束时间
|
||||||
|
ExPrefix string `orm:"size(255)" json:"exPrefix"` //额外前缀
|
||||||
|
ImgWatermark string `orm:"size(512)" json:"imgWatermark"` //图片水印
|
||||||
|
ImgWatermarkMix string `orm:"size(512)" json:"imgWatermark"` //合成水印图
|
||||||
|
BrandID int `orm:"column(brand_id);default(0)" json:"brandID"` //品牌ID
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*SkuExinfoMap) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"NameID", "VendorID", "BeginAt", "EndAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type SkuVendorCategoryMap struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
NameID int `orm:"column(name_id)" json:"nameID"`
|
||||||
|
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||||
|
VendorCategoryID string `orm:"column(vendor_category_id)" json:"vendorCategoryID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*SkuVendorCategoryMap) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"NameID", "VendorID"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type VendorCategoryMap struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
VendorID int `orm:"column(vendor_id)" json:"vendorID"`
|
||||||
|
VendorOrgCode string `json:"vendorOrgCode"`
|
||||||
|
CategoryID int `orm:"column(category_id)" json:"categoryID"` // 这个是指对应的sku_category
|
||||||
|
VendorCategoryName string `orm:"size(255)" json:"vendorCategoryName"` // 平台类别单独的名字
|
||||||
|
VendorCategorySeq int `orm:"default(0)" json:"vendorCategorySeq"` // 平台类别单独的序号
|
||||||
|
Level int `json:"level"` // 平台类别单独的等级
|
||||||
|
ParentID int `orm:"column(parent_id)" json:"parentID"` //门店类别父ID,和sku_category一致
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*VendorCategoryMap) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"VendorID", "VendorOrgCode", "CategoryID", "DeletedAt"},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,9 +22,15 @@ const (
|
|||||||
StoreAuditStatusCreated = 1
|
StoreAuditStatusCreated = 1
|
||||||
StoreAuditStatusOnline = 0
|
StoreAuditStatusOnline = 0
|
||||||
StoreAuditStatusRejected = -1
|
StoreAuditStatusRejected = -1
|
||||||
|
StoreAuditStatusUpdated = 2
|
||||||
StoreAuditStatusAll = -9
|
StoreAuditStatusAll = -9
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
StoreSkuAuditTypePrice = 1 //改价
|
||||||
|
StoreSkuAuditTypeFocus = 2 //关注
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
MainSubStoreName = "本店"
|
MainSubStoreName = "本店"
|
||||||
MainSubStoreAddress = "本店"
|
MainSubStoreAddress = "本店"
|
||||||
@@ -59,7 +65,9 @@ const (
|
|||||||
ExdStoreName = "饿鲜达"
|
ExdStoreName = "饿鲜达"
|
||||||
MatterStoreID = 666666
|
MatterStoreID = 666666
|
||||||
JdShopMainVendorStoreID = "999999"
|
JdShopMainVendorStoreID = "999999"
|
||||||
|
JdShopMainVendorStoreID2 = "9999999"
|
||||||
JdShopMainStoreID = 102919
|
JdShopMainStoreID = 102919
|
||||||
|
JdShopMainStoreID2 = 100000
|
||||||
|
|
||||||
VendorStoreTel = "18011597879"
|
VendorStoreTel = "18011597879"
|
||||||
)
|
)
|
||||||
@@ -252,8 +260,8 @@ var (
|
|||||||
}
|
}
|
||||||
StorePriceTypeName = map[int]string{
|
StorePriceTypeName = map[int]string{
|
||||||
StoreChangePriceTypeDirect: "普通门店",
|
StoreChangePriceTypeDirect: "普通门店",
|
||||||
StoreChangePriceTypeBossDisabled: "普通门店禁止改价",
|
// StoreChangePriceTypeBossDisabled: "普通门店禁止改价",
|
||||||
StoreChangePriceTypeManagedStore: "直营门店禁止改价",
|
// StoreChangePriceTypeManagedStore: "直营门店禁止改价",
|
||||||
}
|
}
|
||||||
AutoReplyTypeName = map[int]string{
|
AutoReplyTypeName = map[int]string{
|
||||||
AutoReplyAll: "全部自动回复",
|
AutoReplyAll: "全部自动回复",
|
||||||
@@ -287,6 +295,8 @@ type Store struct {
|
|||||||
SMSNotifyMark int8 `orm:"column(sms_notify_mark);" json:"smsNotifyMark"` //今天是否已经推送过订单消息
|
SMSNotifyMark int8 `orm:"column(sms_notify_mark);" json:"smsNotifyMark"` //今天是否已经推送过订单消息
|
||||||
AutoReplyType int8 `json:"autoReplyType"` // 订单评价自动回复类型
|
AutoReplyType int8 `json:"autoReplyType"` // 订单评价自动回复类型
|
||||||
LinkStoreID int `orm:"column(link_store_id);default(0);index" json:"linkStoreID"` // 关联门店ID
|
LinkStoreID int `orm:"column(link_store_id);default(0);index" json:"linkStoreID"` // 关联门店ID
|
||||||
|
StoreLevel string `orm:"default(C);size(32)" json:"storeLevel"` // 门店等级(筛选用,京西的)
|
||||||
|
Comment string `orm:"size(255)" json:"comment"` //门店备注
|
||||||
|
|
||||||
PrinterDisabled int8 `orm:"default(0)" json:"printerDisabled"` // 是否禁用网络打印机
|
PrinterDisabled int8 `orm:"default(0)" json:"printerDisabled"` // 是否禁用网络打印机
|
||||||
PrinterFontSize int8 `orm:"default(0)" json:"printerFontSize"` // 打印字体-1:小,0:正常,1:大
|
PrinterFontSize int8 `orm:"default(0)" json:"printerFontSize"` // 打印字体-1:小,0:正常,1:大
|
||||||
@@ -330,6 +340,10 @@ type Store struct {
|
|||||||
PayeeBankBranchName string `orm:"size(255)" json:"payeeBankBranchName"` // 开户支行
|
PayeeBankBranchName string `orm:"size(255)" json:"payeeBankBranchName"` // 开户支行
|
||||||
PayeeBankCode string `orm:"size(8)" json:"payeeBankCode"` // 开户行代码
|
PayeeBankCode string `orm:"size(8)" json:"payeeBankCode"` // 开户行代码
|
||||||
PayPercentage int `json:"payPercentage"`
|
PayPercentage int `json:"payPercentage"`
|
||||||
|
OldPayPercentage int `json:"oldPayPercentage"`
|
||||||
|
|
||||||
|
StoreFrontPic string `orm:"size(255)" json:"storeFrontPic"` //门面照
|
||||||
|
StoreInPic string `orm:"size(255)" json:"storeInPic"` //门店内照片
|
||||||
|
|
||||||
// OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名
|
// OperatorName string `orm:"size(8)" json:"operatorName"` // 运营人姓名
|
||||||
OperatorPhone string `orm:"size(16)" json:"operatorPhone"` // 京东运营人电话
|
OperatorPhone string `orm:"size(16)" json:"operatorPhone"` // 京东运营人电话
|
||||||
@@ -344,6 +358,8 @@ type Store struct {
|
|||||||
PromoteInfo string `orm:"size(255)" json:"promoteInfo"` //门店公告(所有平台统一的公告)
|
PromoteInfo string `orm:"size(255)" json:"promoteInfo"` //门店公告(所有平台统一的公告)
|
||||||
IsBoughtMatter int `json:"isBoughtMatter"` //这周是否申请过物料
|
IsBoughtMatter int `json:"isBoughtMatter"` //这周是否申请过物料
|
||||||
SoundPercentage int `json:"soundPercentage"` //打印机声音大小比例
|
SoundPercentage int `json:"soundPercentage"` //打印机声音大小比例
|
||||||
|
Banner string `orm:"size(9999)" json:"banner"` //门店商城bannar图
|
||||||
|
BrandID int `orm:"column(brand_id)" json:"brandID"` //品牌ID
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*Store) TableUnique() [][]string {
|
func (*Store) TableUnique() [][]string {
|
||||||
@@ -409,6 +425,7 @@ type StoreMap struct {
|
|||||||
Status int `json:"status"` // 取值同Store.Status
|
Status int `json:"status"` // 取值同Store.Status
|
||||||
StoreName string `orm:"size(255)" json:"storeName"` // 平台门店的名字,由平台到京西
|
StoreName string `orm:"size(255)" json:"storeName"` // 平台门店的名字,由平台到京西
|
||||||
VendorStoreName string `orm:"size(255)" json:"vendorStoreName"` //平台门店名,由京西到平台
|
VendorStoreName string `orm:"size(255)" json:"vendorStoreName"` //平台门店名,由京西到平台
|
||||||
|
VendorPayPercentage int `json:"vendorPayPercentage"` //平台结算比例
|
||||||
|
|
||||||
PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格
|
PricePercentage int16 `orm:"default(100)" json:"pricePercentage"` // todo 厂商价格相对于本地价格的百分比,这个字段的修改会比较特殊,因为可能需要刷新厂商价格
|
||||||
PricePercentagePack string `orm:"size(32)" json:"pricePercentagePack"` //
|
PricePercentagePack string `orm:"size(32)" json:"pricePercentagePack"` //
|
||||||
@@ -420,6 +437,7 @@ type StoreMap struct {
|
|||||||
DeliveryFeeDeductionSill int `json:"deliveryFeeDeductionSill"`
|
DeliveryFeeDeductionSill int `json:"deliveryFeeDeductionSill"`
|
||||||
DeliveryFeeDeductionFee int `json:"deliveryFeeDeductionFee"`
|
DeliveryFeeDeductionFee int `json:"deliveryFeeDeductionFee"`
|
||||||
DeliveryCompetition int8 `orm:"default(1)" json:"deliveryCompetition"` // 是否支持配送竞争
|
DeliveryCompetition int8 `orm:"default(1)" json:"deliveryCompetition"` // 是否支持配送竞争
|
||||||
|
CreateDeliveryType int `orm:"default(0)" json:"createDeliveryType"` //默认0系统发单,1为门店发单
|
||||||
|
|
||||||
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
|
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
|
||||||
IsSync int8 `orm:"default(1)" json:"isSync"` // 是否同步
|
IsSync int8 `orm:"default(1)" json:"isSync"` // 是否同步
|
||||||
@@ -431,16 +449,22 @@ type StoreMap struct {
|
|||||||
JdsStreetName string `orm:"size(32)" json:"jdsStreetName"` //京东商城直辖市街道
|
JdsStreetName string `orm:"size(32)" json:"jdsStreetName"` //京东商城直辖市街道
|
||||||
|
|
||||||
IsOrder int `orm:"default(0)" json:"isOrder"` //是否是下预订单门店
|
IsOrder int `orm:"default(0)" json:"isOrder"` //是否是下预订单门店
|
||||||
|
IsSysCat int `orm:"default(0)" json:"isSysCat"` //是否使用京西分类
|
||||||
|
IsSupplyGoods int `orm:"default(0)" json:"isSupplyGoods"` // 是否是货源门店
|
||||||
|
|
||||||
YbAppID string `orm:"column(yb_app_id);size(255)" json:"ybAppID"`
|
YbAppID string `orm:"column(yb_app_id);size(255)" json:"ybAppID"`
|
||||||
YbAppKey string `orm:"size(255)" json:"ybAppKey"`
|
YbAppKey string `orm:"size(255)" json:"ybAppKey"`
|
||||||
YbStorePrefix string `orm:"size(255)" json:"ybStorePrefix"`
|
YbStorePrefix string `orm:"size(255)" json:"ybStorePrefix"`
|
||||||
|
|
||||||
|
MtwmToken string `orm:"size(255)" json:"mtwmToken"` //美团外卖商超token,有效期30天,每20天刷一次
|
||||||
|
MtwmRefreshToken string `orm:"size(255)" json:"mtwmRefreshToken"` //美团外卖商超refreshToken
|
||||||
|
EbaiSupplierID string `orm:"column(ebai_supplier_id)" json:"ebaiSupplierID"` //饿百供应商ID
|
||||||
}
|
}
|
||||||
|
|
||||||
func (*StoreMap) TableUnique() [][]string {
|
func (*StoreMap) TableUnique() [][]string {
|
||||||
return [][]string{
|
return [][]string{
|
||||||
[]string{"StoreID", "VendorID", "DeletedAt"},
|
[]string{"StoreID", "VendorID", "DeletedAt", "VendorOrgCode"},
|
||||||
[]string{"VendorStoreID", "VendorID", "DeletedAt"},
|
[]string{"VendorStoreID", "VendorID", "DeletedAt", "VendorOrgCode"},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -452,6 +476,9 @@ type StoreCourierMap struct {
|
|||||||
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
|
VendorStoreID string `orm:"column(vendor_store_id);size(48)" json:"vendorStoreID"`
|
||||||
Status int `json:"status"`
|
Status int `json:"status"`
|
||||||
AuditStatus int `json:"auditStatus"`
|
AuditStatus int `json:"auditStatus"`
|
||||||
|
VendorStatus int `json:"vendorStatus"`
|
||||||
|
VendorStoreName string `orm:"size(255)" json:"vendorStoreName"` //平台门店名,由京西到平台
|
||||||
|
Comment string `orm:"size(255)" json:"comment"`
|
||||||
|
|
||||||
// 以下数据仅用于同步使用
|
// 以下数据仅用于同步使用
|
||||||
Lng int `json:"-"` // 乘了10的6次方
|
Lng int `json:"-"` // 乘了10的6次方
|
||||||
@@ -659,3 +686,175 @@ func (l *FreightDeductionPack) Swap(i, j int) {
|
|||||||
l2[i] = l2[j]
|
l2[i] = l2[j]
|
||||||
l2[j] = tmp
|
l2[j] = tmp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type StoreCategoryMap struct {
|
||||||
|
ModelIDCULD
|
||||||
|
StoreID int `orm:"column(store_id)" json:"storeID"`
|
||||||
|
CategoryID int `orm:"column(category_id)" json:"categoryID"` // 这个是指对应的sku_category
|
||||||
|
StoreCategoryName string `orm:"size(255)" json:"name"` // 门店类别单独的名字
|
||||||
|
StoreCategorySeq int `orm:"default(0)" json:"storeCategorySeq"` // 门店类别单独的序号
|
||||||
|
Level int `json:"level"` // 门店类别单独的等级
|
||||||
|
ParentID int `orm:"column(parent_id)" json:"parentID"` //门店类别父ID,和sku_category一致
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*StoreCategoryMap) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"StoreID", "CategoryID", "DeletedAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type StorePushClient struct {
|
||||||
|
ModelIDCULD
|
||||||
|
StoreID int `orm:"column(store_id)" json:"storeID"`
|
||||||
|
ClientID string `orm:"column(client_id);size(255)" json:"clientID"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*StorePushClient) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"StoreID", "ClientID"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type StoreAudit struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
Name string `orm:"size(255)" json:"name"`
|
||||||
|
CityCode int `orm:"default(0);null" json:"cityCode"` // todo ?
|
||||||
|
DistrictCode int `orm:"default(0);null" json:"districtCode"` // todo ?
|
||||||
|
Address string `orm:"size(255)" json:"address"`
|
||||||
|
Tel1 string `orm:"size(32);index" json:"tel1"`
|
||||||
|
Tel2 string `orm:"size(32);index" json:"tel2"`
|
||||||
|
OpenTime1 int16 `json:"openTime1" validate:"max=2359,min=1,ltfield=CloseTime1"` // 930就表示9点半,用两个的原因是为了支持中午休息,1与2的时间段不能交叉,为0表示没有
|
||||||
|
CloseTime1 int16 `json:"closeTime1" validate:"max=2359,min=1` // 格式同上
|
||||||
|
OpenTime2 int16 `json:"openTime2" validate:"max=2359,min=1,ltfield=CloseTime2"` // 格式同上
|
||||||
|
CloseTime2 int16 `json:"closeTime2" validate:"max=2359,min=1` // 格式同上
|
||||||
|
Lng int `json:"lng"` // 乘了10的6次方
|
||||||
|
Lat int `json:"lat"` // 乘了10的6次方
|
||||||
|
DeliveryRangeType int8 `json:"deliveryRangeType"` // 参见相关常量定义
|
||||||
|
DeliveryRange string `orm:"type(text)" json:"deliveryRange"` // 如果DeliveryRangeType为DeliveryRangeTypePolygon,则为逗号分隔坐标,分号分隔的坐标点(坐标与Lng和Lat一样,都是整数),比如 121361504,31189308;121420555,31150238。否则为半径,单位为米
|
||||||
|
Status int `json:"status"`
|
||||||
|
SMSNotify int8 `orm:"column(sms_notify);" json:"smsNotify"` // 是否通过短信接收订单消息(每天只推一条)
|
||||||
|
|
||||||
|
IDCardFront string `orm:"size(255);column(id_card_front)" json:"idCardFront"`
|
||||||
|
IDCardBack string `orm:"size(255);column(id_card_back)" json:"idCardBack"`
|
||||||
|
IDCardHand string `orm:"size(255);column(id_card_hand)" json:"idCardHand"`
|
||||||
|
Licence string `orm:"size(255)" json:"licence"` // 营业执照图片
|
||||||
|
LicenceCode string `orm:"size(32)" json:"licenceCode"`
|
||||||
|
|
||||||
|
LicenceType int8 `json:"licenceType"` // 营业执照类型,0:个人,1:公司
|
||||||
|
LicenceCorpName string `orm:"size(64)" json:"licenceCorpName"` // 营业执照公司名称
|
||||||
|
LicenceOwnerName string `orm:"size(8)" json:"licenceOwnerName"` // 法人姓名
|
||||||
|
LicenceAddress string `orm:"size(255)" json:"licenceAddress"` // 地址
|
||||||
|
LicenceValid string `orm:"size(32)" json:"licenceValid"` // 有效期开始
|
||||||
|
LicenceExpire string `orm:"size(32)" json:"licenceExpire"` // 有效期结束
|
||||||
|
|
||||||
|
IDName string `orm:"size(8);column(id_name)" json:"idName"` // 身份证姓名
|
||||||
|
IDCode string `orm:"size(32);column(id_code)" json:"idCode"` // 身份证号
|
||||||
|
IDValid string `orm:"column(id_valid);size(32)" json:"idValid"` // 有效期开始
|
||||||
|
IDExpire string `orm:"column(id_expire);size(32)" json:"idExpire"` // 有效期结束
|
||||||
|
|
||||||
|
Licence2Image string `orm:"size(255)" json:"licence2Image"` // 食品经营许可证
|
||||||
|
Licence2Code string `orm:"size(32)" json:"licence2Code"` // 食品经营许可证编号
|
||||||
|
Licence2Valid string `orm:"size(32)" json:"licence2Valid"` // 有效期开始
|
||||||
|
Licence2Expire string `orm:"size(32)" json:"licence2Expire"` // 有效期结束
|
||||||
|
|
||||||
|
UserID string `orm:"column(user_id);size(32)" json:"userID"` //谁发起的审核就把谁添加到这个门店里
|
||||||
|
AuditStatus int `json:"auditStatus"` //0是待审核,1是通过,-1是不通过
|
||||||
|
Remark string `orm:"size(255)" json:"remark"` //不通过原因
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*StoreAudit) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"Name"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*StoreAudit) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"UserID"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Brand struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
Name string `orm:"size(255)" json:"name"` //品牌名
|
||||||
|
Logo string `orm:"size(255)" json:"logo"` //品牌logo
|
||||||
|
BrandType int `json:"brandType"` //品牌类型
|
||||||
|
IsOpen int `json:"isOpen"` //主要三方配送用,是否配送,默认0表示打开,1表示关
|
||||||
|
IsPrint int `json:"isPrint"` //是否打印小票中的标题,默认0表示打,1表示不打
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*Brand) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"Name"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type BrandStore struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
Name string `orm:"size(255)" json:"name"` //门店名
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*BrandStore) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"Name"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//门店账户收入
|
||||||
|
type StoreAcctIncome struct {
|
||||||
|
ModelIDCUL
|
||||||
|
|
||||||
|
StoreID int `orm:"column(store_id)" json:"storeID"` //门店ID
|
||||||
|
UserID string `orm:"column(user_id)" json:"userID"` //用户ID (谁消费的)
|
||||||
|
Type int `json:"type"` //收入类型
|
||||||
|
IncomePrice int `json:"incomePrice"` //收入金额
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *StoreAcctIncome) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"StoreID"},
|
||||||
|
[]string{"CreatedAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//门店账户支出
|
||||||
|
type StoreAcctExpend struct {
|
||||||
|
ModelIDCUL
|
||||||
|
|
||||||
|
StoreID int `orm:"column(store_id)" json:"storeID"` //门店ID
|
||||||
|
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"`
|
||||||
|
UserID string `orm:"column(user_id)" json:"userID"` //用户ID (谁消费的)
|
||||||
|
Type int `json:"type"` //支出类型
|
||||||
|
ExpendPrice int `json:"expendPrice"` //支出金额
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *StoreAcctExpend) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"StoreID"},
|
||||||
|
[]string{"CreatedAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//门店账单表
|
||||||
|
type StoreAcct struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
StoreID int `orm:"column(store_id)" json:"storeID"` //门店ID
|
||||||
|
AccountBalance int `json:"accountBalance"` //账户余额
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *StoreAcct) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"StoreID"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *StoreAcct) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"CreatedAt"},
|
||||||
|
[]string{"AccountBalance"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ const (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
RequestStatusNew = 0
|
RequestStatusNew = 0
|
||||||
RequestStatusRejected = 1
|
RequestStatusRejected = -1
|
||||||
RequestStatusAccepted = 2
|
RequestStatusAccepted = 1
|
||||||
RequestStatusCanceled = 3
|
RequestStatusCanceled = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -95,6 +95,7 @@ type StoreSkuBind struct {
|
|||||||
SubStoreID int `orm:"column(sub_store_id)"`
|
SubStoreID int `orm:"column(sub_store_id)"`
|
||||||
Price int // 单位为分,不用int64的原因是这里不需要累加
|
Price int // 单位为分,不用int64的原因是这里不需要累加
|
||||||
UnitPrice int // 这个是一斤的门店商品价,放在这里的原因是避免额外增加一张store sku_name表,逻辑上要保证同一SKU NAME中的所有SKU这个字段的数据一致
|
UnitPrice int // 这个是一斤的门店商品价,放在这里的原因是避免额外增加一张store sku_name表,逻辑上要保证同一SKU NAME中的所有SKU这个字段的数据一致
|
||||||
|
Stock int `json:"stock"` //门店商品库存
|
||||||
Status int
|
Status int
|
||||||
|
|
||||||
// ElmID int64 `orm:"column(elm_id);index"`
|
// ElmID int64 `orm:"column(elm_id);index"`
|
||||||
@@ -192,3 +193,23 @@ func (*StoreOpRequest) TableIndex() [][]string {
|
|||||||
[]string{"StoreID", "Status", "Type"},
|
[]string{"StoreID", "Status", "Type"},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type StoreSkuAudit struct {
|
||||||
|
ModelIDCULD // DeletedAt用于表示请求操作结束,而并不一定是删除
|
||||||
|
|
||||||
|
Type int8 `json:"type"` //1为改价
|
||||||
|
StoreID int `orm:"column(store_id)" json:"storeID"`
|
||||||
|
NameID int `orm:"column(name_id)" json:"nameID"` // 这个根据type不同,可能是SKUNAME ID或SKU ID
|
||||||
|
Status int8 `json:"status"` //
|
||||||
|
UserID string `orm:"size(48);column(user_id)" json:"userID"`
|
||||||
|
OriginUnitPrice int `json:"originPrice"` // 表示原价
|
||||||
|
UnitPrice int `json:"unitPrice"` //老板申请的审核价格
|
||||||
|
AuditPrice int `json:"auditPrice"` //运营录入的审核价格
|
||||||
|
Remark string `orm:"size(255)" json:"remark"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*StoreSkuAudit) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"StoreID", "Type", "NameID", "Status", "DeletedAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ type ThingMap struct {
|
|||||||
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
|
VendorOrgCode string `orm:"size(32)" json:"vendorOrgCode"` // 同一平台下不同的商户代码,如果只有一个,可以为空
|
||||||
|
|
||||||
VendorThingID string `orm:"size(32);column(vendor_thing_id);index" json:"vendorThingID"`
|
VendorThingID string `orm:"size(32);column(vendor_thing_id);index" json:"vendorThingID"`
|
||||||
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
|
SyncStatus int8 `orm:"default(0)" json:"syncStatus"`
|
||||||
|
|
||||||
Remark string `orm:"size(255)" json:"remark"`
|
Remark string `orm:"size(255)" json:"remark"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,10 @@ const (
|
|||||||
UserTypeStoreBoss = 2
|
UserTypeStoreBoss = 2
|
||||||
UserTypeOperator = 4
|
UserTypeOperator = 4
|
||||||
UserTypeBoss = 8
|
UserTypeBoss = 8
|
||||||
|
UserTypeRole = 16
|
||||||
UserTypeNonConsumer = ^1
|
UserTypeNonConsumer = ^1
|
||||||
|
|
||||||
|
MemberTypeDiscountCard = 1 //会员折扣卡
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -25,9 +28,16 @@ var (
|
|||||||
UserTypeStoreBoss: "门店老板",
|
UserTypeStoreBoss: "门店老板",
|
||||||
UserTypeOperator: "运营",
|
UserTypeOperator: "运营",
|
||||||
UserTypeBoss: "老板",
|
UserTypeBoss: "老板",
|
||||||
|
UserTypeRole: "受权限管理",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type DiscountCard struct {
|
||||||
|
ID int `orm:"column(id)" json:"id"`
|
||||||
|
PicePercentage int `json:"pricePercentage"`
|
||||||
|
Price int `json:"price"`
|
||||||
|
}
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
ModelIDCULD
|
ModelIDCULD
|
||||||
UserID string `orm:"size(48);column(user_id)" json:"userID" compact:"userID"` // 内部唯一标识
|
UserID string `orm:"size(48);column(user_id)" json:"userID" compact:"userID"` // 内部唯一标识
|
||||||
@@ -49,6 +59,8 @@ type User struct {
|
|||||||
LastLoginAt *time.Time `orm:"null" json:"lastLoginAt"`
|
LastLoginAt *time.Time `orm:"null" json:"lastLoginAt"`
|
||||||
LastLoginIP string `orm:"size(64);column(last_login_ip)" json:"lastLoginIP"`
|
LastLoginIP string `orm:"size(64);column(last_login_ip)" json:"lastLoginIP"`
|
||||||
LastLoginType string `orm:"size(16)" json:"lastLoginType"`
|
LastLoginType string `orm:"size(16)" json:"lastLoginType"`
|
||||||
|
LastBrandID int `orm:"column(last_brand_id)" json:"lastBrandID"`
|
||||||
|
LastStoreID int `orm:"column(last_store_id)" json:"lastStoreID"` //上次浏览过的店铺
|
||||||
|
|
||||||
ParentMobile string `orm:"size(32)" json:"parentMobile"`
|
ParentMobile string `orm:"size(32)" json:"parentMobile"`
|
||||||
DividePercentage int `json:"dividePercentage"`
|
DividePercentage int `json:"dividePercentage"`
|
||||||
@@ -194,3 +206,81 @@ func (*UserOrderSms) TableUnique() [][]string {
|
|||||||
[]string{"Mobile"},
|
[]string{"Mobile"},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type UserMember struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
VendorOrderID string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` //和order_pay关联的,不知道有没用,先加上把
|
||||||
|
UserID string `orm:"size(48);column(user_id)" json:"userID"` //内部唯一标识
|
||||||
|
MemberType int `json:"memberType"` //会员类型, 1为折扣卡
|
||||||
|
MemberTypeID int `orm:"column(member_type_id)" json:"memberTypeID"` //会员类型ID,折扣卡的话代表几档
|
||||||
|
EndAt time.Time `json:"endAt"` //会员过期时间
|
||||||
|
IsPay int `json:"isPay"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *UserMember) TableIndex() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"UserID"},
|
||||||
|
[]string{"CreatedAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Role struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
Name string `json:"name"` //角色名
|
||||||
|
BrandID int `orm:"column(brand_id)" json:"brandID"`
|
||||||
|
CityCodes string `orm:"type(text)" json:"cityCodes"`
|
||||||
|
StoreIDs string `orm:"column(store_ids);type(text)" json:"storeIDs"`
|
||||||
|
CityInfo []*Place `orm:"-" json:"cityInfo"`
|
||||||
|
Stores []*Store `orm:"-" json:"storeInfo"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*Role) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"Name", "DeletedAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserRole struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
UserID string `orm:"column(user_id)" json:"userID"` //用户ID
|
||||||
|
RoleID int `orm:"column(role_id)" json:"roleID"` //角色ID
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*UserRole) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"UserID", "RoleID", "DeletedAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Menu struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
Name string `json:"name"` //功能名
|
||||||
|
URL string `orm:"column(url)" json:"url"` //路径
|
||||||
|
ImgURL string `orm:"column(img_url)" json:"imgURL"` //图标
|
||||||
|
Level int `json:"level"` //级别
|
||||||
|
ParentID int `orm:"column(parent_id)" json:"parentID"` //父功能ID
|
||||||
|
Color string `json:"color"` //颜色
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*Menu) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"Name", "DeletedAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type RoleMenu struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
RoleID int `orm:"column(role_id)" json:"roleID"` //角色ID
|
||||||
|
MenuID int `orm:"column(menu_id)" json:"menuID"` //功能ID
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*RoleMenu) TableUnique() [][]string {
|
||||||
|
return [][]string{
|
||||||
|
[]string{"MenuID", "RoleID", "DeletedAt"},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
24
business/model/vendor_org_code.go
Normal file
24
business/model/vendor_org_code.go
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package model
|
||||||
|
|
||||||
|
const (
|
||||||
|
VendorOrgTypePlatform = "platform" //外卖平台
|
||||||
|
VendorOrgTypeDelivery = "delivery" //配送平台
|
||||||
|
)
|
||||||
|
|
||||||
|
type VendorOrgCode struct {
|
||||||
|
ModelIDCULD
|
||||||
|
|
||||||
|
VendorID int `orm:"column(vendor_id)" json:"code"`
|
||||||
|
VendorOrgCode string `orm:"size(32)" json:"key"` // 同一平台下不同的商户代码,如果只有一个,可以为空
|
||||||
|
Comment string `json:"name"` //备注
|
||||||
|
//appkey,secret token等
|
||||||
|
|
||||||
|
VendorType string `json:"vendorType"` //platform 普通平台, delivery 三方配送平台
|
||||||
|
IsJxCat int `json:"isJxCat"` //是否使用京西分类,0默认使用
|
||||||
|
IsOpen int `json:"isOpen"` //主要三方配送用,是否配送,默认0表示打开,1表示关
|
||||||
|
EmpowerURL string `orm:"column(empower_url)" json:"empowerURL"` //授权地址
|
||||||
|
StoreBrandName string `json:"storeBrandName"` //建店品牌名(和饿百供应商不同,美团是根据平台账号划分)
|
||||||
|
Token string `json:"token"`
|
||||||
|
AppKey string `json:"appKey"`
|
||||||
|
AppSecret string `json:"appSecret"`
|
||||||
|
}
|
||||||
@@ -18,7 +18,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
maxOrderPrice = 6399 // 单位为分,达达最大价格,超过这个价格配送费会增加
|
maxOrderPrice = 50000 // 单位为分,达达最大价格,超过这个价格配送费会增加,2020-11-25改为50000,之前是6399
|
||||||
maxOrderWeight = 5000 // 5公斤
|
maxOrderWeight = 5000 // 5公斤
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -76,6 +76,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap
|
|||||||
order.Status = model.WaybillStatusNew
|
order.Status = model.WaybillStatusNew
|
||||||
case dadaapi.OrderStatusAccepted:
|
case dadaapi.OrderStatusAccepted:
|
||||||
order.Status = model.WaybillStatusAccepted
|
order.Status = model.WaybillStatusAccepted
|
||||||
|
order.Remark = order.CourierName + "," + order.CourierMobile
|
||||||
case dadaapi.OrderStatusDelivering:
|
case dadaapi.OrderStatusDelivering:
|
||||||
order.Status = model.WaybillStatusDelivering
|
order.Status = model.WaybillStatusDelivering
|
||||||
case dadaapi.OrderStatusFinished:
|
case dadaapi.OrderStatusFinished:
|
||||||
@@ -126,7 +127,7 @@ func StoreDetail2ShopInfo(storeDetail *dao.StoreDetail2) (shopInfo *dadaapi.Shop
|
|||||||
}
|
}
|
||||||
shopInfo = &dadaapi.ShopInfo{
|
shopInfo = &dadaapi.ShopInfo{
|
||||||
OriginShopID: storeDetail.VendorStoreID,
|
OriginShopID: storeDetail.VendorStoreID,
|
||||||
StationName: storeDetail.Name,
|
StationName: globals.StoreName + "-" + storeDetail.Name,
|
||||||
Business: dadaapi.BusinessTypeConvStore, // 故意设置成这个的
|
Business: dadaapi.BusinessTypeConvStore, // 故意设置成这个的
|
||||||
CityName: cityName,
|
CityName: cityName,
|
||||||
AreaName: districtName,
|
AreaName: districtName,
|
||||||
@@ -228,8 +229,14 @@ func (c *DeliveryHandler) getBillParams(db *dao.DaoDB, order *model.GoodsOrder)
|
|||||||
}
|
}
|
||||||
if billParams.ShopNo, err = c.getDadaShopID(order, db); err == nil {
|
if billParams.ShopNo, err = c.getDadaShopID(order, db); err == nil {
|
||||||
if billParams.CityCode, err = c.getDataCityCodeFromOrder(order, db); err == nil {
|
if billParams.CityCode, err = c.getDataCityCodeFromOrder(order, db); err == nil {
|
||||||
|
// storeTel := ""
|
||||||
|
// storeID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||||
|
// storeDeatail, _ := dao.GetStoreDetail(db, storeID, order.VendorID)
|
||||||
|
// if storeDeatail.Tel2 != "" {
|
||||||
|
// storeTel = ",门店电话:" + storeDeatail.Tel2
|
||||||
|
// }
|
||||||
billParams.ReceiverLng, billParams.ReceiverLat, _ = jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType)
|
billParams.ReceiverLng, billParams.ReceiverLat, _ = jxutils.IntCoordinate2MarsStandard(order.ConsigneeLng, order.ConsigneeLat, order.CoordinateType)
|
||||||
billParams.Info = fmt.Sprintf("%s第%d号订单, %s", model.VendorChineseNames[order.VendorID], order.OrderSeq, utils.FilterMb4(order.BuyerComment))
|
billParams.Info = fmt.Sprintf("%s第%d号订单, %s", model.VendorChineseNames[order.VendorID], order.OrderSeq, utils.FilterMb4("客户电话:"+order.ConsigneeMobile+","+order.BuyerComment+"取货失败或配送遇到问题请联系18048531223,禁止未配送直接完成定单!"))
|
||||||
billParams.CargoType = dadaapi.CargoTypeFresh
|
billParams.CargoType = dadaapi.CargoTypeFresh
|
||||||
billParams.CargoWeight = float64(jxutils.IntWeight2Float(limitOrderWeight(order.Weight)))
|
billParams.CargoWeight = float64(jxutils.IntWeight2Float(limitOrderWeight(order.Weight)))
|
||||||
billParams.CargoNum = order.GoodsCount
|
billParams.CargoNum = order.GoodsCount
|
||||||
@@ -241,6 +248,15 @@ func (c *DeliveryHandler) getBillParams(db *dao.DaoDB, order *model.GoodsOrder)
|
|||||||
// IDeliveryPlatformHandler
|
// IDeliveryPlatformHandler
|
||||||
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
|
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
|
if vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDDada, "", model.VendorOrgTypeDelivery); err == nil {
|
||||||
|
if len(vendorOrgCode) > 0 {
|
||||||
|
if vendorOrgCode[0].IsOpen == model.YES {
|
||||||
|
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
billParams, err := c.getBillParams(db, order)
|
billParams, err := c.getBillParams(db, order)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if globals.EnableStoreWrite {
|
if globals.EnableStoreWrite {
|
||||||
|
|||||||
84
business/partner/delivery/fn/store.go
Normal file
84
business/partner/delivery/fn/store.go
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
package fn
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/fnpsapi"
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (vendorStoreID string, status int, err error) {
|
||||||
|
err = api.FnAPI.CreateStore(&fnpsapi.CreateStoreParam{
|
||||||
|
ChainStoreCode: utils.Int2Str(storeDetail.ID),
|
||||||
|
ChainStoreName: globals.StoreName + "-" + storeDetail.Name,
|
||||||
|
ContactPhone: storeDetail.Tel1,
|
||||||
|
Address: storeDetail.Address,
|
||||||
|
PositionSource: 3,
|
||||||
|
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
|
||||||
|
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
|
||||||
|
})
|
||||||
|
if err == nil {
|
||||||
|
vendorStoreID = utils.Int2Str(storeDetail.ID)
|
||||||
|
}
|
||||||
|
return vendorStoreID, status, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func shopStatus2JX(status int) (jxStatus int) {
|
||||||
|
if status == 1 {
|
||||||
|
return 0
|
||||||
|
} else {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) GetStore(ctx *jxcontext.Context, storeID int, vendorStoreID string) (storeDetail *dao.StoreDetail2, err error) {
|
||||||
|
shopInfo, err := api.FnAPI.GetStore(vendorStoreID)
|
||||||
|
if err == nil {
|
||||||
|
storeDetail = &dao.StoreDetail2{
|
||||||
|
Store: model.Store{
|
||||||
|
Name: shopInfo.ChainStoreName,
|
||||||
|
Tel1: shopInfo.ContactPhone,
|
||||||
|
Address: shopInfo.Address,
|
||||||
|
Lng: jxutils.StandardCoordinate2Int(utils.Str2Float64(shopInfo.Longitude)),
|
||||||
|
Lat: jxutils.StandardCoordinate2Int(utils.Str2Float64(shopInfo.Latitude)),
|
||||||
|
},
|
||||||
|
VendorID: model.VendorIDFengNiao,
|
||||||
|
VendorStoreID: shopInfo.ChainStoreCode,
|
||||||
|
CourierStatus: shopStatus2JX(shopInfo.Status),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return storeDetail, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) IsErrStoreExist(err error) bool {
|
||||||
|
return fnpsapi.IsErrShopExist(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) IsErrStoreNotExist(err error) bool {
|
||||||
|
return fnpsapi.IsErrShopNotExist(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) UpdateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (err error) {
|
||||||
|
params := &fnpsapi.CreateStoreParam{
|
||||||
|
ChainStoreCode: utils.Int2Str(storeDetail.ID),
|
||||||
|
// ChainStoreName: globals.StoreName + "-" + storeDetail.Name,
|
||||||
|
ContactPhone: storeDetail.Tel1,
|
||||||
|
Address: storeDetail.Address,
|
||||||
|
PositionSource: 3,
|
||||||
|
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
|
||||||
|
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
|
||||||
|
}
|
||||||
|
if !strings.Contains(storeDetail.Name, globals.StoreName+"-") {
|
||||||
|
params.ChainStoreName = globals.StoreName + "-" + storeDetail.Name
|
||||||
|
} else {
|
||||||
|
params.ChainStoreName = storeDetail.Name
|
||||||
|
}
|
||||||
|
err = api.FnAPI.UpdateStore(params)
|
||||||
|
return err
|
||||||
|
}
|
||||||
220
business/partner/delivery/fn/waybill.go
Normal file
220
business/partner/delivery/fn/waybill.go
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
package fn
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
"github.com/astaxie/beego"
|
||||||
|
"github.com/astaxie/beego/orm"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner/delivery"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/fnpsapi"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
curDeliveryHandler *DeliveryHandler
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeliveryHandler struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
if api.FnAPI != nil {
|
||||||
|
curDeliveryHandler = new(DeliveryHandler)
|
||||||
|
partner.RegisterDeliveryPlatform(curDeliveryHandler, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) GetVendorID() int {
|
||||||
|
return model.VendorIDFengNiao
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
||||||
|
err = api.FnAPI.CancelOrder(&fnpsapi.CancelOrderParam{
|
||||||
|
PartnerOrderCode: bill.VendorOrderID,
|
||||||
|
OrderCancelReasonCode: 1, //用户取消
|
||||||
|
OrderCancelCode: fnpsapi.OrderCancelReson8,
|
||||||
|
OrderCancelTime: time.Now().UnixNano() / 1e6,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
if strings.Contains(err.Error(), "运单暂未生成") {
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bill.Status = model.WaybillStatusCanceled
|
||||||
|
bill.Remark = cancelReason
|
||||||
|
partner.CurOrderManager.OnWaybillStatusChanged(bill)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, resonContent string) (err error) {
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
if vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDFengNiao, "", model.VendorOrgTypeDelivery); err == nil {
|
||||||
|
if len(vendorOrgCode) > 0 {
|
||||||
|
if vendorOrgCode[0].IsOpen == model.YES {
|
||||||
|
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
storeDetail, err := dao.GetStoreDetail(db, order.StoreID, order.VendorID, order.VendorOrgCode)
|
||||||
|
deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
|
||||||
|
if err == nil {
|
||||||
|
if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDFengNiao); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
params := &fnpsapi.CreateOrderParam{
|
||||||
|
PartnerOrderCode: order.VendorOrderID,
|
||||||
|
NotifyURL: globals.FnNotifyURL,
|
||||||
|
ChainStoreCode: utils.Int2Str(jxutils.GetSaleStoreIDFromOrder(order)),
|
||||||
|
OrderType: 1, //即时达
|
||||||
|
TransportInfo: &fnpsapi.TransportInfo{
|
||||||
|
TransportName: order.StoreName,
|
||||||
|
TransportAddress: storeDetail.Address,
|
||||||
|
TransportLongitude: jxutils.IntCoordinate2Standard(storeDetail.Lng),
|
||||||
|
TransportLatitude: jxutils.IntCoordinate2Standard(storeDetail.Lat),
|
||||||
|
PositionSource: 3,
|
||||||
|
TransportTel: storeDetail.Tel1,
|
||||||
|
},
|
||||||
|
OrderAddTime: order.OrderCreatedAt.UnixNano() / 1e6,
|
||||||
|
OrderTotalAmount: jxutils.IntPrice2Standard(order.SalePrice),
|
||||||
|
OrderActualAmount: jxutils.IntPrice2Standard(order.ActualPayPrice),
|
||||||
|
OrderWeight: float64(jxutils.IntWeight2Float(order.Weight)),
|
||||||
|
OrderRemark: utils.FilterMb4("客户电话:" + order.ConsigneeMobile + "," + order.BuyerComment + ",取货失败或配送遇到问题请联系18048531223,禁止未配送直接完成定单!"),
|
||||||
|
IsInvoiced: 0,
|
||||||
|
OrderPaymentStatus: 1,
|
||||||
|
OrderPaymentMethod: 1,
|
||||||
|
IsAgentPayment: 0,
|
||||||
|
GoodsCount: order.GoodsCount,
|
||||||
|
ReceiverInfo: &fnpsapi.ReceiverInfo{
|
||||||
|
ReceiverName: order.ConsigneeName,
|
||||||
|
ReceiverAddress: order.ConsigneeAddress,
|
||||||
|
ReceiverLongitude: jxutils.IntCoordinate2Standard(order.ConsigneeLng),
|
||||||
|
ReceiverLatitude: jxutils.IntCoordinate2Standard(order.ConsigneeLat),
|
||||||
|
ReceiverPrimaryPhone: order.ConsigneeMobile,
|
||||||
|
ReceiverSecondPhone: order.ConsigneeMobile2,
|
||||||
|
PositionSource: 3,
|
||||||
|
},
|
||||||
|
SerialNumber: model.VendorNames[order.VendorID] + " #" + utils.Int2Str(order.OrderSeq),
|
||||||
|
}
|
||||||
|
var skuInfo []*fnpsapi.ItemsJSON
|
||||||
|
for _, v := range order.Skus {
|
||||||
|
skuInfo = append(skuInfo, &fnpsapi.ItemsJSON{
|
||||||
|
ItemID: utils.Int2Str(v.SkuID),
|
||||||
|
ItemName: v.SkuName,
|
||||||
|
ItemQuantity: v.Count,
|
||||||
|
ItemPrice: jxutils.IntPrice2Standard(v.SalePrice),
|
||||||
|
ItemActualPrice: jxutils.IntPrice2Standard(v.SalePrice),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
params.ItemsJSON = skuInfo
|
||||||
|
//要求饿百的订单要传来源
|
||||||
|
if order.VendorID == model.VendorIDEBAI {
|
||||||
|
params.OrderSource = "109"
|
||||||
|
params.ChannelOrderCode = order.VendorOrderID
|
||||||
|
}
|
||||||
|
err = api.FnAPI.CreateOrder(params)
|
||||||
|
if err == nil {
|
||||||
|
bill = &model.Waybill{
|
||||||
|
VendorOrderID: order.VendorOrderID,
|
||||||
|
OrderVendorID: order.VendorID,
|
||||||
|
VendorWaybillID: "",
|
||||||
|
VendorWaybillID2: "",
|
||||||
|
WaybillVendorID: model.VendorIDFengNiao,
|
||||||
|
DesiredFee: deliveryFee,
|
||||||
|
}
|
||||||
|
delivery.OnWaybillCreated(bill)
|
||||||
|
} else {
|
||||||
|
globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, error:%v", order.VendorOrderID, params, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return bill, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) getMTPSShopID(order *model.GoodsOrder, db *dao.DaoDB) (retVal string, err error) {
|
||||||
|
saleStoreID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||||
|
storeCourierList, err2 := dao.GetOpenedStoreCouriersByStoreID(db, saleStoreID, model.VendorIDFengNiao)
|
||||||
|
if err = err2; err != nil && err != orm.ErrNoRows {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
if len(storeCourierList) == 0 {
|
||||||
|
return "", partner.ErrStoreHaveNoCourier
|
||||||
|
}
|
||||||
|
retVal = storeCourierList[0].VendorStoreID
|
||||||
|
if beego.BConfig.RunMode == "dev" {
|
||||||
|
retVal = "test_0001"
|
||||||
|
}
|
||||||
|
return retVal, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) {
|
||||||
|
db := dao.GetDB()
|
||||||
|
deliveryFeeInfo = &partner.WaybillFeeInfo{}
|
||||||
|
deliveryFeeInfo.RefDeliveryFee, deliveryFeeInfo.RefAddFee, err = delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
|
||||||
|
if err == nil {
|
||||||
|
if _, err = c.getMTPSShopID(order, db); err == nil {
|
||||||
|
deliveryFeeInfo.DeliveryFee = deliveryFeeInfo.RefDeliveryFee
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return deliveryFeeInfo, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func OnWaybillMsg(msg *fnpsapi.WayBillInfo) {
|
||||||
|
order := &model.Waybill{
|
||||||
|
VendorWaybillID: utils.Int64ToStr(msg.OpenOrderCode),
|
||||||
|
VendorWaybillID2: msg.PartnerOrderCode,
|
||||||
|
WaybillVendorID: model.VendorIDFengNiao,
|
||||||
|
CourierName: msg.CarrierDriverName,
|
||||||
|
CourierMobile: msg.CarrierDriverPhone,
|
||||||
|
VendorStatus: utils.Int2Str(msg.OrderStatus),
|
||||||
|
StatusTime: utils.Timestamp2Time(msg.PushTime),
|
||||||
|
Remark: msg.Description,
|
||||||
|
}
|
||||||
|
order.VendorOrderID, order.OrderVendorID = jxutils.SplitUniversalOrderID(msg.PartnerOrderCode)
|
||||||
|
switch msg.OrderStatus {
|
||||||
|
case fnpsapi.OrderStatusAccept:
|
||||||
|
order.Status = model.WaybillStatusNew
|
||||||
|
case fnpsapi.OrderStatusAssigned:
|
||||||
|
order.DesiredFee = GetDesiredFee(order.VendorOrderID)
|
||||||
|
order.Status = model.WaybillStatusAccepted
|
||||||
|
order.Remark = order.CourierName + "," + order.CourierMobile
|
||||||
|
case fnpsapi.OrderStatusArrived:
|
||||||
|
order.DesiredFee = GetDesiredFee(order.VendorOrderID)
|
||||||
|
order.Status = model.WaybillStatusCourierArrived
|
||||||
|
case fnpsapi.OrderStatusDelivering:
|
||||||
|
order.Status = model.WaybillStatusDelivering
|
||||||
|
case fnpsapi.OrderStatusDelivered:
|
||||||
|
order.Status = model.WaybillStatusDelivered
|
||||||
|
case fnpsapi.OrderStatusException:
|
||||||
|
order.Status = model.WaybillStatusDeliverFailed
|
||||||
|
default:
|
||||||
|
globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg)
|
||||||
|
}
|
||||||
|
partner.CurOrderManager.OnWaybillStatusChanged(order)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetDesiredFee(vendorOrderID string) (desiredFee int64) {
|
||||||
|
if result, err := api.FnAPI.QueryOrder(vendorOrderID); err == nil {
|
||||||
|
return jxutils.StandardPrice2Int(result.OrderTotalDeliveryCost)
|
||||||
|
}
|
||||||
|
return desiredFee
|
||||||
|
}
|
||||||
104
business/partner/delivery/jdeclp/waybill.go
Normal file
104
business/partner/delivery/jdeclp/waybill.go
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
package jdeclp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/jdeclpapi"
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
CurDeliveryHandler *DeliveryHandler
|
||||||
|
)
|
||||||
|
|
||||||
|
type DeliveryHandler struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
CurDeliveryHandler = new(DeliveryHandler)
|
||||||
|
partner.RegisterDeliveryPlatform(CurDeliveryHandler, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) GetVendorID() int {
|
||||||
|
return model.VendorIDJDWL
|
||||||
|
}
|
||||||
|
|
||||||
|
func OnWaybillMsg() {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) OnWaybillMsg() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (vendorStoreID string, status int, err error) {
|
||||||
|
return vendorStoreID, status, err
|
||||||
|
}
|
||||||
|
func (c *DeliveryHandler) GetStore(ctx *jxcontext.Context, storeID int, vendorStoreID string) (storeDetail *dao.StoreDetail2, err error) {
|
||||||
|
return storeDetail, err
|
||||||
|
}
|
||||||
|
func (c *DeliveryHandler) IsErrStoreNotExist(err error) bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
func (c *DeliveryHandler) IsErrStoreExist(err error) bool {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
|
||||||
|
storeID := jxutils.GetShowStoreIDFromOrder(order)
|
||||||
|
stores, err := dao.GetStoreList(dao.GetDB(), []int{storeID}, nil, nil, nil, "")
|
||||||
|
if len(stores) == 0 || err != nil {
|
||||||
|
return bill, fmt.Errorf("未查询到该门店! 门店id :[%v]", storeID)
|
||||||
|
}
|
||||||
|
vendorWaybillID, err := api.JdEclpAPI.WaybillReceive(&jdeclpapi.WaybillReceiveParam{
|
||||||
|
SalePlat: jdeclpapi.SalePlatSourceDelivery,
|
||||||
|
CustomerCode: jdeclpapi.CustomerCode,
|
||||||
|
OrderID: order.VendorOrderID,
|
||||||
|
SenderName: order.StoreName,
|
||||||
|
SenderAddress: stores[0].Address,
|
||||||
|
SenderTel: stores[0].Tel1,
|
||||||
|
ReceiveName: order.ConsigneeName,
|
||||||
|
ReceiveAddress: order.ConsigneeAddress,
|
||||||
|
ReceiveTel: order.ConsigneeMobile,
|
||||||
|
Weight: order.Weight,
|
||||||
|
Vloumn: order.Weight,
|
||||||
|
PackageCount: 1,
|
||||||
|
Description: "生鲜",
|
||||||
|
Aging: 5,
|
||||||
|
PromiseTimeType: 1, //特惠送
|
||||||
|
})
|
||||||
|
waybill := &model.Waybill{
|
||||||
|
VendorOrderID: order.VendorOrderID,
|
||||||
|
OrderVendorID: model.VendorIDJDShop,
|
||||||
|
VendorWaybillID: vendorWaybillID,
|
||||||
|
WaybillVendorID: model.VendorIDJDWL,
|
||||||
|
Status: model.WaybillStatusDelivering,
|
||||||
|
WaybillCreatedAt: time.Now(),
|
||||||
|
StatusTime: time.Now(),
|
||||||
|
WaybillFinishedAt: utils.DefaultTimeValue,
|
||||||
|
DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled,
|
||||||
|
}
|
||||||
|
dao.CreateEntity(dao.GetDB(), waybill)
|
||||||
|
return waybill, err
|
||||||
|
}
|
||||||
|
func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
||||||
|
err = api.JdEclpAPI.CancelWayBill(&jdeclpapi.CancelWayBillParam{
|
||||||
|
WaybillCode: bill.VendorWaybillID,
|
||||||
|
CustomerCode: jdeclpapi.CustomerCode,
|
||||||
|
Source: "JOS",
|
||||||
|
CancelReason: cancelReason,
|
||||||
|
OperatorName: "jxadmin",
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) {
|
||||||
|
return deliveryFeeInfo, err
|
||||||
|
}
|
||||||
|
func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, resonContent string) (err error) {
|
||||||
|
return err
|
||||||
|
}
|
||||||
7
business/partner/delivery/jdeclp/waybill_test.go
Normal file
7
business/partner/delivery/jdeclp/waybill_test.go
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
package jdeclp
|
||||||
|
|
||||||
|
import "git.rosy.net.cn/jx-callback/globals/testinit"
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
testinit.Init()
|
||||||
|
}
|
||||||
@@ -22,6 +22,8 @@ var (
|
|||||||
mtpsapi.ShopStatusAuditRejected: model.StoreAuditStatusRejected,
|
mtpsapi.ShopStatusAuditRejected: model.StoreAuditStatusRejected,
|
||||||
mtpsapi.ShopStatusAuditPassed: model.StoreAuditStatusCreated,
|
mtpsapi.ShopStatusAuditPassed: model.StoreAuditStatusCreated,
|
||||||
mtpsapi.ShopStatusAuditOnline: model.StoreAuditStatusOnline,
|
mtpsapi.ShopStatusAuditOnline: model.StoreAuditStatusOnline,
|
||||||
|
mtpsapi.ShopStatusAuditUpdatePassed: model.StoreAuditStatusOnline,
|
||||||
|
mtpsapi.ShopStatusAuditUpdateRejected: model.StoreAuditStatusRejected,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -38,12 +40,13 @@ func OnStoreStatus(msg *mtpsapi.CallbackShopStatusMsg) (retVal *mtpsapi.Callback
|
|||||||
|
|
||||||
func (c *DeliveryHandler) OnStoreStatus(msg *mtpsapi.CallbackShopStatusMsg) (retVal *mtpsapi.CallbackResponse) {
|
func (c *DeliveryHandler) OnStoreStatus(msg *mtpsapi.CallbackShopStatusMsg) (retVal *mtpsapi.CallbackResponse) {
|
||||||
globals.SugarLogger.Debugf("mtps OnStoreStatus, msg:%s", utils.Format4Output(msg, true))
|
globals.SugarLogger.Debugf("mtps OnStoreStatus, msg:%s", utils.Format4Output(msg, true))
|
||||||
err := partner.CurStoreManager.OnCourierStoreStatusChanged(jxcontext.AdminCtx, msg.ShopID, model.VendorIDMTPS, getAuditStatus(msg.Status))
|
err := partner.CurStoreManager.OnCourierStoreStatusChanged(jxcontext.AdminCtx, msg.ShopID, model.VendorIDMTPS, getAuditStatus(msg.Status), msg.RejectMessage)
|
||||||
retVal = mtpsapi.Err2CallbackResponse(err, "mtps OnStoreStatus")
|
retVal = mtpsapi.Err2CallbackResponse(err, "mtps OnStoreStatus")
|
||||||
return retVal
|
return retVal
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (vendorStoreID string, status int, err error) {
|
func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (vendorStoreID string, status int, err error) {
|
||||||
|
if globals.EnableStoreWrite {
|
||||||
businessHours := []*mtpsapi.BusinessHour{
|
businessHours := []*mtpsapi.BusinessHour{
|
||||||
&mtpsapi.BusinessHour{
|
&mtpsapi.BusinessHour{
|
||||||
BeginTime: "06:00",
|
BeginTime: "06:00",
|
||||||
@@ -75,6 +78,7 @@ func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.S
|
|||||||
vendorStoreID = utils.Int64ToStr(jxutils.GenFakeID())
|
vendorStoreID = utils.Int64ToStr(jxutils.GenFakeID())
|
||||||
status = model.StoreAuditStatusOnline
|
status = model.StoreAuditStatusOnline
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return vendorStoreID, status, err
|
return vendorStoreID, status, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,8 +102,8 @@ func (c *DeliveryHandler) GetStore(ctx *jxcontext.Context, storeID int, vendorSt
|
|||||||
}
|
}
|
||||||
result, err := api.MtpsAPI.GetStoreStatus(shopInfo.ShopName)
|
result, err := api.MtpsAPI.GetStoreStatus(shopInfo.ShopName)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
storeDetail.AuditStatus = mtpsOpenTypeToJx(result.OpenType)
|
storeDetail.AuditStatus = mtpsOpenTypeToJx(result.DataList[0].OpenType)
|
||||||
storeDetail.CourierStatus = mtpsOpenTypeToJx2(result.OpenType)
|
storeDetail.CourierStatus = mtpsOpenTypeToJx2(result.DataList[0].OpenType)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return storeDetail, err
|
return storeDetail, err
|
||||||
@@ -133,7 +137,16 @@ func (c *DeliveryHandler) IsErrStoreExist(err error) bool {
|
|||||||
|
|
||||||
func (c *DeliveryHandler) UpdateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (err error) {
|
func (c *DeliveryHandler) UpdateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (err error) {
|
||||||
if globals.EnableStoreWrite {
|
if globals.EnableStoreWrite {
|
||||||
err = api.MtpsAPI.PagePoiUpdate(storeDetail.VendorStoreID, storeDetail.PayeeName, storeDetail.Tel1, fakeContactEmail)
|
// err = api.MtpsAPI.PagePoiUpdate(storeDetail.VendorStoreID, storeDetail.PayeeName, storeDetail.Tel1, fakeContactEmail)
|
||||||
|
shopInfo := &mtpsapi.ShopInfo{
|
||||||
|
ShopID: utils.Int2Str(storeDetail.ID),
|
||||||
|
ContactName: storeDetail.PayeeName,
|
||||||
|
ContactPhone: storeDetail.Tel1,
|
||||||
|
ShopAddress: storeDetail.Address,
|
||||||
|
ShopLat: storeDetail.Lat,
|
||||||
|
ShopLng: storeDetail.Lng,
|
||||||
|
}
|
||||||
|
_, err = api.MtpsAPI.ShopUpdate(shopInfo)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
package mtps
|
package mtps
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/sha1"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
|
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
|
||||||
@@ -89,6 +94,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
|
|||||||
case mtpsapi.OrderStatusAccepted:
|
case mtpsapi.OrderStatusAccepted:
|
||||||
order.DesiredFee, _ = delivery.CalculateBillDeliveryFee(order) // 美团外卖可能会丢失新运单事件,这里补一下
|
order.DesiredFee, _ = delivery.CalculateBillDeliveryFee(order) // 美团外卖可能会丢失新运单事件,这里补一下
|
||||||
order.Status = model.WaybillStatusAccepted
|
order.Status = model.WaybillStatusAccepted
|
||||||
|
order.Remark = order.CourierName + "," + order.CourierMobile
|
||||||
case mtpsapi.OrderStatusPickedUp:
|
case mtpsapi.OrderStatusPickedUp:
|
||||||
order.Status = model.WaybillStatusDelivering
|
order.Status = model.WaybillStatusDelivering
|
||||||
case mtpsapi.OrderStatusDeliverred:
|
case mtpsapi.OrderStatusDeliverred:
|
||||||
@@ -99,9 +105,62 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
|
|||||||
globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg)
|
globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg)
|
||||||
return mtpsapi.SuccessResponse
|
return mtpsapi.SuccessResponse
|
||||||
}
|
}
|
||||||
|
order2, _ := partner.CurOrderManager.LoadOrder(order.VendorOrderID, order.OrderVendorID)
|
||||||
|
// order2, _ := dao.GetSimpleOrder(dao.GetDB(), order.VendorOrderID)
|
||||||
|
//查不到订单可能就是果园的订单
|
||||||
|
if order2 == nil {
|
||||||
|
c.pushToGy(msg)
|
||||||
|
return mtpsapi.SuccessResponse
|
||||||
|
}
|
||||||
return mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus)
|
return mtpsapi.Err2CallbackResponse(partner.CurOrderManager.OnWaybillStatusChanged(order), order.VendorStatus)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *DeliveryHandler) pushToGy(msg *mtpsapi.CallbackOrderMsg) {
|
||||||
|
cl := http.Client{}
|
||||||
|
params := make(map[string]interface{})
|
||||||
|
params["mt_peisong_id"] = msg.MtPeisongID
|
||||||
|
params["courier_name"] = msg.CourierName
|
||||||
|
params["delivery_id"] = msg.DeliveryID
|
||||||
|
params["appkey"] = msg.AppKey
|
||||||
|
params["order_id"] = msg.OrderID
|
||||||
|
params["courier_phone"] = msg.CourierPhone
|
||||||
|
params["status"] = msg.Status
|
||||||
|
params["timestamp"] = msg.Timestamp
|
||||||
|
params["cancel_reason_id"] = msg.CancelReasonId
|
||||||
|
params["cancel_reason"] = msg.CancelReason
|
||||||
|
urls := utils.Map2URLValues(params)
|
||||||
|
sign := signParams(urls)
|
||||||
|
params["sign"] = sign
|
||||||
|
globals.SugarLogger.Debugf("pushToGy", utils.Format4Output(msg, false))
|
||||||
|
request, err := http.NewRequest(http.MethodPost, "http://callback-jxgy.jxc4.com/mtps/status", strings.NewReader(utils.Map2URLValues(params).Encode()))
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
request.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
|
||||||
|
cl.Do(request)
|
||||||
|
}
|
||||||
|
|
||||||
|
func signParams(params url.Values) string {
|
||||||
|
keys := make([]string, 0)
|
||||||
|
for k := range params {
|
||||||
|
if k != "sign" {
|
||||||
|
keys = append(keys, k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Strings(keys)
|
||||||
|
finalStr := "b1M}9?:sTbsB[OF2gNORnN(|(iy9rB8(`7]|[wGLnbmt`evfM>E:A90DjHAW:UPE"
|
||||||
|
for _, key := range keys {
|
||||||
|
valStr := strings.Join(params[key], "")
|
||||||
|
if valStr != "" {
|
||||||
|
finalStr += key + valStr
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// baseapi.SugarLogger.Debug(finalStr)
|
||||||
|
return fmt.Sprintf("%x", sha1.Sum([]byte(finalStr)))
|
||||||
|
}
|
||||||
|
|
||||||
func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (retVal *model.Waybill) {
|
func (c *DeliveryHandler) callbackMsg2Waybill(msg *mtpsapi.CallbackOrderMsg) (retVal *model.Waybill) {
|
||||||
retVal = &model.Waybill{
|
retVal = &model.Waybill{
|
||||||
VendorWaybillID: msg.MtPeisongID,
|
VendorWaybillID: msg.MtPeisongID,
|
||||||
@@ -132,6 +191,15 @@ func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInf
|
|||||||
// IDeliveryPlatformHandler
|
// IDeliveryPlatformHandler
|
||||||
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
|
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
|
if vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDMTPS, "", model.VendorOrgTypeDelivery); err == nil {
|
||||||
|
if len(vendorOrgCode) > 0 {
|
||||||
|
if vendorOrgCode[0].IsOpen == model.YES {
|
||||||
|
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
|
deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDMTPS); err != nil {
|
if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDMTPS); err != nil {
|
||||||
@@ -180,7 +248,13 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
|
|||||||
// "goods_pickup_info": fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq),
|
// "goods_pickup_info": fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq),
|
||||||
// "poi_seq": fmt.Sprintf("#%d", order.OrderSeq),
|
// "poi_seq": fmt.Sprintf("#%d", order.OrderSeq),
|
||||||
// }
|
// }
|
||||||
billParams.Note = utils.FilterMb4(order.BuyerComment)
|
// storeTel := ""
|
||||||
|
// storeID := jxutils.GetSaleStoreIDFromOrder(order)
|
||||||
|
// storeDeatail, _ := dao.GetStoreDetail(db, storeID, order.VendorID)
|
||||||
|
// if storeDeatail.Tel2 != "" {
|
||||||
|
// storeTel = ",门店电话:" + storeDeatail.Tel2
|
||||||
|
// }
|
||||||
|
billParams.Note = utils.FilterMb4("客户电话:" + order.ConsigneeMobile + "," + order.BuyerComment + ",取货失败或配送遇到问题请联系18048531223,禁止未配送直接完成定单!")
|
||||||
billParams.GoodsDetail = string(utils.MustMarshal(goods))
|
billParams.GoodsDetail = string(utils.MustMarshal(goods))
|
||||||
billParams.GoodsPickupInfo = fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq)
|
billParams.GoodsPickupInfo = fmt.Sprintf("%s第%d号单", model.VendorChineseNames[order.VendorID], order.OrderSeq)
|
||||||
billParams.PoiSeq = fmt.Sprintf("#%d", order.OrderSeq)
|
billParams.PoiSeq = fmt.Sprintf("#%d", order.OrderSeq)
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ var (
|
|||||||
CancelWaybillReasonStrSwitch2SelfFailed = "转自送失败"
|
CancelWaybillReasonStrSwitch2SelfFailed = "转自送失败"
|
||||||
CancelWaybillReasonStrOrderAlreadyFinished = "订单已经结束"
|
CancelWaybillReasonStrOrderAlreadyFinished = "订单已经结束"
|
||||||
CancelWaybillReasonStrActive = "操作由人员主动发起"
|
CancelWaybillReasonStrActive = "操作由人员主动发起"
|
||||||
|
CancelWaybillReasonNotInStoreOpenTime = "不在门店的营业时间范围内"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -105,6 +106,7 @@ type IOrderManager interface {
|
|||||||
|
|
||||||
UpdateOrderStatusAndDeliveryFlag(order *model.GoodsOrder) (err error)
|
UpdateOrderStatusAndDeliveryFlag(order *model.GoodsOrder) (err error)
|
||||||
UpdateOrderFields(order *model.GoodsOrder, fieldList []string) (err error)
|
UpdateOrderFields(order *model.GoodsOrder, fieldList []string) (err error)
|
||||||
|
LoadStoreDetail(storeID, vendorID int) (storeDetail *dao.StoreDetail, err error)
|
||||||
|
|
||||||
LoadWaybill(vendorWaybillID string, waybillVendorID int) (bill *model.Waybill, err error)
|
LoadWaybill(vendorWaybillID string, waybillVendorID int) (bill *model.Waybill, err error)
|
||||||
OnOrderComments(orderCommentList []*model.OrderComment) (err error)
|
OnOrderComments(orderCommentList []*model.OrderComment) (err error)
|
||||||
@@ -114,7 +116,7 @@ type IOrderManager interface {
|
|||||||
|
|
||||||
GetOrderWaybillInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isNotEnded, isGetPos bool) (bills []*model.WaybillExt, err error)
|
GetOrderWaybillInfo(ctx *jxcontext.Context, vendorOrderID string, vendorID int, isNotEnded, isGetPos bool) (bills []*model.WaybillExt, err error)
|
||||||
|
|
||||||
ChangeOrderInfo(order *model.GoodsOrder, valid map[string]interface{}) (err error)
|
ChangeOrderInfo(order *model.GoodsOrder) (err error)
|
||||||
// afs order
|
// afs order
|
||||||
OnAfsOrderAdjust(afsOrder *model.AfsOrder, orderStatus *model.OrderStatus) (err error)
|
OnAfsOrderAdjust(afsOrder *model.AfsOrder, orderStatus *model.OrderStatus) (err error)
|
||||||
OnAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *model.OrderStatus) (err error)
|
OnAfsOrderNew(afsOrder *model.AfsOrder, orderStatus *model.OrderStatus) (err error)
|
||||||
@@ -127,7 +129,7 @@ type IOrderManager interface {
|
|||||||
|
|
||||||
type IStoreManager interface {
|
type IStoreManager interface {
|
||||||
OnStoreStatusChanged(vendorStoreID string, vendorID int, storeStatus int) (err error)
|
OnStoreStatusChanged(vendorStoreID string, vendorID int, storeStatus int) (err error)
|
||||||
OnCourierStoreStatusChanged(ctx *jxcontext.Context, vendorStoreID string, vendorID int, auditStatus int) (err error)
|
OnCourierStoreStatusChanged(ctx *jxcontext.Context, vendorStoreID string, vendorID int, auditStatus int, message string) (err error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// purchase handler中
|
// purchase handler中
|
||||||
@@ -147,7 +149,7 @@ type IPurchasePlatformHandler interface {
|
|||||||
// Store
|
// Store
|
||||||
ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (store *dao.StoreDetail, err error)
|
ReadStore(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string) (store *dao.StoreDetail, err error)
|
||||||
UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error)
|
UpdateStore(db *dao.DaoDB, storeID int, userName string) (err error)
|
||||||
CreateStore2(db *dao.DaoDB, storeID int, userName string) (vendorStoreID string, err error)
|
CreateStore2(db *dao.DaoDB, storeID int, userName string, params map[string]interface{}, storeDetail *dao.StoreDetail) (vendorStoreID string, err error)
|
||||||
DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error)
|
DeleteStore(db *dao.DaoDB, storeID int, userName string) (err error)
|
||||||
GetStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (storeStatus int, err error)
|
GetStoreStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string) (storeStatus int, err error)
|
||||||
UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string, storeID int64) (err error)
|
UpdateStoreCustomID(ctx *jxcontext.Context, vendorOrgCode, vendorStoreID string, storeID int64) (err error)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ type OrderPhoneNumberInfo struct {
|
|||||||
|
|
||||||
type IPurchasePlatformOrderHandler interface {
|
type IPurchasePlatformOrderHandler interface {
|
||||||
Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder)
|
Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder)
|
||||||
GetOrder(vendorOrgCode, vendorOrderID string) (order *model.GoodsOrder, err error)
|
GetOrder(vendorOrgCode, vendorOrderID, vendorStoreID string) (order *model.GoodsOrder, err error)
|
||||||
GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error)
|
GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error)
|
||||||
GetStatusActionTimeout(order *model.GoodsOrder, statusType, status int) (params *StatusActionParams)
|
GetStatusActionTimeout(order *model.GoodsOrder, statusType, status int) (params *StatusActionParams)
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ package partner
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
)
|
)
|
||||||
@@ -58,7 +60,7 @@ type IPrinterHandler interface {
|
|||||||
BindPrinter(ctx *jxcontext.Context, mapData map[string]interface{}) (bindResult *BindPrinterResult, err error)
|
BindPrinter(ctx *jxcontext.Context, mapData map[string]interface{}) (bindResult *BindPrinterResult, err error)
|
||||||
RebindPrinter(ctx *jxcontext.Context, lastBindResult *BindPrinterResult) (bindResult *BindPrinterResult, err error)
|
RebindPrinter(ctx *jxcontext.Context, lastBindResult *BindPrinterResult) (bindResult *BindPrinterResult, err error)
|
||||||
|
|
||||||
PrintOrder(ctx *jxcontext.Context, store *model.Store, order *model.GoodsOrder) (printerStatus *PrinterStatus, err error)
|
PrintOrder(ctx *jxcontext.Context, store *model.Store, storeDetail *dao.StoreDetail, order *model.GoodsOrder) (printerStatus *PrinterStatus, err error)
|
||||||
|
|
||||||
EmptyPrintList(ctx *jxcontext.Context, id1, id2 string) (err error)
|
EmptyPrintList(ctx *jxcontext.Context, id1, id2 string) (err error)
|
||||||
PlayText(ctx *jxcontext.Context, id1, id2, orderID, text string) (printerStatus *PrinterStatus, err error)
|
PlayText(ctx *jxcontext.Context, id1, id2, orderID, text string) (printerStatus *PrinterStatus, err error)
|
||||||
|
|||||||
30
business/partner/partner_store_acct.go
Normal file
30
business/partner/partner_store_acct.go
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
package partner
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
StoreAcctType1 = 1 //主动充值
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
CurStoreAcctManager IStoreAcctManager
|
||||||
|
)
|
||||||
|
|
||||||
|
func InitStoreAcctManager(curStoreManager IStoreAcctManager) {
|
||||||
|
CurStoreAcctManager = curStoreManager
|
||||||
|
}
|
||||||
|
|
||||||
|
type IStoreAcctManager interface {
|
||||||
|
//增加一条收入流水
|
||||||
|
InsertStoreAcctIncome(ctx *jxcontext.Context, db *dao.DaoDB, storeID, price, acctType int) (err error)
|
||||||
|
//增加一条支出流水
|
||||||
|
InsertStoreAcctExpend(ctx *jxcontext.Context, db *dao.DaoDB, storeID, price, acctType int, vendorOrderID string) (err error)
|
||||||
|
//更新门店账户
|
||||||
|
UpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price int, isIncome bool) (err error)
|
||||||
|
InsertStoreAcctExpendAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int, vendorOrderID string) (err error)
|
||||||
|
InsertStoreAcctIncomeAndUpdateStoreAcctBalance(ctx *jxcontext.Context, storeID, price, acctType int) (err error)
|
||||||
|
CheckStoreAcctExpendExist(storeID int, vendorOrderID string) (result bool, err error)
|
||||||
|
}
|
||||||
@@ -52,6 +52,9 @@ type StoreSkuInfo struct {
|
|||||||
JxPrice int64 `json:"jxPrice,omitempty"`
|
JxPrice int64 `json:"jxPrice,omitempty"`
|
||||||
JxUnitPrice int64 `json:"jxUnitPrice,omitempty"`
|
JxUnitPrice int64 `json:"jxUnitPrice,omitempty"`
|
||||||
VendorSkuID2 string `json:"vendorSkuID2,omitempty"`
|
VendorSkuID2 string `json:"vendorSkuID2,omitempty"`
|
||||||
|
JdsStockSwitch int `json:"jdsStockSwitch"`
|
||||||
|
IsDeletedBySku bool `json:"isDeletedBySku"`
|
||||||
|
VendorOrgCode string `json:"vendorOrgCode"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type StoreSkuInfoWithErr struct {
|
type StoreSkuInfoWithErr struct {
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/feieapi"
|
"git.rosy.net.cn/baseapi/platformapi/feieapi"
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
@@ -27,17 +29,30 @@ func init() {
|
|||||||
partner.RegisterPrinterPlatform(CurPrinterHandler)
|
partner.RegisterPrinterPlatform(CurPrinterHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel string) (content string) {
|
func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel string, storeDetail *dao.StoreDetail) (content string) {
|
||||||
expectedDeliveryTime := order.ExpectedDeliveredTime
|
expectedDeliveryTime := order.ExpectedDeliveredTime
|
||||||
if utils.IsTimeZero(expectedDeliveryTime) {
|
if utils.IsTimeZero(expectedDeliveryTime) {
|
||||||
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
||||||
}
|
}
|
||||||
|
orderParams := []interface{}{}
|
||||||
getCode := ""
|
getCode := ""
|
||||||
if order.VendorID == model.VendorIDEBAI {
|
if order.VendorID == model.VendorIDEBAI {
|
||||||
getCode = fmt.Sprintf("<B>饿百取货码:%s</B><BR><BR>\n", jxutils.GetEbaiOrderGetCode(order))
|
getCode = fmt.Sprintf("<B>饿百取货码:%s</B><BR><BR>\n", jxutils.GetEbaiOrderGetCode(order))
|
||||||
}
|
}
|
||||||
orderFmt := `
|
orderFmt := ``
|
||||||
|
if storeDetail != nil {
|
||||||
|
if storeDetail.BrandIsPrint == model.NO {
|
||||||
|
orderFmt += `
|
||||||
<CB>%s</CB><BR><BR>
|
<CB>%s</CB><BR><BR>
|
||||||
|
`
|
||||||
|
if order.VendorOrgCode == "34665" {
|
||||||
|
orderParams = append(orderParams, globals.StoreNameEbai2)
|
||||||
|
} else {
|
||||||
|
orderParams = append(orderParams, storeDetail.BrandName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
orderFmt += `
|
||||||
<C>手机买菜上京西</C><BR>
|
<C>手机买菜上京西</C><BR>
|
||||||
<C>极速到家送惊喜</C><BR>
|
<C>极速到家送惊喜</C><BR>
|
||||||
--------------------------------<BR>
|
--------------------------------<BR>
|
||||||
@@ -62,8 +77,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
品名 数量 单价 小计<BR>
|
品名 数量 单价 小计<BR>
|
||||||
--------------------------------<BR>`
|
--------------------------------<BR>`
|
||||||
// <BOLD>实际支付:</BOLD>%s<BR>
|
// <BOLD>实际支付:</BOLD>%s<BR>
|
||||||
orderParams := []interface{}{
|
orderParams = append(orderParams,
|
||||||
globals.StoreName,
|
|
||||||
utils.Time2Str(order.OrderCreatedAt),
|
utils.Time2Str(order.OrderCreatedAt),
|
||||||
utils.Time2Str(expectedDeliveryTime),
|
utils.Time2Str(expectedDeliveryTime),
|
||||||
order.VendorOrderID,
|
order.VendorOrderID,
|
||||||
@@ -75,7 +89,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
order.ConsigneeAddress,
|
order.ConsigneeAddress,
|
||||||
order.BuyerComment,
|
order.BuyerComment,
|
||||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||||
}
|
)
|
||||||
|
|
||||||
for _, sku := range order.Skus {
|
for _, sku := range order.Skus {
|
||||||
orderFmt += `%s<BR>`
|
orderFmt += `%s<BR>`
|
||||||
@@ -101,7 +115,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
return fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...)
|
return fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel string) (content string) {
|
func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel string, storeDetail *dao.StoreDetail) (content string) {
|
||||||
expectedDeliveryTime := order.ExpectedDeliveredTime
|
expectedDeliveryTime := order.ExpectedDeliveredTime
|
||||||
if utils.IsTimeZero(expectedDeliveryTime) {
|
if utils.IsTimeZero(expectedDeliveryTime) {
|
||||||
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
||||||
@@ -110,8 +124,21 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
if order.VendorID == model.VendorIDEBAI {
|
if order.VendorID == model.VendorIDEBAI {
|
||||||
getCode = fmt.Sprintf("<B>饿百取货码:%s</B><BR><BR>\n", jxutils.GetEbaiOrderGetCode(order))
|
getCode = fmt.Sprintf("<B>饿百取货码:%s</B><BR><BR>\n", jxutils.GetEbaiOrderGetCode(order))
|
||||||
}
|
}
|
||||||
orderFmt := `
|
orderParams := []interface{}{}
|
||||||
|
orderFmt := ``
|
||||||
|
if storeDetail != nil {
|
||||||
|
if storeDetail.BrandIsPrint == model.NO {
|
||||||
|
orderFmt += `
|
||||||
<CB>%s</CB><BR><BR>
|
<CB>%s</CB><BR><BR>
|
||||||
|
`
|
||||||
|
if order.VendorOrgCode == "34665" {
|
||||||
|
orderParams = append(orderParams, globals.StoreNameEbai2)
|
||||||
|
} else {
|
||||||
|
orderParams = append(orderParams, storeDetail.BrandName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
orderFmt += `
|
||||||
<C>手机买菜上京西</C><BR>
|
<C>手机买菜上京西</C><BR>
|
||||||
<C>极速到家送惊喜</C><BR>
|
<C>极速到家送惊喜</C><BR>
|
||||||
--------------------------------<BR>
|
--------------------------------<BR>
|
||||||
@@ -136,8 +163,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
<B>品名数量单价小计<BR></B>
|
<B>品名数量单价小计<BR></B>
|
||||||
--------------------------------<BR>`
|
--------------------------------<BR>`
|
||||||
// <B><BOLD>实际支付:</BOLD></B><B>%s<BR></B>
|
// <B><BOLD>实际支付:</BOLD></B><B>%s<BR></B>
|
||||||
orderParams := []interface{}{
|
orderParams = append(orderParams,
|
||||||
globals.StoreName,
|
|
||||||
utils.Time2Str(order.OrderCreatedAt),
|
utils.Time2Str(order.OrderCreatedAt),
|
||||||
utils.Time2Str(expectedDeliveryTime),
|
utils.Time2Str(expectedDeliveryTime),
|
||||||
order.VendorOrderID,
|
order.VendorOrderID,
|
||||||
@@ -149,7 +175,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
order.ConsigneeAddress,
|
order.ConsigneeAddress,
|
||||||
order.BuyerComment,
|
order.BuyerComment,
|
||||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||||
}
|
)
|
||||||
|
|
||||||
for _, sku := range order.Skus {
|
for _, sku := range order.Skus {
|
||||||
orderFmt += `<B>%s<BR></B>`
|
orderFmt += `<B>%s<BR></B>`
|
||||||
@@ -208,13 +234,16 @@ func (c *PrinterHandler) GetPrinterStatus(ctx *jxcontext.Context, printerSN, pri
|
|||||||
return printerStatus, err
|
return printerStatus, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, order *model.GoodsOrder) (printerStatus *partner.PrinterStatus, err error) {
|
func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, storeDetail *dao.StoreDetail, order *model.GoodsOrder) (printerStatus *partner.PrinterStatus, err error) {
|
||||||
globals.SugarLogger.Debugf("feie PrintOrderByOrder orderID:%s, storeID:%d", order.VendorOrderID, store.ID)
|
globals.SugarLogger.Debugf("feie PrintOrderByOrder orderID:%s, storeID:%d", order.VendorOrderID, store.ID)
|
||||||
|
if len(order.Skus) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
content := ""
|
content := ""
|
||||||
if store.PrinterFontSize == partner.PrinterFontSizeBig {
|
if store.PrinterFontSize == partner.PrinterFontSizeBig {
|
||||||
content = c.getOrderContentBig(order, store.Tel1)
|
content = c.getOrderContentBig(order, store.Tel1, storeDetail)
|
||||||
} else {
|
} else {
|
||||||
content = c.getOrderContent(order, store.Tel1)
|
content = c.getOrderContent(order, store.Tel1, storeDetail)
|
||||||
}
|
}
|
||||||
return c.PrintMsg(ctx, store.PrinterSN, store.PrinterKey, order.VendorOrderID, content)
|
return c.PrintMsg(ctx, store.PrinterSN, store.PrinterKey, order.VendorOrderID, content)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/xiaowmapi"
|
"git.rosy.net.cn/baseapi/platformapi/xiaowmapi"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
@@ -28,7 +30,7 @@ func init() {
|
|||||||
partner.RegisterPrinterPlatform(CurPrinterHandler)
|
partner.RegisterPrinterPlatform(CurPrinterHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel string) (content string) {
|
func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel string, storeDetail *dao.StoreDetail) (content string) {
|
||||||
expectedDeliveryTime := order.ExpectedDeliveredTime
|
expectedDeliveryTime := order.ExpectedDeliveredTime
|
||||||
if utils.IsTimeZero(expectedDeliveryTime) {
|
if utils.IsTimeZero(expectedDeliveryTime) {
|
||||||
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
||||||
@@ -103,7 +105,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
return content
|
return content
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel string) (content string) {
|
func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel string, storeDetail *dao.StoreDetail) (content string) {
|
||||||
expectedDeliveryTime := order.ExpectedDeliveredTime
|
expectedDeliveryTime := order.ExpectedDeliveredTime
|
||||||
if utils.IsTimeZero(expectedDeliveryTime) {
|
if utils.IsTimeZero(expectedDeliveryTime) {
|
||||||
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
||||||
@@ -211,7 +213,7 @@ func (c *PrinterHandler) getOrderContent2(order *model.GoodsOrder, storeTel stri
|
|||||||
|5
|
|5
|
||||||
|5
|
|5
|
||||||
|5商品明细:
|
|5商品明细:
|
||||||
|5品名 数量 单价 小计
|
|5品名 数量
|
||||||
|5--------------------------------
|
|5--------------------------------
|
||||||
`
|
`
|
||||||
// |6实际支付: %s
|
// |6实际支付: %s
|
||||||
@@ -231,8 +233,9 @@ func (c *PrinterHandler) getOrderContent2(order *model.GoodsOrder, storeTel stri
|
|||||||
}
|
}
|
||||||
for _, sku := range order.Skus {
|
for _, sku := range order.Skus {
|
||||||
orderFmt += `|5%s`
|
orderFmt += `|5%s`
|
||||||
orderFmt += `|5%8s%10s%10s`
|
orderFmt += `|5%8s`
|
||||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||||
|
// jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||||
}
|
}
|
||||||
orderFmt += `
|
orderFmt += `
|
||||||
|5
|
|5
|
||||||
@@ -289,16 +292,16 @@ func (c *PrinterHandler) GetPrinterStatus(ctx *jxcontext.Context, printerNumber,
|
|||||||
return printerStatus, err
|
return printerStatus, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, order *model.GoodsOrder) (printerStatus *partner.PrinterStatus, err error) {
|
func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, storeDetail *dao.StoreDetail, order *model.GoodsOrder) (printerStatus *partner.PrinterStatus, err error) {
|
||||||
globals.SugarLogger.Debugf("xiaowm PrintOrderByOrder orderID:%s, storeID:%d", order.VendorOrderID, store.ID)
|
globals.SugarLogger.Debugf("xiaowm PrintOrderByOrder orderID:%s, storeID:%d", order.VendorOrderID, store.ID)
|
||||||
var content string
|
var content string
|
||||||
if isV500(store.PrinterSN) {
|
if isV500(store.PrinterSN) {
|
||||||
content = c.getOrderContent2(order, store.Tel1)
|
content = c.getOrderContent2(order, store.Tel1)
|
||||||
} else {
|
} else {
|
||||||
if store.PrinterFontSize == partner.PrinterFontSizeBig {
|
if store.PrinterFontSize == partner.PrinterFontSizeBig {
|
||||||
content = c.getOrderContentBig(order, store.Tel1)
|
content = c.getOrderContentBig(order, store.Tel1, storeDetail)
|
||||||
} else {
|
} else {
|
||||||
content = c.getOrderContent(order, store.Tel1)
|
content = c.getOrderContent(order, store.Tel1, storeDetail)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return c.PrintMsg(ctx, store.PrinterSN, store.PrinterKey, order.VendorOrderID, content)
|
return c.PrintMsg(ctx, store.PrinterSN, store.PrinterKey, order.VendorOrderID, content)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner"
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
"git.rosy.net.cn/jx-callback/globals/api"
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
@@ -27,7 +28,7 @@ func init() {
|
|||||||
partner.RegisterPrinterPlatform(CurPrinterHandler)
|
partner.RegisterPrinterPlatform(CurPrinterHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel string) (content string) {
|
func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel string, storeDetail *dao.StoreDetail) (content string) {
|
||||||
expectedDeliveryTime := order.ExpectedDeliveredTime
|
expectedDeliveryTime := order.ExpectedDeliveredTime
|
||||||
if utils.IsTimeZero(expectedDeliveryTime) {
|
if utils.IsTimeZero(expectedDeliveryTime) {
|
||||||
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
||||||
@@ -36,8 +37,21 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
if order.VendorID == model.VendorIDEBAI {
|
if order.VendorID == model.VendorIDEBAI {
|
||||||
getCode = fmt.Sprintf("<FS2>饿百取货码:%s</FS2>\\n\n", jxutils.GetEbaiOrderGetCode(order))
|
getCode = fmt.Sprintf("<FS2>饿百取货码:%s</FS2>\\n\n", jxutils.GetEbaiOrderGetCode(order))
|
||||||
}
|
}
|
||||||
orderFmt := `
|
orderParams := []interface{}{}
|
||||||
|
orderFmt := ``
|
||||||
|
if storeDetail != nil {
|
||||||
|
if storeDetail.BrandIsPrint == model.NO {
|
||||||
|
orderFmt += `
|
||||||
<FS2><center>%s</center></FS2>\n\n
|
<FS2><center>%s</center></FS2>\n\n
|
||||||
|
`
|
||||||
|
if order.VendorOrgCode == "34665" {
|
||||||
|
orderParams = append(orderParams, globals.StoreNameEbai2)
|
||||||
|
} else {
|
||||||
|
orderParams = append(orderParams, storeDetail.BrandName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
orderFmt += `
|
||||||
<center>手机买菜上京西</center>
|
<center>手机买菜上京西</center>
|
||||||
<center>极速到家送惊喜</center>\n
|
<center>极速到家送惊喜</center>\n
|
||||||
--------------------------------
|
--------------------------------
|
||||||
@@ -60,8 +74,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
品名 数量 单价 小计\n
|
品名 数量 单价 小计\n
|
||||||
--------------------------------\n`
|
--------------------------------\n`
|
||||||
// <FB>实际支付:</FB>%s\n
|
// <FB>实际支付:</FB>%s\n
|
||||||
orderParams := []interface{}{
|
orderParams = append(orderParams,
|
||||||
globals.StoreName,
|
|
||||||
utils.Time2Str(order.OrderCreatedAt),
|
utils.Time2Str(order.OrderCreatedAt),
|
||||||
utils.Time2Str(expectedDeliveryTime),
|
utils.Time2Str(expectedDeliveryTime),
|
||||||
order.VendorOrderID,
|
order.VendorOrderID,
|
||||||
@@ -73,7 +86,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
order.ConsigneeAddress,
|
order.ConsigneeAddress,
|
||||||
order.BuyerComment,
|
order.BuyerComment,
|
||||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||||
}
|
)
|
||||||
|
|
||||||
for _, sku := range order.Skus {
|
for _, sku := range order.Skus {
|
||||||
orderFmt += `%s\n`
|
orderFmt += `%s\n`
|
||||||
@@ -95,7 +108,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
return strings.Replace(fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...), "\\n", "\r\n", -1)
|
return strings.Replace(fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...), "\\n", "\r\n", -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel string) (content string) {
|
func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel string, storeDetail *dao.StoreDetail) (content string) {
|
||||||
expectedDeliveryTime := order.ExpectedDeliveredTime
|
expectedDeliveryTime := order.ExpectedDeliveredTime
|
||||||
if utils.IsTimeZero(expectedDeliveryTime) {
|
if utils.IsTimeZero(expectedDeliveryTime) {
|
||||||
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
||||||
@@ -104,8 +117,21 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
if order.VendorID == model.VendorIDEBAI {
|
if order.VendorID == model.VendorIDEBAI {
|
||||||
getCode = fmt.Sprintf("<FS2>饿百取货码:%s</FS2>\\n\n", jxutils.GetEbaiOrderGetCode(order))
|
getCode = fmt.Sprintf("<FS2>饿百取货码:%s</FS2>\\n\n", jxutils.GetEbaiOrderGetCode(order))
|
||||||
}
|
}
|
||||||
orderFmt := `
|
orderParams := []interface{}{}
|
||||||
|
orderFmt := ``
|
||||||
|
if storeDetail != nil {
|
||||||
|
if storeDetail.BrandIsPrint == model.NO {
|
||||||
|
orderFmt += `
|
||||||
<FS2><center>%s</center></FS2>\n\n
|
<FS2><center>%s</center></FS2>\n\n
|
||||||
|
`
|
||||||
|
if order.VendorOrgCode == "34665" {
|
||||||
|
orderParams = append(orderParams, globals.StoreNameEbai2)
|
||||||
|
} else {
|
||||||
|
orderParams = append(orderParams, storeDetail.BrandName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
orderFmt += `
|
||||||
<center>手机买菜上京西</center>
|
<center>手机买菜上京西</center>
|
||||||
<center>极速到家送惊喜</center>\n
|
<center>极速到家送惊喜</center>\n
|
||||||
--------------------------------
|
--------------------------------
|
||||||
@@ -128,8 +154,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
<FS2>品名数量单价小计\n</FS2>
|
<FS2>品名数量单价小计\n</FS2>
|
||||||
--------------------------------\n`
|
--------------------------------\n`
|
||||||
// <FS2><FB>实际支付:</FB>%s\n</FS2>
|
// <FS2><FB>实际支付:</FB>%s\n</FS2>
|
||||||
orderParams := []interface{}{
|
orderParams = append(orderParams,
|
||||||
globals.StoreName,
|
|
||||||
utils.Time2Str(order.OrderCreatedAt),
|
utils.Time2Str(order.OrderCreatedAt),
|
||||||
utils.Time2Str(expectedDeliveryTime),
|
utils.Time2Str(expectedDeliveryTime),
|
||||||
order.VendorOrderID,
|
order.VendorOrderID,
|
||||||
@@ -141,7 +166,7 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
order.ConsigneeAddress,
|
order.ConsigneeAddress,
|
||||||
order.BuyerComment,
|
order.BuyerComment,
|
||||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||||
}
|
)
|
||||||
|
|
||||||
for _, sku := range order.Skus {
|
for _, sku := range order.Skus {
|
||||||
orderFmt += `<FS2>%s\n</FS2>`
|
orderFmt += `<FS2>%s\n</FS2>`
|
||||||
@@ -201,13 +226,16 @@ func (c *PrinterHandler) GetPrinterStatus(ctx *jxcontext.Context, machineCode, p
|
|||||||
return printerStatus, err
|
return printerStatus, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, order *model.GoodsOrder) (printerStatus *partner.PrinterStatus, err error) {
|
func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, storeDetail *dao.StoreDetail, order *model.GoodsOrder) (printerStatus *partner.PrinterStatus, err error) {
|
||||||
globals.SugarLogger.Debugf("yilianyun PrintOrderByOrder orderID:%s, storeID:%d", order.VendorOrderID, store.ID)
|
globals.SugarLogger.Debugf("yilianyun PrintOrderByOrder orderID:%s, storeID:%d", order.VendorOrderID, store.ID)
|
||||||
|
if len(order.Skus) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
content := ""
|
content := ""
|
||||||
if store.PrinterFontSize == partner.PrinterFontSizeBig {
|
if store.PrinterFontSize == partner.PrinterFontSizeBig {
|
||||||
content = c.getOrderContentBig(order, store.Tel1)
|
content = c.getOrderContentBig(order, store.Tel1, storeDetail)
|
||||||
} else {
|
} else {
|
||||||
content = c.getOrderContent(order, store.Tel1)
|
content = c.getOrderContent(order, store.Tel1, storeDetail)
|
||||||
}
|
}
|
||||||
return c.PrintMsg(ctx, store.PrinterSN, store.PrinterKey, order.VendorOrderID, content)
|
return c.PrintMsg(ctx, store.PrinterSN, store.PrinterKey, order.VendorOrderID, content)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner"
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
"git.rosy.net.cn/jx-callback/globals/api"
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
@@ -28,7 +29,7 @@ func init() {
|
|||||||
partner.RegisterPrinterPlatform(CurPrinterHandler)
|
partner.RegisterPrinterPlatform(CurPrinterHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel string) (content string) {
|
func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel string, storeDetail *dao.StoreDetail) (content string) {
|
||||||
expectedDeliveryTime := order.ExpectedDeliveredTime
|
expectedDeliveryTime := order.ExpectedDeliveredTime
|
||||||
if utils.IsTimeZero(expectedDeliveryTime) {
|
if utils.IsTimeZero(expectedDeliveryTime) {
|
||||||
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
||||||
@@ -37,8 +38,21 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
if order.VendorID == model.VendorIDEBAI {
|
if order.VendorID == model.VendorIDEBAI {
|
||||||
getCode = fmt.Sprintf("<S2>饿百取货码:%s</S2><RN>\n", jxutils.GetEbaiOrderGetCode(order))
|
getCode = fmt.Sprintf("<S2>饿百取货码:%s</S2><RN>\n", jxutils.GetEbaiOrderGetCode(order))
|
||||||
}
|
}
|
||||||
orderFmt := `
|
orderParams := []interface{}{}
|
||||||
|
orderFmt := ``
|
||||||
|
if storeDetail != nil {
|
||||||
|
if storeDetail.BrandIsPrint == model.NO {
|
||||||
|
orderFmt += `
|
||||||
<S2><C>%s</C></S2><RN><RN>
|
<S2><C>%s</C></S2><RN><RN>
|
||||||
|
`
|
||||||
|
if order.VendorOrgCode == "34665" {
|
||||||
|
orderParams = append(orderParams, globals.StoreNameEbai2)
|
||||||
|
} else {
|
||||||
|
orderParams = append(orderParams, storeDetail.BrandName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
orderFmt += `
|
||||||
<C>手机买菜上京西</C>
|
<C>手机买菜上京西</C>
|
||||||
<C>极速到家送惊喜</C><RN>
|
<C>极速到家送惊喜</C><RN>
|
||||||
********************************
|
********************************
|
||||||
@@ -58,11 +72,10 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
<RN>
|
<RN>
|
||||||
<RN>
|
<RN>
|
||||||
商品明细: <RN>
|
商品明细: <RN>
|
||||||
品名 数量 单价 小计<RN>
|
品名 数量 <RN>
|
||||||
********************************<RN>`
|
********************************<RN>`
|
||||||
// <B1>实际支付:</B1>%s<RN>
|
// <B1>实际支付:</B1>%s<RN>
|
||||||
orderParams := []interface{}{
|
orderParams = append(orderParams,
|
||||||
globals.StoreName,
|
|
||||||
utils.Time2Str(order.OrderCreatedAt),
|
utils.Time2Str(order.OrderCreatedAt),
|
||||||
utils.Time2Str(expectedDeliveryTime),
|
utils.Time2Str(expectedDeliveryTime),
|
||||||
order.VendorOrderID,
|
order.VendorOrderID,
|
||||||
@@ -74,12 +87,13 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
order.ConsigneeAddress,
|
order.ConsigneeAddress,
|
||||||
order.BuyerComment,
|
order.BuyerComment,
|
||||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||||
}
|
)
|
||||||
|
|
||||||
for _, sku := range order.Skus {
|
for _, sku := range order.Skus {
|
||||||
orderFmt += `%s<RN>`
|
orderFmt += `%s<RN>`
|
||||||
orderFmt += `%8s%10s%10s<RN>`
|
orderFmt += `%8s<RN>`
|
||||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||||
|
//jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||||
}
|
}
|
||||||
orderFmt += `<RN>
|
orderFmt += `<RN>
|
||||||
<B1>共%d种%d件商品</B1>
|
<B1>共%d种%d件商品</B1>
|
||||||
@@ -96,7 +110,7 @@ func (c *PrinterHandler) getOrderContent(order *model.GoodsOrder, storeTel strin
|
|||||||
return fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...)
|
return fmt.Sprintf(strings.Replace(orderFmt, "\n", "", -1), orderParams...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel string) (content string) {
|
func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel string, storeDetail *dao.StoreDetail) (content string) {
|
||||||
expectedDeliveryTime := order.ExpectedDeliveredTime
|
expectedDeliveryTime := order.ExpectedDeliveredTime
|
||||||
if utils.IsTimeZero(expectedDeliveryTime) {
|
if utils.IsTimeZero(expectedDeliveryTime) {
|
||||||
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
expectedDeliveryTime = order.OrderCreatedAt.Add(1 * time.Hour)
|
||||||
@@ -105,8 +119,19 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
if order.VendorID == model.VendorIDEBAI {
|
if order.VendorID == model.VendorIDEBAI {
|
||||||
getCode = fmt.Sprintf("<S2>饿百取货码:%s</S2><RN>\n", jxutils.GetEbaiOrderGetCode(order))
|
getCode = fmt.Sprintf("<S2>饿百取货码:%s</S2><RN>\n", jxutils.GetEbaiOrderGetCode(order))
|
||||||
}
|
}
|
||||||
orderFmt := `
|
orderParams := []interface{}{}
|
||||||
|
orderFmt := ``
|
||||||
|
if storeDetail.BrandIsPrint == model.NO {
|
||||||
|
orderFmt += `
|
||||||
<S2><C>%s</C></S2><RN><RN>
|
<S2><C>%s</C></S2><RN><RN>
|
||||||
|
`
|
||||||
|
if order.VendorOrgCode == "34665" {
|
||||||
|
orderParams = append(orderParams, globals.StoreNameEbai2)
|
||||||
|
} else {
|
||||||
|
orderParams = append(orderParams, storeDetail.BrandName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
orderFmt += `
|
||||||
<C>手机买菜上京西</C>
|
<C>手机买菜上京西</C>
|
||||||
<C>极速到家送惊喜</C><RN>
|
<C>极速到家送惊喜</C><RN>
|
||||||
********************************
|
********************************
|
||||||
@@ -126,11 +151,10 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
<RN>
|
<RN>
|
||||||
<RN>
|
<RN>
|
||||||
<S2>商品明细: <RN></S2>
|
<S2>商品明细: <RN></S2>
|
||||||
<S2>品名数量单价小计<RN></S2>
|
<S2>品名 数量<RN></S2>
|
||||||
********************************<RN>`
|
********************************<RN>`
|
||||||
// <S2><B1>实际支付:</B1>%s<RN></S2>
|
// <S2><B1>实际支付:</B1>%s<RN></S2>
|
||||||
orderParams := []interface{}{
|
orderParams = append(orderParams,
|
||||||
globals.StoreName,
|
|
||||||
utils.Time2Str(order.OrderCreatedAt),
|
utils.Time2Str(order.OrderCreatedAt),
|
||||||
utils.Time2Str(expectedDeliveryTime),
|
utils.Time2Str(expectedDeliveryTime),
|
||||||
order.VendorOrderID,
|
order.VendorOrderID,
|
||||||
@@ -142,12 +166,13 @@ func (c *PrinterHandler) getOrderContentBig(order *model.GoodsOrder, storeTel st
|
|||||||
order.ConsigneeAddress,
|
order.ConsigneeAddress,
|
||||||
order.BuyerComment,
|
order.BuyerComment,
|
||||||
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
// jxutils.IntPrice2StandardCurrencyString(order.ActualPayPrice),
|
||||||
}
|
)
|
||||||
|
|
||||||
for _, sku := range order.Skus {
|
for _, sku := range order.Skus {
|
||||||
orderFmt += `<S2>%s<RN></S2>`
|
orderFmt += `<S2>%s<RN></S2>`
|
||||||
orderFmt += `<S2>%s %s %s<RN><RN></S2>`
|
orderFmt += `<S2>%s<RN><RN></S2>`
|
||||||
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count)))
|
orderParams = append(orderParams, sku.SkuName, "x"+utils.Int2Str(sku.Count))
|
||||||
|
//jxutils.IntPrice2StandardCurrencyString(sku.SalePrice), jxutils.IntPrice2StandardCurrencyString(sku.SalePrice*int64(sku.Count))
|
||||||
}
|
}
|
||||||
orderFmt += `<RN>
|
orderFmt += `<RN>
|
||||||
<S2><B1>共%d种%d件商品</B1></S2>
|
<S2><B1>共%d种%d件商品</B1></S2>
|
||||||
@@ -194,13 +219,13 @@ func (c *PrinterHandler) GetPrinterStatus(ctx *jxcontext.Context, deviceID, devi
|
|||||||
return printerStatus, err
|
return printerStatus, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, order *model.GoodsOrder) (printerStatus *partner.PrinterStatus, err error) {
|
func (c *PrinterHandler) PrintOrder(ctx *jxcontext.Context, store *model.Store, storeDetail *dao.StoreDetail, order *model.GoodsOrder) (printerStatus *partner.PrinterStatus, err error) {
|
||||||
globals.SugarLogger.Debugf("zhongwu PrintOrderByOrder orderID:%s, storeID:%d", order.VendorOrderID, store.ID)
|
globals.SugarLogger.Debugf("zhongwu PrintOrderByOrder orderID:%s, storeID:%d", order.VendorOrderID, store.ID)
|
||||||
content := ""
|
content := ""
|
||||||
if store.PrinterFontSize == partner.PrinterFontSizeBig {
|
if store.PrinterFontSize == partner.PrinterFontSizeBig {
|
||||||
content = c.getOrderContentBig(order, store.Tel1)
|
content = c.getOrderContentBig(order, store.Tel1, storeDetail)
|
||||||
} else {
|
} else {
|
||||||
content = c.getOrderContent(order, store.Tel1)
|
content = c.getOrderContent(order, store.Tel1, storeDetail)
|
||||||
}
|
}
|
||||||
return c.PrintMsg(ctx, store.PrinterSN, store.PrinterKey, order.VendorOrderID, content)
|
return c.PrintMsg(ctx, store.PrinterSN, store.PrinterKey, order.VendorOrderID, content)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ func act2EbaiActivity(act *model.Act2, actOrderRules []*model.ActOrderRule) (act
|
|||||||
ActivityDesc: act.Advertising,
|
ActivityDesc: act.Advertising,
|
||||||
ShowCategory: model.ActTypeName[act.Type],
|
ShowCategory: model.ActTypeName[act.Type],
|
||||||
PromotionSkuDesc: utils.LimitMixedStringLen(act.Advertising, ebaiapi.MaxActivityDescLength),
|
PromotionSkuDesc: utils.LimitMixedStringLen(act.Advertising, ebaiapi.MaxActivityDescLength),
|
||||||
DayLimit: act.LimitDaily,
|
DayLimit: 1,
|
||||||
ActivityPlatform: ebaiapi.ActivityPFAll,
|
ActivityPlatform: ebaiapi.ActivityPFAll,
|
||||||
}
|
}
|
||||||
if act.LimitCount > 0 {
|
if act.LimitCount > 0 {
|
||||||
|
|||||||
@@ -13,6 +13,22 @@ import (
|
|||||||
"git.rosy.net.cn/jx-callback/globals/api"
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
EbaiSupplierIDsc = "1921188187760"
|
||||||
|
EbaiSupplierIDc4 = "22267134648"
|
||||||
|
EbaiSupplierIDhc = "2233065879"
|
||||||
|
EbaiSupplierIDgy = "2267230126"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
EbaiSupplierIDMap = map[string]string{
|
||||||
|
EbaiSupplierIDsc: "饿百商超",
|
||||||
|
EbaiSupplierIDc4: "饿百菜市",
|
||||||
|
EbaiSupplierIDhc: "饿百好菜",
|
||||||
|
EbaiSupplierIDgy: "饿百果园",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
CurPurchaseHandler *PurchaseHandler
|
CurPurchaseHandler *PurchaseHandler
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,9 +6,10 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/autonavi"
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/ebaiapi"
|
"git.rosy.net.cn/baseapi/platformapi/ebaiapi"
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
|
||||||
@@ -24,7 +25,7 @@ import (
|
|||||||
const (
|
const (
|
||||||
// acceptOrderDelay = 180 * time.Second
|
// acceptOrderDelay = 180 * time.Second
|
||||||
// pickupOrderDelay = 260 * time.Second
|
// pickupOrderDelay = 260 * time.Second
|
||||||
pickupOrderDelay = 1 * time.Second
|
pickupOrderDelay = 1 * time.Minute
|
||||||
|
|
||||||
callDeliveryDelay = 10 * time.Minute
|
callDeliveryDelay = 10 * time.Minute
|
||||||
callDeliveryDelayGap = 30
|
callDeliveryDelayGap = 30
|
||||||
@@ -38,8 +39,8 @@ const (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
VendorStatus2StatusMap = map[string]int{
|
VendorStatus2StatusMap = map[string]int{
|
||||||
ebaiapi.CmdOrderCreate: model.OrderStatusNew,
|
ebaiapi.CmdOrderCreate: model.OrderStatusWaitAccepted,
|
||||||
ebaiapi.OrderStatusNew: model.OrderStatusNew,
|
ebaiapi.OrderStatusNew: model.OrderStatusWaitAccepted,
|
||||||
fakeAcceptOrder: model.OrderStatusAccepted,
|
fakeAcceptOrder: model.OrderStatusAccepted,
|
||||||
ebaiapi.OrderStatusAccepted: model.OrderStatusFinishedPickup,
|
ebaiapi.OrderStatusAccepted: model.OrderStatusFinishedPickup,
|
||||||
ebaiapi.OrderStatusCourierAccepted: model.OrderStatusDelivering,
|
ebaiapi.OrderStatusCourierAccepted: model.OrderStatusDelivering,
|
||||||
@@ -80,7 +81,7 @@ func (p *PurchaseHandler) getStatusFromVendorStatus(vendorStatus string) int {
|
|||||||
return model.OrderStatusUnknown
|
return model.OrderStatusUnknown
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID string) (order *model.GoodsOrder, err error) {
|
func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID, vendorStoreID string) (order *model.GoodsOrder, err error) {
|
||||||
order, _, err = p.getOrder(vendorOrderID)
|
order, _, err = p.getOrder(vendorOrderID)
|
||||||
return order, err
|
return order, err
|
||||||
}
|
}
|
||||||
@@ -134,6 +135,7 @@ func (p *PurchaseHandler) GetOrder4PartRefund(vendorOrderID string) (order *mode
|
|||||||
order.DiscountMoney = discountMoney
|
order.DiscountMoney = discountMoney
|
||||||
order.Skus = append(order.Skus, giftSkus...)
|
order.Skus = append(order.Skus, giftSkus...)
|
||||||
order.ActualPayPrice = utils.MustInterface2Int64(result2["user_fee"])
|
order.ActualPayPrice = utils.MustInterface2Int64(result2["user_fee"])
|
||||||
|
order.TotalShopMoney = utils.MustInterface2Int64(result2["shop_fee"])
|
||||||
jxutils.RefreshOrderSkuRelated(order)
|
jxutils.RefreshOrderSkuRelated(order)
|
||||||
} else if err2Ext, ok := err2.(*utils.ErrorWithCode); !ok || err2Ext.IntCode() != ebaiapi.ErrOrderIsNotPartRefund {
|
} else if err2Ext, ok := err2.(*utils.ErrorWithCode); !ok || err2Ext.IntCode() != ebaiapi.ErrOrderIsNotPartRefund {
|
||||||
err = err2
|
err = err2
|
||||||
@@ -217,7 +219,7 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo
|
|||||||
ConsigneeName: utils.Interface2String(userMap["name"]),
|
ConsigneeName: utils.Interface2String(userMap["name"]),
|
||||||
ConsigneeMobile: jxutils.FormalizeMobile(utils.Interface2String(userMap["phone"])),
|
ConsigneeMobile: jxutils.FormalizeMobile(utils.Interface2String(userMap["phone"])),
|
||||||
ConsigneeAddress: utils.Interface2String(userMap["address"]),
|
ConsigneeAddress: utils.Interface2String(userMap["address"]),
|
||||||
CoordinateType: model.CoordinateTypeBaiDu,
|
CoordinateType: model.CoordinateTypeMars,
|
||||||
BuyerComment: utils.TrimBlankChar(utils.Interface2String(orderMap["remark"])),
|
BuyerComment: utils.TrimBlankChar(utils.Interface2String(orderMap["remark"])),
|
||||||
ExpectedDeliveredTime: getExpectedDeliveredTime(orderMap),
|
ExpectedDeliveredTime: getExpectedDeliveredTime(orderMap),
|
||||||
PickDeadline: utils.DefaultTimeValue,
|
PickDeadline: utils.DefaultTimeValue,
|
||||||
@@ -268,12 +270,12 @@ func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *mo
|
|||||||
deliveryGeo := userMap["coord_amap"].(map[string]interface{})
|
deliveryGeo := userMap["coord_amap"].(map[string]interface{})
|
||||||
originalLng := utils.Interface2Float64WithDefault(deliveryGeo["longitude"], 0.0) // 饿百的订单在过一段时间后,经纬度信息会变成字符串"**"
|
originalLng := utils.Interface2Float64WithDefault(deliveryGeo["longitude"], 0.0) // 饿百的订单在过一段时间后,经纬度信息会变成字符串"**"
|
||||||
originalLat := utils.Interface2Float64WithDefault(deliveryGeo["latitude"], 0.0)
|
originalLat := utils.Interface2Float64WithDefault(deliveryGeo["latitude"], 0.0)
|
||||||
lng, lat, err2 := api.AutonaviAPI.CoordinateConvert(originalLng, originalLat, autonavi.CoordSysBaidu)
|
// lng, lat, err2 := api.AutonaviAPI.CoordinateConvert(originalLng, originalLat, autonavi.CoordSysBaidu)
|
||||||
if err2 == nil {
|
// if err2 == nil {
|
||||||
originalLng = lng
|
// originalLng = lng
|
||||||
originalLat = lat
|
// originalLat = lat
|
||||||
order.CoordinateType = model.CoordinateTypeMars
|
// order.CoordinateType = model.CoordinateTypeMars
|
||||||
}
|
// }
|
||||||
order.ConsigneeLng = jxutils.StandardCoordinate2Int(originalLng)
|
order.ConsigneeLng = jxutils.StandardCoordinate2Int(originalLng)
|
||||||
order.ConsigneeLat = jxutils.StandardCoordinate2Int(originalLat)
|
order.ConsigneeLat = jxutils.StandardCoordinate2Int(originalLat)
|
||||||
|
|
||||||
@@ -340,6 +342,18 @@ func getSkuSalePrice2(product *ebaiapi.OrderProductInfo) (salePrice, baiduRate i
|
|||||||
func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
|
func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
|
||||||
globals.SugarLogger.Debugf("ebai AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt)
|
globals.SugarLogger.Debugf("ebai AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt)
|
||||||
if isAcceptIt {
|
if isAcceptIt {
|
||||||
|
if globals.EnableEbaiStoreWrite {
|
||||||
|
err = api.EbaiAPI.OrderConfirm(order.VendorOrderID)
|
||||||
|
if beego.BConfig.RunMode == "jxgy" {
|
||||||
|
utils.AfterFuncWithRecover(time.Minute*10, func() {
|
||||||
|
err = api.EbaiAPI.OrderPickComplete(order.VendorOrderID)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
utils.AfterFuncWithRecover(time.Minute, func() {
|
||||||
|
err = api.EbaiAPI.OrderPickComplete(order.VendorOrderID)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
p.postFakeMsg(order.VendorOrderID, fakeAcceptOrder)
|
p.postFakeMsg(order.VendorOrderID, fakeAcceptOrder)
|
||||||
} else {
|
} else {
|
||||||
if globals.EnableEbaiStoreWrite {
|
if globals.EnableEbaiStoreWrite {
|
||||||
@@ -352,8 +366,9 @@ func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI
|
|||||||
func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
|
||||||
globals.SugarLogger.Debugf("ebai PickupGoods orderID:%s, isSelfDelivery:%t", order.VendorOrderID, isSelfDelivery)
|
globals.SugarLogger.Debugf("ebai PickupGoods orderID:%s, isSelfDelivery:%t", order.VendorOrderID, isSelfDelivery)
|
||||||
if globals.EnableEbaiStoreWrite {
|
if globals.EnableEbaiStoreWrite {
|
||||||
err = api.EbaiAPI.OrderConfirm(order.VendorOrderID)
|
// err = api.EbaiAPI.OrderPickComplete(order.VendorOrderID)
|
||||||
} else {
|
}
|
||||||
|
if err == nil {
|
||||||
p.postFakeMsg(order.VendorOrderID, ebaiapi.OrderStatusAccepted)
|
p.postFakeMsg(order.VendorOrderID, ebaiapi.OrderStatusAccepted)
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
@@ -460,7 +475,7 @@ func (c *PurchaseHandler) onOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaiapi.
|
|||||||
if status.Status == model.OrderStatusDelivering || status.Status == model.OrderStatusFinished {
|
if status.Status == model.OrderStatusDelivering || status.Status == model.OrderStatusFinished {
|
||||||
if order, err2 := partner.CurOrderManager.LoadOrder(status.VendorOrderID, status.VendorID); err2 == nil {
|
if order, err2 := partner.CurOrderManager.LoadOrder(status.VendorOrderID, status.VendorID); err2 == nil {
|
||||||
if order.TotalShopMoney == 0 {
|
if order.TotalShopMoney == 0 {
|
||||||
if order2, err2 := c.GetOrder(msg.Source, status.VendorOrderID); err2 == nil {
|
if order2, err2 := c.GetOrder(msg.Source, status.VendorOrderID, ""); err2 == nil {
|
||||||
order.TotalShopMoney = order2.TotalShopMoney
|
order.TotalShopMoney = order2.TotalShopMoney
|
||||||
order.PmSubsidyMoney = order2.PmSubsidyMoney
|
order.PmSubsidyMoney = order2.PmSubsidyMoney
|
||||||
partner.CurOrderManager.UpdateOrderFields(order, []string{"TotalShopMoney", "PmSubsidyMoney"})
|
partner.CurOrderManager.UpdateOrderFields(order, []string{"TotalShopMoney", "PmSubsidyMoney"})
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ var (
|
|||||||
func (c *PurchaseHandler) isAfsMsg(msg *ebaiapi.CallbackMsg) bool {
|
func (c *PurchaseHandler) isAfsMsg(msg *ebaiapi.CallbackMsg) bool {
|
||||||
if msg.Cmd == ebaiapi.CmdOrderPartRefund {
|
if msg.Cmd == ebaiapi.CmdOrderPartRefund {
|
||||||
msgType := int(utils.MustInterface2Int64(msg.Body["type"]))
|
msgType := int(utils.MustInterface2Int64(msg.Body["type"]))
|
||||||
return msgType == ebaiapi.OrderPartRefuncTypeCustomer
|
return msgType == ebaiapi.OrderPartRefuncTypeCustomer || msgType == ebaiapi.OrderPartRefuncTypeCS
|
||||||
} else if msg.Cmd == ebaiapi.CmdOrderUserCancel {
|
} else if msg.Cmd == ebaiapi.CmdOrderUserCancel {
|
||||||
cancelType := int(utils.MustInterface2Int64(msg.Body["cancel_type"]))
|
cancelType := int(utils.MustInterface2Int64(msg.Body["cancel_type"]))
|
||||||
return cancelType == ebaiapi.OrderUserCancelTypeAfterSale
|
return cancelType == ebaiapi.OrderUserCancelTypeAfterSale
|
||||||
@@ -118,9 +118,45 @@ func (c *PurchaseHandler) onAfsOrderMsg(msg *ebaiapi.CallbackMsg) (retVal *ebaia
|
|||||||
if afsOrder != nil {
|
if afsOrder != nil {
|
||||||
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
if afsOrder2, err := partner.CurOrderManager.LoadAfsOrder(orderStatus.VendorOrderID, orderStatus.VendorID); afsOrder2 == nil && err == nil {
|
||||||
|
partRefundData := msg.Data.(*ebaiapi.CBPartRefundInfo)
|
||||||
|
afsOrder := &model.AfsOrder{
|
||||||
|
VendorID: model.VendorIDEBAI,
|
||||||
|
AfsOrderID: orderStatus.VendorOrderID,
|
||||||
|
VendorOrderID: orderStatus.RefVendorOrderID,
|
||||||
|
VendorStoreID: "",
|
||||||
|
StoreID: 0,
|
||||||
|
AfsCreatedAt: utils.Timestamp2Time(msg.Timestamp),
|
||||||
|
VendorAppealType: "",
|
||||||
|
AppealType: model.AfsAppealTypeRefund,
|
||||||
|
VendorReasonType: partRefundData.ReasonType,
|
||||||
|
ReasonType: c.convertAfsReasonType(partRefundData.ReasonType),
|
||||||
|
ReasonDesc: utils.LimitUTF8StringLen(buildFullReason(partRefundData.Reason, partRefundData.AdditionReason), 1024),
|
||||||
|
ReasonImgList: utils.LimitUTF8StringLen(strings.Join(partRefundData.Photos, ","), 1024),
|
||||||
|
RefundType: model.AfsTypePartRefund,
|
||||||
|
VendorOrgCode: msg.Source,
|
||||||
|
}
|
||||||
|
for _, sku := range partRefundData.RefundProducts {
|
||||||
|
orderSku := &model.OrderSkuFinancial{
|
||||||
|
Count: sku.Number,
|
||||||
|
VendorSkuID: sku.SkuID,
|
||||||
|
SkuID: int(utils.Str2Int64WithDefault(sku.CustomSkuID, 0)),
|
||||||
|
Name: sku.Name,
|
||||||
|
UserMoney: sku.TotalRefund,
|
||||||
|
PmSkuSubsidyMoney: sku.ShopEleRefund,
|
||||||
|
}
|
||||||
|
afsOrder.SkuUserMoney += orderSku.UserMoney
|
||||||
|
afsOrder.PmSubsidyMoney += orderSku.PmSubsidyMoney
|
||||||
|
afsOrder.Skus = append(afsOrder.Skus, orderSku)
|
||||||
|
}
|
||||||
|
if afsOrder != nil {
|
||||||
|
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
|
err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
retVal = api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, nil)
|
retVal = api.EbaiAPI.Err2CallbackResponse(msg.Cmd, err, nil)
|
||||||
}
|
}
|
||||||
return retVal
|
return retVal
|
||||||
@@ -204,10 +240,24 @@ func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, ord
|
|||||||
|
|
||||||
// 发起全款退款
|
// 发起全款退款
|
||||||
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
func (c *PurchaseHandler) RefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
|
||||||
return fmt.Errorf("%s不支持售后全额退款,请让买家发起退款", model.VendorChineseNames[model.VendorIDEBAI])
|
return c.PartRefundOrder(ctx, order, order.Skus, reason)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发起部分退款
|
// 发起部分退款
|
||||||
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
func (c *PurchaseHandler) PartRefundOrder(ctx *jxcontext.Context, order *model.GoodsOrder, refundSkuList []*model.OrderSku, reason string) (err error) {
|
||||||
return fmt.Errorf("%s不支持售后部分退款,请让买家发起退款", model.VendorChineseNames[model.VendorIDEBAI])
|
if globals.EnableEbaiStoreWrite {
|
||||||
|
err = api.EbaiAPI.OrderPartRefund(order.VendorOrderID, orderSkus2AfsSkus(refundSkuList))
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func orderSkus2AfsSkus(refundSkuList []*model.OrderSku) (removeSkuList []*ebaiapi.RefundSku) {
|
||||||
|
for _, v := range refundSkuList {
|
||||||
|
refundSku := &ebaiapi.RefundSku{
|
||||||
|
CustomeSkuID: utils.Int2Str(v.SkuID),
|
||||||
|
Number: utils.Int2Str(v.Count),
|
||||||
|
}
|
||||||
|
removeSkuList = append(removeSkuList, refundSku)
|
||||||
|
}
|
||||||
|
return removeSkuList
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user