f
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user