golang中员工分组分页获取的一种方案

在业务中,有一个场景,A系统需要提供一个接口,返回组织架构信息,供B系统入库,即B系统的组织架构是从A系统中同步过来的。

这个场景下存在一个小问题,B系统期望A系统按照组织树层序遍历分页返回。这样B系统就不需要担心新增组织时找不到父级组织了。


那么A系统要怎么做呢?


方案1:在数据库查询时,从根节点递归查询。

方案2:获取全部组织数据后,构建形成多叉树,常驻内存,然后从根节点层序遍历。


如果既不能直接查询数据库,又不想维护多叉树,怎么办呢?


下面的方案也许可以参考:

1、分页获取无序的组织list,并整合成golang的切片

2、从根节点出发,通过程序实现数据库的递归查询

示例如下:


package tree

import "fmt"

type node struct {
    Id   string `json:"id"`
    Name string `json:"name"`
    Pid  string `json:"pid"`
}

var data = make([]node, 0, 10)

func SliceTreeSort() {
    makeSliceTreeData()

    // 输出排好序的结果
    fmt.Println("排序前:")
    for _, v := range data {
       fmt.Println(v.Id, v.Name, v.Pid)
    }

    // 记录元素的索引的顺序
    IdxSort := make([]int, 0, len(data))
    // IdxSort的辅助变量,帮助判断索引是否已经在IdxSort存在
    idxSet := make(map[int]bool, len(data))
    // 记录已经处理过的Pid集合
    pidSet := make(map[string]bool, len(data))
    // 根节点默认已经处理过了
    pidSet[`-1`] = true

    // 遍历寻找
    for i := 0; i < len(data); i++ {
       // 如果IdxSort已经满了,说明已经排好序了
       if len(idxSet) == len(data) {
          break
       }
       for k, v := range data {
          // 已记录的节点,不需要处理了
          if _, ok := idxSet[k]; ok {
             continue
          }
          // 判断当前节点的父节点是否在pidSet,在说明可以取v.Pid下所有的子节点,孙子、曾孙等节点还不能取
          if _, ok := pidSet[v.Pid]; ok {
             pidSet[v.Id] = true          // 取子节点,为下次判断子节点的子节点做准备
             IdxSort = append(IdxSort, k) // 记录子节点的索引
             idxSet[k] = true             // 标记子节点已经记录
          }
       }
    }

    // 按照上边idxSort计算的切片key顺序,重新排序
    outData := make([]node, 0, len(data))
    for _, v := range IdxSort {
       outData = append(outData, data[v])
    }

    // 如果是分页对外提供接口,则可以讲切片缓存下来。
    // 根据分页信息截切

    fmt.Println("排序后:")
    fmt.Println(outData)
}

func makeSliceTreeData() {
    var n node

    n = node{Id: "0", Name: "公司", Pid: "-1"}
    data = append(data, n)

    n = node{Id: "1000131", Name: "部门1-3-1", Pid: "100013"}
    data = append(data, n)
    n = node{Id: "1000132", Name: "部门1-3-2", Pid: "100013"}
    data = append(data, n)
    n = node{Id: "1000133", Name: "部门1-3-3", Pid: "100013"}
    data = append(data, n)

    n = node{Id: "10001", Name: "部门1", Pid: "0"}
    data = append(data, n)
    n = node{Id: "10002", Name: "部门2", Pid: "0"}
    data = append(data, n)
    n = node{Id: "10003", Name: "部门3", Pid: "0"}
    data = append(data, n)

    n = node{Id: "1000121", Name: "部门1-2-1", Pid: "100012"}
    data = append(data, n)
    n = node{Id: "1000122", Name: "部门1-2-2", Pid: "100012"}
    data = append(data, n)
    n = node{Id: "1000123", Name: "部门1-2-3", Pid: "100012"}
    data = append(data, n)

    n = node{Id: "1000111", Name: "部门1-1-1", Pid: "100011"}
    data = append(data, n)
    n = node{Id: "1000112", Name: "部门1-1-2", Pid: "100011"}
    data = append(data, n)
    n = node{Id: "1000113", Name: "部门1-1-3", Pid: "100011"}
    data = append(data, n)

    n = node{Id: "100011", Name: "部门1-1", Pid: "10001"}
    data = append(data, n)
    n = node{Id: "100012", Name: "部门1-2", Pid: "10001"}
    data = append(data, n)
    n = node{Id: "100013", Name: "部门1-3", Pid: "10001"}
    data = append(data, n)

}
posted @ 2024-03-01 18:27  绿豆淀粉好勾芡儿  阅读(25)  评论(0)    收藏  举报