From c267776ab0cdf8a58bb8c59d4c59ecab6108f5e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Tue, 11 Oct 2022 16:32:20 +0800 Subject: [PATCH] 1 --- business/jxstore/cms/store_sku.go | 1 + .../partner/purchase/tiktok_store/order.go | 60 +++++++++++--- .../purchase/tiktok_store/store_sku2.go | 82 ++++++++----------- .../purchase/tiktok_store/store_sku2_utils.go | 40 +++++++++ controllers/tiktok_order.go | 4 +- 5 files changed, 123 insertions(+), 64 deletions(-) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 9a9145fc0..4406589f2 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -3195,6 +3195,7 @@ func setStoreSkuBindStatus(skuBind *model.StoreSkuBind, status int8) { skuBind.MtwmSyncStatus |= status skuBind.YbSyncStatus |= status skuBind.JdsSyncStatus |= status + skuBind.DdSyncStatus |= status } func checkStoreExisting(db *dao.DaoDB, storeID int) (store *model.Store, err error) { diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index 8438a9aba..dedfcb906 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -322,7 +322,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac //orderStatus.Status = vendorStatusToLocalStatus(orderMsg.OrderStatus) //orderStatus.Remark = "100-新订单回调" case tiktokShop.CallbackPayOrderMsgTagId: - orderMsg := msg.(*tiktokShop.PayOrderData) + orderMsg := tiktokShop.PayOrderData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = utils.Int64ToStr(orderMsg.PId) orderStatus.VendorStatus = utils.Int64ToStr(orderMsg.OrderStatus) orderStatus.StatusTime = utils.Timestamp2Time(orderMsg.PayTime) @@ -338,7 +341,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac //orderStatus.Status = vendorStatusToLocalStatus(orderMsg.OrderStatus) //orderStatus.Remark = "110-订单支付待处理:风控" case tiktokShop.CallbackPartGoodsMsgTagId: - orderMsg := msg.(*tiktokShop.SomeSendOrderData) + orderMsg := tiktokShop.SomeSendOrderData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = utils.Int64ToStr(orderMsg.PId) orderStatus.VendorStatus = utils.Int64ToStr(orderMsg.OrderStatus) orderStatus.StatusTime = utils.Timestamp2Time(orderMsg.UpdateTime) @@ -346,7 +352,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Remark = "108-卖家部分发货" shopId = orderMsg.ShopId case tiktokShop.CallbackPartAllGoodsMsgTagId: - orderMsg := msg.(*tiktokShop.BusinessDeliveryData) + orderMsg := tiktokShop.BusinessDeliveryData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = utils.Int64ToStr(orderMsg.PId) orderStatus.VendorStatus = utils.Int64ToStr(orderMsg.OrderStatus) orderStatus.StatusTime = utils.Timestamp2Time(orderMsg.UpdateTime) @@ -354,7 +363,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Remark = "102-卖家发货完成" shopId = orderMsg.ShopId case tiktokShop.CallbackCancelOrderMsgTagId: - orderMsg := msg.(*tiktokShop.CancelOrderData) + orderMsg := tiktokShop.CancelOrderData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = utils.Int64ToStr(orderMsg.PId) orderStatus.VendorStatus = utils.Int64ToStr(orderMsg.OrderStatus) orderStatus.StatusTime = utils.Timestamp2Time(orderMsg.CancelTime) @@ -362,7 +374,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Remark = "106-取消订单" shopId = orderMsg.ShopId case tiktokShop.CallbackSuccessOrderMsgTagId: - orderMsg := msg.(*tiktokShop.SuccessOrderData) + orderMsg := tiktokShop.SuccessOrderData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = utils.Int64ToStr(orderMsg.PId) orderStatus.VendorStatus = utils.Int64ToStr(orderMsg.OrderStatus) orderStatus.StatusTime = utils.Timestamp2Time(orderMsg.CompleteTime) @@ -370,7 +385,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Remark = "103-确认收货" shopId = orderMsg.ShopId case tiktokShop.CallbackWayBillChangeOrderMsgTagId: - orderMsg := msg.(*tiktokShop.WayBillChangeData) + orderMsg := tiktokShop.WayBillChangeData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = utils.Int64ToStr(orderMsg.PId) orderStatus.VendorStatus = utils.Int64ToStr(orderMsg.OrderStatus) orderStatus.StatusTime = utils.Timestamp2Time(orderMsg.UpdateTime) @@ -378,7 +396,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Remark = "104-物流消息变更" shopId = orderMsg.ShopId case tiktokShop.CallbackReceivingChangeOrderMsgTagId: - orderMsg := msg.(*tiktokShop.ReceivingAddressChangeData) + orderMsg := tiktokShop.ReceivingAddressChangeData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = utils.Int64ToStr(orderMsg.PId) orderStatus.VendorStatus = utils.Int64ToStr(orderMsg.OrderStatus) orderStatus.StatusTime = utils.Timestamp2Time(orderMsg.UpdateTime) @@ -386,7 +407,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Remark = "105-收货地址变更" shopId = orderMsg.ShopId case tiktokShop.CallbackChangeMoneyMsgTagId: - orderMsg := msg.(*tiktokShop.UpdateAmountChangeData) + orderMsg := tiktokShop.UpdateAmountChangeData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = utils.Int64ToStr(orderMsg.PId) orderStatus.VendorStatus = utils.Int64ToStr(orderMsg.OrderStatus) orderStatus.StatusTime = utils.Timestamp2Time(orderMsg.ModifyTime) @@ -394,7 +418,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Remark = "109-卖家修改订单/运单金额" shopId = orderMsg.ShopId case tiktokShop.CallbackApplyUpdateAddressMsgTagId: - orderMsg := msg.(*tiktokShop.BuyerUpdateWayBillData) + orderMsg := tiktokShop.BuyerUpdateWayBillData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = utils.Int64ToStr(orderMsg.PId) orderStatus.VendorStatus = utils.Int64ToStr(tiktokShop.CreateOrderStatusStockUp) orderStatus.StatusTime = time.Now() @@ -402,7 +429,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Remark = "111-买家收货消息变更" shopId = orderMsg.ShopId case tiktokShop.CallbackBusinessRemarkMsgTagId: - orderMsg := msg.(*tiktokShop.BusinessUpdateRemakeData) + orderMsg := tiktokShop.BusinessUpdateRemakeData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = utils.Int64ToStr(orderMsg.PId) orderStatus.VendorStatus = utils.Int64ToStr(tiktokShop.CreateOrderStatusStockUp) orderStatus.StatusTime = utils.Timestamp2Time(orderMsg.UpdateTime) @@ -410,7 +440,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Remark = "113-添加备注:" + orderMsg.Remark shopId = orderMsg.ShopId case tiktokShop.CallbackSendOrderTimeChangeMsgTagId: - orderMsg := msg.(*tiktokShop.AppointmentChangeData) + orderMsg := tiktokShop.AppointmentChangeData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = orderMsg.PId orderStatus.VendorStatus = utils.Int64ToStr(tiktokShop.CreateOrderStatusStockUp) orderStatus.StatusTime = time.Now() @@ -418,7 +451,10 @@ func (c *PurchaseHandler) callbackMsg2Status(msgId, orderId string, msg interfac orderStatus.Remark = "126-预约发货:" shopId = orderMsg.ShopId case fakeFinishedPickup: // 应为需要同步京东,美团拣货功能制作的假拣货,抖音不存在拣货 - orderMsg := msg.(*tiktokShop.FakePickUpGoodsData) + orderMsg := tiktokShop.FakePickUpGoodsData{} + if err := utils.Map2StructByJson(msg, &orderMsg, false); err != nil { + return nil, 0 + } orderStatus.VendorOrderID = orderMsg.PId orderStatus.VendorStatus = fakeFinishedPickup orderStatus.StatusTime = time.Now() diff --git a/business/partner/purchase/tiktok_store/store_sku2.go b/business/partner/purchase/tiktok_store/store_sku2.go index 8c49396b5..b06f7a6a6 100644 --- a/business/partner/purchase/tiktok_store/store_sku2.go +++ b/business/partner/purchase/tiktok_store/store_sku2.go @@ -4,12 +4,10 @@ import ( "errors" "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" product_editV2_commit_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_editV2_commit/request" - shop_bindStoreFreight_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_bindStoreFreight/request" shop_bindStoreSaleLimit_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_bindStoreSaleLimit/request" sku_editPrice_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_editPrice/request" sku_syncStock_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_syncStock/request" @@ -24,7 +22,6 @@ 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" "strings" ) @@ -260,43 +257,14 @@ func (p *PurchaseHandler) CreateStoreSkus(ctx *jxcontext.Context, storeID int, v // 对于多门店平台来说,storeSkuList中只有SkuID与VendorSkuID有意义 // 抖店的商品只管创建,创建接口会返回成功,但是审核的时候不一定成功.当前系统无法判定此商品是否已经创建过了! func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeID int, vendorStoreID string, storeSkuList []*dao.StoreSkuSyncInfo, isCreate bool) (failedList []*partner.StoreSkuInfoWithErr, err error) { - globals.SugarLogger.Debug("==============vendorStoreID", vendorStoreID) var syncType string storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), storeID, model.VendorIDDD, "") api := getAPI(storeDetail.VendorOrgCode, storeID, vendorStoreID) - 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.SkuVendorMapCatID), Name: storeSku.Name, @@ -313,6 +281,7 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI SellChannel: []int64{0}, StartSaleType: 0, PickupMethod: "0", + OuterProductId: utils.Int2Str(storeSku.SkuID), // 本地skuId为外部商品id } // param.AccountTemplateId = "" // 获取上传图,商品轮播图 @@ -349,24 +318,40 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI globals.SugarLogger.Debug("创建=============param", utils.Format4Output(param, false)) // 获取品牌 - brandID, err := api.GetSkuBrand(param.CategoryLeafId) + param.StandardBrandId, err = api.GetSkuBrand(param.CategoryLeafId) if err != nil { return nil, err } - param.StandardBrandId = brandID - 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) - continue + // 根据本地商品id获取线上商品是否存在,存在则只创建子商品 + var tiktokResultProductId int64 = 0 + if storeSku.VendorMainId == "" { // 线上不存在创建 + 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) + continue + } + globals.SugarLogger.Debugf("tiktokResult main ===%s", utils.Format4Output(tiktokResult, false)) + 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 + } else { + tiktokResultProductId = utils.Str2Int64(storeSku.VendorMainId) } - globals.SugarLogger.Debugf("tiktokResult main ===%s", utils.Format4Output(tiktokResult, false)) // 创建子商品 + freightId, err := GetDeliveryTemp(api, vendorStoreID, storeDetail) // 运费模板 + if err != nil { + return nil, err + } param.FreightId = freightId - param.MainProductId = tiktokResult.ProductId - param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, tiktokResult.ProductId, storeSku) + param.MainProductId = tiktokResultProductId + param.SpecPrices = GetSpecPrices(param.Specs, vendorStoreID, tiktokResultProductId, storeSku) + // 获取门店限售模板 saleLimitId, err := CreateSaleTemp(utils.Str2Int64(vendorStoreID), api) globals.SugarLogger.Debug("==22213123131231231", saleLimitId) @@ -375,7 +360,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI } param.SaleLimitId = saleLimitId param.StoreId = utils.Str2Int64(vendorStoreID) - // 抖店创建商品 + + // 抖店创建子商品 globals.SugarLogger.Debugf("zishangping=============%s", utils.Format4Output(param, false)) tiktokResultChildren, err := api.CreateStoreCommodity(param) if err != nil { @@ -384,12 +370,8 @@ func (p *PurchaseHandler) createOrUpdateStoreSkus(ctx *jxcontext.Context, storeI continue } storeSku.VendorSkuID = utils.Int64ToStr(tiktokResultChildren.ProductId) // 子商品主id - storeSku.VendorMainId = utils.Int64ToStr(tiktokResult.ProductId) // 商品主id - var attrId []string - for _, v := range tiktokResult.Sku { - attrId = append(attrId, utils.Int64ToStr(v.SkuId)) - } - storeSku.VendorSkuAttrId = strings.Join(attrId, ",") // 属性id skuID + storeSku.VendorMainId = utils.Int64ToStr(tiktokResultProductId) // 商品主id + } } else { syncType = "更新商品" diff --git a/business/partner/purchase/tiktok_store/store_sku2_utils.go b/business/partner/purchase/tiktok_store/store_sku2_utils.go index 08fba19b9..7d98bcebc 100644 --- a/business/partner/purchase/tiktok_store/store_sku2_utils.go +++ b/business/partner/purchase/tiktok_store/store_sku2_utils.go @@ -4,14 +4,54 @@ import ( "encoding/json" "errors" "fmt" + freightTemplate_create_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/freightTemplate_create/request" + shop_bindStoreFreight_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/shop_bindStoreFreight/request" 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" + "math/rand" "strings" ) +// 获取运费模板id,运费模板不存在则创建 +func GetDeliveryTemp(api *tiktokShop.API, vendorStoreID string, storeDetail *dao.StoreDetail) (int64, error) { + // todo 获取本地数据模板 + + // 没有模板是查询线上模板 + 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(storeDetail.ID))) + "_系统模板", + 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 0, err + } + // 绑定门店运费模板 + err = api.BindFreightTemplate(&shop_bindStoreFreight_request.ShopBindStoreFreightParam{ + StoreId: utils.Str2Int64(vendorStoreID), + FreightId: temp.TemplateId, + }) + if err != nil { + return 0, err + } + freightId = temp.TemplateId + } + + return freightId, nil +} + // GetProductFormatNew 获取物品属性 func GetProductFormatNew(categoryLeftId int64, vendorOrgCode string) (string, error) { category, err := getAPI(vendorOrgCode, 0, "").GetCatePropertyV2(categoryLeftId) diff --git a/controllers/tiktok_order.go b/controllers/tiktok_order.go index d3bad5450..321c7a0a2 100644 --- a/controllers/tiktok_order.go +++ b/controllers/tiktok_order.go @@ -20,7 +20,7 @@ func (t *TiktokController) CallbackTiktokOrderMsg() { // return //} // 1.防伪校验 - resp := api.TiktokStore.EventSignChange(t.Ctx.Request) + resp, byteList := api.TiktokStore.EventSignChange(t.Ctx.Request) if resp.Code != 0 { t.Data["json"] = resp t.ServeJSON() @@ -28,7 +28,7 @@ func (t *TiktokController) CallbackTiktokOrderMsg() { } // 2.参数解析 - orderStatus, resp := api.TiktokStore.CreateOrderCallback(t.Ctx.Request) + orderStatus, resp := api.TiktokStore.CreateOrderCallback(byteList) globals.SugarLogger.Debug("抖音订单回调数据打印测试===========", orderStatus) if resp.Code != 0 { t.Data["json"] = resp