tree.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package sysdb
  2. import (
  3. "container/list"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "git.qianqiusoft.com/qianqiusoft/light-apiengine/entitys"
  8. "git.qianqiusoft.com/qianqiusoft/light-apiengine/models"
  9. "strings"
  10. )
  11. type TreeNode struct {
  12. ID string `json:"id"`
  13. Text string `json:"text"`
  14. Parent string `json:"-"`
  15. Nodes []*TreeNode `json:"nodes"`
  16. }
  17. type ZTreeNode struct {
  18. Id string `json:"id"`
  19. Parent string `json:"parent"`
  20. Name string `json:"name"`
  21. }
  22. type ZTreeConvertor struct {
  23. IdField string
  24. NameField string
  25. ParentField string
  26. CntParent string
  27. Maps []map[string]string
  28. ZTreeNodeArray []*ZTreeNode
  29. TreeNodeArray []*TreeNode
  30. }
  31. func TreeList(c *entitys.CtrlContext, user *entitys.Token, tbName, parentField, parentValue, textFiled, valueFiled, cntParent, domainchk, filter, sord string) ([]*TreeNode, error) {
  32. ztConvertor := &ZTreeConvertor{}
  33. domain := ""
  34. if !IsSuperUser(user) {
  35. if domainchk == "1" {
  36. domain = user.Domain
  37. }
  38. }
  39. pv := ""
  40. if !IsSuperUser(user) {
  41. pv = parentValue
  42. if cntParent != "1" {
  43. pv = ""
  44. }
  45. }
  46. filterObj := &models.Filter{}
  47. if len(filter) > 0 {
  48. if err := json.Unmarshal([]byte(filter), filterObj); err != nil {
  49. return ztConvertor.TreeNodeArray, errors.New(`filters parameter only allows {"groupOp":"AND","rules":[{"field":"org_name","op":"eq","data":"测试"}]}`)
  50. }
  51. }
  52. paramsArr, err := GetTreeList(c, domain, tbName, parentField, textFiled, valueFiled, pv, filterObj, sord)
  53. if err != nil {
  54. return ztConvertor.TreeNodeArray, err
  55. }
  56. ztConvertor.IdField = valueFiled
  57. ztConvertor.NameField = textFiled
  58. ztConvertor.ParentField = parentField
  59. ztConvertor.CntParent = cntParent
  60. ztConvertor.Maps = paramsArr
  61. if !ztConvertor.BuildTreeArray(strings.TrimSpace(pv)) {
  62. return ztConvertor.TreeNodeArray, errors.New("orm.params convert to ztree error")
  63. }
  64. return ztConvertor.TreeNodeArray, nil
  65. }
  66. func GetTreeList(c *entitys.CtrlContext, domain, tbName, parentFiled, textFiled, valueFiled, parentValue string, filter *models.Filter, sord string) ([]map[string]string, error) {
  67. sql := fmt.Sprintf("SELECT `%s`, `%s`, `%s` FROM `%s`", valueFiled, textFiled, parentFiled, tbName)
  68. where := " where ("
  69. groupOp := strings.ToLower(filter.GroupOp)
  70. datas := make([]interface{}, 0)
  71. isAnd := true
  72. if groupOp == "or" {
  73. isAnd = false
  74. where += "1 <> 1"
  75. } else {
  76. isAnd = true
  77. where += "1 = 1"
  78. }
  79. for _, field := range filter.Rules {
  80. fData := models.FormatData(field.Op, field.Data)
  81. switch fData.(type) {
  82. case string:
  83. {
  84. if len(fData.(string)) >= 0 {
  85. datas = append(datas, fData)
  86. }
  87. }
  88. case []string:
  89. {
  90. fDataArr := fData.([]string)
  91. for _, arr := range fDataArr {
  92. if len(arr) > 0 {
  93. datas = append(datas, arr)
  94. }
  95. }
  96. }
  97. }
  98. whereStr := models.FormatOp(tbName, field.Op, field.Field, field.Data)
  99. if len(whereStr) > 0 {
  100. if isAnd {
  101. where += " and "
  102. } else {
  103. where += " or "
  104. }
  105. where += whereStr
  106. }
  107. }
  108. where += ")"
  109. if domain != "" {
  110. where += " and ("
  111. where += fmt.Sprintf(" domain = '%s')", domain)
  112. }
  113. sql = sql + where
  114. if parentValue != "" {
  115. sql1 := fmt.Sprintf("select `%s`, `%s`, `%s` from `%s` where `%s` = ?", valueFiled, textFiled, parentFiled, tbName, valueFiled)
  116. sql = sql + " union " + sql1
  117. datas = append(datas, parentValue)
  118. }
  119. if strings.TrimSpace(sord) == "" {
  120. sql = sql + " order by " + parentFiled
  121. } else {
  122. sql = sql + " order by " + sord
  123. }
  124. if len(datas) > 0 {
  125. //result, err := c.Db.QueryInterface(sql, datas)
  126. result, err := c.Db.QueryString(sql, datas)
  127. return result, err
  128. } else {
  129. result, err := c.Db.QueryString(sql)
  130. return result, err
  131. }
  132. }
  133. func (this *ZTreeConvertor) BuildTreeArray(root string) bool {
  134. rootArr := []*TreeNode{}
  135. if len(this.Maps) <= 0 {
  136. this.TreeNodeArray = rootArr
  137. return true
  138. }
  139. paramsArr := this.Maps
  140. valueFiled := this.IdField
  141. parentField := this.ParentField
  142. textFiled := this.NameField
  143. parentValue := root
  144. treeNodeList := list.New()
  145. originNodeList := list.New()
  146. if root != "" && this.CntParent == "1" {
  147. for _, params := range paramsArr {
  148. value := getStringValueByInterface(params[valueFiled], "")
  149. parent := getStringValueByInterface(params[parentField], "")
  150. text := getStringValueByInterface(params[textFiled], "")
  151. //fmt.Println("========" + text + "-----" + value + "======" + parentValue)
  152. if value == parentValue {
  153. //fmt.Println("root ========" + text + "-----" + value)
  154. node := &TreeNode{
  155. ID: value,
  156. Text: text,
  157. Parent: parent,
  158. }
  159. treeNodeList.PushBack(node)
  160. rootArr = append(rootArr, node)
  161. } else {
  162. originNodeList.PushBack(&TreeNode{
  163. ID: value,
  164. Text: text,
  165. Parent: parent,
  166. })
  167. }
  168. }
  169. } else {
  170. for _, params := range paramsArr {
  171. value := getStringValueByInterface(params[valueFiled], "")
  172. parent := getStringValueByInterface(params[parentField], "")
  173. text := getStringValueByInterface(params[textFiled], "")
  174. //fmt.Println("========" + text + "-----" + value + "======" + parentValue)
  175. if parent == parentValue {
  176. //fmt.Println("root ========" + text + "-----" + value)
  177. node := &TreeNode{
  178. ID: value,
  179. Text: text,
  180. Parent: parent,
  181. }
  182. treeNodeList.PushBack(node)
  183. rootArr = append(rootArr, node)
  184. } else {
  185. originNodeList.PushBack(&TreeNode{
  186. ID: value,
  187. Text: text,
  188. Parent: parent,
  189. })
  190. }
  191. }
  192. }
  193. fmt.Println(len(rootArr))
  194. for ele := treeNodeList.Front(); ele != nil; ele = ele.Next() {
  195. treeNode := ele.Value.(*TreeNode)
  196. //fmt.Println("=================" + treeNode.ID + "===========" + treeNode.Text)
  197. originEle := originNodeList.Front()
  198. if originEle == nil {
  199. break
  200. }
  201. flag := false
  202. for originEle != nil {
  203. originNextEle := originEle.Next()
  204. originNode := originEle.Value.(*TreeNode)
  205. //fmt.Println("---------------" + originNode.ID + "------------" + originNode.Text)
  206. if originNode.Parent == treeNode.ID {
  207. flag = true
  208. treeNodeList.InsertAfter(originNode, ele)
  209. treeNode.Nodes = append(treeNode.Nodes, originNode)
  210. originNodeList.Remove(originEle)
  211. } else if flag {
  212. break
  213. }
  214. originEle = originNextEle
  215. }
  216. }
  217. this.TreeNodeArray = rootArr
  218. return true
  219. }
  220. func getStringValueByInterface(vali interface{}, nilVal string) string {
  221. if vali == nil {
  222. return nilVal
  223. }
  224. return vali.(string)
  225. }