item_section.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. * @description: 项目节模板
  3. * @Author: CP
  4. * @Date: 2020-10-29 09:44:20
  5. * @FilePath: \construction_management\lib\item_section.go
  6. */
  7. package lib
  8. import (
  9. "encoding/json"
  10. "io/ioutil"
  11. "log"
  12. )
  13. type ItemSection struct {
  14. TemplateTree1 *ItemSectionTemplateTree
  15. TemplateList1 []*ItemSectionTemplateTree
  16. TemplateRule1 string
  17. TemplateTree2 *ItemSectionTemplateTree
  18. TemplateList2 []*ItemSectionTemplateTree
  19. TemplateRule2 string
  20. }
  21. // 初始化项目节-树结构
  22. func NewItemSection() *ItemSection {
  23. return &ItemSection{
  24. TemplateTree1: makeItemSectionTemplateTree("1"),
  25. TemplateRule1: "-",
  26. TemplateTree2: makeItemSectionTemplateTree("2"),
  27. TemplateRule2: "-",
  28. }
  29. }
  30. func NewItemSectionData() *ItemSection {
  31. return &ItemSection{
  32. TemplateList1: makeTemplateData("1"),
  33. TemplateRule1: "-",
  34. TemplateList2: makeTemplateData("2"),
  35. TemplateRule2: "-",
  36. }
  37. }
  38. // 项目节模板
  39. type ItemSectionTemplateTree struct {
  40. Id int `form:"id" json:"id" `
  41. ParentId int `form:"parentId" json:"parentId"`
  42. Name string `form:"name" json:"name"`
  43. Depth int `form:"depth" json:"depth"`
  44. Serial int `form:"serial" json:"serial"`
  45. Attribution string `form:"attribution" json:"attribution"`
  46. Leaf bool `json:"leaf" `
  47. Children []*ItemSectionTemplateTree `json:"children"`
  48. IsEnd bool `json:"isEnd"`
  49. }
  50. // 获得项目节模板数据
  51. func makeTemplateData(templateNumber string) []*ItemSectionTemplateTree {
  52. templateList := make([]*ItemSectionTemplateTree, 0)
  53. // 读取模板文件
  54. data, err := ioutil.ReadFile("../lib/section_template" + templateNumber + ".json")
  55. if err != nil {
  56. log.Println("项目节模板文件读取出错:err=", err)
  57. return nil
  58. }
  59. err = json.Unmarshal(data, &templateList)
  60. if err != nil {
  61. log.Println("项目节模板Json转换出错:err=", err)
  62. return nil
  63. }
  64. return templateList
  65. }
  66. // 初始化项目节模板
  67. // func NewTemplate() Template {
  68. // return nil
  69. // }
  70. // 生成树
  71. func makeItemSectionTemplateTree(templateNumber string) *ItemSectionTemplateTree {
  72. // templateList := make([]*ItemSectionTemplateTree, 0)
  73. // // 读取模板文件
  74. // data, err := ioutil.ReadFile("../lib/" + fileName)
  75. // if err != nil {
  76. // log.Println("项目节模板文件读取出错:err=", err)
  77. // return nil
  78. // }
  79. // err = json.Unmarshal(data, &templateList)
  80. // if err != nil {
  81. // log.Println("项目节模板Json转换出错:err=", err)
  82. // return nil
  83. // }
  84. templateList := makeTemplateData(templateNumber)
  85. // 生成根
  86. template := &ItemSectionTemplateTree{}
  87. template.Id = 0
  88. template.Name = "root"
  89. template.ParentId = -1
  90. templateList = append(templateList, template)
  91. node := template //父节点
  92. maketree(templateList, node) //调用生成tree
  93. return node
  94. }
  95. // 创建一颗树...interface{}
  96. func maketree(Data []*ItemSectionTemplateTree, node *ItemSectionTemplateTree) { //参数为父节点,添加父节点的子节点指针切片
  97. childs, _ := havechild(Data, node) //判断节点是否有子节点并返回
  98. if childs != nil {
  99. // 子节点总数
  100. Total := len(childs)
  101. // 标记最后一个元素
  102. end := Total - 1
  103. childs[end].IsEnd = true
  104. // 往父节点添加子节点
  105. node.Children = append(node.Children, childs[0:]...) //添加子节点
  106. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  107. _, has := havechild(Data, v)
  108. if has {
  109. // 递归添加节点
  110. maketree(Data, v)
  111. }
  112. // else {
  113. // // 叶子节点
  114. // node.Leaf = false
  115. // }
  116. }
  117. }
  118. }
  119. // 是否有子树
  120. func havechild(Data []*ItemSectionTemplateTree, node *ItemSectionTemplateTree) (child []*ItemSectionTemplateTree, yes bool) {
  121. for _, v := range Data {
  122. if v.ParentId == node.Id {
  123. child = append(child, v)
  124. }
  125. }
  126. if child != nil {
  127. yes = true
  128. }
  129. return
  130. }