healthapp
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

85 lines
2.0 KiB

package logic
import (
"context"
"healthapi/internal/model"
"healthapi/internal/svc"
"healthapi/internal/types"
"healthapi/pkg/errorx"
"github.com/zeromicro/go-zero/core/logx"
)
type GetMemberInfoLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewGetMemberInfoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetMemberInfoLogic {
return &GetMemberInfoLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetMemberInfoLogic) GetMemberInfo() (resp *types.MemberInfo, err error) {
userID, err := GetUserIDFromCtx(l.ctx)
if err != nil {
return nil, errorx.ErrUnauthorized
}
var user model.User
if err := l.svcCtx.DB.First(&user, userID).Error; err != nil {
return nil, errorx.ErrUserNotFound
}
// 获取当前等级配置
levelConfig := model.MemberLevelConfigs[user.MemberLevel]
if levelConfig.Level == "" {
levelConfig = model.MemberLevelConfigs[model.MemberLevelNormal]
}
// 计算下一等级信息
nextLevel := ""
nextLevelSpent := float64(0)
switch user.MemberLevel {
case model.MemberLevelNormal:
nextLevel = model.MemberLevelSilver
nextLevelSpent = 500 - user.TotalSpent
case model.MemberLevelSilver:
nextLevel = model.MemberLevelGold
nextLevelSpent = 2000 - user.TotalSpent
case model.MemberLevelGold:
nextLevel = model.MemberLevelDiamond
nextLevelSpent = 5000 - user.TotalSpent
case model.MemberLevelDiamond:
nextLevel = ""
nextLevelSpent = 0
}
if nextLevelSpent < 0 {
nextLevelSpent = 0
}
memberSince := ""
if user.MemberSince != nil {
memberSince = user.MemberSince.Format("2006-01-02")
}
resp = &types.MemberInfo{
Level: user.MemberLevel,
LevelName: levelConfig.Name,
TotalSpent: user.TotalSpent,
Points: user.Points,
MemberSince: memberSince,
NextLevel: nextLevel,
NextLevelSpent: nextLevelSpent,
Discount: levelConfig.Discount,
PointsMultiplier: levelConfig.PointsMultiplier,
FreeShippingMin: levelConfig.FreeShippingMin,
}
return resp, nil
}