WiiCITMS/process/hr/organization_extended.go

206 lines
6.0 KiB
Go
Raw 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"
)
// GetOrganizationByID 根据ID获取组织
func GetOrganizationByID(orgGuid string) (*hr.OrganizationModel, *process.Process) {
// 验证组织ID
guid, err := unique.FromString(orgGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询组织
organization := &hr.OrganizationModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", guid).First(organization)
if r.Error != nil {
return nil, process.FailError(types.OrgNotFoundError, r.Error)
}
return organization, process.Success(200)
}
// UpdateOrganization 更新组织
func UpdateOrganization(orgGuid string, params CreateOrganizationRequest) (*hr.OrganizationModel, *process.Process) {
// 获取组织
organization, proc := GetOrganizationByID(orgGuid)
if proc.IsError() {
return nil, proc
}
// 解析父组织ID
if params.ParentGuid != "" {
parentGuid, err := unique.FromString(params.ParentGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 验证父组织是否存在
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("父组织不存在"))
}
// 检查是否会形成循环引用
if isCircularReference(organization.RecordGuid.String(), parentGuid.String()) {
return nil, process.FailError(types.CircularReferenceError, errors.New("不能将组织的子组织设为其父组织,会形成循环引用"))
}
organization.ParentGuid = parentGuid
}
}
// 更新组织信息
if params.OrganizationName != "" {
organization.OrganizationName = params.OrganizationName
}
if params.OrganizationType > 0 {
organization.RecordType = int16(params.OrganizationType)
}
// 保存更新
r := dblib.DBIns.DB.Save(organization)
if r.Error != nil {
return nil, process.FailError(types.UpdateOrganizationError, r.Error)
}
return organization, process.Success(200)
}
// DeleteOrganization 删除组织(逻辑删除)
func DeleteOrganization(orgGuid string) *process.Process {
// 获取组织
org, proc := GetOrganizationByID(orgGuid)
if proc.IsError() {
return proc
}
// 检查是否有子组织
var childCount int64
r := dblib.DBIns.DB.Model(&hr.OrganizationModel{}).Where("ParentGuid = ? AND (RecordStatus & 524288) = 0", org.RecordGuid).Count(&childCount)
if r.Error != nil {
return process.FailError(types.QueryOrganizationError, r.Error)
}
if childCount > 0 {
return process.FailError(types.DeleteOrganizationError, errors.New("该组织下有子组织,不能删除"))
}
// 使用原生SQL执行删除操作设置删除标记
sql := "UPDATE " + hr.OrganizationTable + " SET RecordStatus = RecordStatus | 524288 WHERE RecordGuid = ?"
r = dblib.DBIns.DB.Exec(sql, org.RecordGuid)
if r.Error != nil {
return process.FailError(types.DeleteOrganizationError, r.Error)
}
return process.Success(200)
}
// GetOrganizationTree 获取组织树结构
func GetOrganizationTree(rootOrgGuid string) (map[string]interface{}, *process.Process) {
// 验证根组织ID
var rootGuid unique.UUID
var err error
if rootOrgGuid != "" {
rootGuid, err = unique.FromString(rootOrgGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
} else {
// 如果未指定根组织则查询顶级组织ParentGuid为NilUUID
rootGuid = unique.NilUUID
}
// 查询根组织
var rootOrgs []*hr.OrganizationModel
var r error
if rootGuid == unique.NilUUID {
// 查询所有顶级组织
result := dblib.DBIns.DB.Where("ParentGuid = ? AND (RecordStatus & 524288) = 0", rootGuid).Find(&rootOrgs)
r = result.Error
} else {
// 查询指定的组织
rootOrg := &hr.OrganizationModel{}
result := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", rootGuid).First(rootOrg)
r = result.Error
if r == nil {
rootOrgs = []*hr.OrganizationModel{rootOrg}
}
}
if r != nil {
return nil, process.FailError(types.QueryOrganizationError, r)
}
// 构建组织树
result := make(map[string]interface{})
result["organizations"] = buildOrganizationTree(rootOrgs)
return result, process.Success(200)
}
// buildOrganizationTree 构建组织树结构
func buildOrganizationTree(orgs []*hr.OrganizationModel) []map[string]interface{} {
result := make([]map[string]interface{}, 0, len(orgs))
for _, org := range orgs {
// 查询子组织
var children []*hr.OrganizationModel
dblib.DBIns.DB.Where("ParentGuid = ? AND (RecordStatus & 524288) = 0", org.RecordGuid).Find(&children)
// 构建组织节点
node := map[string]interface{}{
"orgGuid": org.RecordGuid.String(),
"orgId": org.DepartmentID,
"name": org.OrganizationName,
"type": org.RecordType,
"parentGuid": org.ParentGuid.String(),
}
// 递归构建子组织
if len(children) > 0 {
node["children"] = buildOrganizationTree(children)
}
result = append(result, node)
}
return result
}
// isCircularReference 检查是否会形成循环引用
func isCircularReference(orgGuid, parentGuid string) bool {
// 如果尝试将组织的父级设为自身,则为循环引用
if orgGuid == parentGuid {
return true
}
// 解析父组织ID
parent, err := unique.FromString(parentGuid)
if err != nil {
return false
}
// 查询父组织的父级
parentOrg := &hr.OrganizationModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", parent).First(parentOrg)
if r.Error != nil || parentOrg.ParentGuid == unique.NilUUID {
return false
}
// 递归检查父级的父级是否最终指向原组织
return isCircularReference(orgGuid, parentOrg.ParentGuid.String())
}