Merge remote-tracking branch 'origin/mark'

This commit is contained in:
苏尹岚
2021-03-04 11:34:50 +08:00
158 changed files with 17929 additions and 2457 deletions

View File

@@ -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 {

View File

@@ -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
} }

View File

@@ -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
} }

View File

@@ -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
} }

View File

@@ -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

View File

@@ -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
} }
} }

View File

@@ -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
} }
} }

View File

@@ -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() {

View File

@@ -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

View File

@@ -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)

View File

@@ -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
} }

View File

@@ -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
}

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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)
// 以下是运单 // 以下是运单

View File

@@ -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
}

View File

@@ -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
} }

View File

@@ -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)

View File

@@ -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

View 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

View File

@@ -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.过滤所有门店信息只留下传进来的vendorMapstoreIDMap中对应的平台和门台信息 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
}

View File

@@ -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)
}

View File

@@ -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,

View File

@@ -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 { if len(addList) > 0 {
task := tasksch.NewParallelTask("同步门店商品", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError), ctx, for _, v := range addList {
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { skuBindInfos2 = append(skuBindInfos2, buildStoreSkuBindInfo(db, storeMap.StoreID, v, true))
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) UpdateStoresSkusByBind(ctx, parentTask, skuBindInfos2, isAsync, isContinueWhenError, false)
} }
} return err
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) { func buildStoreSkuBindInfo(db *dao.DaoDB, storeID int, storeBind *dao.StoreSkuSyncInfo, isFocus bool) (skuBindInfo *StoreSkuBindInfo) {
result, err := dao.GetSkus(db, []int{storeBind.SkuID}, nil, nil, nil, nil)
if err != nil || len(result) == 0 {
return nil
}
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")
}

View File

@@ -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) &&
@@ -88,7 +96,7 @@ func SyncCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorIDs
db := dao.GetDB() db := dao.GetDB()
catList, err := dao.GetSkuCategoryWithVendor(db, vendorIDs, appOrgCodes, -1, catIDs, true) catList, err := dao.GetSkuCategoryWithVendor(db, vendorIDs, appOrgCodes, -1, catIDs, true)
if err == nil && len(catList) > 0 { if err == nil && len(catList) > 0 {
// TODO 同一平台不同账号会有影响needSyncParentIDs暂不处理 //TODO 同一平台不同账号会有影响needSyncParentIDs暂不处理
var needSyncParentIDs []int var needSyncParentIDs []int
for _, cat := range catList { for _, cat := range catList {
if cat.Level == 2 && cat.ParentVendorCatID == "" && cat.IsExdSpec == model.NO { if cat.Level == 2 && cat.ParentVendorCatID == "" && cat.IsExdSpec == model.NO {
@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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
} }

View File

@@ -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
}

View 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
}

View File

@@ -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)
} }

View File

@@ -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) {

View File

@@ -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

View 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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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)
} }

View File

@@ -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)
} }
} }

View File

@@ -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)
}

View File

@@ -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)

View File

@@ -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")
} }

View File

@@ -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
}

View File

@@ -488,7 +488,7 @@ func GuessVendorIDFromVendorStoreID(vendorStoreID int64) (vendorID int) {
vendorID = model.VendorIDJD vendorID = model.VendorIDJD
} else if vendorStoreID > 1234567 && vendorStoreID < 9876543 { // 美团外卖 24617137位 } else if vendorStoreID > 1234567 && vendorStoreID < 9876543 { // 美团外卖 24617137位
vendorID = model.VendorIDMTWM vendorID = model.VendorIDMTWM
} else if vendorStoreID > 1234567890 && vendorStoreID < 99876543210 { // 饿百 216700260710位11 } else if vendorStoreID > 1234567890 && vendorStoreID < 998765432109 { // 饿百 216700260710位12
vendorID = model.VendorIDEBAI vendorID = model.VendorIDEBAI
} else if false { //vendorStoreID > 123456789 && vendorStoreID < 987654321 { // 微盟微商城 1320910489位 } else if false { //vendorStoreID > 123456789 && vendorStoreID < 987654321 { // 微盟微商城 1320910489位
// vendorID = model.VendorIDWSC // vendorID = model.VendorIDWSC

View File

@@ -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)
} }

View File

@@ -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

View File

@@ -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{}{

View File

@@ -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)

View 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
}

View File

@@ -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
}

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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: "外卖管家",

View File

@@ -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 {

View File

@@ -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 = ?)

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View 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
}

View File

@@ -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
}

View File

@@ -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,

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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)
} }

View File

@@ -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 {

View File

@@ -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"},
}
}

View File

@@ -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
} }

View File

@@ -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: "会员折扣卡",
} }
) )

View File

@@ -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"` //期数每晚2200以后的守价单是归在第二天的期数中
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
} }

View File

@@ -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"},
}
} }

View File

@@ -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"` // 打印字体-10正常1 PrinterFontSize int8 `orm:"default(0)" json:"printerFontSize"` // 打印字体-10正常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"},
}
}

View File

@@ -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"},
}
}

View File

@@ -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"`
} }

View File

@@ -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"},
}
}

View 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"` //备注
//appkeysecret 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"`
}

View File

@@ -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 {

View 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
}

View 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
}

View 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
}

View File

@@ -0,0 +1,7 @@
package jdeclp
import "git.rosy.net.cn/jx-callback/globals/testinit"
func init() {
testinit.Init()
}

View File

@@ -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
} }

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View 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)
}

View File

@@ -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 {

View File

@@ -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 := ``
<CB>%s</CB><BR><BR> if storeDetail != nil {
if storeDetail.BrandIsPrint == model.NO {
orderFmt += `
<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{}{}
<CB>%s</CB><BR><BR> orderFmt := ``
if storeDetail != nil {
if storeDetail.BrandIsPrint == model.NO {
orderFmt += `
<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)
} }

View File

@@ -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)

View File

@@ -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{}{}
<FS2><center>%s</center></FS2>\n\n orderFmt := ``
if storeDetail != nil {
if storeDetail.BrandIsPrint == model.NO {
orderFmt += `
<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{}{}
<FS2><center>%s</center></FS2>\n\n orderFmt := ``
if storeDetail != nil {
if storeDetail.BrandIsPrint == model.NO {
orderFmt += `
<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)
} }

View File

@@ -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{}{}
<S2><C>%s</C></S2><RN><RN> orderFmt := ``
if storeDetail != nil {
if storeDetail.BrandIsPrint == model.NO {
orderFmt += `
<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{}{}
<S2><C>%s</C></S2><RN><RN> orderFmt := ``
if storeDetail.BrandIsPrint == model.NO {
orderFmt += `
<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)
} }

View File

@@ -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 {

View File

@@ -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
) )

View File

@@ -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"})

View File

@@ -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