实验StoreSkuAct

This commit is contained in:
gazebo
2020-01-16 10:47:06 +08:00
parent b94a1dd520
commit 88748b4d99
12 changed files with 409 additions and 126 deletions

View File

@@ -326,6 +326,7 @@ func isSkuLockTimeValid(sku *dao.StoreSkuSyncInfo) bool {
} }
func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, isFull bool, vendorID, storeID int, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isContinueWhenError bool) (err error) { func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag int, isFull bool, vendorID, storeID int, nameIDs, skuIDs, excludeSkuIDs []int, useVendorPriceDirectly, isContinueWhenError bool) (err error) {
globals.SugarLogger.Debugf("syncStoreSkuNew causeFlag:%d", causeFlag)
db := dao.GetDB() db := dao.GetDB()
storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID) storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID)
if err != nil { if err != nil {
@@ -606,6 +607,9 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
case 6: case 6:
if len(priceList) > 0 { if len(priceList) > 0 {
_, err = putils.FreeBatchStoreSkuInfo("更新门店商品价格", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) { _, err = putils.FreeBatchStoreSkuInfo("更新门店商品价格", func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
if isNeedHandleAct(causeFlag) {
cancelStoreSkuActs(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
}
var failedList []*partner.StoreSkuInfoWithErr var failedList []*partner.StoreSkuInfoWithErr
failedList, err = storeSkuHandler.UpdateStoreSkusPrice(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList) failedList, err = storeSkuHandler.UpdateStoreSkusPrice(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
if len(failedList) > 0 { if len(failedList) > 0 {
@@ -615,6 +619,9 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
if len(successList) > 0 { if len(successList) > 0 {
updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagPriceMask) updateStoreSku(dao.GetDB(), vendorID, bareSku2Sync(successList), model.SyncFlagPriceMask)
} }
if isNeedHandleAct(causeFlag) {
createStoreSkuActs(ctx, task, vendorID, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
}
return nil, len(successList), err return nil, len(successList), err
}, ctx, task, priceList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusPrice), isContinueWhenError2) }, ctx, task, priceList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusPrice), isContinueWhenError2)
} }
@@ -649,6 +656,10 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag
return err return err
} }
func isNeedHandleAct(causeFlag int) bool {
return globals.IsStoreSkuAct && (causeFlag&model.SyncFlagPriceMask != 0)
}
func checkRemoteCatExist(outRemoteCatMap map[string]int, localCatMap map[string]*dao.SkuStoreCatInfo, remoteCatList []*partner.BareCategoryInfo) (cat2Delete []*partner.BareCategoryInfo) { func checkRemoteCatExist(outRemoteCatMap map[string]int, localCatMap map[string]*dao.SkuStoreCatInfo, remoteCatList []*partner.BareCategoryInfo) (cat2Delete []*partner.BareCategoryInfo) {
for _, v := range remoteCatList { for _, v := range remoteCatList {
localCat := localCatMap[v.VendorCatID] localCat := localCatMap[v.VendorCatID]
@@ -931,3 +942,117 @@ func GetVendorSkuIDList(l []*partner.StoreSkuInfoWithErr) (vendorSkuIDs []string
} }
return vendorSkuIDs2 return vendorSkuIDs2
} }
func skuAct2Update(storeSkuAct *model.StoreSkuAct, isCreateAct bool) (item *dao.KVUpdateItem) {
storeSkuAct.SyncStatus = 0
if !isCreateAct {
storeSkuAct.VendorActID = ""
}
kvs := map[string]interface{}{
"VendorActID": storeSkuAct.VendorActID,
"VendorActPrice": storeSkuAct.VendorActPrice,
"SyncStatus": storeSkuAct.SyncStatus,
}
item = &dao.KVUpdateItem{
Item: storeSkuAct,
KVs: kvs,
}
return item
}
func updateStoreSkuAct(db *dao.DaoDB, vendorID int, storeSkuActList []*model.StoreSkuAct, isCreateAct bool) (num int64, err error) {
if len(storeSkuActList) > 0 {
updateItemList := make([]*dao.KVUpdateItem, len(storeSkuActList))
for k, v := range storeSkuActList {
updateItemList[k] = skuAct2Update(v, isCreateAct)
}
num, err = dao.BatchUpdateEntityByKV(db, updateItemList)
}
return num, err
}
func bareSku2StoreSkuAct(storeSkuActMap map[int]*model.StoreSkuAct, storeSkuList []*partner.StoreSkuInfo) (storeSkuActList []*model.StoreSkuAct) {
for _, v := range storeSkuList {
storeSkuAct := storeSkuActMap[v.SkuID]
storeSkuAct.VendorActID = v.VendorActID
storeSkuAct.VendorActPrice = v.ActPrice
storeSkuActList = append(storeSkuActList, storeSkuAct)
}
return storeSkuActList
}
func parseStoreSkuActList(isCreateAct bool, storeSkuList []*partner.StoreSkuInfo, storeSkuActList []*model.StoreSkuAct) (outStoreSkuList []*partner.StoreSkuInfo, storeSkuActMap map[int]*model.StoreSkuAct) {
storeSkuMap := make(map[int]*partner.StoreSkuInfo)
for _, v := range storeSkuList {
storeSkuMap[v.SkuID] = v
}
storeSkuActMap = make(map[int]*model.StoreSkuAct)
for _, v := range storeSkuActList {
if isCreateAct && v.VendorActID == "" && v.ActPercentage > 0 ||
!isCreateAct && v.VendorActID != "" {
storeSku := storeSkuMap[v.SkuID]
if isCreateAct {
storeSku.ActPrice = int64(jxutils.CaculateSkuVendorPrice(int(storeSku.VendorPrice), v.ActPercentage, 0))
} else {
storeSku.VendorActID = v.VendorActID
}
outStoreSkuList = append(outStoreSkuList, storeSku)
storeSkuActMap[v.SkuID] = v
}
}
return outStoreSkuList, storeSkuActMap
}
func createStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) {
globals.SugarLogger.Debugf("createStoreSkuActs vendorID:%d, storeID:%d, storeSkuList:%s", vendorID, storeID, utils.Format4Output(storeSkuList, true))
skuIDs := putils.StoreSkuList2IDs(storeSkuList)
db := dao.GetDB()
storeSkuActList, err := dao.GetStoresSkusAct(db, []int{storeID}, skuIDs, []int{vendorID}, 1, 0)
if err == nil {
storeSkuList2, storeSkuActMap := parseStoreSkuActList(true, storeSkuList, storeSkuActList)
if len(storeSkuList2) > 0 {
storeSkuHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler)
_, err = putils.FreeBatchStoreSkuInfo(fmt.Sprintf("创建门店%d直降活动", storeID), func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = storeSkuHandler.CreateStoreSkusAct(ctx, vendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
if len(failedList) > 0 {
task.AddFailedList(failedList)
}
successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
if len(successList) > 0 {
updateStoreSkuAct(dao.GetDB(), vendorID, bareSku2StoreSkuAct(storeSkuActMap, successList), true)
}
return nil, len(successList), err
}, ctx, parentTask, storeSkuList2, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncCancelActs), true)
}
}
return err
}
func cancelStoreSkuActs(ctx *jxcontext.Context, parentTask tasksch.ITask, vendorID int, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (err error) {
globals.SugarLogger.Debugf("cancelStoreSkuActs vendorID:%d, storeID:%d, storeSkuList:%s", vendorID, storeID, utils.Format4Output(storeSkuList, true))
skuIDs := putils.StoreSkuList2IDs(storeSkuList)
db := dao.GetDB()
storeSkuActList, err := dao.GetStoresSkusAct(db, []int{storeID}, skuIDs, []int{vendorID}, 0, 0)
if err == nil {
storeSkuList2, storeSkuActMap := parseStoreSkuActList(false, storeSkuList, storeSkuActList)
if len(storeSkuList2) > 0 {
storeSkuHandler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformStoreSkuHandler)
_, err = putils.FreeBatchStoreSkuInfo(fmt.Sprintf("取消门店%d直降活动", storeID), func(task tasksch.ITask, batchedStoreSkuList []*partner.StoreSkuInfo) (result interface{}, successCount int, err error) {
var failedList []*partner.StoreSkuInfoWithErr
failedList, err = storeSkuHandler.CancelActs(ctx, vendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList)
if len(failedList) > 0 {
task.AddFailedList(failedList)
}
successList := putils.UnselectStoreSkuListByVendorSkuIDs(batchedStoreSkuList, GetVendorSkuIDList(failedList))
if len(successList) > 0 {
updateStoreSkuAct(dao.GetDB(), vendorID, bareSku2StoreSkuAct(storeSkuActMap, successList), false)
}
return nil, len(successList), err
}, ctx, parentTask, storeSkuList2, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncCancelActs), true)
}
}
return err
}

View File

@@ -380,9 +380,11 @@ func (t *BaseTask) GetFailedList() (failedList []interface{}) {
} }
func (t *BaseTask) AddFailedList(failedList ...interface{}) { func (t *BaseTask) AddFailedList(failedList ...interface{}) {
t.locker.Lock() if len(failedList) > 0 {
defer t.locker.Unlock() t.locker.Lock()
t.FailedList = append(t.FailedList, failedList...) defer t.locker.Unlock()
t.FailedList = append(t.FailedList, failedList...)
}
} }
// func (t *BaseTask) GetDetailErrList() []error { // func (t *BaseTask) GetDetailErrList() []error {

View File

@@ -221,14 +221,15 @@ type StoreSkuAct struct {
SkuID int `orm:"column(sku_id);index"` SkuID int `orm:"column(sku_id);index"`
VendorID int `orm:"column(vendor_id)" json:"vendorID"` VendorID int `orm:"column(vendor_id)" json:"vendorID"`
ActID int `orm:"column(act_id);index" json:"actID"` ActPercentage int `json:"actPercentage"` // 直降活动百分比
SyncStatus int8 `orm:"default(2)" json:"syncStatus"`
// ActID int `orm:"column(act_id);index" json:"actID"`
VendorActID string `orm:"column(vendor_act_id);size(48);index" json:"vendorActID"` VendorActID string `orm:"column(vendor_act_id);size(48);index" json:"vendorActID"`
SyncStatus int8 `orm:"default(2)" json:"syncStatus"` VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价
VendorPrice int64 `json:"vendorPrice"` // 创建活动时的平台价格 Remark string `orm:"column(remark);size(1024)" json:"remark"`
ActualActPrice int64 `json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格
EarningActID int `orm:"column(earning_act_id);index" json:"earningActID"` // EarningActID int `orm:"column(earning_act_id);index" json:"earningActID"`
EarningPrice int64 `json:"earningPrice"` // EarningPrice int64 `json:"earningPrice"`
} }
func (*StoreSkuAct) TableUnique() [][]string { func (*StoreSkuAct) TableUnique() [][]string {

View File

@@ -9,7 +9,6 @@ import (
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals/refutil"
) )
type ActMapPureInfo struct { type ActMapPureInfo struct {
@@ -440,70 +439,71 @@ func UpdateActStatusByTime(db *DaoDB, refTime time.Time) (num int64, err error)
return num, err return num, err
} }
func ActStoreSkuMap2StoreSkuAct(actStoreSkuMap *model.ActStoreSkuMap, isCanceled bool) (storeSkuAct *model.StoreSkuAct) { // func ActStoreSkuMap2StoreSkuAct(actStoreSkuMap *model.ActStoreSkuMap, isCanceled bool) (storeSkuAct *model.StoreSkuAct) {
storeSkuAct = &model.StoreSkuAct{ // storeSkuAct = &model.StoreSkuAct{
StoreID: actStoreSkuMap.StoreID, // StoreID: actStoreSkuMap.StoreID,
SkuID: actStoreSkuMap.SkuID, // SkuID: actStoreSkuMap.SkuID,
VendorID: actStoreSkuMap.VendorID, // VendorID: actStoreSkuMap.VendorID,
} // }
storeSkuAct.CreatedAt = actStoreSkuMap.CreatedAt // storeSkuAct.CreatedAt = actStoreSkuMap.CreatedAt
storeSkuAct.UpdatedAt = actStoreSkuMap.UpdatedAt // storeSkuAct.UpdatedAt = actStoreSkuMap.UpdatedAt
storeSkuAct.LastOperator = actStoreSkuMap.LastOperator // storeSkuAct.LastOperator = actStoreSkuMap.LastOperator
if actStoreSkuMap.ActualActPrice > 0 { // if actStoreSkuMap.ActualActPrice > 0 {
if isCanceled || !utils.IsTimeZero(actStoreSkuMap.DeletedAt) { // if isCanceled || !utils.IsTimeZero(actStoreSkuMap.DeletedAt) {
storeSkuAct.ActID = 0 // storeSkuAct.ActID = 0
} else { // } else {
storeSkuAct.ActID = actStoreSkuMap.ActID // storeSkuAct.ActID = actStoreSkuMap.ActID
storeSkuAct.VendorActID = actStoreSkuMap.VendorActID // storeSkuAct.VendorActID = actStoreSkuMap.VendorActID
storeSkuAct.SyncStatus = actStoreSkuMap.SyncStatus // storeSkuAct.SyncStatus = actStoreSkuMap.SyncStatus
storeSkuAct.VendorPrice = actStoreSkuMap.VendorPrice // storeSkuAct.VendorPrice = actStoreSkuMap.VendorPrice
storeSkuAct.ActualActPrice = actStoreSkuMap.ActualActPrice // storeSkuAct.ActualActPrice = actStoreSkuMap.ActualActPrice
} // }
} // }
if actStoreSkuMap.EarningPrice > 0 { // if actStoreSkuMap.EarningPrice > 0 {
if isCanceled || !utils.IsTimeZero(actStoreSkuMap.DeletedAt) { // if isCanceled || !utils.IsTimeZero(actStoreSkuMap.DeletedAt) {
storeSkuAct.EarningActID = 0 // storeSkuAct.EarningActID = 0
} else { // } else {
storeSkuAct.EarningActID = actStoreSkuMap.ActID // storeSkuAct.EarningActID = actStoreSkuMap.ActID
storeSkuAct.EarningPrice = actStoreSkuMap.EarningPrice // storeSkuAct.EarningPrice = actStoreSkuMap.EarningPrice
} // }
} // }
return storeSkuAct // return storeSkuAct
} // }
func BatchUpdateActEntity(db *DaoDB, isCanceled bool, items []*KVUpdateItem) (num int64, err error) { func BatchUpdateActEntity(db *DaoDB, isCanceled bool, items []*KVUpdateItem) (num int64, err error) {
if globals.IsStoreSkuAct { return BatchUpdateEntityByKV(db, items)
Begin(db) // if globals.IsStoreSkuAct {
defer func() { // Begin(db)
if r := recover(); r != nil || err != nil { // defer func() {
Rollback(db) // if r := recover(); r != nil || err != nil {
if r != nil { // Rollback(db)
panic(r) // if r != nil {
} // panic(r)
} // }
}() // }
// }()
for _, v := range items { // for _, v := range items {
if actStoreSku, ok := v.Item.(*model.ActStoreSkuMap); ok { // if actStoreSku, ok := v.Item.(*model.ActStoreSkuMap); ok {
for k1, v1 := range v.KVs { // for k1, v1 := range v.KVs {
refutil.SetObjFieldByName(actStoreSku, k1, v1) // refutil.SetObjFieldByName(actStoreSku, k1, v1)
} // }
if err = CreateOrUpdateActStoreSku(db, ActStoreSkuMap2StoreSkuAct(actStoreSku, isCanceled)); err != nil { // if err = CreateOrUpdateActStoreSku(db, ActStoreSkuMap2StoreSkuAct(actStoreSku, isCanceled)); err != nil {
return 0, err // return 0, err
} // }
} // }
} // }
} // }
if _, err = BatchUpdateEntityByKV(db, items); err != nil { // if _, err = BatchUpdateEntityByKV(db, items); err != nil {
return 0, err // return 0, err
} // }
if globals.IsStoreSkuAct { // if globals.IsStoreSkuAct {
Commit(db) // Commit(db)
} // }
return num, err // return num, err
} }
func CreateOrUpdateActStoreSku(db *DaoDB, storeSkuAct *model.StoreSkuAct) (err error) { func CreateOrUpdateActStoreSku(db *DaoDB, storeSkuAct *model.StoreSkuAct) (err error) {
@@ -519,7 +519,7 @@ func CreateOrUpdateActStoreSku(db *DaoDB, storeSkuAct *model.StoreSkuAct) (err e
return err return err
} }
func GetStoresSkusAct(db *DaoDB, storeIDs, skuIDs, vendorIDs []int) (storeSkuActList []*model.StoreSkuAct, err error) { func GetStoresSkusAct(db *DaoDB, storeIDs, skuIDs, vendorIDs []int, minActPercentage, maxActPercentage int) (storeSkuActList []*model.StoreSkuAct, err error) {
sql := ` sql := `
SELECT * SELECT *
FROM store_sku_act t1 FROM store_sku_act t1
@@ -538,14 +538,22 @@ func GetStoresSkusAct(db *DaoDB, storeIDs, skuIDs, vendorIDs []int) (storeSkuAct
sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs) sqlParams = append(sqlParams, vendorIDs)
} }
if minActPercentage > 0 {
sql += " AND t1.act_percentage >= ?"
sqlParams = append(sqlParams, minActPercentage)
}
if maxActPercentage > 0 {
sql += " AND t1.act_percentage <= ?"
sqlParams = append(sqlParams, maxActPercentage)
}
err = GetRows(db, &storeSkuActList, sql, sqlParams...) err = GetRows(db, &storeSkuActList, sql, sqlParams...)
return storeSkuActList, err return storeSkuActList, err
} }
func GetStoresSkusAndActInfo(db *DaoDB, storeIDs, skuIDs, vendorIDs []int) (storeSkuAndActList []*StoreSkuAndAct, err error) { func GetStoresSkusAndActInfo(db *DaoDB, storeIDs, skuIDs, vendorIDs []int, minActPercentage, maxActPercentage int) (storeSkuAndActList []*StoreSkuAndAct, err error) {
storeSkuList, err := GetStoresSkusInfo(db, storeIDs, skuIDs) storeSkuList, err := GetStoresSkusInfo(db, storeIDs, skuIDs)
if err == nil && len(storeSkuList) > 0 { if err == nil && len(storeSkuList) > 0 {
storeSkuActList, err2 := GetStoresSkusAct(db, storeIDs, skuIDs, vendorIDs) storeSkuActList, err2 := GetStoresSkusAct(db, storeIDs, skuIDs, vendorIDs, minActPercentage, maxActPercentage)
if err = err2; err == nil { if err = err2; err == nil {
actMap := make(map[int64][]*model.StoreSkuAct) actMap := make(map[int64][]*model.StoreSkuAct)
for _, v := range storeSkuActList { for _, v := range storeSkuActList {
@@ -566,42 +574,42 @@ func GetStoresSkusAndActInfo(db *DaoDB, storeIDs, skuIDs, vendorIDs []int) (stor
return storeSkuAndActList, err return storeSkuAndActList, err
} }
func GetConflictStoreSkuActInfo(db *DaoDB, vendorIDs []int, inStoreSkuActList []*model.StoreSkuAct) (outStoreSkuActList []*model.StoreSkuAct, err error) { // func GetConflictStoreSkuActInfo(db *DaoDB, vendorIDs []int, inStoreSkuActList []*model.StoreSkuAct) (outStoreSkuActList []*model.StoreSkuAct, err error) {
storeIDMap := make(map[int]int) // storeIDMap := make(map[int]int)
skuIDMap := make(map[int]int) // skuIDMap := make(map[int]int)
inStoreSkuActMap := make(map[int64]*model.StoreSkuAct) // inStoreSkuActMap := make(map[int64]*model.StoreSkuAct)
for _, v := range inStoreSkuActList { // for _, v := range inStoreSkuActList {
storeIDMap[v.StoreID] = 1 // storeIDMap[v.StoreID] = 1
skuIDMap[v.SkuID] = 1 // skuIDMap[v.SkuID] = 1
inStoreSkuActMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v // inStoreSkuActMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v
} // }
storeIDs := jxutils.IntMap2List(storeIDMap) // storeIDs := jxutils.IntMap2List(storeIDMap)
skuIDs := jxutils.IntMap2List(skuIDMap) // skuIDs := jxutils.IntMap2List(skuIDMap)
sql := ` // sql := `
SELECT * // SELECT *
FROM store_sku_act t1 // FROM store_sku_act t1
WHERE // WHERE
t1.store_id IN (` + GenQuestionMarks(len(storeIDs)) + `) // t1.store_id IN (` + GenQuestionMarks(len(storeIDs)) + `)
AND t1.sku_id IN (` + GenQuestionMarks(len(skuIDs)) + `) // AND t1.sku_id IN (` + GenQuestionMarks(len(skuIDs)) + `)
` // `
sqlParams := []interface{}{ // sqlParams := []interface{}{
storeIDs, // storeIDs,
skuIDs, // skuIDs,
} // }
if len(vendorIDs) > 0 { // if len(vendorIDs) > 0 {
sql += ` AND t1.vendor_Id IN (` + GenQuestionMarks(len(storeIDs)) + `)` // sql += ` AND t1.vendor_Id IN (` + GenQuestionMarks(len(storeIDs)) + `)`
sqlParams = append(sqlParams, vendorIDs) // sqlParams = append(sqlParams, vendorIDs)
} // }
var tmpStoreSkuActList []*model.StoreSkuAct // var tmpStoreSkuActList []*model.StoreSkuAct
if err = GetRows(db, &tmpStoreSkuActList, sql, sqlParams...); err == nil { // if err = GetRows(db, &tmpStoreSkuActList, sql, sqlParams...); err == nil {
for _, v := range tmpStoreSkuActList { // for _, v := range tmpStoreSkuActList {
tmpStoreSkuAct := inStoreSkuActMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] // tmpStoreSkuAct := inStoreSkuActMap[jxutils.Combine2Int(v.StoreID, v.SkuID)]
if tmpStoreSkuAct != nil && (tmpStoreSkuAct.ActualActPrice > 0 && v.ActID != 0 && v.SyncStatus == 0 || tmpStoreSkuAct.EarningPrice > 0 && v.EarningActID != 0) { // if tmpStoreSkuAct != nil && (tmpStoreSkuAct.ActualActPrice > 0 && v.ActID != 0 && v.SyncStatus == 0 || tmpStoreSkuAct.EarningPrice > 0 && v.EarningActID != 0) {
outStoreSkuActList = append(outStoreSkuActList, v) // outStoreSkuActList = append(outStoreSkuActList, v)
} // }
} // }
} // }
return outStoreSkuActList, err // return outStoreSkuActList, err
} // }

View File

@@ -22,6 +22,9 @@ const (
FuncCreateStoreSkus = 7 FuncCreateStoreSkus = 7
FuncUpdateStoreSkus = 8 FuncUpdateStoreSkus = 8
FuncDeleteStoreSkus = 9 FuncDeleteStoreSkus = 9
FuncCreateActs = 10
FuncCancelActs = 11
) )
const ( const (
@@ -40,7 +43,11 @@ type StoreSkuInfo struct {
Stock int `json:"stock,omitempty"` Stock int `json:"stock,omitempty"`
VendorPrice int64 `json:"price,omitempty"` VendorPrice int64 `json:"price,omitempty"`
Status int `json:"status,omitempty"` Status int `json:"status,omitempty"`
Seq int `json:"seq,omitempty"`
Seq int `json:"seq,omitempty"`
ActPrice int64 `json:"actPrice,omitempty"`
VendorActID string `json:"vendorActID,omitempty"`
} }
type StoreSkuInfoWithErr struct { type StoreSkuInfoWithErr struct {
@@ -141,6 +148,9 @@ type IPurchasePlatformStoreSkuHandler interface {
UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*StoreSkuInfo) (failedList []*StoreSkuInfoWithErr, err error) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*StoreSkuInfo) (failedList []*StoreSkuInfoWithErr, err error)
UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*StoreSkuInfo, status int) (failedList []*StoreSkuInfoWithErr, err error) UpdateStoreSkusStatus(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*StoreSkuInfo, status int) (failedList []*StoreSkuInfoWithErr, err error)
UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*StoreSkuInfo) (failedList []*StoreSkuInfoWithErr, err error) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*StoreSkuInfo) (failedList []*StoreSkuInfoWithErr, err error)
CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*StoreSkuInfo) (failedList []*StoreSkuInfoWithErr, err error)
CancelActs(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*StoreSkuInfo) (failedList []*StoreSkuInfoWithErr, err error)
} }
type ISingleStoreStoreSkuHandler interface { type ISingleStoreStoreSkuHandler interface {

View File

@@ -33,6 +33,8 @@ func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
batchSize = 1 batchSize = 1
case partner.FuncGetStoreSkusFullInfo: case partner.FuncGetStoreSkusFullInfo:
batchSize = 1 batchSize = 1
case partner.FuncCreateActs, partner.FuncCancelActs:
batchSize = 1
} }
return batchSize return batchSize
} }
@@ -460,3 +462,33 @@ func SelectStoreSkuListByOpResult(storeSkuList []*partner.StoreSkuInfo, opResult
} }
return selectedStoreSkuList return selectedStoreSkuList
} }
func (p *PurchaseHandler) CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
for _, v := range storeSkuList {
if vendorActID, err2 := createOneShopAct(putils.GetFixDirectDownAct(storeID, v.SkuID), utils.Int2Str(storeID), putils.StoreSku2ActStoreSku([]*partner.StoreSkuInfo{v})); err2 != nil {
failedList = append(failedList, &partner.StoreSkuInfoWithErr{
StoreSkuInfo: v,
VendoreID: model.VendorIDJD,
StoreID: storeID,
ErrMsg: err.Error(),
})
} else {
v.VendorActID = vendorActID
}
}
return failedList, err
}
func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
for _, v := range storeSkuList {
if err2 := ActivityDisable(utils.Str2Int64(v.VendorActID), utils.Int2Str(storeID), 0, 0); err2 != nil {
failedList = append(failedList, &partner.StoreSkuInfoWithErr{
StoreSkuInfo: v,
VendoreID: model.VendorIDJD,
StoreID: storeID,
ErrMsg: err.Error(),
})
}
}
return failedList, err
}

View File

@@ -17,6 +17,8 @@ func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
switch funcID { switch funcID {
case partner.FuncUpdateStoreSkusStock, partner.FuncUpdateStoreSkusStatus, partner.FuncUpdateStoreSkusPrice: case partner.FuncUpdateStoreSkusStock, partner.FuncUpdateStoreSkusStatus, partner.FuncUpdateStoreSkusPrice:
batchSize = jdapi.MaxStoreSkuBatchSize batchSize = jdapi.MaxStoreSkuBatchSize
case partner.FuncCreateActs, partner.FuncCancelActs:
batchSize = 1
} }
return batchSize return batchSize
} }
@@ -259,3 +261,33 @@ func SelectStoreSkuListByResponseList(storeSkuList []*partner.StoreSkuInfo, resp
} }
return selectedStoreSkuList return selectedStoreSkuList
} }
func (p *PurchaseHandler) CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
for _, v := range storeSkuList {
if vendorActID, err2 := createSkuAct(ctx, putils.GetFixDirectDownAct(storeID, v.SkuID), putils.StoreSku2ActStoreSku([]*partner.StoreSkuInfo{v})); err2 != nil {
failedList = append(failedList, &partner.StoreSkuInfoWithErr{
StoreSkuInfo: v,
VendoreID: model.VendorIDJD,
StoreID: storeID,
ErrMsg: err.Error(),
})
} else {
v.VendorActID = vendorActID
}
}
return failedList, err
}
func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
for _, v := range storeSkuList {
if err2 := cancelSkuAct(ctx, putils.GetFixDirectDownAct(storeID, v.SkuID), v.VendorActID); err2 != nil {
failedList = append(failedList, &partner.StoreSkuInfoWithErr{
StoreSkuInfo: v,
VendoreID: model.VendorIDJD,
StoreID: storeID,
ErrMsg: err.Error(),
})
}
}
return failedList, err
}

View File

@@ -26,3 +26,11 @@ func (p *PurchaseHandler) UpdateStoreSkusPrice(ctx *jxcontext.Context, vendorOrg
func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (successList []*partner.StoreSkuInfo, err error) { func (p *PurchaseHandler) UpdateStoreSkusStock(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (successList []*partner.StoreSkuInfo, err error) {
return successList, err return successList, err
} }
func (p *PurchaseHandler) CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
return failedList, err
}
func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
return failedList, err
}

View File

@@ -80,22 +80,34 @@ func isCreateOrUpdate(syncStatus int8) bool {
return model.IsSyncStatusNeedCreate(syncStatus) || model.IsSyncStatusNeedUpdate(syncStatus) return model.IsSyncStatusNeedCreate(syncStatus) || model.IsSyncStatusNeedUpdate(syncStatus)
} }
func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*model.ActStoreSku2) (err error) { func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*model.ActStoreSku2) (failedList []*partner.StoreSkuInfoWithErr, err error) {
actData := storeSku2ActData(act, actStoreSku, isCreateOrUpdate) actData := storeSku2ActData(act, actStoreSku, isCreateOrUpdate)
if len(actData) > 0 { if len(actData) > 0 {
if globals.EnableMtwmStoreWrite { if globals.EnableMtwmStoreWrite {
actResult, err2 := api.MtwmAPI.RetailDiscountBatchSave(vendorStoreID, jxActType2Mtwm(act.Type), actData) actResult, faileInfoList, err2 := api.MtwmAPI.RetailDiscountBatchSave2(vendorStoreID, jxActType2Mtwm(act.Type), actData)
globals.SugarLogger.Debugf("mtwm createOneShopAct err2:%v", err2) // globals.SugarLogger.Debugf("mtwm createOneShopAct err2:%v", err2)
if err = err2; err != nil { if err = err2; err != nil {
return err return nil, err
}
actResultMap := make(map[string]*mtwmapi.RetailDiscountActResult)
for _, v := range actResult {
actResultMap[v.AppFoodCode] = v
} }
actStoreSkuMap := make(map[int]*model.ActStoreSku2)
for _, v := range actStoreSku { for _, v := range actStoreSku {
if result := actResultMap[utils.Int2Str(v.SkuID)]; result != nil { actStoreSkuMap[v.SkuID] = v
v.VendorActID = utils.Int64ToStr(result.ActID) }
for _, v := range actResult {
if v2 := actStoreSkuMap[int(utils.Str2Int64WithDefault(v.AppFoodCode, 0))]; v2 != nil {
v2.VendorActID = utils.Int64ToStr(v.ActID)
}
}
for _, v := range faileInfoList {
if v2 := actStoreSkuMap[int(utils.Str2Int64WithDefault(v.AppFoodCode, 0))]; v2 != nil {
failedList = append(failedList, &partner.StoreSkuInfoWithErr{
StoreSkuInfo: &partner.StoreSkuInfo{
SkuID: v2.SkuID,
},
VendoreID: model.VendorIDMTWM,
StoreID: int(utils.Str2Int64WithDefault(vendorStoreID, 0)),
ErrMsg: v.ErrorMsg,
})
} }
} }
} else { } else {
@@ -104,16 +116,16 @@ func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*mode
} }
} }
} }
return err return failedList, err
} }
func cancelOneShopAct(ctx *jxcontext.Context, act *model.Act2, actStoreSku []*model.ActStoreSku2) (err error) { func cancelOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*model.ActStoreSku2) (failedList []*partner.StoreSkuInfoWithErr, err error) {
if list := storeSku2ActData4Delete(actStoreSku, nil /*model.IsSyncStatusNeedDelete*/); len(list) > 0 { if list := storeSku2ActData4Delete(actStoreSku, nil /*model.IsSyncStatusNeedDelete*/); len(list) > 0 {
if globals.EnableMtwmStoreWrite { if globals.EnableMtwmStoreWrite {
err = api.MtwmAPI.RetailDiscountDelete(actStoreSku[0].VendorStoreID, jxActType2Mtwm(act.Type), list) err = api.MtwmAPI.RetailDiscountDelete(vendorStoreID, jxActType2Mtwm(act.Type), list)
} }
} }
return err return failedList, err
} }
func getActStoreSkuFromTaskResult(taskReslt []interface{}) (list []*model.ActStoreSku2) { func getActStoreSkuFromTaskResult(taskReslt []interface{}) (list []*model.ActStoreSku2) {
@@ -130,7 +142,7 @@ func createSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.A
task := tasksch.NewParallelTask("mtwm createSkuAct", nil, ctx, task := tasksch.NewParallelTask("mtwm createSkuAct", nil, ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
list := batchItemList[0].([]*model.ActStoreSku2) list := batchItemList[0].([]*model.ActStoreSku2)
if err = createOneShopAct(act, list[0].VendorStoreID, list); err == nil { if _, err = createOneShopAct(act, list[0].VendorStoreID, list); err == nil {
retVal = []interface{}{list} retVal = []interface{}{list}
} }
return retVal, err return retVal, err
@@ -146,7 +158,7 @@ func cancelSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.A
task := tasksch.NewParallelTask("mtwm cancelSkuAct", nil, ctx, task := tasksch.NewParallelTask("mtwm cancelSkuAct", nil, ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
actStoreSkuList := batchItemList[0].([]*model.ActStoreSku2) actStoreSkuList := batchItemList[0].([]*model.ActStoreSku2)
if err = cancelOneShopAct(ctx, act, actStoreSkuList); err == nil { if _, err = cancelOneShopAct(act, actStoreSkuList[0].VendorStoreID, actStoreSkuList); err == nil {
retVal = []interface{}{actStoreSkuList} retVal = []interface{}{actStoreSkuList}
} }
return retVal, err return retVal, err

View File

@@ -47,6 +47,10 @@ func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) {
batchSize = 1 // mtwmapi.MaxStoreSkuBatchSize batchSize = 1 // mtwmapi.MaxStoreSkuBatchSize
case partner.FuncGetStoreSkusFullInfo: case partner.FuncGetStoreSkusFullInfo:
batchSize = 1 batchSize = 1
case partner.FuncCreateActs:
batchSize = mtwmapi.MaxRetailDiscountCreateBatchSize
case partner.FuncCancelActs:
batchSize = mtwmapi.MaxRetailDiscountDeleteBatchSize
} }
return batchSize return batchSize
} }
@@ -574,3 +578,11 @@ func SelectStoreSkuListByFoodList(storeSkuList interface{}, foodList []*mtwmapi.
} }
return selectedStoreSkuList return selectedStoreSkuList
} }
func (p *PurchaseHandler) CreateStoreSkusAct(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
return createOneShopAct(putils.GetFixDirectDownAct(storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(storeSkuList))
}
func (p *PurchaseHandler) CancelActs(ctx *jxcontext.Context, vendorOrgCode string, storeID int, vendorStoreID string, storeSkuList []*partner.StoreSkuInfo) (failedList []*partner.StoreSkuInfoWithErr, err error) {
return cancelOneShopAct(putils.GetFixDirectDownAct(storeID, 0), vendorStoreID, putils.StoreSku2ActStoreSku(storeSkuList))
}

View File

@@ -3,10 +3,12 @@ package putils
import ( import (
"fmt" "fmt"
"sort" "sort"
"time"
"git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/business/jxutils" "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/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
@@ -219,6 +221,14 @@ func StoreSkuList2MapBySkuID(storeSkuList []*partner.StoreSkuInfo) (storeSkuMap
return storeSkuMap return storeSkuMap
} }
func StoreSkuList2IDs(storeSkuList []*partner.StoreSkuInfo) (ids []int) {
ids = make([]int, len(storeSkuList))
for k, v := range storeSkuList {
ids[k] = v.SkuID
}
return ids
}
func UnselectStoreSkuListByVendorSkuIDs(storeSkuList []*partner.StoreSkuInfo, vendorSkuIDs []string) (selectedStoreSkuList []*partner.StoreSkuInfo) { func UnselectStoreSkuListByVendorSkuIDs(storeSkuList []*partner.StoreSkuInfo, vendorSkuIDs []string) (selectedStoreSkuList []*partner.StoreSkuInfo) {
if len(vendorSkuIDs) > 0 { if len(vendorSkuIDs) > 0 {
vendorSkuIDMap := jxutils.StringList2Map(vendorSkuIDs) vendorSkuIDMap := jxutils.StringList2Map(vendorSkuIDs)
@@ -312,3 +322,34 @@ func GenPartialFailedErr(failedInfo interface{}, failedCount int) (err error) {
} }
return err return err
} }
func StoreSku2ActStoreSku(storeSkuList []*partner.StoreSkuInfo) (actStoreSku []*model.ActStoreSku2) {
for _, v := range storeSkuList {
actStoreSku = append(actStoreSku, &model.ActStoreSku2{
ActStoreSku: model.ActStoreSku{
SkuID: v.SkuID,
Stock: 200,
},
VendorSkuID: v.VendorSkuID,
ActualActPrice: v.ActPrice,
})
}
return actStoreSku
}
func GetFixDirectDownAct(storeID, skuID int) (act *model.Act2) {
name := fmt.Sprintf("自动直降活动%d:%d:%d", storeID, skuID, time.Now().Unix())
act = &model.Act2{
Act: model.Act{
Name: name,
Advertising: name,
Type: model.ActSkuDirectDown,
Status: model.ActStatusCreated,
LimitUser: 1,
LimitCount: 1,
BeginAt: utils.Time2Date(time.Now()),
EndAt: utils.Time2Date(time.Now().Add(365 * 24 * time.Hour)),
},
}
return act
}

View File

@@ -109,7 +109,7 @@ func Init() {
IsUseThingMap = beego.AppConfig.DefaultBool("useThingMap", false) IsUseThingMap = beego.AppConfig.DefaultBool("useThingMap", false)
IsAddEvent = !IsProductEnv() IsAddEvent = !IsProductEnv()
IsStoreSkuAct = false IsStoreSkuAct = !IsProductEnv()
} }
func IsCallbackAlwaysReturnSuccess() bool { func IsCallbackAlwaysReturnSuccess() bool {