diff --git a/business/jxstore/cms/store_sku_check.go b/business/jxstore/cms/store_sku_check.go index 3cce02e21..e7ae067f9 100644 --- a/business/jxstore/cms/store_sku_check.go +++ b/business/jxstore/cms/store_sku_check.go @@ -26,6 +26,11 @@ const ( fileExt = ".xlsx" ) +const ( + DatAanalyse1 = "京东商品库直接创建,正常数据" + DatAanalyse2 = "(可能无经营许可)" +) + var ( diffFileName = map[bool]string{ true: "export/JXCSAndVendorSkuDiff", @@ -48,6 +53,7 @@ var ( "平台商品名", "京西可售状态", "平台可售状态", + "数据分析", } statisticTitleList = []string{ "京西和平台商品状态", @@ -73,6 +79,8 @@ var ( multiStoreAllSkuInfoMap map[int]map[int]*partner.SkuNameInfo multiStoreAllSkuInfoList map[int][]*partner.StoreSkuInfo + + filterCloseSkuIds []int ) type DiffDataLock struct { @@ -92,6 +100,7 @@ type DiffData struct { VendorSkuName string `json:"平台商品名"` JxStatus string `json:"京西可售状态"` VendorStatus string `json:"平台可售状态"` + DatAanalyse string `json:"数据分析"` } type StatisticData struct { @@ -127,6 +136,7 @@ func GetMultiStoreAllSkuInfoList(vendorID int) []*partner.StoreSkuInfo { func GetMultiStoreAllSkuInfo(ctx *jxcontext.Context, vendorMap map[int]bool) { InitMultiStoreData() + filterCloseSkuIds = filterCloseSkuIds[0:0] for vendorID, _ := range vendorNameList { //filter for vendorID if len(vendorMap) > 0 { @@ -136,18 +146,19 @@ func GetMultiStoreAllSkuInfo(ctx *jxcontext.Context, vendorMap map[int]bool) { } if partner.IsMultiStore(vendorID) { multiHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler) - allSkuNameInfoList, err := multiHandler.GetSkus(ctx, 0, "", "") + allSkuNameInfoList, err := multiHandler.GetSkusForCheck(ctx, 0, "", "") if err != nil { baseapi.SugarLogger.Errorf("GetMultiStoreAllSkuInfo error:%v", err) } else { - multiStoreAllSkuInfoList[vendorID] = putils.StoreSkuFullList2Bare(allSkuNameInfoList) + multiStoreAllSkuInfoList[vendorID] = putils.StoreSkuFullList2Bare(allSkuNameInfoList) //map[平台ID:[]StoreSkuInfo1,StoreSkuInfo2...] tempMap := make(map[int]*partner.SkuNameInfo) for _, value := range allSkuNameInfoList { for _, skuInfo := range value.SkuList { + filterCloseSkuIds = append(filterCloseSkuIds, skuInfo.SkuID) tempMap[skuInfo.SkuID] = value } } - multiStoreAllSkuInfoMap[vendorID] = tempMap + multiStoreAllSkuInfoMap[vendorID] = tempMap //map[平台ID][map[skuID1:SkuNameInfo1,skuID2:SkuNameInfo2]...] } } } @@ -241,10 +252,14 @@ func IsSkuCanSale(saleStatus int) bool { return saleStatus == model.SkuStatusNormal } +//京西平台和其他平台商品的对比 +//storeIDStr 京西商家id ,vendorStoreID 平台商家id func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName string, filterJxSkuInfoMap map[int]*StoreSkuNameExt, filterVendorSkuInfoMap map[int]*partner.SkuNameInfo) { for skuID, jxSkuInfo := range filterJxSkuInfoMap { skuIDStr := utils.Int2Str(skuID) + //jxSkuDetailName : 前缀 ([荐]) + 分类名(xxx水饺) + 数量单位(约..g/份) + 注释 (补充..) jxSkuDetailName := jxutils.ComposeSkuName(jxSkuInfo.SkuName.Prefix, jxSkuInfo.SkuName.Name, jxSkuInfo.Skus2[0].Comment, jxSkuInfo.SkuName.Unit, jxSkuInfo.Skus2[0].SkuSpecQuality, jxSkuInfo.Skus2[0].SkuSpecUnit, 0) + //jxSkuSaleStatus : 商品状态 ,skustatus 优先级高于 StoreSkuStatus jxSkuSaleStatus := jxutils.MergeSkuStatus(jxSkuInfo.Skus2[0].SkuStatus, jxSkuInfo.Skus2[0].StoreSkuStatus) jxSkuSaleStatusName := GetSkuSaleStatusName(jxSkuSaleStatus) @@ -271,14 +286,14 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin isNameDiff = false } if isSaleStatusDiff || isNameDiff { - outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName} + outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, vendorSkuDetailName, jxSkuSaleStatusName, vendorSkuSaleStatusName, ""} diffData.AppendData(vendorID, outPutData) } } else { if isFilterToBeCreateAndNotSale && model.IsSyncStatusNeedCreate(status) && !IsSkuCanSale(jxSkuSaleStatus) { continue } - outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, "", jxSkuSaleStatusName, ""} + outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, syncStatus, toBeCreate, toBeDel, jxSkuDetailName, "", jxSkuSaleStatusName, "", ""} diffData.AppendData(vendorID, outPutData) } } @@ -289,28 +304,35 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin jxSkuInfo := filterJxSkuInfoMap[skuID] if jxSkuInfo == nil { - outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", "", "", "", vendorSkuDetailName, "", vendorSkuSaleStatusName} + outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", "", "", "", vendorSkuDetailName, "", vendorSkuSaleStatusName, DatAanalyse1} diffData.AppendData(vendorID, outPutData) } } } +//入口函数,校验本地商品京西和其他平台的差异 func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, storeIDList []int) { startProcessTime := time.Now().Unix() baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor start time: %v", time.Now()) vendorMap := make(map[int]bool) for _, vendorID := range vendorIDList { - vendorMap[vendorID] = true + vendorMap[vendorID] = true //map[平台ID:true] } storeIDMap := make(map[int]bool) for _, storeID := range storeIDList { - storeIDMap[storeID] = true + storeIDMap[storeID] = true //map[门店ID:true] } taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { switch step { case 0: + //获取所有多门店平台的商品信息 + //1.循环传进来的平台id,如果是多门店的平台,查询该门店京东到家平台的所有商品 + //2.为multiStoreAllSkuInfoList 和 multiStoreAllSkuInfoMap 赋值 GetMultiStoreAllSkuInfo(ctx, vendorMap) case 1: + //1.获取京西本地所有门店信息 store、place、user表联查 jxStoreInfoList + //2.过滤所有门店信息,只留下传进来的vendorMap,storeIDMap中对应的平台和门台信息 filterStoreList + //3.判断是否多平台门店,两种情况两种处理 jxStoreInfoList, err := GetStores(ctx, "", map[string]interface{}{}, 0, -1, utils.DefaultTimeValue, utils.DefaultTimeValue, 0, 0) if err != nil { baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStores error:%v", err) @@ -330,8 +352,8 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, if isGetJxSkuInfoData == false { //only get once jx sku info list every store id isGetJxSkuInfoData = true - jxSkuInfoData, _ := GetStoreSkus(ctx, storeID, []int{}, true, "", true, false, map[string]interface{}{}, 0, -1) - filterJxSkuInfoMap = GetFilterJxSkuInfoMap(jxSkuInfoData.SkuNames) + jxSkuInfoData, _ := GetStoreSkus(ctx, storeID, filterCloseSkuIds, true, "", true, false, map[string]interface{}{}, 0, -1) + filterJxSkuInfoMap = GetFilterJxSkuInfoMap(jxSkuInfoData.SkuNames) //map[京西商品ID:StoreSkuNameExt] } vendorStoreID := utils.Interface2String(vendorListValue["vendorStoreID"]) @@ -344,7 +366,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, if err != nil { baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err) } else if len(skuBareInfoList) > 0 { - filterSkuInfoMap := GetFilterMultiStoreSkuInfoMap(vendorID, skuBareInfoList) + filterSkuInfoMap := GetFilterMultiStoreSkuInfoMap(vendorID, skuBareInfoList) //map[京东商品ID:SkuNameInfo] CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMap, filterSkuInfoMap) } } else { @@ -353,7 +375,7 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, if err != nil { baseapi.SugarLogger.Infof("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err) } else if len(vendorSkuInfoList) > 0 { - filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(vendorSkuInfoList) + filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(vendorSkuInfoList) //map[平台商品ID:SkuNameInfo] CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMap, filterVendorSkuInfoMap) } } diff --git a/business/partner/partner.go b/business/partner/partner.go index 28dadcba3..2d8423412 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -173,6 +173,7 @@ type IMultipleStoresHandler interface { // RefreshAllSkusID(ctx *jxcontext.Context, parentTask tasksch.ITask, isAsync bool) (hint string, err error) GetSkus(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*SkuNameInfo, err error) + GetSkusForCheck(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*SkuNameInfo, err error) } type ISingleStoreHandler interface { diff --git a/business/partner/purchase/jd/sku.go b/business/partner/purchase/jd/sku.go index 6b78f8b5a..abc0480e0 100644 --- a/business/partner/purchase/jd/sku.go +++ b/business/partner/purchase/jd/sku.go @@ -604,6 +604,35 @@ func (p *PurchaseHandler) GetVendorCategories(ctx *jxcontext.Context) (vendorCat return vendorCats, err } +//为对比差异另创建了一个查询京东库的的方法,此方法不用查询图片路径,并且过滤掉了京东库上已下架的商品 +func (p *PurchaseHandler) GetSkusForCheck(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*partner.SkuNameInfo, err error) { + param := &jdapi.QuerySkuParam{ + SkuID: utils.Str2Int64WithDefault(vendorSkuID, 0), + SkuName: skuName, + IsFilterDel: jdapi.IsFilterDelTrue, + PageNo: 1, + PageSize: jdapi.MaxSkuIDsCount4QueryListBySkuIds, + } + for { + skuList, _, err2 := getAPI("").QuerySkuInfos(param) + if err = err2; err != nil { + return nil, err + } + if len(skuList) > 0 { + for _, v := range skuList { + if v.FixedStatus != jdapi.SkuFixedStatusOffline { + skuNameList = append(skuNameList, vendorSku2Jx(v)) + } + } + } + if len(skuList) < param.PageSize { + break + } + param.PageNo++ + } + return skuNameList, err +} + func (p *PurchaseHandler) GetSkus(ctx *jxcontext.Context, skuID int, vendorSkuID, skuName string) (skuNameList []*partner.SkuNameInfo, err error) { param := &jdapi.QuerySkuParam{ SkuID: utils.Str2Int64WithDefault(vendorSkuID, 0),