diff --git a/business/enterprise/vendor_sku_compare.go b/business/enterprise/vendor_sku_compare.go index 705909c16..a343f9c67 100644 --- a/business/enterprise/vendor_sku_compare.go +++ b/business/enterprise/vendor_sku_compare.go @@ -1,238 +1,371 @@ 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 { +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" + sku_syncStock_request "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/api/sku_syncStock/request" + "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) { + var ( + mtApi = apimanager.CurAPIManager.GetAPI(sm.VendorID, sm.VendorOrgCode).(*mtwmapi.API) + i = model.NO + foodListData = make([]*mtwmapi.AppFood, 0, 0) + errs = make([]string, 0, 0) + vendorStatus = 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++ + } + + 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("skuCode:%d,修改美团价格错误:%v", sku.SkuID, 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 { + if sku.Status == model.SkuStatusNormal { + vendorStatus = mtwmapi.SellStatusOnline + } else { + vendorStatus = mtwmapi.SellStatusOffline + } + + param := []*mtwmapi.BareStoreFoodInfo{ + &mtwmapi.BareStoreFoodInfo{ + AppFoodCode: utils.Int64ToStr(sku.MtwmID), + Skus: nil, + }, + } + foodErrList, err := mtApi.RetailSellStatus(jxcontext.AdminCtx.GetTrackInfo(), sm.VendorStoreID, param, vendorStatus) + if err != nil { + errs = append(errs, fmt.Sprintf("skuCode:%d,修改美团可售状态错误%v", sku.SkuID, err)) + } + for _, fel := range foodErrList { + errs = append(errs, fmt.Sprintf("skuCode:%s,修改美团可售状态错误:%s", fel.AppFoodCode, fel.ErrorMsg)) + } + } + } + } + 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) { + var ( + ebaiApi = apimanager.CurAPIManager.GetAPI(sm.VendorID, sm.VendorOrgCode).(*ebaiapi.API) + skuIdOffset = 0 + foodListData = make([]*ebaiapi.SkuInfo, 0, 0) + errs = make([]string, 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 + } + + 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) { + // 平台上架本地下架,将平台商品下架 + if sku.Status == model.StoreSkuBindStatusNormal { + ebailResult, err := ebaiApi.SkuOnline(jxcontext.AdminCtx.GetTrackInfo(), utils.Int2Str(sm.StoreID), []int64{sku.EbaiID}, nil, nil) + if err != nil { + errs = append(errs, fmt.Sprintf("skuCode:%d,修改饿百可售状态错误%v", sku.SkuID, err)) + } + for _, fel := range ebailResult.FailedList { + errs = append(errs, fmt.Sprintf("skuCode:%d,修改饿百可售状态错误:%s", fel.SkuID, fel.ErrorMsg)) + } + } else { + err = ebaiApi.SkuOfflineOne(jxcontext.AdminCtx.GetTrackInfo(), utils.Int2Str(sm.StoreID), sku.EbaiID, "", "") + if err != nil { + errs = append(errs, fmt.Sprintf("skuCode:%d,修改饿百不可售状态错误%v", sku.SkuID, err)) + } + } + //_, 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) + onlineStatus int64 = 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("淘宝对比商品价格异常skuid:%d,错误%v", sku.SkuID, err)) + } + } + // 同步商品上下架状态 + // 是否线上可售 是 0:否 1:是。 + // 本地sku.Status 0-不可售, 1-可售 + if int(*vsl.OnlineSaleFlag) != sku.Status { + // 平台上架本地下架,将平台商品下架 + param := &request585.AlibabaWdkSkuUpdateRequest{} + updateSkuList := make([]domain585.AlibabaWdkSkuUpdateSkuDo, 0, 0) + if sku.Status == model.SkuStatusNormal { + onlineStatus = tao.CreateOnlineSaleFlag + } else { + onlineStatus = tao.CreateOfflineSaleFlag + } + updateSkuList = append(updateSkuList, domain585.AlibabaWdkSkuUpdateSkuDo{ + OuCode: utils.String2Pointer(utils.Int64ToStr(sku.TaoID)), + SkuCode: utils.String2Pointer(utils.Int2Str(sku.SkuID)), + OnlineSaleFlag: utils.Int64ToPointer(onlineStatus), + SubTitle: utils.String2Pointer("小时达"), + AllowAppSale: utils.Int64ToPointer(onlineStatus), + //CleanSkuMemberPrice: utils.Int64ToPointer(model.YES), + }) + param.ParamList = &updateSkuList + + result, err := taoApi.UpdateStoreSku(param) + if err != nil { + errs = append(errs, fmt.Sprintf("skuCode:%d,修改饿百可售状态错误%v", sku.SkuID, err)) + } + for _, fel := range *result { + if fel.ErrMsg != "" { + errs = append(errs, fmt.Sprintf("skuCode:%s,修改饿百可售状态错误:%s", fel.SkuID, fel.ErrMsg)) + } + } + //_, 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.DiscountPrice != int64(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) + if err != nil { + errs = append(errs, fmt.Sprintf("抖音对比商品价格异常skuid:%d,错误%v", sku.SkuID, err)) + } + } + // 同步商品上下架状态 + // 0-在线 1-下线 + // 本地sku.Status 0-不可售,1-可售 + if vsl.Status == int64(sku.Status) { + if sku.Status == model.SkuStatusNormal { + param := &sku_syncStock_request.SkuSyncStockParam{ + ProductId: sku.DdID, + Incremental: false, + StockNum: 99999, + OutSkuId: int64(sku.SkuID), + } + if err = tiktokApi.UpdateSkuStock(param); err != nil { + errs = append(errs, fmt.Sprintf("抖音对比商品上架异常skuid:%d,错误%v", sku.SkuID, err)) + } + } else { + param := &sku_syncStock_request.SkuSyncStockParam{ + ProductId: sku.DdID, + Incremental: false, + StockNum: 0, + OutSkuId: int64(sku.SkuID), + } + if err = tiktokApi.UpdateSkuStock(param); err != nil { + errs = append(errs, fmt.Sprintf("抖音对比商品下架异常skuid:%d,错误%v", sku.SkuID, err)) + } + } + } + } + } + + if len(errs) == model.NO { + return nil + } + + return fmt.Errorf("%s", strings.Join(errs, ",")) +} + +// JdSyncSkuPriceAndStatus 校验京东平台和京西系统商品差异 +//func JdSyncSkuPriceAndStatus(db *dao.DaoDB, sm *model.StoreMap, skuMap map[string]*model.StoreSkuBind) (err 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) +// tiktokApi = apimanager.CurAPIManager.GetAPI(sm.VendorID, sm.VendorOrgCode).(*jdshopapi.API) // page = 0 // foodListData = make([]product_listV2_response.DataItem, 0, 0) // errs = make([]string, 0, 0) @@ -260,41 +393,37 @@ package enterprise // for _, vsl := range foodListData { // if sku, ok := skuMap[vsl.OuterProductId]; ok { // // 同步商品价格 -// if vsl.SalePrice != sku.EbaiPrice { +// if vsl.DiscountPrice != int64(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) +// if err != nil { +// errs = append(errs, fmt.Sprintf("抖音对比商品价格异常skuid:%d,错误%v", sku.SkuID, err)) +// } // } // // 同步商品上下架状态 // // 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 +// if sku.Status == model.SkuStatusNormal { +// param := &sku_syncStock_request.SkuSyncStockParam{ +// ProductId: sku.DdID, +// Incremental: false, +// StockNum: 99999, +// OutSkuId: int64(sku.SkuID), +// } +// if err = tiktokApi.UpdateSkuStock(param); err != nil { +// errs = append(errs, fmt.Sprintf("抖音对比商品上架异常skuid:%d,错误%v", sku.SkuID, err)) +// } +// } else { +// param := &sku_syncStock_request.SkuSyncStockParam{ +// ProductId: sku.DdID, +// Incremental: false, +// StockNum: 0, +// OutSkuId: int64(sku.SkuID), +// } +// if err = tiktokApi.UpdateSkuStock(param); err != nil { +// errs = append(errs, fmt.Sprintf("抖音对比商品下架异常skuid:%d,错误%v", sku.SkuID, err)) +// } // } -// 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) // } // } // } diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 9923bc98e..6c047f0fd 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -825,6 +825,7 @@ func CreateActForMtByOrder(ctx *jxcontext.Context, act *model.Act, vendorIDs []i }) for i := 1; i <= len(actData2); i++ { actData2[i-1].Sequence = i + actData2[i-1].OrderLimit = 1 } api.MtwmAPI.RetailDiscountBatchSave2(storeDetail.VendorStoreID, mtwmapi.RetailActTypeDirectDown, actData2) } diff --git a/business/partner/delivery/dada/waybill.go b/business/partner/delivery/dada/waybill.go index a9b788891..6a00f4704 100644 --- a/business/partner/delivery/dada/waybill.go +++ b/business/partner/delivery/dada/waybill.go @@ -119,7 +119,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *dadaapi.CallbackMsg) (retVal *dadaap case model.VendorIDDD: Lng, Lat, _ := partner.GetRidderPositionGetter(order.WaybillVendorID).GetRidderPosition(nil, order.VendorOrderID, order.VendorOrderID, order.VendorWaybillID, order.VendorWaybillID2) tiktokStatusPush(order, msg.OrderStatus, utils.Float64ToStr(Lng), utils.Float64ToStr(Lat), goodsOrder.VendorOrgCode) - case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI: + case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI, model.VendorIDJD: delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 if goodsOrder.VendorID == model.VendorIDTaoVegetable && msg.OrderStatus == dadaapi.OrderStatusAccepted { tao_vegetable.PushDelivererChangeInfo(goodsOrder, order, tao.TaoDeliveryTypeDD) diff --git a/business/partner/delivery/fn/waybill.go b/business/partner/delivery/fn/waybill.go index 674861e22..0645931b4 100644 --- a/business/partner/delivery/fn/waybill.go +++ b/business/partner/delivery/fn/waybill.go @@ -323,7 +323,7 @@ func OnWaybillMsg(msg *fnpsapi.OrderStatusNottify, resultParam *fnpsapi.ShortSta case model.VendorIDDD: Lng, Lat, _ := partner.GetRidderPositionGetter(order.WaybillVendorID).GetRidderPosition(nil, order.VendorOrderID, order.VendorOrderID, order.VendorWaybillID, order.VendorWaybillID2) tiktokStatusPush(order, orderStatus, utils.Float64ToStr(Lng), utils.Float64ToStr(Lat), good.VendorOrgCode) - case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI: + case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI, model.VendorIDJD: delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 if good.VendorID == model.VendorIDTaoVegetable && cc.OrderStatus == fnpsapi.OrderStatusAssigned { tao_vegetable.PushDelivererChangeInfo(good, order, tao.TaoDeliveryTypeFN) diff --git a/business/partner/delivery/mtps/waybill.go b/business/partner/delivery/mtps/waybill.go index aac400d75..674bba746 100644 --- a/business/partner/delivery/mtps/waybill.go +++ b/business/partner/delivery/mtps/waybill.go @@ -143,7 +143,7 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m case model.VendorIDDD: Lng, Lat, _ := partner.GetRidderPositionGetter(order.WaybillVendorID).GetRidderPosition(nil, order.VendorOrderID, order.VendorOrderID, order.VendorWaybillID, order.VendorWaybillID2) pushMTPSToTiktok(msg.Status, order, utils.Float64ToStr(Lng), utils.Float64ToStr(Lat), goodsOrder.VendorOrgCode) - case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI: + case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI, model.VendorIDJD: delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 if goodsOrder.VendorID == model.VendorIDTaoVegetable && msg.Status == mtpsapi.OrderStatusAccepted { tao_vegetable.PushDelivererChangeInfo(goodsOrder, order, tao.TaoDeliveryTypeMT) diff --git a/business/partner/delivery/rider.go b/business/partner/delivery/rider.go index 7cc8f8bbf..2de895c2b 100644 --- a/business/partner/delivery/rider.go +++ b/business/partner/delivery/rider.go @@ -222,7 +222,6 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { riderInfo.ThirdCarrierOrderId = riderInfo.OrderId } - // 目前只推送美团骑手信息 switch v.VendorID { case model.VendorIDMTWM: // 美团订单 if handler := partner.GetPurchaseOrderHandlerFromVendorID(v.VendorID); handler != nil { @@ -245,15 +244,13 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { } } case model.VendorIDJD: // 京东发单 - continue - case model.VendorIDGD: // 美团发单 - continue - case model.VendorIDYB: // 银豹发单 - continue + if handler := partner.GetPurchaseOrderHandlerFromVendorID(v.VendorID); handler != nil { + if err := handler.GetOrderRider(v.VendorOrgCode, v.VendorStoreID, utils.Struct2Map(riderInfo, "", true)); err != nil { + globals.SugarLogger.Debugf("Error pushing meituan rider information :%s--%s--%v", v.VendorOrderID, utils.Format4Output(riderInfo, false), err) + } + } case model.VendorIDJDShop: // 京东商城 continue - case model.VendorIDWSC: // 微盟微商城 - continue case model.VendorIDDD: // 抖店小时达 riderInfo.LogisticsProviderCode = tiktok_api.JxVendorId2TiktokCode(v.WaybillVendorID) if handler := partner.GetPurchaseOrderHandlerFromVendorID(v.VendorID); handler != nil { @@ -261,8 +258,6 @@ func GetOrderRiderInfoToPlatform(orderId string, wayBillStatus int) { globals.SugarLogger.Debugf("Error pushing tiktok rider information :%s--%s--%v", v.VendorOrderID, utils.Format4Output(riderInfo, false), err) } } - case model.VendorIDJX: // 京西平台 - continue case model.VendorIDTaoVegetable: // 淘鲜达 // 定时任务刷新骑手坐标 if orderId == "" { diff --git a/business/partner/delivery/sfps/waybill.go b/business/partner/delivery/sfps/waybill.go index 9dd520588..01963da0c 100644 --- a/business/partner/delivery/sfps/waybill.go +++ b/business/partner/delivery/sfps/waybill.go @@ -460,7 +460,7 @@ func OnWaybillMsg(urlIndex string, msg interface{}) (resp *sfps2.CallbackRespons case model.VendorIDDD: Lng, Lat, _ := partner.GetRidderPositionGetter(order.WaybillVendorID).GetRidderPosition(nil, order.VendorOrderID, order.VendorOrderID, order.VendorWaybillID, order.VendorWaybillID2) tiktokStatusPush(order, orderStatus, utils.Float64ToStr(Lng), utils.Float64ToStr(Lat), goodsOrder.VendorOrgCode) - case model.VendorIDTaoVegetable, model.VendorIDMTWM, model.VendorIDEBAI: + case model.VendorIDTaoVegetable, model.VendorIDMTWM, model.VendorIDEBAI, model.VendorIDJD: delivery.GetOrderRiderInfoToPlatform(order.VendorOrderID, order.Status) // 骑手位置更新 if goodsOrder.VendorID == model.VendorIDTaoVegetable && orderStatus == sfps2.OrderStatusTakeOrder { tao_vegetable.PushDelivererChangeInfo(goodsOrder, order, tao.TaoDeliveryTypeSF) diff --git a/business/partner/delivery/uupt/waybill.go b/business/partner/delivery/uupt/waybill.go index 620eef6ec..a954de8b9 100644 --- a/business/partner/delivery/uupt/waybill.go +++ b/business/partner/delivery/uupt/waybill.go @@ -440,7 +440,7 @@ func OnWaybillMsg(req *uuptapi.WaybillCallbackParam) (resp *uuptapi.CallbackResp case model.VendorIDDD: Lng, Lat, _ := partner.GetRidderPositionGetter(param.WaybillVendorID).GetRidderPosition(nil, param.VendorOrderID, param.VendorOrderID, param.VendorWaybillID, param.VendorWaybillID2) tiktokStatusPush(param, req.State, utils.Float64ToStr(Lng), utils.Float64ToStr(Lat), good.VendorOrgCode) - case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI: + case model.VendorIDMTWM, model.VendorIDTaoVegetable, model.VendorIDEBAI, model.VendorIDJD: delivery.GetOrderRiderInfoToPlatform(param.VendorOrderID, param.Status) // 骑手位置更新 if good.VendorID == model.VendorIDTaoVegetable && req.State == uuptapi.StateRMGrabsOrder { tao_vegetable.PushDelivererChangeInfo(good, param, tao.TaoDeliveryTypeOther) diff --git a/business/partner/purchase/jd/callback.go b/business/partner/purchase/jd/callback.go index 395cdc5e3..f9856cc00 100644 --- a/business/partner/purchase/jd/callback.go +++ b/business/partner/purchase/jd/callback.go @@ -2,6 +2,8 @@ package jd import ( "git.rosy.net.cn/baseapi/platformapi/jdapi" + "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/globals" ) func OnOrderMsg(msg *jdapi.CallbackOrderMsg, a *jdapi.API) (retVal *jdapi.CallbackResponse) { @@ -20,7 +22,9 @@ func OnWaybillMsg(msg *jdapi.CallbackDeliveryStatusMsg) (retVal *jdapi.CallbackR func OnStoreMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) { if CurPurchaseHandler != nil { + globals.SugarLogger.Debugf("==========msg := %s", utils.Format4Output(msg, false)) retVal = CurPurchaseHandler.OnStoreMsg(AppKey2OrgCode(msg.AppKey), msg) + globals.SugarLogger.Debugf("==========retVal := %s", utils.Format4Output(retVal, false)) } return retVal } diff --git a/business/partner/purchase/jd/jd.go b/business/partner/purchase/jd/jd.go index 0ecdf4c6a..26d4faf6d 100644 --- a/business/partner/purchase/jd/jd.go +++ b/business/partner/purchase/jd/jd.go @@ -2,6 +2,7 @@ package jd import ( "encoding/json" + "git.rosy.net.cn/baseapi/utils" "net/url" "git.rosy.net.cn/jx-callback/globals/api" @@ -179,5 +180,52 @@ func OnTokenChange(values url.Values) { } func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, param map[string]interface{}) (err error) { + logisticInfo := jdapi.ReceiveLogisticInfo{ + OrderId: param["order_id"].(string), + DeliveryInfoList: nil, + } + deliveryInfoList := make([]jdapi.DeliveryInfo, 0, 0) + deliverInfo := jdapi.DeliveryInfo{ + DeliveryManName: "暂无", + DeliveryManPhone: "", + + DeliveryCarrierNo: "9966", // 暂时未获取到写死 + DeliveryCarrierName: "达达配送", // 暂时未获取到写死 + DeliveryCarrierOrderNo: param["order_id"].(string), + + FailReason: "", + OperateTime: utils.GetCurTimeStr(), + Operator: jxcontext.AdminCtx.GetUserName(), + } + switch param["logistics_status"].(int) { + case 0: + deliverInfo.DeliveryStatus = jdapi.JdDeliveryStatusNew + case 10: + // 接单、更换骑手、骑手到店、骑手取货 都需要填加:骑手姓名和电话 + deliverInfo.DeliveryStatus = jdapi.JdDeliveryStatusRiderTaking + deliverInfo.DeliveryManName = param["courier_name"].(string) + deliverInfo.DeliveryManPhone = param["courier_phone"].(string) + case 15: + deliverInfo.DeliveryStatus = jdapi.JdDeliveryStatusToStore + deliverInfo.DeliveryManName = param["courier_name"].(string) + deliverInfo.DeliveryManPhone = param["courier_phone"].(string) + case 20: + deliverInfo.DeliveryStatus = jdapi.JdDeliveryStatusDelivering + deliverInfo.DeliveryManName = param["courier_name"].(string) + deliverInfo.DeliveryManPhone = param["courier_phone"].(string) + case 40: + // 完成和取消状态不通过此接口发送通知消息 + return nil + case 100: + // 完成和取消状态不通过此接口发送通知消息 + return nil + case 22: + deliverInfo.DeliveryStatus = jdapi.JdDeliveryStatusFail + } + + deliveryInfoList = append(deliveryInfoList, deliverInfo) + logisticInfo.DeliveryInfoList = deliveryInfoList + + getAPI(vendorOrgCode).ReceiveLogisticInfoForOpenApiPlatform(logisticInfo) return nil } diff --git a/business/partner/purchase/jd/store.go b/business/partner/purchase/jd/store.go index eb2408e38..121b4fe5b 100644 --- a/business/partner/purchase/jd/store.go +++ b/business/partner/purchase/jd/store.go @@ -350,9 +350,6 @@ func (c *PurchaseHandler) OnStoreMsg(vendorOrgCode string, msg *jdapi.CallbackOr } } } - if err != nil { - globals.SugarLogger.Debugf("OnStoreMsg==============%v", err) - } return jdapi.Err2CallbackResponse(err, "") } diff --git a/business/partner/purchase/mtwm/act.go b/business/partner/purchase/mtwm/act.go index 6296051d7..b16b3dcf7 100644 --- a/business/partner/purchase/mtwm/act.go +++ b/business/partner/purchase/mtwm/act.go @@ -40,9 +40,10 @@ func actOrderRules2Mtwm(actOrderRules []*model.ActOrderRule) (actDetails []*mtwm func storeSku2ActData(act *model.Act2, actStoreSku []*model.ActStoreSku2, handler func(int8) bool) (actData []*mtwmapi.RetailDiscountActData) { orderLimit := 1 - if act.LimitCount > 0 { - orderLimit = act.LimitCount - } + // orderLimit + //if act.LimitCount > 0 { + // orderLimit = act.LimitCount + //} for _, v := range actStoreSku { if handler == nil || handler(v.SyncStatus) { dayLimit := -1 diff --git a/business/partner/purchase/tiktok_store/act.go b/business/partner/purchase/tiktok_store/act.go index 693f483ff..e512d0a9c 100644 --- a/business/partner/purchase/tiktok_store/act.go +++ b/business/partner/purchase/tiktok_store/act.go @@ -37,9 +37,9 @@ func actOrderRules2Mtwm(actOrderRules []*model.ActOrderRule) (actDetails []*mtwm func storeSku2ActData(act *model.Act2, actStoreSku []*model.ActStoreSku2, handler func(int8) bool) (actData []*mtwmapi.RetailDiscountActData) { orderLimit := 1 - if act.LimitCount > 0 { - orderLimit = act.LimitCount - } + //if act.LimitCount > 0 { + // orderLimit = act.LimitCount + //} for _, v := range actStoreSku { if handler == nil || handler(v.SyncStatus) { dayLimit := -1 diff --git a/business/partner/purchase/tiktok_store/order.go b/business/partner/purchase/tiktok_store/order.go index 5df987a89..0ba0771da 100644 --- a/business/partner/purchase/tiktok_store/order.go +++ b/business/partner/purchase/tiktok_store/order.go @@ -262,9 +262,9 @@ func (p *PurchaseHandler) GetOrderRider(vendorOrgCode, vendorStoreID string, par vendorStoreID = order.VendorStoreID } - api := getAPI(vendorOrgCode, 0, vendorStoreID) + apiObj := getAPI(vendorOrgCode, 0, vendorStoreID) // 同步骑手状态 - if err = api.OrderStatusAndPsInfoNew(param, vendorStoreID); err != nil { + if err = apiObj.OrderStatusAndPsInfoNew(param, vendorStoreID); err != nil { partner.CurOrderManager.OnOrderMsg(order, param["opcode"].(string), "抖音订单三方配送状态信息回传记录异常:"+err.Error()) } if err = SyncOrderRiderLine(vendorOrgCode, vendorStoreID, param); err != nil { diff --git a/controllers/jd_callback.go b/controllers/jd_callback.go index ff0d6d7e1..ef9115db9 100644 --- a/controllers/jd_callback.go +++ b/controllers/jd_callback.go @@ -149,6 +149,7 @@ func (c *DjswController) StoreCrud() { return callbackResponse }) c.Data["json"] = c.transferResponse("StoreCrud", callbackResponse) + globals.SugarLogger.Debugf("==========c.data : %s", utils.Format4Output(c.transferResponse("StoreCrud", callbackResponse), false)) c.ServeJSON() } else { c.Abort("404")