From acb073cb921bd5f45750b1efeafdb2bb34fb5e86 Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 21 Dec 2018 10:56:30 +0800 Subject: [PATCH] - use MAX instead of AVG in GetStoreOpRequests for unitPrice --- business/jxstore/cms/store_sku.go | 195 +++++++++++++++--------------- 1 file changed, 96 insertions(+), 99 deletions(-) diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index 69305b6a2..125015b54 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -259,111 +259,108 @@ func GetStoreSkus(ctx *jxcontext.Context, storeID int, isFocus bool, keyword str }() // globals.SugarLogger.Debug(sqlData, sqlParams) if err = dao.GetRows(db, &skuNamesInfo.SkuNames, sqlData, sqlParams...); err == nil { - countInfo := &struct{ Ct int }{} - if err = dao.GetRow(db, countInfo, "SELECT FOUND_ROWS() ct"); err == nil { - skuNamesInfo.TotalCount = countInfo.Ct + skuNamesInfo.TotalCount = dao.GetLastTotalRowCount(db) + for _, skuName := range skuNamesInfo.SkuNames { + 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 { - 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 - } + for _, sku := range skuName.Skus { + skuIDs = append(skuIDs, int(utils.MustInterface2Int64(sku["id"]))) } } - if isSaleInfo { - var ( - saleInfoList []*SkuSaleInfo - skuIDs []int - timeList []time.Time - fromCount, toCount int - ) - saleInfoMap := make(map[int64]*SkuSaleInfo) - for _, skuName := range skuNamesInfo.SkuNames { - for _, sku := range skuName.Skus { - skuIDs = append(skuIDs, int(utils.MustInterface2Int64(sku["id"]))) + toTimeStr := "" + if params["stToTime"] != nil { + toTimeStr = params["stToTime"].(string) + } + 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) } } - toTimeStr := "" - if params["stToTime"] != nil { - toTimeStr = params["stToTime"].(string) - } - 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 len(newSkus) > 0 { + skuName.Skus = newSkus + newSkuNames = append(newSkuNames, skuName) } } - if globals.EnablePendingChange { - if isGetOpRequest, ok := params["isGetOpRequest"].(bool); ok && isGetOpRequest { - nameIDs := make([]int, len(skuNamesInfo.SkuNames)) - for k, skuName := range skuNamesInfo.SkuNames { - nameIDs[k] = skuName.ID - } - pagedInfo, err2 := GetStoreOpRequests(ctx, utils.DefaultTimeValue, utils.DefaultTimeValue, "", []int{storeID}, nameIDs, nil, []int{model.RequestStatusNew}, 0, -1) - if err = err2; err != nil { - 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 - } + 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 { + if isGetOpRequest, ok := params["isGetOpRequest"].(bool); ok && isGetOpRequest { + nameIDs := make([]int, len(skuNamesInfo.SkuNames)) + for k, skuName := range skuNamesInfo.SkuNames { + nameIDs[k] = skuName.ID + } + pagedInfo, err2 := GetStoreOpRequests(ctx, utils.DefaultTimeValue, utils.DefaultTimeValue, "", []int{storeID}, nameIDs, nil, []int{model.RequestStatusNew}, 0, -1) + if err = err2; err != nil { + 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 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, - 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 JOIN store t2 ON t1.store_id = t2.id JOIN sku_name t3 ON t1.item_id = t3.id