Files
novatask/internal/logic/task/get_stake_task_detail_logic.go
2025-01-08 16:25:48 +08:00

104 lines
3.1 KiB
Go

package task
import (
"context"
"errors"
"github.com/spf13/cast"
"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)
}
var gameBonus int
if l.svcCtx.GamePitModel.UserExist(l.ctx, uid) {
gameBonus = taskConf.OccupyPercent
}
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
if gameBonus > 0 {
canReceiveTokens = produceTokensToday * float64(100+gameBonus) / 100
} else {
canReceiveTokens = produceTokensToday
}
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: produceTokensToday,
GameBonus: gameBonus,
CanReceiveTokens: canReceiveTokens,
TotalIncomeTokens: totalIncomeReward,
}, nil
}