Files
ycc-proxy-server/app/main/api/internal/logic/agent/applyupgradelogic.go

126 lines
3.6 KiB
Go
Raw Normal View History

2025-11-27 13:09:54 +08:00
package agent
import (
"context"
"database/sql"
"ycc-server/app/main/model"
"ycc-server/common/ctxdata"
"ycc-server/common/xerr"
2025-12-09 18:55:28 +08:00
"github.com/google/uuid"
2025-11-27 13:09:54 +08:00
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"ycc-server/app/main/api/internal/svc"
"ycc-server/app/main/api/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type ApplyUpgradeLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewApplyUpgradeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ApplyUpgradeLogic {
return &ApplyUpgradeLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *ApplyUpgradeLogic) ApplyUpgrade(req *types.ApplyUpgradeReq) (resp *types.ApplyUpgradeResp, err error) {
userID, err := ctxdata.GetUidFromCtx(l.ctx)
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.SERVER_COMMON_ERROR), "获取用户信息失败, %v", err)
}
// 1. 获取代理信息
agent, err := l.svcCtx.AgentModel.FindOneByUserId(l.ctx, userID)
if err != nil {
if errors.Is(err, model.ErrNotFound) {
return nil, errors.Wrapf(xerr.NewErrMsg("您不是代理"), "")
}
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DB_ERROR), "查询代理信息失败, %v", err)
}
fromLevel := agent.Level
toLevel := req.ToLevel
// 2. 验证升级条件
if !l.canUpgrade(agent.Level, toLevel, 1) {
return nil, errors.Wrapf(xerr.NewErrMsg("升级条件不满足"), "")
}
// 3. 计算升级费用和返佣
2025-12-02 19:57:10 +08:00
upgradeFee, err := l.svcCtx.AgentService.GetUpgradeFee(l.ctx, fromLevel, toLevel)
if err != nil {
return nil, errors.Wrapf(err, "获取升级费用失败")
}
rebateAmount, err := l.svcCtx.AgentService.GetUpgradeRebate(l.ctx, fromLevel, toLevel)
if err != nil {
return nil, errors.Wrapf(err, "获取升级返佣金额失败")
}
2025-11-27 13:09:54 +08:00
// 4. 查找原直接上级(用于返佣)
2025-12-09 18:55:28 +08:00
var rebateAgentId string
2025-11-27 13:09:54 +08:00
parent, err := l.svcCtx.AgentService.FindDirectParent(l.ctx, agent.Id)
if err != nil && !errors.Is(err, model.ErrNotFound) {
return nil, errors.Wrapf(err, "查找直接上级失败")
}
if parent != nil {
rebateAgentId = parent.Id
}
2025-12-02 19:57:10 +08:00
// 5. 创建升级记录(待支付状态)
2025-12-09 18:55:28 +08:00
var upgradeId string
2025-11-27 13:09:54 +08:00
err = l.svcCtx.AgentWalletModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error {
2025-12-02 19:57:10 +08:00
// 5.1 创建升级记录(状态为待支付)
2025-11-27 13:09:54 +08:00
upgradeRecord := &model.AgentUpgrade{
2025-12-09 18:55:28 +08:00
Id: uuid.NewString(),
2025-12-02 19:57:10 +08:00
AgentId: agent.Id,
FromLevel: fromLevel,
ToLevel: toLevel,
UpgradeType: 1, // 自主付费
UpgradeFee: upgradeFee,
RebateAmount: rebateAmount,
Status: 1, // 待支付1=待支付2=已支付3=已完成4=已取消)
2025-11-27 13:09:54 +08:00
}
2025-12-09 18:55:28 +08:00
if rebateAgentId != "" {
upgradeRecord.RebateAgentId = sql.NullString{String: rebateAgentId, Valid: true}
2025-11-27 13:09:54 +08:00
}
2025-12-09 18:55:28 +08:00
_, err := l.svcCtx.AgentUpgradeModel.Insert(transCtx, session, upgradeRecord)
2025-11-27 13:09:54 +08:00
if err != nil {
return errors.Wrapf(err, "创建升级记录失败")
}
2025-12-02 19:57:10 +08:00
// 注意:升级操作将在支付成功后通过支付回调完成
2025-12-09 18:55:28 +08:00
upgradeId = upgradeRecord.Id
2025-11-27 13:09:54 +08:00
return nil
})
if err != nil {
return nil, err
}
2025-12-02 19:57:10 +08:00
// 返回响应(订单号将在支付接口中生成)
2025-11-27 13:09:54 +08:00
return &types.ApplyUpgradeResp{
UpgradeId: upgradeId,
2025-12-02 19:57:10 +08:00
OrderNo: "", // 将在支付接口中生成
2025-11-27 13:09:54 +08:00
}, nil
}
// canUpgrade 检查是否可以升级
func (l *ApplyUpgradeLogic) canUpgrade(fromLevel, toLevel int64, upgradeType int64) bool {
if upgradeType == 1 { // 自主付费
if fromLevel == 1 { // 普通
return toLevel == 2 || toLevel == 3 // 可以升级为黄金或钻石
} else if fromLevel == 2 { // 黄金
return toLevel == 3 // 可以升级为钻石
}
}
return false
}