diff --git a/internal/logic/admin/send_email_reward_logic.go b/internal/logic/admin/send_email_reward_logic.go index e7d6cd4..a1bad4e 100644 --- a/internal/logic/admin/send_email_reward_logic.go +++ b/internal/logic/admin/send_email_reward_logic.go @@ -2,13 +2,10 @@ package admin import ( "context" - "github.com/zeromicro/go-zero/core/threading" - "nova_task/internal/model" - "nova_task/internal/pkg/errs" - "strings" - "time" - "github.com/zeromicro/go-zero/core/logx" + "github.com/zeromicro/go-zero/core/threading" + "nova_task/internal/consts" + "nova_task/internal/pkg/errs" "nova_task/internal/svc" ) @@ -54,29 +51,7 @@ func (l *SendEmailRewardLogic) SendEmailReward() error { continue } - // points,elite_points,castile,keys - switch strings.ToLower(rw.RewardType) { - case "points": - err = l.svcCtx.TaskAssetModel.AddPoint(ctx, u.Id, rw.Value) - case "elite_points": - err = l.svcCtx.TaskAssetModel.AddElitePoints(ctx, u.Id, rw.Value) - case "castile": - err = l.svcCtx.TaskAssetModel.AddCastile(ctx, u.Id, rw.Value) - case "keys": - err = l.svcCtx.TaskAssetModel.AddKeys(ctx, u.Id, int(rw.Value.IntPart())) - } - if err != nil { - l.Errorw("add asset failed", logx.Field("err", err), logx.Field("uid", u.Id), logx.Field("rewardType", rw.RewardType), logx.Field("value", rw.Value)) - } else { - l.Infow("add asset success", logx.Field("uid", u.Id), logx.Field("rewardType", rw.RewardType), logx.Field("value", rw.Value)) - } - _, err = l.svcCtx.TaskAssetRecordModel.Insert(ctx, &model.NhTaskAssetRecord{ - Uid: int(u.Id), - AssetField: rw.RewardType, - Count: rw.Value.InexactFloat64(), - Remark: rw.Remark, - CreateTime: int(time.Now().Unix()), - }) + err = l.svcCtx.AddUserAsset(ctx, u.Id, consts.AssetType(rw.RewardType), rw.Value, rw.Remark, 0, 0, false) if err != nil { l.Errorw("insert task asset record failed", logx.Field("err", err), logx.Field("uid", u.Id), logx.Field("rewardType", rw.RewardType), logx.Field("value", rw.Value)) } diff --git a/internal/logic/nft/stake_settle_logic.go b/internal/logic/nft/stake_settle_logic.go index d7dce96..0be5af1 100644 --- a/internal/logic/nft/stake_settle_logic.go +++ b/internal/logic/nft/stake_settle_logic.go @@ -5,7 +5,8 @@ import ( "github.com/shopspring/decimal" "github.com/spf13/cast" "github.com/zeromicro/go-zero/core/logx" - "nova_task/internal/model" + "github.com/zeromicro/go-zero/core/stores/sqlx" + "nova_task/internal/consts" "nova_task/internal/pkg/utils" "nova_task/internal/svc" "time" @@ -106,30 +107,20 @@ func (l *StakeSettleLogic) StakeSettle() { gameBonus = taskConf.OccupyPercent reward = reward.Mul(decimal.NewFromFloat(float64(100+gameBonus) / 100)) } - err = l.svcCtx.StakeRewardModel.SetReward(l.ctx, uid, awardSeq, gameBonus, tokensDecimal, reward) - if err != nil { - logx.Errorw("set reward failed", logx.Field("err", err), logx.Field("uid", uid), logx.Field("awardSeq", awardSeq), logx.Field("coefficient", coefficient), logx.Field("tokens", tokens), logx.Field("reward", reward)) - continue - } + err = l.svcCtx.DBConn.TransactCtx(l.ctx, func(ctx context.Context, session sqlx.Session) error { + err = l.svcCtx.StakeRewardModel.SetReward(l.ctx, uid, awardSeq, gameBonus, tokensDecimal, reward) + if err != nil { + //logx.Errorw("set reward failed", logx.Field("err", err), logx.Field("uid", uid), logx.Field("awardSeq", awardSeq), logx.Field("coefficient", coefficient), logx.Field("tokens", tokens), logx.Field("reward", reward)) + return err + } - // 加资产 - err = l.svcCtx.TaskAssetModel.AddCastile(l.ctx, uid, reward) - if err != nil { - logx.Errorw("add castile failed", logx.Field("err", err), logx.Field("uid", uid), logx.Field("awardSeq", awardSeq), logx.Field("reward", reward)) - continue - } - // 加资产记录表 - _, err = l.svcCtx.TaskAssetRecordModel.Insert(l.ctx, &model.NhTaskAssetRecord{ - Uid: int(uid), - EventId: 0, - AssetField: "castile", - Count: reward.InexactFloat64(), - Remark: "nft软质押奖励", - ProvideUid: 0, - CreateTime: int(now.Unix()), + // 加资产 + err = l.svcCtx.AddUserAssetWithSession(l.ctx, session, uid, consts.AssetType_Castile, reward, "nft软质押奖励", 0, 0, false) + return err }) + if err != nil { - logx.Errorw("insert task asset record failed", logx.Field("err", err), logx.Field("uid", uid), logx.Field("awardSeq", awardSeq), logx.Field("reward", reward)) + logx.Errorw("质押结算发放奖励失败", logx.Field("err", err), logx.Field("uid", uid), logx.Field("awardSeq", awardSeq), logx.Field("coefficient", coefficient), logx.Field("tokens", tokens), logx.Field("reward", reward)) } } } diff --git a/internal/logic/task/get_task_reward_logic.go b/internal/logic/task/get_task_reward_logic.go index 34e46e0..5038207 100644 --- a/internal/logic/task/get_task_reward_logic.go +++ b/internal/logic/task/get_task_reward_logic.go @@ -6,6 +6,7 @@ import ( "github.com/shopspring/decimal" "github.com/spf13/cast" "github.com/zeromicro/go-zero/core/stores/sqlx" + "nova_task/internal/consts" "nova_task/internal/model" "nova_task/internal/pkg/errs" "nova_task/internal/pkg/utils" @@ -70,19 +71,21 @@ func (l *GetTaskRewardLogic) GetTaskReward(req *types.TaskIdPath) (*types.GetTas return err } // 给予用户奖励 - err = l.svcCtx.TaskAssetModel.WithSession(session).AddPoint(l.ctx, uint(uid), decimal.NewFromInt(int64(task.Points))) - if err != nil { - return err - } - // 记录用户获奖记录 - _, err = l.svcCtx.TaskAssetRecordModel.Insert(l.ctx, &model.NhTaskAssetRecord{ - Uid: uid, - EventId: uint64(task.Id), - AssetField: "points", - Count: float64(task.Points), - Remark: "完成任务:" + task.Title, - CreateTime: int(time.Now().Unix()), - }) + err = l.svcCtx.AddUserAssetWithSession(l.ctx, session, uint(uid), consts.AssetType_Points, decimal.NewFromInt(int64(task.Points)), "完成任务:"+task.Title, uint64(task.Id), 0, true) + //err = l.svcCtx.TaskAssetModel.WithSession(session).AddPoint(l.ctx, uint(uid), decimal.NewFromInt(int64(task.Points))) + //if err != nil { + // return err + //} + //// 记录用户获奖记录 + //_, err = l.svcCtx.TaskAssetRecordModel.Insert(l.ctx, &model.NhTaskAssetRecord{ + // Uid: uid, + // EventId: uint64(task.Id), + // AssetField: "points", + // Count: float64(task.Points), + // Remark: "完成任务:" + task.Title, + // CreateTime: int(time.Now().Unix()), + //}) + return err }) diff --git a/internal/model/nh_task_asset_record_model.go b/internal/model/nh_task_asset_record_model.go index 43fe711..55e5305 100755 --- a/internal/model/nh_task_asset_record_model.go +++ b/internal/model/nh_task_asset_record_model.go @@ -16,7 +16,7 @@ type ( // and implement the added methods in customNhTaskAssetRecordModel. NhTaskAssetRecordModel interface { nhTaskAssetRecordModel - withSession(session sqlx.Session) NhTaskAssetRecordModel + WithSession(session sqlx.Session) NhTaskAssetRecordModel } customNhTaskAssetRecordModel struct { @@ -31,7 +31,7 @@ func NewNhTaskAssetRecordModel(conn sqlx.SqlConn) NhTaskAssetRecordModel { } } -func (m *customNhTaskAssetRecordModel) withSession(session sqlx.Session) NhTaskAssetRecordModel { +func (m *customNhTaskAssetRecordModel) WithSession(session sqlx.Session) NhTaskAssetRecordModel { return NewNhTaskAssetRecordModel(sqlx.NewSqlConnFromSession(session)) } diff --git a/internal/svc/service_context.go b/internal/svc/service_context.go index 9580662..bb6894b 100644 --- a/internal/svc/service_context.go +++ b/internal/svc/service_context.go @@ -3,6 +3,7 @@ package svc import ( "context" "errors" + "fmt" ea "github.com/earn-alliance/earnalliance-go" "github.com/shopspring/decimal" "github.com/zeromicro/go-zero/core/logx" @@ -22,8 +23,8 @@ type ServiceContext struct { Config config.Config TaskModel model.NhTaskModel - TaskAssetModel model.NhTaskAssetModel - TaskAssetRecordModel model.NhTaskAssetRecordModel + taskAssetModel model.NhTaskAssetModel + taskAssetRecordModel model.NhTaskAssetRecordModel TaskProgressModel model.NhTaskProgressModel TwitterModel model.NhTwitterModel PromoteBindModel model.NhPromoteBindModel @@ -60,8 +61,8 @@ func NewServiceContext(c config.Config) *ServiceContext { Config: c, TaskModel: model.NewNhTaskModel(dbConn), - TaskAssetModel: model.NewNhTaskAssetModel(dbConn), - TaskAssetRecordModel: model.NewNhTaskAssetRecordModel(dbConn), + taskAssetModel: model.NewNhTaskAssetModel(dbConn), + taskAssetRecordModel: model.NewNhTaskAssetRecordModel(dbConn), TaskProgressModel: model.NewNhTaskProgressModel(dbConn), TwitterModel: model.NewNhTwitterModel(dbConn), PromoteBindModel: model.NewNhPromoteBindModel(dbConn), @@ -149,24 +150,33 @@ func (s *ServiceContext) GetUidByEmail(ctx context.Context, email string) (uint, return u.Id, nil } -func (s *ServiceContext) AddUserAsset(ctx context.Context, uid uint, asset consts.AssetType, amount decimal.Decimal, remark string, eventId uint64, provideUid uint, referralReward bool) error { +func (s *ServiceContext) AddUserAssetWithSession(ctx context.Context, session sqlx.Session, uid uint, asset consts.AssetType, amount decimal.Decimal, remark string, eventId uint64, provideUid uint, referralReward bool) error { + var assetModel model.NhTaskAssetModel + var recordModel model.NhTaskAssetRecordModel + if session != nil { + assetModel = s.taskAssetModel.WithSession(session) + recordModel = s.taskAssetRecordModel.WithSession(session) + } else { + assetModel = s.taskAssetModel + recordModel = s.taskAssetRecordModel + } var err error switch asset { case consts.AssetType_Points: - err = s.TaskAssetModel.AddPoint(ctx, uid, amount) + err = assetModel.AddPoint(ctx, uid, amount) case consts.AssetType_Castile: - err = s.TaskAssetModel.AddCastile(ctx, uid, amount) + err = assetModel.AddCastile(ctx, uid, amount) case consts.AssetType_Elite_Points: - err = s.TaskAssetModel.AddElitePoints(ctx, uid, amount) + err = assetModel.AddElitePoints(ctx, uid, amount) case consts.AssetType_Keys: - err = s.TaskAssetModel.AddKeys(ctx, uid, int(amount.IntPart())) + err = assetModel.AddKeys(ctx, uid, int(amount.IntPart())) default: return errors.New("unknown asset type") } if err != nil { return err } - _, err = s.TaskAssetRecordModel.Insert(ctx, &model.NhTaskAssetRecord{ + _, err = recordModel.Insert(ctx, &model.NhTaskAssetRecord{ Uid: int(uid), EventId: eventId, AssetField: string(asset), @@ -198,6 +208,11 @@ func (s *ServiceContext) AddUserAsset(ctx context.Context, uid uint, asset const } else if s.AmbassadorModel.IsAmbassador(ctx, pb.ShareUid) { rate = 10 } - rewardAmount := amount.Mul(decimal.NewFromFloat(float64(rate) / 100)) - return s.AddUserAsset(ctx, pb.ShareUid, asset, rewardAmount, "referral reward", 0, uid, false) + rated := decimal.NewFromFloat(float64(rate) / 100) + rewardAmount := amount.Mul(rated) + return s.AddUserAssetWithSession(ctx, session, pb.ShareUid, asset, rewardAmount, fmt.Sprintf("分享返利,比例%s", rated.String()), 7, uid, false) +} + +func (s *ServiceContext) AddUserAsset(ctx context.Context, uid uint, asset consts.AssetType, amount decimal.Decimal, remark string, eventId uint64, provideUid uint, referralReward bool) error { + return s.AddUserAssetWithSession(ctx, nil, uid, asset, amount, remark, eventId, provideUid, referralReward) }