diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index 25e7a3be7..71704452a 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -7,7 +7,6 @@ import ( "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "git.rosy.net.cn/jx-callback/business/partner" - "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" @@ -34,19 +33,6 @@ type ActDetail struct { model.Act2 } -func ActStoreSkuParam2Map(actStoreSku []*ActStoreSkuParam) (actStoreSkuMap map[int][]*ActStoreSkuParam) { - if len(actStoreSku) > 0 { - for _, v := range actStoreSku { - actStoreSkuMap[v.StoreID] = append(actStoreSkuMap[v.StoreID], v) - } - } - return actStoreSkuMap -} - -func genStoreSkuMapKey(storeID, skuID int) int64 { - return int64(storeID) + int64(skuID)*1000000 -} - func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actStoreSku []*ActStoreSkuParam) (actMapList []*model.ActMap, actStoreMapList []*model.ActStoreMap, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) { if len(actStoreSku) > 0 { storeIDMap := make(map[int]int) @@ -65,7 +51,7 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] } storeSkuMap := make(map[int64]*model.StoreSkuBind) for _, v := range storeSkuList { - storeSkuMap[genStoreSkuMapKey(v.StoreID, v.SkuID)] = v + storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v } wholeValidVendorMap := make(map[int]int) @@ -76,7 +62,7 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] storeDetail, err2 := dao.GetStoreDetail(db, storeID, vendorID) if err = err2; err == nil { for _, v := range oneStoreSkuParam { - if storeSkuInfo := storeSkuMap[genStoreSkuMapKey(v.StoreID, v.SkuID)]; storeSkuInfo != nil { + if storeSkuInfo := storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)]; storeSkuInfo != nil { validVendorMap[vendorID] = 1 validSkuMap[v.SkuID] = 1 actSkuMap := &model.ActStoreSkuMap{ @@ -110,7 +96,7 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] for _, v := range oneStoreSkuParam { if validSkuMap[v.SkuID] == 1 { - if storeSkuInfo := storeSkuMap[genStoreSkuMapKey(v.StoreID, v.SkuID)]; storeSkuInfo != nil { + if storeSkuInfo := storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)]; storeSkuInfo != nil { storeSku := &v.ActStoreSku storeSku.ActID = act.ID storeSku.OriginalPrice = int64(storeSkuInfo.Price) @@ -211,46 +197,24 @@ func GetActDetail(ctx *jxcontext.Context, actID int) (actDetail *ActDetail, err // return err // } -func parseActStoreSkuParam(actStoreSku []*ActStoreSkuParam) { - -} - func UpdateAct(ctx *jxcontext.Context, act *model.Act, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam) (err error) { return err } func CancelAct(ctx *jxcontext.Context, actID int) (err error) { db := dao.GetDB() - act := &model.Act{} - act.ID = actID - if err = dao.GetEntity(db, act); err != nil { + if err = deleteActStoreBind(ctx, db, actID, nil); err != nil { return err } - dao.Begin(db) - defer func() { - if r := recover(); r != nil { - dao.Rollback(db) - panic(r) - } - }() - - dao.UpdateEntityLogically(db, act, map[string]interface{}{ - model.FieldStatus: model.ActStatusCanceled, - }, ctx.GetUserName(), nil) - _, err = dao.UpdateEntityLogicallyAndUpdateSyncStatus(db, &model.ActMap{}, nil, ctx.GetUserName(), map[string]interface{}{ - model.FieldActID: actID, - }, model.FieldSyncStatus, model.SyncFlagModifiedMask) - if err == nil { - dao.Commit(db) - globals.SugarLogger.Debugf("CancelAct track:%s", ctx.GetTrackInfo()) - err = SyncAct(ctx, actID, nil, nil, nil) - } else { - dao.Rollback(db) - } + err = SyncAct(ctx, actID, nil, nil, nil) return err } func DeleteActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActStoreSkuParam) (err error) { + return deleteActStoreBind(ctx, dao.GetDB(), actID, actStoreSku) +} + +func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actStoreSku []*ActStoreSkuParam) (err error) { storeIDMap := make(map[int]int) skuIDMap := make(map[int]int) actStoreSkuParamMap := make(map[int64]*ActStoreSkuParam) @@ -259,9 +223,18 @@ func DeleteActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActSto skuIDMap[v.SkuID] = 1 actStoreSkuParamMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v } + storeIDs := jxutils.IntMap2List(storeIDMap) + skuIDs := jxutils.IntMap2List(skuIDMap) - db := dao.GetDB() - actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, jxutils.IntMap2List(storeIDMap), jxutils.IntMap2List(skuIDMap)) + actMap, err := dao.GetActVendorInfo(db, actID, nil) + if err != nil { + return err + } + actStoreMap, err := dao.GetActStoreVendorInfo(db, actID, nil, storeIDs) + if err != nil { + return err + } + actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, storeIDs, skuIDs) if err != nil { return err } @@ -274,14 +247,56 @@ func DeleteActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActSto } } }() - for _, v := range actStoreSkuMap { - for _, storeSku := range v { - storeSku.SyncStatus |= model.SyncFlagDeletedMask - if param := actStoreSkuParamMap[jxutils.Combine2Int(storeSku.StoreID, storeSku.SkuID)]; param != nil { - if _, err = dao.UpdateEntity(db, storeSku); err != nil { - return err + + isNeedCancelAct := true + for vendorID, act := range actMap { + actStoreMap := partner.SplitActStore(actStoreMap[vendorID]) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSkuMap[vendorID]) + isStoreAllDeleted := true + for _, actStore := range actStoreMap { + isStoreSkuAllDeleted := true + for _, actStoreSku := range actStoreSkuMap[actStore.StoreID] { + if actStoreSku == nil || actStoreSkuParamMap[jxutils.Combine2Int(actStoreSku.StoreID, actStoreSku.SkuID)] != nil { + objActStoreSkuMap := &model.ActStoreSkuMap{} + objActStoreSkuMap.ID = actStoreSku.MapID + if _, err = dao.UpdateEntityLogically(db, objActStoreSkuMap, map[string]interface{}{ + model.FieldSyncStatus: actStoreSku.SyncStatus | model.SyncFlagDeletedMask, + }, ctx.GetUserName(), nil); err != nil { + return err + } + } else { + isStoreSkuAllDeleted = false } } + if isStoreSkuAllDeleted { + if _, err = dao.UpdateEntityLogically(db, &actStore.ActStoreMap, map[string]interface{}{ + model.FieldSyncStatus: actStore.SyncStatus | model.SyncFlagDeletedMask, + }, ctx.GetUserName(), nil); err != nil { + return err + } + } else { + isStoreAllDeleted = false + isNeedCancelAct = false + } + } + + if isStoreAllDeleted { + objActMap := &model.ActMap{} + objActMap.ID = act.MapID + if _, err = dao.UpdateEntityLogically(db, objActMap, map[string]interface{}{ + model.FieldSyncStatus: act.SyncStatus | model.SyncFlagDeletedMask, + }, ctx.GetUserName(), nil); err != nil { + return err + } + } + } + if isNeedCancelAct { + act := &model.Act{} + act.ID = actID + if _, err = dao.UpdateEntityLogically(db, act, map[string]interface{}{ + model.FieldStatus: model.ActStatusCanceled, + }, ctx.GetUserName(), nil); err != nil { + return err } } dao.Commit(db) diff --git a/business/jxstore/act/act_test.go b/business/jxstore/act/act_test.go index 7e91f6eea..d93c7038f 100644 --- a/business/jxstore/act/act_test.go +++ b/business/jxstore/act/act_test.go @@ -31,20 +31,28 @@ func TestCreateAct(t *testing.T) { PricePercentage: 80, }, []int{0, 1, 3}, nil, []*ActStoreSkuParam{ &ActStoreSkuParam{ - StoreID: 100119, - SkuID: 30828, + ActStoreSku: model.ActStoreSku{ + StoreID: 100119, + SkuID: 30828, + }, }, &ActStoreSkuParam{ - StoreID: 100119, - SkuID: 30827, + ActStoreSku: model.ActStoreSku{ + StoreID: 100119, + SkuID: 30827, + }, }, &ActStoreSkuParam{ - StoreID: 100118, - SkuID: 30592, + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30592, + }, }, &ActStoreSkuParam{ - StoreID: 100118, - SkuID: 30565, + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30565, + }, }, }) if err != nil { diff --git a/business/partner/partner_act.go b/business/partner/partner_act.go index 458dd183b..74550b270 100644 --- a/business/partner/partner_act.go +++ b/business/partner/partner_act.go @@ -15,10 +15,18 @@ type IPurchasePlatformPromotionHandler interface { CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) } -func ActStoreSku2Map(actStoreSku []*model.ActStoreSku2) (actStoreSkuMap map[int][]*model.ActStoreSku2) { +func SplitActStore(actStoreList []*model.ActStore2) (actStoreMap map[int]*model.ActStore2) { + actStoreMap = make(map[int]*model.ActStore2) + for _, v := range actStoreList { + actStoreMap[v.StoreID] = v + } + return actStoreMap +} + +func SplitActStoreSku(actStoreSkuList []*model.ActStoreSku2) (actStoreSkuMap map[int][]*model.ActStoreSku2) { actStoreSkuMap = make(map[int][]*model.ActStoreSku2) - for _, storeSku := range actStoreSku { - actStoreSkuMap[storeSku.StoreID] = append(actStoreSkuMap[storeSku.StoreID], storeSku) + for _, v := range actStoreSkuList { + actStoreSkuMap[v.StoreID] = append(actStoreSkuMap[v.StoreID], v) } return actStoreSkuMap } diff --git a/business/partner/purchase/ebai/act.go b/business/partner/purchase/ebai/act.go index f0c89bd08..6be37576c 100644 --- a/business/partner/purchase/ebai/act.go +++ b/business/partner/purchase/ebai/act.go @@ -105,7 +105,7 @@ func ActivitySkuUpdateBatch(activityID int64, actSkuInfoList []*ebaiapi.Activity func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { activity := act2EbaiActivity(act, actOrderRules) if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.ActStoreSku2Map(actStoreSku) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) task := tasksch.NewParallelTask("ebai CreateAct", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { store := batchItemList[0].(*model.ActStore2) @@ -122,7 +122,7 @@ func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.I func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.ActStoreSku2Map(actStoreSku) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) if len(actStoreMap2Remove) > 0 { if err = c.CancelAct(ctx, parentTask, act, actStoreMap2Remove, nil); err != nil { return err diff --git a/business/partner/purchase/mtwm/act.go b/business/partner/purchase/mtwm/act.go index 144a5b59d..3d3494599 100644 --- a/business/partner/purchase/mtwm/act.go +++ b/business/partner/purchase/mtwm/act.go @@ -89,7 +89,7 @@ func createOneShopAct(act *model.Act2, storeMap *model.ActStore2, actStoreSku [] func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { globals.SugarLogger.Debugf("mtwm CreateAct actID:%d", act.ID) if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.ActStoreSku2Map(actStoreSku) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) task := tasksch.NewParallelTask("mtwm CreateAct", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { store := batchItemList[0].(*model.ActStore2) @@ -106,7 +106,7 @@ func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.I func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.ActStoreSku2Map(actStoreSku) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) if len(actStoreMap2Remove) > 0 { if err = c.CancelAct(ctx, parentTask, act, actStoreMap2Remove, nil); err != nil { return err @@ -148,7 +148,7 @@ func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.I func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.ActStoreSku2Map(actStoreSku) + actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) task := tasksch.NewParallelTask("mtwm DeleteAct", nil, ctx, func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { v := batchItemList[0].(*model.ActStore2)