f
This commit is contained in:
@@ -86,6 +86,10 @@ service main {
|
||||
// 代理手机号修改
|
||||
@handler AdminUpdateAgentMobile
|
||||
post /mobile/update (AdminUpdateAgentMobileReq) returns (AdminUpdateAgentMobileResp)
|
||||
|
||||
// 代理等级降级(管理端)
|
||||
@handler AdminDowngradeAgent
|
||||
post /level/downgrade (AdminDowngradeAgentReq) returns (AdminDowngradeAgentResp)
|
||||
}
|
||||
|
||||
type (
|
||||
@@ -443,5 +447,14 @@ type (
|
||||
AdminUpdateAgentMobileResp {
|
||||
Success bool `json:"success"`
|
||||
}
|
||||
// 代理等级降级
|
||||
AdminDowngradeAgentReq {
|
||||
AgentId string `json:"agent_id"` // 代理ID
|
||||
ToLevel int64 `json:"to_level"` // 目标等级:1=普通,2=黄金,3=钻石(须低于当前等级)
|
||||
Remark string `json:"remark,optional"` // 备注(可选)
|
||||
}
|
||||
AdminDowngradeAgentResp {
|
||||
Success bool `json:"success"`
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
package admin_agent
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"github.com/zeromicro/go-zero/rest/httpx"
|
||||
"ycc-server/app/main/api/internal/logic/admin_agent"
|
||||
"ycc-server/app/main/api/internal/svc"
|
||||
"ycc-server/app/main/api/internal/types"
|
||||
"ycc-server/common/result"
|
||||
"ycc-server/pkg/lzkit/validator"
|
||||
)
|
||||
|
||||
func AdminDowngradeAgentHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
var req types.AdminDowngradeAgentReq
|
||||
if err := httpx.Parse(r, &req); err != nil {
|
||||
result.ParamErrorResult(r, w, err)
|
||||
return
|
||||
}
|
||||
if err := validator.Validate(req); err != nil {
|
||||
result.ParamValidateErrorResult(r, w, err)
|
||||
return
|
||||
}
|
||||
l := admin_agent.NewAdminDowngradeAgentLogic(r.Context(), svcCtx)
|
||||
resp, err := l.AdminDowngradeAgent(&req)
|
||||
result.HttpResult(r, w, resp, err)
|
||||
}
|
||||
}
|
||||
@@ -69,6 +69,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
|
||||
Path: "/invite_code/list",
|
||||
Handler: admin_agent.AdminGetInviteCodeListHandler(serverCtx),
|
||||
},
|
||||
{
|
||||
Method: http.MethodPost,
|
||||
Path: "/level/downgrade",
|
||||
Handler: admin_agent.AdminDowngradeAgentHandler(serverCtx),
|
||||
},
|
||||
{
|
||||
Method: http.MethodGet,
|
||||
Path: "/link/list",
|
||||
@@ -79,6 +84,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
|
||||
Path: "/list",
|
||||
Handler: admin_agent.AdminGetAgentListHandler(serverCtx),
|
||||
},
|
||||
{
|
||||
Method: http.MethodPost,
|
||||
Path: "/mobile/update",
|
||||
Handler: admin_agent.AdminUpdateAgentMobileHandler(serverCtx),
|
||||
},
|
||||
{
|
||||
Method: http.MethodGet,
|
||||
Path: "/order/list",
|
||||
@@ -94,11 +104,6 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
|
||||
Path: "/product_config/update",
|
||||
Handler: admin_agent.AdminUpdateAgentProductConfigHandler(serverCtx),
|
||||
},
|
||||
{
|
||||
Method: http.MethodPost,
|
||||
Path: "/mobile/update",
|
||||
Handler: admin_agent.AdminUpdateAgentMobileHandler(serverCtx),
|
||||
},
|
||||
{
|
||||
Method: http.MethodGet,
|
||||
Path: "/real_name/list",
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package admin_agent
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"ycc-server/app/main/model"
|
||||
"ycc-server/common/xerr"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
||||
"ycc-server/app/main/api/internal/svc"
|
||||
"ycc-server/app/main/api/internal/types"
|
||||
|
||||
"github.com/zeromicro/go-zero/core/logx"
|
||||
)
|
||||
|
||||
type AdminDowngradeAgentLogic struct {
|
||||
logx.Logger
|
||||
ctx context.Context
|
||||
svcCtx *svc.ServiceContext
|
||||
}
|
||||
|
||||
func NewAdminDowngradeAgentLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AdminDowngradeAgentLogic {
|
||||
return &AdminDowngradeAgentLogic{
|
||||
Logger: logx.WithContext(ctx),
|
||||
ctx: ctx,
|
||||
svcCtx: svcCtx,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *AdminDowngradeAgentLogic) AdminDowngradeAgent(req *types.AdminDowngradeAgentReq) (resp *types.AdminDowngradeAgentResp, err error) {
|
||||
if req.AgentId == "" {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg("代理ID不能为空"), "")
|
||||
}
|
||||
|
||||
_, 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)
|
||||
}
|
||||
|
||||
if err := l.svcCtx.AgentService.ProcessDowngrade(l.ctx, req.AgentId, req.ToLevel, req.Remark); err != nil {
|
||||
return nil, errors.Wrapf(xerr.NewErrMsg(err.Error()), "")
|
||||
}
|
||||
|
||||
return &types.AdminDowngradeAgentResp{
|
||||
Success: true,
|
||||
}, nil
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -230,6 +230,16 @@ type AdminDeleteUserResp struct {
|
||||
Success bool `json:"success"` // 是否成功
|
||||
}
|
||||
|
||||
type AdminDowngradeAgentReq struct {
|
||||
AgentId string `json:"agent_id"` // 代理ID
|
||||
ToLevel int64 `json:"to_level"` // 目标等级:1=普通,2=黄金,3=钻石(须低于当前等级)
|
||||
Remark string `json:"remark,optional"` // 备注(可选)
|
||||
}
|
||||
|
||||
type AdminDowngradeAgentResp struct {
|
||||
Success bool `json:"success"`
|
||||
}
|
||||
|
||||
type AdminGenerateDiamondInviteCodeReq struct {
|
||||
Count int64 `json:"count"` // 生成数量
|
||||
ExpireDays int64 `json:"expire_days,optional"` // 过期天数(可选,0表示不过期)
|
||||
@@ -870,6 +880,15 @@ type AdminUpdateAgentConfigResp struct {
|
||||
Success bool `json:"success"`
|
||||
}
|
||||
|
||||
type AdminUpdateAgentMobileReq struct {
|
||||
AgentId string `json:"agent_id"` // 代理ID
|
||||
Mobile string `json:"mobile"` // 新手机号
|
||||
}
|
||||
|
||||
type AdminUpdateAgentMobileResp struct {
|
||||
Success bool `json:"success"`
|
||||
}
|
||||
|
||||
type AdminUpdateAgentProductConfigReq struct {
|
||||
Id string `json:"id"` // 主键
|
||||
BasePrice float64 `json:"base_price"` // 基础底价
|
||||
@@ -882,16 +901,6 @@ type AdminUpdateAgentProductConfigResp struct {
|
||||
Success bool `json:"success"`
|
||||
}
|
||||
|
||||
// 代理手机号修改
|
||||
type AdminUpdateAgentMobileReq struct {
|
||||
AgentId string `json:"agent_id"` // 代理ID
|
||||
Mobile string `json:"mobile"` // 新手机号
|
||||
}
|
||||
|
||||
type AdminUpdateAgentMobileResp struct {
|
||||
Success bool `json:"success"`
|
||||
}
|
||||
|
||||
type AdminUpdateApiReq struct {
|
||||
Id string `path:"id"`
|
||||
ApiName string `json:"api_name"`
|
||||
|
||||
Reference in New Issue
Block a user