From e378affcf1db89dc9755ee33c00539f07ca82696 Mon Sep 17 00:00:00 2001 From: Rosy-zhudan Date: Thu, 8 Aug 2019 16:20:19 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/cms/store_sku_check.go | 326 ++++++++++++------------ 1 file changed, 156 insertions(+), 170 deletions(-) diff --git a/business/jxstore/cms/store_sku_check.go b/business/jxstore/cms/store_sku_check.go index c97125bc1..b7b9474ba 100644 --- a/business/jxstore/cms/store_sku_check.go +++ b/business/jxstore/cms/store_sku_check.go @@ -1,35 +1,37 @@ package cms import ( - "time" "fmt" + "strings" "sync" + "time" + + "git.rosy.net.cn/baseapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" + "git.rosy.net.cn/jx-callback/business/jxutils/excel" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" + "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/partner/putils" - "git.rosy.net.cn/baseapi" - "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" - "git.rosy.net.cn/jx-callback/business/jxutils/excel" "git.rosy.net.cn/jx-callback/globals" ) const ( canWriteTolocal = false - parallelCount = 5 - fileExt = ".xlsx" - diffFileName = "export/京西和平台商品差异" + parallelCount = 5 + fileExt = ".xlsx" + diffFileName = "export/京西和平台商品差异" ) var ( - vendorNameList = map[int]string { + vendorNameList = map[int]string{ model.VendorIDMTWM: "美团", model.VendorIDEBAI: "饿百", - model.VendorIDJD: "京东", + model.VendorIDJD: "京东", } - titleList = []string { + titleList = []string{ "京西门店ID", "平台门店ID", "门店名", @@ -40,21 +42,22 @@ var ( "平台可售状态", } - diffData DiffDataLock - jdAllSkuInfoMap map[int]*partner.SkuNameInfo - jdAllSkuInfoList []*partner.StoreSkuInfo + diffData DiffDataLock + + multiStoreAllSkuInfoMap map[int]map[int]*partner.SkuNameInfo + multiStoreAllSkuInfoList map[int][]*partner.StoreSkuInfo ) type DiffDataLock struct { diffDataMap map[int][]DiffData - locker sync.RWMutex + locker sync.RWMutex } type DiffData struct { JxStoreID string `json:"京西门店ID"` VendorStoreID string `json:"平台门店ID"` VendorStoreName string `json:"门店名"` - SkuID string `json:"SkuID"` + SkuID string `json:"SkuID"` JxSkuName string `json:"京西商品名"` VendorSkuName string `json:"平台商品名"` JxStatus string `json:"京西可售状态"` @@ -71,6 +74,50 @@ func (d *DiffDataLock) InitData() { d.diffDataMap = make(map[int][]DiffData) } +func IsMultiStore(vendorID int) bool { + if _, ok := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler); ok { + return true + } + + return false +} + +func InitMultiStoreData() { + multiStoreAllSkuInfoMap = make(map[int]map[int]*partner.SkuNameInfo) + multiStoreAllSkuInfoList = make(map[int][]*partner.StoreSkuInfo) +} + +func GetMultiStoreAllSkuInfoMap(vendorID int) map[int]*partner.SkuNameInfo { + return multiStoreAllSkuInfoMap[vendorID] +} + +func GetMultiStoreAllSkuInfoList(vendorID int) []*partner.StoreSkuInfo { + return multiStoreAllSkuInfoList[vendorID] +} + +func GetMultiStoreAllSkuInfo() { + InitMultiStoreData() + ctx := jxcontext.AdminCtx + for vendorID, _ := range vendorNameList { + if IsMultiStore(vendorID) { + multiHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler) + allSkuNameInfoList, err := multiHandler.GetSkus(ctx, 0, "", "") + if err != nil { + baseapi.SugarLogger.Errorf("GetMultiStoreAllSkuInfo error:%v", err) + } else { + multiStoreAllSkuInfoList[vendorID] = putils.StoreSkuFullList2Bare(allSkuNameInfoList) + tempMap := make(map[int]*partner.SkuNameInfo) + for _, value := range allSkuNameInfoList { + for _, skuInfo := range value.SkuList { + tempMap[skuInfo.SkuID] = value + } + } + multiStoreAllSkuInfoMap[vendorID] = tempMap + } + } + } +} + func GetFilterJxSkuInfoMap(jxSkuInfoList []*StoreSkuNameExt) map[int]*StoreSkuNameExt { filterJxSkuInfoMap := make(map[int]*StoreSkuNameExt) for _, value := range jxSkuInfoList { @@ -93,93 +140,25 @@ func GetFilterVendorSkuInfoMap(vendorSkuInfoList []*partner.SkuNameInfo) map[int return filterVendorSkuInfoMap } -func GetFilterJdSkuInfoMap(jdSkuInfoList []*partner.StoreSkuInfo) map[int]*partner.StoreSkuInfo { - filterJdSkuInfoMap := make(map[int]*partner.StoreSkuInfo) - for _, value := range jdSkuInfoList { +func GetFilterMultiStoreSkuInfoMap(vendorID int, skuInfoList []*partner.StoreSkuInfo) map[int]*partner.SkuNameInfo { + allSkuInfoMap := GetMultiStoreAllSkuInfoMap(vendorID) + filterSkuInfoMap := make(map[int]*partner.SkuNameInfo) + for _, value := range skuInfoList { if value.Stock > 0 { - filterJdSkuInfoMap[value.SkuID] = value + filterSkuInfoMap[value.SkuID] = allSkuInfoMap[value.SkuID] } } - return filterJdSkuInfoMap -} - -func GetJdAllSkuInfo() { - if _, ok := vendorNameList[model.VendorIDJD]; ok { - if jdAllSkuInfoMap == nil { - jdAllSkuInfoMap = make(map[int]*partner.SkuNameInfo) - ctx := jxcontext.AdminCtx - vendorID := model.VendorIDJD - if multiHandler, ok := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IMultipleStoresHandler); ok { - jdAllSkuNameInfoList, err := multiHandler.GetSkus(ctx, 0, "", "") - if err != nil { - baseapi.SugarLogger.Errorf("GetJdAllSkuInfo error:%v", err) - } else { - jdAllSkuInfoList = putils.StoreSkuFullList2Bare(jdAllSkuNameInfoList) - for _, value := range jdAllSkuNameInfoList { - for _, skuInfo := range value.SkuList { - jdAllSkuInfoMap[skuInfo.SkuID] = value - } - } - } - } - } - } + return filterSkuInfoMap } func GetSkuStatusName(status int) string { - if status == model.SkuStatusNormal { - return "可售" - } else if status == model.SkuStatusDontSale { - return "不可售" - } else if status == model.SkuStatusDeleted { - return "删除" - } - - return "" + return model.SkuStatusName[status] } -func CompareJxAndJd(vendorID int, storeIDStr, vendorStoreID, storeName string, - filterJxSkuInfoMap map[int]*StoreSkuNameExt, - filterJdSkuInfoMap map[int]*partner.StoreSkuInfo) { - for skuID, jxSkuInfo := range filterJxSkuInfoMap { - skuIDStr := utils.Int2Str(skuID) - 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) - jxSkuStatus := jxutils.MergeSkuStatus(jxSkuInfo.Skus2[0].SkuStatus, jxSkuInfo.Skus2[0].StoreSkuStatus) - jxSkuStatusName := GetSkuStatusName(jxSkuStatus) - vendorSkuInfo := filterJdSkuInfoMap[skuID] - if vendorSkuInfo != nil { - vendorSkuInfo := jdAllSkuInfoMap[vendorSkuInfo.SkuID] - vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName - vendorSkuStatusName := GetSkuStatusName(vendorSkuInfo.SkuList[0].Status) - if jxSkuStatusName != vendorSkuStatusName || jxSkuDetailName != vendorSkuDetailName { - outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, jxSkuDetailName, vendorSkuDetailName, jxSkuStatusName, vendorSkuStatusName} - diffData.AppendData(vendorID, outPutData) - } - } else { - outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, jxSkuDetailName, "", jxSkuStatusName, ""} - diffData.AppendData(vendorID, outPutData) - } - } - for skuID, _ := range filterJdSkuInfoMap { +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) - vendorSkuInfo := jdAllSkuInfoMap[skuID] - vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName - vendorSkuStatusName := GetSkuStatusName(vendorSkuInfo.SkuList[0].Status) - - jxSkuInfo := filterJxSkuInfoMap[skuID] - if jxSkuInfo == nil { - outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", vendorSkuDetailName, "", vendorSkuStatusName} - diffData.AppendData(vendorID, outPutData) - } - } -} - -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 := jxutils.ComposeSkuName(jxSkuInfo.SkuName.Prefix, jxSkuInfo.SkuName.Name, jxSkuInfo.Skus2[0].Comment, jxSkuInfo.SkuName.Unit, jxSkuInfo.Skus2[0].SkuSpecQuality, jxSkuInfo.Skus2[0].SkuSpecUnit, 0) jxSkuStatus := jxutils.MergeSkuStatus(jxSkuInfo.Skus2[0].SkuStatus, jxSkuInfo.Skus2[0].StoreSkuStatus) jxSkuStatusName := GetSkuStatusName(jxSkuStatus) @@ -188,7 +167,13 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin if vendorSkuInfo != nil { vendorSkuDetailName := vendorSkuInfo.SkuList[0].SkuName vendorSkuStatusName := GetSkuStatusName(vendorSkuInfo.SkuList[0].Status) - if jxSkuStatusName != vendorSkuStatusName || jxSkuDetailName != vendorSkuDetailName { + + isStatusDiff := jxSkuStatusName != vendorSkuStatusName + isNameDiff := jxSkuDetailName != vendorSkuDetailName + if jxSkuDetailName != "" && vendorSkuDetailName != "" && strings.Contains(jxSkuDetailName, vendorSkuDetailName) { + isNameDiff = false + } + if isStatusDiff || isNameDiff { outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, jxSkuDetailName, vendorSkuDetailName, jxSkuStatusName, vendorSkuStatusName} diffData.AppendData(vendorID, outPutData) } @@ -207,11 +192,12 @@ func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName strin outPutData := DiffData{storeIDStr, vendorStoreID, storeName, skuIDStr, "", vendorSkuDetailName, "", vendorSkuStatusName} diffData.AppendData(vendorID, outPutData) } - } + } } func CheckSkuDiffBetweenJxAndVendor(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 @@ -220,91 +206,91 @@ func CheckSkuDiffBetweenJxAndVendor(vendorIDList []int, storeIDList []int) { for _, storeID := range storeIDList { storeIDMap[storeID] = true } - baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor start time: %v", time.Now()) ctx := jxcontext.AdminCtx - 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) - } else { - GetJdAllSkuInfo() - diffData.InitData() - taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { - switch step { - case 0: - taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - jxStoreInfoListValue := batchItemList[0].(*StoreExt) - storeID := jxStoreInfoListValue.ID - //filter for storeID - if len(storeIDMap) > 0 { - if _, ok := storeIDMap[storeID]; !ok { - return retVal, err - } - } - storeIDStr := utils.Int2Str(storeID) - storeName := jxStoreInfoListValue.Name - if jxStoreInfoListValue.StoreMaps != nil { - isGetJxSkuInfoData := false - for _, vendorListValue := range jxStoreInfoListValue.StoreMaps { - vendorID := int(utils.MustInterface2Int64(vendorListValue["vendorID"])) - //filter for vendorID - if len(vendorMap) > 0 { - if _, ok := vendorMap[vendorID]; !ok { - continue - } + taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: + 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) + } else { + GetMultiStoreAllSkuInfo() + diffData.InitData() + taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + jxStoreInfoListValue := batchItemList[0].(*StoreExt) + storeID := jxStoreInfoListValue.ID + //filter for storeID + if len(storeIDMap) > 0 { + if _, ok := storeIDMap[storeID]; !ok { + return retVal, err + } + } + storeIDStr := utils.Int2Str(storeID) + storeName := jxStoreInfoListValue.Name + if jxStoreInfoListValue.StoreMaps != nil { + isGetJxSkuInfoData := false + var filterJxSkuInfoMap map[int]*StoreSkuNameExt + for _, vendorListValue := range jxStoreInfoListValue.StoreMaps { + vendorID := int(utils.MustInterface2Int64(vendorListValue["vendorID"])) + //filter for vendorID + if len(vendorMap) > 0 { + if _, ok := vendorMap[vendorID]; !ok { + continue } - if _, ok := vendorNameList[vendorID]; ok { - var filterJxSkuInfoMap map[int]*StoreSkuNameExt - if isGetJxSkuInfoData == false {//only get once jx sku info list every store id - isGetJxSkuInfoData = true - jxSkuInfoData, _ := GetStoreSkus(ctx, storeID, []int{}, true, "", true, map[string]interface{}{}, 0, -1) - filterJxSkuInfoMap = GetFilterJxSkuInfoMap(jxSkuInfoData.SkuNames) + } + if _, ok := vendorNameList[vendorID]; ok { + if isGetJxSkuInfoData == false { //only get once jx sku info list every store id + isGetJxSkuInfoData = true + jxSkuInfoData, _ := GetStoreSkus(ctx, storeID, []int{}, true, "", true, map[string]interface{}{}, 0, -1) + filterJxSkuInfoMap = GetFilterJxSkuInfoMap(jxSkuInfoData.SkuNames) + } + + vendorStoreID := utils.Interface2String(vendorListValue["vendorStoreID"]) + baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor storeID:%d vendorID:%d vendorStoreID:%s vendorListValue:%v", storeID, vendorID, vendorStoreID, vendorListValue) + + if IsMultiStore(vendorID) { + singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler) + allSkuInfoList := GetMultiStoreAllSkuInfoList(vendorID) + skuBareInfoList, err := singleStoreHandler.GetStoreSkusBareInfo(ctx, nil, storeID, vendorStoreID, allSkuInfoList) + if err != nil { + baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err) + } else if len(skuBareInfoList) > 0 { + filterSkuInfoMap := GetFilterMultiStoreSkuInfoMap(vendorID, skuBareInfoList) + CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMap, filterSkuInfoMap) } - - vendorStoreID := utils.Interface2String(vendorListValue["vendorStoreID"]) - baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor storeID:%d vendorID:%d vendorStoreID:%s vendorListValue:%v", storeID, vendorID, vendorStoreID, vendorListValue) - - if vendorID == model.VendorIDJD { - singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler) - jdSkuInfoList, err := singleStoreHandler.GetStoreSkusBareInfo(ctx, nil, storeID, vendorStoreID, jdAllSkuInfoList) - if err != nil { - baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStoreSkusBareInfo error:%v", err) - } else if len(jdSkuInfoList) > 0 { - filterJdSkuInfoMap := GetFilterJdSkuInfoMap(jdSkuInfoList) - CompareJxAndJd(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMap, filterJdSkuInfoMap) - } - } else { - singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) - vendorSkuInfoList, err := singleStoreHandler.GetStoreSkusFullInfo(ctx, nil, storeID, vendorStoreID, nil) - if err != nil { - baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err) - } else if len(vendorSkuInfoList) > 0 { - filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(vendorSkuInfoList) - CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMap, filterVendorSkuInfoMap) - } + } else { + singleStoreHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.ISingleStoreStoreSkuHandler) + vendorSkuInfoList, err := singleStoreHandler.GetStoreSkusFullInfo(ctx, nil, storeID, vendorStoreID, nil) + if err != nil { + baseapi.SugarLogger.Errorf("CheckSkuDiffBetweenJxAndVendor GetStoreSkusFullInfo error:%v", err) + } else if len(vendorSkuInfoList) > 0 { + filterVendorSkuInfoMap := GetFilterVendorSkuInfoMap(vendorSkuInfoList) + CompareJxAndVendor(vendorID, storeIDStr, vendorStoreID, storeName, filterJxSkuInfoMap, filterVendorSkuInfoMap) } } } } - return retVal, err } - taskParallel := tasksch.NewParallelTask("CheckSkuDiffBetweenJxAndVendor", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc, jxStoreInfoList.Stores) - tasksch.HandleTask(taskParallel, task, false).Run() - _, err = taskParallel.GetResult(0) - if err != nil { - baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor taskParallel error:%v", err) - } - case 1: - WriteToExcel(task, diffData.diffDataMap) - endProcessTime := time.Now().Unix() - diff := endProcessTime - startProcessTime - baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor end time: %v", time.Now()) - baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor cost time: %d sec", diff) + return retVal, err + } + taskParallel := tasksch.NewParallelTask("CheckSkuDiffBetweenJxAndVendor", tasksch.NewParallelConfig().SetParallelCount(parallelCount), ctx, taskFunc, jxStoreInfoList.Stores) + tasksch.HandleTask(taskParallel, task, false).Run() + _, err = taskParallel.GetResult(0) + if err != nil { + baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor taskParallel error:%v", err) + } } - return result, err + case 1: + WriteToExcel(task, diffData.diffDataMap) + endProcessTime := time.Now().Unix() + diff := endProcessTime - startProcessTime + baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor end time: %v", time.Now()) + baseapi.SugarLogger.Debugf("CheckSkuDiffBetweenJxAndVendor cost time: %d sec", diff) } - taskSeq := tasksch.NewSeqTask("CheckSkuDiffBetweenJxAndVendor SeqTask", ctx, taskSeqFunc, 2) - tasksch.HandleTask(taskSeq, nil, false).Run() + return result, err } + taskSeq := tasksch.NewSeqTask("CheckSkuDiffBetweenJxAndVendor SeqTask", ctx, taskSeqFunc, 2) + tasksch.HandleTask(taskSeq, nil, false).Run() } func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData) { @@ -321,7 +307,7 @@ func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData) { } if len(sheetList) > 0 { excelBin := excel.Obj2Excel(sheetList) - timeStr := utils.Int64ToStr(time.Now().Unix()) + timeStr := utils.Int64ToStr(time.Now().Unix()) diffFullFileName := diffFileName + timeStr + fileExt if canWriteTolocal { jxutils.WriteFile(diffFullFileName, excelBin) @@ -338,4 +324,4 @@ func WriteToExcel(task *tasksch.SeqTask, data map[int][]DiffData) { } else { baseapi.SugarLogger.Debug("WriteToExcel:No diff data!!!") } -} \ No newline at end of file +}