item_section.go 4.0 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. Code2 string `josn:"code2"`
  49. IsEnd bool `json:"isEnd"`
  50. }
  51. // 获得项目节模板数据
  52. func makeTemplateData(templateNumber string) []*ItemSectionTemplateTree {
  53. templateList := make([]*ItemSectionTemplateTree, 0)
  54. // 读取模板文件
  55. data, err := ioutil.ReadFile("../lib/section_template" + templateNumber + ".json")
  56. if err != nil {
  57. log.Println("项目节模板文件读取出错:err=", err)
  58. return nil
  59. }
  60. err = json.Unmarshal(data, &templateList)
  61. if err != nil {
  62. log.Println("项目节模板Json转换出错:err=", err)
  63. return nil
  64. }
  65. return templateList
  66. }
  67. // 初始化项目节模板
  68. // func NewTemplate() Template {
  69. // return nil
  70. // }
  71. // 生成树
  72. func makeItemSectionTemplateTree(templateNumber string) *ItemSectionTemplateTree {
  73. // templateList := make([]*ItemSectionTemplateTree, 0)
  74. // // 读取模板文件
  75. // data, err := ioutil.ReadFile("../lib/" + fileName)
  76. // if err != nil {
  77. // log.Println("项目节模板文件读取出错:err=", err)
  78. // return nil
  79. // }
  80. // err = json.Unmarshal(data, &templateList)
  81. // if err != nil {
  82. // log.Println("项目节模板Json转换出错:err=", err)
  83. // return nil
  84. // }
  85. templateList := makeTemplateData(templateNumber)
  86. // 生成根
  87. template := &ItemSectionTemplateTree{}
  88. template.Id = 0
  89. template.Name = "root"
  90. template.ParentId = -1
  91. templateList = append(templateList, template)
  92. node := template //父节点
  93. maketree(templateList, node) //调用生成tree
  94. return node
  95. }
  96. // 创建一颗树...interface{}
  97. func maketree(Data []*ItemSectionTemplateTree, node *ItemSectionTemplateTree) { //参数为父节点,添加父节点的子节点指针切片
  98. childs, _ := havechild(Data, node) //判断节点是否有子节点并返回
  99. if childs != nil {
  100. // 子节点总数
  101. Total := len(childs)
  102. // 标记最后一个元素
  103. end := Total - 1
  104. childs[end].IsEnd = true
  105. // 往父节点添加子节点
  106. node.Children = append(node.Children, childs[0:]...) //添加子节点
  107. for _, v := range childs { //查询子节点的子节点,并添加到子节点
  108. _, has := havechild(Data, v)
  109. if has {
  110. // 递归添加节点
  111. maketree(Data, v)
  112. }
  113. // else {
  114. // // 叶子节点
  115. // node.Leaf = false
  116. // }
  117. }
  118. }
  119. }
  120. // 是否有子树
  121. func havechild(Data []*ItemSectionTemplateTree, node *ItemSectionTemplateTree) (child []*ItemSectionTemplateTree, yes bool) {
  122. for _, v := range Data {
  123. if v.ParentId == node.Id {
  124. child = append(child, v)
  125. }
  126. }
  127. if child != nil {
  128. yes = true
  129. }
  130. return
  131. }