From 40586e19a6df5b37332147efb0846c4e9951e874 Mon Sep 17 00:00:00 2001 From: Rosy-zhudan Date: Tue, 10 Sep 2019 15:42:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0StoreScoreEx=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E6=9D=A5=E8=8E=B7=E5=8F=96=E9=97=A8=E5=BA=97=E5=90=8D?= =?UTF-8?q?=E5=AD=97,=E5=8E=BB=E6=8E=89=E8=A1=A8=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=AD=97=E6=AE=B5StoreName?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/misc/store_score.go | 94 +++++++++++++++++----------- business/model/api.go | 4 +- business/model/dao/store_score.go | 17 ++--- business/model/store_score.go | 8 ++- 4 files changed, 70 insertions(+), 53 deletions(-) diff --git a/business/jxstore/misc/store_score.go b/business/jxstore/misc/store_score.go index 6300a2066..d1330032d 100644 --- a/business/jxstore/misc/store_score.go +++ b/business/jxstore/misc/store_score.go @@ -10,6 +10,7 @@ import ( "git.rosy.net.cn/jx-callback/business/jxstore/cms" "git.rosy.net.cn/jx-callback/business/jxutils" "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/model/dao" "git.rosy.net.cn/jx-callback/globals/refutil" @@ -63,9 +64,34 @@ var ( } storeScoreDataWrapper StoreScoreDataWrapper - allStoreSkus map[int]map[int]*cms.StoreSkuNameExt + allStoreSkusWrapper AllStoreSkusWrapper ) +type AllStoreSkusWrapper struct { + allStoreSkus map[int]map[int]*cms.StoreSkuNameExt + locker sync.RWMutex +} + +func (a *AllStoreSkusWrapper) InitData() { + a.allStoreSkus = make(map[int]map[int]*cms.StoreSkuNameExt) +} + +func (a *AllStoreSkusWrapper) ClearData() { + a.allStoreSkus = nil +} + +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] +} + type StoreScoreDataWrapper struct { storeScoreData map[int]*model.StoreScore locker sync.RWMutex @@ -75,14 +101,13 @@ func (s *StoreScoreDataWrapper) InitData() { s.storeScoreData = make(map[int]*model.StoreScore) } -func (s *StoreScoreDataWrapper) SetData(storeID int, storeName, valueName string, value int) { +func (s *StoreScoreDataWrapper) SetData(storeID int, valueName string, value int) { s.locker.Lock() defer s.locker.Unlock() data := s.storeScoreData[storeID] if data == nil { data = &model.StoreScore{} data.StoreID = storeID - data.StoreName = storeName s.storeScoreData[storeID] = data } valueInfo := reflect.ValueOf(data).Elem() @@ -91,8 +116,9 @@ func (s *StoreScoreDataWrapper) SetData(storeID int, storeName, valueName string //得到所有门店的商品 func GetAllStoreSkus(ctx *jxcontext.Context, storeList []*cms.StoreExt) { - allStoreSkus = make(map[int]map[int]*cms.StoreSkuNameExt) - for _, storeInfo := range storeList { + 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) @@ -104,12 +130,12 @@ func GetAllStoreSkus(ctx *jxcontext.Context, storeList []*cms.StoreExt) { } } } - allStoreSkus[storeID] = jxSkuMapData + allStoreSkusWrapper.SetData(storeID, jxSkuMapData) + return retVal, err } -} - -func ClearAllStoreSkus() { - allStoreSkus = nil + taskParallel := tasksch.NewParallelTask("GetAllStoreSkus", nil, ctx, taskFunc, storeList) + tasksch.HandleTask(taskParallel, nil, true).Run() + taskParallel.GetResult(0) } func GetOpenTime(opTimeList []int16) (opTime float64) { @@ -130,7 +156,6 @@ func GetOpenTime(opTimeList []int16) (opTime float64) { func ScoreStoreOpenTime(storeList []*cms.StoreExt) { for _, storeInfo := range storeList { storeID := storeInfo.ID - storeName := storeInfo.Name storeStatus := storeInfo.Status isStoreOpen := storeStatus == model.StoreStatusOpened for _, storeMap := range storeInfo.StoreMaps { @@ -149,7 +174,7 @@ func ScoreStoreOpenTime(storeList []*cms.StoreExt) { finalScore = 0 } } - storeScoreDataWrapper.SetData(storeID, storeName, model.FieldStoreOpenTime, finalScore) + storeScoreDataWrapper.SetData(storeID, model.FieldStoreOpenTime, finalScore) } } } @@ -159,8 +184,7 @@ func ScoreStoreOpenTime(storeList []*cms.StoreExt) { func ScoreSaleSkuCount(ctx *jxcontext.Context, storeList []*cms.StoreExt) { for _, storeInfo := range storeList { storeID := storeInfo.ID - storeName := storeInfo.Name - skusMapData := allStoreSkus[storeID] + skusMapData := allStoreSkusWrapper.GetData(storeID) if len(skusMapData) > 0 { finalScore := 0 saleSkuCount := 0 @@ -176,7 +200,7 @@ func ScoreSaleSkuCount(ctx *jxcontext.Context, storeList []*cms.StoreExt) { if finalScore > ItemTotalScore { finalScore = ItemTotalScore } - storeScoreDataWrapper.SetData(storeID, storeName, model.FieldSaleSkuCount, finalScore) + storeScoreDataWrapper.SetData(storeID, model.FieldSaleSkuCount, finalScore) } } } @@ -185,7 +209,6 @@ func ScoreSaleSkuCount(ctx *jxcontext.Context, storeList []*cms.StoreExt) { func ScoreAveragePickupTime(storeList []*cms.StoreExt) { for _, storeInfo := range storeList { storeID := storeInfo.ID - storeName := storeInfo.Name db := dao.GetDB() orderList, err := dao.GetDailyFinishOrderList(db, storeID) orderListCount := len(orderList) @@ -206,7 +229,7 @@ func ScoreAveragePickupTime(storeList []*cms.StoreExt) { } } finalScore := totalScore / orderListCount - storeScoreDataWrapper.SetData(storeID, storeName, model.FieldAveragePickupTime, finalScore) + storeScoreDataWrapper.SetData(storeID, model.FieldAveragePickupTime, finalScore) } } } @@ -215,7 +238,6 @@ func ScoreAveragePickupTime(storeList []*cms.StoreExt) { func ScoreBadCommentOrder(storeList []*cms.StoreExt) { for _, storeInfo := range storeList { storeID := storeInfo.ID - storeName := storeInfo.Name db := dao.GetDB() badCommentOrderCount, _ := dao.GetDailyBadCommentOrderCount(db, storeID) finishOrderCount, _ := dao.GetDailyFinishOrderCount(db, storeID) @@ -231,7 +253,7 @@ func ScoreBadCommentOrder(storeList []*cms.StoreExt) { finalScore = 0 } } - storeScoreDataWrapper.SetData(storeID, storeName, model.FieldBadCommentOrder, finalScore) + storeScoreDataWrapper.SetData(storeID, model.FieldBadCommentOrder, finalScore) } } } @@ -240,7 +262,6 @@ func ScoreBadCommentOrder(storeList []*cms.StoreExt) { func ScoreUnfinishOrder(storeList []*cms.StoreExt) { for _, storeInfo := range storeList { storeID := storeInfo.ID - storeName := storeInfo.Name db := dao.GetDB() unFinishOrderCount, _ := dao.GetDailyUnFinishOrderCount(db, storeID) finishOrderCount, _ := dao.GetDailyFinishOrderCount(db, storeID) @@ -256,7 +277,7 @@ func ScoreUnfinishOrder(storeList []*cms.StoreExt) { finalScore = 0 } } - storeScoreDataWrapper.SetData(storeID, storeName, model.FieldUnfinishOrder, finalScore) + storeScoreDataWrapper.SetData(storeID, model.FieldUnfinishOrder, finalScore) } } } @@ -265,7 +286,6 @@ func ScoreUnfinishOrder(storeList []*cms.StoreExt) { func ScoreAbsentGoodsOrder(storeList []*cms.StoreExt) { for _, storeInfo := range storeList { storeID := storeInfo.ID - storeName := storeInfo.Name db := dao.GetDB() absentGoodsOrderCount, _ := dao.GetDailyAbsentGoodsOrderCount(db, storeID) finishOrderCount, _ := dao.GetDailyFinishOrderCount(db, storeID) @@ -281,7 +301,7 @@ func ScoreAbsentGoodsOrder(storeList []*cms.StoreExt) { finalScore = 0 } } - storeScoreDataWrapper.SetData(storeID, storeName, model.FieldAbsentGoodsOrder, finalScore) + storeScoreDataWrapper.SetData(storeID, model.FieldAbsentGoodsOrder, finalScore) } } } @@ -290,7 +310,6 @@ func ScoreAbsentGoodsOrder(storeList []*cms.StoreExt) { func ScorePromotionSku(storeList []*cms.StoreExt) { for _, storeInfo := range storeList { storeID := storeInfo.ID - storeName := storeInfo.Name db := dao.GetDB() beginTime := time.Now() endTime := time.Now() @@ -313,7 +332,7 @@ func ScorePromotionSku(storeList []*cms.StoreExt) { finalScore = 0 } } - storeScoreDataWrapper.SetData(storeID, storeName, model.FieldPromotionSku, finalScore) + storeScoreDataWrapper.SetData(storeID, model.FieldPromotionSku, finalScore) } } } @@ -324,7 +343,6 @@ func ScoreFullVendor(storeList []*cms.StoreExt) { for _, storeInfo := range storeList { finalScore := 0 storeID := storeInfo.ID - storeName := storeInfo.Name storeStatus := storeInfo.Status isStoreOpen := storeStatus == model.StoreStatusOpened count := 0 @@ -345,7 +363,7 @@ func ScoreFullVendor(storeList []*cms.StoreExt) { finalScore = ItemTotalScore - decScore } } - storeScoreDataWrapper.SetData(storeID, storeName, model.FieldFullVendor, finalScore) + storeScoreDataWrapper.SetData(storeID, model.FieldFullVendor, finalScore) } } @@ -365,7 +383,6 @@ func ScoreStoreRange(storeList []*cms.StoreExt) { for _, storeInfo := range storeList { finalScore := 0 storeID := storeInfo.ID - storeName := storeInfo.Name if storeInfo.DeliveryRangeType == model.DeliveryRangeTypePolygon { points := jxutils.CoordinateStr2Points(storeInfo.DeliveryRange) area := CalcPolygonArea(points) @@ -392,7 +409,7 @@ func ScoreStoreRange(storeList []*cms.StoreExt) { finalScore = ItemTotalScore - int(math.Round(diff*ratio)) } } - storeScoreDataWrapper.SetData(storeID, storeName, model.FieldStoreRange, finalScore) + storeScoreDataWrapper.SetData(storeID, model.FieldStoreRange, finalScore) } } @@ -419,7 +436,8 @@ func GetStoreSkusAveragePrice(storeList []*cms.StoreExt) map[int]int { skusAveragePrice := make(map[int]int) for _, storeInfo := range storeList { storeID := storeInfo.ID - for _, value := range allStoreSkus[storeID] { + storeSkuMapData := allStoreSkusWrapper.GetData(storeID) + for _, value := range storeSkuMapData { skuID := value.Skus2[0].SkuID skuPrice := value.Skus2[0].BindPrice skusTotalPrice[skuID] += skuPrice @@ -433,7 +451,8 @@ func GetStoreSkusAveragePrice(storeList []*cms.StoreExt) map[int]int { } func GetSkusCountLessEqualAvgPrice(storeID int, skusAveragePrice map[int]int) (count int) { - for _, value := range allStoreSkus[storeID] { + storeSkuMapData := allStoreSkusWrapper.GetData(storeID) + for _, value := range storeSkuMapData { skuID := value.Skus2[0].SkuID skuPrice := value.Skus2[0].BindPrice skuAvgPrice := skusAveragePrice[skuID] @@ -450,8 +469,7 @@ func ScoreSaleSkuPrice(ctx *jxcontext.Context, storeList []*cms.StoreExt) { for _, storeInfo := range storeList { finalScore := 0 storeID := storeInfo.ID - storeName := storeInfo.Name - totalCount := len(allStoreSkus[storeID]) + totalCount := len(allStoreSkusWrapper.GetData(storeID)) if totalCount > 0 { rangeStoreList := GetRangeStoreList(storeID, storeInfo.FloatLng, storeInfo.FloatLat, 5, storeList) skusAveragePrice := GetStoreSkusAveragePrice(rangeStoreList) @@ -468,7 +486,7 @@ func ScoreSaleSkuPrice(ctx *jxcontext.Context, storeList []*cms.StoreExt) { } } } - storeScoreDataWrapper.SetData(storeID, storeName, model.FieldSaleSkuPrice, finalScore) + storeScoreDataWrapper.SetData(storeID, model.FieldSaleSkuPrice, finalScore) } } } @@ -516,7 +534,7 @@ func ScoreStore(ctx *jxcontext.Context, storeIDList []int) (retVal interface{}, ScoreStoreRange(storeList) ScoreSaleSkuPrice(ctx, storeList) InsertStoreScore() - ClearAllStoreSkus() + allStoreSkusWrapper.ClearData() return retVal, err } @@ -555,8 +573,8 @@ func Time2Week(t time.Time) int { return week } -func SplitToSingleWeekDataList(storeScoreList []*model.StoreScore) (weekDataList [][]*model.StoreScore) { - singelWeekData := []*model.StoreScore{} +func SplitToSingleWeekDataList(storeScoreList []*model.StoreScoreEx) (weekDataList [][]*model.StoreScoreEx) { + singelWeekData := []*model.StoreScoreEx{} weekIndex := 0 for _, value := range storeScoreList { if weekIndex == 0 { @@ -566,7 +584,7 @@ func SplitToSingleWeekDataList(storeScoreList []*model.StoreScore) (weekDataList singelWeekData = append(singelWeekData, value) } else { weekDataList = append(weekDataList, singelWeekData) - singelWeekData = []*model.StoreScore{} + singelWeekData = []*model.StoreScoreEx{} weekIndex = 0 singelWeekData = append(singelWeekData, value) } diff --git a/business/model/api.go b/business/model/api.go index 79dddef04..19d026c1d 100644 --- a/business/model/api.go +++ b/business/model/api.go @@ -75,6 +75,6 @@ type OrderFinancialSkuExt struct { } type OrderPickupTime struct { - StatusTime time.Time `orm:"type(datetime)" json:"statusTime"` - PickDeadline time.Time `orm:"type(datetime)" json:"pickDeadline"` + StatusTime time.Time + PickDeadline time.Time } diff --git a/business/model/dao/store_score.go b/business/model/dao/store_score.go index dfc19fc30..87858865f 100644 --- a/business/model/dao/store_score.go +++ b/business/model/dao/store_score.go @@ -12,17 +12,12 @@ func InsertStoreScore(storeScore *model.StoreScore) error { return CreateEntity(nil, storeScore) } -func GetLatestWeeklyStoreScoreList(db *DaoDB, storeID, weekNum int) (storeScoreList []*model.StoreScore, err error) { - // sql := ` - // SET @dayInWeek = IF(DAYOFWEEK(CURDATE()) - 1 = 0, 7, DAYOFWEEK(CURDATE()) - 1); - // SET @endDate = DATE_SUB(CURDATE(), INTERVAL @dayInWeek DAY); - // SET @beginData = DATE_SUB(@endDate, INTERVAL ? DAY); - // SELECT * FROM store_score - // WHERE store_id = ? AND DATE(created_at) >= @beginData AND DATE(created_at) <= @endDate ORDER BY created_at DESC - // ` +func GetLatestWeeklyStoreScoreList(db *DaoDB, storeID, weekNum int) (storeScoreList []*model.StoreScoreEx, err error) { sql := ` - SELECT * FROM store_score WHERE store_id = ? - AND DATE(created_at) >= DATE_SUB( + SELECT t2.name store_name, t1.* FROM store_score t1 + JOIN store t2 ON t1.store_id = t2.id + WHERE store_id = ? + AND DATE(t1.created_at) >= DATE_SUB( DATE_SUB( CURDATE(), INTERVAL @@ -34,7 +29,7 @@ func GetLatestWeeklyStoreScoreList(db *DaoDB, storeID, weekNum int) (storeScoreL ), INTERVAL ? DAY ) - AND DATE(created_at) <= DATE_SUB( + AND DATE(t1.created_at) <= DATE_SUB( CURDATE(), INTERVAL IF ( diff --git a/business/model/store_score.go b/business/model/store_score.go index 13e121088..c8207a7cd 100644 --- a/business/model/store_score.go +++ b/business/model/store_score.go @@ -21,7 +21,6 @@ type StoreScore struct { ID int `orm:"column(id)" json:"id"` CreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"` StoreID int `orm:"column(store_id)" json:"storeID"` - StoreName string `orm:"column(store_name)" json:"storeName"` StoreOpenTime int `orm:"column(store_open_time)" json:"storeOpenTime"` SaleSkuCount int `orm:"column(sale_sku_count)" json:"saleSkuCount"` @@ -35,8 +34,13 @@ type StoreScore struct { SaleSkuPrice int `orm:"column(sale_sku_price)" json:"saleSkuPrice"` } -type WeeklyStoreScore struct { +type StoreScoreEx struct { StoreScore + StoreName string `json:"storeName"` +} + +type WeeklyStoreScore struct { + StoreScoreEx BeginTime time.Time `json:"beginTime"` EndTime time.Time `json:"endTime"` TotalScore int `json:"totalScore"`