177 lines
6.0 KiB
Go
177 lines
6.0 KiB
Go
package misc
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"math"
|
|
"sync"
|
|
|
|
"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"
|
|
)
|
|
|
|
const (
|
|
DayNum = 30 //请求天数
|
|
LimitNum = 100 //最大数据限制
|
|
)
|
|
|
|
func GetStoreSkuSalesInfo(ctx *jxcontext.Context, storeID int) (outStoreSkuSales []*model.StoreSkuSales, err error) {
|
|
db := dao.GetDB()
|
|
//得到所有门店
|
|
storeList, err := GetStoreList(ctx)
|
|
if err == nil {
|
|
storeList = GetFilterStoreListEx(storeList, nil)
|
|
} else {
|
|
return nil, err
|
|
}
|
|
storeMapData := make(map[int]*cms.StoreExt)
|
|
for _, value := range storeList {
|
|
storeMapData[value.ID] = value
|
|
}
|
|
curStoreInfo := storeMapData[storeID]
|
|
if curStoreInfo == nil {
|
|
return nil, errors.New(fmt.Sprintf("未找到商店:[%d]", storeID))
|
|
}
|
|
cityCode := curStoreInfo.CityCode
|
|
|
|
//获取本市商品总销量
|
|
citySkuSalesCntMap := make(map[int]int)
|
|
citySkuSalesCntList, err := dao.GetSkuSalesCntList(db, -1, cityCode, DayNum, LimitNum, nil)
|
|
citySkuIDs := []int{}
|
|
if err == nil {
|
|
for _, value := range citySkuSalesCntList {
|
|
citySkuSalesCntMap[value.SkuID] = value.Count
|
|
citySkuIDs = append(citySkuIDs, value.SkuID)
|
|
}
|
|
} else {
|
|
return nil, err
|
|
}
|
|
|
|
//获取本店商品总销量
|
|
storeSkuSalesCntMap := make(map[int]int)
|
|
storeSkuSalesCntList, err := dao.GetSkuSalesCntList(db, storeID, cityCode, DayNum, -1, citySkuIDs)
|
|
if err == nil {
|
|
for _, value := range storeSkuSalesCntList {
|
|
storeSkuSalesCntMap[value.SkuID] = value.Count
|
|
}
|
|
} else {
|
|
return nil, err
|
|
}
|
|
|
|
//获取本店商品差评数量
|
|
storeSkuBadCommentCntMap := make(map[int]int)
|
|
storeSkuBadCommentCntList, err := dao.GetSkuBadCommentCntList(db, storeID, DayNum)
|
|
if err == nil {
|
|
for _, value := range storeSkuBadCommentCntList {
|
|
storeSkuBadCommentCntMap[value.SkuID] = value.Count
|
|
}
|
|
} else {
|
|
return nil, err
|
|
}
|
|
|
|
//得到当前门店商品数据
|
|
storeSkuMapData := make(map[int]*dao.StoreSkuNameExt)
|
|
storeSkuData, err := cms.GetStoreSkus(ctx, storeID, citySkuIDs, true, "", true, false, map[string]interface{}{}, 0, -1)
|
|
if err == nil {
|
|
for _, value := range storeSkuData.SkuNames {
|
|
for _, skuInfo := range value.Skus {
|
|
storeSkuMapData[skuInfo.SkuID] = value
|
|
}
|
|
}
|
|
} else {
|
|
return nil, err
|
|
}
|
|
|
|
//得到5KM内的所有门店
|
|
rangeStoreList := GetRangeStoreList(storeID, curStoreInfo.FloatLng, curStoreInfo.FloatLat, SaleSkuCheckRange, storeList)
|
|
|
|
//得到5KM内的所有门店的商品的价格
|
|
allStoreSkus := make(map[int]map[int]int)
|
|
var locker sync.RWMutex
|
|
taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
|
|
storeInfo := batchItemList[0].(*cms.StoreExt)
|
|
storeID := storeInfo.ID
|
|
jxSkuInfoData, err := cms.GetStoreSkus(ctx, storeID, citySkuIDs, true, "", true, false, map[string]interface{}{}, 0, -1)
|
|
jxSkuPriceMapData := make(map[int]int)
|
|
for _, value := range jxSkuInfoData.SkuNames {
|
|
for _, skuInfo := range value.Skus {
|
|
jxSkuPriceMapData[skuInfo.SkuID] = skuInfo.BindPrice
|
|
}
|
|
}
|
|
locker.Lock()
|
|
defer locker.Unlock()
|
|
allStoreSkus[storeID] = jxSkuPriceMapData
|
|
return retVal, err
|
|
}
|
|
taskParallel := tasksch.NewParallelTask("得到所有门店商品", nil, ctx, taskFunc, rangeStoreList)
|
|
taskParallel.Run()
|
|
_, err = taskParallel.GetResult(0)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
//计算商品的平均价格
|
|
skusTotalPrice := make(map[int]int)
|
|
skusCount := make(map[int]int)
|
|
skusAveragePrice := make(map[int]int)
|
|
for _, storeInfo := range rangeStoreList {
|
|
storeID := storeInfo.ID
|
|
storeSkuMapData := allStoreSkus[storeID]
|
|
for skuID, skuPrice := range storeSkuMapData {
|
|
skusTotalPrice[skuID] += skuPrice
|
|
skusCount[skuID]++
|
|
}
|
|
}
|
|
for id, totalPrice := range skusTotalPrice {
|
|
skusAveragePrice[id] = int(math.Round(float64(totalPrice) / float64(skusCount[id])))
|
|
}
|
|
|
|
//输出商品销量统计结果
|
|
skuAndNameMapData := make(map[int]*model.SkuAndName)
|
|
if len(storeSkuMapData) < len(citySkuIDs) {
|
|
skuAndNameList, err := dao.GetSkus(db, citySkuIDs, nil, nil, nil, nil)
|
|
if err == nil {
|
|
for _, value := range skuAndNameList {
|
|
skuAndNameMapData[value.ID] = value
|
|
}
|
|
}
|
|
}
|
|
for _, value := range citySkuSalesCntList {
|
|
skuID := value.SkuID
|
|
storeSkuSales := &model.StoreSkuSales{}
|
|
storeSkuSales.SkuID = skuID
|
|
storeSkuInfo := storeSkuMapData[skuID]
|
|
skuAndNameInfo := skuAndNameMapData[skuID]
|
|
if storeSkuInfo != nil {
|
|
skuName := storeSkuInfo.SkuName
|
|
skuInfo := storeSkuInfo.Skus[0]
|
|
storeSkuSales.SkuName = jxutils.ComposeSkuName(skuName.Prefix, skuName.Name, skuInfo.Comment, skuName.Unit, skuInfo.SkuSpecQuality, skuInfo.SkuSpecUnit, 0, skuName.ExPrefix, skuName.ExPrefixBegin, skuName.ExPrefixEnd)
|
|
storeSkuSales.SkuImage = storeSkuInfo.Img
|
|
storeSkuSales.SkuPrice = jxutils.IntPrice2StandardCurrencyString(int64(storeSkuInfo.Skus[0].BindPrice))
|
|
} else if skuAndNameInfo != nil {
|
|
skuNameList, err := dao.GetSkuNames(db, []int{skuAndNameInfo.NameID})
|
|
prefix := ""
|
|
if err == nil && len(skuNameList) > 0 {
|
|
storeSkuSales.SkuImage = skuNameList[0].Img
|
|
prefix = skuNameList[0].Prefix
|
|
}
|
|
storeSkuSales.SkuName = jxutils.ComposeSkuName(prefix, skuAndNameInfo.Name, skuAndNameInfo.Comment, skuAndNameInfo.Unit, skuAndNameInfo.SpecQuality, skuAndNameInfo.SpecUnit, 0, skuAndNameInfo.ExPrefix, skuAndNameInfo.ExPrefixBegin, skuAndNameInfo.ExPrefixEnd)
|
|
storeSkuSales.SkuPrice = "N/A"
|
|
} else {
|
|
storeSkuSales.SkuName = "N/A"
|
|
storeSkuSales.SkuPrice = "N/A"
|
|
}
|
|
storeSkuSales.SkuAvgPrice = jxutils.IntPrice2StandardCurrencyString(int64(skusAveragePrice[skuID]))
|
|
storeSkuSales.BadCommentCnt = storeSkuBadCommentCntMap[skuID]
|
|
storeSkuSales.StoreSkuSalesCnt = storeSkuSalesCntMap[skuID]
|
|
storeSkuSales.CitySkuSalesCnt = citySkuSalesCntMap[skuID]
|
|
outStoreSkuSales = append(outStoreSkuSales, storeSkuSales)
|
|
}
|
|
|
|
return outStoreSkuSales, err
|
|
}
|