diff --git a/business/jxstore/misc/store_score.go b/business/jxstore/misc/store_score.go index 1ca80b052..65882fac9 100644 --- a/business/jxstore/misc/store_score.go +++ b/business/jxstore/misc/store_score.go @@ -71,25 +71,38 @@ var ( ) type AllStoreSkusWrapper struct { - allStoreSkus map[int]map[int]*cms.StoreSkuNameExt + //allStoreSkus map[int]map[int]*cms.StoreSkuNameExt + allStoreSkus map[int]map[int]int locker sync.RWMutex } func (a *AllStoreSkusWrapper) InitData() { - a.allStoreSkus = make(map[int]map[int]*cms.StoreSkuNameExt) + // a.allStoreSkus = make(map[int]map[int]*cms.StoreSkuNameExt) + a.allStoreSkus = make(map[int]map[int]int) } func (a *AllStoreSkusWrapper) ClearData() { a.allStoreSkus = nil } -func (a *AllStoreSkusWrapper) SetData(storeID int, skuMapData map[int]*cms.StoreSkuNameExt) { +// func (a *AllStoreSkusWrapper) SetData(storeID int, skuMapData map[int]*cms.StoreSkuNameExt) { +// a.locker.Lock() +// defer a.locker.Unlock() +// a.allStoreSkus[storeID] = skuMapData +// } + +// func (a *AllStoreSkusWrapper) GetData(storeID int) map[int]*cms.StoreSkuNameExt { +// a.locker.RLock() +// defer a.locker.RUnlock() +// return a.allStoreSkus[storeID] +// } +func (a *AllStoreSkusWrapper) SetData(storeID int, skuMapData map[int]int) { a.locker.Lock() defer a.locker.Unlock() a.allStoreSkus[storeID] = skuMapData } -func (a *AllStoreSkusWrapper) GetData(storeID int) map[int]*cms.StoreSkuNameExt { +func (a *AllStoreSkusWrapper) GetData(storeID int) map[int]int { a.locker.RLock() defer a.locker.RUnlock() return a.allStoreSkus[storeID] @@ -117,23 +130,25 @@ func (s *StoreScoreDataWrapper) SetData(storeID int, valueName string, value int valueInfo.FieldByName(valueName).SetInt(int64(value)) } -//得到所有门店的商品 +//得到所有门店的可售商品(优化内存,只存商品的价格) func GetAllStoreSkus(ctx *jxcontext.Context, parentTask tasksch.ITask, storeList []*cms.StoreExt) { allStoreSkusWrapper.InitData() taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { storeInfo := batchItemList[0].(*cms.StoreExt) storeID := storeInfo.ID jxSkuInfoData, _ := cms.GetStoreSkus(ctx, storeID, []int{}, true, "", true, map[string]interface{}{}, 0, -1) - jxSkuMapData := make(map[int]*cms.StoreSkuNameExt) + //jxSkuMapData := make(map[int]*cms.StoreSkuNameExt) + jxSkuPriceMapData := make(map[int]int) for _, value := range jxSkuInfoData.SkuNames { for _, skuInfo := range value.Skus2 { saleStatus := jxutils.MergeSkuStatus(skuInfo.SkuStatus, skuInfo.StoreSkuStatus) if saleStatus == model.SkuStatusNormal { - jxSkuMapData[skuInfo.SkuID] = value + //jxSkuMapData[skuInfo.SkuID] = value + jxSkuPriceMapData[skuInfo.SkuID] = skuInfo.BindPrice } } } - allStoreSkusWrapper.SetData(storeID, jxSkuMapData) + allStoreSkusWrapper.SetData(storeID, jxSkuPriceMapData) return retVal, err } taskParallel := tasksch.NewParallelTask("得到所有门店商品", nil, ctx, taskFunc, storeList) @@ -160,48 +175,51 @@ func ScoreStoreOpenTime(storeInfo *cms.StoreExt) { storeID := storeInfo.ID storeStatus := storeInfo.Status isStoreOpen := storeStatus == model.StoreStatusOpened - for _, storeMap := range storeInfo.StoreMaps { - vendorStoreStatus := int(utils.MustInterface2Int64(storeMap["status"])) - isVendorStoreOpen := vendorStoreStatus == model.StoreStatusOpened - opTimeList := storeInfo.GetOpTimeList() - if len(opTimeList) > 0 && isStoreOpen && isVendorStoreOpen { - finalScore := 0 - opTime := GetOpenTime(opTimeList) - if opTime >= StoreOpenTimeNormalTime { - finalScore = ItemTotalScore - } else { - decScore := int(math.Round(StoreOpenTimeNormalTime - opTime)) - finalScore = ItemTotalScore - decScore - if finalScore < 0 { - finalScore = 0 + finalScore := 0 + if isStoreOpen { + for _, storeMap := range storeInfo.StoreMaps { + vendorStoreStatus := int(utils.MustInterface2Int64(storeMap["status"])) + isVendorStoreOpen := vendorStoreStatus == model.StoreStatusOpened + opTimeList := storeInfo.GetOpTimeList() + if len(opTimeList) > 0 && isStoreOpen && isVendorStoreOpen { + opTime := GetOpenTime(opTimeList) + if opTime >= StoreOpenTimeNormalTime { + finalScore = ItemTotalScore + } else { + decScore := int(math.Round(StoreOpenTimeNormalTime - opTime)) + finalScore = ItemTotalScore - decScore + if finalScore < 0 { + finalScore = 0 + } } } - storeScoreDataWrapper.SetData(storeID, model.FieldStoreOpenTime, finalScore) } } + storeScoreDataWrapper.SetData(storeID, model.FieldStoreOpenTime, finalScore) } //可售商品数量大于1000,总分10分,按比例扣 func ScoreSaleSkuCount(storeInfo *cms.StoreExt) { storeID := storeInfo.ID skusMapData := allStoreSkusWrapper.GetData(storeID) + finalScore := 0 if len(skusMapData) > 0 { - finalScore := 0 - saleSkuCount := 0 - for _, value := range skusMapData { - for _, skuInfo := range value.Skus2 { - saleStatus := jxutils.MergeSkuStatus(skuInfo.SkuStatus, skuInfo.StoreSkuStatus) - if saleStatus == model.SkuStatusNormal { - saleSkuCount++ - } - } - } + saleSkuCount := len(skusMapData) + // saleSkuCount := 0 + // for _, value := range skusMapData { + // for _, skuInfo := range value.Skus2 { + // saleStatus := jxutils.MergeSkuStatus(skuInfo.SkuStatus, skuInfo.StoreSkuStatus) + // if saleStatus == model.SkuStatusNormal { + // saleSkuCount++ + // } + // } + // } finalScore = int(math.Round(float64(saleSkuCount) * SaleSkuScorePerUnit)) if finalScore > ItemTotalScore { finalScore = ItemTotalScore } - storeScoreDataWrapper.SetData(storeID, model.FieldSaleSkuCount, finalScore) } + storeScoreDataWrapper.SetData(storeID, model.FieldSaleSkuCount, finalScore) } //平均捡货时间小于等于拣货截止时间为10分满分,每超出1分钟,减1分 @@ -210,6 +228,7 @@ func ScoreAveragePickupTime(storeInfo *cms.StoreExt) { db := dao.GetDB() orderList, err := dao.GetDailyFinishOrderList(db, storeID) orderListCount := len(orderList) + finalScore := 0 if err == nil && orderListCount > 0 { totalScore := 0 for _, value := range orderList { @@ -226,9 +245,9 @@ func ScoreAveragePickupTime(storeInfo *cms.StoreExt) { totalScore += tempScore } } - finalScore := totalScore / orderListCount - storeScoreDataWrapper.SetData(storeID, model.FieldAveragePickupTime, finalScore) + finalScore = totalScore / orderListCount } + storeScoreDataWrapper.SetData(storeID, model.FieldAveragePickupTime, finalScore) } //差评订单和完成订单比例小于0.2%,得满分10分,每增加0.1%减1分 @@ -241,8 +260,8 @@ func ScoreBadCommentOrder(storeInfo *cms.StoreExt, paramFinishOrderCount int64) } else { finishOrderCount = paramFinishOrderCount } + finalScore := 0 if finishOrderCount > 0 { - finalScore := 0 badCommentOrderRatio := float64(badCommentOrderCount) * 100 / float64(finishOrderCount) if badCommentOrderRatio <= BadCommentOrderNormalRatio { finalScore = ItemTotalScore @@ -253,8 +272,8 @@ func ScoreBadCommentOrder(storeInfo *cms.StoreExt, paramFinishOrderCount int64) finalScore = 0 } } - storeScoreDataWrapper.SetData(storeID, model.FieldBadCommentOrder, finalScore) } + storeScoreDataWrapper.SetData(storeID, model.FieldBadCommentOrder, finalScore) return finishOrderCount } @@ -269,8 +288,8 @@ func ScoreUnfinishOrder(storeInfo *cms.StoreExt, paramFinishOrderCount int64) (f } else { finishOrderCount = paramFinishOrderCount } + finalScore := 0 if finishOrderCount > 0 { - finalScore := 0 unfinishOrderRatio := float64(unFinishOrderCount) * 100 / float64(finishOrderCount) if unfinishOrderRatio <= UnfinishOrderNormalRatio { finalScore = ItemTotalScore @@ -281,8 +300,8 @@ func ScoreUnfinishOrder(storeInfo *cms.StoreExt, paramFinishOrderCount int64) (f finalScore = 0 } } - storeScoreDataWrapper.SetData(storeID, model.FieldUnfinishOrder, finalScore) } + storeScoreDataWrapper.SetData(storeID, model.FieldUnfinishOrder, finalScore) return finishOrderCount } @@ -297,8 +316,8 @@ func ScoreAbsentGoodsOrder(storeInfo *cms.StoreExt, paramFinishOrderCount int64) } else { finishOrderCount = paramFinishOrderCount } + finalScore := 0 if finishOrderCount > 0 { - finalScore := 0 absentGoodsOrderRatio := float64(absentGoodsOrderCount) * 100 / float64(finishOrderCount) if absentGoodsOrderRatio <= AbsentGoodsOrderNormalRatio { finalScore = ItemTotalScore @@ -309,8 +328,8 @@ func ScoreAbsentGoodsOrder(storeInfo *cms.StoreExt, paramFinishOrderCount int64) finalScore = 0 } } - storeScoreDataWrapper.SetData(storeID, model.FieldAbsentGoodsOrder, finalScore) } + storeScoreDataWrapper.SetData(storeID, model.FieldAbsentGoodsOrder, finalScore) return finishOrderCount } @@ -322,8 +341,8 @@ func ScorePromotionSku(storeInfo *cms.StoreExt) { beginTime := time.Now() endTime := time.Now() actStoreSkuList, err := dao.GetEffectiveActStoreSkuInfo(db, -1, []int{}, []int{storeID}, []int{}, beginTime, endTime) + finalScore := 0 if err == nil && len(actStoreSkuList) > 0 { - finalScore := 0 actStoreSkuMap := make(map[int]int) for _, value := range actStoreSkuList { if value.Type != model.ActSkuFake { @@ -340,8 +359,8 @@ func ScorePromotionSku(storeInfo *cms.StoreExt) { finalScore = 0 } } - storeScoreDataWrapper.SetData(storeID, model.FieldPromotionSku, finalScore) } + storeScoreDataWrapper.SetData(storeID, model.FieldPromotionSku, finalScore) } //经营全平台满分10分,每少一个平台扣2分(一个平台没有得0分) @@ -428,9 +447,13 @@ func GetStoreSkusAveragePrice(storeList []*cms.StoreExt) map[int]int { for _, storeInfo := range storeList { storeID := storeInfo.ID storeSkuMapData := allStoreSkusWrapper.GetData(storeID) - for _, value := range storeSkuMapData { - skuID := value.Skus2[0].SkuID - skuPrice := value.Skus2[0].BindPrice + // for _, value := range storeSkuMapData { + // skuID := value.Skus2[0].SkuID + // skuPrice := value.Skus2[0].BindPrice + // skusTotalPrice[skuID] += skuPrice + // skusCount[skuID]++ + // } + for skuID, skuPrice := range storeSkuMapData { skusTotalPrice[skuID] += skuPrice skusCount[skuID]++ } @@ -443,9 +466,15 @@ func GetStoreSkusAveragePrice(storeList []*cms.StoreExt) map[int]int { func GetSkusCountLessEqualAvgPrice(storeID int, skusAveragePrice map[int]int) (count int) { storeSkuMapData := allStoreSkusWrapper.GetData(storeID) - for _, value := range storeSkuMapData { - skuID := value.Skus2[0].SkuID - skuPrice := value.Skus2[0].BindPrice + // for _, value := range storeSkuMapData { + // skuID := value.Skus2[0].SkuID + // skuPrice := value.Skus2[0].BindPrice + // skuAvgPrice := skusAveragePrice[skuID] + // if skuPrice <= skuAvgPrice { + // count++ + // } + // } + for skuID, skuPrice := range storeSkuMapData { skuAvgPrice := skusAveragePrice[skuID] if skuPrice <= skuAvgPrice { count++ @@ -476,8 +505,8 @@ func ScoreSaleSkuPrice(storeInfo *cms.StoreExt, storeList []*cms.StoreExt) { } } } - storeScoreDataWrapper.SetData(storeID, model.FieldSaleSkuPrice, finalScore) } + storeScoreDataWrapper.SetData(storeID, model.FieldSaleSkuPrice, finalScore) } func GetFilterStoreListEx(storeList []*cms.StoreExt, storeIDMap map[int]int) (outStoreList []*cms.StoreExt) {