package model import ( "sort" pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow" ) type SystemDept struct { Id int64 `json:"id"` Name string `json:"name"` Remarks string `json:"remarks"` DeptType pasturePb.Depth_Kind `json:"dept_type"` LeaderId int64 `json:"leader_id"` ParentId int64 `json:"parent_id"` Sort int32 `json:"sort"` IsShow pasturePb.IsShow_Kind `json:"is_show"` IsDelete pasturePb.IsShow_Kind `json:"is_delete"` CreatedAt int64 `json:"created_at"` UpdatedAt int64 `json:"updated_at"` } func (s *SystemDept) TableName() string { return "system_dept" } type SystemDeptSlice []*SystemDept func (s SystemDeptSlice) ToPB(systemUserList []*SystemUser) []*pasturePb.SearchDeptRequest { res := make([]*pasturePb.SearchDeptRequest, len(s)) for i, d := range s { leaderName := "" for _, v := range systemUserList { if d.LeaderId != v.Id { continue } leaderName = v.Name } res[i] = &pasturePb.SearchDeptRequest{ Id: int32(d.Id), Name: d.Name, Remarks: d.Remarks, ParentId: int32(d.ParentId), DepthType: d.DeptType, LeaderId: int32(d.LeaderId), LeaderName: leaderName, Sort: d.Sort, IsShow: d.IsShow, IsDelete: d.IsDelete, CreatedAt: int32(d.CreatedAt), UpdatedAt: int32(d.UpdatedAt), } } return res } func (s SystemDeptSlice) ToTree() []*pasturePb.DeptTreeData { res := make([]*pasturePb.DeptTreeData, len(s)) if 0 == len(s) { return res } // 正排序 sort.Slice(s, func(i, j int) bool { return s[i].ParentId < s[j].ParentId }) for i, v := range s { res[i] = &pasturePb.DeptTreeData{ Id: int32(v.Id), ParentId: int32(v.ParentId), Name: v.Name, Children: make([]*pasturePb.DeptTreeData, 0), } } // 构建树 return deptBuildTree(res) } func deptBuildTree(deptTreeList []*pasturePb.DeptTreeData) []*pasturePb.DeptTreeData { tree := make([]*pasturePb.DeptTreeData, 0) for _, dept := range deptTreeList { if dept.ParentId == 0 { tree = append(tree, dept) } else { parent := deptFindByID(deptTreeList, dept.ParentId) if parent != nil { parent.Children = append(parent.Children, dept) } } } return tree } func deptFindByID(menuTreeList []*pasturePb.DeptTreeData, id int32) *pasturePb.DeptTreeData { for _, v := range menuTreeList { if id == v.Id { return v } if child := deptFindByID(v.Children, id); child != nil { return child } } return nil }