WiiCITMS/process/hr/organization.go

138 lines
4.3 KiB
Go
Raw Permalink Normal View History

2025-11-07 14:14:34 +08:00
package hr
import (
"WiiCITMS/models/hr"
"WiiGenerates/WiiCITMS/generates/v1/go/types"
"WiiGoLibrary/apply/middle/process/v1"
"WiiGoLibrary/framework/db/v1/utils/mssql/unique"
"WiiGoLibrary/framework/hub/v1/dblib"
"errors"
)
// QueryOrganizationsRequest 查询组织请求参数
type QueryOrganizationsRequest struct {
OrganizationName string `json:"organizationName"` // 组织名称,用于模糊查询
ParentGuid string `json:"parentGuid"` // 父组织ID可选
IncludeChildren bool `json:"includeChildren"` // 是否包含子组织
Limit int `json:"limit"` // 分页参数,每页数量
Offset int `json:"offset"` // 分页参数,偏移量
}
// CreateOrganizationRequest 创建组织请求参数
type CreateOrganizationRequest struct {
OrganizationName string `json:"organizationName"` // 组织名称
ParentGuid string `json:"parentGuid"` // 父组织ID
OrganizationType int `json:"organizationType"` // 组织类型1-公司2-部门3-团队
Description string `json:"description"` // 组织描述
}
// QueryOrganizations 查询组织列表
func QueryOrganizations(params QueryOrganizationsRequest) ([]*hr.OrganizationModel, *process.Process) {
result := make([]*hr.OrganizationModel, 0)
// 构建查询条件
db := dblib.DBIns.DB.Model(&hr.OrganizationModel{}).Where("(RecordStatus & 524288) = 0")
// 按组织名称筛选
if params.OrganizationName != "" {
db = db.Where("OrganizationName LIKE ?", "%"+params.OrganizationName+"%")
}
// 按父组织ID筛选
if params.ParentGuid != "" {
parentGuid, err := unique.FromString(params.ParentGuid)
if err == nil {
db = db.Where("ParentGuid = ?", parentGuid)
}
}
// 分页查询
limit := params.Limit
if limit <= 0 {
limit = 20 // 默认每页20条
}
offset := params.Offset
if offset < 0 {
offset = 0
}
// 执行查询
r := db.Limit(limit).Offset(offset).Find(&result)
if r.Error != nil {
return result, process.FailError(types.QueryOrganizationError, r.Error)
}
// 如果需要包含子组织,则递归查询
if params.IncludeChildren && params.ParentGuid != "" {
for _, org := range result {
// 查询子组织
children, proc := getChildOrganizations(org.RecordGuid.String())
if !proc.IsError() {
result = append(result, children...)
}
}
}
return result, process.Success(200)
}
// getChildOrganizations 递归获取子组织
func getChildOrganizations(parentGuid string) ([]*hr.OrganizationModel, *process.Process) {
result := make([]*hr.OrganizationModel, 0)
// 验证父组织ID
parent, err := unique.FromString(parentGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询直接子组织
r := dblib.DBIns.DB.Where("ParentGuid = ? AND (RecordStatus & 524288) = 0", parent).Find(&result)
if r.Error != nil {
return nil, process.FailError(types.QueryOrganizationError, r.Error)
}
// 递归查询所有子组织
allChildren := make([]*hr.OrganizationModel, 0)
allChildren = append(allChildren, result...)
for _, org := range result {
children, proc := getChildOrganizations(org.RecordGuid.String())
if !proc.IsError() {
allChildren = append(allChildren, children...)
}
}
return allChildren, process.Success(200)
}
// CreateOrganization 创建组织
func CreateOrganization(params CreateOrganizationRequest) (*hr.OrganizationModel, *process.Process) {
// 解析父组织ID
parentGuid, err := unique.FromString(params.ParentGuid)
if err != nil {
parentGuid = unique.NilUUID
}
// 如果指定了父组织,验证父组织是否存在
if parentGuid != unique.NilUUID {
parentOrg := &hr.OrganizationModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", parentGuid).First(parentOrg)
if r.Error != nil {
return nil, process.FailError(types.ParentOrgNotFoundError, errors.New("父组织不存在"))
}
}
// 创建组织实例
organization := hr.OrganizationInstance()
organization.OrganizationName = params.OrganizationName
organization.ParentGuid = parentGuid
organization.RecordType = int16(params.OrganizationType)
// 保存到数据库
r := dblib.DBIns.DB.Create(organization)
if r.Error != nil {
return organization, process.FailError(types.CreateOrganizationError, r.Error)
}
return organization, process.Success(200)
}