tree_util.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package utils
  2. import (
  3. "github.com/xormplus/xorm"
  4. "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  5. "fmt"
  6. "container/list"
  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_%s_gen.stpl",controllername, apiname, tableName)
  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. // 如果根节点root为空,则从parent为空中获取root节点数组
  33. // 如果root不为空,则获取id等于的节点为root节点数组
  34. if (parentValue == "" && parent == "") || value == parentValue {
  35. node := &models.TreeNode{
  36. Id: value,
  37. Text: text,
  38. Parent: parent,
  39. }
  40. treeNodeList.PushBack(node)
  41. rootArr = append(rootArr, node)
  42. } else {
  43. originNodeList.PushBack(&models.TreeNode{
  44. Id: value,
  45. Text: text,
  46. Parent: parent,
  47. })
  48. }
  49. }
  50. // 把子节点根据parent分配到对应的父节点上
  51. for ele := treeNodeList.Front(); ele != nil; ele = ele.Next() {
  52. treeNode := ele.Value.(*models.TreeNode)
  53. originEle := originNodeList.Front()
  54. if originEle == nil {
  55. break
  56. }
  57. for originEle != nil {
  58. originNextEle := originEle.Next()
  59. originNode := originEle.Value.(*models.TreeNode)
  60. if originNode.Parent == treeNode.Id {
  61. treeNodeList.InsertAfter(originNode, ele)
  62. treeNode.Nodes = append(treeNode.Nodes, originNode)
  63. originNodeList.Remove(originEle)
  64. }
  65. originEle = originNextEle
  66. }
  67. }
  68. return rootArr, nil
  69. }
  70. func toString(v interface{}, defaultValue string)string{
  71. if v == nil{
  72. return defaultValue
  73. }
  74. strv, flag := v.(string)
  75. if !flag{
  76. return defaultValue
  77. }else{
  78. return strv
  79. }
  80. }