- GetStoresSkusNew, 重新实现GetStoresSkus
This commit is contained in:
@@ -33,6 +33,45 @@ const (
|
|||||||
// CopyStoreSkuModeAdd = "add"
|
// CopyStoreSkuModeAdd = "add"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type StoreSkuExt struct {
|
||||||
|
NameID int `orm:"column(name_id)" json:"nameID"`
|
||||||
|
SkuID int `orm:"column(sku_id)" json:"id"`
|
||||||
|
Comment string `orm:"size(255)" json:"comment"`
|
||||||
|
SkuCategoryID int `orm:"column(sku_category_id)" json:"categoryID"`
|
||||||
|
SkuSpecQuality float32 `json:"specQuality"`
|
||||||
|
SkuSpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量
|
||||||
|
Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality
|
||||||
|
JdID int64 `orm:"column(sku_jd_id);null;index" json:"jdID"`
|
||||||
|
SkuStatus int `json:"status"`
|
||||||
|
|
||||||
|
BindCreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"`
|
||||||
|
BindUpdatedAt time.Time `orm:"auto_now;type(datetime)" json:"updatedAt"`
|
||||||
|
BindLastOperator string `orm:"size(32)" json:"lastOperator"` // 最后操作员
|
||||||
|
BindDeletedAt time.Time `orm:"type(datetime);default('1970-01-01 00:00:00')" json:"deletedAt"`
|
||||||
|
SubStoreID int `orm:"column(sub_store_id)" json:"subStoreID"`
|
||||||
|
BindPrice int `json:"price"` // 单位为分,不用int64的原因是这里不需要累加
|
||||||
|
UnitPrice int `json:"unitPrice"` // 这个是一斤的门店商品价,放在这里的原因是避免额外增加一张store sku_name表,逻辑上要保证同一SKU NAME中的所有SKU这个字段的数据一致
|
||||||
|
BindStatus int `json:"storeSkuStatus"`
|
||||||
|
|
||||||
|
EbaiID int64 `orm:"column(ebai_id);index" json:"ebaiID"`
|
||||||
|
MtwmID int64 `orm:"column(mtwm_id)" json:"mtwmID"` // 这个也不是必须的,只是为了DAO取数据语句一致
|
||||||
|
WscID int64 `orm:"column(wsc_id);index" json:"wscID"` // 表示微盟skuId
|
||||||
|
WscID2 int64 `orm:"column(wsc_id2);index" json:"wscID2"` // 表示微盟goodsId
|
||||||
|
|
||||||
|
JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
|
||||||
|
|
||||||
|
EbaiSyncStatus int8 `orm:"default(2)" json:"ebaiSyncStatus"`
|
||||||
|
MtwmSyncStatus int8 `orm:"default(2)" json:"mtwmSyncStatus"`
|
||||||
|
WscSyncStatus int8 `orm:"default(2)" json:"wscSyncStatus"`
|
||||||
|
|
||||||
|
ActPrice int `json:"actPrice"`
|
||||||
|
EarningPrice int `json:"earningPrice"`
|
||||||
|
RealEarningPrice int `json:"realEarningPrice"`
|
||||||
|
|
||||||
|
Count int `json:"count"`
|
||||||
|
Times int `json:"times"`
|
||||||
|
}
|
||||||
|
|
||||||
// GetStoreSkus用
|
// GetStoreSkus用
|
||||||
type StoreSkuNameExt struct {
|
type StoreSkuNameExt struct {
|
||||||
StoreID int `orm:"column(store_id)" json:"storeID"`
|
StoreID int `orm:"column(store_id)" json:"storeID"`
|
||||||
@@ -40,7 +79,8 @@ type StoreSkuNameExt struct {
|
|||||||
|
|
||||||
model.SkuName
|
model.SkuName
|
||||||
UnitPrice int `json:"unitPrice"`
|
UnitPrice int `json:"unitPrice"`
|
||||||
Skus []map[string]interface{} `orm:"-" json:"skus"`
|
Skus []map[string]interface{} `orm:"-" json:"skus2,omitempty"`
|
||||||
|
Skus2 []*StoreSkuExt `orm:"-" json:"skus,omitempty"`
|
||||||
SkusStr string `json:"-"`
|
SkusStr string `json:"-"`
|
||||||
|
|
||||||
PendingOpType int8 `json:"pendingOpType"` // 取值同 StoreOpRequest.Type
|
PendingOpType int8 `json:"pendingOpType"` // 取值同 StoreOpRequest.Type
|
||||||
@@ -100,30 +140,18 @@ type StoreOpRequestInfo struct {
|
|||||||
UnitPrice int `json:"unitPrice"`
|
UnitPrice int `json:"unitPrice"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 待用于新的GetStoresSkus实现
|
type tStoreNameBind struct {
|
||||||
type tSkuInfo struct {
|
StoreID int `orm:"column(store_id)"`
|
||||||
ID int `orm:"column(sku_id)" json:"id"`
|
NameID int `orm:"column(name_id)"`
|
||||||
CreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"`
|
Name string
|
||||||
UpdatedAt time.Time `orm:"auto_now;type(datetime)" json:"updatedAt"`
|
}
|
||||||
LastOperator string `orm:"size(32)" json:"lastOperator"` // 最后操作员
|
|
||||||
DeletedAt time.Time `orm:"type(datetime);default('1970-01-01 00:00:00')" json:"deletedAt"`
|
|
||||||
|
|
||||||
CategoryID int `orm:"column(category_id)" json:"categoryID"` // 特殊类别,一般用于秒杀,特价之类的特殊类别
|
type tGetStoresSkusInfo struct {
|
||||||
NameID int `orm:"column(name_id)" json:"nameID"` // todo 这个索引应该要求唯一
|
StoreID int `orm:"column(store_id)"`
|
||||||
SkuIndex int `json:"-"`
|
StoreName string
|
||||||
Comment string `orm:"size(255)" json:"comment"`
|
|
||||||
SpecQuality float32 `json:"specQuality"`
|
|
||||||
SpecUnit string `orm:"size(8)" json:"specUnit"` // 质量或容量
|
|
||||||
Weight int `json:"weight"` // 重量/质量,单位为克,当相应的SkuName的SpecUnit为g或kg时,必须等于SpecQuality
|
|
||||||
Status int `json:"status"`
|
|
||||||
|
|
||||||
JdID int64 `orm:"column(jd_id);null;index" json:"jdID"`
|
model.SkuName
|
||||||
EbaiID int64 `orm:"column(ebai_id);index"`
|
StoreSkuExt
|
||||||
MtwmID string `orm:"column(mtwm_id);index;size(16)"` // 美团外卖没有ID,保存名字
|
|
||||||
|
|
||||||
JdSyncStatus int8 `orm:"default(2)" json:"jdSyncStatus"`
|
|
||||||
EbaiSyncStatus int8 `orm:"default(2)"`
|
|
||||||
MtwmSyncStatus int8 `orm:"default(2)"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@@ -139,7 +167,8 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool
|
|||||||
sql = `
|
sql = `
|
||||||
FROM sku_name t1
|
FROM sku_name t1
|
||||||
JOIN sku t2 ON t1.id = t2.name_id AND t2.deleted_at = ?/* AND t2.status = ?*/
|
JOIN sku t2 ON t1.id = t2.name_id AND t2.deleted_at = ?/* AND t2.status = ?*/
|
||||||
JOIN store t3 ON t3.id IN (` + dao.GenQuestionMarks(len(storeIDs)) + `)`
|
JOIN store t3 ON t3.deleted_at = ?
|
||||||
|
`
|
||||||
if !isFocus {
|
if !isFocus {
|
||||||
sql += " LEFT"
|
sql += " LEFT"
|
||||||
}
|
}
|
||||||
@@ -151,7 +180,7 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool
|
|||||||
sqlParams = []interface{}{
|
sqlParams = []interface{}{
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
// model.SkuStatusNormal,
|
// model.SkuStatusNormal,
|
||||||
storeIDs,
|
utils.DefaultTimeValue,
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
utils.DefaultTimeValue,
|
utils.DefaultTimeValue,
|
||||||
utils.Bool2Int(isFocus),
|
utils.Bool2Int(isFocus),
|
||||||
@@ -224,6 +253,10 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool
|
|||||||
sql += " AND t1.unit = ?"
|
sql += " AND t1.unit = ?"
|
||||||
sqlParams = append(sqlParams, params["unit"].(string))
|
sqlParams = append(sqlParams, params["unit"].(string))
|
||||||
}
|
}
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
sql += " AND t3.id IN (" + dao.GenQuestionMarks(len(storeIDs)) + ")"
|
||||||
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
|
}
|
||||||
if len(skuIDs) > 0 {
|
if len(skuIDs) > 0 {
|
||||||
sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")"
|
sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(skuIDs)) + ")"
|
||||||
sqlParams = append(sqlParams, skuIDs)
|
sqlParams = append(sqlParams, skuIDs)
|
||||||
@@ -269,9 +302,234 @@ func getGetStoresSkusBaseSQL(db *dao.DaoDB, storeIDs, skuIDs []int, isFocus bool
|
|||||||
return sql, sqlParams, err
|
return sql, sqlParams, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) {
|
||||||
|
return GetStoresSkusNew(ctx, storeIDs, skuIDs, isFocus, keyword, isBySku, params, offset, pageSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetStoresSkusNew(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) {
|
||||||
|
if !isFocus && !isBySku && (len(storeIDs) > 1 || len(storeIDs) == 0) {
|
||||||
|
return nil, fmt.Errorf("未关注按SkuName只能查询单店")
|
||||||
|
}
|
||||||
|
db := dao.GetDB()
|
||||||
|
sql, sqlParams, err := getGetStoresSkusBaseSQL(db, storeIDs, skuIDs, isFocus, keyword, isBySku, params)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
pageSize = jxutils.FormalizePageSize(pageSize)
|
||||||
|
sqlOffset := offset
|
||||||
|
sqlPageSize := pageSize
|
||||||
|
isSaleInfo := params["stFromTime"] != nil
|
||||||
|
if isSaleInfo {
|
||||||
|
sqlOffset = 0
|
||||||
|
sqlPageSize = jxutils.FormalizePageSize(-1)
|
||||||
|
}
|
||||||
|
sqlParamsPage := []interface{}{sqlPageSize, sqlOffset}
|
||||||
|
|
||||||
|
dao.Begin(db)
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
panic(r)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
skuNamesInfo = &StoreSkuNamesInfo{}
|
||||||
|
if !isBySku {
|
||||||
|
sql2 := `
|
||||||
|
SELECT SQL_CALC_FOUND_ROWS
|
||||||
|
t3.id store_id, t1.id name_id
|
||||||
|
` + sql + `
|
||||||
|
GROUP BY 1, 2
|
||||||
|
ORDER BY 1, 2
|
||||||
|
LIMIT ? OFFSET ?
|
||||||
|
`
|
||||||
|
sqlParams2 := append([]interface{}{}, sqlParams...)
|
||||||
|
sqlParams2 = append(sqlParams2, sqlParamsPage)
|
||||||
|
var storeNameList []*tStoreNameBind
|
||||||
|
beginTime := time.Now()
|
||||||
|
if err = dao.GetRows(db, &storeNameList, sql2, sqlParams2...); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
globals.SugarLogger.Debug(time.Now().Sub(beginTime))
|
||||||
|
skuNamesInfo.TotalCount = dao.GetLastTotalRowCount(db)
|
||||||
|
sql += " AND (1 = 0"
|
||||||
|
for _, v := range storeNameList {
|
||||||
|
sql += " OR (t1.id = ? AND t3.id = ?)"
|
||||||
|
sqlParams = append(sqlParams, v.NameID, v.StoreID)
|
||||||
|
}
|
||||||
|
sql += `)
|
||||||
|
ORDER BY t3.id, t2.name_id, t2.id
|
||||||
|
`
|
||||||
|
} else {
|
||||||
|
if isFocus {
|
||||||
|
sql += `
|
||||||
|
ORDER BY t3.id, t2.name_id, t2.id
|
||||||
|
`
|
||||||
|
}
|
||||||
|
sql += `
|
||||||
|
LIMIT ? OFFSET ?
|
||||||
|
`
|
||||||
|
sqlParams = append(sqlParams, sqlParamsPage)
|
||||||
|
}
|
||||||
|
sql = `
|
||||||
|
SELECT SQL_CALC_FOUND_ROWS
|
||||||
|
t3.id store_id, t3.name store_name, t3.pay_percentage,
|
||||||
|
t1.*,
|
||||||
|
t2.name_id, t2.id sku_id, t2.spec_quality sku_spec_quality, t2.spec_unit sku_spec_unit, t2.weight, t2.jd_id sku_jd_id,
|
||||||
|
t2.comment, t2.category_id sku_category_id, t2.status sku_status,
|
||||||
|
|
||||||
|
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 bind_status,
|
||||||
|
t4.ebai_id, t4.mtwm_id, t4.wsc_id, t4.wsc_id2,
|
||||||
|
t4.jd_sync_status, t4.ebai_sync_status, t4.mtwm_sync_status, t4.wsc_sync_status
|
||||||
|
` + sql
|
||||||
|
var tmpList []*tGetStoresSkusInfo
|
||||||
|
beginTime := time.Now()
|
||||||
|
if err = dao.GetRows(db, &tmpList, sql, sqlParams...); err != nil {
|
||||||
|
dao.Rollback(db)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if isBySku {
|
||||||
|
skuNamesInfo.TotalCount = dao.GetLastTotalRowCount(db)
|
||||||
|
}
|
||||||
|
dao.Commit(db)
|
||||||
|
globals.SugarLogger.Debug(time.Now().Sub(beginTime))
|
||||||
|
storeNameMap := make(map[int64]*StoreSkuNameExt)
|
||||||
|
for _, v := range tmpList {
|
||||||
|
var storeName *StoreSkuNameExt
|
||||||
|
index := jxutils.Combine2Int(v.StoreID, v.ID)
|
||||||
|
if isBySku || storeNameMap[index] == nil {
|
||||||
|
storeName = &StoreSkuNameExt{
|
||||||
|
StoreID: v.StoreID,
|
||||||
|
StoreName: v.StoreName,
|
||||||
|
SkuName: v.SkuName,
|
||||||
|
UnitPrice: v.UnitPrice,
|
||||||
|
}
|
||||||
|
if !isBySku {
|
||||||
|
storeNameMap[index] = storeName
|
||||||
|
}
|
||||||
|
skuNamesInfo.SkuNames = append(skuNamesInfo.SkuNames, storeName)
|
||||||
|
} else {
|
||||||
|
storeName = storeNameMap[index]
|
||||||
|
}
|
||||||
|
storeName.Skus2 = append(storeName.Skus2, &v.StoreSkuExt)
|
||||||
|
}
|
||||||
|
err = updateActPrice4StoreSkuName(db, storeIDs, skuIDs, skuNamesInfo)
|
||||||
|
if err == nil && isSaleInfo {
|
||||||
|
err = updateSaleInfo4StoreSkuName(ctx, db, offset, pageSize, params, skuNamesInfo)
|
||||||
|
}
|
||||||
|
// globals.SugarLogger.Debug(utils.Format4Output(skuNamesInfo, false))
|
||||||
|
return skuNamesInfo, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateActPrice4StoreSkuName(db *dao.DaoDB, storeIDs, skuIDs []int, skuNamesInfo *StoreSkuNamesInfo) (err error) {
|
||||||
|
// 活动商品信息
|
||||||
|
jxSkuPriceMap, err := dao.GetPromotionSkuPriceMap(db, model.VendorIDJX, storeIDs, skuIDs, time.Now(), time.Now())
|
||||||
|
if err != nil {
|
||||||
|
globals.SugarLogger.Errorf("updateActPrice4StoreSkuName can not get sku promotion info for error:%v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
jdSkuPriceMap, err2 := dao.GetPromotionSkuPriceMap(db, model.VendorIDJD, storeIDs, skuIDs, time.Now(), time.Now())
|
||||||
|
if err = err2; err != nil {
|
||||||
|
globals.SugarLogger.Errorf("updateActPrice4StoreSkuName can not get sku promotion info for error:%v", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, skuName := range skuNamesInfo.SkuNames {
|
||||||
|
if len(skuName.Skus2) > 0 {
|
||||||
|
for _, v := range skuName.Skus2 {
|
||||||
|
index := dao.GenSkuPriceMapKey(skuName.StoreID, v.SkuID)
|
||||||
|
if jdSkuPriceMap[index] != nil {
|
||||||
|
v.ActPrice = jdSkuPriceMap[index].Price
|
||||||
|
}
|
||||||
|
if jxSkuPriceMap[index] != nil {
|
||||||
|
v.EarningPrice = jxSkuPriceMap[index].EarningPrice
|
||||||
|
}
|
||||||
|
|
||||||
|
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, offset, pageSize int, params map[string]interface{}, skuNamesInfo *StoreSkuNamesInfo) (err error) {
|
||||||
|
var (
|
||||||
|
saleInfoList []*SkuSaleInfo
|
||||||
|
timeList []time.Time
|
||||||
|
fromCount, toCount int
|
||||||
|
)
|
||||||
|
storeIDMap := make(map[int]int)
|
||||||
|
skuIDMap := make(map[int]int)
|
||||||
|
saleInfoMap := make(map[int64]*SkuSaleInfo)
|
||||||
|
for _, skuName := range skuNamesInfo.SkuNames {
|
||||||
|
storeIDMap[skuName.StoreID] = 1
|
||||||
|
for _, sku := range skuName.Skus2 {
|
||||||
|
skuIDMap[sku.SkuID] = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
storeIDs := jxutils.IntMap2List(storeIDMap)
|
||||||
|
skuIDs := jxutils.IntMap2List(skuIDMap)
|
||||||
|
toTimeStr := ""
|
||||||
|
if params["stToTime"] != nil {
|
||||||
|
toTimeStr = params["stToTime"].(string)
|
||||||
|
}
|
||||||
|
if timeList, err = jxutils.BatchStr2Time(params["stFromTime"].(string), toTimeStr); err != nil {
|
||||||
|
return 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, storeIDs, skuIDs, timeList[0], timeList[1], 0, math.MaxInt32); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, saleInfo := range saleInfoList {
|
||||||
|
saleInfoMap[jxutils.Combine2Int(saleInfo.StoreID, saleInfo.SkuID)] = saleInfo
|
||||||
|
}
|
||||||
|
var newSkuNames []*StoreSkuNameExt
|
||||||
|
for _, skuName := range skuNamesInfo.SkuNames {
|
||||||
|
var newSkus []*StoreSkuExt
|
||||||
|
for _, sku := range skuName.Skus2 {
|
||||||
|
saleInfo := saleInfoMap[jxutils.Combine2Int(skuName.StoreID, sku.SkuID)]
|
||||||
|
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.Skus2 = 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]
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// 商品不可售,直接排除
|
// 商品不可售,直接排除
|
||||||
// 如果门店商品是可售状态,那么会忽略区域限制。否则有区域限制
|
// 如果门店商品是可售状态,那么会忽略区域限制。否则有区域限制
|
||||||
func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) {
|
func GetStoresSkusOld(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool, keyword string, isBySku bool, params map[string]interface{}, offset, pageSize int) (skuNamesInfo *StoreSkuNamesInfo, err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
sql, sqlParams, err := getGetStoresSkusBaseSQL(db, storeIDs, skuIDs, isFocus, keyword, isBySku, params)
|
sql, sqlParams, err := getGetStoresSkusBaseSQL(db, storeIDs, skuIDs, isFocus, keyword, isBySku, params)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -355,24 +613,22 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool,
|
|||||||
// 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 {
|
||||||
skuNamesInfo.TotalCount = dao.GetLastTotalRowCount(db)
|
skuNamesInfo.TotalCount = dao.GetLastTotalRowCount(db)
|
||||||
|
dao.Commit(db)
|
||||||
|
|
||||||
// 活动商品信息
|
// 活动商品信息
|
||||||
jxSkuPriceMap, err2 := dao.GetPromotionSkuPriceMap(db, model.VendorIDJX, storeIDs, skuIDs, time.Now(), time.Now())
|
jxSkuPriceMap, err2 := dao.GetPromotionSkuPriceMap(db, model.VendorIDJX, storeIDs, skuIDs, time.Now(), time.Now())
|
||||||
if err = err2; err != nil {
|
if err = err2; err != nil {
|
||||||
dao.Rollback(db)
|
|
||||||
globals.SugarLogger.Errorf("GetStoresSkus can not get sku promotion info for error:%v", err)
|
globals.SugarLogger.Errorf("GetStoresSkus can not get sku promotion info for error:%v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
jdSkuPriceMap, err2 := dao.GetPromotionSkuPriceMap(db, model.VendorIDJD, storeIDs, skuIDs, time.Now(), time.Now())
|
jdSkuPriceMap, err2 := dao.GetPromotionSkuPriceMap(db, model.VendorIDJD, storeIDs, skuIDs, time.Now(), time.Now())
|
||||||
if err = err2; err != nil {
|
if err = err2; err != nil {
|
||||||
dao.Rollback(db)
|
|
||||||
globals.SugarLogger.Errorf("GetStoresSkus can not get sku promotion info for error:%v", err)
|
globals.SugarLogger.Errorf("GetStoresSkus can not get sku promotion info for error:%v", err)
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
for _, skuName := range skuNamesInfo.SkuNames {
|
for _, skuName := range skuNamesInfo.SkuNames {
|
||||||
if skuName.SkusStr != "" {
|
if skuName.SkusStr != "" {
|
||||||
if err = utils.UnmarshalUseNumber([]byte(skuName.SkusStr), &skuName.Skus); err != nil {
|
if err = utils.UnmarshalUseNumber([]byte(skuName.SkusStr), &skuName.Skus); err != nil {
|
||||||
dao.Rollback(db)
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if len(skuName.Skus) > 0 {
|
if len(skuName.Skus) > 0 {
|
||||||
@@ -423,7 +679,6 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool,
|
|||||||
toTimeStr = params["stToTime"].(string)
|
toTimeStr = params["stToTime"].(string)
|
||||||
}
|
}
|
||||||
if timeList, err = jxutils.BatchStr2Time(params["stFromTime"].(string), toTimeStr); err != nil {
|
if timeList, err = jxutils.BatchStr2Time(params["stFromTime"].(string), toTimeStr); err != nil {
|
||||||
dao.Rollback(db)
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if params["stFromCount"] != nil {
|
if params["stFromCount"] != nil {
|
||||||
@@ -435,7 +690,6 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool,
|
|||||||
}
|
}
|
||||||
// 不能用SQL筛除,否则不能区分是没有销量,还是不在条件中
|
// 不能用SQL筛除,否则不能区分是没有销量,还是不在条件中
|
||||||
if saleInfoList, err = GetStoresSkusSaleInfo(ctx, storeIDs, skuIDs, timeList[0], timeList[1], 0, math.MaxInt32); err != nil {
|
if saleInfoList, err = GetStoresSkusSaleInfo(ctx, storeIDs, skuIDs, timeList[0], timeList[1], 0, math.MaxInt32); err != nil {
|
||||||
dao.Rollback(db)
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
for _, saleInfo := range saleInfoList {
|
for _, saleInfo := range saleInfoList {
|
||||||
@@ -494,8 +748,9 @@ func GetStoresSkus(ctx *jxcontext.Context, storeIDs, skuIDs []int, isFocus bool,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
dao.Rollback(db)
|
||||||
}
|
}
|
||||||
dao.Commit(db)
|
|
||||||
return skuNamesInfo, err
|
return skuNamesInfo, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -582,7 +837,6 @@ func GetStoresSkusSaleInfo(ctx *jxcontext.Context, storeIDs []int, skuIDs []int,
|
|||||||
FROM order_sku t1
|
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 = ?
|
JOIN goods_order t2 ON t1.vendor_order_id = t2.vendor_order_id AND t1.vendor_id = t2.vendor_id AND t2.status = ?
|
||||||
WHERE t1.order_created_at >= ? AND t1.order_created_at <= ?
|
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)) + `)
|
|
||||||
`
|
`
|
||||||
if utils.IsTimeZero(toTime) {
|
if utils.IsTimeZero(toTime) {
|
||||||
toTime = time.Now()
|
toTime = time.Now()
|
||||||
@@ -591,7 +845,12 @@ func GetStoresSkusSaleInfo(ctx *jxcontext.Context, storeIDs []int, skuIDs []int,
|
|||||||
model.OrderStatusFinished,
|
model.OrderStatusFinished,
|
||||||
fromTime,
|
fromTime,
|
||||||
toTime,
|
toTime,
|
||||||
storeIDs,
|
}
|
||||||
|
if len(storeIDs) > 0 {
|
||||||
|
sql += `
|
||||||
|
AND IF(t2.jx_store_id <> 0, jx_store_id, store_id) IN (` + dao.GenQuestionMarks(len(storeIDs)) + `)
|
||||||
|
`
|
||||||
|
sqlParams = append(sqlParams, storeIDs)
|
||||||
}
|
}
|
||||||
if len(skuIDs) > 0 {
|
if len(skuIDs) > 0 {
|
||||||
sql += `
|
sql += `
|
||||||
@@ -709,11 +968,7 @@ func checkStoresSkusSaleCity(ctx *jxcontext.Context, db *dao.DaoDB, storeIDs []i
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(nameIDs)) + ")"
|
sql += " AND t2.id IN (" + dao.GenQuestionMarks(len(nameIDs)) + ")"
|
||||||
var invalidList []*struct {
|
var invalidList []*tStoreNameBind
|
||||||
StoreID int `orm:"column(store_id)"`
|
|
||||||
NameID int `orm:"column(name_id)"`
|
|
||||||
Name string
|
|
||||||
}
|
|
||||||
if err = dao.GetRows(db, &invalidList, sql, utils.DefaultTimeValue, storeIDs, nameIDs); err == nil {
|
if err = dao.GetRows(db, &invalidList, sql, utils.DefaultTimeValue, storeIDs, nameIDs); err == nil {
|
||||||
if len(invalidList) > 0 {
|
if len(invalidList) > 0 {
|
||||||
errMsg := ""
|
errMsg := ""
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ func (c *StoreSkuController) GetStoreSkus() {
|
|||||||
// @Title 得到商家商品信息
|
// @Title 得到商家商品信息
|
||||||
// @Description 得到商家商品信息,如下条件之间是与的关系。对于没有认领的商品,按城市限制。但对于已经认领的商品就不限制了,因为已经在平台上可售,可以操作(改价等等)
|
// @Description 得到商家商品信息,如下条件之间是与的关系。对于没有认领的商品,按城市限制。但对于已经认领的商品就不限制了,因为已经在平台上可售,可以操作(改价等等)
|
||||||
// @Param token header string true "认证token"
|
// @Param token header string true "认证token"
|
||||||
// @Param storeIDs query string true "门店ID"
|
// @Param storeIDs query string false "门店ID"
|
||||||
// @Param isFocus query bool true "是否已关注(认领)"
|
// @Param isFocus query bool true "是否已关注(认领)"
|
||||||
// @Param keyword query string false "查询关键字(可以为空,为空表示不限制)"
|
// @Param keyword query string false "查询关键字(可以为空,为空表示不限制)"
|
||||||
// @Param nameIDs query string false "SkuName ID列表对象"
|
// @Param nameIDs query string false "SkuName ID列表对象"
|
||||||
|
|||||||
Reference in New Issue
Block a user