dingdan
This commit is contained in:
@@ -4388,6 +4388,7 @@ func GetBrandStore(ctx *jxcontext.Context, name string) (brands []*model.BrandSt
|
|||||||
return brands, err
|
return brands, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RefreshMTWMToken 刷新美团外卖门token
|
||||||
func RefreshMTWMToken(ctx *jxcontext.Context) (err error) {
|
func RefreshMTWMToken(ctx *jxcontext.Context) (err error) {
|
||||||
var (
|
var (
|
||||||
db = dao.GetDB()
|
db = dao.GetDB()
|
||||||
@@ -4409,6 +4410,29 @@ func RefreshMTWMToken(ctx *jxcontext.Context) (err error) {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RefreshTiktokShopToken 属性抖店门店tokne
|
||||||
|
func RefreshTiktokShopToken(ctx *jxcontext.Context) (err error) {
|
||||||
|
var (
|
||||||
|
db = dao.GetDB()
|
||||||
|
)
|
||||||
|
if time.Now().YearDay()%2 != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//token是三天,两天刷新一次token
|
||||||
|
storeMaps, _ := dao.GetStoresMapList(db, []int{model.VendorIDDD}, nil, nil, model.StoreStatusAll, model.StoreIsSyncAll, "", "", globals.Mtwm2Code)
|
||||||
|
for _, v := range storeMaps {
|
||||||
|
if v.MtwmRefreshToken != "" {
|
||||||
|
api.TiktokStore.SetRefreshToken(v.MtwmRefreshToken)
|
||||||
|
if result, err := api.TiktokStore.RefreshToken(); err == nil {
|
||||||
|
v.MtwmToken = result.AccessToken
|
||||||
|
v.MtwmRefreshToken = result.RefreshToken
|
||||||
|
dao.UpdateEntity(db, v, "MtwmToken", "MtwmRefreshToken")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
func StoreConfirmAct(ctx *jxcontext.Context, status, msgStatusID int) (err error) {
|
func StoreConfirmAct(ctx *jxcontext.Context, status, msgStatusID int) (err error) {
|
||||||
msgStatus := &model.MessageStatus{}
|
msgStatus := &model.MessageStatus{}
|
||||||
msgStatus.ID = msgStatusID
|
msgStatus.ID = msgStatusID
|
||||||
|
|||||||
@@ -262,6 +262,8 @@ func storeSkuSyncInfo2Bare(inSku *dao.StoreSkuSyncInfo) (outSku *partner.StoreSk
|
|||||||
IsDeletedBySku: inSku.IsDeletedBySku,
|
IsDeletedBySku: inSku.IsDeletedBySku,
|
||||||
Stock: inSku.Stock,
|
Stock: inSku.Stock,
|
||||||
VendorOrgCode: inSku.VendorOrgCode,
|
VendorOrgCode: inSku.VendorOrgCode,
|
||||||
|
SpecUnit: inSku.SpecUnit,
|
||||||
|
SpecQuality: inSku.SpecQuality,
|
||||||
}
|
}
|
||||||
if !isStoreSkuSyncNeedDelete(inSku) {
|
if !isStoreSkuSyncNeedDelete(inSku) {
|
||||||
outSku.Stock = model.MaxStoreSkuStockQty
|
outSku.Stock = model.MaxStoreSkuStockQty
|
||||||
@@ -731,7 +733,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
|
|||||||
updateStoreSku(dao.GetDB(), vendorID, successList, model.SyncFlagNewMask)
|
updateStoreSku(dao.GetDB(), vendorID, successList, model.SyncFlagNewMask)
|
||||||
}
|
}
|
||||||
return nil, len(successList), err
|
return nil, len(successList), err
|
||||||
}, ctx, task, createList, 1 /*singleStoreHandler.GetStoreSkusBatchSize(partner.FuncCreateStoreSkus)*/, isContinueWhenError2)
|
}, ctx, task, createList, 1, isContinueWhenError2)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
globals.SugarLogger.Debug("create sku wrong on :", err)
|
globals.SugarLogger.Debug("create sku wrong on :", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -292,6 +292,10 @@ func Init() {
|
|||||||
ScheduleTimerFunc("RefreshMTWMToken", func() {
|
ScheduleTimerFunc("RefreshMTWMToken", func() {
|
||||||
cms.RefreshMTWMToken(jxcontext.AdminCtx)
|
cms.RefreshMTWMToken(jxcontext.AdminCtx)
|
||||||
}, updateActStatusTimeList)
|
}, updateActStatusTimeList)
|
||||||
|
//刷新抖音门店token
|
||||||
|
ScheduleTimerFunc("RefreshTiktokShopToken", func() {
|
||||||
|
cms.RefreshTiktokShopToken(jxcontext.AdminCtx)
|
||||||
|
}, updateActStatusTimeList)
|
||||||
//获取最新平台流量活动
|
//获取最新平台流量活动
|
||||||
ScheduleTimerFunc("GetNewVendorPopActs", func() {
|
ScheduleTimerFunc("GetNewVendorPopActs", func() {
|
||||||
act.GetNewVendorPopActs(jxcontext.AdminCtx)
|
act.GetNewVendorPopActs(jxcontext.AdminCtx)
|
||||||
|
|||||||
@@ -220,9 +220,7 @@ func GetPossibleVendorIDFromAfsOrderID(afsOrderID string) (vendorID int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ComposeUniversalOrderID(orderID string, vendorID int) string {
|
func ComposeUniversalOrderID(orderID string, vendorID int) string {
|
||||||
// return fmt.Sprintf("%s|%d", orderID, vendorID)
|
|
||||||
return orderID // 当前用长度就能区分,先不加上vendorID
|
return orderID // 当前用长度就能区分,先不加上vendorID
|
||||||
// return orderID + utils.Int64ToStr(time.Now().Unix())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetUniversalOrderIDFromWaybill(bill *model.Waybill) string {
|
func GetUniversalOrderIDFromWaybill(bill *model.Waybill) string {
|
||||||
|
|||||||
@@ -473,48 +473,48 @@ func getWeimobTokenFromRemote(oldToken string) (tokenInfo *syseventhub.TokenInfo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// RefreshTiktokToken 刷新抖店token
|
// RefreshTiktokToken 刷新抖店token
|
||||||
func RefreshTiktokToken() (err error) {
|
//func RefreshTiktokToken() (err error) {
|
||||||
if api.TiktokStore != nil {
|
// if api.TiktokStore != nil {
|
||||||
err = RefreshConfig("tiktok", tiktokTokenExpires, func() (token string, expireTimeStr string, refreshToken string) {
|
// err = RefreshConfig("tiktok", tiktokTokenExpires, func() (token string, expireTimeStr string, refreshToken string) {
|
||||||
curConfig := &legacymodel.Config{
|
// curConfig := &legacymodel.Config{
|
||||||
Thirdparty: "tiktok",
|
// Thirdparty: "tiktok",
|
||||||
}
|
// }
|
||||||
if err := orm.NewOrm().Read(curConfig, "Thirdparty"); err != nil {
|
// if err := orm.NewOrm().Read(curConfig, "Thirdparty"); err != nil {
|
||||||
globals.SugarLogger.Errorf("RefreshTiktokToken RefreshToken failed with error:%v", err)
|
// globals.SugarLogger.Errorf("RefreshTiktokToken RefreshToken failed with error:%v", err)
|
||||||
}
|
// }
|
||||||
if curConfig.RefreshToken == "" {
|
// if curConfig.RefreshToken == "" {
|
||||||
if tokenInfo, err := api.TiktokStore.CreateToken(curConfig.Token); err != nil {
|
// if tokenInfo, err := api.TiktokStore.CreateToken(curConfig.Token); err != nil {
|
||||||
globals.SugarLogger.Errorf("tiktok store get token err:%v", err)
|
// globals.SugarLogger.Errorf("tiktok store get token err:%v", err)
|
||||||
} else {
|
// } else {
|
||||||
token = tokenInfo.AccessToken
|
// token = tokenInfo.AccessToken
|
||||||
refreshToken = tokenInfo.RefreshToken
|
// refreshToken = tokenInfo.RefreshToken
|
||||||
expireTimeStr = time.Unix(tokenInfo.ExpiresIn, 0).Format("2006-01-02 15:04:05")
|
// expireTimeStr = time.Unix(tokenInfo.ExpiresIn, 0).Format("2006-01-02 15:04:05")
|
||||||
}
|
// }
|
||||||
} else {
|
// } else {
|
||||||
expireIn, _ := time.Parse("2006-01-02 15:04:05", curConfig.Date)
|
// expireIn, _ := time.Parse("2006-01-02 15:04:05", curConfig.Date)
|
||||||
if expireIn.Unix() < time.Now().Unix() {
|
// if expireIn.Unix() < time.Now().Unix() {
|
||||||
api.TiktokStore.SetToken(curConfig.Token)
|
// api.TiktokStore.SetToken(curConfig.Token)
|
||||||
api.TiktokStore.SetRefreshToken(curConfig.RefreshToken)
|
// api.TiktokStore.SetRefreshToken(curConfig.RefreshToken)
|
||||||
if tokenInfo, err := api.TiktokStore.RefreshToken(); err == nil {
|
// if tokenInfo, err := api.TiktokStore.RefreshToken(); err == nil {
|
||||||
token = tokenInfo.AccessToken
|
// token = tokenInfo.AccessToken
|
||||||
refreshToken = tokenInfo.RefreshToken
|
// refreshToken = tokenInfo.RefreshToken
|
||||||
expireTimeStr = time.Unix(tokenInfo.ExpiresIn, 0).Format("2006-01-02 15:04:05")
|
// expireTimeStr = time.Unix(tokenInfo.ExpiresIn, 0).Format("2006-01-02 15:04:05")
|
||||||
} else {
|
// } else {
|
||||||
globals.SugarLogger.Errorf("RefreshTiktokToken RefreshToken failed with error:%v", err)
|
// globals.SugarLogger.Errorf("RefreshTiktokToken RefreshToken failed with error:%v", err)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
sql := `UPDATE config SET token = ?,refresh_token = ?,data = ? WHERE thirdparty = ?`
|
// sql := `UPDATE config SET token = ?,refresh_token = ?,data = ? WHERE thirdparty = ?`
|
||||||
dao.ExecuteSQL(dao.GetDB(), sql, []interface{}{
|
// dao.ExecuteSQL(dao.GetDB(), sql, []interface{}{
|
||||||
token, refreshToken, expireTimeStr, "tiktok",
|
// token, refreshToken, expireTimeStr, "tiktok",
|
||||||
})
|
// })
|
||||||
return token, expireTimeStr, refreshToken
|
// return token, expireTimeStr, refreshToken
|
||||||
}, func(value, v2 string) {
|
// }, func(value, v2 string) {
|
||||||
globals.SugarLogger.Debugf("RefreshFnToken setter value:[%s],[%s]", value, v2)
|
// globals.SugarLogger.Debugf("RefreshFnToken setter value:[%s],[%s]", value, v2)
|
||||||
api.TiktokStore.SetToken(value)
|
// api.TiktokStore.SetToken(value)
|
||||||
api.TiktokStore.SetRefreshToken(v2)
|
// api.TiktokStore.SetRefreshToken(v2)
|
||||||
})
|
// })
|
||||||
}
|
// }
|
||||||
return err
|
// return err
|
||||||
}
|
//}
|
||||||
|
|||||||
@@ -146,6 +146,7 @@ var (
|
|||||||
VendorIDQiNiuCloud: "七牛云",
|
VendorIDQiNiuCloud: "七牛云",
|
||||||
VendorIDShowAPI: "万维易源",
|
VendorIDShowAPI: "万维易源",
|
||||||
VendorGoMei: "国美",
|
VendorGoMei: "国美",
|
||||||
|
VendorIDDD: "抖店平台",
|
||||||
}
|
}
|
||||||
|
|
||||||
VendorInfoMap = map[int]*VendorInfo{
|
VendorInfoMap = map[int]*VendorInfo{
|
||||||
|
|||||||
@@ -214,9 +214,9 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
OrderTypeOrder = 1
|
OrderTypeOrder = 1 // 新订单
|
||||||
OrderTypeWaybill = 2
|
OrderTypeWaybill = 2 // 运单
|
||||||
OrderTypeAfsOrder = 3
|
OrderTypeAfsOrder = 3 // 售后单
|
||||||
)
|
)
|
||||||
|
|
||||||
// https://blog.csdn.net/a13570320979/article/details/51366355
|
// https://blog.csdn.net/a13570320979/article/details/51366355
|
||||||
@@ -250,12 +250,16 @@ const (
|
|||||||
OrderStatusUndoApplyCancel = -10
|
OrderStatusUndoApplyCancel = -10
|
||||||
OrderStatusVendorRejectCancel = -7
|
OrderStatusVendorRejectCancel = -7
|
||||||
OrderStatusVendorAgreeCancel = -6
|
OrderStatusVendorAgreeCancel = -6
|
||||||
OrderStatusApplyCancel = -5
|
OrderStatusApplyCancel = -5 // 发货前退款(取消)
|
||||||
|
OrderStatusAfterShipmentCancel = -4 // 发货后退款(取消)
|
||||||
|
OrderStatusAfterReceivingCancel = -3 // 收货后退款(取消)
|
||||||
|
|
||||||
OrderStatusUnknown = 0
|
OrderStatusUnknown = 0
|
||||||
OrderStatusWait4Pay = 2 // 原值-60 下单待支付
|
OrderStatusWait4Pay = 2 // 原值-60 下单待支付
|
||||||
OrderStatusWaitAccepted = 3 // 待接单,目前饿百用
|
OrderStatusWaitAccepted = 3 // 待接单,目前饿百用
|
||||||
OrderStatusNew = 5 // 新订单,实际是已经支付
|
OrderStatusNew = 5 // 新订单,实际是已经支付
|
||||||
|
OrderStatusPartDeliverGoods = 6 // 部分发货
|
||||||
|
OrderStatusPartPay = 7 // 部分支付
|
||||||
OrderStatusAccepted = 10 // 已经接单,也即待出库,待拣货
|
OrderStatusAccepted = 10 // 已经接单,也即待出库,待拣货
|
||||||
OrderStatusFinishedPickup = 15 // 拣货完成
|
OrderStatusFinishedPickup = 15 // 拣货完成
|
||||||
|
|
||||||
@@ -402,6 +406,14 @@ const (
|
|||||||
AfsAppealTypeRefund = 1 // 仅退款
|
AfsAppealTypeRefund = 1 // 仅退款
|
||||||
AfsAppealTypeReturnAndRefund = 2 // 退货退款
|
AfsAppealTypeReturnAndRefund = 2 // 退货退款
|
||||||
AfsAppealTypeNewGoods = 3 // 重发新商品(即京东到家的直赔)
|
AfsAppealTypeNewGoods = 3 // 重发新商品(即京东到家的直赔)
|
||||||
|
// 新补
|
||||||
|
AfsAppealTypeSendPkgOnlyReturnMoney = 4 // 已发货仅退款
|
||||||
|
AfsAppealTypeReturnMoney = 5 // 未发货仅退款
|
||||||
|
AfsAppealTypeChangePkg = 6 // 换货
|
||||||
|
AfsAppealTypeSystemCancel = 7 // 系统取消
|
||||||
|
AfsAppealTypeUserCancel = 8 // 用户取消
|
||||||
|
AfsAppealTypeInsuredPrice = 9 // 价保
|
||||||
|
AfsAppealTypeReissue = 10 // 补寄
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
@@ -1343,6 +1343,24 @@ func GetJxOrderCount(db *DaoDB, storeID int, orderID string, date time.Time) (co
|
|||||||
return count, err
|
return count, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetVendorOrderNumber 查询当前平台当然订单数(抖音没有订单seq)
|
||||||
|
func GetVendorOrderNumber(db *DaoDB, vendorId int64, vendorStoreId string) (count int, err error) {
|
||||||
|
date := time.Now()
|
||||||
|
sql := `
|
||||||
|
SELECT COUNT(*) ct
|
||||||
|
FROM goods_order t1
|
||||||
|
WHERE t1.vendor_store_id = ? AND t1.vendor_id = ? AND t1.order_created_at >= ? AND t1.order_created_at < ?
|
||||||
|
`
|
||||||
|
sqlParams := []interface{}{
|
||||||
|
vendorStoreId,
|
||||||
|
vendorId,
|
||||||
|
utils.Time2Date(date),
|
||||||
|
utils.Time2Date(date).Add(24 * time.Hour),
|
||||||
|
}
|
||||||
|
|
||||||
|
return count, GetRow(db, &count, sql, sqlParams...)
|
||||||
|
}
|
||||||
|
|
||||||
func GetOrdersForJxPay(db *DaoDB, finishTimeBegin, finishTimeEnd time.Time) (goods []*GoodsOrderPay, err error) {
|
func GetOrdersForJxPay(db *DaoDB, finishTimeBegin, finishTimeEnd time.Time) (goods []*GoodsOrderPay, err error) {
|
||||||
sql := `
|
sql := `
|
||||||
SELECT a.*,b.transaction_id
|
SELECT a.*,b.transaction_id
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ type StoreDetail struct {
|
|||||||
YbAppKey string `json:"ybAppKey"`
|
YbAppKey string `json:"ybAppKey"`
|
||||||
YbStorePrefix string `json:"ybStorePrefix"`
|
YbStorePrefix string `json:"ybStorePrefix"`
|
||||||
|
|
||||||
MtwmToken string `json:"mtwmToken"`
|
MtwmToken string `json:"mtwmToken"` // 当vendor为美团时存储美团token,为抖店时存储抖店token
|
||||||
EbaiSupplierID string `json:"ebaiSupplierID"`
|
EbaiSupplierID string `json:"ebaiSupplierID"`
|
||||||
|
|
||||||
BrandName string `json:"brandName"` //品牌信息
|
BrandName string `json:"brandName"` //品牌信息
|
||||||
|
|||||||
@@ -87,8 +87,8 @@ type AfsOrder struct {
|
|||||||
VendorReasonType string `orm:"size(255)" json:"vendorReasonType"` // 原始售后原因
|
VendorReasonType string `orm:"size(255)" json:"vendorReasonType"` // 原始售后原因
|
||||||
ReasonDesc string `orm:"size(1024)" json:"reasonDesc"` // 售后原因描述
|
ReasonDesc string `orm:"size(1024)" json:"reasonDesc"` // 售后原因描述
|
||||||
ReasonImgList string `orm:"size(1024)" json:"reasonImgList"` // 售后描述图片
|
ReasonImgList string `orm:"size(1024)" json:"reasonImgList"` // 售后描述图片
|
||||||
AppealType int8 `json:"appealType"` // 售后方式
|
AppealType int8 `json:"appealType"` // 售后方式(本地)
|
||||||
VendorAppealType string `orm:"size(255)" json:"vendorAppealType"` // 原始售后方式
|
VendorAppealType string `orm:"size(255)" json:"vendorAppealType"` // 原始售后方式(第三方平台)
|
||||||
Flag int `json:"flag"`
|
Flag int `json:"flag"`
|
||||||
RefundType int8 `json:"refundType"`
|
RefundType int8 `json:"refundType"`
|
||||||
RefuseReason string `orm:"size(1024)" json:"refuseReason"`
|
RefuseReason string `orm:"size(1024)" json:"refuseReason"`
|
||||||
|
|||||||
@@ -489,7 +489,7 @@ type StoreMap struct {
|
|||||||
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天刷一次
|
MtwmToken string `orm:"size(512)" json:"mtwmToken"` //美团外卖商超token,有效期30天,每20天刷一次
|
||||||
MtwmRefreshToken string `orm:"size(255)" json:"mtwmRefreshToken"` //美团外卖商超refreshToken
|
MtwmRefreshToken string `orm:"size(255)" json:"mtwmRefreshToken"` //美团外卖商超refreshToken
|
||||||
EbaiSupplierID string `orm:"column(ebai_supplier_id)" json:"ebaiSupplierID"` //饿百供应商ID
|
EbaiSupplierID string `orm:"column(ebai_supplier_id)" json:"ebaiSupplierID"` //饿百供应商ID
|
||||||
|
|
||||||
|
|||||||
@@ -14,17 +14,15 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
// FuncGetStoreSkusBareInfo = 1 // 此接口要求实现为不限制批处理大小的
|
// FuncGetStoreSkusBareInfo = 1 // 此接口要求实现为不限制批处理大小的
|
||||||
FuncUpdateStoreSkusStock = 2
|
FuncUpdateStoreSkusStock = 2 // 更新门店库存
|
||||||
FuncUpdateStoreSkusStatus = 3
|
FuncUpdateStoreSkusStatus = 3 // 更新门店状态
|
||||||
FuncUpdateStoreSkusPrice = 4
|
FuncUpdateStoreSkusPrice = 4 // 更新门店价格
|
||||||
|
FuncGetStoreSkusFullInfo = 6 // 获取门店商品完整信息
|
||||||
FuncGetStoreSkusFullInfo = 6
|
FuncCreateStoreSkus = 7 // 创建门店商品
|
||||||
FuncCreateStoreSkus = 7
|
FuncUpdateStoreSkus = 8 // 修改门店商品
|
||||||
FuncUpdateStoreSkus = 8
|
FuncDeleteStoreSkus = 9 // 删除门店商品
|
||||||
FuncDeleteStoreSkus = 9
|
FuncCreateActs = 10 // 创建活动
|
||||||
|
FuncCancelActs = 11 // 取消活动
|
||||||
FuncCreateActs = 10
|
|
||||||
FuncCancelActs = 11
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -55,6 +53,8 @@ type StoreSkuInfo struct {
|
|||||||
JdsStockSwitch int `json:"jdsStockSwitch"`
|
JdsStockSwitch int `json:"jdsStockSwitch"`
|
||||||
IsDeletedBySku bool `json:"isDeletedBySku"`
|
IsDeletedBySku bool `json:"isDeletedBySku"`
|
||||||
VendorOrgCode string `json:"vendorOrgCode"`
|
VendorOrgCode string `json:"vendorOrgCode"`
|
||||||
|
SpecUnit string `json:"specUnit"`
|
||||||
|
SpecQuality float32 `json:"specQuality"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type StoreSkuInfoWithErr struct {
|
type StoreSkuInfoWithErr struct {
|
||||||
|
|||||||
@@ -527,12 +527,12 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *ebaiapi.CallbackMsg) (orderSta
|
|||||||
StatusTime: utils.Timestamp2Time(msg.Timestamp),
|
StatusTime: utils.Timestamp2Time(msg.Timestamp),
|
||||||
VendorStatus: msg.Cmd,
|
VendorStatus: msg.Cmd,
|
||||||
}
|
}
|
||||||
if msg.Cmd == ebaiapi.CmdOrderUserCancel {
|
if msg.Cmd == ebaiapi.CmdOrderUserCancel { // 用户取消订单
|
||||||
msgType := int(utils.MustInterface2Int64(msg.Body["type"]))
|
msgType := int(utils.MustInterface2Int64(msg.Body["type"]))
|
||||||
cancelType := int(utils.MustInterface2Int64(msg.Body["cancel_type"]))
|
cancelType := int(utils.MustInterface2Int64(msg.Body["cancel_type"]))
|
||||||
orderStatus.Remark = buildFullReason(utils.Interface2String(msg.Body["cancel_reason"]), utils.Interface2String(msg.Body["addition_reason"]))
|
orderStatus.Remark = buildFullReason(utils.Interface2String(msg.Body["cancel_reason"]), utils.Interface2String(msg.Body["addition_reason"]))
|
||||||
orderStatus.VendorStatus = msg.Cmd + "-" + utils.Int2Str(msgType)
|
orderStatus.VendorStatus = msg.Cmd + "-" + utils.Int2Str(msgType)
|
||||||
if cancelType == ebaiapi.OrderUserCancelTypeBeforeSale {
|
if cancelType == ebaiapi.OrderUserCancelTypeBeforeSale { // 完成前取消
|
||||||
if msgType == ebaiapi.OrderUserCancelApply /* || msgType == ebaiapi.OrderUserCancelCSIntervene */ {
|
if msgType == ebaiapi.OrderUserCancelApply /* || msgType == ebaiapi.OrderUserCancelCSIntervene */ {
|
||||||
orderStatus.Status = model.OrderStatusApplyCancel
|
orderStatus.Status = model.OrderStatusApplyCancel
|
||||||
} else if msgType == ebaiapi.OrderUserCancelCSRefused ||
|
} else if msgType == ebaiapi.OrderUserCancelCSRefused ||
|
||||||
|
|||||||
@@ -25,23 +25,23 @@ import (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
VendorStatus2StatusMap = map[string]int{
|
VendorStatus2StatusMap = map[string]int{
|
||||||
jdapi.OrderStatusPurchased: model.OrderStatusNew,
|
jdapi.OrderStatusPurchased: model.OrderStatusNew, // 新订单
|
||||||
jdapi.OrderStatusWaitOutStore: model.OrderStatusAccepted,
|
jdapi.OrderStatusWaitOutStore: model.OrderStatusAccepted, // 已接单
|
||||||
jdapi.StatusIDWaitOutStore: model.OrderStatusAccepted,
|
jdapi.StatusIDWaitOutStore: model.OrderStatusAccepted, // 已接单
|
||||||
jdapi.OrderStatusFinishedPickup: model.OrderStatusFinishedPickup,
|
jdapi.OrderStatusFinishedPickup: model.OrderStatusFinishedPickup, // 拣货完成
|
||||||
jdapi.OrderStatusDelivering: model.OrderStatusDelivering,
|
jdapi.OrderStatusDelivering: model.OrderStatusDelivering,
|
||||||
jdapi.OrderStatusDelivered: model.OrderStatusFinished,
|
jdapi.OrderStatusDelivered: model.OrderStatusFinished, // 订单完成
|
||||||
jdapi.OrderStatusFinished: model.OrderStatusFinished, // todo 这个状态不是真正都完成的意思?
|
jdapi.OrderStatusFinished: model.OrderStatusFinished, // todo 这个状态不是真正都完成的意思?
|
||||||
jdapi.OrderStatusCanceled: model.OrderStatusCanceled,
|
jdapi.OrderStatusCanceled: model.OrderStatusCanceled, // 订单已经取消
|
||||||
|
|
||||||
jdapi.OrderStatusAdjust: model.OrderStatusAdjust,
|
jdapi.OrderStatusAdjust: model.OrderStatusAdjust, // 订单调整
|
||||||
jdapi.OrderStatusUserApplyCancel: model.OrderStatusApplyCancel,
|
jdapi.OrderStatusUserApplyCancel: model.OrderStatusApplyCancel,
|
||||||
jdapi.OrderStatusLocked: model.OrderStatusLocked,
|
jdapi.OrderStatusLocked: model.OrderStatusLocked,
|
||||||
jdapi.OrderStatusUnlocked: model.OrderStatusUnlocked,
|
jdapi.OrderStatusUnlocked: model.OrderStatusUnlocked,
|
||||||
|
|
||||||
jdapi.OrderStatusVenderAgreeCancel: model.OrderStatusVendorAgreeCancel,
|
jdapi.OrderStatusVenderAgreeCancel: model.OrderStatusVendorAgreeCancel, // 同意取消
|
||||||
jdapi.OrderStatusVenderRejectCancel: model.OrderStatusVendorRejectCancel,
|
jdapi.OrderStatusVenderRejectCancel: model.OrderStatusVendorRejectCancel, // 拒绝取消
|
||||||
jdapi.CallbackMsgOrderAddTips: model.OrderStatusWaybillTipChanged,
|
jdapi.CallbackMsgOrderAddTips: model.OrderStatusWaybillTipChanged, // 小飞
|
||||||
}
|
}
|
||||||
deliveryTypeMap = map[int]string{
|
deliveryTypeMap = map[int]string{
|
||||||
jdapi.CarrierNoCrowdSourcing: model.OrderDeliveryTypePlatform,
|
jdapi.CarrierNoCrowdSourcing: model.OrderDeliveryTypePlatform,
|
||||||
|
|||||||
@@ -129,20 +129,20 @@ func (c *PurchaseHandler) buildAfsOrder(afsInfo *jdapi.AfsServiceResponse) (afsO
|
|||||||
VendorStoreID: afsInfo.StationID,
|
VendorStoreID: afsInfo.StationID,
|
||||||
StoreID: int(utils.Str2Int64WithDefault(afsInfo.StationNumOutSystem, 0)),
|
StoreID: int(utils.Str2Int64WithDefault(afsInfo.StationNumOutSystem, 0)),
|
||||||
AfsCreatedAt: afsInfo.CreateTime.GoTime(),
|
AfsCreatedAt: afsInfo.CreateTime.GoTime(),
|
||||||
|
VendorAppealType: afsInfo.ApplyDeal,
|
||||||
|
AppealType: c.convertAfsAppealType(afsInfo.ApplyDeal),
|
||||||
|
VendorReasonType: utils.Int2Str(afsInfo.QuestionTypeCid),
|
||||||
|
ReasonType: c.convertAfsReasonType(afsInfo.QuestionTypeCid),
|
||||||
|
ReasonDesc: utils.LimitUTF8StringLen(afsInfo.QuestionDesc, 1024),
|
||||||
|
ReasonImgList: utils.LimitUTF8StringLen(jdapi.ProcessQuestionPic(afsInfo.QuestionPic), 1024),
|
||||||
|
VendorOrgCode: afsInfo.VenderID,
|
||||||
|
|
||||||
FreightUserMoney: afsInfo.OrderFreightMoney,
|
FreightUserMoney: afsInfo.OrderFreightMoney,
|
||||||
AfsFreightMoney: afsInfo.AfsFreight,
|
AfsFreightMoney: afsInfo.AfsFreight,
|
||||||
BoxMoney: afsInfo.PackagingMoney,
|
BoxMoney: afsInfo.PackagingMoney,
|
||||||
TongchengFreightMoney: afsInfo.TongchengFreightMoney,
|
TongchengFreightMoney: afsInfo.TongchengFreightMoney,
|
||||||
SkuBoxMoney: afsInfo.MealBoxMoney,
|
SkuBoxMoney: afsInfo.MealBoxMoney,
|
||||||
|
|
||||||
VendorStatus: utils.Int2Str(afsInfo.AfsServiceState),
|
VendorStatus: utils.Int2Str(afsInfo.AfsServiceState),
|
||||||
VendorReasonType: utils.Int2Str(afsInfo.QuestionTypeCid),
|
|
||||||
ReasonType: c.convertAfsReasonType(afsInfo.QuestionTypeCid),
|
|
||||||
ReasonDesc: utils.LimitUTF8StringLen(afsInfo.QuestionDesc, 1024),
|
|
||||||
ReasonImgList: utils.LimitUTF8StringLen(jdapi.ProcessQuestionPic(afsInfo.QuestionPic), 1024),
|
|
||||||
VendorAppealType: afsInfo.ApplyDeal,
|
|
||||||
AppealType: c.convertAfsAppealType(afsInfo.ApplyDeal),
|
|
||||||
VendorOrgCode: afsInfo.VenderID,
|
|
||||||
}
|
}
|
||||||
afsOrder.Status = c.GetAfsStatusFromVendorStatus(afsOrder.VendorStatus)
|
afsOrder.Status = c.GetAfsStatusFromVendorStatus(afsOrder.VendorStatus)
|
||||||
|
|
||||||
|
|||||||
@@ -415,12 +415,12 @@ func (c *PurchaseHandler) callbackMsg2Status(msg *mtwmapi.CallbackMsg) (orderSta
|
|||||||
case FakeMsgType, mtwmapi.MsgTypeNewOrder, mtwmapi.MsgTypeOrderAccepted, mtwmapi.MsgTypeOrderFinished:
|
case FakeMsgType, mtwmapi.MsgTypeNewOrder, mtwmapi.MsgTypeOrderAccepted, mtwmapi.MsgTypeOrderFinished:
|
||||||
vendorStatus = msg.FormData.Get("status")
|
vendorStatus = msg.FormData.Get("status")
|
||||||
statusTime = utils.Str2Int64(msg.FormData.Get("utime"))
|
statusTime = utils.Str2Int64(msg.FormData.Get("utime"))
|
||||||
case mtwmapi.MsgTypeOrderRefund, mtwmapi.MsgTypeOrderPartialRefund:
|
case mtwmapi.MsgTypeOrderRefund, mtwmapi.MsgTypeOrderPartialRefund: // 订单退款,部分退款
|
||||||
notifyType := msg.FormData.Get("notify_type")
|
notifyType := msg.FormData.Get("notify_type")
|
||||||
vendorStatus = msg.Cmd + "-" + notifyType
|
vendorStatus = msg.Cmd + "-" + notifyType
|
||||||
if true { // 已经提前判断了,到这里的都是售中
|
if true { // 已经提前判断了,到这里的都是售中
|
||||||
remark = msg.FormData.Get("reason")
|
remark = msg.FormData.Get("reason")
|
||||||
if msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund {
|
if msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund { // 部分退款
|
||||||
if notifyType == mtwmapi.NotifyTypePartyApply {
|
if notifyType == mtwmapi.NotifyTypePartyApply {
|
||||||
if globals.EnableMtwmStoreWrite {
|
if globals.EnableMtwmStoreWrite {
|
||||||
//if order, _ := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDMTWM); order != nil {
|
//if order, _ := partner.CurOrderManager.LoadOrder(orderID, model.VendorIDMTWM); order != nil {
|
||||||
@@ -833,7 +833,7 @@ func (c *PurchaseHandler) ComplaintRider(vendorOrderId string, resonID int, reso
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转自配送时取消非专送混合送门店取消理由
|
// GetCancelDeliveryReason 转自配送时取消非专送混合送门店取消理由
|
||||||
func (c *PurchaseHandler) GetCancelDeliveryReason(order *model.GoodsOrder) (string, error) {
|
func (c *PurchaseHandler) GetCancelDeliveryReason(order *model.GoodsOrder) (string, error) {
|
||||||
reason, err := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").GetCancelDeliveryReason(utils.Str2Int64(order.VendorOrderID), order.VendorStoreID)
|
reason, err := getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromOrder(order), "").GetCancelDeliveryReason(utils.Str2Int64(order.VendorOrderID), order.VendorStoreID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -87,11 +87,6 @@ func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*mode
|
|||||||
if globals.EnableMtwmStoreWrite {
|
if globals.EnableMtwmStoreWrite {
|
||||||
actResult, faileInfoList, err2 := api.MtwmAPI.RetailDiscountBatchSave2(vendorStoreID, jxActType2Mtwm(act.Type), actData)
|
actResult, faileInfoList, err2 := api.MtwmAPI.RetailDiscountBatchSave2(vendorStoreID, jxActType2Mtwm(act.Type), actData)
|
||||||
err = err2
|
err = err2
|
||||||
// 忽略错误,都放在failedList里
|
|
||||||
// if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
// }
|
|
||||||
// globals.SugarLogger.Debugf("mtwm createOneShopAct actResult:%s, faileInfoList:%s err2:%v", utils.Format4Output(actResult, true), utils.Format4Output(faileInfoList, true), err2)
|
|
||||||
actStoreSkuMap := make(map[int]*model.ActStoreSku2)
|
actStoreSkuMap := make(map[int]*model.ActStoreSku2)
|
||||||
for _, v := range actStoreSku {
|
for _, v := range actStoreSku {
|
||||||
actStoreSkuMap[v.SkuID] = v
|
actStoreSkuMap[v.SkuID] = v
|
||||||
@@ -260,11 +255,12 @@ func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITa
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *PurchaseHandler) GetActAmple(ctx *jxcontext.Context, vendorStoreID, vendorOrgCode string) (ample int, err error) {
|
func (c *PurchaseHandler) GetActAmple(ctx *jxcontext.Context, vendorStoreID, vendorOrgCode string) (ample int, err error) {
|
||||||
for _, v := range mtwmapi.ActTypeList {
|
return 0, err
|
||||||
//1表示进行中
|
//for _, v := range mtwmapi.ActTypeList {
|
||||||
if actList, err := getAPI(vendorOrgCode, 0, vendorStoreID).GetByAppPoiCodeAndType(vendorOrgCode, 1, v); err == nil {
|
// //1表示进行中
|
||||||
ample += len(actList)
|
// if actList, err := getAPI(vendorOrgCode, 0, vendorStoreID).GetByAppPoiCodeAndType(vendorOrgCode, 1, v); err == nil {
|
||||||
}
|
// ample += len(actList)
|
||||||
}
|
// }
|
||||||
return ample, err
|
//}
|
||||||
|
//return ample, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +1,19 @@
|
|||||||
package tiktok_store
|
package tiktok_store
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
|
||||||
tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"git.rosy.net.cn/jx-callback/business/model"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
// OnCallbackMsg 抖音
|
// OnOrderMsg 抖音
|
||||||
func OnCallbackMsg(msg *tiktokShop.OrderCallback) (response *tiktokShop.CallbackResponse) {
|
func OnOrderMsg(msgId string, msg interface{}) (response *tiktokShop.CallbackResponse) {
|
||||||
if CurPurchaseHandler != nil {
|
if CurPurchaseHandler != nil {
|
||||||
if msg.Data != "" && len(msg.Body) > 0 {
|
orderId, _ := api.TiktokStore.GetCallbackOrderId(msgId, msg)
|
||||||
jxutils.CallMsgHandler(func() {
|
jxutils.CallMsgHandler(func() {
|
||||||
response = CurPurchaseHandler.onOrderMsg(msg)
|
response = CurPurchaseHandler.onOrderMsg(msgId, orderId, msg)
|
||||||
}, jxutils.ComposeUniversalOrderID(msg.MsgId, model.VendorIDDD))
|
}, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDDD))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return response
|
return response
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetOrderIDFromMsg(msg *mtwmapi.CallbackMsg) string {
|
|
||||||
return msg.FormData.Get(mtwmapi.KeyOrderID)
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetVendorStoreIDFromMsg(msg *mtwmapi.CallbackMsg) string {
|
|
||||||
return msg.FormData.Get(mtwmapi.KeyAppPoiCode)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package tiktok_store
|
package tiktok_store
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
order_orderDetail_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/order_orderDetail/response"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||||||
@@ -135,18 +136,15 @@ func (p *PurchaseHandler) AfsOrderDetail2Financial(orderData url.Values) (afsOrd
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 存储美团正向订单结账信息
|
// 存储美团正向订单结账信息
|
||||||
func (p *PurchaseHandler) OnOrderDetail(result map[string]interface{}, operation string) (err error) {
|
func (p *PurchaseHandler) OnOrderDetail(result *order_orderDetail_response.ShopOrderDetail, operation string) (err error) {
|
||||||
globals.SugarLogger.Debug(utils.Int64ToStr(utils.MustInterface2Int64(result["order_id"])))
|
return partner.CurOrderManager.SaveOrderFinancialInfo(p.OrderDetail2Financial(result), operation)
|
||||||
err = partner.CurOrderManager.SaveOrderFinancialInfo(p.OrderDetail2Financial(result), operation)
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PurchaseHandler) OrderDetail2Financial(result map[string]interface{}) (orderFinancial *model.OrderFinancial) {
|
func (p *PurchaseHandler) OrderDetail2Financial(result *order_orderDetail_response.ShopOrderDetail) (orderFinancial *model.OrderFinancial) {
|
||||||
orderFinancial = &model.OrderFinancial{
|
orderFinancial = &model.OrderFinancial{
|
||||||
VendorID: model.VendorIDMTWM,
|
VendorID: model.VendorIDDD,
|
||||||
VendorOrderID: utils.Int64ToStr(utils.MustInterface2Int64(result["order_id"])),
|
VendorOrderID: result.OrderId,
|
||||||
}
|
}
|
||||||
// orderFinancial.DeliveryConfirmTime = utils.Str2TimeWithDefault(utils.Interface2String(result["order_completed_time"]), utils.DefaultTimeValue)
|
|
||||||
order, err := partner.CurOrderManager.LoadOrder(orderFinancial.VendorOrderID, orderFinancial.VendorID)
|
order, err := partner.CurOrderManager.LoadOrder(orderFinancial.VendorOrderID, orderFinancial.VendorID)
|
||||||
jxStoreID := 0
|
jxStoreID := 0
|
||||||
if err == nil {
|
if err == nil {
|
||||||
@@ -157,96 +155,50 @@ func (p *PurchaseHandler) OrderDetail2Financial(result map[string]interface{}) (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//globals.SugarLogger.Warnf("mtwm OrderDetail2Financial, orderID:%s is not found from partner.CurOrderManager.LoadOrder", orderFinancial.VendorOrderID)
|
|
||||||
err = nil
|
err = nil
|
||||||
}
|
}
|
||||||
if result["package_bag_money"] != nil {
|
|
||||||
orderFinancial.BoxMoney = utils.MustInterface2Int64(result["package_bag_money"])
|
// 订单
|
||||||
}
|
for _, x := range result.SkuOrderList {
|
||||||
detail := result["detail"]
|
|
||||||
if detail != nil {
|
|
||||||
var data []map[string]interface{}
|
|
||||||
utils.UnmarshalUseNumber([]byte(utils.Interface2String(detail)), &data)
|
|
||||||
for _, x := range data {
|
|
||||||
orderSkuFinancial := &model.OrderSkuFinancial{
|
orderSkuFinancial := &model.OrderSkuFinancial{
|
||||||
VendorID: orderFinancial.VendorID,
|
VendorID: orderFinancial.VendorID,
|
||||||
VendorOrderID: orderFinancial.VendorOrderID,
|
VendorOrderID: orderFinancial.VendorOrderID,
|
||||||
// OrderFinancialID: orderFinancial.VendorOrderID,
|
VendorStoreID: x.StoreInfo.StoreId,
|
||||||
// ConfirmTime: utils.Str2TimeWithDefault(utils.Interface2String(result["ctime"]), utils.DefaultTimeValue),
|
|
||||||
VendorStoreID: result["app_poi_code"].(string),
|
|
||||||
StoreID: 0,
|
StoreID: 0,
|
||||||
JxStoreID: jxStoreID,
|
JxStoreID: jxStoreID,
|
||||||
VendorSkuID: utils.Interface2String(x["sku_id"]),
|
VendorSkuID: utils.Interface2String(x.SkuId),
|
||||||
SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(x["sku_id"]), 0)),
|
SkuID: int(utils.Str2Int64WithDefault(x.OutSkuId, 0)),
|
||||||
Name: utils.Interface2String(x["food_name"]),
|
Name: utils.Interface2String(x.ProductName),
|
||||||
SalePrice: jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["price"])),
|
SalePrice: x.OrderAmount / x.ItemNum,
|
||||||
Count: int(utils.MustInterface2Int64(x["quantity"])),
|
Count: int(x.ItemNum),
|
||||||
SkuBoxMoney: jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["box_price"])) * jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["box_num"])),
|
SkuBoxMoney: 0,
|
||||||
IsAfsOrder: 0,
|
IsAfsOrder: 0,
|
||||||
}
|
}
|
||||||
orderFinancial.Skus = append(orderFinancial.Skus, orderSkuFinancial)
|
orderFinancial.Skus = append(orderFinancial.Skus, orderSkuFinancial)
|
||||||
orderFinancial.SalePriceMoney += orderSkuFinancial.SalePrice * int64(orderSkuFinancial.Count)
|
orderFinancial.SalePriceMoney += orderSkuFinancial.SalePrice * int64(orderSkuFinancial.Count)
|
||||||
orderFinancial.SkuBoxMoney += orderSkuFinancial.SkuBoxMoney
|
orderFinancial.SkuBoxMoney += orderSkuFinancial.SkuBoxMoney
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
globals.SugarLogger.Warnf("mtwm OrderDetail2Financial, orderID:%s have no detail", orderFinancial.VendorOrderID)
|
// 活动
|
||||||
}
|
for _, x := range result.SkuOrderList {
|
||||||
extras := result["extras"]
|
for _, v := range x.CampaignInfo {
|
||||||
if extras != nil {
|
|
||||||
var data []map[string]interface{}
|
|
||||||
utils.UnmarshalUseNumber([]byte(utils.Interface2String(extras)), &data)
|
|
||||||
for _, x := range data {
|
|
||||||
if x["rider_fee"] == nil {
|
|
||||||
activity := &model.OrderDiscountFinancial{
|
activity := &model.OrderDiscountFinancial{
|
||||||
VendorID: orderFinancial.VendorID,
|
VendorID: orderFinancial.VendorID,
|
||||||
VendorOrderID: orderFinancial.VendorOrderID,
|
VendorOrderID: orderFinancial.VendorOrderID,
|
||||||
// ActivityName: utils.Interface2String(x["remark"]),
|
|
||||||
// ActivityMoney: jxutils.StandardPrice2Int(utils.MustInterface2Float64(x["reduce_fee"])),
|
|
||||||
// VendorActivityID: utils.Int64ToStr(utils.MustInterface2Int64(x["act_detail_id"])),
|
|
||||||
}
|
}
|
||||||
if x["act_detail_id"] != nil { // 容错处理
|
activity.VendorActivityID = utils.Int64ToStr(v.CampaignId)
|
||||||
activity.VendorActivityID = utils.Int64ToStr(utils.MustInterface2Int64(x["act_detail_id"]))
|
|
||||||
orderFinancial.Discounts = append(orderFinancial.Discounts, activity)
|
orderFinancial.Discounts = append(orderFinancial.Discounts, activity)
|
||||||
}
|
}
|
||||||
// 通过活动Id去取,京西活动补贴
|
|
||||||
// orderFinancial.JxSubsidyMoney +=
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
orderFinancial.ReceivableFreight = result.PostAmount
|
||||||
poiReceiveDetail := result["poi_receive_detail"]
|
orderFinancial.FreightMoney = 0
|
||||||
if poiReceiveDetail != nil {
|
orderFinancial.ActualPayMoney = result.PayAmount
|
||||||
var data map[string]interface{}
|
orderFinancial.PmMoney = 0 // 平台费
|
||||||
utils.UnmarshalUseNumber([]byte(utils.Interface2String(poiReceiveDetail)), &data)
|
orderFinancial.ShopMoney = 0 // 应结金额
|
||||||
orderFinancial.ReceivableFreight = utils.MustInterface2Int64(data["logisticsFee"])
|
orderFinancial.TotalDiscountMoney = result.PromotionAmount // 订单优惠总金额
|
||||||
orderFinancial.FreightMoney = utils.MustInterface2Int64(data["logisticsFee"])
|
orderFinancial.PmSubsidyMoney = result.PromotionPlatformAmount // 平台活动补贴(订单主体活动补贴+订单单条sku补贴)1+
|
||||||
orderFinancial.ActualPayMoney = utils.MustInterface2Int64(data["onlinePayment"])
|
orderFinancial.SelfDeliveryDiscountMoney = 0 // 平台承担运费补贴(商家自送)+
|
||||||
orderFinancial.PmMoney = utils.MustInterface2Int64(data["foodShareFeeChargeByPoi"])
|
|
||||||
orderFinancial.ShopMoney = utils.MustInterface2Int64(data["wmPoiReceiveCent"])
|
|
||||||
for _, x := range data["actOrderChargeByMt"].([]interface{}) {
|
|
||||||
orderFinancial.TotalDiscountMoney += utils.MustInterface2Int64(x.(map[string]interface{})["moneyCent"])
|
|
||||||
orderFinancial.PmSubsidyMoney += utils.MustInterface2Int64(x.(map[string]interface{})["moneyCent"])
|
|
||||||
}
|
|
||||||
for _, x := range data["actOrderChargeByPoi"].([]interface{}) {
|
|
||||||
orderFinancial.TotalDiscountMoney += utils.MustInterface2Int64(x.(map[string]interface{})["moneyCent"])
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
globals.SugarLogger.Warnf("mtwm OrderDetail2Financial, orderID:%s have no poi_receive_detail", orderFinancial.VendorOrderID)
|
|
||||||
}
|
|
||||||
if utils.MustInterface2Int64(result["is_third_shipping"]) == SelfDeliveryCarrierNo { // is_third_shipping int 是否是第三方配送平台配送,0表否,1表是)
|
|
||||||
orderFinancial.SelfDeliveryDiscountMoney = orderFinancial.ReceivableFreight
|
|
||||||
orderFinancial.DistanceFreightMoney = 0
|
orderFinancial.DistanceFreightMoney = 0
|
||||||
// 通过本地数据库去取是否转美团/达达,并计算运费
|
|
||||||
// wayBill, err := partner.CurOrderManager.LoadWaybill(orderFinancial.VendorOrderID, orderFinancial.VendorID)
|
|
||||||
// if err == nil {
|
|
||||||
// orderFinancial.JxFreightMoney = wayBill.DesiredFee
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
// // 美团订单单独处理部分,美团正向订单接口推送时总结算金额没有计算公益捐款一分钱,是否在这里直接提前扣除?
|
|
||||||
// // 3/18之后的订单一直都不显示公益捐款金额,而且结算现在结算到了3/18之后的订单,没有的已经不计算了,先注释
|
|
||||||
// // 2019-04-03 10.52 询问赵mf, 此计划是必须参加的,而且是长期的,每单固定扣除一分钱
|
|
||||||
orderFinancial.DonationMoney = PublicWelfareDonation
|
|
||||||
// 不应该对第三方结账金额做更改,就算有异常,也要保留异常,知道问题出在哪里
|
|
||||||
// orderFinancial.ShopMoney -= PublicWelfareDonation
|
|
||||||
globals.SugarLogger.Debug(orderFinancial.VendorOrderID)
|
|
||||||
return orderFinancial
|
return orderFinancial
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package tiktok_store
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
@@ -30,6 +31,11 @@ type PurchaseHandler struct {
|
|||||||
locker sync.RWMutex
|
locker sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
|
||||||
|
//TODO implement me
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
if api.MtwmAPI != nil || api.Mtwm2API != nil {
|
if api.MtwmAPI != nil || api.Mtwm2API != nil {
|
||||||
CurPurchaseHandler = New()
|
CurPurchaseHandler = New()
|
||||||
@@ -163,7 +169,7 @@ func bizStatusJX2Mtwm(status int) (openLevel, online int) {
|
|||||||
return mtwmapi.PoiOpenLevelNormal, mtwmapi.PoiStatusOnline
|
return mtwmapi.PoiOpenLevelNormal, mtwmapi.PoiStatusOnline
|
||||||
}
|
}
|
||||||
|
|
||||||
func skuStatusJX2Mtwm(status int) int {
|
func skuStatusJX2Tiktok(status int) int {
|
||||||
if status == model.SkuStatusNormal {
|
if status == model.SkuStatusNormal {
|
||||||
return mtwmapi.SellStatusOnline
|
return mtwmapi.SellStatusOnline
|
||||||
}
|
}
|
||||||
@@ -226,17 +232,14 @@ func (p *PurchaseHandler) getUploadImgPoiCode() (poiCode string) {
|
|||||||
return poiCode
|
return poiCode
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetAPI(appOrgCode string, storeID int, vendorStoreID string) (apiObj *mtwmapi.API) {
|
func getAPI(appOrgCode string, storeID int, vendorStoreID string) (apiObj *tiktok_api.API) {
|
||||||
if appOrgCode == "" {
|
apiObj = partner.CurAPIManager.GetAPI(model.VendorIDDD, appOrgCode).(*tiktok_api.API)
|
||||||
globals.SugarLogger.Debugf("getAPI appOrgCode is empty")
|
if appOrgCode == globals.TiktokShopCode {
|
||||||
}
|
|
||||||
apiObj = partner.CurAPIManager.GetAPI(model.VendorIDMTWM, appOrgCode).(*mtwmapi.API)
|
|
||||||
if appOrgCode == globals.Mtwm2Code {
|
|
||||||
var storeDetail *dao.StoreDetail
|
var storeDetail *dao.StoreDetail
|
||||||
if storeID != 0 {
|
if storeID != 0 {
|
||||||
storeDetail, _ = dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, appOrgCode)
|
storeDetail, _ = dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDDD, appOrgCode)
|
||||||
} else if vendorStoreID != "" {
|
} else if vendorStoreID != "" {
|
||||||
storeDetail, _ = dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDMTWM, appOrgCode)
|
storeDetail, _ = dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDDD, appOrgCode)
|
||||||
}
|
}
|
||||||
if storeDetail != nil {
|
if storeDetail != nil {
|
||||||
apiObj.SetToken(storeDetail.MtwmToken)
|
apiObj.SetToken(storeDetail.MtwmToken)
|
||||||
@@ -245,28 +248,6 @@ func GetAPI(appOrgCode string, storeID int, vendorStoreID string) (apiObj *mtwma
|
|||||||
return apiObj
|
return apiObj
|
||||||
}
|
}
|
||||||
|
|
||||||
func getAPI(appOrgCode string, storeID int, vendorStoreID string) (apiObj *mtwmapi.API) {
|
func getAPIWithoutToken(appOrgCode string) (apiObj *tiktok_api.API) {
|
||||||
if appOrgCode == "" {
|
return partner.CurAPIManager.GetAPI(model.VendorIDDD, appOrgCode).(*tiktok_api.API)
|
||||||
globals.SugarLogger.Debugf("getAPI appOrgCode is empty")
|
|
||||||
}
|
|
||||||
apiObj = partner.CurAPIManager.GetAPI(model.VendorIDMTWM, appOrgCode).(*mtwmapi.API)
|
|
||||||
if appOrgCode == globals.Mtwm2Code {
|
|
||||||
var storeDetail *dao.StoreDetail
|
|
||||||
if storeID != 0 {
|
|
||||||
storeDetail, _ = dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, appOrgCode)
|
|
||||||
} else if vendorStoreID != "" {
|
|
||||||
storeDetail, _ = dao.GetStoreDetailByVendorStoreID(dao.GetDB(), vendorStoreID, model.VendorIDMTWM, appOrgCode)
|
|
||||||
}
|
|
||||||
if storeDetail != nil {
|
|
||||||
apiObj.SetToken(storeDetail.MtwmToken)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return apiObj
|
|
||||||
}
|
|
||||||
|
|
||||||
func getAPIWithoutToken(appOrgCode string) (apiObj *mtwmapi.API) {
|
|
||||||
if appOrgCode == "" {
|
|
||||||
globals.SugarLogger.Warnf("getAPI appOrgCode is empty")
|
|
||||||
}
|
|
||||||
return partner.CurAPIManager.GetAPI(model.VendorIDMTWM, appOrgCode).(*mtwmapi.API)
|
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -3,18 +3,13 @@ package tiktok_store
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
||||||
"git.rosy.net.cn/jx-callback/globals/api"
|
|
||||||
"net/url"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
|
||||||
"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"
|
||||||
"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"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -116,301 +111,13 @@ var (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// 是否为售后消息
|
// AgreeOrRefuseRefund todo 审核售后单申请 退货退款(同意退货,确认收货之后会自动退款) 审核售后有点问题
|
||||||
func (c *PurchaseHandler) isAfsMsg(msg *tiktokShop.OrderCallback) bool {
|
|
||||||
_, ok := AfsTagIDMap[msg.MsgId]
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) OnAfsOrderMsg(msg *mtwmapi.CallbackMsg) (retVal *mtwmapi.CallbackResponse) {
|
|
||||||
jxutils.CallMsgHandlerAsync(func() {
|
|
||||||
retVal = c.onAfsOrderMsg(msg)
|
|
||||||
}, jxutils.ComposeUniversalOrderID(GetOrderIDFromMsg(msg), model.VendorIDEBAI))
|
|
||||||
return retVal
|
|
||||||
}
|
|
||||||
|
|
||||||
// todo 对于退款与部分退款,order.go与这个文件中对于状态的处理不一致
|
|
||||||
func (c *PurchaseHandler) onAfsOrderMsg(msg *tiktokShop.OrderCallback) (retVal *tiktokShop.CallbackResponse) {
|
|
||||||
var err error
|
|
||||||
orderStatus := c.callbackAfsMsg2Status(msg)
|
|
||||||
for _, v := range orderStatus {
|
|
||||||
needCallNew := v.Status == model.AfsOrderStatusWait4Approve || v.Status == model.AfsOrderStatusNew
|
|
||||||
if !needCallNew {
|
|
||||||
if _, err := partner.CurOrderManager.LoadAfsOrder(v.VendorOrderID, v.VendorID); err != nil {
|
|
||||||
if dao.IsNoRowsError(err) {
|
|
||||||
needCallNew = true
|
|
||||||
} else {
|
|
||||||
return tiktokShop.Err2CallbackResponse(err, "")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if needCallNew {
|
|
||||||
var afsOrder *model.AfsOrder
|
|
||||||
refundData := msg.Data.(*mtwmapi.CallbackRefundInfo)
|
|
||||||
if msg.Cmd == mtwmapi.MsgTypeOrderPartialRefund {
|
|
||||||
afsOrder = &model.AfsOrder{
|
|
||||||
VendorID: model.VendorIDMTWM,
|
|
||||||
AfsOrderID: orderStatus.VendorOrderID,
|
|
||||||
VendorOrderID: orderStatus.RefVendorOrderID,
|
|
||||||
VendorStoreID: "",
|
|
||||||
StoreID: 0,
|
|
||||||
AfsCreatedAt: utils.Timestamp2Time(refundData.Timestamp),
|
|
||||||
VendorAppealType: "",
|
|
||||||
AppealType: model.AfsAppealTypeRefund,
|
|
||||||
VendorReasonType: "",
|
|
||||||
ReasonType: model.AfsReasonNotOthers,
|
|
||||||
ReasonDesc: utils.LimitUTF8StringLen(refundData.Reason, 1024),
|
|
||||||
ReasonImgList: utils.LimitUTF8StringLen(strings.Join(refundData.PictureList, ","), 1024),
|
|
||||||
RefundType: model.AfsTypePartRefund,
|
|
||||||
|
|
||||||
VendorOrgCode: msg.AppID,
|
|
||||||
}
|
|
||||||
for _, sku := range refundData.FoodList {
|
|
||||||
orderSku := &model.OrderSkuFinancial{
|
|
||||||
Count: sku.Count,
|
|
||||||
VendorSkuID: sku.SkuID,
|
|
||||||
SkuID: int(utils.Str2Int64WithDefault(sku.SkuID, 0)),
|
|
||||||
Name: sku.FoodName,
|
|
||||||
UserMoney: jxutils.StandardPrice2Int(sku.RefundPrice)*int64(sku.Count) + jxutils.StandardPrice2Int(sku.BoxPrice)*int64(sku.BoxNum),
|
|
||||||
}
|
|
||||||
afsOrder.SkuUserMoney += orderSku.UserMoney
|
|
||||||
afsOrder.Skus = append(afsOrder.Skus, orderSku)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if afsOrder = c.createAfsOrder(msg.FormData); afsOrder != nil {
|
|
||||||
afsOrder.AfsOrderID = orderStatus.VendorOrderID
|
|
||||||
afsOrder.RefundType = model.AfsTypeFullRefund
|
|
||||||
afsOrder.AppealType = model.AfsAppealTypeRefund
|
|
||||||
afsOrder.VendorReasonType = ""
|
|
||||||
afsOrder.ReasonType = model.AfsReasonNotOthers
|
|
||||||
afsOrder.ReasonDesc = utils.LimitUTF8StringLen(refundData.Reason, 1024)
|
|
||||||
afsOrder.ReasonImgList = utils.LimitUTF8StringLen(strings.Join(refundData.PictureList, ","), 1024)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if afsOrder != nil {
|
|
||||||
//直接就来一个新的售后单,并且还是售后完成的
|
|
||||||
if orderStatus.Status == model.AfsOrderStatusFinished {
|
|
||||||
afsOrder.AfsFinishedAt = afsOrder.AfsCreatedAt
|
|
||||||
}
|
|
||||||
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return mtwmapi.Err2CallbackResponse(err, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PurchaseHandler) createAfsOrder(orderData url.Values) (afsOrder *model.AfsOrder) {
|
|
||||||
afsOrder, err := partner.CurOrderManager.CreateAfsOrderFromOrder(orderData.Get("order_id"), model.VendorIDMTWM)
|
|
||||||
if err == nil {
|
|
||||||
afsOrder.AfsOrderID = orderData.Get("refund_id")
|
|
||||||
afsOrder.AfsCreatedAt = utils.Timestamp2Time(utils.Str2Int64(orderData.Get("timestamp")))
|
|
||||||
if afsOrder.AfsOrderID == "" {
|
|
||||||
afsOrder.AfsOrderID = afsOrder.VendorOrderID
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
afsOrder = nil
|
|
||||||
}
|
|
||||||
return afsOrder
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) callbackAfsMsg2Status(msg *tiktokShop.OrderCallback) (orderStatus []*model.OrderStatus) {
|
|
||||||
switch msg.MsgId {
|
|
||||||
case tiktokShop.CallbackRefundOrderMsgTagId: // 买家发起售后申请消息
|
|
||||||
for _, v := range msg.Body[tiktokShop.CallbackRefundOrderMsgTagId] {
|
|
||||||
refundOrder := v.(*tiktokShop.BuyerRefundCreatedData)
|
|
||||||
orderMsg := &model.OrderStatus{
|
|
||||||
VendorID: model.VendorIDDD,
|
|
||||||
OrderType: model.OrderTypeAfsOrder,
|
|
||||||
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
|
||||||
RefVendorID: model.VendorIDDD,
|
|
||||||
VendorStatus: fmt.Sprintf("%s:%s", "order", "create"),
|
|
||||||
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackRefundOrderMsgTagId),
|
|
||||||
StatusTime: utils.Timestamp2Time(int64(refundOrder.ApplyTime)),
|
|
||||||
}
|
|
||||||
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
|
||||||
orderMsg.Remark = k
|
|
||||||
} else {
|
|
||||||
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
|
||||||
}
|
|
||||||
|
|
||||||
if refundOrder.AftersaleId > 0 {
|
|
||||||
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
|
||||||
} else {
|
|
||||||
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
|
||||||
}
|
|
||||||
orderStatus = append(orderStatus, orderMsg)
|
|
||||||
}
|
|
||||||
case tiktokShop.CallbackUpdateRefundOrderMsgTagId: // 买家修改售后申请消息
|
|
||||||
for _, v := range msg.Body[tiktokShop.CallbackUpdateRefundOrderMsgTagId] {
|
|
||||||
refundOrder := v.(*tiktokShop.BuyerRefundModifiedData)
|
|
||||||
orderMsg := &model.OrderStatus{
|
|
||||||
VendorID: model.VendorIDDD,
|
|
||||||
OrderType: model.OrderTypeAfsOrder,
|
|
||||||
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
|
||||||
RefVendorID: model.VendorIDDD,
|
|
||||||
VendorStatus: fmt.Sprintf("%s:%s", "order", "update"),
|
|
||||||
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
|
|
||||||
StatusTime: utils.Timestamp2Time(int64(refundOrder.ModifyTime)),
|
|
||||||
}
|
|
||||||
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
|
||||||
orderMsg.Remark = k
|
|
||||||
} else {
|
|
||||||
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
|
||||||
}
|
|
||||||
|
|
||||||
if refundOrder.AftersaleId > 0 {
|
|
||||||
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
|
||||||
} else {
|
|
||||||
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
|
||||||
}
|
|
||||||
orderStatus = append(orderStatus, orderMsg)
|
|
||||||
}
|
|
||||||
case tiktokShop.CallbackRefundOrderSuccessMsgTagId: // 退款成功消息
|
|
||||||
for _, v := range msg.Body[tiktokShop.CallbackRefundOrderSuccessMsgTagId] {
|
|
||||||
refundOrder := v.(*tiktokShop.BusinessRefundSuccessData)
|
|
||||||
orderMsg := &model.OrderStatus{
|
|
||||||
VendorID: model.VendorIDDD,
|
|
||||||
OrderType: model.OrderTypeAfsOrder,
|
|
||||||
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
|
||||||
RefVendorID: model.VendorIDDD,
|
|
||||||
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_success"),
|
|
||||||
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
|
|
||||||
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
|
|
||||||
}
|
|
||||||
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
|
||||||
orderMsg.Remark = k
|
|
||||||
} else {
|
|
||||||
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
|
||||||
}
|
|
||||||
if refundOrder.AftersaleId > 0 {
|
|
||||||
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
|
||||||
} else {
|
|
||||||
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
|
||||||
}
|
|
||||||
orderStatus = append(orderStatus, orderMsg)
|
|
||||||
}
|
|
||||||
case tiktokShop.CallbackRefundOrderRefuseMsgTagId: // 拒绝退款消息
|
|
||||||
for _, v := range msg.Body[tiktokShop.CallbackRefundOrderSuccessMsgTagId] {
|
|
||||||
refundOrder := v.(*tiktokShop.BusinessRefundSuccessData)
|
|
||||||
orderMsg := &model.OrderStatus{
|
|
||||||
VendorID: model.VendorIDDD,
|
|
||||||
OrderType: model.OrderTypeAfsOrder,
|
|
||||||
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
|
||||||
RefVendorID: model.VendorIDDD,
|
|
||||||
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_money_fail"),
|
|
||||||
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
|
|
||||||
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
|
|
||||||
}
|
|
||||||
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
|
||||||
orderMsg.Remark = k
|
|
||||||
} else {
|
|
||||||
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
|
||||||
}
|
|
||||||
if refundOrder.AftersaleId > 0 {
|
|
||||||
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
|
||||||
} else {
|
|
||||||
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
|
||||||
}
|
|
||||||
orderStatus = append(orderStatus, orderMsg)
|
|
||||||
}
|
|
||||||
case tiktokShop.CallbackRefundShopMsgTagId: // 拒绝退货申请消息
|
|
||||||
for _, v := range msg.Body[tiktokShop.CallbackRefundShopMsgTagId] {
|
|
||||||
refundOrder := v.(*tiktokShop.BusinessNotReturnApplyRefusedData)
|
|
||||||
orderMsg := &model.OrderStatus{
|
|
||||||
VendorID: model.VendorIDDD,
|
|
||||||
OrderType: model.OrderTypeAfsOrder,
|
|
||||||
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
|
||||||
RefVendorID: model.VendorIDDD,
|
|
||||||
VendorStatus: fmt.Sprintf("%s:%s", "order", "refuse_shop_fail"),
|
|
||||||
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackRefundShopMsgTagId),
|
|
||||||
StatusTime: utils.Timestamp2Time(int64(refundOrder.RefuseTime)),
|
|
||||||
}
|
|
||||||
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
|
||||||
orderMsg.Remark = k
|
|
||||||
} else {
|
|
||||||
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
|
||||||
}
|
|
||||||
if refundOrder.AftersaleId > 0 {
|
|
||||||
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
|
||||||
} else {
|
|
||||||
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
|
||||||
}
|
|
||||||
orderStatus = append(orderStatus, orderMsg)
|
|
||||||
}
|
|
||||||
case tiktokShop.CallbackReturnApplyAgreedMsgTagId: // 同意退货申请消息
|
|
||||||
for _, v := range msg.Body[tiktokShop.CallbackReturnApplyAgreedMsgTagId] {
|
|
||||||
refundOrder := v.(*tiktokShop.BusinessRefundSuccessData)
|
|
||||||
orderMsg := &model.OrderStatus{
|
|
||||||
VendorID: model.VendorIDDD,
|
|
||||||
OrderType: model.OrderTypeAfsOrder,
|
|
||||||
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
|
||||||
RefVendorID: model.VendorIDDD,
|
|
||||||
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_shop_success"),
|
|
||||||
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackReturnApplyAgreedMsgTagId),
|
|
||||||
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
|
|
||||||
}
|
|
||||||
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
|
||||||
orderMsg.Remark = k
|
|
||||||
} else {
|
|
||||||
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
|
||||||
}
|
|
||||||
if refundOrder.AftersaleId > 0 {
|
|
||||||
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
|
||||||
} else {
|
|
||||||
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
|
||||||
}
|
|
||||||
orderStatus = append(orderStatus, orderMsg)
|
|
||||||
}
|
|
||||||
case tiktokShop.CallbackReturnRefundAgreedMsgTagId: // 同意退款消息
|
|
||||||
for _, v := range msg.Body[tiktokShop.CallbackReturnRefundAgreedMsgTagId] {
|
|
||||||
refundOrder := v.(*tiktokShop.BusinessRefundSuccessData)
|
|
||||||
orderMsg := &model.OrderStatus{
|
|
||||||
VendorID: model.VendorIDDD,
|
|
||||||
OrderType: model.OrderTypeAfsOrder,
|
|
||||||
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
|
||||||
RefVendorID: model.VendorIDDD,
|
|
||||||
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_money_success"),
|
|
||||||
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackReturnRefundAgreedMsgTagId),
|
|
||||||
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
|
|
||||||
}
|
|
||||||
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
|
||||||
orderMsg.Remark = k
|
|
||||||
} else {
|
|
||||||
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
|
||||||
}
|
|
||||||
if refundOrder.AftersaleId > 0 {
|
|
||||||
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
|
||||||
} else {
|
|
||||||
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
|
||||||
}
|
|
||||||
orderStatus = append(orderStatus, orderMsg)
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return orderStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *PurchaseHandler) GetAfsStatusFromVendorStatus(resType int, notifyType string) int {
|
|
||||||
status := AfsVendorStatus2StatusMap[notifyType]
|
|
||||||
if status == model.AfsOrderStatusWait4Approve && resType != mtwmapi.ResTypePending {
|
|
||||||
status = model.AfsOrderStatusNew
|
|
||||||
}
|
|
||||||
return status
|
|
||||||
}
|
|
||||||
|
|
||||||
// 审核售后单申请
|
|
||||||
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) {
|
func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *model.AfsOrder, approveType int, reason string) (err error) {
|
||||||
if globals.EnableMtwmStoreWrite {
|
if globals.EnableDdStoreWrite {
|
||||||
if approveType == partner.AfsApproveTypeRefused {
|
if approveType == partner.AfsApproveTypeRefused { // 拒绝退货
|
||||||
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).OrderRefundReject(utils.Str2Int64(order.VendorOrderID), reason)
|
err = getAPI(order.VendorOrgCode, order.JxStoreID, "").ReturnGoodsToWareHouseSuccess(order.AfsOrderID)
|
||||||
} else {
|
} else {
|
||||||
err = getAPI(order.VendorOrgCode, jxutils.GetSaleStoreIDFromAfsOrder(order), order.VendorStoreID).OrderRefundAgree(utils.Str2Int64(order.VendorOrderID), reason)
|
err = getAPI(order.VendorOrgCode, order.JxStoreID, "").ReturnGoodsToWareHouseSuccess(order.AfsOrderID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
@@ -418,13 +125,13 @@ func (c *PurchaseHandler) AgreeOrRefuseRefund(ctx *jxcontext.Context, order *mod
|
|||||||
|
|
||||||
// 确认收到退货
|
// 确认收到退货
|
||||||
func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) {
|
func (c *PurchaseHandler) ConfirmReceivedReturnGoods(ctx *jxcontext.Context, order *model.AfsOrder) (err error) {
|
||||||
err = fmt.Errorf("内部错误,美团外卖平台不支持确认收到退货操作")
|
err = fmt.Errorf("暂不支持的API调用")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发起全款退款
|
// 发起全款退款
|
||||||
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.VendorIDMTWM])
|
return fmt.Errorf("%s不支持售后全额退款,请让买家发起退款", model.VendorChineseNames[model.VendorIDDD])
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发起部分退款
|
// 发起部分退款
|
||||||
|
|||||||
294
business/partner/purchase/tiktok_store/order_afs_utils.go
Normal file
294
business/partner/purchase/tiktok_store/order_afs_utils.go
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
package tiktok_store
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
||||||
|
"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/business/partner"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals"
|
||||||
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
afsAppealTypeMap = map[int64]int8{
|
||||||
|
tiktokShop.AfterSaleTypeAll: model.AfsAppealTypeReturnAndRefund,
|
||||||
|
tiktokShop.AfterSaleTypeSendPkgOnlyReturnMoney: model.AfsAppealTypeRefund,
|
||||||
|
tiktokShop.AfterSaleTypeReturnMoney: model.AfsAppealTypeRefund,
|
||||||
|
tiktokShop.AfterSaleTypeChangePkg: model.AfsAppealTypeNewGoods,
|
||||||
|
tiktokShop.AfterSaleTypeSystemCancel: model.AfsAppealTypeSystemCancel,
|
||||||
|
tiktokShop.AfterSaleTypeUserCancel: model.AfsAppealTypeUserCancel,
|
||||||
|
tiktokShop.AfterSaleTypeInsuredPrice: model.AfsAppealTypeInsuredPrice,
|
||||||
|
tiktokShop.AfterSaleTypeReissue: model.AfsAppealTypeReissue,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// convertAfsAppealType 抖音订单索赔状态转换为当前系统状态
|
||||||
|
func (c *PurchaseHandler) convertAfsAppealType(vendorAppealType int64) int8 {
|
||||||
|
if status, ok := afsAppealTypeMap[vendorAppealType]; ok {
|
||||||
|
return status
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// 是否为售后消息
|
||||||
|
func (c *PurchaseHandler) isAfsMsg(msg string) bool {
|
||||||
|
_, ok := AfsTagIDMap[msg]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PurchaseHandler) OnAfsOrderMsg(msgId, orderId string, msg interface{}) (retVal *tiktokShop.CallbackResponse) {
|
||||||
|
jxutils.CallMsgHandlerAsync(func() {
|
||||||
|
retVal = c.onAfsOrderMsg(msgId, msg)
|
||||||
|
}, jxutils.ComposeUniversalOrderID(orderId, model.VendorIDDD))
|
||||||
|
return retVal
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo 对于退款与部分退款,order.go与这个文件中对于状态的处理不一致
|
||||||
|
func (c *PurchaseHandler) onAfsOrderMsg(msgId string, msg interface{}) (retVal *tiktokShop.CallbackResponse) {
|
||||||
|
var err error
|
||||||
|
orderStatus := c.callbackAfsMsg2Status(msgId, msg)
|
||||||
|
if orderStatus == nil {
|
||||||
|
return tiktokShop.Err2CallbackResponse(nil, "")
|
||||||
|
}
|
||||||
|
needCallNew := orderStatus.Status == model.AfsOrderStatusWait4Approve || orderStatus.Status == model.AfsOrderStatusNew
|
||||||
|
if !needCallNew {
|
||||||
|
if _, err := partner.CurOrderManager.LoadAfsOrder(orderStatus.VendorOrderID, orderStatus.VendorID); err != nil {
|
||||||
|
if dao.IsNoRowsError(err) {
|
||||||
|
needCallNew = true
|
||||||
|
} else {
|
||||||
|
return tiktokShop.Err2CallbackResponse(err, "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if needCallNew {
|
||||||
|
var afsOrder *model.AfsOrder
|
||||||
|
// 查询售后订单详情
|
||||||
|
tiktokAfsOrderDetail, err := api.TiktokStore.QueryAfsOrderDetail(orderStatus.VendorOrderID, false)
|
||||||
|
if err != nil {
|
||||||
|
globals.SugarLogger.Debug("tic-tok get AfsOrder err :", err)
|
||||||
|
return tiktokShop.Err2CallbackResponse(err, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
if msgId == tiktokShop.CallbackRefundOrderMsgTagId { // 不存在的新订单
|
||||||
|
afsOrder = &model.AfsOrder{
|
||||||
|
VendorID: model.VendorIDDD,
|
||||||
|
AfsOrderID: orderStatus.VendorOrderID,
|
||||||
|
VendorOrderID: orderStatus.RefVendorOrderID,
|
||||||
|
VendorStoreID: "",
|
||||||
|
StoreID: 0,
|
||||||
|
AfsCreatedAt: orderStatus.StatusTime,
|
||||||
|
|
||||||
|
VendorAppealType: utils.Int64ToStr(tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.AfterSaleStatus),
|
||||||
|
AppealType: c.convertAfsAppealType(tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.AfterSaleType),
|
||||||
|
VendorReasonType: tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.Reason,
|
||||||
|
ReasonType: int8(tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.ReasonCode),
|
||||||
|
ReasonDesc: tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.ReasonRemark,
|
||||||
|
ReasonImgList: utils.LimitUTF8StringLen(strings.Join(tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.Evidence, ","), 1024),
|
||||||
|
RefundType: model.AfsTypeUnknown,
|
||||||
|
VendorOrgCode: api.TiktokStore.GetAppId(),
|
||||||
|
}
|
||||||
|
afsOrder.FreightUserMoney = tiktokAfsOrderDetail.Data.ProcessInfo.AfterSaleInfo.RefundPostAmount
|
||||||
|
afsOrder.AfsFreightMoney = 0 // 暂时未发现退货取件费用
|
||||||
|
afsOrder.BoxMoney = 0 // 餐盒费
|
||||||
|
afsOrder.TongchengFreightMoney = 0 // 同城配送费
|
||||||
|
afsOrder.SkuBoxMoney = 0 // 商品包装费
|
||||||
|
afsOrder.VendorStatus = orderStatus.VendorStatus // 退货状态
|
||||||
|
for _, sku := range tiktokAfsOrderDetail.Data.OrderInfo.SkuOrderInfos {
|
||||||
|
orderSku := &model.OrderSkuFinancial{
|
||||||
|
Count: int(sku.ItemQuantity),
|
||||||
|
VendorSkuID: utils.Int64ToStr(sku.SkuOrderId),
|
||||||
|
SkuID: utils.Str2Int(sku.ShopSkuCode),
|
||||||
|
Name: sku.ProductName,
|
||||||
|
UserMoney: sku.PayAmount,
|
||||||
|
PmSkuSubsidyMoney: sku.PromotionAmount, // 平台补贴商品
|
||||||
|
}
|
||||||
|
|
||||||
|
afsOrder.PmSkuSubsidyMoney += orderSku.PmSkuSubsidyMoney
|
||||||
|
afsOrder.SkuUserMoney += orderSku.UserMoney
|
||||||
|
afsOrder.Skus = append(afsOrder.Skus, orderSku)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if afsOrder != nil {
|
||||||
|
//直接就来一个新的售后单,并且还是售后完成的
|
||||||
|
if orderStatus.Status == model.AfsOrderStatusFinished {
|
||||||
|
afsOrder.AfsFinishedAt = afsOrder.AfsCreatedAt
|
||||||
|
}
|
||||||
|
err = partner.CurOrderManager.OnAfsOrderNew(afsOrder, orderStatus)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
err = partner.CurOrderManager.OnAfsOrderStatusChanged(orderStatus)
|
||||||
|
}
|
||||||
|
|
||||||
|
return tiktokShop.Err2CallbackResponse(err, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PurchaseHandler) callbackAfsMsg2Status(msgId string, msg interface{}) (orderStatus *model.OrderStatus) {
|
||||||
|
switch msgId {
|
||||||
|
case tiktokShop.CallbackRefundOrderMsgTagId: // 买家发起售后申请消息
|
||||||
|
refundOrder := msg.(*tiktokShop.BuyerRefundCreatedData)
|
||||||
|
orderMsg := &model.OrderStatus{
|
||||||
|
VendorID: model.VendorIDDD,
|
||||||
|
OrderType: model.OrderTypeAfsOrder,
|
||||||
|
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
||||||
|
RefVendorID: model.VendorIDDD,
|
||||||
|
VendorStatus: fmt.Sprintf("%s:%s", "order", "create"),
|
||||||
|
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackRefundOrderMsgTagId),
|
||||||
|
StatusTime: utils.Timestamp2Time(int64(refundOrder.ApplyTime)),
|
||||||
|
}
|
||||||
|
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
||||||
|
orderMsg.Remark = k
|
||||||
|
} else {
|
||||||
|
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
if refundOrder.AftersaleId > 0 {
|
||||||
|
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
||||||
|
} else {
|
||||||
|
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
||||||
|
}
|
||||||
|
case tiktokShop.CallbackUpdateRefundOrderMsgTagId: // 买家修改售后申请消息
|
||||||
|
refundOrder := msg.(*tiktokShop.BuyerRefundModifiedData)
|
||||||
|
orderMsg := &model.OrderStatus{
|
||||||
|
VendorID: model.VendorIDDD,
|
||||||
|
OrderType: model.OrderTypeAfsOrder,
|
||||||
|
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
||||||
|
RefVendorID: model.VendorIDDD,
|
||||||
|
VendorStatus: fmt.Sprintf("%s:%s", "order", "update"),
|
||||||
|
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
|
||||||
|
StatusTime: utils.Timestamp2Time(int64(refundOrder.ModifyTime)),
|
||||||
|
}
|
||||||
|
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
||||||
|
orderMsg.Remark = k
|
||||||
|
} else {
|
||||||
|
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
if refundOrder.AftersaleId > 0 {
|
||||||
|
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
||||||
|
} else {
|
||||||
|
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
||||||
|
}
|
||||||
|
case tiktokShop.CallbackRefundOrderSuccessMsgTagId: // 退款成功消息
|
||||||
|
refundOrder := msg.(*tiktokShop.BusinessRefundSuccessData)
|
||||||
|
orderMsg := &model.OrderStatus{
|
||||||
|
VendorID: model.VendorIDDD,
|
||||||
|
OrderType: model.OrderTypeAfsOrder,
|
||||||
|
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
||||||
|
RefVendorID: model.VendorIDDD,
|
||||||
|
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_success"),
|
||||||
|
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
|
||||||
|
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
|
||||||
|
}
|
||||||
|
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
||||||
|
orderMsg.Remark = k
|
||||||
|
} else {
|
||||||
|
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
||||||
|
}
|
||||||
|
if refundOrder.AftersaleId > 0 {
|
||||||
|
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
||||||
|
} else {
|
||||||
|
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
||||||
|
}
|
||||||
|
case tiktokShop.CallbackRefundOrderRefuseMsgTagId: // 拒绝退款消息
|
||||||
|
refundOrder := msg.(*tiktokShop.BusinessRefundSuccessData)
|
||||||
|
orderMsg := &model.OrderStatus{
|
||||||
|
VendorID: model.VendorIDDD,
|
||||||
|
OrderType: model.OrderTypeAfsOrder,
|
||||||
|
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
||||||
|
RefVendorID: model.VendorIDDD,
|
||||||
|
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_money_fail"),
|
||||||
|
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackUpdateRefundOrderMsgTagId),
|
||||||
|
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
|
||||||
|
}
|
||||||
|
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
||||||
|
orderMsg.Remark = k
|
||||||
|
} else {
|
||||||
|
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
||||||
|
}
|
||||||
|
if refundOrder.AftersaleId > 0 {
|
||||||
|
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
||||||
|
} else {
|
||||||
|
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
||||||
|
}
|
||||||
|
case tiktokShop.CallbackRefundShopMsgTagId: // 拒绝退货申请消息
|
||||||
|
refundOrder := msg.(*tiktokShop.BusinessNotReturnApplyRefusedData)
|
||||||
|
orderMsg := &model.OrderStatus{
|
||||||
|
VendorID: model.VendorIDDD,
|
||||||
|
OrderType: model.OrderTypeAfsOrder,
|
||||||
|
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
||||||
|
RefVendorID: model.VendorIDDD,
|
||||||
|
VendorStatus: fmt.Sprintf("%s:%s", "order", "refuse_shop_fail"),
|
||||||
|
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackRefundShopMsgTagId),
|
||||||
|
StatusTime: utils.Timestamp2Time(int64(refundOrder.RefuseTime)),
|
||||||
|
}
|
||||||
|
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
||||||
|
orderMsg.Remark = k
|
||||||
|
} else {
|
||||||
|
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
||||||
|
}
|
||||||
|
if refundOrder.AftersaleId > 0 {
|
||||||
|
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
||||||
|
} else {
|
||||||
|
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
||||||
|
}
|
||||||
|
case tiktokShop.CallbackReturnApplyAgreedMsgTagId: // 同意退货申请消息
|
||||||
|
refundOrder := msg.(*tiktokShop.BusinessRefundSuccessData)
|
||||||
|
orderMsg := &model.OrderStatus{
|
||||||
|
VendorID: model.VendorIDDD,
|
||||||
|
OrderType: model.OrderTypeAfsOrder,
|
||||||
|
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
||||||
|
RefVendorID: model.VendorIDDD,
|
||||||
|
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_shop_success"),
|
||||||
|
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackReturnApplyAgreedMsgTagId),
|
||||||
|
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
|
||||||
|
}
|
||||||
|
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
||||||
|
orderMsg.Remark = k
|
||||||
|
} else {
|
||||||
|
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
||||||
|
}
|
||||||
|
if refundOrder.AftersaleId > 0 {
|
||||||
|
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
||||||
|
} else {
|
||||||
|
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
||||||
|
}
|
||||||
|
case tiktokShop.CallbackReturnRefundAgreedMsgTagId: // 同意退款消息
|
||||||
|
refundOrder := msg.(*tiktokShop.BusinessRefundSuccessData)
|
||||||
|
orderMsg := &model.OrderStatus{
|
||||||
|
VendorID: model.VendorIDDD,
|
||||||
|
OrderType: model.OrderTypeAfsOrder,
|
||||||
|
RefVendorOrderID: utils.Int64ToStr(refundOrder.PId),
|
||||||
|
RefVendorID: model.VendorIDDD,
|
||||||
|
VendorStatus: fmt.Sprintf("%s:%s", "order", "refund_money_success"),
|
||||||
|
Status: c.GetAfsStatusFromVendorStatus(refundOrder.AftersaleType, tiktokShop.CallbackReturnRefundAgreedMsgTagId),
|
||||||
|
StatusTime: utils.Timestamp2Time(int64(refundOrder.SuccessTime)),
|
||||||
|
}
|
||||||
|
if k, ok := ReasonCodeMap[refundOrder.ReasonCode]; ok {
|
||||||
|
orderMsg.Remark = k
|
||||||
|
} else {
|
||||||
|
orderMsg.Remark = "抖音reason_code对应reason不足,需要更新.code:" + string(refundOrder.ReasonCode)
|
||||||
|
}
|
||||||
|
if refundOrder.AftersaleId > 0 {
|
||||||
|
orderMsg.VendorOrderID = utils.Int64ToStr(refundOrder.AftersaleId)
|
||||||
|
} else {
|
||||||
|
orderMsg.VendorOrderID = orderMsg.RefVendorOrderID
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return orderStatus
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *PurchaseHandler) GetAfsStatusFromVendorStatus(resType int, notifyType string) int {
|
||||||
|
status := AfsVendorStatus2StatusMap[notifyType]
|
||||||
|
if status == model.AfsOrderStatusWait4Approve && resType == tiktokShop.AfterSaleStatusApply {
|
||||||
|
status = model.AfsOrderStatusNew
|
||||||
|
}
|
||||||
|
return status
|
||||||
|
}
|
||||||
@@ -4,16 +4,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/partner"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"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/globals"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -42,72 +35,73 @@ func formalizeTagList(mtwmTagList string) (outTagList string) {
|
|||||||
return outTagList
|
return outTagList
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RefreshComment 拉去用户评论
|
||||||
func (c *PurchaseHandler) RefreshComment(fromTime, toTime time.Time) (err error) {
|
func (c *PurchaseHandler) RefreshComment(fromTime, toTime time.Time) (err error) {
|
||||||
//storeMapList, err2 := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDMTWM}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "")
|
//storeMapList, err2 := dao.GetStoresMapList(dao.GetDB(), []int{model.VendorIDMTWM}, nil, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "")
|
||||||
//if err = err2; err != nil {
|
//if err = err2; err != nil {
|
||||||
// return err
|
// return err
|
||||||
//}
|
//}
|
||||||
endDateStr := time.Now().Add(-24 * time.Hour).Format("20060102")
|
//endDateStr := time.Now().Add(-24 * time.Hour).Format("20060102")
|
||||||
startDateStr := time.Now().Add(-RefreshCommentTime).Format("20060102")
|
//startDateStr := time.Now().Add(-RefreshCommentTime).Format("20060102")
|
||||||
storeIDs, _ := dao.GetOrderStoreIDs(dao.GetDB(), fromTime, toTime, model.VendorIDMTWM)
|
//storeIDs, _ := dao.GetOrderStoreIDs(dao.GetDB(), fromTime, toTime, model.VendorIDMTWM)
|
||||||
task := tasksch.NewParallelTask("mtwm RefreshComment", nil, jxcontext.AdminCtx,
|
//task := tasksch.NewParallelTask("mtwm RefreshComment", nil, jxcontext.AdminCtx,
|
||||||
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)
|
||||||
storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, "")
|
// storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, "")
|
||||||
commentList, err2 := getAPI(storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID).CommentQuery(storeDetail.VendorStoreID, startDateStr, endDateStr, 0, 0, mtwmapi.CommentReplyStatusNotReplied)
|
// commentList, err2 := getAPI(storeDetail.VendorOrgCode, storeID, storeDetail.VendorStoreID).CommentQuery(storeDetail.VendorStoreID, startDateStr, endDateStr, 0, 0, mtwmapi.CommentReplyStatusNotReplied)
|
||||||
var orderCommentList []*model.OrderComment
|
// var orderCommentList []*model.OrderComment
|
||||||
if err = err2; err != nil {
|
// if err = err2; err != nil {
|
||||||
return nil, err
|
// return nil, err
|
||||||
}
|
// }
|
||||||
for _, mtwmComment := range commentList {
|
// for _, mtwmComment := range commentList {
|
||||||
createdTime, err := utils.TryStr2Time(mtwmComment.CommentTime)
|
// createdTime, err := utils.TryStr2Time(mtwmComment.CommentTime)
|
||||||
if err == nil {
|
// if err == nil {
|
||||||
orderComment := &model.OrderComment{
|
// orderComment := &model.OrderComment{
|
||||||
VendorOrderID: utils.Int64ToStr(mtwmComment.CommentID), // 美团评价不能得到订单号,以评价ID代替
|
// VendorOrderID: utils.Int64ToStr(mtwmComment.CommentID), // 美团评价不能得到订单号,以评价ID代替
|
||||||
VendorID: model.VendorIDMTWM,
|
// VendorID: model.VendorIDMTWM,
|
||||||
UserCommentID: utils.Int64ToStr(mtwmComment.CommentID),
|
// UserCommentID: utils.Int64ToStr(mtwmComment.CommentID),
|
||||||
VendorStoreID: storeDetail.VendorStoreID,
|
// VendorStoreID: storeDetail.VendorStoreID,
|
||||||
TagList: formalizeTagList(mtwmComment.CommentLables),
|
// TagList: formalizeTagList(mtwmComment.CommentLables),
|
||||||
Score: int8(mtwmComment.FoodCommentScore),
|
// Score: int8(mtwmComment.FoodCommentScore),
|
||||||
ModifyDuration: BAD_COMMENTS_MAX_MODIFY_TIME,
|
// ModifyDuration: BAD_COMMENTS_MAX_MODIFY_TIME,
|
||||||
OriginalMsg: string(utils.MustMarshal(mtwmComment)),
|
// OriginalMsg: string(utils.MustMarshal(mtwmComment)),
|
||||||
IsReplied: int8(mtwmComment.ReplyStatus),
|
// IsReplied: int8(mtwmComment.ReplyStatus),
|
||||||
StoreID: storeDetail.ID,
|
// StoreID: storeDetail.ID,
|
||||||
}
|
// }
|
||||||
if orderComment.IsReplied == 0 {
|
// if orderComment.IsReplied == 0 {
|
||||||
orderComment.Content = mtwmComment.CommentContent
|
// orderComment.Content = mtwmComment.CommentContent
|
||||||
orderComment.CommentCreatedAt = createdTime
|
// orderComment.CommentCreatedAt = createdTime
|
||||||
} else {
|
// } else {
|
||||||
orderComment.Content = mtwmComment.AddComment
|
// orderComment.Content = mtwmComment.AddComment
|
||||||
if updatedTime, err := utils.TryStr2Time(mtwmComment.CommentTime); err == nil {
|
// if updatedTime, err := utils.TryStr2Time(mtwmComment.CommentTime); err == nil {
|
||||||
orderComment.CommentCreatedAt = updatedTime
|
// orderComment.CommentCreatedAt = updatedTime
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
orderCommentList = append(orderCommentList, orderComment)
|
// orderCommentList = append(orderCommentList, orderComment)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
return orderCommentList, nil
|
// return orderCommentList, nil
|
||||||
}, storeIDs)
|
// }, storeIDs)
|
||||||
task.Run()
|
//task.Run()
|
||||||
resultList, err2 := task.GetResult(0)
|
//resultList, err2 := task.GetResult(0)
|
||||||
if err = err2; err != nil {
|
//if err = err2; err != nil {
|
||||||
return err
|
// return err
|
||||||
}
|
//}
|
||||||
var orderCommentList []*model.OrderComment
|
//var orderCommentList []*model.OrderComment
|
||||||
for _, result := range resultList {
|
//for _, result := range resultList {
|
||||||
orderComment := result.(*model.OrderComment)
|
// orderComment := result.(*model.OrderComment)
|
||||||
orderCommentList = append(orderCommentList, orderComment)
|
// orderCommentList = append(orderCommentList, orderComment)
|
||||||
}
|
//}
|
||||||
if len(orderCommentList) > 0 {
|
//if len(orderCommentList) > 0 {
|
||||||
err = partner.CurOrderManager.OnOrderComments(orderCommentList)
|
// err = partner.CurOrderManager.OnOrderComments(orderCommentList)
|
||||||
}
|
//}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ReplyOrderComment 订单评价恢复
|
||||||
func (c *PurchaseHandler) ReplyOrderComment(ctx *jxcontext.Context, vendorOrgCode string, orderComment *model.OrderComment, replyComment string) (err error) {
|
func (c *PurchaseHandler) ReplyOrderComment(ctx *jxcontext.Context, vendorOrgCode string, orderComment *model.OrderComment, replyComment string) (err error) {
|
||||||
globals.SugarLogger.Debugf("mtwm ReplyOrderComment, orderComment:%s, replyComment:%s", utils.Format4Output(orderComment, true), replyComment)
|
//if globals.EnableMtwmStoreWrite {
|
||||||
if globals.EnableMtwmStoreWrite {
|
// err = getAPI(vendorOrgCode, orderComment.StoreID, orderComment.VendorStoreID).CommentAddReply(orderComment.VendorStoreID, utils.Str2Int64(orderComment.UserCommentID), replyComment)
|
||||||
err = getAPI(vendorOrgCode, orderComment.StoreID, orderComment.VendorStoreID).CommentAddReply(orderComment.VendorStoreID, utils.Str2Int64(orderComment.UserCommentID), replyComment)
|
//}
|
||||||
}
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,11 @@ package tiktok_store
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
product_addV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_addV2/request"
|
||||||
|
product_detail_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_detail/response"
|
||||||
|
product_editV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_editV2/request"
|
||||||
|
tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -34,12 +39,13 @@ var (
|
|||||||
sensitiveWordRegexp = regexp.MustCompile(`包含敏感词:(\[.*\])`)
|
sensitiveWordRegexp = regexp.MustCompile(`包含敏感词:(\[.*\])`)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// GetStoreSkusBatchSize 当前任务最大更新条数
|
||||||
func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
|
func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
|
||||||
switch funcID {
|
switch funcID {
|
||||||
case partner.FuncUpdateStoreSkusStock, partner.FuncUpdateStoreSkusStatus, partner.FuncUpdateStoreSkusPrice:
|
case partner.FuncUpdateStoreSkusStock, partner.FuncUpdateStoreSkusStatus, partner.FuncUpdateStoreSkusPrice:
|
||||||
batchSize = mtwmapi.MaxStoreSkuBatchSize
|
batchSize = tiktokShop.MaxStoreSkuBatchSize
|
||||||
case partner.FuncDeleteStoreSkus:
|
case partner.FuncDeleteStoreSkus:
|
||||||
batchSize = mtwmapi.MaxBatchDeleteSize
|
batchSize = tiktokShop.MaxBatchDeleteSize
|
||||||
case partner.FuncCreateStoreSkus:
|
case partner.FuncCreateStoreSkus:
|
||||||
batchSize = 1 // 可考虑用批量操作
|
batchSize = 1 // 可考虑用批量操作
|
||||||
case partner.FuncUpdateStoreSkus:
|
case partner.FuncUpdateStoreSkus:
|
||||||
@@ -47,36 +53,36 @@ func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
|
|||||||
case partner.FuncGetStoreSkusFullInfo:
|
case partner.FuncGetStoreSkusFullInfo:
|
||||||
batchSize = 1
|
batchSize = 1
|
||||||
case partner.FuncCreateActs:
|
case partner.FuncCreateActs:
|
||||||
batchSize = mtwmapi.MaxRetailDiscountCreateBatchSize
|
batchSize = tiktokShop.MaxRetailDiscountCreateBatchSize
|
||||||
case partner.FuncCancelActs:
|
case partner.FuncCancelActs:
|
||||||
batchSize = mtwmapi.MaxRetailDiscountDeleteBatchSize
|
batchSize = tiktokShop.MaxRetailDiscountDeleteBatchSize
|
||||||
}
|
}
|
||||||
return batchSize
|
return batchSize
|
||||||
}
|
}
|
||||||
|
|
||||||
func getStoreVendorOrgCode(storeID int) (vendorOrgCode string) {
|
func getStoreVendorOrgCode(storeID int) (vendorOrgCode string) {
|
||||||
if storeMap, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDMTWM, ""); storeMap != nil {
|
if storeMap, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDDD, ""); storeMap != nil {
|
||||||
return storeMap.VendorOrgCode
|
return storeMap.VendorOrgCode
|
||||||
}
|
}
|
||||||
return vendorOrgCode
|
return vendorOrgCode
|
||||||
}
|
}
|
||||||
|
|
||||||
// 门店分类
|
// GetStoreAllCategories 门店分类
|
||||||
func (p *PurchaseHandler) GetStoreAllCategories(ctx *jxcontext.Context, storeID int, vendorStoreID string) (cats []*partner.BareCategoryInfo, err error) {
|
func (p *PurchaseHandler) GetStoreAllCategories(ctx *jxcontext.Context, storeID int, vendorStoreID string) (cats []*partner.BareCategoryInfo, err error) {
|
||||||
remoteCats, err := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatList(vendorStoreID)
|
remoteCats, err := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).GetShopCategory(0)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
cats = convertVendorCatList(remoteCats)
|
cats = convertVendorCatList(remoteCats)
|
||||||
}
|
}
|
||||||
return cats, err
|
return cats, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func convertVendorCatList(remoteCats []*mtwmapi.RetailCategoryInfo) (cats []*partner.BareCategoryInfo) {
|
func convertVendorCatList(remoteCats []*tiktokShop.RetailCategoryInfo) (cats []*partner.BareCategoryInfo) {
|
||||||
for _, rCat := range remoteCats {
|
for _, rCat := range remoteCats {
|
||||||
cat := &partner.BareCategoryInfo{
|
cat := &partner.BareCategoryInfo{
|
||||||
VendorCatID: rCat.Code,
|
VendorCatID: utils.Int64ToStr(rCat.Id),
|
||||||
Name: rCat.Name,
|
Name: rCat.Name,
|
||||||
Level: rCat.Level,
|
Level: int(rCat.Level),
|
||||||
Seq: rCat.Sequence,
|
Seq: 0,
|
||||||
Children: convertVendorCatList(rCat.Children),
|
Children: convertVendorCatList(rCat.Children),
|
||||||
}
|
}
|
||||||
if cat.VendorCatID == "" {
|
if cat.VendorCatID == "" {
|
||||||
@@ -113,63 +119,63 @@ func tryCatName2Code(originName string) (catCodeStr string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) {
|
func (p *PurchaseHandler) CreateStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeCat *dao.SkuStoreCatInfo) (err error) {
|
||||||
level := 1
|
//level := 1
|
||||||
if storeCat.ParentCatName != "" {
|
//if storeCat.ParentCatName != "" {
|
||||||
level = 2
|
// level = 2
|
||||||
}
|
//}
|
||||||
originName := ""
|
//originName := ""
|
||||||
catName := storeCat.Name
|
//catName := storeCat.Name
|
||||||
catCode := storeCat.ID
|
//catCode := storeCat.ID
|
||||||
|
//
|
||||||
subCatName := ""
|
//subCatName := ""
|
||||||
subCatCode := 0
|
//subCatCode := 0
|
||||||
if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 {
|
//if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 {
|
||||||
// 修改一级分类
|
// // 修改一级分类
|
||||||
originName = storeCat.VendorCatID
|
// originName = storeCat.VendorCatID
|
||||||
}
|
//}
|
||||||
if level == 2 { // 二级分类
|
//if level == 2 { // 二级分类
|
||||||
// 创建二级分类
|
// // 创建二级分类
|
||||||
originName = storeCat.ParentVendorCatID
|
// originName = storeCat.ParentVendorCatID
|
||||||
catName = storeCat.ParentCatName
|
// catName = storeCat.ParentCatName
|
||||||
catCode = storeCat.ParentID
|
// catCode = storeCat.ParentID
|
||||||
subCatName = storeCat.Name
|
// subCatName = storeCat.Name
|
||||||
subCatCode = storeCat.ID
|
// subCatCode = storeCat.ID
|
||||||
if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 {
|
// if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 {
|
||||||
// 修改二级分类
|
// // 修改二级分类
|
||||||
originName = storeCat.VendorCatID
|
// originName = storeCat.VendorCatID
|
||||||
catName = storeCat.Name
|
// catName = storeCat.Name
|
||||||
catCode = storeCat.ID
|
// catCode = storeCat.ID
|
||||||
subCatName = ""
|
// subCatName = ""
|
||||||
subCatCode = 0
|
// subCatCode = 0
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
if catName == "" {
|
//if catName == "" {
|
||||||
panic("catName is empty")
|
// panic("catName is empty")
|
||||||
}
|
//}
|
||||||
catName = utils.FilterEmoji(catName)
|
//catName = utils.FilterEmoji(catName)
|
||||||
subCatName = utils.FilterEmoji(subCatName)
|
//subCatName = utils.FilterEmoji(subCatName)
|
||||||
globals.SugarLogger.Debugf("mtwm CreateStoreCategory vendorStoreID:%s, originName:%s, catCode:%d, catName:%s, subCatCode:%d, subCatName:%s, seq:%d",
|
//globals.SugarLogger.Debugf("mtwm CreateStoreCategory vendorStoreID:%s, originName:%s, catCode:%d, catName:%s, subCatCode:%d, subCatName:%s, seq:%d",
|
||||||
vendorStoreID, originName, catCode, catName, subCatCode, subCatName, storeCat.Seq)
|
// vendorStoreID, originName, catCode, catName, subCatCode, subCatName, storeCat.Seq)
|
||||||
if globals.EnableMtwmStoreWrite {
|
//if globals.EnableMtwmStoreWrite {
|
||||||
// err = api.MtwmAPI.RetailCatUpdate2(vendorStoreID, tryCatName2Code(originName), originName, catCode2Str(catCode), catName, catCode2Str(subCatCode), subCatName, storeCat.Seq)
|
// // err = api.MtwmAPI.RetailCatUpdate2(vendorStoreID, tryCatName2Code(originName), originName, catCode2Str(catCode), catName, catCode2Str(subCatCode), subCatName, storeCat.Seq)
|
||||||
param4Update := &mtwmapi.Param4UpdateCat{
|
// param4Update := &mtwmapi.Param4UpdateCat{
|
||||||
CategoryCodeOrigin: tryCatName2Code(originName),
|
// CategoryCodeOrigin: tryCatName2Code(originName),
|
||||||
CategoryNameOrigin: originName,
|
// CategoryNameOrigin: originName,
|
||||||
CategoryCode: catCode2Str(catCode),
|
// CategoryCode: catCode2Str(catCode),
|
||||||
SecondaryCategoryCode: catCode2Str(subCatCode),
|
// SecondaryCategoryCode: catCode2Str(subCatCode),
|
||||||
SecondaryCategoryName: subCatName,
|
// SecondaryCategoryName: subCatName,
|
||||||
Sequence: storeCat.Seq,
|
// Sequence: storeCat.Seq,
|
||||||
}
|
// }
|
||||||
err = getAPI(storeCat.VendorOrgCode, storeID, vendorStoreID).RetailCatUpdate(vendorStoreID, catName, param4Update)
|
// err = getAPI(storeCat.VendorOrgCode, storeID, vendorStoreID).RetailCatUpdate(vendorStoreID, catName, param4Update)
|
||||||
if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 && p.IsErrCategoryNotExist(err) && originName != "" { // 修改分类名,但分类不存在
|
// if storeCat.CatSyncStatus&model.SyncFlagNewMask == 0 && p.IsErrCategoryNotExist(err) && originName != "" { // 修改分类名,但分类不存在
|
||||||
storeCat.CatSyncStatus |= model.SyncFlagNewMask
|
// storeCat.CatSyncStatus |= model.SyncFlagNewMask
|
||||||
err = p.CreateStoreCategory(ctx, storeID, vendorStoreID, storeCat)
|
// err = p.CreateStoreCategory(ctx, storeID, vendorStoreID, storeCat)
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
if err == nil {
|
//if err == nil {
|
||||||
// storeCat.VendorCatID = utils.FilterEmoji(storeCat.Name)
|
// // storeCat.VendorCatID = utils.FilterEmoji(storeCat.Name)
|
||||||
storeCat.VendorCatID = utils.Int2Str(storeCat.ID)
|
// storeCat.VendorCatID = utils.Int2Str(storeCat.ID)
|
||||||
}
|
//}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,23 +184,23 @@ func (p *PurchaseHandler) UpdateStoreCategory(ctx *jxcontext.Context, storeID in
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) {
|
func (p *PurchaseHandler) DeleteStoreCategory(ctx *jxcontext.Context, storeID int, vendorStoreID, vendorCatID string, level int) (err error) {
|
||||||
if false {
|
//if false {
|
||||||
if globals.EnableMtwmStoreWrite {
|
// if globals.EnableMtwmStoreWrite {
|
||||||
err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatDelete(vendorStoreID, tryCatName2Code(vendorCatID), vendorCatID)
|
// err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatDelete(vendorStoreID, tryCatName2Code(vendorCatID), vendorCatID)
|
||||||
}
|
// }
|
||||||
} else {
|
//} else {
|
||||||
var catCodes []string
|
// var catCodes []string
|
||||||
if catCode := tryCatName2Code(vendorCatID); catCode != "" {
|
// if catCode := tryCatName2Code(vendorCatID); catCode != "" {
|
||||||
catCodes = []string{catCode}
|
// catCodes = []string{catCode}
|
||||||
}
|
// }
|
||||||
if globals.EnableMtwmStoreWrite {
|
// if globals.EnableMtwmStoreWrite {
|
||||||
if level == 1 {
|
// if level == 1 {
|
||||||
err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, catCodes, []string{vendorCatID}, nil, nil, nil)
|
// err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, catCodes, []string{vendorCatID}, nil, nil, nil)
|
||||||
} else {
|
// } else {
|
||||||
err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, nil, nil, catCodes, []string{vendorCatID}, nil)
|
// err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, nil, nil, catCodes, []string{vendorCatID}, nil)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,6 +237,7 @@ func (p *PurchaseHandler) UpdateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
|||||||
return failedList, err
|
return failedList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CreateStoreSkus 门店创建商品
|
||||||
func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||||
failedList, err = p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, true)
|
failedList, err = p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, storeSkuList, true)
|
||||||
//if err == nil && vendorStoreID == specialStoreID {
|
//if err == nil && vendorStoreID == specialStoreID {
|
||||||
@@ -242,156 +249,155 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 对于多门店平台来说,storeSkuList中只有SkuID与VendorSkuID有意义
|
// 对于多门店平台来说,storeSkuList中只有SkuID与VendorSkuID有意义
|
||||||
|
// 抖店的商品只管创建,创建接口会返回成功,但是审核的时候不一定成功.当前系统无法判定此商品是否已经创建过了!
|
||||||
func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo, isCreate bool) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo, isCreate bool) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||||
var syncType string
|
var syncType string
|
||||||
foodDataList := make([]map[string]interface{}, len(storeSkuList))
|
storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDDD, "")
|
||||||
|
api := getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID)
|
||||||
|
freightId, err := api.GetStoreFreight(int64(storeID))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
if isCreate {
|
if isCreate {
|
||||||
syncType = "创建商品"
|
syncType = "创建商品"
|
||||||
} else {
|
for _, storeSku := range storeSkuList {
|
||||||
syncType = "更新商品"
|
// 创建商品
|
||||||
}
|
param := &product_addV2_request.ProductAddV2Param{
|
||||||
for i, storeSku := range storeSkuList {
|
CategoryLeafId: utils.Str2Int64(storeSku.VendorCatID),
|
||||||
isNeedUpdatePrice := isCreate //storeSku.SkuSyncStatus&(model.SyncFlagPriceMask|model.SyncFlagNewMask) != 0
|
Name: storeSku.Name,
|
||||||
foodData := make(map[string]interface{})
|
PayType: tiktokShop.TiktokPayType1,
|
||||||
foodDataList[i] = foodData
|
ReduceType: tiktokShop.SkuReduceTypePayMakeOrder,
|
||||||
foodData[mtwmapi.KeyAppFoodCode] = utils.Int2Str(storeSku.SkuID)
|
FreightId: freightId,
|
||||||
skus := []map[string]interface{}{
|
Weight: utils.Int2Float64(storeSku.Weight),
|
||||||
map[string]interface{}{
|
DeliveryDelayDay: tiktokShop.DeliveryDelayDayToDay,
|
||||||
"sku_id": foodData[mtwmapi.KeyAppFoodCode],
|
PresellType: tiktokShop.SendGoodsTypeNow,
|
||||||
},
|
Supply7dayReturn: 0,
|
||||||
}
|
Mobile: storeDetail.Tel1,
|
||||||
foodData["skus"] = skus
|
Commit: true,
|
||||||
foodData["name"] = utils.LimitUTF8StringLen(storeSku.SkuName, mtwmapi.MaxSkuNameCharCount)
|
Specs: "净重|" + fmt.Sprintf("%f", storeSku.SpecQuality) + storeSku.SpecUnit,
|
||||||
foodData["description"] = storeSku.Comment
|
NeedRechargeMode: false,
|
||||||
if isNeedUpdatePrice {
|
SellChannel: []int64{0},
|
||||||
foodData["price"] = jxutils.IntPrice2Standard(storeSku.VendorPrice)
|
StartSaleType: 0,
|
||||||
}
|
PickupMethod: "0",
|
||||||
if storeSku.MinOrderCount != 0 {
|
StoreId: int64(storeSku.StoreID),
|
||||||
foodData["min_order_count"] = storeSku.MinOrderCount
|
MainProductId: int64(storeSku.NameID),
|
||||||
} else {
|
|
||||||
foodData["min_order_count"] = 1
|
|
||||||
}
|
|
||||||
foodData["unit"] = storeSku.Unit
|
|
||||||
attr := switchAttr(storeSku.VendorVendorCatID)
|
|
||||||
if attr != "" {
|
|
||||||
foodData["common_attr_value"] = attr
|
|
||||||
}
|
|
||||||
catCode := tryCatName2Code(storeSku.VendorCatID)
|
|
||||||
if catCode != "" {
|
|
||||||
foodData["category_code"] = catCode
|
|
||||||
} else {
|
|
||||||
foodData["category_name"] = storeSku.VendorCatID
|
|
||||||
}
|
|
||||||
foodData["is_sold_out"] = skuStatusJX2Mtwm(storeSku.MergedStatus)
|
|
||||||
if true { // vendorStoreID == specialStoreID {
|
|
||||||
img2 := storeSku.Img2
|
|
||||||
img3 := storeSku.Img3
|
|
||||||
img4 := storeSku.Img4
|
|
||||||
img5 := storeSku.Img5
|
|
||||||
if img2 == "" {
|
|
||||||
img2 = storeSku.Img
|
|
||||||
}
|
|
||||||
if img3 == "" {
|
|
||||||
img3 = storeSku.Img
|
|
||||||
}
|
|
||||||
if img4 == "" {
|
|
||||||
img4 = storeSku.Img
|
|
||||||
}
|
|
||||||
if img5 == "" {
|
|
||||||
img5 = storeSku.Img
|
|
||||||
}
|
|
||||||
if storeSku.ImgMix != "" && ((storeSku.BrandID == storeSku.ExBrandID && storeSku.ExBrandID != 0) || storeSku.ExBrandID == 0) {
|
|
||||||
foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.ImgMix, img2, img3, img4, img5), ",")
|
|
||||||
} else {
|
|
||||||
foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, img2, img3, img4, img5), ",")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
foodData["picture"] = strings.Join(jxutils.BatchString2Slice(storeSku.Img, storeSku.Img2), ",")
|
|
||||||
}
|
|
||||||
if storeSku.DescImg != "" {
|
|
||||||
foodData["picture_contents"] = storeSku.DescImg
|
|
||||||
}
|
|
||||||
foodData["sequence"] = storeSku.GetSeq()
|
|
||||||
if storeSku.VendorVendorCatID != 0 {
|
|
||||||
foodData["tag_id"] = utils.Int64ToStr(storeSku.VendorVendorCatID)
|
|
||||||
} else {
|
|
||||||
// foodData["tag_id"] = utils.Int64ToStr(defVendorCatID)
|
|
||||||
}
|
|
||||||
skus[0]["spec"] = jxutils.ComposeSkuSpec(storeSku.SpecQuality, storeSku.SpecUnit)
|
|
||||||
if isNeedUpdatePrice {
|
|
||||||
skus[0]["price"] = foodData["price"]
|
|
||||||
}
|
|
||||||
skus[0]["stock"] = stockCount2Mtwm(model.MaxStoreSkuStockQty)
|
|
||||||
if storeSku.Upc != "" {
|
|
||||||
skus[0]["upc"] = storeSku.Upc
|
|
||||||
}
|
|
||||||
skus[0]["ladder_box_num"] = storeSku.LadderBoxNum
|
|
||||||
boxPirce := 0
|
|
||||||
if storeSku.MtLadderBoxPrice != 0 {
|
|
||||||
boxPirce = storeSku.MtLadderBoxPrice
|
|
||||||
} else {
|
|
||||||
boxPirce = storeSku.LadderBoxPrice
|
|
||||||
}
|
|
||||||
skus[0]["ladder_box_price"] = jxutils.IntPrice2Standard(int64(boxPirce))
|
|
||||||
if foodData["tag_id"] != nil {
|
|
||||||
skus[0]["weight"] = storeSku.Weight // weight字段仅限服饰鞋帽、美妆、日用品、母婴、生鲜果蔬、生活超市下的便利店/超市门店品类的商家使用
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取上传图,商品轮播图
|
||||||
|
img, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
if globals.EnableMtwmStoreWrite {
|
param.Pic = img
|
||||||
if len(foodDataList) == 1 {
|
// 商品详情图
|
||||||
foodDataList[0]["skus"] = string(utils.MustMarshal(foodDataList[0]["skus"]))
|
img2, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeSku.DescImg)
|
||||||
if err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailInitData(ctx.GetTrackInfo(), vendorStoreID, utils.Int2Str(storeSkuList[0].SkuID), foodDataList[0]); err != nil {
|
if err != nil {
|
||||||
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDMTWM], syncType)
|
return nil, err
|
||||||
}
|
}
|
||||||
} else if len(foodDataList) > 0 {
|
param.Description = img2
|
||||||
failedFoodList, err2 := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailBatchInitData(ctx.GetTrackInfo(), vendorStoreID, foodDataList)
|
|
||||||
if err = err2; err == nil {
|
// weight_unit 目前抖音只支持g和kg两种
|
||||||
if err = putils.GenPartialFailedErr(failedFoodList, len(failedFoodList)); err != nil {
|
switch storeSku.Unit {
|
||||||
failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], syncType)
|
case "g", "ml", "G", "ML":
|
||||||
// successList = putils.UnselectStoreSkuSyncListByVendorSkuIDs(storeSkuList, getAppFoodCodeList(failedFoodList))
|
param.WeightUnit = tiktokShop.WeightUint_G
|
||||||
|
case "kg", "l", "L", "KG":
|
||||||
|
param.WeightUnit = tiktokShop.WeightUint_G
|
||||||
}
|
}
|
||||||
} else if err2 != nil && len(failedFoodList) == 0 {
|
|
||||||
if errExt, ok := err2.(*utils.ErrorWithCode); ok {
|
// spec_prices
|
||||||
err = utils.UnmarshalUseNumber([]byte(errExt.ErrMsg()), &failedFoodList)
|
param.SpecPrices = GetSpecPrices(param.Specs, storeSku)
|
||||||
failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], syncType)
|
// ProductFormatNew
|
||||||
|
productFormatNew, err := GetProductFormatNew(param.CategoryLeafId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
}
|
param.ProductFormatNew = productFormatNew
|
||||||
}
|
|
||||||
}
|
// 抖店创建商品
|
||||||
for _, storeSku := range storeSkuList {
|
tiktokResult, err := api.CreateStoreCommodity(param)
|
||||||
|
if err != nil {
|
||||||
|
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
||||||
storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID)
|
storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
storeSku.VendorSkuID = utils.Int64ToStr(tiktokResult.ProductId)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
syncType = "更新商品"
|
||||||
|
for _, storeSku := range storeSkuList {
|
||||||
|
param := &product_editV2_request.ProductEditV2Param{
|
||||||
|
ProductId: utils.Str2Int64(storeSku.VendorSkuID),
|
||||||
|
CategoryLeafId: utils.Str2Int64(storeSku.VendorCatID),
|
||||||
|
Name: storeSku.Name,
|
||||||
|
PayType: tiktokShop.TiktokPayType1,
|
||||||
|
ReduceType: tiktokShop.SkuReduceTypePayMakeOrder,
|
||||||
|
FreightId: freightId,
|
||||||
|
Weight: utils.Int2Float64(storeSku.Weight),
|
||||||
|
DeliveryDelayDay: tiktokShop.DeliveryDelayDayToDay,
|
||||||
|
PresellType: tiktokShop.SendGoodsTypeNow,
|
||||||
|
Supply7dayReturn: 0,
|
||||||
|
Mobile: storeDetail.Tel1,
|
||||||
|
Commit: true,
|
||||||
|
Specs: "净重|" + fmt.Sprintf("%f", storeSku.SpecQuality) + storeSku.SpecUnit,
|
||||||
|
NeedRechargeMode: false,
|
||||||
|
SellChannel: []int64{0},
|
||||||
|
StartSaleType: 0,
|
||||||
|
PickupMethod: "0",
|
||||||
|
StoreId: int64(storeSku.StoreID),
|
||||||
|
MainProductId: int64(storeSku.NameID),
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取上传图,商品轮播图
|
||||||
|
img, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
param.Pic = img
|
||||||
|
// 商品详情图
|
||||||
|
img2, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeSku.DescImg)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
param.Description = img2
|
||||||
|
|
||||||
|
// weight_unit 目前抖音只支持g和kg两种
|
||||||
|
switch storeSku.Unit {
|
||||||
|
case "g", "ml", "G", "ML":
|
||||||
|
param.WeightUnit = tiktokShop.WeightUint_G
|
||||||
|
case "kg", "l", "L", "KG":
|
||||||
|
param.WeightUnit = tiktokShop.WeightUint_G
|
||||||
|
}
|
||||||
|
|
||||||
|
// spec_prices
|
||||||
|
param.SpecPrices = GetSpecPrices(param.Specs, storeSku)
|
||||||
|
// ProductFormatNew
|
||||||
|
productFormatNew, err := GetProductFormatNew(param.CategoryLeafId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
param.ProductFormatNew = productFormatNew
|
||||||
|
|
||||||
|
// 抖店更新商品
|
||||||
|
if err := api.EditStoreCommodity(param); err != nil {
|
||||||
|
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
||||||
|
storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if len(failedList) > 0 {
|
if len(failedList) > 0 {
|
||||||
err = nil
|
err = nil
|
||||||
}
|
}
|
||||||
return failedList, err
|
return failedList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func getAppFoodCodeList(l []*mtwmapi.AppFoodResult) (vendorSkuIDs []string) {
|
|
||||||
if len(l) > 0 {
|
|
||||||
vendorSkuIDs = make([]string, len(l))
|
|
||||||
for k, v := range l {
|
|
||||||
vendorSkuIDs[k] = v.AppFoodCode
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return vendorSkuIDs
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||||
if globals.EnableMtwmStoreWrite {
|
if globals.EnableDdStoreWrite {
|
||||||
if len(storeSkuList) == 1 {
|
for _, v := range storeSkuList {
|
||||||
err = getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID).RetailDelete(ctx.GetTrackInfo(), vendorStoreID, storeSkuList[0].VendorSkuID)
|
if err = getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID).DeleteStoreCommodity(utils.Str2Int64(v.VendorSkuID)); err != nil {
|
||||||
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDMTWM], "删除商品")
|
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "删除商品")...)
|
||||||
} else {
|
|
||||||
// todo 部分失败
|
|
||||||
err = getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID).RetailCatSkuBatchDelete2(ctx.GetTrackInfo(), vendorStoreID, nil, nil, nil, nil, partner.BareStoreSkuInfoList(storeSkuList).GetVendorSkuIDList())
|
|
||||||
if err != nil {
|
|
||||||
if errExt, ok := err.(*utils.ErrorWithCode); ok {
|
|
||||||
myMap := make(map[string][]*mtwmapi.AppFoodResult)
|
|
||||||
json.Unmarshal([]byte(errExt.ErrMsg()), &myMap)
|
|
||||||
failedList = SelectStoreSkuListByFoodList(storeSkuList, myMap["retail_error_list"], storeID, model.VendorChineseNames[model.VendorIDMTWM], "批量删除商品")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -401,30 +407,6 @@ func (p *PurchaseHandler) DeleteStoreSkus(ctx *jxcontext.Context, storeID int, v
|
|||||||
return failedList, err
|
return failedList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func switchAttr(vendorCatID int64) (attrs string) {
|
|
||||||
switch vendorCatID {
|
|
||||||
case 200002727:
|
|
||||||
return mtwmapi.MtwmSkuAttr200002727
|
|
||||||
case 200001555:
|
|
||||||
return mtwmapi.MtwmSkuAttr200001555
|
|
||||||
case 200002728:
|
|
||||||
return mtwmapi.MtwmSkuAttr200002728
|
|
||||||
case 200001519, 200000592:
|
|
||||||
return mtwmapi.MtwmSkuAttr200000592
|
|
||||||
case 200002704, 200002731:
|
|
||||||
return mtwmapi.MtwmSkuAttr200002731
|
|
||||||
case 200002716:
|
|
||||||
return mtwmapi.MtwmSkuAttr200002716
|
|
||||||
case 200002667, 200002713, 200002670:
|
|
||||||
return mtwmapi.MtwmSkuAttr200002670
|
|
||||||
case 200002680:
|
|
||||||
return mtwmapi.MtwmSkuAttr200002680
|
|
||||||
default:
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return attrs
|
|
||||||
}
|
|
||||||
|
|
||||||
func stockCount2Mtwm(stock int) (mtwmStock string) {
|
func stockCount2Mtwm(stock int) (mtwmStock string) {
|
||||||
return utils.Int2Str(stock)
|
return utils.Int2Str(stock)
|
||||||
}
|
}
|
||||||
@@ -451,44 +433,74 @@ func storeSku2Mtwm(storeSkuList []*partner.StoreSkuInfo, updateType int) (skuLis
|
|||||||
return skuList
|
return skuList
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateStoreSkusStatus 批量更新商品上下架
|
||||||
func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, status int) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo, status int) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||||
skuList := storeSku2Mtwm(storeSkuList, updateTypeStatus)
|
api := getAPI(vendorOrgCode, storeID, vendorStoreID)
|
||||||
mtwmStatus := skuStatusJX2Mtwm(status)
|
if status == model.SkuStatusNormal { // 上架
|
||||||
if globals.EnableMtwmStoreWrite {
|
for _, v := range storeSkuList {
|
||||||
failedFoodList, err2 := getAPI(vendorOrgCode, storeID, vendorStoreID).RetailSellStatus(ctx.GetTrackInfo(), vendorStoreID, skuList, mtwmStatus)
|
if err := api.EditStoreCommodity(&product_editV2_request.ProductEditV2Param{
|
||||||
if err = err2; err == nil {
|
ProductId: utils.Str2Int64(v.VendorSkuID),
|
||||||
if len(failedFoodList) > 0 {
|
Commit: true,
|
||||||
failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品状态")
|
}); err != nil {
|
||||||
// successList = putils.UnselectStoreSkuListByVendorSkuIDs(storeSkuList, getAppFoodCodeList(failedFoodList))
|
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "上架商品正常")...)
|
||||||
|
} else {
|
||||||
|
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "上架商品异常")...)
|
||||||
}
|
}
|
||||||
} else if err2 != nil && len(failedFoodList) == 0 {
|
}
|
||||||
if errExt, ok := err2.(*utils.ErrorWithCode); ok {
|
} else { // 下架
|
||||||
err = utils.UnmarshalUseNumber([]byte(errExt.ErrMsg()), &failedFoodList)
|
for _, v := range storeSkuList {
|
||||||
failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品状态")
|
err := api.ProductSetOffline(utils.Str2Int64(v.VendorSkuID))
|
||||||
|
if err == nil {
|
||||||
|
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品正常")...)
|
||||||
|
} else {
|
||||||
|
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "下架商品异常")...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(failedList) > 0 {
|
if len(failedList) > 0 {
|
||||||
err = nil
|
err = nil
|
||||||
}
|
}
|
||||||
return failedList, err
|
return failedList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UpdateStoreSkusPrice 更新商品价格
|
||||||
func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||||
priceList := storeSku2Mtwm(storeSkuList, updateTypePrice)
|
api := getAPI(vendorOrgCode, storeID, vendorStoreID)
|
||||||
if globals.EnableMtwmStoreWrite {
|
for _, v := range storeSkuList {
|
||||||
failedFoodList, err2 := getAPI(vendorOrgCode, storeID, vendorStoreID).RetailSkuPrice(ctx.GetTrackInfo(), vendorStoreID, priceList)
|
param := &product_editV2_request.ProductEditV2Param{}
|
||||||
if err = err2; err == nil {
|
param.ProductId = utils.Str2Int64(v.VendorSkuID)
|
||||||
if len(failedFoodList) > 0 {
|
param.Specs = "净重|" + fmt.Sprintf("%f", v.SpecQuality) + v.SpecUnit
|
||||||
failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品价格")
|
|
||||||
}
|
skuSize := make([]*tiktokShop.SpecDetailList, 0, 0)
|
||||||
} else if err2 != nil && len(failedFoodList) == 0 {
|
detail1 := strings.Split(param.Specs, "^")
|
||||||
if errExt, ok := err2.(*utils.ErrorWithCode); ok {
|
name1 := strings.Split(strings.Split(detail1[0], "|")[1], ",")
|
||||||
err = utils.UnmarshalUseNumber([]byte(errExt.ErrMsg()), &failedFoodList)
|
for i := 0; i < len(name1); i++ {
|
||||||
failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品价格")
|
sku := &tiktokShop.SpecDetailList{
|
||||||
|
SpecDetailName1: name1[i],
|
||||||
|
StockNum: v.Stock,
|
||||||
|
Price: int(v.VendorPrice),
|
||||||
|
Code: utils.Int2Str(v.SkuID),
|
||||||
|
StepStockNum: 0,
|
||||||
|
SupplierID: "",
|
||||||
|
OuterSkuID: utils.Int2Str(v.NameID),
|
||||||
|
DeliveryInfos: []*tiktokShop.DeliveryInfos{
|
||||||
|
{InfoType: "weight", InfoUnit: v.SpecUnit, InfoValue: fmt.Sprintf("%f", v.SpecQuality)},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
skuSize = append(skuSize, sku)
|
||||||
|
}
|
||||||
|
data, _ := json.Marshal(skuSize)
|
||||||
|
param.SpecPrices = string(data)
|
||||||
|
|
||||||
|
err := api.EditStoreCommodity(param)
|
||||||
|
if err != nil {
|
||||||
|
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "上架商品正常")...)
|
||||||
|
} else {
|
||||||
|
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "上架商品异常")...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(failedList) > 0 {
|
if len(failedList) > 0 {
|
||||||
err = nil
|
err = nil
|
||||||
}
|
}
|
||||||
@@ -496,31 +508,14 @@ func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrg
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||||
stockList := storeSku2Mtwm(storeSkuList, updateTypeStock)
|
if globals.EnableDdStoreWrite {
|
||||||
if globals.EnableMtwmStoreWrite {
|
return p.UpdateStoreSkusPrice(ctx, vendorOrgCode, storeID, vendorStoreID, storeSkuList)
|
||||||
failedFoodList, err2 := getAPI(vendorOrgCode, storeID, vendorStoreID).RetailSkuStock(ctx.GetTrackInfo(), vendorStoreID, stockList)
|
|
||||||
if err = err2; err == nil {
|
|
||||||
if len(failedFoodList) > 0 {
|
|
||||||
failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品库存")
|
|
||||||
}
|
}
|
||||||
//if err = putils.GenPartialFailedErr(failedFoodList, len(failedFoodList)); err != nil {
|
return nil, err
|
||||||
// successList = putils.UnselectStoreSkuListByVendorSkuIDs(storeSkuList, getAppFoodCodeList(failedFoodList))
|
|
||||||
// }
|
|
||||||
} else if err2 != nil && len(failedFoodList) == 0 {
|
|
||||||
if errExt, ok := err2.(*utils.ErrorWithCode); ok {
|
|
||||||
err = utils.UnmarshalUseNumber([]byte(errExt.ErrMsg()), &failedFoodList)
|
|
||||||
failedList = SelectStoreSkuListByFoodList(storeSkuList, failedFoodList, storeID, model.VendorChineseNames[model.VendorIDMTWM], "更新商品库存")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(failedList) > 0 {
|
|
||||||
err = nil
|
|
||||||
}
|
|
||||||
return failedList, err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func mtwmSkuStatus2Jx(mtwmSkuStatus int) (jxSkuStatus int) {
|
func tiktokSkuStatus2Jx(skuStatus int64) (jxSkuStatus int) {
|
||||||
if mtwmSkuStatus == mtwmapi.SellStatusOnline {
|
if skuStatus == mtwmapi.SellStatusOnline {
|
||||||
jxSkuStatus = model.SkuStatusNormal
|
jxSkuStatus = model.SkuStatusNormal
|
||||||
} else {
|
} else {
|
||||||
jxSkuStatus = model.SkuStatusDontSale
|
jxSkuStatus = model.SkuStatusDontSale
|
||||||
@@ -529,188 +524,134 @@ func mtwmSkuStatus2Jx(mtwmSkuStatus int) (jxSkuStatus int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) {
|
func (p *PurchaseHandler) GetStoreSkusFullInfo(ctx *jxcontext.Context, parentTask tasksch.ITask, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (skuNameList []*partner.SkuNameInfo, err error) {
|
||||||
if len(storeSkuList) == 1 {
|
// 查询单个门店商品
|
||||||
skuInfo, err := getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID).RetailGet(vendorStoreID, utils.Int2Str(storeSkuList[0].SkuID))
|
tiktokApi := getAPI(storeSkuList[0].VendorOrgCode, storeID, vendorStoreID)
|
||||||
|
|
||||||
|
for _, v := range storeSkuList {
|
||||||
|
skuInfo, err := tiktokApi.GetSkuDetail(v.VendorSkuID, utils.Int2Str(v.SkuID))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if skuName := vendorSku2Jx(skuInfo); skuName != nil {
|
if skuName := vendorSku2Jx(skuInfo); skuName != nil {
|
||||||
skuNameList = append(skuNameList, skuName)
|
skuNameList = append(skuNameList, skuName)
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
var storeSkuMap map[string]*partner.StoreSkuInfo
|
|
||||||
if storeSkuList != nil {
|
|
||||||
storeSkuMap = putils.StoreSkuList2MapByVendorSkuID(storeSkuList)
|
|
||||||
}
|
|
||||||
mtapi := getAPI(getStoreVendorOrgCode(storeID), storeID, vendorStoreID)
|
|
||||||
for {
|
|
||||||
// todo 待优化获取速度
|
|
||||||
result, err := mtapi.RetailList(vendorStoreID, len(skuNameList), mtwmapi.GeneralMaxLimit)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
if storeSkuMap == nil {
|
|
||||||
skuNameList = append(skuNameList, vendorSkuList2Jx(result)...)
|
|
||||||
} else {
|
|
||||||
for _, v := range result {
|
|
||||||
if storeSkuMap[v.AppFoodCode] != nil {
|
|
||||||
if skuName := vendorSku2Jx(v); skuName != nil {
|
|
||||||
skuNameList = append(skuNameList, skuName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(result) < mtwmapi.GeneralMaxLimit {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
//switch len(storeSkuList) {
|
||||||
|
//case 1:
|
||||||
|
//
|
||||||
|
//default:
|
||||||
|
// // 列表查询门店商品
|
||||||
|
// //var storeSkuMap map[string]*partner.StoreSkuInfo
|
||||||
|
// //if storeSkuList != nil {
|
||||||
|
// // storeSkuMap = putils.StoreSkuList2MapByVendorSkuID(storeSkuList)
|
||||||
|
// //}
|
||||||
|
// //for {
|
||||||
|
// // result, err := mtapi.RetailList(vendorStoreID, len(skuNameList), mtwmapi.GeneralMaxLimit)
|
||||||
|
// // if err != nil {
|
||||||
|
// // return nil, err
|
||||||
|
// // }
|
||||||
|
// // if storeSkuMap == nil {
|
||||||
|
// // skuNameList = append(skuNameList, vendorSkuList2Jx(result)...)
|
||||||
|
// // } else {
|
||||||
|
// // for _, v := range result {
|
||||||
|
// // if storeSkuMap[v.AppFoodCode] != nil {
|
||||||
|
// // if skuName := vendorSku2Jx(v); skuName != nil {
|
||||||
|
// // skuNameList = append(skuNameList, skuName)
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // if len(result) < mtwmapi.GeneralMaxLimit {
|
||||||
|
// // break
|
||||||
|
// // }
|
||||||
|
// //}
|
||||||
|
//}
|
||||||
return skuNameList, err
|
return skuNameList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func vendorSku2Jx(appFood *mtwmapi.AppFood) (skuName *partner.SkuNameInfo) {
|
func vendorSku2Jx(tiktokSku *product_detail_response.ProductDetailData) (skuName *partner.SkuNameInfo) {
|
||||||
if len(appFood.SkuList) == 0 {
|
if len(tiktokSku.SpecPrices) == 0 {
|
||||||
globals.SugarLogger.Warnf("vendorSku2Jx, strange appFood:%s", utils.Format4Output(appFood, true))
|
globals.SugarLogger.Warnf("vendorSku2Jx, strange tiktokSku:%s", utils.Format4Output(tiktokSku, true))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(appFood.Name)
|
prefix, name, comment, specUnit, unit, specQuality := jxutils.SplitSkuName(tiktokSku.Name)
|
||||||
vendorSku := appFood.SkuList[0]
|
vendorSku := tiktokSku.SpecPrices[0]
|
||||||
weight := int(utils.Str2Int64WithDefault(vendorSku.Weight, 0))
|
weight := jxutils.FormatSkuWeight(specQuality, specUnit)
|
||||||
if weight <= 0 {
|
|
||||||
weight = jxutils.FormatSkuWeight(specQuality, specUnit)
|
|
||||||
}
|
|
||||||
skuID := int(utils.Str2Int64WithDefault(vendorSku.SkuID, 0))
|
|
||||||
skuName = &partner.SkuNameInfo{
|
skuName = &partner.SkuNameInfo{
|
||||||
NameID: int(utils.Str2Int64WithDefault(appFood.AppFoodCode, 0)),
|
NameID: utils.Str2Int(vendorSku.OuterSkuId),
|
||||||
VendorNameID: appFood.AppFoodCode,
|
VendorNameID: utils.Int64ToStr(tiktokSku.MainProductId),
|
||||||
UPC: appFood.SkuList[0].Upc,
|
UPC: tiktokSku.ProductIdStr,
|
||||||
Prefix: prefix,
|
Prefix: prefix,
|
||||||
Name: name,
|
Name: name,
|
||||||
Unit: unit,
|
Unit: unit,
|
||||||
Status: mtwmSkuStatus2Jx(appFood.IsSoldOut), //此处为之前一个bug 如果吧状态放到切片内层 对于内层函数中映射无法关联 永远获取到的初始值为0
|
Status: tiktokSkuStatus2Jx(tiktokSku.Status), //此处为之前一个bug 如果吧状态放到切片内层 对于内层函数中映射无法关联 永远获取到的初始值为0
|
||||||
SkuList: []*partner.SkuInfo{
|
SkuList: []*partner.SkuInfo{
|
||||||
&partner.SkuInfo{
|
&partner.SkuInfo{
|
||||||
StoreSkuInfo: partner.StoreSkuInfo{
|
StoreSkuInfo: partner.StoreSkuInfo{
|
||||||
VendorSkuID: vendorSku.SkuID,
|
VendorSkuID: utils.Int64ToStr(vendorSku.SkuId),
|
||||||
SkuID: skuID,
|
SkuID: int(vendorSku.OutSkuId),
|
||||||
IsSpecialty: appFood.IsSpecialty,
|
IsSpecialty: 0,
|
||||||
Stock: int(utils.Str2Int64WithDefault(vendorSku.Stock, partner.UnlimitedStoreSkuStock)),
|
Stock: int(vendorSku.StockNum),
|
||||||
VendorPrice: jxutils.StandardPrice2Int(utils.Str2Float64WithDefault(vendorSku.Price, 0)),
|
VendorPrice: vendorSku.Price,
|
||||||
Status: mtwmSkuStatus2Jx(appFood.IsSoldOut),
|
Status: tiktokSkuStatus2Jx(tiktokSku.Status),
|
||||||
},
|
},
|
||||||
SkuName: appFood.Name,
|
SkuName: tiktokSku.Name,
|
||||||
Comment: comment,
|
Comment: comment,
|
||||||
SpecQuality: float64(specQuality),
|
SpecQuality: float64(specQuality),
|
||||||
SpecUnit: specUnit,
|
SpecUnit: specUnit,
|
||||||
Weight: weight,
|
Weight: weight,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
PictureList: appFood.PictureList,
|
PictureList: tiktokSku.Pic,
|
||||||
}
|
}
|
||||||
if appFood.CategoryName != "" {
|
if tiktokSku.CategoryDetail != nil {
|
||||||
// todo, 因为当前我们用的是分类名操作这种方式,所以要返回分类名(而不是分类code)
|
// todo, 因为当前我们用的是分类名操作这种方式,所以要返回分类名(而不是分类code)
|
||||||
skuName.VendorCatIDList = []string{appFood.CategoryName}
|
skuName.VendorCatIDList = []string{tiktokSku.CategoryDetail.FirstCname, tiktokSku.CategoryDetail.SecondCname, tiktokSku.CategoryDetail.ThirdCname, tiktokSku.CategoryDetail.FourthCname}
|
||||||
if appFood.SecondaryCategoryName != "" {
|
|
||||||
skuName.VendorCatIDList = append(skuName.VendorCatIDList, appFood.SecondaryCategoryName)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return skuName
|
return skuName
|
||||||
}
|
}
|
||||||
|
|
||||||
func vendorSkuList2Jx(appFoodList []*mtwmapi.AppFood) (skuNameList []*partner.SkuNameInfo) {
|
|
||||||
for _, appFood := range appFoodList {
|
|
||||||
if skuName := vendorSku2Jx(appFood); skuName != nil {
|
|
||||||
skuNameList = append(skuNameList, skuName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return skuNameList
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PurchaseHandler) GetSensitiveWordRegexp() *regexp.Regexp {
|
func (p *PurchaseHandler) GetSensitiveWordRegexp() *regexp.Regexp {
|
||||||
return sensitiveWordRegexp
|
return sensitiveWordRegexp
|
||||||
}
|
}
|
||||||
|
|
||||||
//美团api返回
|
// CreateStoreSkusAct 创建商品活动
|
||||||
func SelectStoreSkuListByFoodList(storeSkuList interface{}, foodList []*mtwmapi.AppFoodResult, storeID int, vendorName, syncType string) (selectedStoreSkuList []*partner.StoreSkuInfoWithErr) {
|
|
||||||
foodMap := make(map[string]string)
|
|
||||||
if len(foodList) > 0 {
|
|
||||||
for _, v := range foodList {
|
|
||||||
foodMap[v.AppFoodCode] = v.ErrorMsg
|
|
||||||
}
|
|
||||||
if storeSkuLists, ok := storeSkuList.([]*partner.StoreSkuInfo); ok {
|
|
||||||
for _, v := range storeSkuLists {
|
|
||||||
if foodMap[v.VendorSkuID] != "" {
|
|
||||||
foodFailed := &partner.StoreSkuInfoWithErr{
|
|
||||||
StoreSkuInfo: v,
|
|
||||||
ErrMsg: foodMap[v.VendorSkuID],
|
|
||||||
StoreID: storeID,
|
|
||||||
VendoreName: vendorName,
|
|
||||||
SyncType: syncType,
|
|
||||||
}
|
|
||||||
selectedStoreSkuList = append(selectedStoreSkuList, foodFailed)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if storeSkuLists, ok := storeSkuList.([]*dao.StoreSkuSyncInfo); ok {
|
|
||||||
for _, v := range storeSkuLists {
|
|
||||||
if foodMap[v.VendorSkuID] != "" {
|
|
||||||
storeSkuInfo := &partner.StoreSkuInfo{
|
|
||||||
SkuID: v.SkuID,
|
|
||||||
VendorSkuID: v.VendorSkuID,
|
|
||||||
NameID: v.NameID,
|
|
||||||
VendorNameID: v.VendorNameID,
|
|
||||||
VendorPrice: v.VendorPrice,
|
|
||||||
Status: v.Status,
|
|
||||||
}
|
|
||||||
foodFailed := &partner.StoreSkuInfoWithErr{
|
|
||||||
StoreSkuInfo: storeSkuInfo,
|
|
||||||
ErrMsg: foodMap[v.VendorSkuID],
|
|
||||||
StoreID: storeID,
|
|
||||||
VendoreName: vendorName,
|
|
||||||
SyncType: syncType,
|
|
||||||
}
|
|
||||||
selectedStoreSkuList = append(selectedStoreSkuList, foodFailed)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return selectedStoreSkuList
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *PurchaseHandler) CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
func (p *PurchaseHandler) CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||||
actStoreSkuList := putils.StoreSku2ActStoreSku(model.SyncFlagNewMask, vendorStoreID, storeSkuList)
|
//actStoreSkuList := putils.StoreSku2ActStoreSku(model.SyncFlagNewMask, vendorStoreID, storeSkuList)
|
||||||
failedList, err = createOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, actStoreSkuList)
|
//failedList, err = createOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, actStoreSkuList)
|
||||||
storeSkuMap := putils.StoreSkuList2MapBySkuID(storeSkuList)
|
//storeSkuMap := putils.StoreSkuList2MapBySkuID(storeSkuList)
|
||||||
for _, v := range actStoreSkuList {
|
//for _, v := range actStoreSkuList {
|
||||||
storeSkuMap[v.SkuID].VendorActID = v.VendorActID
|
// storeSkuMap[v.SkuID].VendorActID = v.VendorActID
|
||||||
}
|
//}
|
||||||
if len(failedList) > 0 {
|
//if len(failedList) > 0 {
|
||||||
err = nil
|
// err = nil
|
||||||
}
|
//}
|
||||||
return failedList, err
|
return failedList, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
|
||||||
return cancelOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(model.SyncFlagDeletedMask, vendorStoreID, storeSkuList))
|
return nil, err
|
||||||
|
// return cancelOneShopAct(putils.GetFixDirectDownAct(vendorOrgCode, storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(model.SyncFlagDeletedMask, vendorStoreID, storeSkuList))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PurchaseHandler) UpdateStoreSkusSpecTag(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) {
|
func (p *PurchaseHandler) UpdateStoreSkusSpecTag(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) {
|
||||||
var foodDataList = []map[string]interface{}{}
|
//var foodDataList []map[string]interface{}
|
||||||
for _, v := range storeSkuList {
|
//for _, v := range storeSkuList {
|
||||||
var foodData = make(map[string]interface{})
|
// var foodData = make(map[string]interface{})
|
||||||
if v.IsSpecialty != 0 && v.IsSpecialty == -1 {
|
// if v.IsSpecialty != 0 && v.IsSpecialty == -1 {
|
||||||
v.IsSpecialty = 0
|
// v.IsSpecialty = 0
|
||||||
}
|
// }
|
||||||
foodData["is_specialty"] = v.IsSpecialty
|
// foodData["is_specialty"] = v.IsSpecialty
|
||||||
foodData["app_food_code"] = v.SkuID
|
// foodData["app_food_code"] = v.SkuID
|
||||||
foodDataList = append(foodDataList, foodData)
|
// foodDataList = append(foodDataList, foodData)
|
||||||
}
|
//}
|
||||||
if globals.EnableMtwmStoreWrite {
|
//if globals.EnableMtwmStoreWrite {
|
||||||
if len(foodDataList) == 1 {
|
// if len(foodDataList) == 1 {
|
||||||
err = getAPI(vendorOrgCode, storeID, vendorStoreID).RetailInitData(ctx.GetTrackInfo(), vendorStoreID, utils.Int2Str(storeSkuList[0].SkuID), foodDataList[0])
|
// err = getAPI(vendorOrgCode, storeID, vendorStoreID).RetailInitData(ctx.GetTrackInfo(), vendorStoreID, utils.Int2Str(storeSkuList[0].SkuID), foodDataList[0])
|
||||||
} else if len(foodDataList) > 0 {
|
// } else if len(foodDataList) > 0 {
|
||||||
_, err = getAPI(vendorOrgCode, storeID, vendorStoreID).RetailBatchInitData(ctx.GetTrackInfo(), vendorStoreID, foodDataList)
|
// _, err = getAPI(vendorOrgCode, storeID, vendorStoreID).RetailBatchInitData(ctx.GetTrackInfo(), vendorStoreID, foodDataList)
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
package tiktok_store
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
|
||||||
"git.rosy.net.cn/jx-callback/business/partner"
|
|
||||||
// _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestGetStoreSkusFullInfo(t *testing.T) {
|
|
||||||
skuNameList, err := CurPurchaseHandler.GetStoreSkusFullInfo(jxcontext.AdminCtx, nil, 2, "8967897", nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
t.Log(utils.Format4Output(skuNameList, false))
|
|
||||||
t.Log(len(skuNameList))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetStoreSkusBareInfo(t *testing.T) {
|
|
||||||
storeSkuList, err := CurPurchaseHandler.GetStoreSkusBareInfo(jxcontext.AdminCtx, "", nil, 2, "2523687", []*partner.StoreSkuInfo{
|
|
||||||
&partner.StoreSkuInfo{
|
|
||||||
SkuID: 16205,
|
|
||||||
},
|
|
||||||
//&partner.StoreSkuInfo{
|
|
||||||
// SkuID: 1306,
|
|
||||||
//},
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err.Error())
|
|
||||||
}
|
|
||||||
t.Log(utils.Format4Output(storeSkuList, false))
|
|
||||||
t.Log(len(storeSkuList))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDeleteStoreAllSkus(t *testing.T) {
|
|
||||||
err := CurPurchaseHandler.DeleteStoreAllSkus(jxcontext.AdminCtx, nil, 2, "2523687", true)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDeleteStoreAllCategories(t *testing.T) {
|
|
||||||
err := CurPurchaseHandler.DeleteStoreAllCategories(jxcontext.AdminCtx, nil, 2, "2523687", true)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetStoreCategory(t *testing.T) {
|
|
||||||
_, err := CurPurchaseHandler.GetStoreCategory(jxcontext.AdminCtx, 2, "2523687", "不存在的分类")
|
|
||||||
if err == nil {
|
|
||||||
t.Fatal("应该找不到这个分类")
|
|
||||||
}
|
|
||||||
catName := "小月饼"
|
|
||||||
cat, err := CurPurchaseHandler.GetStoreCategory(jxcontext.AdminCtx, 2, "2523687", catName)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
} else if cat.Name != catName {
|
|
||||||
t.Fatal("没有找到正确的商家分类")
|
|
||||||
}
|
|
||||||
t.Log(utils.Format4Output(cat, false))
|
|
||||||
}
|
|
||||||
143
business/partner/purchase/tiktok_store/store_sku2_utils.go
Normal file
143
business/partner/purchase/tiktok_store/store_sku2_utils.go
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
package tiktok_store
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
|
||||||
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
|
"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"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GetProductFormatNew 获取物品属性
|
||||||
|
func GetProductFormatNew(categoryLeftId int64) (string, error) {
|
||||||
|
category, err := api.TiktokStore.GetCatePropertyV2(categoryLeftId)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
format := make(map[string][]*tiktokShop.ProductFormatNewList, 0)
|
||||||
|
for _, v := range category.Data.Data {
|
||||||
|
for _, d := range v.Options {
|
||||||
|
formateNew := &tiktokShop.ProductFormatNewList{
|
||||||
|
Value: utils.Str2Int64(d.Value),
|
||||||
|
Name: d.Name,
|
||||||
|
DiyType: v.DiyType,
|
||||||
|
}
|
||||||
|
format[utils.Int64ToStr(v.CategoryId)] = append(format[utils.Int64ToStr(v.CategoryId)], formateNew)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
productFormatNew, err := json.Marshal(format)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return string(productFormatNew), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTiktokImgList 获取抖音图片链接
|
||||||
|
func GetTiktokImgList(storeId string, img ...string) (string, error) {
|
||||||
|
imgs := make([]tiktokShop.Imgs, 0, 0)
|
||||||
|
for _, v := range img {
|
||||||
|
if v != "" {
|
||||||
|
imgs = append(imgs, tiktokShop.Imgs{
|
||||||
|
Name: storeId + "_" + v[21:54],
|
||||||
|
Url: v,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tiktokImgList, err := api.TiktokStore.BatchUploadImages(imgs)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
var tiktokImg []string
|
||||||
|
for _, v := range tiktokImgList.SuccessMap {
|
||||||
|
tiktokImg = append(tiktokImg, v.ByteUrl)
|
||||||
|
}
|
||||||
|
if len(tiktokImg) <= model.NO {
|
||||||
|
for _, v := range tiktokImgList.FailedMap {
|
||||||
|
return "", errors.New(v.ErrMsg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return strings.Join(tiktokImg, "|"), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetSpecPrices 解析属性和规格参数
|
||||||
|
func GetSpecPrices(specs string, localSku *dao.StoreSkuSyncInfo) string {
|
||||||
|
skuSize := make([]*tiktokShop.SpecDetailList, 0, 0)
|
||||||
|
detail1 := strings.Split(specs, "^")
|
||||||
|
if len(detail1) > 3 {
|
||||||
|
detail1 = detail1[0:3]
|
||||||
|
}
|
||||||
|
switch len(detail1) {
|
||||||
|
case 1:
|
||||||
|
name1 := strings.Split(strings.Split(detail1[0], "|")[1], ",")
|
||||||
|
for i := 0; i < len(name1); i++ {
|
||||||
|
sku := &tiktokShop.SpecDetailList{
|
||||||
|
SpecDetailName1: name1[i],
|
||||||
|
StockNum: localSku.Stock,
|
||||||
|
Price: int(localSku.VendorPrice),
|
||||||
|
Code: utils.Int2Str(localSku.SkuID),
|
||||||
|
StepStockNum: 0,
|
||||||
|
SupplierID: "",
|
||||||
|
OuterSkuID: utils.Int2Str(localSku.NameID),
|
||||||
|
DeliveryInfos: []*tiktokShop.DeliveryInfos{
|
||||||
|
{InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
skuSize = append(skuSize, sku)
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
name1 := strings.Split(strings.Split(detail1[0], "|")[1], ",")
|
||||||
|
name2 := strings.Split(strings.Split(detail1[1], "|")[1], ",")
|
||||||
|
for i := 0; i < len(name1); i++ {
|
||||||
|
for j := 0; j < len(name2); j++ {
|
||||||
|
sku := &tiktokShop.SpecDetailList{
|
||||||
|
SpecDetailName1: name1[i],
|
||||||
|
SpecDetailName2: name2[j],
|
||||||
|
StockNum: localSku.Stock,
|
||||||
|
Price: int(localSku.UnitPrice),
|
||||||
|
Code: utils.Int2Str(localSku.SkuID),
|
||||||
|
StepStockNum: 0,
|
||||||
|
SupplierID: "",
|
||||||
|
OuterSkuID: utils.Int2Str(localSku.NameID),
|
||||||
|
DeliveryInfos: []*tiktokShop.DeliveryInfos{
|
||||||
|
{InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
skuSize = append(skuSize, sku)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
|
name1 := strings.Split(strings.Split(detail1[0], "|")[1], ",")
|
||||||
|
name2 := strings.Split(strings.Split(detail1[1], "|")[1], ",")
|
||||||
|
name3 := strings.Split(strings.Split(detail1[2], "|")[1], ",")
|
||||||
|
for i := 0; i < len(name1); i++ {
|
||||||
|
for j := 0; j < len(name2); j++ {
|
||||||
|
for k := 0; k < len(name3); k++ {
|
||||||
|
sku := &tiktokShop.SpecDetailList{
|
||||||
|
SpecDetailName1: name1[i],
|
||||||
|
SpecDetailName2: name2[j],
|
||||||
|
SpecDetailName3: name3[k],
|
||||||
|
StockNum: localSku.Stock,
|
||||||
|
Price: int(localSku.UnitPrice),
|
||||||
|
Code: utils.Int2Str(localSku.SkuID),
|
||||||
|
StepStockNum: 0,
|
||||||
|
SupplierID: "",
|
||||||
|
OuterSkuID: utils.Int2Str(localSku.NameID),
|
||||||
|
DeliveryInfos: []*tiktokShop.DeliveryInfos{
|
||||||
|
{InfoType: "weight", InfoUnit: localSku.SpecUnit, InfoValue: fmt.Sprintf("%f", localSku.SpecQuality)},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
skuSize = append(skuSize, sku)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data, _ := json.Marshal(skuSize)
|
||||||
|
return string(data)
|
||||||
|
}
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
package tiktok_store
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
|
||||||
// _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
|
|
||||||
)
|
|
||||||
|
|
||||||
// func TestSyncStoreCategory(t *testing.T) {
|
|
||||||
// hint, err := CurPurchaseHandler.SyncStoreCategory(jxcontext.AdminCtx, nil, testShopID, false)
|
|
||||||
// if err != nil {
|
|
||||||
// t.Fatal(err)
|
|
||||||
// }
|
|
||||||
// t.Log(hint)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func TestSyncLocalStoreCategory(t *testing.T) {
|
|
||||||
// hint, err := CurPurchaseHandler.SyncLocalStoreCategory(jxcontext.AdminCtx, nil, testShopID, true, nil)
|
|
||||||
// if err != nil {
|
|
||||||
// t.Fatal(err)
|
|
||||||
// }
|
|
||||||
// t.Log(hint)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func TestSyncStoreSkus(t *testing.T) {
|
|
||||||
// hint, err := CurPurchaseHandler.SyncStoreSkus(jxcontext.AdminCtx, nil, testShopID, nil, false, true)
|
|
||||||
// if err != nil {
|
|
||||||
// t.Fatal(err)
|
|
||||||
// }
|
|
||||||
// t.Log(hint)
|
|
||||||
// }
|
|
||||||
|
|
||||||
func TestDeleteRemoteSkus(t *testing.T) {
|
|
||||||
err := CurPurchaseHandler.DeleteStoreAllSkus(jxcontext.AdminCtx, nil, testShopID, testShopVendorID, true)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDeleteRemoteCategories(t *testing.T) {
|
|
||||||
err := CurPurchaseHandler.DeleteStoreAllCategories(jxcontext.AdminCtx, nil, testShopID, testShopVendorID, true)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
package tiktok_store
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
// _ "git.rosy.net.cn/jx-callback/business/jxcallback/orderman"
|
|
||||||
)
|
|
||||||
|
|
||||||
//func TestReadStore(t *testing.T) {
|
|
||||||
// store, err := CurPurchaseHandler.ReadStore(jxcontext.AdminCtx, "", "4351018")
|
|
||||||
// if err != nil {
|
|
||||||
// t.Fatal(err)
|
|
||||||
// }
|
|
||||||
// t.Log(utils.Format4Output(store, false))
|
|
||||||
//}
|
|
||||||
|
|
||||||
func TestUpdateStore(t *testing.T) {
|
|
||||||
err := CurPurchaseHandler.UpdateStore(nil, 100002, "test")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestConstrainOpTimeList(t *testing.T) {
|
|
||||||
timeList := constrainOpTimeList([]int16{830, 1800}, []int16{
|
|
||||||
0,
|
|
||||||
200,
|
|
||||||
930,
|
|
||||||
1700,
|
|
||||||
})
|
|
||||||
t.Log(utils.Format4Output(timeList, false))
|
|
||||||
if timeList[0] != 930 || timeList[1] != 1700 {
|
|
||||||
t.Fatal("constrainOpTimeList failed")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetOpTimeListFromErr(t *testing.T) {
|
|
||||||
err := utils.NewErrorIntCode("当前配送营业时间为:07:00~24:00", mtwmapi.ErrCodeOpFailed)
|
|
||||||
list := getOpTimeListFromErr(err)
|
|
||||||
t.Log(list)
|
|
||||||
}
|
|
||||||
@@ -1,59 +1,53 @@
|
|||||||
package tiktok_store
|
package tiktok_store
|
||||||
|
|
||||||
import (
|
//
|
||||||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
//var (
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
// VendorWaybillStatus2StatusMap = map[string]int{
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
// mtwmapi.WaybillStatusWait4Delivery: model.WaybillStatusNew,
|
||||||
"git.rosy.net.cn/jx-callback/business/partner"
|
// mtwmapi.WaybillStatusPending: model.WaybillStatusPending,
|
||||||
)
|
// mtwmapi.WaybillStatusAccepted: model.WaybillStatusAccepted,
|
||||||
|
// mtwmapi.WaybillStatusCourierArrived: model.WaybillStatusCourierArrived,
|
||||||
var (
|
// mtwmapi.WaybillStatusPickedup: model.WaybillStatusDelivering,
|
||||||
VendorWaybillStatus2StatusMap = map[string]int{
|
// mtwmapi.WaybillStatusDelivered: model.WaybillStatusDelivered,
|
||||||
mtwmapi.WaybillStatusWait4Delivery: model.WaybillStatusNew,
|
// mtwmapi.WaybillStatusCanceled: model.WaybillStatusCanceled,
|
||||||
mtwmapi.WaybillStatusPending: model.WaybillStatusPending,
|
// }
|
||||||
mtwmapi.WaybillStatusAccepted: model.WaybillStatusAccepted,
|
//)
|
||||||
mtwmapi.WaybillStatusCourierArrived: model.WaybillStatusCourierArrived,
|
//
|
||||||
mtwmapi.WaybillStatusPickedup: model.WaybillStatusDelivering,
|
//func (p *PurchaseHandler) GetWaybillStatusFromVendorStatus(vendorStatus string) int {
|
||||||
mtwmapi.WaybillStatusDelivered: model.WaybillStatusDelivered,
|
// if status, ok := VendorWaybillStatus2StatusMap[vendorStatus]; ok {
|
||||||
mtwmapi.WaybillStatusCanceled: model.WaybillStatusCanceled,
|
// return status
|
||||||
}
|
// }
|
||||||
)
|
// return model.WaybillStatusUnknown
|
||||||
|
//}
|
||||||
func (p *PurchaseHandler) GetWaybillStatusFromVendorStatus(vendorStatus string) int {
|
//
|
||||||
if status, ok := VendorWaybillStatus2StatusMap[vendorStatus]; ok {
|
//func (c *PurchaseHandler) onWaybillMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) {
|
||||||
return status
|
// waybill := c.callbackMsg2Waybill(msg)
|
||||||
}
|
// err := partner.CurOrderManager.OnWaybillStatusChanged(waybill)
|
||||||
return model.WaybillStatusUnknown
|
// if err == nil && waybill.Status == model.WaybillStatusDelivering {
|
||||||
}
|
// c.postFakeMsg(waybill.VendorOrderID, FakeMsgType, mtwmapi.OrderStatusDelivering)
|
||||||
|
// }
|
||||||
func (c *PurchaseHandler) onWaybillMsg(msg *mtwmapi.CallbackMsg) (response *mtwmapi.CallbackResponse) {
|
// return mtwmapi.Err2CallbackResponse(err, "")
|
||||||
waybill := c.callbackMsg2Waybill(msg)
|
//}
|
||||||
err := partner.CurOrderManager.OnWaybillStatusChanged(waybill)
|
//
|
||||||
if err == nil && waybill.Status == model.WaybillStatusDelivering {
|
//func (c *PurchaseHandler) callbackMsg2Waybill(msg *mtwmapi.CallbackMsg) (retVal *model.Waybill) {
|
||||||
c.postFakeMsg(waybill.VendorOrderID, FakeMsgType, mtwmapi.OrderStatusDelivering)
|
// orderID := GetOrderIDFromMsg(msg)
|
||||||
}
|
// vendorStatus := msg.FormData.Get("logistics_status")
|
||||||
return mtwmapi.Err2CallbackResponse(err, "")
|
// retVal = &model.Waybill{
|
||||||
}
|
// VendorOrderID: orderID,
|
||||||
|
// OrderVendorID: model.VendorIDMTWM,
|
||||||
func (c *PurchaseHandler) callbackMsg2Waybill(msg *mtwmapi.CallbackMsg) (retVal *model.Waybill) {
|
// VendorWaybillID: orderID,
|
||||||
orderID := GetOrderIDFromMsg(msg)
|
// WaybillVendorID: model.VendorIDMTWM,
|
||||||
vendorStatus := msg.FormData.Get("logistics_status")
|
// CourierName: msg.FormData.Get("dispatcher_name"),
|
||||||
retVal = &model.Waybill{
|
// CourierMobile: msg.FormData.Get("dispatcher_mobile"),
|
||||||
VendorOrderID: orderID,
|
// VendorStatus: vendorStatus,
|
||||||
OrderVendorID: model.VendorIDMTWM,
|
// Status: c.GetWaybillStatusFromVendorStatus(vendorStatus),
|
||||||
VendorWaybillID: orderID,
|
// StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("time"))),
|
||||||
WaybillVendorID: model.VendorIDMTWM,
|
// Remark: "",
|
||||||
CourierName: msg.FormData.Get("dispatcher_name"),
|
//
|
||||||
CourierMobile: msg.FormData.Get("dispatcher_mobile"),
|
// VendorOrgCode: msg.AppID,
|
||||||
VendorStatus: vendorStatus,
|
// }
|
||||||
Status: c.GetWaybillStatusFromVendorStatus(vendorStatus),
|
// if retVal.StatusTime == utils.DefaultTimeValue {
|
||||||
StatusTime: getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("time"))),
|
// retVal.StatusTime = getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("timestamp")))
|
||||||
Remark: "",
|
// }
|
||||||
|
// return retVal
|
||||||
VendorOrgCode: msg.AppID,
|
//}
|
||||||
}
|
|
||||||
if retVal.StatusTime == utils.DefaultTimeValue {
|
|
||||||
retVal.StatusTime = getTimeFromTimestamp(utils.Str2Int64(msg.FormData.Get("timestamp")))
|
|
||||||
}
|
|
||||||
return retVal
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ mtwmCallbackURL = "http://callback.jxc4.com"
|
|||||||
mtwmAppID2 = "5873"
|
mtwmAppID2 = "5873"
|
||||||
mtwmSecret2 = "41c479790a76f86326f89e8048964739"
|
mtwmSecret2 = "41c479790a76f86326f89e8048964739"
|
||||||
mtwmCallbackURL2 = "http://callback.jxc4.com"
|
mtwmCallbackURL2 = "http://callback.jxc4.com"
|
||||||
|
tiktokShopAppId = "7136048270014416392"
|
||||||
|
|
||||||
# mtwmCookieStr = "_lxsdk_cuid=16ddced5e9a95-0a65869c427a14-48714616-15f900-16ddced5e9b2b; _hc.v=cfebbfd1-79a7-9823-d8df-77e59646cb34.1571369610; _lxsdk=16ddced5e9a95-0a65869c427a14-48714616-15f900-16ddced5e9b2b; uuid_update=true; uuid=7b28e71504f5414e382b.1579155871.1.0.0; device_uuid=!64dedf83-b510-4910-8a31-b2b13d0bdd73; pushToken=00kRvxlerO15kB0dJFWDwYuctAoe04xGMNd0r3BqvLUA*; acctId=57396785; brandId=-1; wmPoiId=-1; isOfflineSelfOpen=0; city_id=0; isChain=1; existBrandPoi=true; ignore_set_router_proxy=true; region_id=; region_version=0; newCategory=false; bsid=OyqgRLyV54i9JKP0zRCI9jPyXc4UBU-6KReDAkPIwSlljhb97JPyFUIXfYQvhlJb6G1erzHQKbvtZ2pSWOYDxQ; cityId=510100; provinceId=510000; city_location_id=0; location_id=0; igateApp=shangouepc; wpush_server_url=wss://wpush.meituan.com; token=0MScAPaSa57iwRpgpCmGLf21tiA4yU4Uy-nDZlv8wNWs*; shopCategory=food; set_info=%7B%22wmPoiId%22%3A-1%2C%22ignoreSetRouterProxy%22%3Atrue%7D; JSESSIONID=105dgww27nsy6yfp68q7wmcni; LX_SC_CONSTANT=c_shangou_online_e_znrurnrc; _lxsdk_s=17041b590ac-3d-689-a8c%7C%7C15"
|
# mtwmCookieStr = "_lxsdk_cuid=16ddced5e9a95-0a65869c427a14-48714616-15f900-16ddced5e9b2b; _hc.v=cfebbfd1-79a7-9823-d8df-77e59646cb34.1571369610; _lxsdk=16ddced5e9a95-0a65869c427a14-48714616-15f900-16ddced5e9b2b; uuid_update=true; uuid=7b28e71504f5414e382b.1579155871.1.0.0; device_uuid=!64dedf83-b510-4910-8a31-b2b13d0bdd73; pushToken=00kRvxlerO15kB0dJFWDwYuctAoe04xGMNd0r3BqvLUA*; acctId=57396785; brandId=-1; wmPoiId=-1; isOfflineSelfOpen=0; city_id=0; isChain=1; existBrandPoi=true; ignore_set_router_proxy=true; region_id=; region_version=0; newCategory=false; bsid=OyqgRLyV54i9JKP0zRCI9jPyXc4UBU-6KReDAkPIwSlljhb97JPyFUIXfYQvhlJb6G1erzHQKbvtZ2pSWOYDxQ; cityId=510100; provinceId=510000; city_location_id=0; location_id=0; igateApp=shangouepc; wpush_server_url=wss://wpush.meituan.com; token=0MScAPaSa57iwRpgpCmGLf21tiA4yU4Uy-nDZlv8wNWs*; shopCategory=food; set_info=%7B%22wmPoiId%22%3A-1%2C%22ignoreSetRouterProxy%22%3Atrue%7D; JSESSIONID=105dgww27nsy6yfp68q7wmcni; LX_SC_CONSTANT=c_shangou_online_e_znrurnrc; _lxsdk_s=17041b590ac-3d-689-a8c%7C%7C15"
|
||||||
|
|
||||||
@@ -35,6 +36,7 @@ enableJdStoreWrite = false
|
|||||||
enableEbaiStoreWrite = false
|
enableEbaiStoreWrite = false
|
||||||
enableElmStoreWrite = false
|
enableElmStoreWrite = false
|
||||||
enableMtwmStoreWrite = false
|
enableMtwmStoreWrite = false
|
||||||
|
enableDdStoreWrite = false
|
||||||
enableWscStoreWrite = false
|
enableWscStoreWrite = false
|
||||||
enableYbStoreWrite = false
|
enableYbStoreWrite = false
|
||||||
enableJdShopWrite = false
|
enableJdShopWrite = false
|
||||||
@@ -301,6 +303,7 @@ enableStoreWrite = true
|
|||||||
enableJdStoreWrite = true
|
enableJdStoreWrite = true
|
||||||
enableEbaiStoreWrite = true
|
enableEbaiStoreWrite = true
|
||||||
enableMtwmStoreWrite = true
|
enableMtwmStoreWrite = true
|
||||||
|
enableDdStoreWrite = true
|
||||||
enableWscStoreWrite = true
|
enableWscStoreWrite = true
|
||||||
enableYbStoreWrite = true
|
enableYbStoreWrite = true
|
||||||
enableJdShopWrite = true
|
enableJdShopWrite = true
|
||||||
@@ -363,6 +366,7 @@ enableStoreWrite = true
|
|||||||
enableJdStoreWrite = true
|
enableJdStoreWrite = true
|
||||||
enableEbaiStoreWrite = true
|
enableEbaiStoreWrite = true
|
||||||
enableMtwmStoreWrite = true
|
enableMtwmStoreWrite = true
|
||||||
|
enableDdStoreWrite = true
|
||||||
enableYbStoreWrite = true
|
enableYbStoreWrite = true
|
||||||
enableJdShopWrite = true
|
enableJdShopWrite = true
|
||||||
|
|
||||||
@@ -504,6 +508,7 @@ enableStoreWrite = true
|
|||||||
enableJdStoreWrite = true
|
enableJdStoreWrite = true
|
||||||
enableEbaiStoreWrite = true
|
enableEbaiStoreWrite = true
|
||||||
enableMtwmStoreWrite = true
|
enableMtwmStoreWrite = true
|
||||||
|
enableDdStoreWrite = true
|
||||||
enableWscStoreWrite = false
|
enableWscStoreWrite = false
|
||||||
enableYbStoreWrite = false
|
enableYbStoreWrite = false
|
||||||
|
|
||||||
@@ -590,6 +595,7 @@ enableStoreWrite = true
|
|||||||
enableJdStoreWrite = true
|
enableJdStoreWrite = true
|
||||||
enableEbaiStoreWrite = true
|
enableEbaiStoreWrite = true
|
||||||
enableMtwmStoreWrite = true
|
enableMtwmStoreWrite = true
|
||||||
|
enableDdStoreWrite = true
|
||||||
enableWscStoreWrite = true
|
enableWscStoreWrite = true
|
||||||
enableYbStoreWrite = true
|
enableYbStoreWrite = true
|
||||||
enableJdShopWrite = true
|
enableJdShopWrite = true
|
||||||
|
|||||||
@@ -31,14 +31,16 @@ func (t *TiktokController) CallbackTiktokOrderMsg() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, v := range orderStatus {
|
for k, v := range orderStatus {
|
||||||
resp2 := tiktok_store.OnOrderMsg(v)
|
for _, callback := range v {
|
||||||
|
resp2 := tiktok_store.OnOrderMsg(k, callback)
|
||||||
if resp2.Code != 0 {
|
if resp2.Code != 0 {
|
||||||
t.Data["json"] = resp2
|
t.Data["json"] = resp2
|
||||||
t.ServeJSON()
|
t.ServeJSON()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
t.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackSuccessCode, Msg: tiktok_api.CallbackSuccess}
|
t.Data["json"] = tiktok_api.CallbackResponse{Code: tiktok_api.CallbackSuccessCode, Msg: tiktok_api.CallbackSuccess}
|
||||||
t.ServeJSON()
|
t.ServeJSON()
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ var (
|
|||||||
TiktokJXDJApi *tiktok.API //抖音京西到家api
|
TiktokJXDJApi *tiktok.API //抖音京西到家api
|
||||||
TiktokApiID string //抖音商城ID
|
TiktokApiID string //抖音商城ID
|
||||||
TiktokJXDJApiID string //抖音京西到家ID
|
TiktokJXDJApiID string //抖音京西到家ID
|
||||||
TiktokStore *tiktokShop.API
|
TiktokStore *tiktokShop.API // 抖店
|
||||||
EnterpriseChatHeadApi *enterprise.API // 企业微信api
|
EnterpriseChatHeadApi *enterprise.API // 企业微信api
|
||||||
EnterpriseChatMin *enterprise.API // 企业微信小程序api
|
EnterpriseChatMin *enterprise.API // 企业微信小程序api
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -64,6 +64,8 @@ func (a *APIManager) GetAPI(vendorID int, appOrgCode string) (pfAPI interface{})
|
|||||||
pfAPI = api.JdShopAPI
|
pfAPI = api.JdShopAPI
|
||||||
case model.VendorIDTT:
|
case model.VendorIDTT:
|
||||||
pfAPI = api.TiktokApi
|
pfAPI = api.TiktokApi
|
||||||
|
case model.VendorIDDD:
|
||||||
|
pfAPI = api.TiktokStore
|
||||||
}
|
}
|
||||||
return pfAPI
|
return pfAPI
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ var (
|
|||||||
EnableEbaiStoreWrite bool
|
EnableEbaiStoreWrite bool
|
||||||
EnableElmStoreWrite bool
|
EnableElmStoreWrite bool
|
||||||
EnableMtwmStoreWrite bool
|
EnableMtwmStoreWrite bool
|
||||||
|
EnableDdStoreWrite bool
|
||||||
EnableWscStoreWrite bool
|
EnableWscStoreWrite bool
|
||||||
EnablePendingChange bool
|
EnablePendingChange bool
|
||||||
EnableYbStoreWrite bool
|
EnableYbStoreWrite bool
|
||||||
@@ -80,6 +81,7 @@ var (
|
|||||||
IsAddEvent bool
|
IsAddEvent bool
|
||||||
|
|
||||||
OutputDebugMsgLevel int
|
OutputDebugMsgLevel int
|
||||||
|
TiktokShopCode string
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -108,6 +110,7 @@ func Init() {
|
|||||||
EnableJdStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableJdStoreWrite", false)
|
EnableJdStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableJdStoreWrite", false)
|
||||||
EnableEbaiStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableEbaiStoreWrite", false)
|
EnableEbaiStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableEbaiStoreWrite", false)
|
||||||
EnableElmStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableElmStoreWrite", false)
|
EnableElmStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableElmStoreWrite", false)
|
||||||
|
EnableDdStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableDdStoreWrite", false)
|
||||||
EnableMtwmStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableMtwmStoreWrite", false)
|
EnableMtwmStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableMtwmStoreWrite", false)
|
||||||
EnableWscStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableWscStoreWrite", false)
|
EnableWscStoreWrite = EnableStoreWrite && web.AppConfig.DefaultBool("enableWscStoreWrite", false)
|
||||||
// EnablePendingChange = web.AppConfig.DefaultBool("enablePendingChange", false)
|
// EnablePendingChange = web.AppConfig.DefaultBool("enablePendingChange", false)
|
||||||
@@ -165,6 +168,7 @@ func Init() {
|
|||||||
|
|
||||||
MtwmCode = web.AppConfig.DefaultString("mtwmAppID", "")
|
MtwmCode = web.AppConfig.DefaultString("mtwmAppID", "")
|
||||||
Mtwm2Code = web.AppConfig.DefaultString("mtwmAppID2", "")
|
Mtwm2Code = web.AppConfig.DefaultString("mtwmAppID2", "")
|
||||||
|
TiktokShopCode = web.AppConfig.DefaultString("tiktokShopAppId", "7136048270014416392")
|
||||||
}
|
}
|
||||||
|
|
||||||
func IsCallbackAlwaysReturnSuccess() bool {
|
func IsCallbackAlwaysReturnSuccess() bool {
|
||||||
|
|||||||
8
main.go
8
main.go
@@ -162,10 +162,10 @@ func main() {
|
|||||||
globals.SugarLogger.Errorf("RefreshFnToken failed with error:%s", err)
|
globals.SugarLogger.Errorf("RefreshFnToken failed with error:%s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if err := tasks.RefreshTiktokToken(); err != nil {
|
//if err := tasks.RefreshTiktokToken(); err != nil {
|
||||||
globals.SugarLogger.Errorf("RefreshTiktokToken failed with error:%s", err)
|
// globals.SugarLogger.Errorf("RefreshTiktokToken failed with error:%s", err)
|
||||||
return
|
// return
|
||||||
}
|
//}
|
||||||
if err := tasks.RefreshQywxToken(); err != nil {
|
if err := tasks.RefreshQywxToken(); err != nil {
|
||||||
globals.SugarLogger.Errorf("RefreshQywxToken failed with error:%s", err)
|
globals.SugarLogger.Errorf("RefreshQywxToken failed with error:%s", err)
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user