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