package mtwm import ( "git.rosy.net.cn/baseapi/platformapi/mtwmapi" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "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" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" ) func actOrderRules2Mtwm(actOrderRules []*model.ActOrderRule) (actDetails []*mtwmapi.FullDiscountActDetail) { for _, v := range actOrderRules { actDetails = append(actDetails, &mtwmapi.FullDiscountActDetail{ OriginalPrice: jxutils.IntPrice2Standard(v.SalePrice), ActPrice: jxutils.IntPrice2Standard(v.DeductPrice), }) } return actDetails } func storeSku2ActData(act *model.Act2, actStoreSku []*model.ActStoreSku2, handler func(int8) bool) (actData []*mtwmapi.RetailDiscountActData) { orderLimit := 1 if act.LimitCount > 0 { orderLimit = act.LimitCount } for _, v := range actStoreSku { if handler == nil || handler(v.SyncStatus) { dayLimit := -1 if v.Stock > 0 { dayLimit = v.Stock } actData = append(actData, &mtwmapi.RetailDiscountActData{ AppFoodCode: utils.Int2Str(v.SkuID), // UserType: 0, StartTime: act.BeginAt.Unix(), EndTime: act.EndAt.Unix(), OrderLimit: orderLimit, DayLimit: dayLimit, // Period: "", // WeeksTime: "", SettingType: mtwmapi.SettingTypeAsPrice, ActPrice: jxutils.IntPrice2Standard(v.ActualActPrice), // DiscountCoefficient: 0, Sequence: int(v.ActPrice), ItemID: utils.Str2Int64WithDefault(v.VendorActID, 0), }) } } return actData } func storeSku2ActData4Delete(actStoreSku []*model.ActStoreSku2, handler func(int8) bool) (actIDList []string) { for _, v := range actStoreSku { if handler == nil || handler(v.SyncStatus) { if v.VendorActID != "" { actIDList = append(actIDList, v.VendorActID) } } } return actIDList } func isCreateOrUpdate(syncStatus int8) bool { return model.IsSyncStatusNeedCreate(syncStatus) || model.IsSyncStatusNeedUpdate(syncStatus) } 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(vendorStoreID, 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 } for _, v := range actStoreSku { if result := actResultMap[utils.Int2Str(v.SkuID)]; result != nil { v.VendorActID = utils.Int64ToStr(result.ActID) } } } else { for _, v := range actStoreSku { v.VendorActID = utils.Int64ToStr(jxutils.GenFakeID()) } } } return err } func cancelOneShopAct(ctx *jxcontext.Context, actStoreSku []*model.ActStoreSku2) (err error) { if list := storeSku2ActData4Delete(actStoreSku, nil /*model.IsSyncStatusNeedDelete*/); len(list) > 0 { if globals.EnableMtwmStoreWrite { err = api.MtwmAPI.RetailDiscountDelete(actStoreSku[0].VendorStoreID, list) } } return err } func getActStoreSkuFromTaskResult(taskReslt []interface{}) (list []*model.ActStoreSku2) { for _, v := range taskReslt { actStoreSkuList := v.([]*model.ActStoreSku2) list = append(list, actStoreSkuList...) } return list } func createSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actStoreSku []*model.ActStoreSku2) (createdList []*model.ActStoreSku2, err error) { globals.SugarLogger.Debugf("mtwm createSkuAct") actStoreSkuListList := partner.SplitActStoreSku2List(actStoreSku) 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 { retVal = []interface{}{list} } return retVal, err }, actStoreSkuListList) tasksch.HandleTask(task, parentTask, true).Run() result, err := task.GetResult(0) return getActStoreSkuFromTaskResult(result), err } func cancelSkuAct(ctx *jxcontext.Context, parentTask tasksch.ITask, actStoreSku []*model.ActStoreSku2) (canceledList []*model.ActStoreSku2, err error) { globals.SugarLogger.Debugf("mtwm cancelSkuAct") actStoreSkuListList := partner.SplitActStoreSku2List(actStoreSku) 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, actStoreSkuList); err == nil { retVal = []interface{}{actStoreSkuList} } return retVal, err }, actStoreSkuListList) tasksch.HandleTask(task, parentTask, true).Run() result, err := task.GetResult(0) return getActStoreSkuFromTaskResult(result), err } func (c *PurchaseHandler) SyncAct(ctx *jxcontext.Context, parentTask tasksch.ITask, act *model.Act2, actOrderRules []*model.ActOrderRule, actStoreSkuList []*model.ActStoreSku2) (err error) { globals.SugarLogger.Debugf("mtwm SyncAct, actID:%d", act.ID) var actStoreSkuList4Create, actStoreSkuList4Delete []*model.ActStoreSku2 var updateItems []*dao.KVUpdateItem actStoreSkuMap := partner.SplitActStoreSku(actStoreSkuList) for storeID := range actStoreSkuMap { for _, actStoreSku := range actStoreSkuMap[storeID] { if model.IsSyncStatusDelete(actStoreSku.SyncStatus) { actStoreSkuList4Delete = append(actStoreSkuList4Delete, actStoreSku) } else if model.IsSyncStatusNew(actStoreSku.SyncStatus) { actStoreSkuList4Create = append(actStoreSkuList4Create, actStoreSku) } } } err = func() (err error) { if model.IsSyncStatusDelete(act.SyncStatus) { canceledList, err2 := cancelSkuAct(ctx, nil, actStoreSkuList) updateItems = append(updateItems, partner.ActStoreSku2Update(canceledList, model.SyncFlagModifiedMask)...) if err = err2; err == nil { updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagModifiedMask)) } } else if model.IsSyncStatusNew(act.SyncStatus) { createdList, err2 := createSkuAct(ctx, nil, act, actStoreSkuList4Create) updateItems = append(updateItems, partner.ActStoreSku2Update(createdList, model.SyncFlagNewMask)...) if err = err2; err == nil { updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagNewMask)) } } else if model.IsSyncStatusUpdate(act.SyncStatus) { // globals.SugarLogger.Debug(utils.Format4Output(updateItems, false)) if len(actStoreSkuList4Create) > 0 { addedList, err2 := createSkuAct(ctx, nil, act, actStoreSkuList4Create) updateItems = append(updateItems, partner.ActStoreSku2Update(addedList, model.SyncFlagNewMask)...) if err = err2; err != nil { return err } } if len(actStoreSkuList4Delete) > 0 { deletedList, err2 := cancelSkuAct(ctx, nil, actStoreSkuList4Delete) updateItems = append(updateItems, partner.ActStoreSku2Update(deletedList, model.SyncFlagDeletedMask)...) if err = err2; err != nil { return err } } if err == nil { updateItems = append(updateItems, partner.Act2Update(act, model.SyncFlagModifiedMask)) } } return err }() db := dao.GetDB() _, err2 := dao.BatchUpdateEntityByKV(db, updateItems) if err == nil { err = err2 } return err }