diff --git a/md/mq.go b/md/mq.go index b6f49a0..c923dcc 100644 --- a/md/mq.go +++ b/md/mq.go @@ -3,7 +3,9 @@ package md const OneCirclesExchange = "one.circles" const ( - OneCirclesRoutKeyForSignIn = "sign_in" // 签到 + OneCirclesRoutKeyForSignIn = "sign_in" // 签到 + OneCirclesRoutKeyForAutoExchangeGreenEnergyToPerson = "auto_exchange_green_energy_to_person" // 自动兑换个人绿色能量 + OneCirclesRoutKeyForAutoExchangeGreenEnergyToTeam = "auto_exchange_green_energy_to_team" // 自动兑换团队绿色能量 ) type OneCirclesStructForSignIn struct { @@ -11,3 +13,8 @@ type OneCirclesStructForSignIn struct { Uid int `json:"uid"` Id int64 `json:"id"` } + +type OneCirclesStructForAutoExchangeGreenEnergy struct { + MasterId string `json:"master_id"` + Uid int `json:"uid"` +} diff --git a/rule/one_circles/one_circles_activity_coin_auto_exchange_green_energy.go b/rule/one_circles/one_circles_activity_coin_auto_exchange_green_energy.go index f194745..760a339 100644 --- a/rule/one_circles/one_circles_activity_coin_auto_exchange_green_energy.go +++ b/rule/one_circles/one_circles_activity_coin_auto_exchange_green_energy.go @@ -1,6 +1,7 @@ package one_circles import ( + "code.fnuoos.com/go_rely_warehouse/zyos_go_mq.git/rabbit" "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db" "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/db/model" "code.fnuoos.com/go_rely_warehouse/zyos_go_order_relate_rule.git/md" @@ -15,8 +16,8 @@ import ( "xorm.io/xorm" ) -// ActivityCoinAutoExchangeGreenEnergy 活跃积分自动兑换成绿色能量 -func ActivityCoinAutoExchangeGreenEnergy(engine *xorm.Engine, masterId string) (err error) { +// ActivityCoinAutoExchangeGreenEnergyNew 活跃积分自动兑换成绿色能量 +func ActivityCoinAutoExchangeGreenEnergyNew(engine *xorm.Engine, masterId string, ch *rabbit.Channel) (err error) { //1、查找 `one_circles_green_energy_basic_setting` 基础设置 && `one_circles_public_platoon_basic_setting` 基础设置 oneCirclesGreenEnergyBasicSetting, err := db.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{ "key": "is_open", @@ -82,6 +83,22 @@ func ActivityCoinAutoExchangeGreenEnergy(engine *xorm.Engine, masterId string) ( }() session.Begin() + for _, v := range list1 { + //TODO::推入rabbitmq 异步处理 + ch.Publish(md.OneCirclesExchange, md.OneCirclesStructForAutoExchangeGreenEnergy{ + MasterId: masterId, + Uid: v.Uid, + }, md.OneCirclesRoutKeyForAutoExchangeGreenEnergyToPerson) + } + + for _, v := range list2 { + //TODO::推入rabbitmq 异步处理 + ch.Publish(md.OneCirclesExchange, md.OneCirclesStructForAutoExchangeGreenEnergy{ + MasterId: masterId, + Uid: v.Uid, + }, md.OneCirclesRoutKeyForAutoExchangeGreenEnergyToTeam) + } + //4、处理"个人活跃积分"兑换 for _, v := range list1 { autoExchangeNumsByPersonValue, _ := decimal.NewFromString(v.Amount) @@ -205,3 +222,203 @@ func ActivityCoinAutoExchangeGreenEnergy(engine *xorm.Engine, masterId string) ( } return } + +// ActivityCoinAutoExchangeGreenEnergy 活跃积分自动兑换成绿色能量 +func ActivityCoinAutoExchangeGreenEnergy(engine *xorm.Engine, masterId string) (err error) { + //1、查找 `one_circles_green_energy_basic_setting` 基础设置 && `one_circles_public_platoon_basic_setting` 基础设置 + oneCirclesGreenEnergyBasicSetting, err := db.OneCirclesGreenEnergyBasicSettingGetOneByParams(engine, map[string]interface{}{ + "key": "is_open", + "value": 1, + }) + if err != nil { + return + } + + oneCirclesPublicPlatoonBasicSetting, err := db.OneCirclesPublicPlatoonBasicSettingGetOneByParams(engine, map[string]interface{}{ + "key": "is_open", + "value": 1, + }) + if err != nil { + return + } + if oneCirclesPublicPlatoonBasicSetting.ExchangeRules == "" { + err = errors.New("自动兑换未设置!") + return + } + var exchangeRulesStruct *md2.ExchangeRulesStruct + err = json.Unmarshal([]byte(oneCirclesPublicPlatoonBasicSetting.ExchangeRules), &exchangeRulesStruct) + if err != nil { + return + } + var autoExchangeNumsByPerson = zhios_order_relate_utils.StrToFloat64(exchangeRulesStruct.AutoExchangeNumsByPerson) //个人活跃积分X个自动兑换 + var autoExchangeNumsByTeam = zhios_order_relate_utils.StrToFloat64(exchangeRulesStruct.AutoExchangeNumsByTeam) //团队活跃积分X个自动兑换 + fmt.Println("autoExchangeNumsByPerson>>>>>>>>>>>>", autoExchangeNumsByPerson) + fmt.Println("autoExchangeNumsByTeam>>>>>>>>>>>>", autoExchangeNumsByTeam) + + //2、获取"个人活跃积分" && 获取"团队活跃积分" + var coin1, coin2 model.VirtualCoin + _, err = engine.Where("id = ?", oneCirclesPublicPlatoonBasicSetting.PersonActivePointsCoinId).Get(&coin1) + if err != nil { + return err + } + _, err = engine.Where("id = ?", oneCirclesPublicPlatoonBasicSetting.TeamActivePointsCoinId).Get(&coin2) + if err != nil { + return err + } + personActivePointsCoinExchangeRatioValue, _ := decimal.NewFromString(coin1.ExchangeRatio) + teamActivePointsCoinExchangeRatioValue, _ := decimal.NewFromString(coin2.ExchangeRatio) + + //3、当前 "个人活跃积分"可以自动兑换的用户数据 && "团队活跃积分"可以自动兑换的用户数据 + var list1, list2 []model.UserVirtualAmount + err = engine.Where("coin_id = ?", oneCirclesPublicPlatoonBasicSetting.PersonActivePointsCoinId).And("amount >=?", autoExchangeNumsByPerson).Limit(200, 0).Find(&list1) + if err != nil { + fmt.Println("err:::::1111", err.Error()) + return + } + err = engine.Where("coin_id = ?", oneCirclesPublicPlatoonBasicSetting.TeamActivePointsCoinId).And("amount >=?", autoExchangeNumsByTeam).Limit(200, 0).Find(&list2) + if err != nil { + fmt.Println("err:::::2222", err.Error()) + return + } + + //4、处理"个人活跃积分"兑换 + for _, v := range list1 { + session := engine.NewSession() + session.Begin() + + autoExchangeNumsByPersonValue, _ := decimal.NewFromString(v.Amount) + autoExchangeNumsByPersonAmount := autoExchangeNumsByPersonValue.Div(personActivePointsCoinExchangeRatioValue).String() + //4.1计算涨价公式 + err1, values, _, afterPriceValue := NewCalcPriceIncreaseFormula(autoExchangeNumsByPersonAmount, oneCirclesGreenEnergyBasicSetting) + if err1 != nil { + _ = session.Rollback() + return err1 + } + + //4.2给相应的用户加上个人的绿色积分(可用数量) + err = DealUserCoin(session, md.DealUserCoinReq{ + Kind: "add", + Mid: masterId, + Title: md.OneCirclesPersonalActiveCoinExchangeGreenEnergy, + TransferType: md.OneCirclesPersonalActiveCoinExchangeGreenEnergyForUserVirtualCoinFlow, + OrdId: "", + CoinId: oneCirclesGreenEnergyBasicSetting.PersonGreenEnergyCoinId, + Uid: v.Uid, + Amount: zhios_order_relate_utils.StrToFloat64(values), + }) + if err != nil { + _ = session.Rollback() + fmt.Println("err:::::33333", err.Error()) + return err + } + + //4.3给相应的用户减去个人活跃积分 + err = DealUserCoin(session, md.DealUserCoinReq{ + Kind: "sub", + Mid: masterId, + Title: md.OneCirclesPersonalActiveCoinExchangeToBeGreenEnergy, + TransferType: md.OneCirclesPersonalActiveCoinExchangeToBeGreenEnergyForUserVirtualCoinFlow, + OrdId: "", + CoinId: oneCirclesPublicPlatoonBasicSetting.PersonActivePointsCoinId, + Uid: v.Uid, + Amount: zhios_order_relate_utils.StrToFloat64(v.Amount), + }) + if err != nil { + _ = session.Rollback() + fmt.Println("err:::::33333", err.Error()) + return err + } + + //4.4 减少“原始数量”中的绿色能量 + err = DealAvailableGreenEnergyCoin(session, int(enum.PersonalActivePointRedemption), zhios_order_relate_utils.StrToFloat64(values), zhios_order_relate_utils.StrToFloat64(autoExchangeNumsByPersonAmount), enum.PersonalActivePointRedemption.String(), oneCirclesGreenEnergyBasicSetting, afterPriceValue) + if err != nil { + _ = session.Rollback() + fmt.Println("err:::::44444", err.Error()) + return err + } + session.Commit() + session.Close() + } + + //5、处理"团队活跃积分"兑换 + for _, v := range list2 { + session := engine.NewSession() + session.Begin() + + autoExchangeNumsByTeamValue, _ := decimal.NewFromString(v.Amount) + autoExchangeNumsByTeamAmount := autoExchangeNumsByTeamValue.Div(teamActivePointsCoinExchangeRatioValue).String() + //5.1计算涨价公式 + err1, values, _, afterPriceValue := NewCalcPriceIncreaseFormula(autoExchangeNumsByTeamAmount, oneCirclesGreenEnergyBasicSetting) + if err1 != nil { + _ = session.Rollback() + return err1 + } + + //5.2给相应的用户加上个人的绿色积分(结算数量) + err = DealUserCoin(session, md.DealUserCoinReq{ + Kind: "add", + Mid: masterId, + Title: md.OneCirclesTeamActiveCoinExchangeGreenEnergy, + TransferType: md.OneCirclesTeamActiveCoinExchangeGreenEnergyForUserVirtualCoinFlow, + OrdId: "", + CoinId: oneCirclesGreenEnergyBasicSetting.TeamGreenEnergyCoinId, + Uid: v.Uid, + Amount: zhios_order_relate_utils.StrToFloat64(values), + }) + if err != nil { + _ = session.Rollback() + fmt.Println("err:::::33333", err.Error()) + return err + } + + //5.3给相应的用户减去个人团队积分 + err = DealUserCoin(session, md.DealUserCoinReq{ + Kind: "sub", + Mid: masterId, + Title: md.OneCirclesTeamActiveCoinExchangeToBeGreenEnergy, + TransferType: md.OneCirclesTeamActiveCoinExchangeToBeGreenEnergyForUserVirtualCoinFlow, + OrdId: "", + CoinId: oneCirclesPublicPlatoonBasicSetting.TeamActivePointsCoinId, + Uid: v.Uid, + Amount: zhios_order_relate_utils.StrToFloat64(v.Amount), + }) + if err != nil { + _ = session.Rollback() + fmt.Println("err:::::66666", err.Error()) + return err + } + + //5.4 减少“原始数量”中的绿色能量 + err = DealAvailableGreenEnergyCoin(session, int(enum.TeamActivePointRedemption), zhios_order_relate_utils.StrToFloat64(values), zhios_order_relate_utils.StrToFloat64(autoExchangeNumsByTeamAmount), enum.TeamActivePointRedemption.String(), oneCirclesGreenEnergyBasicSetting, afterPriceValue) + if err != nil { + _ = session.Rollback() + fmt.Println("err:::::44444", err.Error()) + return err + } + err = session.Commit() + session.Close() + } + + session := engine.NewSession() + defer func() { + session.Close() + if err := recover(); err != nil { + _ = zhios_order_relate_logx.Error(err) + } + }() + session.Begin() + + //6、修改 one_circles_green_energy_basic_setting 的 now_price + _, err = db.OneCirclesGreenEnergyBasicSettingUpdate(session, oneCirclesGreenEnergyBasicSetting.Id, oneCirclesGreenEnergyBasicSetting) + if err != nil { + _ = session.Rollback() + fmt.Println("err:::::77777", err.Error()) + return err + } + + if err != nil { + _ = session.Rollback() + return errors.New("事务提交失败") + } + return +}