This commit is contained in:
2026-05-19 20:30:32 +08:00
parent f5f0e0d8b2
commit fc9d7983b7
7 changed files with 327 additions and 15 deletions

View File

@@ -876,6 +876,102 @@ func (s *AgentService) ProcessUpgrade(ctx context.Context, agentId string, toLev
})
}
// UpgradeTypeAdminDowngrade 管理端降级
const UpgradeTypeAdminDowngrade int64 = 4
// ProcessDowngrade 管理端代理降级(仅降低等级,不退款、不收回历史返佣)
func (s *AgentService) ProcessDowngrade(ctx context.Context, agentId string, toLevel int64, remark string) error {
return s.AgentWalletModel.Trans(ctx, func(transCtx context.Context, session sqlx.Session) error {
agent, err := s.AgentModel.FindOne(transCtx, agentId)
if err != nil {
if errors.Is(err, model.ErrNotFound) {
return errors.New("代理不存在")
}
return errors.Wrapf(err, "查询代理失败")
}
fromLevel := agent.Level
if fromLevel == 3 {
return errors.New("钻石代理不允许降级")
}
if fromLevel == 1 {
return errors.New("普通代理无法降级")
}
if fromLevel != 2 || toLevel != 1 {
return errors.New("仅支持将黄金代理降级为普通代理")
}
if err := s.validateDowngradeDirectChildren(transCtx, agentId, toLevel); err != nil {
return err
}
if remark == "" {
remark = "管理端降级"
}
upgradeRecord := &model.AgentUpgrade{
Id: uuid.NewString(),
AgentId: agent.Id,
FromLevel: fromLevel,
ToLevel: toLevel,
UpgradeType: UpgradeTypeAdminDowngrade,
UpgradeFee: 0,
Status: 2, // 已完成
Remark: lzUtils.StringToNullString(remark),
}
if _, err := s.AgentUpgradeModel.Insert(transCtx, session, upgradeRecord); err != nil {
return errors.Wrapf(err, "创建降级记录失败")
}
agent.Level = toLevel
teamLeaderId, err := s.findTeamLeaderId(transCtx, agentId)
if err != nil && !errors.Is(err, model.ErrNotFound) {
return errors.Wrapf(err, "查找团队首领失败")
}
if teamLeaderId != "" {
agent.TeamLeaderId = sql.NullString{String: teamLeaderId, Valid: true}
} else {
agent.TeamLeaderId = sql.NullString{Valid: false}
}
if err := s.AgentModel.UpdateWithVersion(transCtx, session, agent); err != nil {
return errors.Wrapf(err, "更新代理等级失败")
}
return nil
})
}
// validateDowngradeDirectChildren 校验直接下级是否允许上级降到 toLevel
func (s *AgentService) validateDowngradeDirectChildren(ctx context.Context, agentId string, toLevel int64) error {
builder := s.AgentRelationModel.SelectBuilder().
Where("parent_id = ? AND relation_type = ? AND del_state = ?", agentId, 1, globalkey.DelStateNo)
relations, err := s.AgentRelationModel.FindAll(ctx, builder, "")
if err != nil {
return errors.Wrapf(err, "查询直接下级失败")
}
for _, relation := range relations {
child, err := s.AgentModel.FindOne(ctx, relation.ChildId)
if err != nil {
if errors.Is(err, model.ErrNotFound) {
continue
}
return errors.Wrapf(err, "查询下级代理失败")
}
if child.Level > toLevel {
return fmt.Errorf("存在等级高于目标等级的直接下级下级ID: %s无法降级", child.Id)
}
if child.Level == toLevel && toLevel >= 2 {
return fmt.Errorf("存在与目标等级相同的黄金/钻石直接下级下级ID: %s无法降级", child.Id)
}
}
return nil
}
// needDetachFromParent 检查是否需要脱离直接上级关系
func (s *AgentService) needDetachFromParent(ctx context.Context, agent *model.Agent, newLevel int64) (bool, error) {
parent, err := s.findDirectParent(ctx, agent.Id)