206 lines
6.0 KiB
Go
206 lines
6.0 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"
|
||
)
|
||
|
||
// 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())
|
||
}
|