|
|
|
|
@@ -5,6 +5,7 @@ import (
|
|
|
|
|
"errors"
|
|
|
|
|
"fmt"
|
|
|
|
|
product_addV2_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_addV2/response"
|
|
|
|
|
"git.rosy.net.cn/jx-callback/globals"
|
|
|
|
|
beego "github.com/astaxie/beego/server/web"
|
|
|
|
|
"strings"
|
|
|
|
|
"time"
|
|
|
|
|
@@ -130,6 +131,10 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
|
|
|
|
db := dao.GetDB()
|
|
|
|
|
storeDetail, _ := dao.GetStoreDetail(db, storeID, model.VendorIDDD, "")
|
|
|
|
|
api := getAPI(storeDetail.VendorOrgCode, storeID, vendorStoreID)
|
|
|
|
|
if storeID == 669044 {
|
|
|
|
|
globals.SugarLogger.Debugf("-----storeSkuList %s", utils.Format4Output(storeSkuList, false))
|
|
|
|
|
globals.SugarLogger.Debugf("-----isCreate %s", utils.Format4Output(isCreate, false))
|
|
|
|
|
}
|
|
|
|
|
if isCreate {
|
|
|
|
|
syncType = "创建商品"
|
|
|
|
|
for _, storeSku := range storeSkuList { // 创建商品
|
|
|
|
|
@@ -214,120 +219,131 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
|
|
|
|
storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID
|
|
|
|
|
storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // 还没同步子商品
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("只创建了主商品,没创建子商品"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
} else if localThing[0].SyncStatus == model.ThingTypeSyncFail { // 同步失败在重新创建
|
|
|
|
|
param, failedList2 := makeMainProductSku(db, api, storeSku, storeDetail, storeID, vendorStoreID, syncType)
|
|
|
|
|
if len(failedList2) != 0 {
|
|
|
|
|
failedList = append(failedList, failedList2...)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品,同步主商品
|
|
|
|
|
if err != nil {
|
|
|
|
|
storeSku.SkuSyncStatus = 0 // 只创建主品,子品都没做
|
|
|
|
|
storeSku.VendorSonSkuID = err.Error()
|
|
|
|
|
dao.UpdateThingMap(db, model.ThingTypeSyncingStop, err.Error(), storeSku.SkuID, model.VendorIDDD, storeDetail.VendorOrgCode)
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
switch localThing[0].SyncStatus {
|
|
|
|
|
case model.ThingTypeSyncFail: // 同步失败在重新创建
|
|
|
|
|
param, failedList2 := makeMainProductSku(db, api, storeSku, storeDetail, storeID, vendorStoreID, syncType)
|
|
|
|
|
if len(failedList2) != 0 {
|
|
|
|
|
failedList = append(failedList, failedList2...)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品,同步主商品
|
|
|
|
|
if err != nil {
|
|
|
|
|
storeSku.SkuSyncStatus = 0 // 只创建主品,子品都没做
|
|
|
|
|
storeSku.VendorSonSkuID = err.Error()
|
|
|
|
|
dao.UpdateThingMap(db, model.ThingTypeSyncingStop, err.Error(), storeSku.SkuID, model.VendorIDDD, storeDetail.VendorOrgCode)
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := dao.UpdateThingMap(db, model.ThingTypeSyncSuccess, utils.Int64ToStr(tiktokResult.ProductId), storeSku.SkuID, model.VendorIDDD, storeDetail.VendorOrgCode); err != nil {
|
|
|
|
|
if err := dao.UpdateThingMap(db, model.ThingTypeSyncSuccess, utils.Int64ToStr(tiktokResult.ProductId), storeSku.SkuID, model.VendorIDDD, storeDetail.VendorOrgCode); err != nil {
|
|
|
|
|
storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
var attrId []string
|
|
|
|
|
for _, v := range tiktokResult.Sku {
|
|
|
|
|
attrId = append(attrId, utils.Int64ToStr(v.SkuId))
|
|
|
|
|
}
|
|
|
|
|
mainProductId = tiktokResult.ProductId
|
|
|
|
|
//storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID)
|
|
|
|
|
storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
storeSku.VendorMainId = utils.Int64ToStr(tiktokResult.ProductId)
|
|
|
|
|
storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID
|
|
|
|
|
//storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // 还没同步子商品
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("只创建了主商品,没创建子商品"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
case model.ThingTypeSyncing:
|
|
|
|
|
if time.Now().Unix()-localThing[0].CreatedAt.Unix() > 300 {
|
|
|
|
|
dao.DeleteThingToTiktokMapList(model.VendorIDDD, localThing[0].VendorThingID, storeSku.SkuID)
|
|
|
|
|
}
|
|
|
|
|
storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("商品同步中或同步错误"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
var attrId []string
|
|
|
|
|
for _, v := range tiktokResult.Sku {
|
|
|
|
|
attrId = append(attrId, utils.Int64ToStr(v.SkuId))
|
|
|
|
|
}
|
|
|
|
|
mainProductId = tiktokResult.ProductId
|
|
|
|
|
//storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID)
|
|
|
|
|
storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做
|
|
|
|
|
storeSku.VendorMainId = utils.Int64ToStr(tiktokResult.ProductId)
|
|
|
|
|
storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID
|
|
|
|
|
//storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // 还没同步子商品
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("只创建了主商品,没创建子商品"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
} else if localThing[0].SyncStatus == model.ThingTypeSyncing {
|
|
|
|
|
if time.Now().Unix()-localThing[0].CreatedAt.Unix() > 300 {
|
|
|
|
|
dao.DeleteThingToTiktokMapList(model.VendorIDDD, localThing[0].VendorThingID, storeSku.SkuID)
|
|
|
|
|
}
|
|
|
|
|
storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("商品同步中或同步错误"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
continue
|
|
|
|
|
} else if localThing[0].SyncStatus == model.ThingTypeSyncSuccess {
|
|
|
|
|
// 主商品存在,直接同步子商品
|
|
|
|
|
childrenProductId, err := api.CreateSubProduct(utils.Str2Int64(localThing[0].VendorThingID), utils.Str2Int64(vendorStoreID))
|
|
|
|
|
if err != nil && strings.Contains(err.Error(), "2010004") { // 2010004:主商品非在线审核通过状态,不允许绑定子商品
|
|
|
|
|
// 线上本地都存在,但是线上审核不成功,就去更新主商品
|
|
|
|
|
mainOrderDetail = loadMainProductId(api, storeSku, localThing[0].VendorThingID)
|
|
|
|
|
if mainOrderDetail.CheckStatus == tiktokShop.SkuCheckStatusProhibit || mainOrderDetail.CheckStatus == tiktokShop.SkuCheckStatusNotPass {
|
|
|
|
|
// 更新主商品,在同步到子门店,考虑审核时间
|
|
|
|
|
param, failedList2 := makeMainProductSku(db, api, storeSku, storeDetail, storeID, vendorStoreID, syncType)
|
|
|
|
|
if len(failedList2) != 0 {
|
|
|
|
|
failedList = append(failedList, failedList2...)
|
|
|
|
|
case model.ThingTypeSyncSuccess:
|
|
|
|
|
// 主商品存在,直接同步子商品
|
|
|
|
|
childrenProductId, sonSkuId, err := api.CreateSubProduct(utils.Str2Int64(localThing[0].VendorThingID), utils.Str2Int64(vendorStoreID))
|
|
|
|
|
if storeID == 669044 {
|
|
|
|
|
globals.SugarLogger.Debugf("---childrenProductId- :%d", childrenProductId)
|
|
|
|
|
globals.SugarLogger.Debugf("---childrenProductId- :%s", sonSkuId)
|
|
|
|
|
}
|
|
|
|
|
if err != nil && strings.Contains(err.Error(), "2010004") { // 2010004:主商品非在线审核通过状态,不允许绑定子商品
|
|
|
|
|
// 线上本地都存在,但是线上审核不成功,就去更新主商品
|
|
|
|
|
mainOrderDetail = loadMainProductId(api, storeSku, localThing[0].VendorThingID)
|
|
|
|
|
if mainOrderDetail.CheckStatus == tiktokShop.SkuCheckStatusProhibit || mainOrderDetail.CheckStatus == tiktokShop.SkuCheckStatusNotPass {
|
|
|
|
|
// 更新主商品,在同步到子门店,考虑审核时间
|
|
|
|
|
param, failedList2 := makeMainProductSku(db, api, storeSku, storeDetail, storeID, vendorStoreID, syncType)
|
|
|
|
|
if len(failedList2) != 0 {
|
|
|
|
|
failedList = append(failedList, failedList2...)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
updateParam := &product_editV2_request.ProductEditV2Param{
|
|
|
|
|
PayType: tiktokShop.TiktokPayType1,
|
|
|
|
|
ReduceType: tiktokShop.SkuReduceTypePayMakeOrder,
|
|
|
|
|
Weight: utils.Int2Float64(storeSku.Weight),
|
|
|
|
|
DeliveryDelayDay: tiktokShop.DeliveryDelayDayToDay,
|
|
|
|
|
PresellType: tiktokShop.SendGoodsTypeNow,
|
|
|
|
|
Mobile: storeDetail.Tel1,
|
|
|
|
|
Commit: true,
|
|
|
|
|
Specs: "重量|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit,
|
|
|
|
|
NeedRechargeMode: false,
|
|
|
|
|
SellChannel: []int64{0},
|
|
|
|
|
StartSaleType: 0,
|
|
|
|
|
PickupMethod: "0",
|
|
|
|
|
CategoryLeafId: param.CategoryLeafId,
|
|
|
|
|
Name: param.Name,
|
|
|
|
|
ProductFormatNew: param.ProductFormatNew,
|
|
|
|
|
}
|
|
|
|
|
// 是否支持七天无理由
|
|
|
|
|
isAfterSale, rule := api.GetProductUpdateRule(param.CategoryLeafId)
|
|
|
|
|
if isAfterSale {
|
|
|
|
|
param.AfterSaleService = map[string]string{"supply_day_return_selector": fmt.Sprintf("%s", rule)}
|
|
|
|
|
}
|
|
|
|
|
updateParam.Pic = param.Pic
|
|
|
|
|
updateParam.Description = param.Description
|
|
|
|
|
updateParam.WeightUnit = tiktokShop.WeightUint_G
|
|
|
|
|
|
|
|
|
|
updateParam.ProductId = mainOrderDetail.ProductId
|
|
|
|
|
updateParam.MainProductId = mainProductId
|
|
|
|
|
updateParam.SpecPrices = param.SpecPrices
|
|
|
|
|
updateParam.StandardBrandId = param.StandardBrandId
|
|
|
|
|
if err2 := api.EditStoreCommodity(updateParam); err2 != nil {
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, err2, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID)
|
|
|
|
|
}
|
|
|
|
|
storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("修改主品,主品审核中/失败,子商品未创建"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
updateParam := &product_editV2_request.ProductEditV2Param{
|
|
|
|
|
PayType: tiktokShop.TiktokPayType1,
|
|
|
|
|
ReduceType: tiktokShop.SkuReduceTypePayMakeOrder,
|
|
|
|
|
Weight: utils.Int2Float64(storeSku.Weight),
|
|
|
|
|
DeliveryDelayDay: tiktokShop.DeliveryDelayDayToDay,
|
|
|
|
|
PresellType: tiktokShop.SendGoodsTypeNow,
|
|
|
|
|
Mobile: storeDetail.Tel1,
|
|
|
|
|
Commit: true,
|
|
|
|
|
Specs: "重量|" + utils.Float64ToStr(float64(storeSku.SpecQuality)) + storeSku.SpecUnit,
|
|
|
|
|
NeedRechargeMode: false,
|
|
|
|
|
SellChannel: []int64{0},
|
|
|
|
|
StartSaleType: 0,
|
|
|
|
|
PickupMethod: "0",
|
|
|
|
|
CategoryLeafId: param.CategoryLeafId,
|
|
|
|
|
Name: param.Name,
|
|
|
|
|
ProductFormatNew: param.ProductFormatNew,
|
|
|
|
|
}
|
|
|
|
|
// 是否支持七天无理由
|
|
|
|
|
isAfterSale, rule := api.GetProductUpdateRule(param.CategoryLeafId)
|
|
|
|
|
if isAfterSale {
|
|
|
|
|
param.AfterSaleService = map[string]string{"supply_day_return_selector": fmt.Sprintf("%s", rule)}
|
|
|
|
|
}
|
|
|
|
|
updateParam.Pic = param.Pic
|
|
|
|
|
updateParam.Description = param.Description
|
|
|
|
|
updateParam.WeightUnit = tiktokShop.WeightUint_G
|
|
|
|
|
|
|
|
|
|
updateParam.ProductId = mainOrderDetail.ProductId
|
|
|
|
|
updateParam.MainProductId = mainProductId
|
|
|
|
|
updateParam.SpecPrices = param.SpecPrices
|
|
|
|
|
updateParam.StandardBrandId = param.StandardBrandId
|
|
|
|
|
if err2 := api.EditStoreCommodity(updateParam); err2 != nil {
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, err2, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID)
|
|
|
|
|
}
|
|
|
|
|
storeSku.SkuSyncStatus = model.SyncFlagNewMask // 只创建主品,子品都没做
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSku, errors.New("修改主品,主品审核中/失败,子商品未创建"), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if sonSkuId != "" {
|
|
|
|
|
storeSku.VendorSonSkuID = sonSkuId
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err != nil && strings.Contains(err.Error(), "2010001") { // 2010001:重复创建渠道商品
|
|
|
|
|
storeSkuDetail, err := api.GetSkuDetailLocalID(vendorStoreID, utils.Int2Str(storeSku.SkuID))
|
|
|
|
|
if err != nil {
|
|
|
|
|
failedList3 := putils.GetErrMsg2FailedSingleList(storeSku, errors.New("获取子品详情错误:"+err.Error()), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
failedList = append(failedList, failedList3...)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
storeSku.VendorSonSkuID = utils.Int64ToStr(storeSkuDetail.SpecPrices[0].SkuId)
|
|
|
|
|
childrenProductId = storeSkuDetail.ProductId
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if childrenProductId != model.NO {
|
|
|
|
|
// 同步价格,库存,上架
|
|
|
|
|
skuId, failedList2 := upDateChildrenPriceStockLaunch(api, storeSku, childrenProductId, vendorStoreID, syncType)
|
|
|
|
|
failedList = append(failedList, failedList2...)
|
|
|
|
|
storeSku.VendorSonSkuID = utils.Int64ToStr(skuId) // (属性id skuID方案一)(自商品的商品id方案二)
|
|
|
|
|
storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id
|
|
|
|
|
storeSku.VendorMainId = localThing[0].VendorThingID // 商品主id
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err != nil && strings.Contains(err.Error(), "2010001") { // 2010001:重复创建渠道商品
|
|
|
|
|
storeSkuDetail, err := api.GetSkuDetailLocalID(vendorStoreID, utils.Int2Str(storeSku.SkuID))
|
|
|
|
|
if err != nil {
|
|
|
|
|
failedList3 := putils.GetErrMsg2FailedSingleList(storeSku, errors.New("获取子品详情错误:"+err.Error()), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
failedList = append(failedList, failedList3...)
|
|
|
|
|
failedList4 := putils.GetErrMsg2FailedSingleList(storeSku, errors.New("创建子品异常:"+err.Error()), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
failedList = append(failedList, failedList4...)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
childrenProductId = storeSkuDetail.ProductId
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if childrenProductId != model.NO {
|
|
|
|
|
// 同步价格,库存,上架
|
|
|
|
|
skuId, failedList2 := upDateChildrenPriceStockLaunch(api, storeSku, childrenProductId, vendorStoreID, syncType)
|
|
|
|
|
failedList = append(failedList, failedList2...)
|
|
|
|
|
storeSku.VendorSonSkuID = utils.Int64ToStr(skuId) // (属性id skuID方案一)(自商品的商品id方案二)
|
|
|
|
|
storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id
|
|
|
|
|
storeSku.VendorMainId = localThing[0].VendorThingID // 商品主id
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
failedList4 := putils.GetErrMsg2FailedSingleList(storeSku, errors.New("创建子品异常:"+err.Error()), storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
failedList = append(failedList, failedList4...)
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -440,6 +456,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI
|
|
|
|
|
//param.FreightId, _ = api.GetStoreBindTemp(utils.Str2Int64(vendorStoreID))
|
|
|
|
|
param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, mainIdInt, storeSku)
|
|
|
|
|
err = api.EditStoreCommodity(param)
|
|
|
|
|
globals.SugarLogger.Debugf("-------2err := %v", err)
|
|
|
|
|
if err != nil && !strings.Contains(err.Error(), "您上传的商品主图存在重复") {
|
|
|
|
|
failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType)
|
|
|
|
|
//storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID)
|
|
|
|
|
@@ -674,6 +691,10 @@ func checkNameLenght(name string) string {
|
|
|
|
|
}
|
|
|
|
|
func upDateChildrenPriceStockLaunch(api *tiktokShop.API, storeSku *dao.StoreSkuSyncInfo, childrenProductId int64, vendorStoreID, syncType string) (skuID int64, failedList []*partner.StoreSkuInfoWithErr) {
|
|
|
|
|
skuId, failed := getProductSkuID(api, storeSku, syncType, childrenProductId)
|
|
|
|
|
if storeSku.StoreID == 669044 {
|
|
|
|
|
globals.SugarLogger.Debugf("-------skuid := %d", skuId)
|
|
|
|
|
globals.SugarLogger.Debugf("-------storeSku := %s", utils.Format4Output(storeSku, false))
|
|
|
|
|
}
|
|
|
|
|
if skuId == 0 || len(failed) > 0 {
|
|
|
|
|
return 0, failed
|
|
|
|
|
}
|
|
|
|
|
|