完善节点筛选机制

This commit is contained in:
2026-06-12 16:43:09 +08:00
parent 513fe78815
commit 25cacf0bca
7 changed files with 40 additions and 82 deletions

View File

@@ -10,7 +10,7 @@ import (
q "platform/web/queries"
"strings"
"gorm.io/gen"
"gorm.io/gen/field"
)
type channelGostProvider struct{}
@@ -37,7 +37,7 @@ func (s *channelGostProvider) prepareCreate(ctx *channelCreateContext) (*channel
serviceName := gostServiceName(ctx.BatchNo, port)
channel := newBaseChannel(ctx, port)
channel.EdgeID = u.P(edge.ID)
channel.EdgeRef = u.P(serviceName)
channel.EdgeRef = u.P(edge.Mac)
channel.IP = u.P(edge.IP)
service := &g.GostServiceConfig{
@@ -141,40 +141,34 @@ func (s *channelGostProvider) selectEdge(filter *EdgeFilter, area *m.Area, count
filter = &EdgeFilter{}
}
conds := []gen.Condition{
do := q.Edge.Where(
q.Edge.Type.Eq(int(m.EdgeTypeGostChain)),
q.Edge.Status.Eq(int(m.EdgeStatusNormal)),
)
if filter.Isp != nil {
do = do.Where(q.Edge.ISP.In(int(m.EdgeISPUnknown), int(*filter.Isp)))
}
if isp := u.X(filter.Isp.String()); isp != nil {
conds = append(conds, q.Edge.ISP.Eq(int(*filter.Isp)))
}
query := q.Edge.Where(conds...)
if area != nil {
switch area.Level {
case m.AreaLevelProvince:
edgeArea := q.Area.As("EdgeArea")
query = query.
Join(edgeArea, edgeArea.ID.EqCol(q.Edge.AreaID)).
Where(edgeArea.ParentID.Eq(area.ID))
do = do.
Where(edgeArea.ParentID.Eq(area.ID)).
Join(edgeArea, edgeArea.ID.EqCol(q.Edge.AreaID))
case m.AreaLevelCity:
query = query.Where(q.Edge.AreaID.Eq(area.ID))
do = do.Where(q.Edge.AreaID.Eq(area.ID))
default:
return nil, core.NewBizErr("地区层级不支持")
}
}
edges, err := query.
Order(q.Edge.ID).
edges, err := do.
Order(field.NewUnsafeFieldRaw("random()")).
Limit(count).
Find()
if err != nil {
return nil, core.NewBizErr("查询可用节点失败", err)
}
return expandGostEdges(edges, count)
}
func expandGostEdges(edges []*m.Edge, count int) ([]*m.Edge, error) {
if len(edges) == 0 {
return nil, core.NewBizErr("地区可用节点数量不足")
}
@@ -183,6 +177,7 @@ func expandGostEdges(edges []*m.Edge, count int) ([]*m.Edge, error) {
for i := range count {
result[i] = edges[i%len(edges)]
}
return result, nil
}