WiiCITMS/process/hr/org_position_rel.go

408 lines
11 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"
)
// AssignPositionToOrgRequest 为组织分配岗位的请求参数
type AssignPositionToOrgRequest struct {
OrganizationGuid string `json:"organizationGuid"` // 组织ID
PositionGuid string `json:"positionGuid"` // 岗位ID
HeadCount int `json:"headCount"` // 岗位编制人数
}
// QueryOrgPositionRequest 查询组织岗位关系的请求参数
type QueryOrgPositionRequest struct {
OrganizationGuid string `json:"organizationGuid"` // 组织ID
PositionGuid string `json:"positionGuid"` // 岗位ID
Limit int `json:"limit"` // 分页参数,每页数量
Offset int `json:"offset"` // 分页参数,偏移量
}
// OrgPositionDTO 组织岗位关系DTO
type OrgPositionDTO struct {
RelationGuid string `json:"relationGuid"` // 关系记录ID
OrganizationGuid string `json:"organizationGuid"` // 组织ID
OrganizationName string `json:"organizationName"` // 组织名称
OrganizationType int `json:"organizationType"` // 组织类型
PositionGuid string `json:"positionGuid"` // 岗位ID
PositionName string `json:"positionName"` // 岗位名称
PositionCode string `json:"positionCode"` // 岗位代码
HeadCount int `json:"headCount"` // 岗位编制人数
Level int `json:"level"` // 岗位级别
CategoryID int `json:"categoryId"` // 岗位类别ID
CategoryName string `json:"categoryName"` // 岗位类别名称
IsManagement bool `json:"isManagement"` // 是否管理岗位
}
// AssignPositionToOrg 为组织分配岗位
func AssignPositionToOrg(params AssignPositionToOrgRequest) (*hr.OrgPositionRelModel, *process.Process) {
// 验证组织是否存在
org, proc := GetOrganizationByID(params.OrganizationGuid)
if proc.IsError() {
return nil, proc
}
// 验证岗位是否存在
position, proc := GetPositionByID(params.PositionGuid)
if proc.IsError() {
return nil, proc
}
// 检查岗位状态是否为启用
if position.Status != 1 {
return nil, process.FailError(types.PositionDisabledError, errors.New("岗位已禁用,不能分配"))
}
// 检查是否已存在相同的组织岗位关系
var count int64
r := dblib.DBIns.DB.Model(&hr.OrgPositionRelModel{}).
Where("OrganizationGuid = ? AND PositionGuid = ? AND (RecordStatus & 524288) = 0",
org.RecordGuid, position.RecordGuid).Count(&count)
if r.Error != nil {
return nil, process.FailError(types.QueryOrgPositionError, r.Error)
}
if count > 0 {
return nil, process.FailError(types.DuplicateOrgPositionError, errors.New("该组织已分配此岗位"))
}
// 创建组织岗位关系
relation := hr.OrgPositionRelInstance()
relation.OrganizationID = org.DepartmentID
relation.OrganizationGuid = org.RecordGuid
relation.PositionID = position.PositionID
relation.PositionGuid = position.RecordGuid
// 设置岗位编制人数
if params.HeadCount <= 0 {
relation.HeadCount = 1 // 默认为1
} else {
relation.HeadCount = params.HeadCount
}
// 保存到数据库
r = dblib.DBIns.DB.Create(relation)
if r.Error != nil {
return nil, process.FailError(types.CreateOrgPositionError, r.Error)
}
return relation, process.Success(200)
}
// UpdateOrgPositionHeadCount 更新组织岗位编制人数
func UpdateOrgPositionHeadCount(relationGuid string, headCount int) (*hr.OrgPositionRelModel, *process.Process) {
// 验证关系ID
guid, err := unique.FromString(relationGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询组织岗位关系
relation := &hr.OrgPositionRelModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", guid).First(relation)
if r.Error != nil {
return nil, process.FailError(types.OrgPositionRelNotFoundError, r.Error)
}
// 验证编制人数
if headCount <= 0 {
return nil, process.FailError(types.InvalidParamError, errors.New("编制人数必须大于0"))
}
// 更新编制人数
relation.HeadCount = headCount
// 保存更新
r = dblib.DBIns.DB.Save(relation)
if r.Error != nil {
return nil, process.FailError(types.UpdateOrgPositionError, r.Error)
}
return relation, process.Success(200)
}
// RemovePositionFromOrg 从组织中移除岗位
func RemovePositionFromOrg(relationGuid string) *process.Process {
// 验证关系ID
guid, err := unique.FromString(relationGuid)
if err != nil {
return process.FailError(types.InvalidParamError, err)
}
// 查询组织岗位关系
relation := &hr.OrgPositionRelModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", guid).First(relation)
if r.Error != nil {
return process.FailError(types.OrgPositionRelNotFoundError, r.Error)
}
// 使用原生SQL执行删除操作设置删除标记
sql := "UPDATE " + hr.OrgPositionRelTable + " SET RecordStatus = RecordStatus | 524288 WHERE RecordGuid = ?"
r = dblib.DBIns.DB.Exec(sql, guid)
if r.Error != nil {
return process.FailError(types.DeleteOrgPositionError, r.Error)
}
return process.Success(200)
}
// QueryPositionsByOrg 查询组织的岗位列表
func QueryPositionsByOrg(organizationGuid string, params QueryOrgPositionRequest) ([]OrgPositionDTO, *process.Process) {
result := make([]OrgPositionDTO, 0)
// 验证组织ID
orgGuid, err := unique.FromString(organizationGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询组织是否存在
org := &hr.OrganizationModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", orgGuid).First(org)
if r.Error != nil {
return nil, process.FailError(types.OrgNotFoundError, r.Error)
}
// 分页参数处理
limit := params.Limit
if limit <= 0 {
limit = 20 // 默认每页20条
}
offset := params.Offset
if offset < 0 {
offset = 0
}
// 使用JOIN查询组织岗位关系及岗位信息
rows, err := dblib.DBIns.DB.Raw(`
SELECT
r.RecordGuid as RelationGuid,
o.RecordGuid as OrganizationGuid,
o.OrganizationName,
o.RecordType as OrganizationType,
p.RecordGuid as PositionGuid,
p.PositionName,
p.PositionCode,
r.HeadCount,
p.Level,
p.CategoryID,
p.CategoryName,
p.IsManagement
FROM
`+hr.OrgPositionRelTable+` r
JOIN
`+hr.OrganizationTable+` o ON r.OrganizationGuid = o.RecordGuid
JOIN
`+hr.PositionTable+` p ON r.PositionGuid = p.RecordGuid
WHERE
r.OrganizationGuid = ?
AND (r.RecordStatus & 524288) = 0
AND (o.RecordStatus & 524288) = 0
AND (p.RecordStatus & 524288) = 0
ORDER BY p.Level DESC, p.CategoryID ASC
LIMIT ? OFFSET ?
`, orgGuid, limit, offset).Rows()
if err != nil {
return nil, process.FailError(types.QueryOrgPositionError, err)
}
defer rows.Close()
// 遍历结果集
for rows.Next() {
var dto OrgPositionDTO
var orgGuidStr, posGuidStr, relGuidStr string
err := rows.Scan(
&relGuidStr,
&orgGuidStr,
&dto.OrganizationName,
&dto.OrganizationType,
&posGuidStr,
&dto.PositionName,
&dto.PositionCode,
&dto.HeadCount,
&dto.Level,
&dto.CategoryID,
&dto.CategoryName,
&dto.IsManagement,
)
if err != nil {
continue
}
dto.RelationGuid = relGuidStr
dto.OrganizationGuid = orgGuidStr
dto.PositionGuid = posGuidStr
result = append(result, dto)
}
return result, process.Success(200)
}
// QueryOrgsByPosition 查询拥有指定岗位的组织列表
func QueryOrgsByPosition(positionGuid string, params QueryOrgPositionRequest) ([]OrgPositionDTO, *process.Process) {
result := make([]OrgPositionDTO, 0)
// 验证岗位ID
posGuid, err := unique.FromString(positionGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询岗位是否存在
position := &hr.PositionModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", posGuid).First(position)
if r.Error != nil {
return nil, process.FailError(types.PositionNotFoundError, r.Error)
}
// 分页参数处理
limit := params.Limit
if limit <= 0 {
limit = 20 // 默认每页20条
}
offset := params.Offset
if offset < 0 {
offset = 0
}
// 使用JOIN查询组织岗位关系及组织信息
rows, err := dblib.DBIns.DB.Raw(`
SELECT
r.RecordGuid as RelationGuid,
o.RecordGuid as OrganizationGuid,
o.OrganizationName,
o.RecordType as OrganizationType,
p.RecordGuid as PositionGuid,
p.PositionName,
p.PositionCode,
r.HeadCount,
p.Level,
p.CategoryID,
p.CategoryName,
p.IsManagement
FROM
`+hr.OrgPositionRelTable+` r
JOIN
`+hr.OrganizationTable+` o ON r.OrganizationGuid = o.RecordGuid
JOIN
`+hr.PositionTable+` p ON r.PositionGuid = p.RecordGuid
WHERE
r.PositionGuid = ?
AND (r.RecordStatus & 524288) = 0
AND (o.RecordStatus & 524288) = 0
AND (p.RecordStatus & 524288) = 0
LIMIT ? OFFSET ?
`, posGuid, limit, offset).Rows()
if err != nil {
return nil, process.FailError(types.QueryOrgPositionError, err)
}
defer rows.Close()
// 遍历结果集
for rows.Next() {
var dto OrgPositionDTO
var orgGuidStr, posGuidStr, relGuidStr string
err := rows.Scan(
&relGuidStr,
&orgGuidStr,
&dto.OrganizationName,
&dto.OrganizationType,
&posGuidStr,
&dto.PositionName,
&dto.PositionCode,
&dto.HeadCount,
&dto.Level,
&dto.CategoryID,
&dto.CategoryName,
&dto.IsManagement,
)
if err != nil {
continue
}
dto.RelationGuid = relGuidStr
dto.OrganizationGuid = orgGuidStr
dto.PositionGuid = posGuidStr
result = append(result, dto)
}
return result, process.Success(200)
}
// GetPositionOrgRelation 获取组织岗位关系详情
func GetPositionOrgRelation(relationGuid string) (*OrgPositionDTO, *process.Process) {
// 验证关系ID
guid, err := unique.FromString(relationGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 使用JOIN查询组织岗位关系、组织和岗位信息
var dto OrgPositionDTO
var orgGuidStr, posGuidStr, relGuidStr string
err = dblib.DBIns.DB.Raw(`
SELECT
r.RecordGuid as RelationGuid,
o.RecordGuid as OrganizationGuid,
o.OrganizationName,
o.RecordType as OrganizationType,
p.RecordGuid as PositionGuid,
p.PositionName,
p.PositionCode,
r.HeadCount,
p.Level,
p.CategoryID,
p.CategoryName,
p.IsManagement
FROM
`+hr.OrgPositionRelTable+` r
JOIN
`+hr.OrganizationTable+` o ON r.OrganizationGuid = o.RecordGuid
JOIN
`+hr.PositionTable+` p ON r.PositionGuid = p.RecordGuid
WHERE
r.RecordGuid = ?
AND (r.RecordStatus & 524288) = 0
AND (o.RecordStatus & 524288) = 0
AND (p.RecordStatus & 524288) = 0
`, guid).Row().Scan(
&relGuidStr,
&orgGuidStr,
&dto.OrganizationName,
&dto.OrganizationType,
&posGuidStr,
&dto.PositionName,
&dto.PositionCode,
&dto.HeadCount,
&dto.Level,
&dto.CategoryID,
&dto.CategoryName,
&dto.IsManagement,
)
if err != nil {
return nil, process.FailError(types.OrgPositionRelNotFoundError, err)
}
dto.RelationGuid = relGuidStr
dto.OrganizationGuid = orgGuidStr
dto.PositionGuid = posGuidStr
return &dto, process.Success(200)
}