/* * @description: 项目节模板 * @Author: CP * @Date: 2020-10-29 09:44:20 * @FilePath: \construction_management\lib\item_section.go */ package lib import ( "encoding/json" "io/ioutil" "log" ) type ItemSection struct { TemplateTree1 *ItemSectionTemplateTree TemplateList1 []*ItemSectionTemplateTree TemplateRule1 string TemplateTree2 *ItemSectionTemplateTree TemplateList2 []*ItemSectionTemplateTree TemplateRule2 string } // 初始化项目节-树结构 func NewItemSection() *ItemSection { return &ItemSection{ TemplateTree1: makeItemSectionTemplateTree("1"), TemplateRule1: "-", TemplateTree2: makeItemSectionTemplateTree("2"), TemplateRule2: "-", } } func NewItemSectionData() *ItemSection { return &ItemSection{ TemplateList1: makeTemplateData("1"), TemplateRule1: "-", TemplateList2: makeTemplateData("2"), TemplateRule2: "-", } } // 项目节模板 type ItemSectionTemplateTree struct { Id int `form:"id" json:"id" ` ParentId int `form:"parentId" json:"parentId"` Name string `form:"name" json:"name"` Depth int `form:"depth" json:"depth"` Serial int `form:"serial" json:"serial"` Attribution string `form:"attribution" json:"attribution"` Leaf bool `json:"leaf" ` Children []*ItemSectionTemplateTree `json:"children"` Code2 string `josn:"code2"` IsEnd bool `json:"isEnd"` } // 获得项目节模板数据 func makeTemplateData(templateNumber string) []*ItemSectionTemplateTree { templateList := make([]*ItemSectionTemplateTree, 0) // 读取模板文件 data, err := ioutil.ReadFile("../lib/section_template" + templateNumber + ".json") if err != nil { log.Println("项目节模板文件读取出错:err=", err) return nil } err = json.Unmarshal(data, &templateList) if err != nil { log.Println("项目节模板Json转换出错:err=", err) return nil } return templateList } // 初始化项目节模板 // func NewTemplate() Template { // return nil // } // 生成树 func makeItemSectionTemplateTree(templateNumber string) *ItemSectionTemplateTree { // templateList := make([]*ItemSectionTemplateTree, 0) // // 读取模板文件 // data, err := ioutil.ReadFile("../lib/" + fileName) // if err != nil { // log.Println("项目节模板文件读取出错:err=", err) // return nil // } // err = json.Unmarshal(data, &templateList) // if err != nil { // log.Println("项目节模板Json转换出错:err=", err) // return nil // } templateList := makeTemplateData(templateNumber) // 生成根 template := &ItemSectionTemplateTree{} template.Id = 0 template.Name = "root" template.ParentId = -1 templateList = append(templateList, template) node := template //父节点 maketree(templateList, node) //调用生成tree return node } // 创建一颗树...interface{} func maketree(Data []*ItemSectionTemplateTree, node *ItemSectionTemplateTree) { //参数为父节点,添加父节点的子节点指针切片 childs, _ := havechild(Data, node) //判断节点是否有子节点并返回 if childs != nil { // 子节点总数 Total := len(childs) // 标记最后一个元素 end := Total - 1 childs[end].IsEnd = true // 往父节点添加子节点 node.Children = append(node.Children, childs[0:]...) //添加子节点 for _, v := range childs { //查询子节点的子节点,并添加到子节点 _, has := havechild(Data, v) if has { // 递归添加节点 maketree(Data, v) } // else { // // 叶子节点 // node.Leaf = false // } } } } // 是否有子树 func havechild(Data []*ItemSectionTemplateTree, node *ItemSectionTemplateTree) (child []*ItemSectionTemplateTree, yes bool) { for _, v := range Data { if v.ParentId == node.Id { child = append(child, v) } } if child != nil { yes = true } return }