131 lines
3.5 KiB
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),
|
|
}
|
|
}
|