门店评分-优化内存

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