package task import ( "context" "errors" "github.com/spf13/cast" "math" "nova_task/internal/model" "nova_task/internal/pkg/errs" "nova_task/internal/pkg/utils" "time" "nova_task/internal/svc" "nova_task/internal/types" "github.com/zeromicro/go-zero/core/logx" ) type GetStakeTaskDetailLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } // NewGetStakeTaskDetailLogic 质押任务详情 func NewGetStakeTaskDetailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetStakeTaskDetailLogic { return &GetStakeTaskDetailLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } func (l *GetStakeTaskDetailLogic) GetStakeTaskDetail() (*types.StakeTaskDetail, error) { uid := utils.GetUidUint(l.ctx) start, end, err := l.svcCtx.ConfigModel.GetNftStakeTaskOpenDate(l.ctx) if err != nil { if errors.Is(err, model.ErrNotFound) { return nil, errs.New(errs.ErrTaskOpenDateNotSet, "task open date not set") } l.Errorw("get nft stake task open date failed", logx.Field("err", err)) return nil, errs.New(errs.ErrDatabaseOperate, err) } taskConf, err := l.svcCtx.ConfigModel.GetNftStakeTaskConf(l.ctx) if err != nil { if errors.Is(err, model.ErrNotFound) { return nil, errs.New(errs.ErrTaskConfNotSet, "task config not set") } l.Errorw("get nft stake task conf failed", logx.Field("err", err)) return nil, errs.New(errs.ErrDatabaseOperate, err) } stakeNfts, err := l.svcCtx.StakeNftModel.FindByUid(l.ctx, uid) if err != nil { l.Errorw("get user stake nft failed", logx.Field("err", err)) return nil, errs.New(errs.ErrDatabaseOperate, err) } var produceTokensToday float64 for _, sn := range stakeNfts { if sn.State != 1 { continue } if utils.IsBigTarot(sn.TokenId) { produceTokensToday += float64(taskConf.GreatTarot) } else { produceTokensToday += float64(taskConf.LittleTarot) } } var canReceiveTokens float64 var gameBonus int if produceTokensToday > 0 { if l.svcCtx.GamePitModel.UserExist(l.ctx, uid) { gameBonus = taskConf.OccupyPercent } if gameBonus > 0 { canReceiveTokens = produceTokensToday * float64(100+gameBonus) / 100 } else { canReceiveTokens = produceTokensToday } } if canReceiveTokens > 0 { awardSeq := cast.ToInt(time.Now().Format("20060102")) coefficient, err := l.svcCtx.StakeRewardModel.GetRandomCoefficientByUid(l.ctx, uid, awardSeq, taskConf.MinCoefficient, taskConf.MaxCoefficient) if err != nil { l.Errorw("get random coefficient failed", logx.Field("err", err), logx.Field("uid", uid), logx.Field("awardSeq", awardSeq)) return nil, errs.New(errs.ErrDatabaseOperate, err) } canReceiveTokens *= coefficient } totalIncomeReward, err := l.svcCtx.StakeRewardModel.CountReward(l.ctx, uid) if err != nil { l.Errorw("count reward failed", logx.Field("err", err), logx.Field("uid", uid)) } return &types.StakeTaskDetail{ StartDate: start.Format(time.DateOnly), EndDate: end.Format(time.DateOnly), CountDown: utils.TodayRemainSeconds(), ProduceTokensToday: math.Round(produceTokensToday*100) / 100, GameBonus: gameBonus, CanReceiveTokens: math.Round(canReceiveTokens*100) / 100, TotalIncomeTokens: math.Round(totalIncomeReward*100) / 100, }, nil }