门店评分-优化内存

This commit is contained in:
Rosy-zhudan
2019-09-12 11:42:20 +08:00
parent 895ad8b4f6
commit 86d35d58c5

View File

@@ -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) {