From 594aa3e6b7317d431cd9737c26e1bed7f2f9d42d Mon Sep 17 00:00:00 2001 From: gazebo Date: Sun, 23 Jun 2019 21:06:41 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E9=87=8D=E6=9E=84=E6=96=B0=E4=BA=AC?= =?UTF-8?q?=E8=A5=BF=E6=B4=BB=E5=8A=A8=EF=BC=8C=E5=B9=B3=E5=8F=B0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=AE=9A=E4=B8=BA=E7=AC=BC=E7=BB=9F=E7=9A=84SyncAct?= =?UTF-8?q?=EF=BC=8C=E4=BA=AC=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=EF=BC=8C=E5=88=A0=E9=99=A4=E5=95=86=E5=93=81=EF=BC=8C?= =?UTF-8?q?=E6=9A=82=E4=B8=8D=E6=94=AF=E6=8C=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxstore/act/act.go | 437 +++++++++++--------- business/jxstore/act/act_test.go | 70 +++- business/model/act.go | 49 +-- business/model/dao/act.go | 39 +- business/model/dao/dao_bz.go | 28 ++ business/partner/partner.go | 2 +- business/partner/partner_act.go | 71 +++- business/partner/purchase/ebai/act.go | 118 +++--- business/partner/purchase/elm/act.go | 12 +- business/partner/purchase/jd/act.go | 172 ++++---- business/partner/purchase/mtwm/act.go | 86 +--- business/partner/purchase/weimob/wsc/act.go | 12 +- globals/beegodb/beegodb.go | 2 +- main.go | 1 + 14 files changed, 565 insertions(+), 534 deletions(-) diff --git a/business/jxstore/act/act.go b/business/jxstore/act/act.go index a4b2bd5a9..0063d2d76 100644 --- a/business/jxstore/act/act.go +++ b/business/jxstore/act/act.go @@ -1,15 +1,13 @@ package act import ( - "fmt" "time" - "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" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" ) @@ -33,7 +31,8 @@ type ActDetail struct { model.Act2 } -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) { +func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Act, vendorIDs []int, actStoreSku []*ActStoreSkuParam) (validVendorIDs []int, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) { + wholeValidVendorMap := make(map[int]int) if len(actStoreSku) > 0 { storeIDMap := make(map[int]int) skuIDMap := make(map[int]int) @@ -43,18 +42,16 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] skuIDMap[v.SkuID] = 1 storeSkuParamMap[v.StoreID] = append(storeSkuParamMap[v.StoreID], v) } - db := dao.GetDB() storeSkuList, err2 := dao.GetStoresSkusInfo(db, jxutils.IntMap2List(storeIDMap), jxutils.IntMap2List(skuIDMap)) if err = err2; err != nil { - return nil, nil, nil, nil, err + return nil, nil, nil, err } storeSkuMap := make(map[int64]*model.StoreSkuBind) for _, v := range storeSkuList { storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v } - wholeValidVendorMap := make(map[int]int) for storeID, oneStoreSkuParam := range storeSkuParamMap { validVendorMap := make(map[int]int) validSkuMap := make(map[int]int) @@ -87,15 +84,16 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] actStoreSkuMapList = append(actStoreSkuMapList, actSkuMap) } } + wholeValidVendorMap[vendorID] = 1 } else if !dao.IsNoRowsError(err) { - return nil, nil, nil, nil, err + return nil, nil, nil, err } else { err = nil } } for _, v := range oneStoreSkuParam { - if validSkuMap[v.SkuID] == 1 { + if validSkuMap[v.SkuID] == 1 { // todo 这里是否需要判断 if storeSkuInfo := storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)]; storeSkuInfo != nil { storeSku := &v.ActStoreSku storeSku.ActID = act.ID @@ -105,40 +103,12 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, act *model.Act, vendorIDs [] } } } - for vendorID := range validVendorMap { - wholeValidVendorMap[vendorID] = 1 - actStoreMap := &model.ActStoreMap{ - ActID: act.ID, - StoreID: storeID, - VendorID: vendorID, - - SyncStatus: model.SyncFlagNewMask, - } - dao.WrapAddIDCULDEntity(actStoreMap, ctx.GetUserName()) - actStoreMapList = append(actStoreMapList, actStoreMap) - } - } - for vendorID := range wholeValidVendorMap { - actMap := &model.ActMap{ - ActID: act.ID, - VendorID: vendorID, - - SyncStatus: model.SyncFlagNewMask, - } - dao.WrapAddIDCULDEntity(actMap, ctx.GetUserName()) - actMapList = append(actMapList, actMap) } } - return actMapList, actStoreMapList, actStoreSkuList, actStoreSkuMapList, err + return jxutils.IntMap2List(wholeValidVendorMap), actStoreSkuList, actStoreSkuMapList, err } -func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam) (actID int, err error) { - vendorIDMap := make(map[int]bool) - for _, v := range vendorIDs { - vendorIDMap[v] = true - } - db := dao.GetDB() - dao.WrapAddIDCULDEntity(act, ctx.GetUserName()) +func addActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap) (err error) { dao.Begin(db) defer func() { if r := recover(); r != nil { @@ -146,32 +116,108 @@ func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules panic(r) } }() - err = dao.CreateEntity(db, act) - if err != nil { - return 0, err + + storeSkuMap := make(map[int64]int) + for _, v := range actStoreSkuList { + err = dao.CreateEntity(db, v) + if err != nil { + dao.Rollback(db) + return err + } + storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v.ID } - actMapList, actStoreMapList, actStoreSkuList, actStoreSkuMapList, err := ActStoreSkuParam2Model(ctx, act, vendorIDs, actStoreSku) - if err != nil { - return 0, err + for _, v := range actStoreSkuMapList { + v.BindID = storeSkuMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] } - isEmptyAct := true - for _, list := range []interface{}{ - actMapList, actStoreMapList, actStoreSkuList, actStoreSkuMapList, - } { - if len(utils.Interface2Slice(list)) > 0 { - err = dao.CreateMultiEntities(db, list) - if err != nil { - dao.Rollback(db) - return 0, err - } - isEmptyAct = false + + if len(actStoreSkuMapList) > 0 { + err = dao.CreateMultiEntities(db, actStoreSkuMapList) + if err != nil { + dao.Rollback(db) + return err } } - if isEmptyAct { + dao.Commit(db) + return err +} + +func AddActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActStoreSkuParam) (err error) { + db := dao.GetDB() + var vendorIDs []int + actMap, err := dao.GetActVendorInfo(db, actID, nil) + if err != nil { + return err + } + for vendorID := range actMap { + vendorIDs = append(vendorIDs, vendorID) + } + var act *model.Act + if len(vendorIDs) > 0 { + act = &actMap[vendorIDs[0]].Act + } else { + act = &model.Act{} + act.ID = actID + if err = dao.GetEntity(db, act); err != nil { + return err + } + } + _, actStoreSkuList, actStoreSkuMapList, err := ActStoreSkuParam2Model(ctx, db, act, vendorIDs, actStoreSku) + if err != nil { + return err + } + + err = addActStoreBind(ctx, db, actStoreSkuList, actStoreSkuMapList) + return err +} + +func CreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam) (actID int, err error) { + db := dao.GetDB() + + dao.Begin(db) + defer func() { + if r := recover(); r != nil { + dao.Rollback(db) + panic(r) + } + }() + + dao.WrapAddIDCULDEntity(act, ctx.GetUserName()) + err = dao.CreateEntity(db, act) + if err != nil { dao.Rollback(db) - return 0, fmt.Errorf("没有门店及SKU满足需求,空操作") + return 0, err + } + + validVendorIDs, actStoreSkuList, actStoreSkuMapList, err := ActStoreSkuParam2Model(ctx, db, act, vendorIDs, actStoreSku) + if err != nil { + return 0, err + } + + var actMapList []*model.ActMap + for vendorID := range validVendorIDs { + actMap := &model.ActMap{ + ActID: act.ID, + VendorID: vendorID, + + SyncStatus: model.SyncFlagNewMask, + } + dao.WrapAddIDCULDEntity(actMap, ctx.GetUserName()) + actMapList = append(actMapList, actMap) + } + if len(actMapList) > 0 { + err = dao.CreateMultiEntities(db, actMapList) + if err != nil { + dao.Rollback(db) + return 0, err + } + } + + if err = addActStoreBind(ctx, db, actStoreSkuList, actStoreSkuMapList); err != nil { + dao.Rollback(db) + return 0, err } dao.Commit(db) + actID = act.ID err = SyncAct(ctx, actID, nil, nil, nil) return actID, err @@ -185,18 +231,6 @@ func GetActDetail(ctx *jxcontext.Context, actID int) (actDetail *ActDetail, err return actDetail, err } -// func GetAcVendorInfo(ctx *jxcontext.Context, actID int) (err error) { -// return err -// } - -// func GetAcStoresVendorInfo(ctx *jxcontext.Context, actID int, storeIDs []int) (err error) { -// return err -// } - -// func GetAcStoresSkusVendorInfo(ctx *jxcontext.Context, actID int, storeIDs, skuIDs []int) (err error) { -// return err -// } - func UpdateAct(ctx *jxcontext.Context, act *model.Act, actRules []*ActOrderRuleParam, actStoreSku []*ActStoreSkuParam) (err error) { return err } @@ -214,27 +248,13 @@ func DeleteActStoreBind(ctx *jxcontext.Context, actID int, actStoreSku []*ActSto 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) - for _, v := range actStoreSku { - storeIDMap[v.StoreID] = 1 - skuIDMap[v.SkuID] = 1 - actStoreSkuParamMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v - } - storeIDs := jxutils.IntMap2List(storeIDMap) - skuIDs := jxutils.IntMap2List(skuIDMap) - +func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actStoreSkuParam []*ActStoreSkuParam) (err error) { 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) + + actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, nil, nil) if err != nil { return err } @@ -248,50 +268,66 @@ func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto } }() + actStoreSkuParamMap := make(map[int64]*ActStoreSkuParam) + for _, v := range actStoreSkuParam { + actStoreSkuParamMap[jxutils.Combine2Int(v.StoreID, v.SkuID)] = v + if _, err = dao.DeleteEntityLogically(db, &model.ActStoreSku{}, nil, ctx.GetUserName(), + map[string]interface{}{ + model.FieldActID: actID, + model.FieldStoreID: v.StoreID, + model.FieldSkuID: v.SkuID, + }); err != nil { + return err + } + } + isNeedCancelAct := true for vendorID, act := range actMap { - actStoreMap := partner.SplitActStore(actStoreMap[vendorID]) + isDeleteAll := true + isDeleteAtLeastOne := false 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 { - if _, err = dao.UpdateEntityLogically(db, partner.ActStoreSku2ActStoreSkuMap(actStoreSku), map[string]interface{}{ - model.FieldSyncStatus: actStoreSku.SyncStatus | model.SyncFlagDeletedMask, - }, ctx.GetUserName(), nil); err != nil { + for storeID := range actStoreSkuMap { + for _, actStoreSku := range actStoreSkuMap[storeID] { + if actStoreSkuParam == nil || actStoreSkuParamMap[jxutils.Combine2Int(actStoreSku.StoreID, actStoreSku.SkuID)] != nil { + if _, err = dao.UpdateEntityLogically(db, partner.ActStoreSku2ActStoreSkuMap(actStoreSku), + map[string]interface{}{ + model.FieldSyncStatus: actStoreSku.SyncStatus | model.SyncFlagDeletedMask, + }, ctx.GetUserName(), nil); err != nil { return err } + isDeleteAtLeastOne = true } else { - isStoreSkuAllDeleted = false + isNeedCancelAct = false + isDeleteAll = false } } - if isStoreSkuAllDeleted { - if _, err = dao.UpdateEntityLogically(db, partner.ActStore2ActStoreMap(actStore), map[string]interface{}{ - model.FieldSyncStatus: actStore.SyncStatus | model.SyncFlagDeletedMask, - }, ctx.GetUserName(), nil); err != nil { - return err - } - } else { - isStoreAllDeleted = false - isNeedCancelAct = false - } } - - if isStoreAllDeleted { - if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act), map[string]interface{}{ - model.FieldSyncStatus: act.SyncStatus | model.SyncFlagDeletedMask, - }, ctx.GetUserName(), nil); err != nil { + if isDeleteAll || isDeleteAtLeastOne { + // globals.SugarLogger.Debugf("isDeleteAll:%t", isDeleteAll) + syncStatus := model.SyncFlagModifiedMask + if isDeleteAll { + syncStatus = model.SyncFlagDeletedMask + } + syncStatus |= act.SyncStatus + if _, err = dao.UpdateEntityLogically(db, partner.Act2ActMap(act), + map[string]interface{}{ + model.FieldSyncStatus: syncStatus, + }, ctx.GetUserName(), nil); err != nil { return err } } + if isDeleteAll != isNeedCancelAct { + globals.SugarLogger.Warnf("deleteActStoreBind, actID:%d isDeleteAll:%t != isNeedCancelAct:%t", act.ID, isDeleteAll, isNeedCancelAct) + } } + 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 { + if _, err = dao.UpdateEntityLogically(db, act, + map[string]interface{}{ + model.FieldStatus: model.ActStatusCanceled, + }, ctx.GetUserName(), nil); err != nil { return err } } @@ -300,93 +336,110 @@ func deleteActStoreBind(ctx *jxcontext.Context, db *dao.DaoDB, actID int, actSto } func SyncAct(ctx *jxcontext.Context, actID int, vendorIDs, storeIDs, skuIDs []int) (err error) { - var actOrderRules []*model.ActOrderRule db := dao.GetDB() actMap, err := dao.GetActVendorInfo(db, actID, vendorIDs) if err != nil { return err } - actStoreMap, err := dao.GetActStoreVendorInfo(db, actID, vendorIDs, storeIDs) + actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, nil, storeIDs, skuIDs) if err != nil { return err } - actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, vendorIDs, storeIDs, skuIDs) - if err != nil { - return err - } - var realVendorIDs []int for vendorID := range actMap { - realVendorIDs = append(realVendorIDs, vendorID) - } - - task := tasksch.NewParallelTask("SyncAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - vendorID := batchItemList[0].(int) - handler := partner.GetPurchasePlatformFromVendorID(vendorID) - if handler == nil { - err = fmt.Errorf("不被支持的vendorID:%d", vendorID) - } else { - act := actMap[vendorID] - actStore := actStoreMap[vendorID] - actStoreSku := actStoreSkuMap[vendorID] - // globals.SugarLogger.Debugf("%s", utils.Format4Output(act, false)) - // globals.SugarLogger.Debugf("%s", utils.Format4Output(actStore, false)) - // globals.SugarLogger.Debugf("%s", utils.Format4Output(actStoreSku, false)) - if act != nil && actStore != nil && actStoreSku != nil { - if model.IsSyncStatusNeedCreate(act.SyncStatus) { - err = handler.CreateAct(ctx, task, act, actOrderRules, actStore, actStoreSku) - } else if model.IsSyncStatusNeedUpdate(act.SyncStatus) { - if act.Status == model.ActStatusCanceled { - err = handler.CancelAct(ctx, task, act, actStore, actStoreSku) - } else { - // actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update := splitActStore(actStore) - // err = handler.UpdateAct(ctx, task, act, actOrderRules, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update, actStoreSku) - } - } - if err == nil { - actMap := &model.ActMap{} - actMap.ID = act.MapID - dao.UpdateEntityLogically(db, actMap, map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldVendorActID: act.VendorActID, - }, ctx.GetUserName(), nil) - for _, v := range actStore { - storeMap := model.ActStoreMap{} - storeMap.ID = v.MapID - dao.UpdateEntityLogically(db, storeMap, map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldVendorActID: v.VendorActID, - }, ctx.GetUserName(), nil) - } - for _, v := range actStoreSku { - storeSkuMap := model.ActStoreSkuMap{} - storeSkuMap.ID = v.MapID - dao.UpdateEntityLogically(db, storeSkuMap, map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldVendorActID: v.VendorActID, - }, ctx.GetUserName(), nil) - } - } - } + if handler := partner.GetPurchasePlatformFromVendorID(vendorID).(partner.IPurchasePlatformActHandler); handler != nil { + if err = handler.SyncAct(ctx, nil, actMap[vendorID], nil, actStoreSkuMap[vendorID]); err != nil { + return err } - return nil, err - }, realVendorIDs) - tasksch.ManageTask(task).Run() - _, err = task.GetResult(0) + } + } + return err + // var actOrderRules []*model.ActOrderRule + // db := dao.GetDB() + // actMap, err := dao.GetActVendorInfo(db, actID, vendorIDs) + // if err != nil { + // return err + // } + // actStoreMap, err := dao.GetActStoreVendorInfo(db, actID, vendorIDs, storeIDs) + // if err != nil { + // return err + // } + // actStoreSkuMap, err := dao.GetActStoreSkuVendorInfo(db, actID, vendorIDs, storeIDs, skuIDs) + // if err != nil { + // return err + // } + // var realVendorIDs []int + // for vendorID := range actMap { + // realVendorIDs = append(realVendorIDs, vendorID) + // } + + // task := tasksch.NewParallelTask("SyncAct", nil, ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // vendorID := batchItemList[0].(int) + // handler := partner.GetPurchasePlatformFromVendorID(vendorID) + // if handler == nil { + // err = fmt.Errorf("不被支持的vendorID:%d", vendorID) + // } else { + // act := actMap[vendorID] + // actStore := actStoreMap[vendorID] + // actStoreSku := actStoreSkuMap[vendorID] + // // globals.SugarLogger.Debugf("%s", utils.Format4Output(act, false)) + // // globals.SugarLogger.Debugf("%s", utils.Format4Output(actStore, false)) + // // globals.SugarLogger.Debugf("%s", utils.Format4Output(actStoreSku, false)) + // if act != nil && actStore != nil && actStoreSku != nil { + // if model.IsSyncStatusNeedCreate(act.SyncStatus) { + // err = handler.CreateAct(ctx, task, act, actOrderRules, actStore, actStoreSku) + // } else if model.IsSyncStatusNeedUpdate(act.SyncStatus) { + // if act.Status == model.ActStatusCanceled { + // err = handler.CancelAct(ctx, task, act, actStore, actStoreSku) + // } else { + // // actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update := splitActStore(actStore) + // // err = handler.UpdateAct(ctx, task, act, actOrderRules, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update, actStoreSku) + // } + // } + // if err == nil { + // actMap := &model.ActMap{} + // actMap.ID = act.MapID + // dao.UpdateEntityLogically(db, actMap, map[string]interface{}{ + // model.FieldSyncStatus: 0, + // model.FieldVendorActID: act.VendorActID, + // }, ctx.GetUserName(), nil) + // for _, v := range actStore { + // storeMap := model.ActStoreMap{} + // storeMap.ID = v.MapID + // dao.UpdateEntityLogically(db, storeMap, map[string]interface{}{ + // model.FieldSyncStatus: 0, + // model.FieldVendorActID: v.VendorActID, + // }, ctx.GetUserName(), nil) + // } + // for _, v := range actStoreSku { + // storeSkuMap := model.ActStoreSkuMap{} + // storeSkuMap.ID = v.MapID + // dao.UpdateEntityLogically(db, storeSkuMap, map[string]interface{}{ + // model.FieldSyncStatus: 0, + // model.FieldVendorActID: v.VendorActID, + // }, ctx.GetUserName(), nil) + // } + // } + // } + // } + // return nil, err + // }, realVendorIDs) + // tasksch.ManageTask(task).Run() + // _, err = task.GetResult(0) return err } -func splitActStore(actStore []*model.ActStore2) (actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2) { - for _, v := range actStore { - if model.IsSyncStatusNeedDelete(v.SyncStatus) { - if !dao.IsVendorThingIDEmpty(v.VendorActID) { - actStoreMap2Remove = append(actStoreMap2Remove, v) - } - } else if model.IsSyncStatusNeedCreate(v.SyncStatus) { - actStoreMap2Add = append(actStoreMap2Add, v) - } else if model.IsSyncStatusNeedUpdate(v.SyncStatus) { - actStoreMap2Update = append(actStoreMap2Update, v) - } - } - return actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update -} +// func splitActStore(actStore []*model.ActStore2) (actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2) { +// for _, v := range actStore { +// if model.IsSyncStatusNeedDelete(v.SyncStatus) { +// if !dao.IsVendorThingIDEmpty(v.VendorActID) { +// actStoreMap2Remove = append(actStoreMap2Remove, v) +// } +// } else if model.IsSyncStatusNeedCreate(v.SyncStatus) { +// actStoreMap2Add = append(actStoreMap2Add, v) +// } else if model.IsSyncStatusNeedUpdate(v.SyncStatus) { +// actStoreMap2Update = append(actStoreMap2Update, v) +// } +// } +// return actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update +// } diff --git a/business/jxstore/act/act_test.go b/business/jxstore/act/act_test.go index d93c7038f..00b860feb 100644 --- a/business/jxstore/act/act_test.go +++ b/business/jxstore/act/act_test.go @@ -21,15 +21,15 @@ func init() { func TestInitDb(t *testing.T) { dao.ExecuteSQL(dao.GetDB(), ` - DROP TABLE IF EXISTS act,act_map, act_order_rule, act_store_map, act_store_sku, act_store_sku_map; + DROP TABLE IF EXISTS act, act_map, act_order_rule, act_store_sku, act_store_sku_map; `) } func TestCreateAct(t *testing.T) { actID, err := CreateAct(jxcontext.AdminCtx, &model.Act{ - Name: "测试活动2", + Name: "测试活动", PricePercentage: 80, - }, []int{0, 1, 3}, nil, []*ActStoreSkuParam{ + }, []int{0}, nil, []*ActStoreSkuParam{ &ActStoreSkuParam{ ActStoreSku: model.ActStoreSku{ StoreID: 100119, @@ -68,6 +68,70 @@ func TestCancelAct(t *testing.T) { } } +func TestDeleteActStoreBind(t *testing.T) { + err := DeleteActStoreBind(jxcontext.AdminCtx, 1, []*ActStoreSkuParam{ + // &ActStoreSkuParam{ + // ActStoreSku: model.ActStoreSku{ + // StoreID: 100119, + // SkuID: 30828, + // }, + // }, + // &ActStoreSkuParam{ + // ActStoreSku: model.ActStoreSku{ + // StoreID: 100119, + // SkuID: 30827, + // }, + // }, + &ActStoreSkuParam{ + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30592, + }, + }, + &ActStoreSkuParam{ + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30565, + }, + }, + }) + if err != nil { + t.Fatal(err) + } +} + +func TestAddActStoreBind(t *testing.T) { + err := AddActStoreBind(jxcontext.AdminCtx, 1, []*ActStoreSkuParam{ + // &ActStoreSkuParam{ + // ActStoreSku: model.ActStoreSku{ + // StoreID: 100119, + // SkuID: 30828, + // }, + // }, + // &ActStoreSkuParam{ + // ActStoreSku: model.ActStoreSku{ + // StoreID: 100119, + // SkuID: 30827, + // }, + // }, + &ActStoreSkuParam{ + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30592, + }, + }, + &ActStoreSkuParam{ + ActStoreSku: model.ActStoreSku{ + StoreID: 100118, + SkuID: 30565, + }, + }, + }) + if err != nil { + t.Fatal(err) + } +} + func TestSyncAct(t *testing.T) { err := SyncAct(jxcontext.AdminCtx, 1, nil, nil, nil) if err != nil { diff --git a/business/model/act.go b/business/model/act.go index f42d7df44..94af19ba3 100644 --- a/business/model/act.go +++ b/business/model/act.go @@ -48,6 +48,13 @@ type ActMap struct { SyncStatus int `orm:"default(2)" json:"syncStatus"` } +func (*ActMap) TableUnique() [][]string { + return [][]string{ + []string{"ActID", "VendorID", "DeletedAt"}, + } +} + +// 不建表 type Act2 struct { MapID int `orm:"column(map_id)"` @@ -66,32 +73,6 @@ type ActOrderRule struct { DeductPrice int64 `orm:"" json:"deductPrice"` // 减的价格 } -// type ActStore struct { -// ModelIDCULD - -// ActID int `orm:"column(act_id)" json:"actID"` -// StoreID int `orm:"column(store_id)" json:"storeID"` -// } - -type ActStoreMap struct { - ModelIDCULD - - ActID int `orm:"column(act_id)" json:"actID"` - StoreID int `orm:"column(store_id)" json:"storeID"` - VendorID int `orm:"column(vendor_id)" json:"vendorID"` - - VendorActID string `orm:"column(vendor_act_id);size(48)" json:"vendorActID"` - SyncStatus int `orm:"default(2)" json:"syncStatus"` -} - -type ActStore2 struct { - MapID int `orm:"column(map_id)"` - - ActStoreMap - - VendorStoreID string `orm:"column(vendor_store_id)" json:"vendorStoreID"` -} - type ActStoreSku struct { ModelIDCULD @@ -111,13 +92,14 @@ type ActStoreSku struct { func (*ActStoreSku) TableUnique() [][]string { return [][]string{ - []string{"ActID", "SkuID", "StoreID", "DeletedAt"}, + []string{"ActID", "StoreID", "SkuID", "DeletedAt"}, } } type ActStoreSkuMap struct { ModelIDCULD + BindID int `orm:"column(bind_id)" json:"bindID"` ActID int `orm:"column(act_id)" json:"actID"` StoreID int `orm:"column(store_id)" json:"storeID"` SkuID int `orm:"column(sku_id)" json:"skuID"` @@ -128,6 +110,19 @@ type ActStoreSkuMap struct { ActualActPrice int64 `orm:"" json:"actualActPrice"` // 单品级活动用,创建活动时商品的活动价格 } +func (*ActStoreSkuMap) TableUnique() [][]string { + return [][]string{ + []string{"ActID", "BindID", "VendorID"}, + } +} + +func (*ActStoreSkuMap) TableIndex() [][]string { + return [][]string{ + []string{"ActID", "StoreID", "SkuID", "VendorID", "DeletedAt"}, + } +} + +// 不建表 type ActStoreSku2 struct { MapID int `orm:"column(map_id)"` diff --git a/business/model/dao/act.go b/business/model/dao/act.go index 97b000667..d3a120fe4 100644 --- a/business/model/dao/act.go +++ b/business/model/dao/act.go @@ -32,38 +32,6 @@ func GetActVendorInfo(db *DaoDB, actID int, vendorIDs []int) (actMap map[int]*mo return actMap, err } -func GetActStoreVendorInfo(db *DaoDB, actID int, vendorIDs, storeIDs []int) (actStoreMap map[int][]*model.ActStore2, err error) { - sql := ` - SELECT t1.*, - t1.id map_id, - t2.vendor_store_id - FROM act_store_map t1 - JOIN store_map t2 ON t2.store_id = t1.store_id AND t2.vendor_id = t1.vendor_id AND t2.deleted_at = ? - WHERE t1.deleted_at = ? AND t1.act_id = ? - ` - sqlParams := []interface{}{ - utils.DefaultTimeValue, - utils.DefaultTimeValue, - actID, - } - if len(vendorIDs) > 0 { - sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" - sqlParams = append(sqlParams, vendorIDs) - } - if len(storeIDs) > 0 { - sql += " AND t1.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" - sqlParams = append(sqlParams, storeIDs) - } - var actStoreList []*model.ActStore2 - if err = GetRows(db, &actStoreList, sql, sqlParams...); err == nil { - actStoreMap = make(map[int][]*model.ActStore2) - for _, v := range actStoreList { - actStoreMap[v.VendorID] = append(actStoreMap[v.VendorID], v) - } - } - return actStoreMap, err -} - func GetActStoreSkuVendorInfo(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs []int) (actStoreSkuMap map[int][]*model.ActStoreSku2, err error) { sql := ` SELECT t1.*, @@ -79,15 +47,14 @@ func GetActStoreSkuVendorInfo(db *DaoDB, actID int, vendorIDs, storeIDs, skuIDs ELSE '' END vendor_sku_id - FROM act_store_sku t1 - JOIN act_store_sku_map t2 ON t2.act_id = t1.act_id AND t2.sku_id = t1.sku_id AND t2.store_id = t1.store_id AND t2.deleted_at = ? + FROM act_store_sku_map t2 + JOIN act_store_sku t1 ON t1.id = t2.bind_id JOIN store_map t3 ON t3.store_id = t1.store_id AND t3.vendor_id = t2.vendor_id AND t3.deleted_at = ? JOIN sku t4 ON t4.id = t1.sku_id AND t4.deleted_at = ? JOIN store_sku_bind t5 ON t5.sku_id = t1.sku_id AND t5.store_id = t1.store_id AND t5.deleted_at = ? - WHERE t1.deleted_at = ? AND t1.act_id = ? + WHERE t2.deleted_at = ? AND t2.act_id = ? ` sqlParams := []interface{}{ - utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, utils.DefaultTimeValue, diff --git a/business/model/dao/dao_bz.go b/business/model/dao/dao_bz.go index e2ddbab3a..da1cb74e3 100644 --- a/business/model/dao/dao_bz.go +++ b/business/model/dao/dao_bz.go @@ -11,6 +11,11 @@ import ( "github.com/astaxie/beego/orm" ) +type KVUpdateItem struct { + Item interface{} + KVs map[string]interface{} +} + // 这里面的函数要求实体是IDCUDL的,即含有ID, UpdatedAt, LastOperator, DeletedAt字段 func GetEntitiesByKV(db *DaoDB, item interface{}, conditions map[string]interface{}, isIncludeDeleted bool) (err error) { @@ -57,6 +62,29 @@ func UpdateEntityByKV(db *DaoDB, item interface{}, kvs map[string]interface{}, c return num, err } +func BatchUpdateEntityByKV(db *DaoDB, items []*KVUpdateItem) (num int64, err error) { + if len(items) > 0 { + Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + Rollback(db) + if r != nil { + panic(r) + } + } + }() + for _, v := range items { + num2, err2 := UpdateEntityByKV(db, v.Item, v.KVs, nil) + if err = err2; err != nil { + return 0, err + } + num += num2 + } + Commit(db) + } + return num, nil +} + func UpdateEntityLogically(db *DaoDB, item interface{}, kvs map[string]interface{}, userName string, conditions map[string]interface{}) (num int64, err error) { if conditions != nil && refutil.IsFieldExist(item, model.FieldDeletedAt) { conditions = utils.MergeMaps(conditions, map[string]interface{}{ diff --git a/business/partner/partner.go b/business/partner/partner.go index 6e88e4211..25f96ccf0 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -172,7 +172,7 @@ type IStoreManager interface { // 所有非以Sync,Refresh开头的函数不用自己清理sync_status标记(VendorSync统一处理) type IPurchasePlatformHandler interface { - IPurchasePlatformPromotionHandler + IPurchasePlatformActHandler GetVendorID() int GetStatusFromVendorStatus(vendorStatus string) int diff --git a/business/partner/partner_act.go b/business/partner/partner_act.go index 1c7de58bc..c32fa3a7c 100644 --- a/business/partner/partner_act.go +++ b/business/partner/partner_act.go @@ -1,26 +1,23 @@ package partner import ( + "time" + "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" + "git.rosy.net.cn/jx-callback/business/model/dao" ) -type IPurchasePlatformPromotionHandler interface { - // 如果是单品级活动,actOrderRules为空 - // 如果是订单级活动,actStoreSku可以为空(表示不限制SKU) - CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) - UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap2Remove, actStoreMap2Add, actStoreMap2Update []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) - // 取消整个京西活动 - CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) -} +type IPurchasePlatformActHandler interface { + // // 如果是单品级活动,actOrderRules为空 + // // 如果是订单级活动,actStoreSku可以为空(表示不限制SKU) + // CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) + // UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) + // // 取消整个京西活动 + // CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (err error) -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 + SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) } func SplitActStoreSku(actStoreSkuList []*model.ActStoreSku2) (actStoreSkuMap map[int][]*model.ActStoreSku2) { @@ -31,18 +28,56 @@ func SplitActStoreSku(actStoreSkuList []*model.ActStoreSku2) (actStoreSkuMap map return actStoreSkuMap } +func SplitActStoreSku2List(actStoreSkuList []*model.ActStoreSku2) (actStoreSkuListList [][]*model.ActStoreSku2) { + actStoreSkuMap := SplitActStoreSku(actStoreSkuList) + for _, v := range actStoreSkuMap { + actStoreSkuListList = append(actStoreSkuListList, v) + } + return actStoreSkuListList +} + func Act2ActMap(act *model.Act2) (actMap *model.ActMap) { actMap = &model.ActMap{} actMap.ID = act.MapID return actMap } -func ActStore2ActStoreMap(actStore *model.ActStore2) (actStoreMap *model.ActStoreMap) { - return &actStore.ActStoreMap -} - func ActStoreSku2ActStoreSkuMap(actStoreSku *model.ActStoreSku2) (actStoreSkuMap *model.ActStoreSkuMap) { actStoreSkuMap = &model.ActStoreSkuMap{} actStoreSkuMap.ID = actStoreSku.MapID return actStoreSkuMap } + +func Act2Update(act *model.Act2, syncStatus int) (item *dao.KVUpdateItem) { + kvs := map[string]interface{}{ + model.FieldSyncStatus: 0, + } + if syncStatus == model.SyncFlagDeletedMask { + kvs[model.FieldDeletedAt] = time.Now() + } else if syncStatus == model.SyncFlagNewMask { + kvs[model.FieldVendorActID] = act.VendorActID + } + item = &dao.KVUpdateItem{ + Item: Act2ActMap(act), + KVs: kvs, + } + return item +} + +func ActStoreSku2Update(actStoreSkuList []*model.ActStoreSku2, syncStatus int) (items []*dao.KVUpdateItem) { + for _, v := range actStoreSkuList { + kvs := map[string]interface{}{ + model.FieldSyncStatus: 0, + } + if syncStatus == model.SyncFlagDeletedMask { + kvs[model.FieldDeletedAt] = time.Now() + } else if syncStatus == model.SyncFlagNewMask { + kvs[model.FieldVendorActID] = v.VendorActID + } + items = append(items, &dao.KVUpdateItem{ + Item: ActStoreSku2ActStoreSkuMap(v), + KVs: kvs, + }) + } + return items +} diff --git a/business/partner/purchase/ebai/act.go b/business/partner/purchase/ebai/act.go index 6be37576c..e20faed53 100644 --- a/business/partner/purchase/ebai/act.go +++ b/business/partner/purchase/ebai/act.go @@ -102,16 +102,20 @@ func ActivitySkuUpdateBatch(activityID int64, actSkuInfoList []*ebaiapi.Activity return api.EbaiAPI.ActivitySkuUpdateBatch(activityID, actSkuInfoList) } -func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { +func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) { activity := act2EbaiActivity(act, actOrderRules) if act.Type < model.ActOrderBegin { - actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) + actStoreSkuListList := partner.SplitActStoreSku2List(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) - store.VendorActID, err = createOneShopAct(utils.Int2Str(store.StoreID), activity, actStoreSkuMap[store.StoreID]) + list := batchItemList[0].([]*model.ActStoreSku2) + var vendorActID string + vendorActID, err = createOneShopAct(utils.Int2Str(list[0].StoreID), activity, list) + for _, v := range list { + v.VendorActID = vendorActID + } return nil, err - }, actStoreMap) + }, actStoreSkuListList) tasksch.HandleTask(task, parentTask, true).Run() _, err = task.GetResult(0) } else { @@ -120,67 +124,55 @@ func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.I return err } -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.SplitActStoreSku(actStoreSku) - if len(actStoreMap2Remove) > 0 { - if err = c.CancelAct(ctx, parentTask, act, actStoreMap2Remove, nil); err != nil { - return err - } - for _, v := range actStoreMap2Remove { - delete(actStoreSkuMap, v.StoreID) - } - } - if len(actStoreMap2Add) > 0 { - if err = c.CreateAct(ctx, parentTask, act, actOrderRules, actStoreMap2Add, actStoreSku); err != nil { - return err - } - for _, v := range actStoreMap2Add { - delete(actStoreSkuMap, v.StoreID) - } - } - task := tasksch.NewParallelTask("ebai UpdateAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - v := batchItemList[0].(*model.ActStore2) - if storeSkus := actStoreSkuMap[v.StoreID]; storeSkus != nil { - if list := actStoreSu2Ebai4Delete(storeSkus); len(list) > 0 { - if _, err = ActivitySkuDeleteBatch(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, list, false); err != nil { - return nil, err - } - } - if list := actStoreSu2Ebai4Add(storeSkus); len(list) > 0 { - if _, err = ActivitySkuAddBatch(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, actType2Ebai(act.Type), list, false); err != nil { - return nil, err - } - } - if list := actStoreSu2Ebai4Update(storeSkus); len(list) > 0 { - if _, err = ActivitySkuUpdateBatch(utils.Str2Int64(v.VendorActID), list); err != nil { - return nil, err - } - } - } - return nil, err - }, actStoreMap2Update) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } else { +func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) { + // if act.Type < model.ActOrderBegin { + // actStoreSkuMap := partner.SplitActStoreSku(actStoreSku) + // task := tasksch.NewParallelTask("ebai UpdateAct", nil, ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // v := batchItemList[0].(*model.ActStore2) + // if storeSkus := actStoreSkuMap[v.StoreID]; storeSkus != nil { + // if list := actStoreSu2Ebai4Delete(storeSkus); len(list) > 0 { + // if _, err = ActivitySkuDeleteBatch(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, list, false); err != nil { + // return nil, err + // } + // } + // if list := actStoreSu2Ebai4Add(storeSkus); len(list) > 0 { + // if _, err = ActivitySkuAddBatch(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, actType2Ebai(act.Type), list, false); err != nil { + // return nil, err + // } + // } + // if list := actStoreSu2Ebai4Update(storeSkus); len(list) > 0 { + // if _, err = ActivitySkuUpdateBatch(utils.Str2Int64(v.VendorActID), list); err != nil { + // return nil, err + // } + // } + // } + // return nil, err + // }, actStoreMap2Update) + // tasksch.HandleTask(task, parentTask, true).Run() + // _, err = task.GetResult(0) + // } else { - } + // } return err } -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 { - task := tasksch.NewParallelTask("ebai DeleteAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - v := batchItemList[0].(*model.ActStore2) - if globals.EnableEbaiStoreWrite { - err = api.EbaiAPI.ActivityDisable(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, 0) - } - return nil, err - }, actStoreMap) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } +func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (err error) { + // if act.Type < model.ActOrderBegin { + // task := tasksch.NewParallelTask("ebai DeleteAct", nil, ctx, + // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + // v := batchItemList[0].(*model.ActStore2) + // if globals.EnableEbaiStoreWrite { + // err = api.EbaiAPI.ActivityDisable(utils.Str2Int64(v.VendorActID), utils.Int2Str(v.StoreID), 0, 0) + // } + // return nil, err + // }, actStoreMap) + // tasksch.HandleTask(task, parentTask, true).Run() + // _, err = task.GetResult(0) + // } return err } + +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + return nil +} diff --git a/business/partner/purchase/elm/act.go b/business/partner/purchase/elm/act.go index bcc142ed5..d2ea0ea42 100644 --- a/business/partner/purchase/elm/act.go +++ b/business/partner/purchase/elm/act.go @@ -6,14 +6,6 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) -func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - return err -} - -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) { - return err -} - -func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - return err +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + return nil } diff --git a/business/partner/purchase/jd/act.go b/business/partner/purchase/jd/act.go index 1342382af..6bedb6f44 100644 --- a/business/partner/purchase/jd/act.go +++ b/business/partner/purchase/jd/act.go @@ -3,6 +3,7 @@ package jd import ( "time" + "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/business/jxutils" @@ -132,7 +133,7 @@ func storeSku2Jd(actStoreSku []*model.ActStoreSku2, handler func(syncStatus int) return jdActStoreSku } -func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { +func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) { if act.Type < model.ActOrderBegin { act.VendorActID, err = createSkuAct(ctx, act, actStoreSku) } else { @@ -152,7 +153,11 @@ func createSkuAct(ctx *jxcontext.Context, act *model.Act2, actStoreSku []*model. vendorActID = utils.Int64ToStr(infoID) if err = CreatePromotionRules(act.Type, infoID, "", act.LimitDevice, act.LimitPin, act.LimitCount, act.LimitDaily, traceID); err == nil { if _, err = CreatePromotionSku(act.Type, infoID, "", storeSku2Jd(actStoreSku, model.IsSyncStatusNeedCreate), traceID); err == nil { - err = ConfirmPromotion(act.Type, infoID, "", traceID) + if err = ConfirmPromotion(act.Type, infoID, "", traceID); err == nil { + for _, v := range actStoreSku { + v.VendorActID = vendorActID + } + } } } } @@ -166,114 +171,93 @@ func cancelSkuActSkus(ctx *jxcontext.Context, actType int, vendorActID string, a return err } -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) { +func cancelSkuAct(ctx *jxcontext.Context, actType int, vendorActID string) (err error) { + err = CancelPromotion(actType, utils.Str2Int64(vendorActID), "", getTraceID(ctx)) return err } -func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - traceID := getTraceID(ctx) +func (c *PurchaseHandler) UpdateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSku []*model.ActStoreSku2) (err error) { + return err +} + +func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (err error) { if act.Type < model.ActOrderBegin { outInfoID := utils.Int2Str(act.ID) - err = CancelPromotion(act.Type, 0, outInfoID, traceID) + err = CancelPromotion(act.Type, 0, outInfoID, getTraceID(ctx)) } return err } -func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreList []*model.ActStore2, actStoreSkuList []*model.ActStoreSku2) (err error) { - traceID := getTraceID(ctx) +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + globals.SugarLogger.Debugf("jd SyncAct, actID:%d", act.ID) + vendorActInfoMap := make(map[string][]*model.ActStoreSku2) + deleteActInfoMap := make(map[string][]*model.ActStoreSku2) + var actStoreSkuList4Create []*model.ActStoreSku2 + var updateItems []*dao.KVUpdateItem - actStoreMap := partner.SplitActStore(actStoreList) actStoreSkuMap := partner.SplitActStoreSku(actStoreSkuList) - var actStoreSkuList4Create, actStoreSkuList4Delete []*model.ActStoreSku2 - var okList []*LogicUpdateInfo - for _, actStore := range actStoreMap { - for _, actStoreSku := range actStoreSkuMap[actStore.StoreID] { + for storeID := range actStoreSkuMap { + for _, actStoreSku := range actStoreSkuMap[storeID] { + vendorActInfoMap[actStoreSku.VendorActID] = append(vendorActInfoMap[actStoreSku.VendorActID], actStoreSku) if model.IsSyncStatusNeedCreate(actStoreSku.SyncStatus) { - if actStore.VendorActID == "" { - actStoreSkuList4Create = append(actStoreSkuList4Create, actStoreSku) - } else { - if actStoreSku.VendorActID, err = createSkuAct(ctx, act, []*model.ActStoreSku2{actStoreSku}); err != nil { - return err - } - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStoreSku2ActStoreSkuMap(actStoreSku), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldVendorActID: actStoreSku.VendorActID, - }, - }) - } + actStoreSkuList4Create = append(actStoreSkuList4Create, actStoreSku) } else if model.IsSyncStatusNeedDelete(actStoreSku.SyncStatus) { - if actStoreSku.VendorActID == "" { - actStoreSkuList4Delete = append(actStoreSkuList4Delete, actStoreSku) - } else { - if err = CancelPromotion(act.Type, utils.Str2Int64(actStoreSku.VendorActID), "", traceID); err != nil { - return err - } - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStoreSku2ActStoreSkuMap(actStoreSku), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldDeletedAt: time.Now(), - }, - }) + vendorActID := actStoreSku.VendorActID + if vendorActID == "" { + vendorActID = act.VendorActID } - } - } - if actStore.VendorActID != "" { - if model.IsSyncStatusDelete(actStore.SyncStatus) { - if err = CancelPromotion(act.Type, utils.Str2Int64(actStore.VendorActID), "", traceID); err != nil { - return err - } - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStore2ActStoreMap(actStore), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldDeletedAt: time.Now(), - }, - }) - - } else if len(actStoreSkuList4Delete) > 0 { - if err = cancelSkuActSkus(ctx, act.Type, actStore.VendorActID, actStoreSkuList4Delete); err != nil { - return err - } - } - for _, v := range actStoreSkuList4Delete { - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStoreSku2ActStoreSkuMap(v), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - model.FieldDeletedAt: time.Now(), - }, - }) - } - actStoreSkuList4Delete = nil - } - - if act.VendorActID != "" { - if len(actStoreSkuList4Create) > 0 { - if actStore.VendorActID, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil { - return err - } - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStore2ActStoreMap(actStore), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - }, - }) - for _, v := range actStoreSkuList4Create { - okList = append(okList, &LogicUpdateInfo{ - Item: partner.ActStoreSku2ActStoreSkuMap(v), - KVs: map[string]interface{}{ - model.FieldSyncStatus: 0, - }, - }) - } - actStoreSkuList4Create = nil + deleteActInfoMap[vendorActID] = append(deleteActInfoMap[vendorActID], actStoreSku) } } } - // db := dao.GetDB() - + err = func() (err error) { + if model.IsSyncStatusNeedCreate(act.SyncStatus) { + if act.VendorActID, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil { + return err + } + updateItems = append(updateItems, partner.ActStoreSku2Update(actStoreSkuList4Create, model.SyncFlagNewMask)...) + updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagNewMask)) + } else if model.IsSyncStatusNeedDelete(act.SyncStatus) { + for vendorActID := range vendorActInfoMap { + if vendorActID != "" { + if err = cancelSkuAct(ctx, act.Type, vendorActID); err != nil { + return err + } + } + } + for _, actStoreSkuList := range vendorActInfoMap { + updateItems = append(updateItems, partner.ActStoreSku2Update(actStoreSkuList, model.SyncFlagDeletedMask)...) + } + updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagDeletedMask)) + } else if model.IsSyncStatusNeedUpdate(act.SyncStatus) { + // globals.SugarLogger.Debug(utils.Format4Output(updateItems, false)) + for vendorActID := range deleteActInfoMap { + if vendorActID != "" { + if len(vendorActInfoMap[vendorActID]) == len(deleteActInfoMap[vendorActID]) { + err = cancelSkuAct(ctx, act.Type, vendorActID) + } else { + err = cancelSkuActSkus(ctx, act.Type, vendorActID, deleteActInfoMap[vendorActID]) + } + if err != nil { + return err + } + } + updateItems = append(updateItems, partner.ActStoreSku2Update(deleteActInfoMap[vendorActID], model.SyncFlagDeletedMask)...) + } + if len(actStoreSkuList4Create) > 0 { + if _, err = createSkuAct(ctx, act, actStoreSkuList4Create); err != nil { + return err + } + updateItems = append(updateItems, partner.ActStoreSku2Update(actStoreSkuList4Create, model.SyncFlagNewMask)...) + } + updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagModifiedMask)) + } + return nil + }() + db := dao.GetDB() + _, err2 := dao.BatchUpdateEntityByKV(db, updateItems) + if err == nil { + err = err2 + } return err } diff --git a/business/partner/purchase/mtwm/act.go b/business/partner/purchase/mtwm/act.go index 3d3494599..93d394528 100644 --- a/business/partner/purchase/mtwm/act.go +++ b/business/partner/purchase/mtwm/act.go @@ -7,7 +7,6 @@ import ( "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/jx-callback/business/model" - "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) @@ -60,11 +59,11 @@ func isCreateOrUpdate(syncStatus int) bool { return model.IsSyncStatusNeedCreate(syncStatus) || model.IsSyncStatusNeedUpdate(syncStatus) } -func createOneShopAct(act *model.Act2, storeMap *model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { +func createOneShopAct(act *model.Act2, vendorStoreID string, actStoreSku []*model.ActStoreSku2) (err error) { actData := storeSku2ActData(act, actStoreSku, isCreateOrUpdate) if len(actData) > 0 { if globals.EnableMtwmStoreWrite { - actResult, err2 := api.MtwmAPI.RetailDiscountBatchSave(storeMap.VendorStoreID, actData) + actResult, err2 := api.MtwmAPI.RetailDiscountBatchSave(vendorStoreID, actData) if err = err2; err != nil { return err } @@ -86,84 +85,13 @@ func createOneShopAct(act *model.Act2, storeMap *model.ActStore2, actStoreSku [] return err } -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.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) - err = createOneShopAct(act, store, actStoreSkuMap[store.StoreID]) - return nil, err - }, actStoreMap) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } else { - +func cancelOneShopAct(ctx *jxcontext.Context, vendorStoreID string, actStoreSku []*model.ActStoreSku2) (err error) { + if list := storeSku2ActData4Delete(actStoreSku, model.IsSyncStatusNeedDelete); len(list) > 0 { + err = api.MtwmAPI.RetailDiscountDelete(vendorStoreID, list) } return err } -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.SplitActStoreSku(actStoreSku) - if len(actStoreMap2Remove) > 0 { - if err = c.CancelAct(ctx, parentTask, act, actStoreMap2Remove, nil); err != nil { - return err - } - for _, v := range actStoreMap2Remove { - delete(actStoreSkuMap, v.StoreID) - } - } - if len(actStoreMap2Add) > 0 { - if err = c.CreateAct(ctx, parentTask, act, actOrderRules, actStoreMap2Add, actStoreSku); err != nil { - return err - } - for _, v := range actStoreMap2Add { - delete(actStoreSkuMap, v.StoreID) - } - } - task := tasksch.NewParallelTask("mtwm UpdateAct", nil, ctx, - func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - v := batchItemList[0].(*model.ActStore2) - if storeSkus := actStoreSkuMap[v.StoreID]; storeSkus != nil { - if list := storeSku2ActData4Delete(storeSkus, model.IsSyncStatusNeedDelete); len(list) > 0 { - if err = api.MtwmAPI.RetailDiscountDelete(v.VendorStoreID, list); err != nil { - return nil, err - } - } - if err = createOneShopAct(act, v, actStoreSkuMap[v.StoreID]); err != nil { - return nil, err - } - } - return nil, err - }, actStoreMap2Update) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } else { - - } - return err -} - -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.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) - actIDList := storeSku2ActData4Delete(actStoreSkuMap[v.StoreID], nil) - if len(actIDList) > 0 { - if globals.EnableMtwmStoreWrite { - err = api.MtwmAPI.RetailDiscountDelete(v.VendorStoreID, actIDList) - } - } - return nil, err - }, actStoreMap) - tasksch.HandleTask(task, parentTask, true).Run() - _, err = task.GetResult(0) - } else { - - } - return err +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + return nil } diff --git a/business/partner/purchase/weimob/wsc/act.go b/business/partner/purchase/weimob/wsc/act.go index 12d69f212..1210cab88 100644 --- a/business/partner/purchase/weimob/wsc/act.go +++ b/business/partner/purchase/weimob/wsc/act.go @@ -6,14 +6,6 @@ import ( "git.rosy.net.cn/jx-callback/business/model" ) -func (c *PurchaseHandler) CreateAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - return err -} - -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) { - return err -} - -func (c *PurchaseHandler) CancelAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreMap []*model.ActStore2, actStoreSku []*model.ActStoreSku2) (err error) { - return err +func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { + return nil } diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 0680b55d2..8c2c288cc 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -46,7 +46,7 @@ func Init() { // 如下语句建表时要出错(INDEX名字太长了),暂时放一下,必须放最后一句 orm.RegisterModel(&model.OrderFinancial{}, &model.AfsOrder{}, &model.OrderDiscountFinancial{}, &model.OrderSkuFinancial{}) // orm.RegisterModel(&model.Act{}, &model.ActOrderRule{}, &model.ActStoreSku{}) - // orm.RegisterModel(&model.ActMap{}, &model.ActStoreMap{}, &model.ActStoreSkuMap{}) + // orm.RegisterModel(&model.ActMap{}, &model.ActStoreSkuMap{}) // create table orm.RunSyncdb("default", false, true) } diff --git a/main.go b/main.go index ada89dd47..9b298a3c8 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,7 @@ import ( "git.rosy.net.cn/jx-callback/globals/beegodb" _ "git.rosy.net.cn/jx-callback/routers" + // _ "git.rosy.net.cn/jx-callback/business/jxstore/act" _ "git.rosy.net.cn/jx-callback/business/partner/printer/feie" _ "git.rosy.net.cn/jx-callback/business/partner/printer/xiaowm" _ "git.rosy.net.cn/jx-callback/business/partner/printer/yilianyun"