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 }