package BasePositionService import ( "dsBaseWeb/Business/BasePosition/BasePositionProto" "dsBaseWeb/Utils/CommonUtil" "encoding/json" ) func AddPositionInfo(nodeName string, parentId string, areaLevel int32, orgType int32, xxbxlxm string, sortId int32) (*BasePositionProto.Reply, error) { Reply, err := AddBasePosition(BasePositionProto.ModelArg{NodeName: nodeName, ParentId: parentId, AreaLevel: areaLevel, OrgType: orgType, Xxbxlxm: xxbxlxm, SortId: sortId}) return Reply, err } func DeletePositionInfo(positionId string) (*BasePositionProto.Reply, error) { idsArr := []string{positionId} Reply, err := DeleteBasePosition(BasePositionProto.DeleteIdsArg{Ids: idsArr}) return Reply, err } func UpdatePositionInfo(positionId string, nodeName string, sortId int32) (*BasePositionProto.Reply, error) { Reply, err := UpdateBasePosition(BasePositionProto.ModelArg{Id: positionId, NodeName: nodeName, SortId: sortId}) return Reply, err } func GetPositionInfoById(positionId string) (*BasePositionProto.Reply, error) { Reply, err := GetBasePosition(BasePositionProto.ModelArg{Id: positionId}) return Reply, err } func ListPositionByBureauId(bureauId string) (*BasePositionProto.Reply, error) { Reply, err := ListBasePositionByBureauId(BasePositionProto.ListBasePositionByBureauIdArg{BureauId: bureauId}) return Reply, err } func TreePositionInfo() (*BasePositionProto.Reply, error) { Reply, err := TreeBasePosition() Reply.List = convertPositionTree(Reply.List) return Reply, err } func convertPositionTree(listStr string) string { list := CommonUtil.ConvertJsonStringToMapArray(listStr) ListOrgNode := make([]*OrgNode, 0) for i := range list { record := list[i] //添加数据 a := OrgNode{ Id: record["id"].(string), NodeName: record["node_name"].(string), ParentId: record["parent_id"].(string), OrgType: record["org_type"].(float64), AreaLevel: record["area_level"].(float64), Xxbxlxm: record["xxbxlxm"].(string), MaintainId: record["maintain_id"].(string), SortId: record["sort_id"].(float64), } ListOrgNode = append(ListOrgNode, &a) } //结构体的SortId根据数据库获取时,使用order by方法获取有序的子元素集合,这里就不在代码中进行排序了。 //从根节点开始进行构建,递归调用生成tree startOrgNode := ListOrgNode[0] makeTree(ListOrgNode, startOrgNode) //根据结构体生成json数据 jsonByte, _ := json.Marshal(startOrgNode) return string(jsonByte) } /** 功能:部门实体Struct 作者:黄海 时间:2020-06-03 */ type OrgNode struct { Id string `json:"id"` NodeName string `json:"node_name"` ParentId string `json:"parent_id"` OrgType float64 `json:"org_type"` AreaLevel float64 `json:"area_level"` Xxbxlxm string `json:"xxbxlxm"` MaintainId string `json:"maintain_id"` SortId float64 `json:"sort_id"` Children []*OrgNode `json:"children,omitempty"` } /** 功能:从指定节点开始构建树状结构 作者:黄海 时间:2020-06-03 */ func makeTree(allNode []*OrgNode, node *OrgNode) { children, _ := haveChild(allNode, node) //是不是有子节点 if children != nil { node.Children = append(node.Children, children[0:]...) //添加子节点 for _, v := range children { //查询子节点的子节点,并添加到子节点 _, has := haveChild(allNode, v) if has { makeTree(allNode, v) //递归添加节点 } } } } /** 功能:判断是不是有子节点 作者:黄海 时间:2020-06-03 */ func haveChild(AllNode []*OrgNode, node *OrgNode) (children []*OrgNode, yes bool) { for _, v := range AllNode { if v.ParentId == node.Id { children = append(children, v) } } if children != nil { yes = true } return }