Files
qnc-server-v3/app/main/api/internal/logic/admin_agent/adminupgradeagentlogic.go
2026-02-01 15:05:32 +08:00

109 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package admin_agent
import (
"context"
"qnc-server/app/main/model"
"qnc-server/common/xerr"
"qnc-server/pkg/lzkit/lzUtils"
"github.com/google/uuid"
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"qnc-server/app/main/api/internal/svc"
"qnc-server/app/main/api/internal/types"
)
// 升级类型1=自主付费2=钻石升级下级3=平台升级
const upgradeTypePlatform = 3
type AdminUpgradeAgentLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewAdminUpgradeAgentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminUpgradeAgentLogic {
return &AdminUpgradeAgentLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *AdminUpgradeAgentLogic) AdminUpgradeAgent(req *types.AdminUpgradeAgentReq) (resp *types.AdminUpgradeAgentResp, err error) {
// 1. 参数校验
if req.AgentId == "" {
return nil, errors.Wrapf(xerr.NewErrMsg("代理ID不能为空"), "")
}
if req.ToLevel != 2 && req.ToLevel != 3 {
return nil, errors.Wrapf(xerr.NewErrMsg("目标等级只能为黄金(2)或钻石(3)"), "")
}
// 2. 获取代理信息
agent, err := l.svcCtx.AgentModel.FindOne(l.ctx, req.AgentId)
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)
}
// 3. 校验升级条件:只能升级不能降级,且目标等级必须高于当前等级
if req.ToLevel <= agent.Level {
return nil, errors.Wrapf(xerr.NewErrMsg("目标等级必须高于当前等级,当前为"+l.levelName(agent.Level)), "")
}
// 4. 使用事务执行升级(遵守代理系统逻辑:脱离关系、团队首领、升级记录等)
err = l.svcCtx.AgentWalletModel.Trans(l.ctx, func(transCtx context.Context, session sqlx.Session) error {
// 4.1 创建升级记录upgrade_type=3 平台升级,不收费不返佣)
upgradeRecord := &model.AgentUpgrade{
Id: uuid.NewString(),
AgentId: agent.Id,
FromLevel: agent.Level,
ToLevel: req.ToLevel,
UpgradeType: upgradeTypePlatform,
UpgradeFee: 0,
RebateAmount: 0,
Status: 1, // 待处理,执行完成后更新为已完成
}
if _, err := l.svcCtx.AgentUpgradeModel.Insert(transCtx, session, upgradeRecord); err != nil {
return errors.Wrapf(err, "创建升级记录失败")
}
// 4.2 执行升级ProcessUpgrade更新等级、脱离/重连上级、团队首领等upgradeType!=1 时不返佣)
if err := l.svcCtx.AgentService.ProcessUpgrade(transCtx, agent.Id, req.ToLevel, upgradeTypePlatform, 0, 0, "", ""); err != nil {
return errors.Wrapf(err, "执行升级操作失败")
}
// 4.3 更新升级记录为已完成
upgradeRecord.Status = 2 // 已完成
upgradeRecord.Remark = lzUtils.StringToNullString("平台升级完成")
if err := l.svcCtx.AgentUpgradeModel.UpdateWithVersion(transCtx, session, upgradeRecord); err != nil {
return errors.Wrapf(err, "更新升级记录失败")
}
return nil
})
if err != nil {
return nil, err
}
return &types.AdminUpgradeAgentResp{Success: true}, nil
}
func (l *AdminUpgradeAgentLogic) levelName(level int64) string {
switch level {
case 1:
return "普通代理"
case 2:
return "黄金代理"
case 3:
return "钻石代理"
default:
return "未知"
}
}