- GetStoresSkusSaleInfo
This commit is contained in:
@@ -63,6 +63,13 @@ type tStoreSkuBindAndSpec struct {
|
|||||||
RealSkuID int `orm:"column(real_sku_id)"`
|
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) {
|
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)
|
dao.Commit(db)
|
||||||
return skuNamesInfo, err
|
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) {
|
func UpdateStoreSku(ctx *jxcontext.Context, storeID int, skuBindInfo *StoreSkuBindInfo) (num int64, err error) {
|
||||||
return UpdateStoreSkus(ctx, storeID, []*StoreSkuBindInfo{skuBindInfo})
|
return UpdateStoreSkus(ctx, storeID, []*StoreSkuBindInfo{skuBindInfo})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -362,3 +362,21 @@ func IsLegalMobileNumber(num int64) bool {
|
|||||||
func TrimDecorationChar(value string) string {
|
func TrimDecorationChar(value string) string {
|
||||||
return strings.Trim(value, " \t\n[]()【】()-_——")
|
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)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxstore/cms"
|
"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"
|
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||||||
"github.com/astaxie/beego"
|
"github.com/astaxie/beego"
|
||||||
)
|
)
|
||||||
@@ -11,6 +14,9 @@ type StoreSkuController struct {
|
|||||||
beego.Controller
|
beego.Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Param stFromCount query int false "统计SKU,结果集起始数量(包括)"
|
||||||
|
// @Param stToToCount query int false "统计SKU,结果集结束数量(包括)"
|
||||||
|
|
||||||
// @Title 得到商家商品信息
|
// @Title 得到商家商品信息
|
||||||
// @Description 得到商家商品信息,如下条件之间是与的关系。对于没有认领的商品,按城市限制。但对于已经认领的商品就不限制了,因为已经在平台上可售,可以操作(改价等等)
|
// @Description 得到商家商品信息,如下条件之间是与的关系。对于没有认领的商品,按城市限制。但对于已经认领的商品就不限制了,因为已经在平台上可售,可以操作(改价等等)
|
||||||
// @Param token header string true "认证token"
|
// @Param token header string true "认证token"
|
||||||
@@ -26,6 +32,8 @@ type StoreSkuController struct {
|
|||||||
// @Param jdID query int false "商品京东ID"
|
// @Param jdID query int false "商品京东ID"
|
||||||
// @Param fromStatus query int false "查询起始状态(0:不可售,1:可售)"
|
// @Param fromStatus query int false "查询起始状态(0:不可售,1:可售)"
|
||||||
// @Param toStatus 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 offset query int false "门店列表起始序号(以0开始,缺省为0)"
|
||||||
// @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)"
|
// @Param pageSize query int false "门店列表页大小(缺省为50,-1表示全部)"
|
||||||
// @Success 200 {object} controllers.CallResult
|
// @Success 200 {object} controllers.CallResult
|
||||||
@@ -167,3 +175,38 @@ func (c *StoreSkuController) UpdateStoresSkusSale() {
|
|||||||
return retVal, "", err
|
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
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -559,6 +559,14 @@ func init() {
|
|||||||
MethodParams: param.Make(),
|
MethodParams: param.Make(),
|
||||||
Params: nil})
|
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.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:StoreSkuController"],
|
||||||
beego.ControllerComments{
|
beego.ControllerComments{
|
||||||
Method: "SyncStoresSkus",
|
Method: "SyncStoresSkus",
|
||||||
|
|||||||
Reference in New Issue
Block a user