门店评分-优化内存
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user