package iot import ( "context" "fmt" "strings" "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/model" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/entity" "github.com/gogf/gf/v2/frame/g" ) type channelDisplayScope struct { TenantID string DeptID int64 FullName bool } // Channel names are private to the tenant's top organization. A broad data // scope or an administrator role does not grant downstream organizations names. func canViewChannelFullName(ctx context.Context) bool { return resolveChannelDisplayScope(ctx, func() (*entity.SysDept, error) { var dept *entity.SysDept cols := dao.SysDept.Columns() err := dao.SysDept.Ctx(ctx).Fields(cols.DeptId, cols.ParentId, cols.Ancestors). Where(cols.TenantId, contexts.GetTenantId(ctx)). Where(cols.DeptId, contexts.GetDeptId(ctx)).Scan(&dept) return dept, err }) } func resolveChannelDisplayScope(ctx context.Context, load func() (*entity.SysDept, error)) bool { user := contexts.GetUser(ctx) if user == nil || user.DeptId <= 0 || strings.TrimSpace(user.TenantId) == "" { return false } const key = "iot.channelDisplayScope" if cached, ok := contexts.GetDataValue(ctx, key).(channelDisplayScope); ok && cached.TenantID == user.TenantId && cached.DeptID == user.DeptId { return cached.FullName } dept, err := load() fullName := err == nil && dept != nil && dept.DeptId == user.DeptId && (dept.ParentId == 0 || strings.Trim(dept.Ancestors, ",") == "0") if err != nil { g.Log().Warningf(ctx, "resolve channel display organization failed: %v", err) } contexts.SetDataValue(ctx, key, channelDisplayScope{TenantID: user.TenantId, DeptID: user.DeptId, FullName: fullName}) return fullName } func channelDisplayNameColumn(ctx context.Context) string { if canViewChannelFullName(ctx) { return dao.TSimChannels.Columns().ChanName } return dao.TSimChannels.Columns().ChanAlias } func channelDisplayNameSQL(ctx context.Context, table string) string { return fmt.Sprintf("COALESCE(NULLIF(TRIM(%s.%s), ''), '--')", table, channelDisplayNameColumn(ctx)) } func channelDisplayName(fullName bool, name, alias string) string { if fullName { return name } if alias = strings.TrimSpace(alias); alias != "" { return alias } return "--" } func applyCardChannelDisplayNames(ctx context.Context, list []*model.TSimCardInfoListModel) { if len(list) == 0 { return } fullName := canViewChannelFullName(ctx) for _, item := range list { if item != nil { item.ChanName = channelDisplayName(fullName, item.ChanName, item.ChanAlias) } } }