package iot import ( "context" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/dao" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/contexts" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/service" "github.com/gogf/gf/v2/frame/g" ) type cardDeptDisplayNode struct { DeptID int64 `orm:"dept_id"` ParentID int64 `orm:"parent_id"` DeptName string `orm:"dept_name"` } func newCardDeptDisplayResolver(ctx context.Context) (func(int64, string) string, error) { nodes, err := loadCardDeptDisplayNodes(ctx) if err != nil { return nil, err } viewerDeptID := contexts.GetDeptId(ctx) return func(cardDeptID int64, fallback string) string { return resolveCardDisplayDeptName(nodes, viewerDeptID, cardDeptID, fallback) }, nil } func loadCardDeptDisplayNodes(ctx context.Context) (map[int64]cardDeptDisplayNode, error) { nodes := make(map[int64]cardDeptDisplayNode) tenantID := contexts.GetTenantId(ctx) if tenantID == "" { return nodes, nil } var departments []*cardDeptDisplayNode mod := service.MemoryDB().DB(ctx).Ctx(ctx).Model(dao.SysDept.Table()). Fields( dao.SysDept.Columns().DeptId, dao.SysDept.Columns().ParentId, dao.SysDept.Columns().DeptName, ). Where(dao.SysDept.Columns().TenantId, tenantID). WhereNull(dao.SysDept.Columns().DeletedAt) if err := mod.Scan(&departments); err != nil { return nil, err } for _, department := range departments { if department == nil || department.DeptID <= 0 { continue } nodes[department.DeptID] = *department } return nodes, nil } func resolveCardDisplayDeptName( nodes map[int64]cardDeptDisplayNode, viewerDeptID int64, cardDeptID int64, fallback string, ) string { cardDept, ok := nodes[cardDeptID] if !ok { return fallback } if viewerDeptID <= 0 || viewerDeptID == cardDeptID { return cardDept.DeptName } path := make([]int64, 0, 4) visited := make(map[int64]struct{}) currentID := cardDeptID for currentID > 0 { if _, exists := visited[currentID]; exists { return fallback } visited[currentID] = struct{}{} path = append(path, currentID) current, exists := nodes[currentID] if !exists { return fallback } if currentID == viewerDeptID { if len(path) == 1 { return current.DeptName } return nodes[path[len(path)-2]].DeptName } currentID = current.ParentID } return fallback } func logCardDeptDisplayResolverError(ctx context.Context, err error) { if err != nil { g.Log().Warningf(ctx, "load card department display nodes failed: %v", err) } }