package utils import ( "container/list" "fmt" "git.i2edu.net/i2/i2-bill-erp/transform" "github.com/xormplus/xorm" ) func TreeSearch(engine *xorm.Engine, controllername string, apiname string, tableName string, paramMap map[string]interface{}) ([]*transform.TreeNode, error) { stplkey := fmt.Sprintf("%s_%s.tpl", controllername, apiname) result, err := engine.SqlTemplateClient(stplkey, ¶mMap).Query().List() if err != nil { fmt.Println(err) return nil, err } var nodes = new([]*transform.TreeNode) if err != nil { return nil, err } for _, n := range result { fmt.Printf("++++++++%T\n", n["parent"]) node := new(transform.TreeNode) node.Id = n["id"].(int64) node.Parent, _ = n["parent"].(int64) node.Text = n["name"].(string) *nodes = append(*nodes, node) } return BuildTree(nodes) } func BuildTree(nodes *[]*transform.TreeNode) ([]*transform.TreeNode, error) { originNodeList := list.New() treeNodeList := list.New() var rootArr []*transform.TreeNode for _, node := range *nodes { if node.Parent == 0 { treeNodeList.PushBack(node) rootArr = append(rootArr, node) } else { originNodeList.PushBack(node) } } // 把子节点根据parent分配到对应的父节点上 for ele := treeNodeList.Front(); ele != nil; ele = ele.Next() { treeNode := ele.Value.(*transform.TreeNode) originEle := originNodeList.Front() if originEle == nil { break } for originEle != nil { originNextEle := originEle.Next() originNode := originEle.Value.(*transform.TreeNode) if originNode.Parent == treeNode.Id { treeNodeList.InsertAfter(originNode, ele) treeNode.Nodes = append(treeNode.Nodes, originNode) originNodeList.Remove(originEle) } originEle = originNextEle } } return rootArr, nil } func SqlTemplateSearch(engine *xorm.Engine, controllername string, apiname string, tableName string, paramMap map[string]interface{}) ([]map[string]interface{}, error) { stplkey := fmt.Sprintf("%s_%s.tpl", controllername, apiname) result, err := engine.SqlTemplateClient(stplkey, ¶mMap).Query().List() if err != nil { fmt.Println(err) return nil, err } return result, nil }