build_tree.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package utils
  2. import (
  3. "container/list"
  4. "fmt"
  5. "git.i2edu.net/i2/i2-bill-erp/transform"
  6. "github.com/xormplus/xorm"
  7. )
  8. func TreeSearch(engine *xorm.Engine, controllername string, apiname string, tableName string, paramMap map[string]interface{}) ([]*transform.TreeNode, error) {
  9. stplkey := fmt.Sprintf("%s_%s.tpl", controllername, apiname)
  10. result, err := engine.SqlTemplateClient(stplkey, &paramMap).Query().List()
  11. if err != nil {
  12. fmt.Println(err)
  13. return nil, err
  14. }
  15. var nodes = new([]*transform.TreeNode)
  16. if err != nil {
  17. return nil, err
  18. }
  19. for _, n := range result {
  20. fmt.Printf("++++++++%T\n", n["parent"])
  21. node := new(transform.TreeNode)
  22. node.Id = n["id"].(int64)
  23. node.Parent, _ = n["parent"].(int64)
  24. node.Text = n["name"].(string)
  25. *nodes = append(*nodes, node)
  26. }
  27. return BuildTree(nodes)
  28. }
  29. func BuildTree(nodes *[]*transform.TreeNode) ([]*transform.TreeNode, error) {
  30. originNodeList := list.New()
  31. treeNodeList := list.New()
  32. var rootArr []*transform.TreeNode
  33. for _, node := range *nodes {
  34. if node.Parent == 0 {
  35. treeNodeList.PushBack(node)
  36. rootArr = append(rootArr, node)
  37. } else {
  38. originNodeList.PushBack(node)
  39. }
  40. }
  41. // 把子节点根据parent分配到对应的父节点上
  42. for ele := treeNodeList.Front(); ele != nil; ele = ele.Next() {
  43. treeNode := ele.Value.(*transform.TreeNode)
  44. originEle := originNodeList.Front()
  45. if originEle == nil {
  46. break
  47. }
  48. for originEle != nil {
  49. originNextEle := originEle.Next()
  50. originNode := originEle.Value.(*transform.TreeNode)
  51. if originNode.Parent == treeNode.Id {
  52. treeNodeList.InsertAfter(originNode, ele)
  53. treeNode.Nodes = append(treeNode.Nodes, originNode)
  54. originNodeList.Remove(originEle)
  55. }
  56. originEle = originNextEle
  57. }
  58. }
  59. return rootArr, nil
  60. }
  61. func SqlTemplateSearch(engine *xorm.Engine, controllername string, apiname string, tableName string, paramMap map[string]interface{}) ([]map[string]interface{}, error) {
  62. stplkey := fmt.Sprintf("%s_%s.tpl", controllername, apiname)
  63. result, err := engine.SqlTemplateClient(stplkey, &paramMap).Query().List()
  64. if err != nil {
  65. fmt.Println(err)
  66. return nil, err
  67. }
  68. return result, nil
  69. }