138 lines
4.3 KiB
Go
138 lines
4.3 KiB
Go
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)
|
||
}
|