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
|
|
|
|
|
|
}
|