diff --git a/business/bidding/logistics_Loading.go b/business/bidding/logistics_Loading.go index 5f9f7fbd0..86378b1d6 100644 --- a/business/bidding/logistics_Loading.go +++ b/business/bidding/logistics_Loading.go @@ -1,6 +1,7 @@ package bidding import ( + "errors" "git.rosy.net.cn/baseapi/platformapi/ali_logistics_query" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" @@ -38,6 +39,10 @@ func LoadingLogistics(paramLogistic []*model.UpdateMaterialLogistic) []error { } // 新订单,本地暂无物流信息,全部更新远端物流信息到本地 + if len(logisticsList.Info[0].LogisticsTraceDetailList) == model.NO { + errList = append(errList, errors.New("运单号[%s]:已经过期/新订单暂无物流推送信息")) + continue + } var orderStatus = make([]*model.OrderStatus, 0, 0) goodsOrderStatus := 0 for _, v := range logisticsList.Info[0].LogisticsTraceDetailList { diff --git a/business/model/dao/thing_map.go b/business/model/dao/thing_map.go index 16e4f193c..24176ed83 100644 --- a/business/model/dao/thing_map.go +++ b/business/model/dao/thing_map.go @@ -27,15 +27,15 @@ func GetThingMapList(db *DaoDB, thingType int, vendorIDs, thingIDs []int, vendor return cats, err } -func CreateThingMap(thingId int64, vendorThingID, appOrgCode, skuAttrId string) error { +func CreateThingMap(thingId int64, vendorThingID, appOrgCode, skuAttrId string, thingType, syncStatus int8) error { thingMap := &model.ThingMap{ ThingID: thingId, - ThingType: model.ThingTypeSku, + ThingType: thingType, VendorID: model.VendorIDDD, VendorOrgCode: appOrgCode, VendorThingID: vendorThingID, Remark: skuAttrId, - SyncStatus: 0, + SyncStatus: syncStatus, } // 正常来说这个skuAttrId 不应该为空 if skuAttrId == "" { diff --git a/business/model/sync_map.go b/business/model/sync_map.go index 955e8c4c8..c8c5ef010 100644 --- a/business/model/sync_map.go +++ b/business/model/sync_map.go @@ -1,12 +1,12 @@ package model const ( - ThingTypeCategory = 1 - ThingTypeSkuName = 2 - ThingTypeSku = 3 - ThingTypeStore = 4 - ThingTypeUser = 5 - ThingTypeOrder = 6 + ThingTypeCategory = 1 // 同步分类 + ThingTypeSkuName = 2 // 同步商品名称 + ThingTypeSku = 3 // 同步商品 + ThingTypeStore = 4 // 同步门店 + ThingTypeUser = 5 // 同步用户信息 + ThingTypeOrder = 6 // 同步订单 ) type ThingMap struct { diff --git a/business/partner/purchase/jdshop/store_sku.go b/business/partner/purchase/jdshop/store_sku.go index acbe1879e..4aa6cc6dd 100644 --- a/business/partner/purchase/jdshop/store_sku.go +++ b/business/partner/purchase/jdshop/store_sku.go @@ -33,6 +33,7 @@ var ( ) func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) { + globals.SugarLogger.Debugf("是不是正儿八经的京东商城%s", "1111111111111111111111111") if globals.EnableJdShopWrite { if vendorStoreID == model.JdShopMainVendorStoreID { for _, v := range storeSkuList { diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index d1f24261d..c0bbfff7e 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -151,28 +151,20 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI PickupMethod: "0", OuterProductId: utils.Int2Str(storeSku.SkuID), // 本地skuId为外部商品id } - globals.SugarLogger.Debugf("=======================1") - globals.SugarLogger.Debugf("=======================param %s", utils.Format4Output(param, false)) if len(param.Name) < 23 { // 中文字符一个汉字三个长度符号/数字/字母两个长度,商品名称不能大于 - param.Name += utils.Float64ToStr(float64(storeSku.SpecQuality)) + "/" + storeSku.SpecUnit - if len(param.Name) < 23 { - param.Name += "【惊喜到家】" - } + param.Name += "【惊喜到家】" } else if len(param.Name) > 90 { // 抖音最大60个字符,三十个汉字 param.Name = param.Name[0:90] } // 获取上传图,商品轮播图 img, detailImg, err := GetTiktokImgList(api, utils.Int2Str(storeSku.StoreID), storeDetail.VendorOrgCode, storeSku.DescImg, storeSku.ImgOrigin, storeSku.Img2, storeSku.Img3, storeSku.Img4, storeSku.Img5) - globals.SugarLogger.Debugf("=======================img %s", img) - globals.SugarLogger.Debugf("=======================detailImg %s", detailImg) if err != nil { failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) continue } param.Pic = img param.Description = detailImg - globals.SugarLogger.Debugf("=======================2") // 部分商品没有所属的分类,直接跳过! if storeSku.SkuVendorMapCatID != "" { @@ -180,7 +172,6 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else if len(param.Pic) != 0 { // 自动推导分类id param.CategoryLeafId = api.GetRecommendCategory(strings.Split(img, "|")) } - globals.SugarLogger.Debugf("=======================3") // 这个情况是原有商品不存在和推荐查询不到类目id是,使用京西类目和抖音类目的绑定关系 // 但是不太实用,导致商品类目错误被暂停营业等 //if storeSku.VendorVendorCatID != 0 && param.CategoryLeafId == 0 { @@ -196,7 +187,6 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else { param.Supply7dayReturn = 0 } - globals.SugarLogger.Debugf("=======================4") // weight_unit 目前抖音只支持g和kg两种 param.WeightUnit = tiktokShop.WeightUint_G @@ -215,138 +205,92 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI continue } } - param.StandardBrandId = 789194134 // 默认品牌京西菜市 596120136 - globals.SugarLogger.Debugf("=======================5") - - temp, err := dao.QueryStoreBindInfo(storeDetail.Store.ID) - if err != nil || temp == nil || temp.ID == 0 { - // 运费模板 - param.FreightId, err = GetDeliveryTemp(api, vendorStoreID, storeDetail) - if err != nil { - return nil, err - } - // 获取门店限售模板 - param.SaleLimitId, err = CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) - if err != nil { - return nil, err - } - // 保存数据库 - freightTemplate := &model.FreightTemplate{ - StoreID: storeSku.StoreID, - VendorStoreID: storeDetail.VendorStoreID, - TemplateID: param.FreightId, - WarehouseID: 0, - FenceID: "", - TradeLimitID: param.SaleLimitId, - } - err = dao.CreateEntity(db, freightTemplate) - } else { - if temp.TemplateID != 0 { - param.FreightId = temp.TemplateID - } else { - // 运费模板 - param.FreightId, err = GetDeliveryTemp(api, vendorStoreID, storeDetail) - if err != nil { - return nil, err - } - temp.TemplateID = param.FreightId - _, err = dao.UpdateEntity(db, temp, "TemplateID") - dao.FreightTemplateMap[temp.StoreID] = temp - } - if temp.TradeLimitID != 0 { - param.SaleLimitId = temp.TradeLimitID - } else { - // 获取门店限售模板 - param.SaleLimitId, err = CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) - if err != nil { - return nil, err - } - temp.TradeLimitID = param.SaleLimitId - _, err = dao.UpdateEntity(db, temp, "TradeLimitID") - dao.FreightTemplateMap[temp.StoreID] = temp - } + param.FreightId, param.SaleLimitId, err = getFreightIdAndSaleLimitId(api, db, storeDetail, vendorStoreID) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + continue } - globals.SugarLogger.Debugf("=======================6") // 根据本地商品id获取线上商品是否存在,存在则只创建子商品 - var tiktokResultProductId int64 = 0 // 获取本地存储映射关系,获取本地主商品id是否存在 localThing, err := dao.GetThingToTiktokMapList(db, model.VendorIDDD, int64(storeSku.SkuID)) if len(localThing) == 0 { - // 看看本地保存了没,没有的话可能该商品没创建主商品!查查线上有没有 mainOrderDetail, err := api.GetSkuDetailLocalID("", utils.Int2Str(storeSku.SkuID)) if err != nil || mainOrderDetail == nil || mainOrderDetail.ProductIdStr == "" { - tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品 + tiktokResult, err := api.CreateStoreCommodity(param) // 创建主商品,同步主商品 if err != nil { + if err := dao.CreateThingMap(int64(storeSku.SkuID), utils.Int64ToStr(tiktokResult.ProductId), storeDetail.VendorOrgCode, storeSku.VendorSkuAttrId, model.ThingTypeSku, model.SyncFlagNewMask); err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + } failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) continue } - tiktokResultProductId = tiktokResult.ProductId var attrId []string for _, v := range tiktokResult.Sku { attrId = append(attrId, utils.Int64ToStr(v.SkuId)) } - storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID - err = dao.CreateThingMap(int64(storeSku.SkuID), utils.Int64ToStr(tiktokResult.ProductId), storeDetail.VendorOrgCode, storeSku.VendorSkuAttrId) + storeSku.VendorMainId = mainOrderDetail.ProductIdStr + storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID + storeSku.VendorSonSkuID = utils.Int2Str(storeSku.SkuID) // 还没同步子商品 } else { + // 本地不存在,线上存在.直接创建子商品保存本地同步记录 + var childrenProductId int64 = 0 + var syncStatus int8 = 0 + if mainOrderDetail.CheckStatus == 3 { + childrenProductId, err = api.CreateSubProduct(mainOrderDetail.MainProductId, utils.Str2Int64(vendorStoreID)) + if err != nil { + syncStatus = model.SyncFlagNewMask + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + if storeSku.VendorSkuID == "" { + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + } + } + } + + if err := dao.CreateThingMap(int64(storeSku.SkuID), mainOrderDetail.ProductIdStr, storeDetail.VendorOrgCode+"|"+vendorStoreID, storeSku.VendorSkuAttrId, model.ThingTypeSku, syncStatus); err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + if storeSku.VendorSkuID == "" { + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + } + } storeSku.VendorMainId = mainOrderDetail.ProductIdStr var attrId []string for _, v := range mainOrderDetail.SpecPrices { attrId = append(attrId, utils.Int64ToStr(v.SkuId)) } - storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID - tiktokResultProductId = mainOrderDetail.ProductId + storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID + storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // (属性id skuID方案一)(自商品的商品id方案二) + storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id } } else { - storeSku.VendorMainId = localThing[0].VendorThingID - storeSku.VendorSkuAttrId = localThing[0].Remark // 属性id skuID - tiktokResultProductId = utils.Str2Int64(localThing[0].VendorThingID) - } - param.MainProductId = tiktokResultProductId + if localThing[0].SyncStatus != model.NO { - // 上面说明要么已经创建了主商品,要么已经重新创建了主商品,将该商品同步到子门店就可以了. - childrenProductId, err := api.CreateSubProduct(param.MainProductId, utils.Str2Int64(vendorStoreID)) - if err != nil { - failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - if storeSku.VendorSkuID == "" { - storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) } - continue + // 主商品存在,直接同步子商品 + childrenProductId, err := api.CreateSubProduct(utils.Str2Int64(localThing[0].VendorThingID), utils.Str2Int64(vendorStoreID)) + if err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + if storeSku.VendorSkuID == "" { + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + } + continue + } + storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // (属性id skuID方案一)(自商品的商品id方案二) + storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id + storeSku.VendorMainId = localThing[0].VendorThingID // 商品主id } - storeSku.VendorSonSkuID = utils.Int64ToStr(childrenProductId) // 属性id skuID(自商品的商品id) - storeSku.VendorSkuID = utils.Int64ToStr(childrenProductId) // 子商品主id - storeSku.VendorMainId = utils.Int64ToStr(tiktokResultProductId) // 商品主id - //param.MainProductId = tiktokResultProductId - //param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, tiktokResultProductId, storeSku) - // - //param.StoreId = utils.Str2Int64(vendorStoreID) - //// 抖店创建子商品 - //tiktokResultChildren, err := api.CreateStoreCommodity(param) - //if err != nil { - // failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - // if storeSku.VendorSkuID == "" { - // storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - // } - // continue - //} - //var attrId2 []string - //for _, v := range tiktokResultChildren.Sku { - // attrId2 = append(attrId2, utils.Int64ToStr(v.SkuId)) - //} - //storeSku.VendorSonSkuID = strings.Join(attrId2, ",") // 属性id skuID(子商品的属性id) - //storeSku.VendorSkuID = utils.Int64ToStr(tiktokResultChildren.ProductId) // 子商品主id - //storeSku.VendorMainId = utils.Int64ToStr(tiktokResultProductId) // 商品主id } } else { syncType = "更新商品" for _, storeSku := range storeSkuList { - if storeSku.StoreSkuStatus != 1 { // 未可售的商品不参与修改 + if storeSku.StoreSkuStatus != model.YES { // 未可售的商品不参与修改 continue } - // 更新商品(目前只更新子商品,主商品暂不支持) + + // 更新主商品,在同步到子门店,考虑审核时间 param := &product_editV2_request.ProductEditV2Param{ Name: utils.LimitUTF8StringLen(storeSku.SkuName, 90), PayType: tiktokShop.TiktokPayType1, @@ -370,10 +314,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } if len(param.Name) < 23 { // 中文字符一个汉字三个长度符号/数字/字母两个长度,商品名称不能大于 - param.Name += utils.Float64ToStr(float64(storeSku.SpecQuality)) + "/" + storeSku.SpecUnit - if len(param.Name) < 23 { - param.Name += "【惊喜到家】" - } + param.Name += "【惊喜到家】" } else if len(param.Name) > 90 { // 抖音最大60个字符,三十个汉字 param.Name = param.Name[0:90] } @@ -386,16 +327,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } param.Pic = img param.Description = detailImg - - // 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 - //} - //param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, 0, storeSku) // 获取商品的属性 if storeSku.TiktokAttribute == "" || storeSku.TiktokAttribute == "{}" { param.ProductFormatNew, err = MakeProductFormatNew(api, int64(storeSku.NameID), param.CategoryLeafId) @@ -406,19 +339,10 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } else { param.ProductFormatNew = storeSku.TiktokAttribute } - // 获取品牌 param.StandardBrandId = 789194134 // 默认品牌京西菜市 - //tiktokResult, err := api.EditStoreCommodity(param) // 创建主商品 - //if err != nil { - // failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) - // storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - // continue - //} - // 修改商品 - //param.FreightId = freightId param.ProductId = utils.Str2Int64(storeSku.VendorMainId) param.MainProductId = utils.Str2Int64(storeSku.VendorMainId) param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, param.MainProductId, storeSku) @@ -441,6 +365,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI continue } + // 主商品修改之后需要审核,审核通过之后在分配 if _, err := api.BatchRedistributeStoreProduct(&superm_product_batchRedistributeStoreProduct_request.TaskParams{ MainProductId: param.MainProductId, AddStoreIds: []int64{param.StoreId}, @@ -448,13 +373,13 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI }); err != nil { failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) - continue + if err := dao.CreateThingMap(int64(storeSku.SkuID), storeSku.VendorMainId, storeDetail.VendorOrgCode+"|"+vendorStoreID, storeSku.VendorSkuAttrId, model.ThingTypeSku, model.SyncFlagNewMask); err != nil { + failedList = putils.GetErrMsg2FailedSingleList(storeSkuList, err, storeID, model.VendorChineseNames[model.VendorIDDD], syncType) + if storeSku.VendorSkuID == "" { + storeSku.VendorSkuID = utils.Int2Str(storeSku.SkuID) + } + } } - //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 @@ -466,6 +391,64 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI return failedList, err } +func createChildrenProduct() { + +} + +func getFreightIdAndSaleLimitId(api *tiktokShop.API, db *dao.DaoDB, storeDetail *dao.StoreDetail, vendorStoreID string) (freightId, saleLimitId int64, err error) { + temp, err := dao.QueryStoreBindInfo(storeDetail.Store.ID) + if err != nil || temp == nil || temp.ID == 0 { + // 运费模板 + freightId, err = GetDeliveryTemp(api, vendorStoreID, storeDetail) + if err != nil { + return 0, 0, err + } + // 获取门店限售模板 + saleLimitId, err = CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) + if err != nil { + return 0, 0, err + } + // 保存数据库 + freightTemplate := &model.FreightTemplate{ + StoreID: storeDetail.Store.ID, + VendorStoreID: storeDetail.VendorStoreID, + TemplateID: freightId, + WarehouseID: 0, + FenceID: "", + TradeLimitID: saleLimitId, + } + err = dao.CreateEntity(db, freightTemplate) + } else { + if temp.TemplateID != 0 { + freightId = temp.TemplateID + } else { + // 运费模板 + freightId, err = GetDeliveryTemp(api, vendorStoreID, storeDetail) + if err != nil { + return 0, 0, err + } + temp.TemplateID = freightId + _, err = dao.UpdateEntity(db, temp, "TemplateID") + dao.FreightTemplateMap[temp.StoreID] = temp + } + + if temp.TradeLimitID != 0 { + saleLimitId = temp.TradeLimitID + } else { + // 获取门店限售模板 + saleLimitId, err = CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) + if err != nil { + return 0, 0, err + } + temp.TradeLimitID = saleLimitId + _, err = dao.UpdateEntity(db, temp, "TradeLimitID") + dao.FreightTemplateMap[temp.StoreID] = temp + } + } + + return freightId, saleLimitId, nil +} + // CreateSaleTemp 创建限售模板 func CreateSaleTemp(storeId int64, api *tiktokShop.API) (int64, error) { // 获取限售模板