From ed9aa6ce5eaafb3e942772b5acdc910da6f9bf38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E5=AE=97=E6=A5=A0?= Date: Tue, 26 Mar 2024 18:10:09 +0800 Subject: [PATCH] 1 --- business/enterprise/vendor_sku_compare.go | 307 ++++++++++++++++++++++ business/jxstore/cms/store.go | 5 + 2 files changed, 312 insertions(+) create mode 100644 business/enterprise/vendor_sku_compare.go diff --git a/business/enterprise/vendor_sku_compare.go b/business/enterprise/vendor_sku_compare.go new file mode 100644 index 000000000..705909c16 --- /dev/null +++ b/business/enterprise/vendor_sku_compare.go @@ -0,0 +1,307 @@ +package enterprise + +// +//import ( +// "fmt" +// "git.rosy.net.cn/baseapi/platformapi/ebaiapi" +// "git.rosy.net.cn/baseapi/platformapi/mtwmapi" +// tao "git.rosy.net.cn/baseapi/platformapi/tao_vegetable" +// domain585 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability585/domain" +// request585 "git.rosy.net.cn/baseapi/platformapi/tao_vegetable/sdk/ability585/request" +// product_listV2_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_listV2/request" +// product_listV2_response "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/product_listV2/response" +// "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/tiktok_api" +// "git.rosy.net.cn/baseapi/utils" +// "git.rosy.net.cn/jx-callback/business/jxstore/cms" +// "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/dao" +// "git.rosy.net.cn/jx-callback/globals" +// "git.rosy.net.cn/jx-callback/globals/api/apimanager" +// "strings" +//) +// +//// 该函数主要用于对比京西平台商品和各个平台门店商品的差异 +//// 对比上下架状态以及商品价格差异,相同的不做修改,不同的以京西系统商品为主 +// +//func CompareJxVendorSku(jxStoreId int) error { +// var ( +// db = dao.GetDB() +// errListToStr = new(strings.Builder) +// ) +// skuList, err := dao.GetStoresSkusInfo(db, []int{jxStoreId}, nil) +// if err != nil { +// return err +// } +// +// // 门店商品列表平 +// skuMap := make(map[string]*model.StoreSkuBind, 0) +// skuIdList := make([]string, 0, len(skuList)) +// for _, v := range skuList { +// localSkuId := utils.Int2Str(v.SkuID) +// skuMap[localSkuId] = v +// skuIdList = append(skuIdList, localSkuId) +// } +// +// // 有效的三方平台 +// storeMap, err := dao.GetStoresMapList(db, nil, []int{jxStoreId}, []int{model.StoreStatusOpened, model.StoreStatusClosed, model.StoreStatusHaveRest}, model.StoreStatusDisabled, 1, "", "", "") +// if err != nil { +// return err +// } +// +// for _, sm := range storeMap { +// switch sm.VendorID { +// case model.VendorIDJD: +// case model.VendorIDMTWM: +// if errs := MtWmSyncSkuPriceAndStatus(db, sm, skuMap); errs != nil { +// errListToStr.WriteString(errs.Error()) +// } +// continue +// case model.VendorIDEBAI: +// if errs := EBaiSyncSkuPriceAndStatus(db, sm, skuMap); errs != nil { +// errListToStr.WriteString(errs.Error()) +// } +// continue +// case model.VendorIDDD: +// case model.VendorIDTaoVegetable: +// if errs := TaoSyncSkuPriceAndStatus(db, sm, skuMap, skuIdList); errs != nil { +// errListToStr.WriteString(errs.Error()) +// } +// continue +// default: +// return fmt.Errorf("无法识别的平台id") +// } +// } +// +// return err +//} +// +//// MtWmSyncSkuPriceAndStatus 校验美团平台和京西系统商品差异 +//func MtWmSyncSkuPriceAndStatus(db *dao.DaoDB, sm *model.StoreMap, skuMap map[string]*model.StoreSkuBind) (err error) { +// mtApi := apimanager.CurAPIManager.GetAPI(sm.VendorID, sm.VendorOrgCode).(*mtwmapi.API) +// +// i := model.NO +// foodListData := make([]*mtwmapi.AppFood, 0, 0) +// for { +// foodList, err := mtApi.RetailListAll(sm.VendorStoreID, i) +// if err != nil { +// globals.SugarLogger.Debugf("美团商品价格和上下架状态获取平台商品异常 :%v", err) +// continue +// } +// foodListData = append(foodListData, foodList...) +// if len(foodList) < 100 { +// break +// } +// i++ +// } +// +// errs := make([]string, 0, 0) +// for _, vsl := range foodListData { +// if sku, ok := skuMap[vsl.AppFoodCode]; ok { +// // 同步商品价格 +// if utils.Float64TwoInt(vsl.Price*float64(100)) != sku.MtwmPrice { +// _, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{sm.VendorID}, []int{sku.StoreID}, false, []int{sku.SkuID}, []int{27379}, model.SyncFlagPriceMask, true, true) +// if err != nil { +// errs = append(errs, fmt.Sprintf("%v", err)) +// } +// } +// // 同步商品上下架状态 +// // SPU(可能包含多个SKU)上下架状态,字段取值范围:0-全部sku上架,1-全部sku下架。以下功能灰度中:若同时传递sku_is_sold_out,则优先根据sku_is_sold_out传参判断单个sku的上下架状态。 +// // 本地sku.Status 0-不可售, 1-可售 +// if vsl.IsSoldOut == sku.Status { +// // 平台上架本地下架,将平台商品下架 +// _, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{sm.VendorID}, []int{sku.StoreID}, false, []int{sku.SkuID}, []int{27379}, 56, true, true) +// if err != nil { +// errs = append(errs, fmt.Sprintf("%v", err)) +// } +// } +// } +// } +// if len(errs) == model.NO { +// return nil +// } +// +// return fmt.Errorf("%s", strings.Join(errs, ",")) +//} +// +//// EBaiSyncSkuPriceAndStatus 校验饿了么平台和京西系统商品差异 +//func EBaiSyncSkuPriceAndStatus(db *dao.DaoDB, sm *model.StoreMap, skuMap map[string]*model.StoreSkuBind) (err error) { +// ebaiApi := apimanager.CurAPIManager.GetAPI(sm.VendorID, sm.VendorOrgCode).(*ebaiapi.API) +// +// skuIdOffset := 0 +// foodListData := make([]*ebaiapi.SkuInfo, 0, 0) +// for { +// param := &ebaiapi.SkuListParams{ +// Page: 1, +// PageSize: 100, +// SkuIdOffset: skuIdOffset, +// } +// foodList, err := ebaiApi.SkuList(sm.VendorStoreID, param) +// if err != nil { +// globals.SugarLogger.Debugf("美团商品价格和上下架状态获取平台商品异常 :%v", err) +// continue +// } +// +// foodListData = append(foodListData, foodList.List...) +// if len(foodList.List) < 100 { +// break +// } +// skuIdOffset = foodList.SkuIdOffset +// } +// +// errs := make([]string, 0, 0) +// for _, vsl := range foodListData { +// if sku, ok := skuMap[vsl.CustomSkuId]; ok { +// // 同步商品价格 +// if vsl.SalePrice != sku.EbaiPrice { +// _, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{sm.VendorID}, []int{sku.StoreID}, false, []int{sku.SkuID}, []int{27379}, model.SyncFlagPriceMask, true, true) +// } +// // 同步商品上下架状态 +// // 1为上架,0为下架 +// // 本地sku.Status 0-不可售, 1-可售 +// if vsl.Status != utils.Int2Str(sku.Status) { +// // 平台上架本地下架,将平台商品下架 +// _, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{sm.VendorID}, []int{sku.StoreID}, false, []int{sku.SkuID}, []int{27379}, 56, true, true) +// } +// } +// } +// +// if len(errs) == model.NO { +// return nil +// } +// +// return fmt.Errorf("%s", strings.Join(errs, ",")) +//} +// +//// TaoSyncSkuPriceAndStatus 校验淘宝平台和京西系统商品差异 +//func TaoSyncSkuPriceAndStatus(db *dao.DaoDB, sm *model.StoreMap, skuMap map[string]*model.StoreSkuBind, skuIdList []string) (err error) { +// var ( +// taoApi = apimanager.CurAPIManager.GetAPI(sm.VendorID, sm.VendorOrgCode).(*tao.API) +// length = len(skuIdList) / 100 +// foodListData = make([]domain585.AlibabaWdkSkuQuerySkuDo, 0, 0) +// ) +// +// if len(skuIdList)%100 != 0 { +// length += 1 +// } +// +// // 获取平台商品列表 +// for i := 0; i < length; i++ { +// skuCods := skuIdList[i*100 : (i+1)*100] +// foodList, _ := taoApi.QueryStoreSKu(&request585.AlibabaWdkSkuQueryRequest{Param: &domain585.AlibabaWdkSkuQuerySkuQueryDo{ +// OuCode: utils.String2Pointer(sm.VendorStoreID), +// SkuCodes: &skuCods, +// }}) +// for _, fl := range *foodList { +// if *fl.Success { +// foodListData = append(foodListData, *fl.Model) +// } +// } +// } +// +// // 比较商品差异 +// errs := make([]string, 0, 0) +// for _, vsl := range foodListData { +// if sku, ok := skuMap[*vsl.SkuCode]; ok { +// // 同步商品价格 +// if utils.Float64TwoInt(utils.Str2Float64(*vsl.SalePrice)*float64(100)) != sku.TaoPrice { +// _, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{sm.VendorID}, []int{sku.StoreID}, false, []int{sku.SkuID}, []int{27379}, model.SyncFlagPriceMask, true, true) +// if err != nil { +// errs = append(errs, fmt.Sprintf("%v", err)) +// } +// } +// // 同步商品上下架状态 +// // 是否线上可售 是 0:否 1:是。 +// // 本地sku.Status 0-不可售, 1-可售 +// if int(*vsl.OnlineSaleFlag) != sku.Status { +// // 平台上架本地下架,将平台商品下架 +// _, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{sm.VendorID}, []int{sku.StoreID}, false, []int{sku.SkuID}, []int{27379}, 56, true, true) +// if err != nil { +// errs = append(errs, fmt.Sprintf("%v", err)) +// } +// } +// } +// } +// if len(errs) == model.NO { +// return nil +// } +// +// return fmt.Errorf("%s", strings.Join(errs, ",")) +//} +// +//// TiktokSyncSkuPriceAndStatus 校验抖音平台和京西系统商品差异 +//func TiktokSyncSkuPriceAndStatus(db *dao.DaoDB, sm *model.StoreMap, skuMap map[string]*model.StoreSkuBind) (err error) { +// var ( +// tiktokApi = apimanager.CurAPIManager.GetAPI(sm.VendorID, sm.VendorOrgCode).(*tiktok_api.API) +// page = 0 +// foodListData = make([]product_listV2_response.DataItem, 0, 0) +// errs = make([]string, 0, 0) +// ) +// +// for { +// param := &product_listV2_request.ProductListV2Param{ +// Page: int64(page), +// Size: 100, +// StoreId: utils.Str2Int64(sm.VendorStoreID), +// } +// foodList, err := tiktokApi.GetSkuDetailList(param) +// if err != nil { +// globals.SugarLogger.Debugf("抖音商品价格和上下架状态获取平台商品异常 :%v", err) +// continue +// } +// +// foodListData = append(foodListData, foodList.Data...) +// if len(foodList.Data) < 100 { +// break +// } +// page += 1 +// } +// +// for _, vsl := range foodListData { +// if sku, ok := skuMap[vsl.OuterProductId]; ok { +// // 同步商品价格 +// if vsl.SalePrice != sku.EbaiPrice { +// _, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{sm.VendorID}, []int{sku.StoreID}, false, []int{sku.SkuID}, []int{27379}, model.SyncFlagPriceMask, true, true) +// } +// // 同步商品上下架状态 +// // 0-在线 1-下线 +// // 本地sku.Status 0-不可售,1-可售 +// if vsl.Status == int64(sku.Status) { +// skuAndName, _ := dao.GetSkus(db, []int{sku.SkuID}, nil, nil, nil, nil) +// if len(skuAndName) != model.NO { +// globals.SugarLogger.Debugf("抖音更新商品信息获取nameId异常") +// continue +// } +// skuBindInfo := make([]*cms.StoreSkuBindInfo, 0, 0) +// skuBindInfo = append(skuBindInfo, &cms.StoreSkuBindInfo{ +// StoreID: 0, +// NameID: skuAndName[0].NameID, +// UnitPrice: 0, +// IsFocus: 0, +// IsSale: 0, +// SubStoreID: 0, +// StatusSaleBegin: nil, +// StatusSaleEnd: nil, +// UPC: "", +// MtLadderBoxPrice: 0, +// Skus: append([]*cms.StoreSkuBindSkuInfo{}, &cms.StoreSkuBindSkuInfo{ +// SkuID: sku.SkuID, +// IsSale: -1, +// Stock: nil, +// MtLadderBoxPrice: 0, +// }), +// }) +// // 平台上架本地下架,将平台商品下架 +// //_, err = cms.CurVendorSync.SyncStoresSkus2(jxcontext.AdminCtx, nil, 0, db, []int{sm.VendorID}, []int{sku.StoreID}, false, []int{sku.SkuID}, []int{27379}, 56, true, true) +// //_, err = cms.UpdateStoresSkus(jxcontext.AdminCtx, nil, 0, db, []int{sm.VendorID}, []int{sku.StoreID}, false, []int{sku.SkuID}, []int{27379}, 56, true, true) +// retVal, err = cms.UpdateStoresSkus(jxcontext.AdminCtx, 0, []int{sm.StoreID}, skuBindInfo, false, false, false, false) +// } +// } +// } +// +// if len(errs) == model.NO { +// return nil +// } +// +// return fmt.Errorf("%s", strings.Join(errs, ",")) +//} diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index bfda02443..05d6b22bc 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -6456,6 +6456,7 @@ func SingleBindTaoVegetable(ctx *jxcontext.Context, bind []TaoBindInfo, vendorOr if len(bind) == 0 { return fmt.Errorf("绑定门店数据为空,请检查"), "" } + globals.SugarLogger.Debugf("==========bind : %s", utils.Format4Output(bind, false)) for _, v := range bind { if len(v.VendorStoreID) == 0 || len(v.VendorStoreName) == 0 { errIDName = append(errIDName, v.VendorStoreID) @@ -6494,6 +6495,8 @@ func SingleBindTaoVegetable(ctx *jxcontext.Context, bind []TaoBindInfo, vendorOr } storeMaps = append(storeMaps, storeMap) } + globals.SugarLogger.Debugf("==========storeMaps : %s", utils.Format4Output(storeMaps, false)) + userName := ctx.GetUserName() for _, k := range storeMaps { dao.WrapAddIDCULDEntity(k, userName) @@ -6508,9 +6511,11 @@ func SingleBindTaoVegetable(ctx *jxcontext.Context, bind []TaoBindInfo, vendorOr } }() if err := dao.CreateEntity(db, k); err == nil { + globals.SugarLogger.Debugf("==========err1 : %v", err) errList.AddErr(fmt.Errorf("%s:%v", k.VendorStoreID, err)) dao.Commit(db, txDB) } else { + globals.SugarLogger.Debugf("==========err2 : %v", err) dao.Rollback(db, txDB) } }