package models import ( "gorm.io/gorm" ) type Stage struct { BaseModel ProjectID string `json:"project_id" gorm:"type:varchar(32);not null"` Name string `json:"name" gorm:"type:varchar(255);not null"` TreeID string `json:"tree_id" gorm:"column:tree_id;type:varchar(32)"` DemandID string `json:"demand_id" gorm:"column:tree_id;type:varchar(32)"` } func (s *Stage) AvailableNodes(db *gorm.DB) ([]Tree, error) { // 如果没有指定树节点,返回空列表 if s.TreeID == "" { return []Tree{}, nil } // 如果是虚拟根节点,返回所有树节点 if s.TreeID == "root" { var allNodes []Tree if err := db.Find(&allNodes).Error; err != nil { return nil, err } return allNodes, nil } // 获取指定的树节点 var tree Tree if err := db.Where("id = ?", s.TreeID).First(&tree).Error; err != nil { return nil, err } // 获取该树节点及其所有子孙节点 descendants, err := tree.Descendants(db) if err != nil { return nil, err } // 将当前节点也添加到可用节点列表中 result := append([]Tree{tree}, descendants...) return result, nil }