|
@@ -0,0 +1,175 @@
|
|
|
+package jyutil
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "fmt"
|
|
|
+ "github.com/gogf/gf/v2/crypto/gmd5"
|
|
|
+ "github.com/gogf/gf/v2/frame/g"
|
|
|
+ "github.com/gogf/gf/v2/os/gcron"
|
|
|
+ "github.com/gogf/gf/v2/util/gconv"
|
|
|
+ "sync"
|
|
|
+)
|
|
|
+
|
|
|
+type (
|
|
|
+ DeptManager struct {
|
|
|
+ deptTree *DeptStruct
|
|
|
+ idDeptMapping map[int]*DeptStruct
|
|
|
+ lock *sync.RWMutex
|
|
|
+ lastMd5 string
|
|
|
+ }
|
|
|
+ DeptStruct struct {
|
|
|
+ IsRoot bool `json:"-"`
|
|
|
+ Id int `json:"value"`
|
|
|
+ Pid int `json:"-"`
|
|
|
+ FullName string `json:"-"`
|
|
|
+ Name string `json:"label"`
|
|
|
+ Children []*DeptStruct `json:"children,omitempty"`
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+var (
|
|
|
+ JyDepartmentManager = &DeptManager{
|
|
|
+ lock: &sync.RWMutex{},
|
|
|
+ }
|
|
|
+)
|
|
|
+
|
|
|
+func init() {
|
|
|
+ ctx := context.Background()
|
|
|
+ JyDepartmentManager.initAndUpdateDeptManager(ctx)
|
|
|
+ c, e := gcron.Add(ctx, g.Cfg().MustGet(ctx, "cron.updateDept", "5 * * * * *").String(), JyDepartmentManager.initAndUpdateDeptManager)
|
|
|
+ if e != nil {
|
|
|
+ g.Log().Errorf(ctx, "initAndUpdateDeptManager cron任务异常 %v", e)
|
|
|
+ }
|
|
|
+ c.Status()
|
|
|
+}
|
|
|
+
|
|
|
+func (mge *DeptManager) initAndUpdateDeptManager(ctx context.Context) {
|
|
|
+ res, err := g.DB().Query(ctx, "SELECT id,pid,name FROM jianyu.entniche_department where ent_id=? ", g.Cfg("global").MustGet(ctx, "powerEntId", 25917).Int64())
|
|
|
+ if err != nil || res.IsEmpty() {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ md5Str := gmd5.MustEncryptString(res.Json())
|
|
|
+ if mge.lastMd5 != "" && mge.lastMd5 == md5Str {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var (
|
|
|
+ deptTree *DeptStruct
|
|
|
+ allDept []*DeptStruct
|
|
|
+ idDeptMapping = map[int]*DeptStruct{}
|
|
|
+
|
|
|
+ loopCount = 0
|
|
|
+ )
|
|
|
+
|
|
|
+ for _, m := range res.List() {
|
|
|
+ var (
|
|
|
+ id = gconv.Int(m["id"])
|
|
|
+ pid = gconv.Int(m["pid"])
|
|
|
+ name = gconv.String(m["name"])
|
|
|
+ )
|
|
|
+ deptObj := &DeptStruct{
|
|
|
+ Id: id,
|
|
|
+ Pid: pid,
|
|
|
+ Name: name,
|
|
|
+ }
|
|
|
+ if pid == 0 { //公司根部门id
|
|
|
+ deptObj.IsRoot = true
|
|
|
+ deptTree = deptObj
|
|
|
+ idDeptMapping[deptObj.Id] = deptObj
|
|
|
+ }
|
|
|
+
|
|
|
+ allDept = append(allDept, deptObj)
|
|
|
+ }
|
|
|
+ //拼接组织架构树
|
|
|
+ for len(idDeptMapping) != res.Len() {
|
|
|
+ for _, deptStruct := range allDept {
|
|
|
+ _, ok1 := idDeptMapping[deptStruct.Id]
|
|
|
+ if ok1 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ p, ok2 := idDeptMapping[deptStruct.Pid]
|
|
|
+ if ok2 {
|
|
|
+ p.Children = append(p.Children, deptStruct)
|
|
|
+ idDeptMapping[deptStruct.Id] = deptStruct
|
|
|
+ }
|
|
|
+ }
|
|
|
+ loopCount++
|
|
|
+ if loopCount == 50 {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mge.lock.Lock()
|
|
|
+ defer mge.lock.Unlock()
|
|
|
+ mge.deptTree = deptTree
|
|
|
+ mge.idDeptMapping = idDeptMapping
|
|
|
+ mge.lastMd5 = md5Str
|
|
|
+ //递归获取部门全名
|
|
|
+ for _, deptStruct := range idDeptMapping {
|
|
|
+ deptStruct.FullName = mge.getDeptFullName(deptStruct.Id)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (mge *DeptManager) getDeptFullName(deptId int) string {
|
|
|
+ node, ok := mge.idDeptMapping[deptId]
|
|
|
+ if !ok {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+ if pNode, _ := mge.idDeptMapping[node.Pid]; pNode != nil {
|
|
|
+ if pNode.IsRoot {
|
|
|
+ return node.Name
|
|
|
+ } else {
|
|
|
+ return fmt.Sprintf("%s/%s", mge.getDeptFullName(pNode.Id), node.Name)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return node.Name
|
|
|
+}
|
|
|
+
|
|
|
+func (mge *DeptManager) GetDeptNode(deptId int) *DeptStruct {
|
|
|
+ node, ok := mge.idDeptMapping[deptId]
|
|
|
+ if !ok {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ return node
|
|
|
+}
|
|
|
+
|
|
|
+func (mge *DeptManager) GetDeptAllChildNode(deptId int) []*DeptStruct {
|
|
|
+ var rData []*DeptStruct
|
|
|
+ node, ok := mge.idDeptMapping[deptId]
|
|
|
+ if !ok || node == nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ for _, child := range node.Children {
|
|
|
+ rData = append(rData, child)
|
|
|
+ rData = append(rData, mge.GetDeptAllChildNode(child.Id)...)
|
|
|
+ }
|
|
|
+ return rData
|
|
|
+}
|
|
|
+
|
|
|
+// GetFullDeptName 通过部门id获取部门全名
|
|
|
+func (mge *DeptManager) GetFullDeptName(deptId int) string {
|
|
|
+ dept, ok := mge.idDeptMapping[deptId]
|
|
|
+ if !ok {
|
|
|
+ return ""
|
|
|
+ }
|
|
|
+ mge.lock.RLock()
|
|
|
+ defer mge.lock.RUnlock()
|
|
|
+ return dept.FullName
|
|
|
+}
|
|
|
+
|
|
|
+// GetShowDeptTree 根据部门名字获取展示根部门
|
|
|
+func (mge *DeptManager) GetShowDeptTree(deptName ...string) (rData []interface{}) {
|
|
|
+ mge.lock.RLock()
|
|
|
+ defer mge.lock.RUnlock()
|
|
|
+ for _, child := range mge.deptTree.Children {
|
|
|
+ var ok bool
|
|
|
+ for _, name := range deptName {
|
|
|
+ if child.Name == name {
|
|
|
+ ok = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ok {
|
|
|
+ rData = append(rData, child)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return rData
|
|
|
+}
|