|
|
package department
|
|
|
|
|
|
import (
|
|
|
"github.com/linmadan/egglib-go/core/application"
|
|
|
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/department/adapter"
|
|
|
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/department/command"
|
|
|
"gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory"
|
|
|
)
|
|
|
|
|
|
type SDepartmentService struct{}
|
|
|
|
|
|
func NewDepartmentService() *SDepartmentService {
|
|
|
newService := &SDepartmentService{}
|
|
|
return newService
|
|
|
}
|
|
|
|
|
|
func (ds *SDepartmentService) ListAndCount(in *command.QueryDepartmentCommand) (interface{}, error) {
|
|
|
transactionContext, err := factory.ValidateStartTransaction(in)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
defer func() {
|
|
|
transactionContext.RollbackTransaction()
|
|
|
}()
|
|
|
departmentRepository := factory.CreateDepartmentRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
userRepository := factory.CreateUserRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
companyRepository := factory.CreateCompanyRepository(map[string]interface{}{"transactionContext": transactionContext})
|
|
|
|
|
|
departments, err := departmentRepository.FindAll(in.CompanyId)
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
|
|
|
adapters := make([]*adapter.DepartmentAdapter, 0)
|
|
|
mapDep := map[int64]*adapter.DepartmentAdapter{}
|
|
|
mapDepNum := map[int64]int{}
|
|
|
// 已经按等级Level升序排序, 1级> 2级> ...
|
|
|
for i := range departments {
|
|
|
|
|
|
apt := &adapter.DepartmentAdapter{
|
|
|
Id: departments[i].Id,
|
|
|
Name: departments[i].Name,
|
|
|
CompanyId: departments[i].CompanyId,
|
|
|
ParentId: departments[i].ParentId,
|
|
|
Departments: make([]*adapter.DepartmentAdapter, 0),
|
|
|
}
|
|
|
mapDep[apt.Id] = apt
|
|
|
|
|
|
// 一级节点
|
|
|
if apt.ParentId == 0 {
|
|
|
adapters = append(adapters, apt)
|
|
|
} else {
|
|
|
// 上级节点若存在,加到上级的子节点
|
|
|
if parent, ok := mapDep[apt.ParentId]; ok {
|
|
|
parent.Departments = append(parent.Departments, apt)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 所有部门ID
|
|
|
mapDepNum[apt.Id] = 0
|
|
|
}
|
|
|
|
|
|
// 获取公司信息
|
|
|
company, err := companyRepository.FindOne(map[string]interface{}{"id": in.CompanyId})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
|
|
|
// 获取所有用户
|
|
|
userCount, users, err := userRepository.Find(map[string]interface{}{"companyId": in.CompanyId})
|
|
|
if err != nil {
|
|
|
return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error())
|
|
|
}
|
|
|
|
|
|
for i := range users {
|
|
|
v := users[i]
|
|
|
// 注.如果用户部门下挂到公司下,顶级公司数量暂时使用所有用户数量(userCount)
|
|
|
for _, depId := range v.DepartmentId {
|
|
|
if count, ok := mapDepNum[int64(depId)]; ok {
|
|
|
mapDepNum[int64(depId)] = count + 1 // 部门数量 + 1
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 计算部门下的用户总数量
|
|
|
ds.calculateChildTotal(mapDepNum, adapters)
|
|
|
|
|
|
// 创建顶级部门(公司)
|
|
|
top := make([]*adapter.DepartmentAdapter, 0)
|
|
|
top = append(top, &adapter.DepartmentAdapter{
|
|
|
Id: 0,
|
|
|
Name: company.Name,
|
|
|
CompanyId: company.Id,
|
|
|
ParentId: 0,
|
|
|
Departments: adapters,
|
|
|
UserTotal: userCount, // 公司下的所有用户
|
|
|
})
|
|
|
|
|
|
if err := transactionContext.CommitTransaction(); err != nil {
|
|
|
return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error())
|
|
|
}
|
|
|
return map[string]interface{}{"list": top}, nil
|
|
|
}
|
|
|
|
|
|
// 计算子部门总量
|
|
|
func (ds *SDepartmentService) calculateChildTotal(mapDepNum map[int64]int, departments []*adapter.DepartmentAdapter) int {
|
|
|
var total = 0
|
|
|
for i := range departments {
|
|
|
// 子部门总数量
|
|
|
var childTotal = ds.calculateChildTotal(mapDepNum, departments[i].Departments)
|
|
|
// 当前部门数量
|
|
|
if count, ok := mapDepNum[departments[i].Id]; ok {
|
|
|
childTotal += count
|
|
|
}
|
|
|
// 更新部门数量
|
|
|
departments[i].UserTotal = childTotal
|
|
|
|
|
|
total += childTotal
|
|
|
}
|
|
|
return total
|
|
|
} |
...
|
...
|
|