diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index fe533aa25..b0fb0615c 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -63,6 +63,13 @@ type tStoreSkuBindAndSpec struct { RealSkuID int `orm:"column(real_sku_id)"` } +type SkuSaleInfo struct { + StoreID int `orm:"column(store_id)"` + SkuID int `orm:"column(sku_id)"` + Times int // 销售的次数 + Count int // 销售的总份数 +} + // 商品不可售,直接排除 // 如果门店商品是可售状态,那么会忽略区域限制。否则有区域限制 func GetStoreSkus(ctx *jxcontext.Context, storeID int, isFocus bool, keyword string, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) { @@ -230,12 +237,105 @@ func GetStoreSkus(ctx *jxcontext.Context, storeID int, isFocus bool, keyword str } } } + if params["stFromTime"] != nil { + 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) + // } + // if params["stToCount"] != nil { + // toCount = params["stToCount"].(int) + // } + if saleInfoList, err = GetStoresSkusSaleInfo(ctx, []int{storeID}, skuIDs, timeList[0], timeList[1], fromCount, toCount); 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 { + saleInfo = &SkuSaleInfo{} + // newSkus = append(newSkus, sku) + } + sku["times"] = saleInfo.Times + sku["count"] = saleInfo.Count + } + // skuName.Skus = newSkus + // if len(newSkus) > 0 { + // newSkuNames = append(newSkuNames, skuName) + // } + } + // skuNamesInfo.SkuNames = newSkuNames + } } } dao.Commit(db) return skuNamesInfo, err } +func GetStoresSkusSaleInfo(ctx *jxcontext.Context, storeIDs []int, skuIDs []int, fromTime, toTime time.Time, fromCount, toCount int) (saleInfoList []*SkuSaleInfo, err error) { + db := dao.GetDB() + sql := ` + SELECT IF(t2.jx_store_id <> 0, jx_store_id, store_id) store_id, t1.sku_id, COUNT(*) times, SUM(count) count + FROM order_sku t1 + JOIN goods_order t2 ON t1.vendor_order_id = t2.vendor_order_id AND t1.vendor_id = t2.vendor_id AND t2.status IN (?, ?) + WHERE t1.order_created_at >= ? AND t1.order_created_at <= ? + AND IF(t2.jx_store_id <> 0, jx_store_id, store_id) IN (` + dao.GenQuestionMarks(len(storeIDs)) + `) + AND IF(t1.jx_sku_id <> 0, t1.jx_sku_id, t1.sku_id) IN (` + dao.GenQuestionMarks(len(skuIDs)) + `) + ` + if jxutils.IsTimeEmpty(toTime) { + toTime = time.Now() + } + sqlParams := []interface{}{ + model.OrderStatusDelivered, + model.OrderStatusFinished, + fromTime, + toTime, + storeIDs, + skuIDs, + } + if fromCount > 0 { + sql += " AND times >= ?" + sqlParams = append(sqlParams, fromCount) + } + if toCount > 0 { + sql += " AND times <= ?" + sqlParams = append(sqlParams, toCount) + } + sql += " GROUP BY 1,2" + // fmt.Println(sql) + // fmt.Println(utils.Format4Output(sqlParams, false)) + if err = dao.GetRows(db, &saleInfoList, sql, sqlParams...); err == nil { + // globals.SugarLogger.Debug(utils.Format4Output(saleInfoList, false)) + return saleInfoList, nil + } + return nil, err +} + func UpdateStoreSku(ctx *jxcontext.Context, storeID int, skuBindInfo *StoreSkuBindInfo) (num int64, err error) { return UpdateStoreSkus(ctx, storeID, []*StoreSkuBindInfo{skuBindInfo}) } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index 8e93048d6..9baab8279 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -362,3 +362,21 @@ func IsLegalMobileNumber(num int64) bool { func TrimDecorationChar(value string) string { return strings.Trim(value, " \t\n[]()【】()-_——") } + +func BatchStr2Time(strTime ...string) (timeList []time.Time, err error) { + timeList = make([]time.Time, len(strTime)) + for k, v := range strTime { + if v == "" { + timeList[k] = utils.DefaultTimeValue + } else { + if timeList[k], err = utils.TryStr2Time(v); err != nil { + return nil, err + } + } + } + return timeList, nil +} + +func IsTimeEmpty(timeValue time.Time) bool { + return (timeValue == utils.DefaultTimeValue || timeValue == utils.ZeroTimeValue) +} diff --git a/controllers/cms_store_sku.go b/controllers/cms_store_sku.go index 441a8ddc4..1e4b08fb8 100644 --- a/controllers/cms_store_sku.go +++ b/controllers/cms_store_sku.go @@ -1,8 +1,11 @@ package controllers import ( + "time" + "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxstore/cms" + "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/model/dao" "github.com/astaxie/beego" ) @@ -11,6 +14,9 @@ type StoreSkuController struct { beego.Controller } +// @Param stFromCount query int false "统计SKU,结果集起始数量(包括)" +// @Param stToToCount query int false "统计SKU,结果集结束数量(包括)" + // @Title 得到商家商品信息 // @Description 得到商家商品信息,如下条件之间是与的关系。对于没有认领的商品,按城市限制。但对于已经认领的商品就不限制了,因为已经在平台上可售,可以操作(改价等等) // @Param token header string true "认证token" @@ -26,6 +32,8 @@ type StoreSkuController struct { // @Param jdID query int false "商品京东ID" // @Param fromStatus query int false "查询起始状态(0:不可售,1:可售)" // @Param toStatus query int false "查询结束状态(0:不可售,1:可售)" +// @Param stFromTime query string false "统计SKU开始时间" +// @Param stToTime query string false "统计SKU结束时间" // @Param offset query int false "门店列表起始序号(以0开始,缺省为0)" // @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)" // @Success 200 {object} controllers.CallResult @@ -167,3 +175,38 @@ func (c *StoreSkuController) UpdateStoresSkusSale() { return retVal, "", err }) } + +// @Title 得到商家商品销售情况 +// @Description 得到商家商品销售情况 +// @Param token header string true "认证token" +// @Param storeIDs query string true "门店ID列表" +// @Param skuIDs query string true "Sku ID列表" +// @Param stFromTime query string true "统计SKU开始时间" +// @Param stToTime query string false "统计SKU结束时间" +// @Param stFromCount query int false "统计SKU,结果集起始数量(包括)" +// @Param stToToCount query int false "统计SKU,结果集结束数量(包括)" +// @Param offset query int false "门店列表起始序号(以0开始,缺省为0)" +// @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetStoresSkusSaleInfo [get] +func (c *StoreSkuController) GetStoresSkusSaleInfo() { + c.callGetStoresSkusSaleInfo(func(params *tStoreSkuGetStoresSkusSaleInfoParams) (retVal interface{}, errCode string, err error) { + var ( + storeIDs []int + skuIDs []int + timeList []time.Time + ) + if err = utils.UnmarshalUseNumber([]byte(params.StoreIDs), &storeIDs); err != nil { + return retVal, "", err + } + if err = utils.UnmarshalUseNumber([]byte(params.SkuIDs), &skuIDs); err != nil { + return retVal, "", err + } + if timeList, err = jxutils.BatchStr2Time(params.StFromTime, params.StToTime); err != nil { + return retVal, "", err + } + retVal, err = cms.GetStoresSkusSaleInfo(params.Ctx, storeIDs, skuIDs, timeList[0], timeList[1], params.StFromCount, params.StToToCount) + return retVal, "", err + }) +} diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index c0fe752bc..0fc497a30 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -559,6 +559,14 @@ func init() { MethodParams: param.Make(), Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], + beego.ControllerComments{ + Method: "GetStoresSkusSaleInfo", + Router: `/GetStoresSkusSaleInfo`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"], beego.ControllerComments{ Method: "SyncStoresSkus",