diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index a885228d0..6e6d6608c 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -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) { + globals.SugarLogger.Debugf("syncStoreSkuNew causeFlag:%d", causeFlag) db := dao.GetDB() storeDetail, err := dao.GetStoreDetail(db, storeID, vendorID) if err != nil { @@ -606,6 +607,9 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag case 6: if len(priceList) > 0 { _, 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 failedList, err = storeSkuHandler.UpdateStoreSkusPrice(ctx, storeDetail.VendorOrgCode, storeID, vendorStoreID, batchedStoreSkuList) if len(failedList) > 0 { @@ -615,6 +619,9 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag if len(successList) > 0 { 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 }, ctx, task, priceList, storeSkuHandler.GetStoreSkusBatchSize(partner.FuncUpdateStoreSkusPrice), isContinueWhenError2) } @@ -649,6 +656,10 @@ func syncStoreSkuNew(ctx *jxcontext.Context, parentTask tasksch.ITask, causeFlag 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) { for _, v := range remoteCatList { localCat := localCatMap[v.VendorCatID] @@ -931,3 +942,117 @@ func GetVendorSkuIDList(l []*partner.StoreSkuInfoWithErr) (vendorSkuIDs []string } 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 +} diff --git a/business/jxutils/tasksch/task.go b/business/jxutils/tasksch/task.go index 4f10d3f8f..b992f1981 100644 --- a/business/jxutils/tasksch/task.go +++ b/business/jxutils/tasksch/task.go @@ -380,9 +380,11 @@ func (t *BaseTask) GetFailedList() (failedList []interface{}) { } func (t *BaseTask) AddFailedList(failedList ...interface{}) { - t.locker.Lock() - defer t.locker.Unlock() - t.FailedList = append(t.FailedList, failedList...) + if len(failedList) > 0 { + t.locker.Lock() + defer t.locker.Unlock() + t.FailedList = append(t.FailedList, failedList...) + } } // func (t *BaseTask) GetDetailErrList() []error { diff --git a/business/model/act.go b/business/model/act.go index 85d04b23f..bb705d118 100644 --- a/business/model/act.go +++ b/business/model/act.go @@ -221,14 +221,15 @@ type StoreSkuAct struct { SkuID int `orm:"column(sku_id);index"` 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"` - SyncStatus int8 `orm:"default(2)" json:"syncStatus"` - VendorPrice int64 `json:"vendorPrice"` // 创建活动时的平台价格 - ActualActPrice int64 `json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格 + VendorActPrice int64 `json:"vendorActPrice"` // 保存数据用,实际的活动价 + Remark string `orm:"column(remark);size(1024)" json:"remark"` - EarningActID int `orm:"column(earning_act_id);index" json:"earningActID"` - EarningPrice int64 `json:"earningPrice"` + // EarningActID int `orm:"column(earning_act_id);index" json:"earningActID"` + // EarningPrice int64 `json:"earningPrice"` } func (*StoreSkuAct) TableUnique() [][]string { diff --git a/business/model/dao/act.go b/business/model/dao/act.go index bbd991c91..24e7ea470 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -9,7 +9,6 @@ import ( "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/jx-callback/globals/refutil" ) type ActMapPureInfo struct { @@ -440,70 +439,71 @@ func UpdateActStatusByTime(db *DaoDB, refTime time.Time) (num int64, err error) return num, err } -func ActStoreSkuMap2StoreSkuAct(actStoreSkuMap *model.ActStoreSkuMap, isCanceled bool) (storeSkuAct *model.StoreSkuAct) { - storeSkuAct = &model.StoreSkuAct{ - StoreID: actStoreSkuMap.StoreID, - SkuID: actStoreSkuMap.SkuID, - VendorID: actStoreSkuMap.VendorID, - } - storeSkuAct.CreatedAt = actStoreSkuMap.CreatedAt - storeSkuAct.UpdatedAt = actStoreSkuMap.UpdatedAt - storeSkuAct.LastOperator = actStoreSkuMap.LastOperator +// func ActStoreSkuMap2StoreSkuAct(actStoreSkuMap *model.ActStoreSkuMap, isCanceled bool) (storeSkuAct *model.StoreSkuAct) { +// storeSkuAct = &model.StoreSkuAct{ +// StoreID: actStoreSkuMap.StoreID, +// SkuID: actStoreSkuMap.SkuID, +// VendorID: actStoreSkuMap.VendorID, +// } +// storeSkuAct.CreatedAt = actStoreSkuMap.CreatedAt +// storeSkuAct.UpdatedAt = actStoreSkuMap.UpdatedAt +// storeSkuAct.LastOperator = actStoreSkuMap.LastOperator - if actStoreSkuMap.ActualActPrice > 0 { - if isCanceled || !utils.IsTimeZero(actStoreSkuMap.DeletedAt) { - storeSkuAct.ActID = 0 - } else { - storeSkuAct.ActID = actStoreSkuMap.ActID - storeSkuAct.VendorActID = actStoreSkuMap.VendorActID - storeSkuAct.SyncStatus = actStoreSkuMap.SyncStatus - storeSkuAct.VendorPrice = actStoreSkuMap.VendorPrice - storeSkuAct.ActualActPrice = actStoreSkuMap.ActualActPrice - } - } - if actStoreSkuMap.EarningPrice > 0 { - if isCanceled || !utils.IsTimeZero(actStoreSkuMap.DeletedAt) { - storeSkuAct.EarningActID = 0 - } else { - storeSkuAct.EarningActID = actStoreSkuMap.ActID - storeSkuAct.EarningPrice = actStoreSkuMap.EarningPrice - } - } - return storeSkuAct -} +// if actStoreSkuMap.ActualActPrice > 0 { +// if isCanceled || !utils.IsTimeZero(actStoreSkuMap.DeletedAt) { +// storeSkuAct.ActID = 0 +// } else { +// storeSkuAct.ActID = actStoreSkuMap.ActID +// storeSkuAct.VendorActID = actStoreSkuMap.VendorActID +// storeSkuAct.SyncStatus = actStoreSkuMap.SyncStatus +// storeSkuAct.VendorPrice = actStoreSkuMap.VendorPrice +// storeSkuAct.ActualActPrice = actStoreSkuMap.ActualActPrice +// } +// } +// if actStoreSkuMap.EarningPrice > 0 { +// if isCanceled || !utils.IsTimeZero(actStoreSkuMap.DeletedAt) { +// storeSkuAct.EarningActID = 0 +// } else { +// storeSkuAct.EarningActID = actStoreSkuMap.ActID +// storeSkuAct.EarningPrice = actStoreSkuMap.EarningPrice +// } +// } +// return storeSkuAct +// } func BatchUpdateActEntity(db *DaoDB, isCanceled bool, items []*KVUpdateItem) (num int64, err error) { - if globals.IsStoreSkuAct { - Begin(db) - defer func() { - if r := recover(); r != nil || err != nil { - Rollback(db) - if r != nil { - panic(r) - } - } - }() + return BatchUpdateEntityByKV(db, items) + // if globals.IsStoreSkuAct { + // Begin(db) + // defer func() { + // if r := recover(); r != nil || err != nil { + // Rollback(db) + // if r != nil { + // panic(r) + // } + // } + // }() - for _, v := range items { - if actStoreSku, ok := v.Item.(*model.ActStoreSkuMap); ok { - for k1, v1 := range v.KVs { - refutil.SetObjFieldByName(actStoreSku, k1, v1) - } - if err = CreateOrUpdateActStoreSku(db, ActStoreSkuMap2StoreSkuAct(actStoreSku, isCanceled)); err != nil { - return 0, err - } - } - } - } + // for _, v := range items { + // if actStoreSku, ok := v.Item.(*model.ActStoreSkuMap); ok { + // for k1, v1 := range v.KVs { + // refutil.SetObjFieldByName(actStoreSku, k1, v1) + // } + // if err = CreateOrUpdateActStoreSku(db, ActStoreSkuMap2StoreSkuAct(actStoreSku, isCanceled)); err != nil { + // return 0, err + // } + // } + // } + // } - if _, err = BatchUpdateEntityByKV(db, items); err != nil { - return 0, err - } + // if _, err = BatchUpdateEntityByKV(db, items); err != nil { + // return 0, err + // } - if globals.IsStoreSkuAct { - Commit(db) - } - return num, err + // if globals.IsStoreSkuAct { + // Commit(db) + // } + // return num, err } func CreateOrUpdateActStoreSku(db *DaoDB, storeSkuAct *model.StoreSkuAct) (err error) { @@ -519,7 +519,7 @@ func CreateOrUpdateActStoreSku(db *DaoDB, storeSkuAct *model.StoreSkuAct) (err e 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 := ` SELECT * 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)) + ")" 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...) 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) 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 { actMap := make(map[int64][]*model.StoreSkuAct) for _, v := range storeSkuActList { @@ -566,42 +574,42 @@ func GetStoresSkusAndActInfo(db *DaoDB, storeIDs, skuIDs, vendorIDs []int) (stor return storeSkuAndActList, err } -func GetConflictStoreSkuActInfo(db *DaoDB, vendorIDs []int, inStoreSkuActList []*model.StoreSkuAct) (outStoreSkuActList []*model.StoreSkuAct, err error) { - storeIDMap := make(map[int]int) - skuIDMap := make(map[int]int) - inStoreSkuActMap := make(map[int64]*model.StoreSkuAct) - for _, v := range inStoreSkuActList { - storeIDMap[v.StoreID] = 1 - skuIDMap[v.SkuID] = 1 - inStoreSkuActMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v - } - storeIDs := jxutils.IntMap2List(storeIDMap) - skuIDs := jxutils.IntMap2List(skuIDMap) +// func GetConflictStoreSkuActInfo(db *DaoDB, vendorIDs []int, inStoreSkuActList []*model.StoreSkuAct) (outStoreSkuActList []*model.StoreSkuAct, err error) { +// storeIDMap := make(map[int]int) +// skuIDMap := make(map[int]int) +// inStoreSkuActMap := make(map[int64]*model.StoreSkuAct) +// for _, v := range inStoreSkuActList { +// storeIDMap[v.StoreID] = 1 +// skuIDMap[v.SkuID] = 1 +// inStoreSkuActMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v +// } +// storeIDs := jxutils.IntMap2List(storeIDMap) +// skuIDs := jxutils.IntMap2List(skuIDMap) - sql := ` - SELECT * - FROM store_sku_act t1 - WHERE - t1.store_id IN (` + GenQuestionMarks(len(storeIDs)) + `) - AND t1.sku_id IN (` + GenQuestionMarks(len(skuIDs)) + `) - ` - sqlParams := []interface{}{ - storeIDs, - skuIDs, - } - if len(vendorIDs) > 0 { - sql += ` AND t1.vendor_Id IN (` + GenQuestionMarks(len(storeIDs)) + `)` - sqlParams = append(sqlParams, vendorIDs) - } +// sql := ` +// SELECT * +// FROM store_sku_act t1 +// WHERE +// t1.store_id IN (` + GenQuestionMarks(len(storeIDs)) + `) +// AND t1.sku_id IN (` + GenQuestionMarks(len(skuIDs)) + `) +// ` +// sqlParams := []interface{}{ +// storeIDs, +// skuIDs, +// } +// if len(vendorIDs) > 0 { +// sql += ` AND t1.vendor_Id IN (` + GenQuestionMarks(len(storeIDs)) + `)` +// sqlParams = append(sqlParams, vendorIDs) +// } - var tmpStoreSkuActList []*model.StoreSkuAct - if err = GetRows(db, &tmpStoreSkuActList, sql, sqlParams...); err == nil { - for _, v := range tmpStoreSkuActList { - 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) { - outStoreSkuActList = append(outStoreSkuActList, v) - } - } - } - return outStoreSkuActList, err -} +// var tmpStoreSkuActList []*model.StoreSkuAct +// if err = GetRows(db, &tmpStoreSkuActList, sql, sqlParams...); err == nil { +// for _, v := range tmpStoreSkuActList { +// 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) { +// outStoreSkuActList = append(outStoreSkuActList, v) +// } +// } +// } +// return outStoreSkuActList, err +// } diff --git a/business/partner/partner_store_sku.go b/business/partner/partner_store_sku.go index d873e93ac..7ecc2f649 100644 --- a/business/partner/partner_store_sku.go +++ b/business/partner/partner_store_sku.go @@ -22,6 +22,9 @@ const ( FuncCreateStoreSkus = 7 FuncUpdateStoreSkus = 8 FuncDeleteStoreSkus = 9 + + FuncCreateActs = 10 + FuncCancelActs = 11 ) const ( @@ -40,7 +43,11 @@ type StoreSkuInfo struct { Stock int `json:"stock,omitempty"` VendorPrice int64 `json:"price,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 { @@ -141,6 +148,9 @@ type IPurchasePlatformStoreSkuHandler interface { 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) 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 { diff --git a/business/partner/purchase/ebai/store_sku2.go b/business/partner/purchase/ebai/store_sku2.go index a35d768ec..613c4f58d 100644 --- a/business/partner/purchase/ebai/store_sku2.go +++ b/business/partner/purchase/ebai/store_sku2.go @@ -33,6 +33,8 @@ func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) { batchSize = 1 case partner.FuncGetStoreSkusFullInfo: batchSize = 1 + case partner.FuncCreateActs, partner.FuncCancelActs: + batchSize = 1 } return batchSize } @@ -460,3 +462,33 @@ func SelectStoreSkuListByOpResult(storeSkuList []*partner.StoreSkuInfo, opResult } 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 +} diff --git a/business/partner/purchase/jd/store_sku2.go b/business/partner/purchase/jd/store_sku2.go index d338ddf55..ae9364c60 100644 --- a/business/partner/purchase/jd/store_sku2.go +++ b/business/partner/purchase/jd/store_sku2.go @@ -17,6 +17,8 @@ func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) { switch funcID { case partner.FuncUpdateStoreSkusStock, partner.FuncUpdateStoreSkusStatus, partner.FuncUpdateStoreSkusPrice: batchSize = jdapi.MaxStoreSkuBatchSize + case partner.FuncCreateActs, partner.FuncCancelActs: + batchSize = 1 } return batchSize } @@ -259,3 +261,33 @@ func SelectStoreSkuListByResponseList(storeSkuList []*partner.StoreSkuInfo, resp } 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 +} diff --git a/business/partner/purchase/jx/store_sku2.go b/business/partner/purchase/jx/store_sku2.go index 14ddf5d9b..b9d87af6a 100644 --- a/business/partner/purchase/jx/store_sku2.go +++ b/business/partner/purchase/jx/store_sku2.go @@ -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) { 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 +} diff --git a/business/partner/purchase/mtwm/act.go b/business/partner/purchase/mtwm/act.go index e1547cd5c..450264eea 100644 --- a/business/partner/purchase/mtwm/act.go +++ b/business/partner/purchase/mtwm/act.go @@ -80,22 +80,34 @@ func isCreateOrUpdate(syncStatus int8) bool { 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) if len(actData) > 0 { if globals.EnableMtwmStoreWrite { - actResult, err2 := api.MtwmAPI.RetailDiscountBatchSave(vendorStoreID, jxActType2Mtwm(act.Type), actData) - globals.SugarLogger.Debugf("mtwm createOneShopAct err2:%v", err2) + actResult, faileInfoList, err2 := api.MtwmAPI.RetailDiscountBatchSave2(vendorStoreID, jxActType2Mtwm(act.Type), actData) + // globals.SugarLogger.Debugf("mtwm createOneShopAct err2:%v", err2) if err = err2; err != nil { - return err - } - actResultMap := make(map[string]*mtwmapi.RetailDiscountActResult) - for _, v := range actResult { - actResultMap[v.AppFoodCode] = v + return nil, err } + actStoreSkuMap := make(map[int]*model.ActStoreSku2) for _, v := range actStoreSku { - if result := actResultMap[utils.Int2Str(v.SkuID)]; result != nil { - v.VendorActID = utils.Int64ToStr(result.ActID) + actStoreSkuMap[v.SkuID] = v + } + 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 { @@ -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 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) { @@ -130,7 +142,7 @@ func createSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.A task := tasksch.NewParallelTask("mtwm createSkuAct", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { 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} } 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, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { 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} } return retVal, err diff --git a/business/partner/purchase/mtwm/store_sku2.go b/business/partner/purchase/mtwm/store_sku2.go index 054504afc..55f346bea 100644 --- a/business/partner/purchase/mtwm/store_sku2.go +++ b/business/partner/purchase/mtwm/store_sku2.go @@ -47,6 +47,10 @@ func (p *PurchaseHandler) GetStoreSkusBatchSize(funcID int) (batchSize int) { batchSize = 1 // mtwmapi.MaxStoreSkuBatchSize case partner.FuncGetStoreSkusFullInfo: batchSize = 1 + case partner.FuncCreateActs: + batchSize = mtwmapi.MaxRetailDiscountCreateBatchSize + case partner.FuncCancelActs: + batchSize = mtwmapi.MaxRetailDiscountDeleteBatchSize } return batchSize } @@ -574,3 +578,11 @@ func SelectStoreSkuListByFoodList(storeSkuList interface{}, foodList []*mtwmapi. } 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)) +} diff --git a/business/partner/putils/store_sku.go b/business/partner/putils/store_sku.go index e3004f7a8..3b7b9a686 100644 --- a/business/partner/putils/store_sku.go +++ b/business/partner/putils/store_sku.go @@ -3,10 +3,12 @@ package putils import ( "fmt" "sort" + "time" "git.rosy.net.cn/jx-callback/globals" "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/business/jxutils/jxcontext" @@ -219,6 +221,14 @@ func StoreSkuList2MapBySkuID(storeSkuList []*partner.StoreSkuInfo) (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) { if len(vendorSkuIDs) > 0 { vendorSkuIDMap := jxutils.StringList2Map(vendorSkuIDs) @@ -312,3 +322,34 @@ func GenPartialFailedErr(failedInfo interface{}, failedCount int) (err error) { } 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 +} diff --git a/globals/globals.go b/globals/globals.go index 46281c0db..f21d4f32c 100644 --- a/globals/globals.go +++ b/globals/globals.go @@ -109,7 +109,7 @@ func Init() { IsUseThingMap = beego.AppConfig.DefaultBool("useThingMap", false) IsAddEvent = !IsProductEnv() - IsStoreSkuAct = false + IsStoreSkuAct = !IsProductEnv() } func IsCallbackAlwaysReturnSuccess() bool {