46 lines
1.1 KiB
Go
46 lines
1.1 KiB
Go
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
|
|
}
|