diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index d701e2d4f..9749ca1f2 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -37,27 +37,6 @@ const ( CopyStoreSkuModeUpdatePrice = "updatePrice" // 增量复制价格 ) -// GetStoreSkus用 -type StoreSkuNameExt struct { - StoreID int `orm:"column(store_id)" json:"storeID"` - StoreName string `json:"storeName"` - - model.SkuName - PayPercentage int `json:"-"` - UnitPrice int `json:"unitPrice"` - Skus []*dao.StoreSkuExt `orm:"-" json:"skus,omitempty"` - SkusStr string `json:"-"` - - PendingOpType int8 `json:"pendingOpType"` // 取值同 StoreOpRequest.Type - PendingUnitPrice int `json:"pendingUnitPrice"` // 这个是待审核的价格申请 -} - -// GetStoreSkus用 -type StoreSkuNamesInfo struct { - TotalCount int `json:"totalCount"` - SkuNames []*StoreSkuNameExt `json:"skuNames"` -} - // UpdateStoreSku用,API调用时 type StoreSkuBindSkuInfo struct { SkuID int `json:"skuID"` @@ -169,7 +148,7 @@ var ( dataLock DataLock ) -func GetStoreSkus(ctx *jxcontext.Context, storeID int, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { +func GetStoreSkus(ctx *jxcontext.Context, storeID int, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) { return GetStoresSkus(ctx, []int{storeID}, skuIDs, isFocus, keyword, isBySku, isAct, params, offset, pageSize) } @@ -353,11 +332,11 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool return sql, sqlParams, err } -func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { +func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) { return GetStoresSkusNew(ctx, storeIDs, skuIDs, isFocus, keyword, isBySku, isAct, params, offset, pageSize) } -func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { +func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku, isAct bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *dao.StoreSkuNamesInfo, err error) { if !isFocus && !isBySku && (len(storeIDs) > 1 || len(storeIDs) == 0) { return nil, fmt.Errorf("未关注按SkuName只能查询单店") } @@ -396,7 +375,7 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bo catOrderBy = "t2.seq, " } - skuNamesInfo = &StoreSkuNamesInfo{} + skuNamesInfo = &dao.StoreSkuNamesInfo{} if !isBySku && sqlPageSize != model.UnlimitedPageSize { sql2 := ` SELECT SQL_CALC_FOUND_ROWS @@ -456,12 +435,12 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bo } dao.Commit(db) globals.SugarLogger.Debugf("GetStoresSkusNew get result2:%v", time.Now().Sub(beginTime)) - storeNameMap := make(map[int64]*StoreSkuNameExt) + storeNameMap := make(map[int64]*dao.StoreSkuNameExt) for _, v := range tmpList { - var storeName *StoreSkuNameExt + var storeName *dao.StoreSkuNameExt index := jxutils.Combine2Int(v.StoreID, v.ID) if isBySku || storeNameMap[index] == nil { - storeName = &StoreSkuNameExt{ + storeName = &dao.StoreSkuNameExt{ StoreID: v.StoreID, StoreName: v.StoreName, SkuName: v.SkuName, @@ -488,7 +467,7 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bo storeIDs, skuIDs = GetStoreAndSkuIDsFromInfo(skuNamesInfo) } beginTime := time.Now() - err = updateActPrice4StoreSkuNameNew(db, storeIDs, skuIDs, skuNamesInfo, actVendorID) + err = dao.UpdateActPrice4StoreSkuNameNew(db, storeIDs, skuIDs, skuNamesInfo, actVendorID) globals.SugarLogger.Debugf("GetStoresSkusNew updateActPrice4StoreSkuName:%v", time.Now().Sub(beginTime)) if !isFocus { err = updateUnitPrice4StoreSkuNameNew(db, skuNamesInfo) @@ -499,7 +478,7 @@ func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bo return skuNamesInfo, err } -func GetStoreAndSkuIDsFromInfo(skuNamesInfo *StoreSkuNamesInfo) (storeIDs, skuIDs []int) { +func GetStoreAndSkuIDsFromInfo(skuNamesInfo *dao.StoreSkuNamesInfo) (storeIDs, skuIDs []int) { storeIDMap := make(map[int]int) skuIDMap := make(map[int]int) for _, skuName := range skuNamesInfo.SkuNames { @@ -512,7 +491,7 @@ func GetStoreAndSkuIDsFromInfo(skuNamesInfo *StoreSkuNamesInfo) (storeIDs, skuID } // 根据已经部分关注的商品,得到已经存在的门店商品单价 -func updateUnitPrice4StoreSkuNameNew(db *dao.DaoDB, skuNamesInfo *StoreSkuNamesInfo) (err error) { +func updateUnitPrice4StoreSkuNameNew(db *dao.DaoDB, skuNamesInfo *dao.StoreSkuNamesInfo) (err error) { storeIDMap := make(map[int]int) skuNameIDMap := make(map[int]int) for _, skuName := range skuNamesInfo.SkuNames { @@ -534,49 +513,7 @@ func updateUnitPrice4StoreSkuNameNew(db *dao.DaoDB, skuNamesInfo *StoreSkuNamesI return err } -// skuIDs为空,会导致性能极低,所以要skuIDs必须有值 -func updateActPrice4StoreSkuNameNew(db *dao.DaoDB, storeIDs, skuIDs []int, skuNamesInfo *StoreSkuNamesInfo, actVendorID int) (err error) { - if len(skuIDs) == 0 { - return nil - } - var vendorIDs []int - if actVendorID >= 0 { - vendorIDs = []int{actVendorID} - } - actStoreSkuList, err := dao.GetEffectiveActStoreSkuInfo(db, 0, vendorIDs, storeIDs, skuIDs, time.Now(), time.Now()) - if err != nil { - globals.SugarLogger.Errorf("updateActPrice4StoreSkuNameNew can not get sku promotion info for error:%v", err) - return err - } - actStoreSkuMap4Act := jxutils.NewActStoreSkuMap(actStoreSkuList, true) - actStoreSkuMap4EarningPrice := jxutils.NewActStoreSkuMap(actStoreSkuList, false) - - for _, skuName := range skuNamesInfo.SkuNames { - if len(skuName.Skus) > 0 { - for _, v := range skuName.Skus { - if actStoreSku := actStoreSkuMap4Act.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil { - v.ActPrice = int(actStoreSku.ActualActPrice) - v.ActID = actStoreSku.ActID - v.ActType = actStoreSku.Type - } - if actStoreSku := actStoreSkuMap4EarningPrice.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil { - v.EarningPrice = int(actStoreSku.EarningPrice) - v.EarningActID = actStoreSku.ActID - } - - v.RealEarningPrice = v.EarningPrice - if v.RealEarningPrice == 0 { - v.RealEarningPrice = int(jxutils.CaculateSkuEarningPrice(int64(v.BindPrice), int64(v.BindPrice), skuName.PayPercentage)) - } - } - } else { - skuName.UnitPrice = skuName.Price - } - } - return err -} - -func updateSaleInfo4StoreSkuName(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs, skuIDs []int, params map[string]interface{}, skuNamesInfo *StoreSkuNamesInfo, offset, pageSize int) (err error) { +func updateSaleInfo4StoreSkuName(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs, skuIDs []int, params map[string]interface{}, skuNamesInfo *dao.StoreSkuNamesInfo, offset, pageSize int) (err error) { var ( saleInfoList []*SkuSaleInfo timeList []time.Time @@ -605,7 +542,7 @@ func updateSaleInfo4StoreSkuName(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs for _, saleInfo := range saleInfoList { saleInfoMap[jxutils.Combine2Int(saleInfo.StoreID, saleInfo.SkuID)] = saleInfo } - var newSkuNames []*StoreSkuNameExt + var newSkuNames []*dao.StoreSkuNameExt for _, skuName := range skuNamesInfo.SkuNames { var newSkus []*dao.StoreSkuExt for _, sku := range skuName.Skus { @@ -2141,16 +2078,16 @@ func ReCalculateJxPrice(ctx *jxcontext.Context, storeIDs []int) (err error) { return err } -func GetTopSkusByStoreIDs(ctx *jxcontext.Context, storeIDs []int) (skuAndNameExt []*dao.SkuAndNameExt, err error) { +func GetTopSkusByStoreIDs(ctx *jxcontext.Context, storeIDs []int) (storeSkuNameExt []*dao.StoreSkuNameExt, err error) { if len(storeIDs) == 0 { - return skuAndNameExt, err + return storeSkuNameExt, err } db := dao.GetDB() - skuAndNameExt, err = dao.GetTopSkusByStoreIDs(db, storeIDs) + storeSkuNameExt, err = dao.GetTopSkusByStoreIDs(db, storeIDs) if err != nil { return nil, err } - return skuAndNameExt, err + return storeSkuNameExt, err } func GetTopCategorysByStoreIDs(ctx *jxcontext.Context, storeIDs []int) (skuCategory []*model.SkuCategory, err error) { diff --git a/business/jxstore/cms/store_sku_check.go b/business/jxstore/cms/store_sku_check.go index 5e0aa1eda..947688040 100644 --- a/business/jxstore/cms/store_sku_check.go +++ b/business/jxstore/cms/store_sku_check.go @@ -224,8 +224,8 @@ func GetMultiStoreAllSkuInfo(ctx *jxcontext.Context, vendorMap map[int]bool) { } } -func GetFilterJxSkuInfoMap(jxSkuInfoList []*StoreSkuNameExt) map[int]*StoreSkuNameExt { - filterJxSkuInfoMap := make(map[int]*StoreSkuNameExt) +func GetFilterJxSkuInfoMap(jxSkuInfoList []*dao.StoreSkuNameExt) map[int]*dao.StoreSkuNameExt { + filterJxSkuInfoMap := make(map[int]*dao.StoreSkuNameExt) for _, value := range jxSkuInfoList { for _, skuInfo := range value.Skus { filterJxSkuInfoMap[skuInfo.SkuID] = value @@ -322,7 +322,7 @@ func IsSkuCanSale(saleStatus int) bool { //京西平台和其他平台商品的对比 //storeIDStr 京西商家id ,vendorStoreID 平台商家id -func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName string, filterJxSkuInfoMap map[int]*StoreSkuNameExt, filterVendorSkuInfoMap map[int]*partner.SkuNameInfo) { +func CompareJxAndVendor(vendorID int, storeIDStr, vendorStoreID, storeName string, filterJxSkuInfoMap map[int]*dao.StoreSkuNameExt, filterVendorSkuInfoMap map[int]*partner.SkuNameInfo) { for skuID, jxSkuInfo := range filterJxSkuInfoMap { skuIDStr := utils.Int2Str(skuID) var jxSkuDetailName string @@ -542,11 +542,11 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int, storeID := jxStoreInfoListValue.ID storeIDStr := utils.Int2Str(storeID) storeName := jxStoreInfoListValue.Name - jxSkuInfoDataSingle := &StoreSkuNamesInfo{} - jxSkuInfoDataMulti := &StoreSkuNamesInfo{} + jxSkuInfoDataSingle := &dao.StoreSkuNamesInfo{} + jxSkuInfoDataMulti := &dao.StoreSkuNamesInfo{} if jxStoreInfoListValue.StoreMaps != nil { - var filterJxSkuInfoMapSingle map[int]*StoreSkuNameExt - var filterJxSkuInfoMapMulti map[int]*StoreSkuNameExt + var filterJxSkuInfoMapSingle map[int]*dao.StoreSkuNameExt + var filterJxSkuInfoMapMulti map[int]*dao.StoreSkuNameExt for _, vendorListValue := range jxStoreInfoListValue.StoreMaps { vendorID := int(utils.MustInterface2Int64(vendorListValue["vendorID"])) var flag = false diff --git a/business/jxstore/misc/store_sku_sales.go b/business/jxstore/misc/store_sku_sales.go index e4de9b4ac..ca0dfc7fe 100644 --- a/business/jxstore/misc/store_sku_sales.go +++ b/business/jxstore/misc/store_sku_sales.go @@ -74,7 +74,7 @@ func GetStoreSkuSalesInfo(ctx *jxcontext.Context, storeID int) (outStoreSkuSales } //得到当前门店商品数据 - storeSkuMapData := make(map[int]*cms.StoreSkuNameExt) + 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 { diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index 41f274e22..c5711ae7f 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -6,8 +6,10 @@ import ( "strings" "time" - "git.rosy.net.cn/baseapi/utils" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model" + + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/globals" ) @@ -109,10 +111,25 @@ type StoreSkuNameInfo struct { UnitPrice int64 } -type SkuAndNameExt struct { - SkuID int `orm:"column(sku_id)" json:"skuID"` +// GetStoreSkus用 +type StoreSkuNameExt struct { + StoreID int `orm:"column(store_id)" json:"storeID"` + StoreName string `json:"storeName"` + model.SkuName - Skus []*StoreSkuExt `orm:"-" json:"skus,omitempty"` + PayPercentage int `json:"-"` + UnitPrice int `json:"unitPrice"` + Skus []*StoreSkuExt `orm:"-" json:"skus,omitempty"` + SkusStr string `json:"-"` + + PendingOpType int8 `json:"pendingOpType"` // 取值同 StoreOpRequest.Type + PendingUnitPrice int `json:"pendingUnitPrice"` // 这个是待审核的价格申请 +} + +// GetStoreSkus用 +type StoreSkuNamesInfo struct { + TotalCount int `json:"totalCount"` + SkuNames []*StoreSkuNameExt `json:"skuNames"` } type StoreSkuExt struct { @@ -896,16 +913,17 @@ func GetStoreSkusByNameIDs(db *DaoDB, storeIDs []int, nameID int) (skuList []*St return skuList, err } -func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (skuAndNameExt []*SkuAndNameExt, err error) { +func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (storeSkuNameExt []*StoreSkuNameExt, err error) { sql := ` SELECT t2.id sku_id,t3.* FROM( - SELECT SUM(b.count) count,c.id + SELECT SUM(b.count) count,c.id,a.store_id,d.name store_name FROM goods_order a JOIN order_sku b ON a.vendor_order_id = b.vendor_order_id AND a.vendor_id = b.vendor_id JOIN sku c ON b.sku_id = c.id AND c.deleted_at = ? JOIN sku_name t1 ON t1.id = c.name_id AND t1.deleted_at = ? STRAIGHT_JOIN store_sku_bind t4 ON t4.store_id = IF(a.store_id = 0,a.jx_store_id,a.store_id) AND t4.sku_id = b.sku_id AND t4.status = ? AND t4.deleted_at = ? + JOIN store d ON d.id = a.store_id WHERE 1=1 AND a.order_created_at BETWEEN ? and NOW() ` @@ -922,18 +940,21 @@ func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (skuAndNameExt []*SkuAndNam } sql += ` AND b.sale_price > ? - GROUP BY 2)t1 + GROUP BY 2,3,4)t1 JOIN sku t2 ON t2.id = t1.id JOIN sku_name t3 ON t3.id = t2.name_id ORDER BY t1.count DESC LIMIT ? ` sqlParams = append(sqlParams, 100, 30) - err = GetRows(db, &skuAndNameExt, sql, sqlParams...) - for _, v := range skuAndNameExt { + err = GetRows(db, &storeSkuNameExt, sql, sqlParams...) + var skuNamesInfo = &StoreSkuNamesInfo{ + SkuNames: storeSkuNameExt, + } + for _, v := range storeSkuNameExt { var skus []*StoreSkuExt sql2 := ` - SELECT a.*,t4.created_at bind_created_at, t4.updated_at bind_updated_at, t4.last_operator bind_last_operator, t4.deleted_at bind_deleted_at, + SELECT a.id sku_id,a.*,t4.created_at bind_created_at, t4.updated_at bind_updated_at, t4.last_operator bind_last_operator, t4.deleted_at bind_deleted_at, t4.sub_store_id, t4.price bind_price, IF(t4.unit_price IS NOT NULL, t4.unit_price, t1.price) unit_price, t4.status store_sku_status, t4.auto_sale_at, t4.ebai_id, t4.mtwm_id, t4.ebai_sync_status, t4.mtwm_sync_status, @@ -947,7 +968,7 @@ func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (skuAndNameExt []*SkuAndNam sqlParams2 := []interface{}{ utils.DefaultTimeValue, utils.DefaultTimeValue, - v.SkuID, + v.Skus[0].SkuID, utils.DefaultTimeValue, } if len(storeIDs) > 0 { @@ -956,8 +977,9 @@ func GetTopSkusByStoreIDs(db *DaoDB, storeIDs []int) (skuAndNameExt []*SkuAndNam } err = GetRows(db, &skus, sql2, sqlParams2...) v.Skus = skus + err = UpdateActPrice4StoreSkuNameNew(db, storeIDs, []int{v.Skus[0].SkuID}, skuNamesInfo, -1) } - return skuAndNameExt, err + return storeSkuNameExt, err } func GetTopCategorysByStoreIDs(db *DaoDB, storeIDs []int) (skuCategory []*model.SkuCategory, err error) { @@ -1086,3 +1108,45 @@ func SetStoreCatMapSyncStatus(storeCatMap *model.StoreSkuCategoryMap, vendorID i storeCatMap.EbaiSyncStatus = syncStatus } } + +// skuIDs为空,会导致性能极低,所以要skuIDs必须有值 +func UpdateActPrice4StoreSkuNameNew(db *DaoDB, storeIDs, skuIDs []int, skuNamesInfo *StoreSkuNamesInfo, actVendorID int) (err error) { + if len(skuIDs) == 0 { + return nil + } + var vendorIDs []int + if actVendorID >= 0 { + vendorIDs = []int{actVendorID} + } + actStoreSkuList, err := GetEffectiveActStoreSkuInfo(db, 0, vendorIDs, storeIDs, skuIDs, time.Now(), time.Now()) + if err != nil { + globals.SugarLogger.Errorf("updateActPrice4StoreSkuNameNew can not get sku promotion info for error:%v", err) + return err + } + actStoreSkuMap4Act := jxutils.NewActStoreSkuMap(actStoreSkuList, true) + actStoreSkuMap4EarningPrice := jxutils.NewActStoreSkuMap(actStoreSkuList, false) + + for _, skuName := range skuNamesInfo.SkuNames { + if len(skuName.Skus) > 0 { + for _, v := range skuName.Skus { + if actStoreSku := actStoreSkuMap4Act.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil { + v.ActPrice = int(actStoreSku.ActualActPrice) + v.ActID = actStoreSku.ActID + v.ActType = actStoreSku.Type + } + if actStoreSku := actStoreSkuMap4EarningPrice.GetActStoreSku(skuName.StoreID, v.SkuID, -1); actStoreSku != nil { + v.EarningPrice = int(actStoreSku.EarningPrice) + v.EarningActID = actStoreSku.ActID + } + + v.RealEarningPrice = v.EarningPrice + if v.RealEarningPrice == 0 { + v.RealEarningPrice = int(jxutils.CaculateSkuEarningPrice(int64(v.BindPrice), int64(v.BindPrice), skuName.PayPercentage)) + } + } + } else { + skuName.UnitPrice = skuName.Price + } + } + return err +}