- use MAX instead of AVG in GetStoreOpRequests for unitPrice

This commit is contained in:
gazebo
2018-12-21 10:56:30 +08:00
parent 28589c6995
commit acb073cb92

View File

@@ -259,111 +259,108 @@ func GetStoreSkus(ctx *jxcontext.Context, storeID int, isFocus bool, keyword str
}() }()
// globals.SugarLogger.Debug(sqlData, sqlParams) // globals.SugarLogger.Debug(sqlData, sqlParams)
if err = dao.GetRows(db, &skuNamesInfo.SkuNames, sqlData, sqlParams...); err == nil { if err = dao.GetRows(db, &skuNamesInfo.SkuNames, sqlData, sqlParams...); err == nil {
countInfo := &struct{ Ct int }{} skuNamesInfo.TotalCount = dao.GetLastTotalRowCount(db)
if err = dao.GetRow(db, countInfo, "SELECT FOUND_ROWS() ct"); err == nil { for _, skuName := range skuNamesInfo.SkuNames {
skuNamesInfo.TotalCount = countInfo.Ct if skuName.SkusStr != "" {
if err = utils.UnmarshalUseNumber([]byte(skuName.SkusStr), &skuName.Skus); err != nil {
dao.Rollback(db)
return nil, err
}
if len(skuName.Skus) > 0 {
skuName.UnitPrice = int(utils.MustInterface2Int64(skuName.Skus[0]["unitPrice"]))
for _, v := range skuName.Skus {
delete(v, "unitPrice")
}
} else {
skuName.UnitPrice = skuName.Price
}
}
}
if isSaleInfo {
var (
saleInfoList []*SkuSaleInfo
skuIDs []int
timeList []time.Time
fromCount, toCount int
)
saleInfoMap := make(map[int64]*SkuSaleInfo)
for _, skuName := range skuNamesInfo.SkuNames { for _, skuName := range skuNamesInfo.SkuNames {
if skuName.SkusStr != "" { for _, sku := range skuName.Skus {
if err = utils.UnmarshalUseNumber([]byte(skuName.SkusStr), &skuName.Skus); err != nil { skuIDs = append(skuIDs, int(utils.MustInterface2Int64(sku["id"])))
dao.Rollback(db)
return nil, err
}
if len(skuName.Skus) > 0 {
skuName.UnitPrice = int(utils.MustInterface2Int64(skuName.Skus[0]["unitPrice"]))
for _, v := range skuName.Skus {
delete(v, "unitPrice")
}
} else {
skuName.UnitPrice = skuName.Price
}
} }
} }
if isSaleInfo { toTimeStr := ""
var ( if params["stToTime"] != nil {
saleInfoList []*SkuSaleInfo toTimeStr = params["stToTime"].(string)
skuIDs []int }
timeList []time.Time if timeList, err = jxutils.BatchStr2Time(params["stFromTime"].(string), toTimeStr); err != nil {
fromCount, toCount int dao.Rollback(db)
) return nil, err
saleInfoMap := make(map[int64]*SkuSaleInfo) }
for _, skuName := range skuNamesInfo.SkuNames { if params["stFromCount"] != nil {
for _, sku := range skuName.Skus { fromCount = params["stFromCount"].(int)
skuIDs = append(skuIDs, int(utils.MustInterface2Int64(sku["id"]))) }
toCount = math.MaxInt32
if params["stToCount"] != nil {
toCount = params["stToCount"].(int)
}
// 不能用SQL筛除否则不能区分是没有销量还是不在条件中
if saleInfoList, err = GetStoresSkusSaleInfo(ctx, []int{storeID}, skuIDs, timeList[0], timeList[1], 0, math.MaxInt32); err != nil {
dao.Rollback(db)
return nil, err
}
for _, saleInfo := range saleInfoList {
saleInfoMap[int64(saleInfo.StoreID)*100000+int64(saleInfo.SkuID)] = saleInfo
}
storeID2 := int64(storeID) * 100000
var newSkuNames []*StoreSkuNameExt
for _, skuName := range skuNamesInfo.SkuNames {
var newSkus []map[string]interface{}
for _, sku := range skuName.Skus {
saleInfo := saleInfoMap[storeID2+utils.MustInterface2Int64(sku["id"])]
if saleInfo == nil && fromCount == 0 {
saleInfo = &SkuSaleInfo{}
}
if saleInfo != nil && saleInfo.Count >= fromCount && saleInfo.Count <= toCount {
sku["times"] = saleInfo.Times
sku["count"] = saleInfo.Count
newSkus = append(newSkus, sku)
} }
} }
toTimeStr := "" if len(newSkus) > 0 {
if params["stToTime"] != nil { skuName.Skus = newSkus
toTimeStr = params["stToTime"].(string) newSkuNames = append(newSkuNames, skuName)
}
if timeList, err = jxutils.BatchStr2Time(params["stFromTime"].(string), toTimeStr); err != nil {
dao.Rollback(db)
return nil, err
}
if params["stFromCount"] != nil {
fromCount = params["stFromCount"].(int)
}
toCount = math.MaxInt32
if params["stToCount"] != nil {
toCount = params["stToCount"].(int)
}
// 不能用SQL筛除否则不能区分是没有销量还是不在条件中
if saleInfoList, err = GetStoresSkusSaleInfo(ctx, []int{storeID}, skuIDs, timeList[0], timeList[1], 0, math.MaxInt32); err != nil {
dao.Rollback(db)
return nil, err
}
for _, saleInfo := range saleInfoList {
saleInfoMap[int64(saleInfo.StoreID)*100000+int64(saleInfo.SkuID)] = saleInfo
}
storeID2 := int64(storeID) * 100000
var newSkuNames []*StoreSkuNameExt
for _, skuName := range skuNamesInfo.SkuNames {
var newSkus []map[string]interface{}
for _, sku := range skuName.Skus {
saleInfo := saleInfoMap[storeID2+utils.MustInterface2Int64(sku["id"])]
if saleInfo == nil && fromCount == 0 {
saleInfo = &SkuSaleInfo{}
}
if saleInfo != nil && saleInfo.Count >= fromCount && saleInfo.Count <= toCount {
sku["times"] = saleInfo.Times
sku["count"] = saleInfo.Count
newSkus = append(newSkus, sku)
}
}
if len(newSkus) > 0 {
skuName.Skus = newSkus
newSkuNames = append(newSkuNames, skuName)
}
}
skuNamesInfo.TotalCount = len(newSkuNames)
skuNamesInfo.SkuNames = nil
if offset < skuNamesInfo.TotalCount {
endIndex := offset + pageSize
if endIndex > skuNamesInfo.TotalCount {
endIndex = skuNamesInfo.TotalCount
}
skuNamesInfo.SkuNames = newSkuNames[offset:endIndex]
} }
} }
if globals.EnablePendingChange { skuNamesInfo.TotalCount = len(newSkuNames)
if isGetOpRequest, ok := params["isGetOpRequest"].(bool); ok && isGetOpRequest { skuNamesInfo.SkuNames = nil
nameIDs := make([]int, len(skuNamesInfo.SkuNames)) if offset < skuNamesInfo.TotalCount {
for k, skuName := range skuNamesInfo.SkuNames { endIndex := offset + pageSize
nameIDs[k] = skuName.ID if endIndex > skuNamesInfo.TotalCount {
} endIndex = skuNamesInfo.TotalCount
pagedInfo, err2 := GetStoreOpRequests(ctx, utils.DefaultTimeValue, utils.DefaultTimeValue, "", []int{storeID}, nameIDs, nil, []int{model.RequestStatusNew}, 0, -1) }
if err = err2; err != nil { skuNamesInfo.SkuNames = newSkuNames[offset:endIndex]
return nil, err }
} }
requestList := pagedInfo.Data.([]*StoreOpRequestInfo) if globals.EnablePendingChange {
requestMap := make(map[int]*StoreOpRequestInfo) if isGetOpRequest, ok := params["isGetOpRequest"].(bool); ok && isGetOpRequest {
for _, requestOp := range requestList { nameIDs := make([]int, len(skuNamesInfo.SkuNames))
requestMap[requestOp.ItemID] = requestOp for k, skuName := range skuNamesInfo.SkuNames {
} nameIDs[k] = skuName.ID
for _, skuName := range skuNamesInfo.SkuNames { }
if requestOp := requestMap[skuName.ID]; requestOp != nil { pagedInfo, err2 := GetStoreOpRequests(ctx, utils.DefaultTimeValue, utils.DefaultTimeValue, "", []int{storeID}, nameIDs, nil, []int{model.RequestStatusNew}, 0, -1)
skuName.PendingUnitPrice = requestOp.IntParam1 if err = err2; err != nil {
skuName.PendingOpType = requestOp.Type return nil, err
} }
requestList := pagedInfo.Data.([]*StoreOpRequestInfo)
requestMap := make(map[int]*StoreOpRequestInfo)
for _, requestOp := range requestList {
requestMap[requestOp.ItemID] = requestOp
}
for _, skuName := range skuNamesInfo.SkuNames {
if requestOp := requestMap[skuName.ID]; requestOp != nil {
skuName.PendingUnitPrice = requestOp.IntParam1
skuName.PendingOpType = requestOp.Type
} }
} }
} }
@@ -1008,7 +1005,7 @@ func GetStoreOpRequests(ctx *jxcontext.Context, fromTime, toTime time.Time, keyw
SELECT SQL_CALC_FOUND_ROWS SELECT SQL_CALC_FOUND_ROWS
t1.id, t1.created_at, t1.updated_at, t1.last_operator, t1.deleted_at, t1.id, t1.created_at, t1.updated_at, t1.last_operator, t1.deleted_at,
t1.type, t1.store_id, t1.item_id, t1.status, t1.user_id, t1.int_param1, t1.int_param2, t1.type, t1.store_id, t1.item_id, t1.status, t1.user_id, t1.int_param1, t1.int_param2,
t2.name store_name, t3.prefix sku_name_prefix, t3.name sku_name_name, AVG(t5.unit_price) unit_price t2.name store_name, t3.prefix sku_name_prefix, t3.name sku_name_name, MAX(t5.unit_price) unit_price
FROM store_op_request t1 FROM store_op_request t1
JOIN store t2 ON t1.store_id = t2.id JOIN store t2 ON t1.store_id = t2.id
JOIN sku_name t3 ON t1.item_id = t3.id JOIN sku_name t3 ON t1.item_id = t3.id