100 lines
2.8 KiB
Go
100 lines
2.8 KiB
Go
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"),
|
|
}
|
|
}
|