tree_util.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package utils
  2. import (
  3. "container/list"
  4. "fmt"
  5. "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  6. "github.com/xormplus/xorm"
  7. )
  8. // 树形结构
  9. func TreeSearch(engine *xorm.Engine, controllername string, apiname string, tableName string, paramMap map[string]interface{}) ([]*models.TreeNode, error) {
  10. stplkey := fmt.Sprintf("%s_%s.tpl", controllername, apiname)
  11. result, err := engine.SqlTemplateClient(stplkey, &paramMap).Query().List()
  12. if err != nil {
  13. fmt.Println(err)
  14. return nil, err
  15. }
  16. return BuildTree("", result)
  17. }
  18. func BuildTree(root string, treeSrcs []map[string]interface{}) ([]*models.TreeNode, error) {
  19. rootArr := []*models.TreeNode{}
  20. paramsArr := treeSrcs
  21. valueFiled := "id"
  22. parentField := "parent"
  23. textFiled := "name"
  24. parentValue := root
  25. treeNodeList := list.New()
  26. originNodeList := list.New()
  27. // 区分root节点和子节点数组
  28. for _, params := range paramsArr {
  29. value := toString(params[valueFiled], "")
  30. parent := toString(params[parentField], "")
  31. text := toString(params[textFiled], "")
  32. //json,_ := xorm.JSONString(params, true)
  33. // 如果根节点root为空,则从parent为空中获取root节点数组
  34. // 如果root不为空且treeSrcs中包含id为root的,则获取id等于的节点为root节点数组(相当于显示root节点的树)
  35. // 如果root不为空且treeSrcs中不包含id为root的,则获取parent等于的节点为root节点数组(相当于不显示root节点的树)
  36. if (parentValue == "" && parent == "") || value == parentValue || parent == parentValue {
  37. node := &models.TreeNode{
  38. Id: value,
  39. Text: text,
  40. Parent: parent,
  41. Tag: params,
  42. }
  43. treeNodeList.PushBack(node)
  44. rootArr = append(rootArr, node)
  45. } else {
  46. originNodeList.PushBack(&models.TreeNode{
  47. Id: value,
  48. Text: text,
  49. Parent: parent,
  50. Tag: params,
  51. })
  52. }
  53. }
  54. // 把子节点根据parent分配到对应的父节点上
  55. for ele := treeNodeList.Front(); ele != nil; ele = ele.Next() {
  56. treeNode := ele.Value.(*models.TreeNode)
  57. originEle := originNodeList.Front()
  58. if originEle == nil {
  59. break
  60. }
  61. for originEle != nil {
  62. originNextEle := originEle.Next()
  63. originNode := originEle.Value.(*models.TreeNode)
  64. if originNode.Parent == treeNode.Id {
  65. treeNodeList.InsertAfter(originNode, ele)
  66. treeNode.Nodes = append(treeNode.Nodes, originNode)
  67. originNodeList.Remove(originEle)
  68. }
  69. originEle = originNextEle
  70. }
  71. }
  72. return rootArr, nil
  73. }
  74. func toString(v interface{}, defaultValue string) interface{} {
  75. if v == nil {
  76. return defaultValue
  77. }
  78. switch t := v.(type) {
  79. case int:
  80. return t
  81. case string:
  82. return t
  83. default:
  84. return t
  85. }
  86. //strv, flag := v.(string)
  87. //if !flag {
  88. // return defaultValue
  89. //} else {
  90. // return result
  91. //}
  92. }