aeus-admin/service/department.go

131 lines
3.5 KiB
Go

package service
import (
"context"
"fmt"
"strconv"
"git.nobla.cn/golang/aeus-admin/internal/logic"
"git.nobla.cn/golang/aeus-admin/models"
"git.nobla.cn/golang/aeus-admin/pb"
"git.nobla.cn/golang/rest/types"
"gorm.io/gorm"
)
type (
departmentOptions struct {
db *gorm.DB
}
DepartmentOption func(o *departmentOptions)
DepartmentService struct {
opts *departmentOptions
logic *logic.Department
user *logic.User
}
)
func WithDepartmentDB(db *gorm.DB) DepartmentOption {
return func(o *departmentOptions) {
o.db = db
}
}
func (s *DepartmentService) GetDepartmentLabels(ctx context.Context, req *pb.GetDepartmentLabelRequest) (res *pb.GetDepartmentLabelResponse, err error) {
res = &pb.GetDepartmentLabelResponse{}
var values []*types.TypeValue[int64]
if values, err = s.logic.GetLabels(ctx); err == nil {
res.Data = make([]*pb.DepartmentLabelValue, 0, len(values))
for _, row := range values {
res.Data = append(res.Data, &pb.DepartmentLabelValue{
Label: row.Label,
Value: row.Value,
})
}
}
return
}
func (s *DepartmentService) recursiveDepartmentUser(parent int64, departments []*models.Department, users []*models.User) []*pb.DepartmentUserValue {
values := make([]*pb.DepartmentUserValue, 0, len(departments))
for _, row := range departments {
if row.ParentId == parent {
item := &pb.DepartmentUserValue{
Label: row.Name,
Value: strconv.FormatInt(row.Id, 10),
Children: make([]*pb.DepartmentUserValue, 0),
}
item.Children = append(item.Children, s.recursiveDepartmentUser(row.Id, departments, users)...)
for _, v := range users {
if v.DeptId == row.Id {
item.Children = append(item.Children, &pb.DepartmentUserValue{
Label: fmt.Sprintf("%s(%s)", v.Username, v.Uid),
Value: v.Uid,
Isuser: true,
})
}
}
values = append(values, item)
}
}
return values
}
func (s *DepartmentService) recursiveDepartmentLevel(parent int64, departments []*models.Department) []*pb.DepartmentLevelValue {
values := make([]*pb.DepartmentLevelValue, 0, len(departments))
for _, row := range departments {
if row.ParentId == parent {
item := &pb.DepartmentLevelValue{
Label: row.Name,
Value: row.Id,
Children: make([]*pb.DepartmentLevelValue, 0),
}
item.Children = append(item.Children, s.recursiveDepartmentLevel(row.Id, departments)...)
values = append(values, item)
}
}
return values
}
func (s *DepartmentService) GetDepartmentUsers(ctx context.Context, req *pb.GetDepartmentUserRequest) (res *pb.GetDepartmentUserResponse, err error) {
var (
users []*models.User
departments []*models.Department
)
if departments, err = s.logic.GetDepartments(ctx); err != nil {
return
}
if users, err = s.user.GeUsers(ctx); err != nil {
return
}
res = &pb.GetDepartmentUserResponse{
Data: s.recursiveDepartmentUser(0, departments, users),
}
return
}
func (s *DepartmentService) GetDepartmentLevelLabels(ctx context.Context, req *pb.GetDepartmentLevelLabelsRequest) (res *pb.GetDepartmentLevelLabelsResponse, err error) {
var (
departments []*models.Department
)
if departments, err = s.logic.GetDepartments(ctx); err != nil {
return
}
res = &pb.GetDepartmentLevelLabelsResponse{
Data: s.recursiveDepartmentLevel(0, departments),
}
return
}
func NewDepartmentService(cbs ...DepartmentOption) *DepartmentService {
opts := &departmentOptions{}
for _, cb := range cbs {
cb(opts)
}
return &DepartmentService{
opts: opts,
user: logic.NewUserLogic(opts.db),
logic: logic.NewDepartmentLogic(opts.db),
}
}