This commit is contained in:
richboo111
2022-10-09 16:39:48 +08:00
12 changed files with 204 additions and 88 deletions

View File

@@ -703,6 +703,9 @@ func GetSkuNames(ctx *jxcontext.Context, keyword string, isBySku, isQueryMidPric
if v.VendorID == model.VendorIDJDShop {
skuName.JdsCategoryID = v.VendorCategoryID
}
if v.VendorID == model.VendorIDDD {
skuName.DdCategoryID = v.VendorCategoryID
}
}
}
var (
@@ -1143,6 +1146,10 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n
updateOrCreate(model.VendorIDMTWM, nameID, skuNameExt.MtwmCategoryID)
flag = true
}
if skuNameExt.DdCategoryID != "" {
updateOrCreate(model.VendorIDDD, nameID, skuNameExt.DdCategoryID)
flag = true
}
} else {
if payload["jdCategoryID"] != nil {
updateOrCreate(model.VendorIDJD, nameID, payload["jdCategoryID"].(string))
@@ -1160,6 +1167,10 @@ func updateOrCreateSkuVendorCategoryMap(db *dao.DaoDB, ctx *jxcontext.Context, n
updateOrCreate(model.VendorIDMTWM, nameID, payload["mtwmCategoryID"].(string))
flag = true
}
if payload["ddCategoryID"] != nil {
updateOrCreate(model.VendorIDDD, nameID, payload["ddCategoryID"].(string))
flag = true
}
}
}
return flag

View File

@@ -4428,14 +4428,13 @@ func RefreshTiktokShopToken(ctx *jxcontext.Context) (err error) {
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)
codes, _ := dao.GetVendorOrgCode(db, model.VendorIDDD, "", "platform")
for _, v := range codes {
if v.Token != "" {
if result, err := api.TiktokStore.RefreshToken(); err == nil {
v.MtwmToken = result.AccessToken
v.MtwmRefreshToken = result.RefreshToken
dao.UpdateEntity(db, v, "MtwmToken", "MtwmRefreshToken")
token, _ := json.Marshal(result)
v.Token = string(token)
dao.UpdateEntity(db, v, "token")
}
}
}

View File

@@ -490,35 +490,39 @@ func (v *VendorSync) SyncStoresCategory(ctx *jxcontext.Context, db *dao.DaoDB, v
func (v *VendorSync) SyncStoresSkus2(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, db *dao.DaoDB, vendorIDs []int, storeIDs []int, syncDisabled bool, skuIDs, excludeSkuIDs []int, setSyncStatus int, isAsync, isContinueWhenError bool) (hint string, err error) {
globals.SugarLogger.Debug("SyncStoresSkus2")
isManageIt := len(storeIDs) != 1 || len(skuIDs) == 0 || len(skuIDs) > 8
task, hint, err := v.LoopStoresMap2(ctx, parentTask, db, fmt.Sprintf("同步门店商品信息:%v", storeIDs), isAsync, isManageIt, vendorIDs, storeIDs, false,
func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
loopMapInfo := batchItemList[0].(*LoopStoreMapInfo)
if handler := v.GetStoreHandler(loopMapInfo.VendorID); handler != nil {
parallelCount := 5
if model.MultiStoresVendorMap[loopMapInfo.VendorID] == 1 {
parallelCount = 2
}
loopStoreTask := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[loopMapInfo.VendorID]),
tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeMap := batchItemList[0].(*model.StoreMap)
globals.SugarLogger.Debug("SyncStoresSkus2===============1")
if syncDisabled || storeMap.Status > model.StoreStatusDisabled {
globals.SugarLogger.Debug("SyncStoresSkus2===============2")
if setSyncStatus != 0 {
dao.SetStoreSkuSyncStatus(db, storeMap.VendorID, []int{storeMap.StoreID}, skuIDs, setSyncStatus)
}
if _, err = SyncStoreSkuNew(ctx, task, causeFlag, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, storeMap.VendorOrgCode, nil, skuIDs, excludeSkuIDs, false, isContinueWhenError); err != nil {
globals.SugarLogger.Debugf("SyncStoresSkus2 failed2 store:%d failed with error:%v", storeMap.StoreID, err)
}
}
return nil, err
}, loopMapInfo.StoreMapList)
t.AddChild(loopStoreTask).Run()
_, err = loopStoreTask.GetResult(0)
funcParam := func(t *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (interface{}, error) {
globals.SugarLogger.Debug("SyncStoresSkus2===============0")
loopMapInfo := batchItemList[0].(*LoopStoreMapInfo)
if handler := v.GetStoreHandler(loopMapInfo.VendorID); handler != nil {
globals.SugarLogger.Debug("SyncStoresSkus2===============1")
parallelCount := 5
if model.MultiStoresVendorMap[loopMapInfo.VendorID] == 1 {
parallelCount = 2
}
return nil, partner.AddVendorInfo2Err(err, loopMapInfo.VendorID)
}, isContinueWhenError)
loopStoreTask := tasksch.NewParallelTask(fmt.Sprintf("处理平台%s", model.VendorChineseNames[loopMapInfo.VendorID]),
tasksch.NewParallelConfig().SetParallelCount(parallelCount).SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
storeMap := batchItemList[0].(*model.StoreMap)
globals.SugarLogger.Debug("SyncStoresSkus2===============2")
if syncDisabled || storeMap.Status > model.StoreStatusDisabled {
globals.SugarLogger.Debug("SyncStoresSkus2===============3")
if setSyncStatus != 0 {
dao.SetStoreSkuSyncStatus(db, storeMap.VendorID, []int{storeMap.StoreID}, skuIDs, setSyncStatus)
}
if _, err = SyncStoreSkuNew(ctx, task, causeFlag, storeMap.VendorID, storeMap.StoreID, storeMap.VendorStoreID, storeMap.VendorOrgCode, nil, skuIDs, excludeSkuIDs, false, isContinueWhenError); err != nil {
globals.SugarLogger.Debugf("SyncStoresSkus2 failed2 store:%d failed with error:%v", storeMap.StoreID, err)
}
}
return nil, err
}, loopMapInfo.StoreMapList)
t.AddChild(loopStoreTask).Run()
_, err = loopStoreTask.GetResult(0)
}
return nil, partner.AddVendorInfo2Err(err, loopMapInfo.VendorID)
}
task, hint, err := v.LoopStoresMap2(ctx, parentTask, db, fmt.Sprintf("同步门店商品信息:%v", storeIDs), isAsync, isManageIt, vendorIDs, storeIDs, false, funcParam, isContinueWhenError)
if task != nil {
err = makeSyncError(err)
}
@@ -691,6 +695,7 @@ func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, parentTask tasksch.I
if storeMapList, err = dao.GetStoresMapList2(db, vendorIDs, storeIDs, nil, model.StoreStatusAll, model.StoreIsSyncYes, "", "", "", mustDirty); err != nil {
return nil, "", err
}
globals.SugarLogger.Debug("===============len(storeMapList)", len(storeMapList))
if len(storeMapList) == 0 {
return nil, "", nil
}
@@ -707,9 +712,13 @@ func (v *VendorSync) LoopStoresMap2(ctx *jxcontext.Context, parentTask tasksch.I
}
index++
}
globals.SugarLogger.Debug("===============len(storeMapList)1111111111", vendorStoreMap)
if len(loopInfoList) == 1 {
globals.SugarLogger.Debug("===============len(storeMapList)22222")
taskName = fmt.Sprintf("%s,处理平台%s", taskName, model.VendorChineseNames[loopInfoList[0].VendorID])
}
globals.SugarLogger.Debug("===============len(storeMapList)3333")
task = tasksch.NewParallelTask(taskName, tasksch.NewParallelConfig().SetIsContinueWhenError(true), ctx, handler, loopInfoList)
if isAsync {

View File

@@ -147,6 +147,8 @@ func SyncStoreCategories(ctx *jxcontext.Context, parentTask tasksch.ITask, vendo
if err == nil {
if vendorID == model.VendorIDMTWM {
refutil.SetObjFieldByName(storeCatMap, idFieldName, catInfo.VendorCatID)
} else if vendorID == model.VendorIDDD {
refutil.SetObjFieldByName(storeCatMap, idFieldName, catInfo.VendorCatID)
} else {
refutil.SetObjFieldByName(storeCatMap, idFieldName, utils.Str2Int64WithDefault(catInfo.VendorCatID, 0))
}
@@ -436,8 +438,11 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
var skus []*dao.StoreSkuSyncInfo
if isFull {
skus, err = dao.GetFullStoreSkus(db, vendorID, storeID)
globals.SugarLogger.Debugf("================isFull%s", utils.Format4Output(skus, true))
} else {
skus, err = dao.GetStoreSkus(db, vendorID, storeID, skuIDs)
globals.SugarLogger.Debugf("================isFull2%s", utils.Format4Output(skus, true))
}
if err != nil || len(skus) == 0 {
return err
@@ -475,6 +480,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
now := jxutils.OperationTime2HourMinuteFormat(time.Now())
var failedList []*partner.StoreSkuInfoWithErr
for _, sku := range skus {
globals.SugarLogger.Debugf("================isFull2%s", utils.Format4Output(sku, true))
if !useVendorPriceDirectly &&
!isSkuLockTimeValid(sku) {
sku.VendorPrice = 0
@@ -489,6 +495,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
var bareSku *partner.StoreSkuInfo
isNeedReorder := false
if isStoreSkuSyncNeedDelete(sku) {
globals.SugarLogger.Debug("11111111111111111111111")
if !dao.IsVendorThingIDEmpty(sku.VendorSkuID) {
bareSku = storeSkuSyncInfo2Bare(sku)
if singleStoreHandler == nil {
@@ -501,8 +508,10 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
updateItems = append(updateItems, sku2Update(vendorID, sku, model.SyncFlagDeletedMask))
}
} else if model.IsSyncStatusNew(sku.SkuSyncStatus) {
globals.SugarLogger.Debug("222222222222222")
calVendorPrice4StoreSku(sku, storeDetail.PricePercentagePackObj, int(storeDetail.PricePercentage))
if singleStoreHandler == nil {
globals.SugarLogger.Debug("11111111111111111111111")
if dao.IsVendorThingIDEmpty(sku.VendorSkuID) {
// todo 多平台商品库没有正常创建,直接跳过
} else {
@@ -517,11 +526,14 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
}
}
} else {
globals.SugarLogger.Debug("2222222222222223333333333333333")
if sku.MergedStatus == model.SkuStatusNormal {
if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop {
// globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d但没有平台分类ID", storeID, sku.SkuID)
if vendorID == model.VendorIDDD {
createList = append(createList, sku)
} else if dao.IsVendorThingIDEmpty(sku.VendorCatID) && !strings.Contains(sku.StoreName, model.ExdStoreName) && vendorID != model.VendorIDYB && vendorID != model.VendorIDJDShop {
globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d但没有平台分类ID", storeID, sku.SkuID)
} else if dao.IsVendorThingIDEmpty(utils.Int64ToStr(sku.VendorVendorCatID)) && vendorID == model.VendorIDJDShop {
// globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d但没有映射的平台ID", storeID, sku.SkuID)
globals.SugarLogger.Warnf("syncStoreSkuNew 创建门店:%d商品:%d但没有映射的平台ID", storeID, sku.SkuID)
} else {
createList = append(createList, sku)
}
@@ -529,7 +541,10 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
}
isNeedReorder = true
} else {
globals.SugarLogger.Debug("33333333333333333333333")
if dao.IsVendorThingIDEmpty(sku.VendorSkuID) && vendorID != model.VendorIDJDShop {
globals.SugarLogger.Debug("3333333333333333333333344444444444444")
// err = fmt.Errorf("门店:%d修改没有创建的商品:%d", storeID, sku.SkuID)
if vendorID != model.VendorIDJDShop || (vendorID == model.VendorIDJDShop && storeID == model.JdShopMainStoreID && sku.StoreSkuStatus != model.SkuStatusDontSale) {
err = utils.NewErrorCode(fmt.Sprintf("门店:%d修改没有创建的商品:%d", storeID, sku.SkuID), "-1", 0)
@@ -541,6 +556,8 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
parentTask.AddFailedList(failedList)
}
} else {
globals.SugarLogger.Debug("3333333333333333333333355555555555")
isAdded2Update := false
// 修改商品信息时不改价(以免活动引起的失败),而用单独的改价来改
if (model.IsSyncStatusUpdate(sku.SkuSyncStatus) || (model.IsSyncStatusSeq(sku.SkuSyncStatus) && reorderHandler == nil)) && singleStoreHandler != nil {
@@ -556,6 +573,8 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
priceList = append(priceList, bareSku)
}
if !isAdded2Update {
globals.SugarLogger.Debug("333333333333333333333335555555555566666666666666666")
if model.IsSyncStatusUpdate(sku.SkuSyncStatus) && singleStoreHandler == nil { // 正常就不应该进到这里
// if bareSku == nil {
// bareSku = storeSkuSyncInfo2Bare(sku)
@@ -660,6 +679,13 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
// api.JdShop2API.SetCookieWithStr(configs[0].Value)
// }
}
globals.SugarLogger.Debugf("================createList%s", utils.Format4Output(createList, true))
globals.SugarLogger.Debugf("================deleteList%s", utils.Format4Output(deleteList, true))
globals.SugarLogger.Debugf("================updateList%s", utils.Format4Output(updateList, true))
globals.SugarLogger.Debugf("================stockList%s", utils.Format4Output(stockList, true))
globals.SugarLogger.Debugf("================onlineList%s", utils.Format4Output(onlineList, true))
globals.SugarLogger.Debugf("================offlineList%s", utils.Format4Output(offlineList, true))
globals.SugarLogger.Debugf("================priceList%s", utils.Format4Output(priceList, true))
task := tasksch.NewParallelTask("syncStoreSkuNew", tasksch.NewParallelConfig().SetParallelCount(1).SetIsContinueWhenError(isContinueWhenError2), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
@@ -668,6 +694,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
switch step {
case 0:
if len(deleteList) > 0 {
globals.SugarLogger.Debugf("================deleteList%s", utils.Format4Output(deleteList, true))
_, err = putils.FreeBatchStoreSkuInfo("删除门店商品", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var failedList []*partner.StoreSkuInfoWithErr
if failedList, err = singleStoreHandler.DeleteStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList); err != nil {
@@ -693,7 +720,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
case 1:
if len(createList) > 0 {
_, err = putils.FreeBatchStoreSkuSyncInfo("创建门店商品", func(task tasksch.ITask, batchedStoreSkuList []*dao.StoreSkuSyncInfo) (result interface{}, successCount int, err error) {
globals.SugarLogger.Debug("========================sth err at createlist run ====================")
globals.SugarLogger.Debugf("================createList%s", utils.Format4Output(createList, true))
var failedList []*partner.StoreSkuInfoWithErr
if failedList, err = singleStoreHandler.CreateStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList); singleStoreHandler.IsErrSkuExist(err) {
if skuNameList, err2 := singleStoreHandler.GetStoreSkusFullInfo(ctx, task, storeID, vendorStoreID, []*partner.StoreSkuInfo{
@@ -739,6 +766,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
}
case 2:
if len(updateList) > 0 {
globals.SugarLogger.Debugf("================updateList%s", utils.Format4Output(updateList, true))
_, err = putils.FreeBatchStoreSkuSyncInfo("更新门店商品基础信息", func(task tasksch.ITask, batchedStoreSkuList []*dao.StoreSkuSyncInfo) (result interface{}, successCount int, err error) {
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = singleStoreHandler.UpdateStoreSkus(ctx, storeID, vendorStoreID, batchedStoreSkuList)
@@ -756,9 +784,11 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
case 3:
// for k, list := range [][]*partner.StoreSkuInfo{stockList /*, onlineList*/} {
if len(stockList) > 0 {
globals.SugarLogger.Debugf("================更新门店商品库存%s", utils.Format4Output(stockList, true))
_, err = putils.FreeBatchStoreSkuInfo("更新门店商品库存", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = storeSkuHandler.UpdateStoreSkusStock(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
globals.SugarLogger.Debugf("failedList===========%s", utils.Format4Output(failedList, true))
failedList, err = buildFailedListAndErr(failedList, err, batchedStoreSkuList, nil, storeID, vendorID, "更新门店商品库存")
if len(failedList) > 0 {
task.AddFailedList(failedList)
@@ -797,6 +827,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
}
case 6:
if len(priceList) > 0 {
globals.SugarLogger.Debugf("================更新门店商品价格%s", utils.Format4Output(priceList, true))
_, err = putils.FreeBatchStoreSkuInfo("更新门店商品价格", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
if isNeedHandleAct(causeFlag) {
cancelStoreSkuActs(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList, true)
@@ -823,6 +854,7 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
for vendorCatID := range reorderSkuMap {
vendorCatIDs = append(vendorCatIDs, vendorCatID)
}
globals.SugarLogger.Debugf("================门店商品排序%s", utils.Format4Output(reorderSkuMap, true))
reorderTask := tasksch.NewParallelTask("门店商品排序", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError2), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
vendorCatID := batchItemList[0].(string)

View File

@@ -3,6 +3,7 @@ package dao
import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
)
func GetDataResource(db *DaoDB, hashCode, fullURL string) (dataRes *model.DataResource, err error) {
@@ -53,6 +54,7 @@ func GetVendorOrgCode(db *DaoDB, vendorID int, vendorOrgCode, vendorType string)
}
sql += " ORDER BY comment"
err = GetRows(db, &vendorOrgs, sql, sqlParams)
globals.SugarLogger.Debug("===========sql= ", sql)
return vendorOrgs, err
}

View File

@@ -40,6 +40,7 @@ type StoreDetail struct {
DistrictName string `json:"districtName"`
CityName string `json:"cityName"`
ProvinceName string `json:"provinceName"` //省名
ProvinceCode int `json:"provinceCode"` //省名
JdCityCode int `json:"jdCityCode"` //京东市code
JdCode int `json:"jdCode"` //京东区code
JdsCode int `json:"jdsCode"` //京东商城地址代码
@@ -115,6 +116,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID, vendorOrgCo
t3.value price_percentage_pack_str,
t4.value freight_deduction_pack_str,
province.name province_name,
province.code province_code,
district.name district_name,
district.jds_code jds_code,
district.jd_code jd_code,

View File

@@ -130,6 +130,7 @@ type SkuCategory struct {
JdCategoryID int64 `orm:"column(jd_category_id)" json:"jdCategoryID"` // 这个是指对应的京东商品类别
EbaiCategoryID int64 `orm:"column(ebai_category_id)" json:"ebaiCategoryID"` // 这个是指对应的饿百商品类别
MtwmCategoryID int64 `orm:"column(mtwm_category_id)" json:"mtwmCategoryID"` // 这个是指对应的美团外卖商品类别
DdCategoryID int64 `orm:"column(dd_category_id)" json:"ddCategoryID"` // 这个是指对应的抖音外卖商品类别
YbCategoryID int64 `orm:"column(yb_category_id)" json:"ybCategoryID"` // 这个是指对应的银豹商品类别
JdsCategoryID int64 `orm:"column(jds_category_id)" json:"jdsCategoryID"` // 这个是指对应的京东商城类别
GoMeiCategoryID int64 `orm:"column(go_mei_category_id)" json:"goMeiCategoryID"` // 这个是指对应的国美商城类别
@@ -302,6 +303,7 @@ type SkuNameExt struct {
JdsCategoryID string `json:"jdsCategoryID"`
EbaiCategoryID string `json:"ebaiCategoryID"`
MtwmCategoryID string `json:"mtwmCategoryID"`
DdCategoryID string `json:"ddCategoryID"`
}
type SkuExinfoMap struct {

View File

@@ -303,9 +303,9 @@ func (P *PurchaseHandler) CreateFreightTemplateDirectly(templateInfo freightTemp
StoreId: vendorStoreID,
FreightId: resp.TemplateId,
}
err1 := api.BindFreightTemplate(bindInfo)
err = api.BindFreightTemplate(bindInfo)
if err != nil {
return err1
return err
}
//并写入数据库
freightInfo := model.FreightTemplate{

View File

@@ -1,16 +1,15 @@
package tiktok_store
import (
"encoding/json"
"fmt"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
freightTemplate_create_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/freightTemplate_create/request"
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"
shop_bindStoreFreight_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_bindStoreFreight/request"
sku_editPrice_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_editPrice/request"
tiktokShop "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api"
"regexp"
"strings"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
@@ -20,6 +19,8 @@ import (
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/business/partner/putils"
"git.rosy.net.cn/jx-callback/globals"
"math/rand"
"regexp"
)
const (
@@ -245,6 +246,8 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v
// p.createOrUpdateStoreSkus(ctx, storeID, vendorStoreID, duplicateStoreSkuList(storeSkuList, i+1), true)
// }
//}
globals.SugarLogger.Debugf("============CreateStoreSkus===============%s", utils.Format4Output(failedList, false))
globals.SugarLogger.Debugf("============CreateStoreSkus===============%s", err)
return failedList, err
}
@@ -253,17 +256,44 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v
func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo, isCreate bool) (failedList []*partner.StoreSkuInfoWithErr, err error) {
var syncType string
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
api := getAPI(storeDetail.VendorOrgCode, storeID, vendorStoreID)
globals.SugarLogger.Debug("=============", storeDetail.VendorOrgCode)
globals.SugarLogger.Debugf("api===============%v", utils.Format4Output(api, false))
freightId, _ := api.GetStoreBindTemp(utils.Str2Int64(vendorStoreID))
if freightId == 0 {
// 创建门店运费模板
temp, err := api.FreightTemplateCreate(&freightTemplate_create_request.FreightTemplateCreateParam{
Template: &freightTemplate_create_request.Template{
TemplateName: storeDetail.Name + "_" + utils.Int64ToStr(rand.Int63n(int64(storeID))) + "_系统模板",
ProductProvince: utils.Str2Int64(utils.Int2Str(storeDetail.ProvinceCode)[0:2]),
ProductCity: int64(storeDetail.CityCode),
CalculateType: 2,
TransferType: 1, // 快递
RuleType: 1,
FixedAmount: 500,
},
Columns: nil,
})
if err != nil {
return nil, err
}
// 绑定门店运费模板
err = api.BindFreightTemplate(&shop_bindStoreFreight_request.ShopBindStoreFreightParam{
StoreId: utils.Str2Int64(vendorStoreID),
FreightId: temp.TemplateId,
})
if err != nil {
return nil, err
}
freightId = temp.TemplateId
}
if isCreate {
syncType = "创建商品"
for _, storeSku := range storeSkuList {
// 创建商品
param := &product_addV2_request.ProductAddV2Param{
CategoryLeafId: utils.Str2Int64(storeSku.VendorCatID),
CategoryLeafId: utils.Str2Int64(storeSku.SkuVendorMapCatID),
Name: storeSku.Name,
PayType: tiktokShop.TiktokPayType1,
ReduceType: tiktokShop.SkuReduceTypePayMakeOrder,
@@ -284,13 +314,13 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
}
// 获取上传图,商品轮播图
img, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5)
img, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, 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)
img2, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg)
if err != nil {
return nil, err
}
@@ -308,6 +338,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
param.SpecPrices = GetSpecPrices(param.Specs, storeSku)
// ProductFormatNew
productFormatNew, err := GetProductFormatNew(param.CategoryLeafId, storeDetail.VendorOrgCode)
globals.SugarLogger.Debug("创建=============productFormatNew", productFormatNew)
globals.SugarLogger.Debug("创建=============productFormatNew err", err)
if err != nil {
return nil, err
}
@@ -348,13 +380,13 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
}
// 获取上传图,商品轮播图
img, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5)
img, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, 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)
img2, err := GetTiktokImgList(utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg)
if err != nil {
return nil, err
}
@@ -372,6 +404,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
param.SpecPrices = GetSpecPrices(param.Specs, storeSku)
// ProductFormatNew
productFormatNew, err := GetProductFormatNew(param.CategoryLeafId, storeDetail.VendorOrgCode)
globals.SugarLogger.Debug("更新=============productFormatNew", productFormatNew)
globals.SugarLogger.Debug("更新=============productFormatNew err", err)
if err != nil {
return nil, err
}
@@ -468,36 +502,44 @@ func (p *PurchaseHandler) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOr
func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
api := getAPI(vendorOrgCode, storeID, vendorStoreID)
for _, v := range storeSkuList {
param := &product_editV2_request.ProductEditV2Param{}
param.ProductId = utils.Str2Int64(v.VendorSkuID)
param.Specs = "净重|" + fmt.Sprintf("%f", v.SpecQuality) + v.SpecUnit
skuSize := make([]*tiktokShop.SpecDetailList, 0, 0)
detail1 := strings.Split(param.Specs, "^")
name1 := strings.Split(strings.Split(detail1[0], "|")[1], ",")
for i := 0; i < len(name1); i++ {
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)
//param := &product_editV2_request.ProductEditV2Param{}
//param.ProductId = utils.Str2Int64(v.VendorSkuID)
//param.Specs = "净重|" + fmt.Sprintf("%f", v.SpecQuality) + v.SpecUnit
//
//skuSize := make([]*tiktokShop.SpecDetailList, 0, 0)
//detail1 := strings.Split(param.Specs, "^")
//name1 := strings.Split(strings.Split(detail1[0], "|")[1], ",")
//for i := 0; i < len(name1); i++ {
// 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)
param := &sku_editPrice_request.SkuEditPriceParam{
Price: v.VendorPrice,
Code: "",
SkuId: 0,
OutSkuId: int64(v.SkuID),
ProductId: utils.Str2Int64(v.VendorSkuID),
//OutProductId: int64(v.SkuID),
}
data, _ := json.Marshal(skuSize)
param.SpecPrices = string(data)
err := api.EditStoreCommodity(param)
err := api.EditPrice(param)
if err != nil {
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "上架商品正常")...)
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], "上架商品异常")...)
failedList = append(failedList, putils.GetErrMsg2FailedSingleList(v, err, storeID, model.VendorChineseNames[model.VendorIDDD], "更新价格正常")...)
}
}

View File

@@ -8,7 +8,7 @@ import (
"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"
"git.rosy.net.cn/jx-callback/globals"
"strings"
)
@@ -33,11 +33,12 @@ func GetProductFormatNew(categoryLeftId int64, vendorOrgCode string) (string, er
if err != nil {
return "", err
}
globals.SugarLogger.Debug("========productFormatNew==============", string(productFormatNew))
return string(productFormatNew), nil
}
// GetTiktokImgList 获取抖音图片链接
func GetTiktokImgList(storeId string, img ...string) (string, error) {
func GetTiktokImgList(storeId, appOrgCode string, img ...string) (string, error) {
imgs := make([]tiktokShop.Imgs, 0, 0)
for _, v := range img {
if v != "" {
@@ -47,7 +48,7 @@ func GetTiktokImgList(storeId string, img ...string) (string, error) {
})
}
}
tiktokImgList, err := api.TiktokStore.BatchUploadImages(imgs)
tiktokImgList, err := getAPI(appOrgCode, 0, "").BatchUploadImages(imgs)
if err != nil {
return "", err
}

View File

@@ -2,6 +2,7 @@ package putils
import (
"fmt"
"git.rosy.net.cn/jx-callback/globals"
"sort"
"time"
@@ -250,6 +251,7 @@ func GetErrMsg2FailedSingleList(storeSkuList interface{}, err error, storeID int
errMsg = err.Error()
}
if storeSkuLists, ok := storeSkuList.([]*partner.StoreSkuInfo); ok {
globals.SugarLogger.Debugf("=======storeSkuLists== %s", utils.Format4Output(storeSkuLists, false))
storeSkuInfoWithErr := &partner.StoreSkuInfoWithErr{
StoreSkuInfo: storeSkuLists[0],
ErrMsg: errMsg,
@@ -258,7 +260,18 @@ func GetErrMsg2FailedSingleList(storeSkuList interface{}, err error, storeID int
SyncType: syncType,
}
failedList = append(failedList, storeSkuInfoWithErr)
} else if storeSku, ok := storeSkuList.(*partner.StoreSkuInfo); ok {
globals.SugarLogger.Debugf("=======storeSku== %s", utils.Format4Output(storeSkuLists, false))
storeSkuInfoWithErr := &partner.StoreSkuInfoWithErr{
StoreSkuInfo: storeSku,
ErrMsg: errMsg,
StoreID: storeID,
VendoreName: vendorName,
SyncType: syncType,
}
failedList = append(failedList, storeSkuInfoWithErr)
} else if storeSkuLists, ok := storeSkuList.([]*dao.StoreSkuSyncInfo); ok {
globals.SugarLogger.Debugf("=======storeSkuLists StoreSkuSyncInfo== %s", utils.Format4Output(storeSkuLists, false))
storeSkuInfo := &partner.StoreSkuInfo{
SkuID: storeSkuLists[0].SkuID,
VendorSkuID: storeSkuLists[0].VendorSkuID,
@@ -276,6 +289,7 @@ func GetErrMsg2FailedSingleList(storeSkuList interface{}, err error, storeID int
}
failedList = append(failedList, storeSkuInfoWithErr)
} else if storeSku, ok := storeSkuList.(*dao.StoreSkuSyncInfo); ok {
globals.SugarLogger.Debugf("=======storeSku== %s", utils.Format4Output(storeSkuLists, false))
storeSkuInfo := &partner.StoreSkuInfo{
SkuID: storeSku.SkuID,
VendorSkuID: storeSku.VendorSkuID,
@@ -293,6 +307,7 @@ func GetErrMsg2FailedSingleList(storeSkuList interface{}, err error, storeID int
}
failedList = append(failedList, storeSkuInfoWithErr)
} else {
globals.SugarLogger.Debugf("=======else== %s", utils.Format4Output(storeSkuLists, false))
storeSkuInfoWithErr := &partner.StoreSkuInfoWithErr{
ErrMsg: errMsg,
StoreID: storeID,

View File

@@ -2,6 +2,8 @@ package apimanager
import (
"git.rosy.net.cn/baseapi/platformapi/jdapi"
"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/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
@@ -9,6 +11,7 @@ import (
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
beego "github.com/astaxie/beego/server/web"
)
const (
@@ -65,11 +68,9 @@ func (a *APIManager) GetAPI(vendorID int, appOrgCode string) (pfAPI interface{})
case model.VendorIDTT:
pfAPI = api.TiktokApi
case model.VendorIDDD:
tiktokApi := api.TiktokStore
codes, _ := dao.GetVendorOrgCode(db, vendorID, appOrgCode, "platform")
code := codes[0]
tiktokApi.SetAccessToken(code.Token)
pfAPI = tiktokApi
pfAPI = tiktok_api.New(beego.AppConfig.DefaultString("tiktokShopAppId", ""), beego.AppConfig.DefaultString("tiktokShopAppSecret", ""), codes[0].Token)
globals.SugarLogger.Debugf("pfAPI ================%v", utils.Format4Output(pfAPI, true))
}
return pfAPI
}