package logic import ( "context" "fmt" "strings" "git.nobla.cn/golang/aeus-admin/models" "git.nobla.cn/golang/aeus-admin/pkg/dbcache" "git.nobla.cn/golang/aeus/pkg/cache" "git.nobla.cn/golang/rest" "git.nobla.cn/golang/rest/types" "gorm.io/gorm" ) type Department struct { db *gorm.DB cache cache.Cache sqlDependency *dbcache.SqlDependency } func (u *Department) RecursiveDepartment(ctx context.Context, parent int64, level int, departments []*models.Department) []*types.TypeValue[int64] { var ( child []*types.TypeValue[int64] ) values := make([]*types.TypeValue[int64], 0, len(departments)) for _, dept := range departments { if dept.ParentId == parent { if level == 0 { values = append(values, &types.TypeValue[int64]{ Label: dept.Name, Value: dept.Id, }) } else { values = append(values, &types.TypeValue[int64]{ Label: strings.Repeat("--", level) + dept.Name, Value: dept.Id, }) } child = u.RecursiveDepartment(ctx, dept.Id, level+1, departments) if len(child) > 0 { for _, row := range child { values = append(values, row) } } } } return values } // GetLevelLabels 获取层级标签 func (u *Department) GetLevelLabels(ctx context.Context) (values []*types.TypeValue[int64], err error) { values, err = dbcache.TryCache(ctx, fmt.Sprintf("department:level:labels"), func(tx *gorm.DB) ([]*types.TypeValue[int64], error) { var values []*models.Department if err = tx.Find(&values).Error; err != nil { return nil, err } return u.RecursiveDepartment(ctx, 0, 0, values), nil }, dbcache.WithDB(u.db), dbcache.WithCache(u.cache), dbcache.WithDependency(u.sqlDependency), ) return } // GetLabels 获取用户标签 func (u *Department) GetLabels(ctx context.Context) (values []*types.TypeValue[int64], err error) { values, err = dbcache.TryCache(ctx, fmt.Sprintf("department:labels"), func(tx *gorm.DB) ([]*types.TypeValue[int64], error) { return rest.ModelTypes[int64](ctx, tx, &models.Department{}, "", "name", "id") }, dbcache.WithDB(u.db), dbcache.WithCache(u.cache), dbcache.WithDependency(u.sqlDependency), ) return } // GetDepartments 获取部门列表 func (u *Department) GetDepartments(ctx context.Context) (values []*models.Department, err error) { values, err = dbcache.TryCache(ctx, fmt.Sprintf("department:list"), func(tx *gorm.DB) ([]*models.Department, error) { var items []*models.Department err = tx.Find(&items).Error return items, err }, dbcache.WithDB(u.db), dbcache.WithCache(u.cache), dbcache.WithDependency(u.sqlDependency), ) return } func NewDepartmentLogic(db *gorm.DB, ch cache.Cache) *Department { return &Department{ db: db, cache: ch, sqlDependency: dbcache.NewSqlDependency("SELECT MAX(`updated_at`) FROM departments"), } }