WiiCITMS/process/hr/position.go

253 lines
7.5 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"
)
// CreatePositionRequest 创建岗位请求参数
type CreatePositionRequest struct {
PositionName string `json:"positionName"` // 岗位名称
PositionCode string `json:"positionCode"` // 岗位代码
Description string `json:"description"` // 岗位描述
Level int `json:"level"` // 岗位级别
CategoryID int `json:"categoryId"` // 岗位类别ID
CategoryName string `json:"categoryName"` // 岗位类别名称
IsManagement bool `json:"isManagement"` // 是否管理岗位
}
// QueryPositionsRequest 查询岗位请求参数
type QueryPositionsRequest struct {
PositionName string `json:"positionName"` // 岗位名称,用于模糊查询
PositionCode string `json:"positionCode"` // 岗位代码,用于精确查询
CategoryID int `json:"categoryId"` // 岗位类别ID用于筛选
Level int `json:"level"` // 岗位级别,用于筛选
IsManagement bool `json:"isManagement"` // 是否管理岗位,用于筛选
// Status int `json:"status"` // 状态:-1-所有1-启用0-禁用
Limit int `json:"limit"` // 分页参数,每页数量
Offset int `json:"offset"` // 分页参数,偏移量
}
// CreatePosition 创建岗位
func CreatePosition(params CreatePositionRequest) (*hr.PositionModel, *process.Process) {
// 验证岗位代码是否已存在
var count int64
r := dblib.DBIns.DB.Model(&hr.PositionModel{}).Where("PositionCode = ? AND (RecordStatus & 524288) = 0", params.PositionCode).Count(&count)
if r.Error != nil {
return nil, process.FailError(types.QueryPositionError, r.Error)
}
if count > 0 {
return nil, process.FailError(types.DuplicatePositionCodeError, errors.New("岗位代码已存在"))
}
// 创建岗位
position := hr.PositionInstance()
position.PositionName = params.PositionName
position.PositionCode = params.PositionCode
position.Description = params.Description
position.Level = int16(params.Level)
position.CategoryID = int16(params.CategoryID)
position.CategoryName = params.CategoryName
position.IsManagement = params.IsManagement
position.Status = 1 // 默认启用
// 保存到数据库
r = dblib.DBIns.DB.Create(position)
if r.Error != nil {
return nil, process.FailError(types.CreatePositionError, r.Error)
}
return position, process.Success(200)
}
// QueryPositions 查询岗位列表
func QueryPositions(params QueryPositionsRequest) ([]*hr.PositionModel, *process.Process) {
result := make([]*hr.PositionModel, 0)
// 构建查询条件
db := dblib.DBIns.DB.Model(&hr.PositionModel{}).Where("(RecordStatus & 524288) = 0")
// 按岗位名称模糊查询
if params.PositionName != "" {
db = db.Where("PositionName LIKE ?", "%"+params.PositionName+"%")
}
// 按岗位代码精确查询
if params.PositionCode != "" {
db = db.Where("PositionCode = ?", params.PositionCode)
}
// 按岗位类别筛选
// if params.CategoryID > 0 {
// db = db.Where("CategoryID = ?", params.CategoryID)
// }
// 按岗位级别筛选
// if params.Level > 0 {
// db = db.Where("Level = ?", params.Level)
// }
// 按是否管理岗位筛选
if params.IsManagement {
db = db.Where("IsManagement = ?", params.IsManagement)
}
// 按状态筛选
// if params.Status >= 0 {
// db = db.Where("Status = ?", params.Status)
// }
// 分页查询
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.QueryPositionError, r.Error)
}
return result, process.Success(200)
}
// GetPositionByID 根据ID获取岗位
func GetPositionByID(positionGuid string) (*hr.PositionModel, *process.Process) {
// 验证岗位ID
guid, 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", guid).First(position)
if r.Error != nil {
return nil, process.FailError(types.PositionNotFoundError, r.Error)
}
return position, process.Success(200)
}
// UpdatePosition 更新岗位信息
func UpdatePosition(positionGuid string, params CreatePositionRequest) (*hr.PositionModel, *process.Process) {
// 获取岗位
position, proc := GetPositionByID(positionGuid)
if proc.IsError() {
return nil, proc
}
// 如果修改了岗位代码,验证是否与其他岗位冲突
if params.PositionCode != "" && params.PositionCode != position.PositionCode {
var count int64
r := dblib.DBIns.DB.Model(&hr.PositionModel{}).
Where("PositionCode = ? AND RecordGuid != ? AND (RecordStatus & 524288) = 0",
params.PositionCode, position.RecordGuid).Count(&count)
if r.Error != nil {
return nil, process.FailError(types.QueryPositionError, r.Error)
}
if count > 0 {
return nil, process.FailError(types.DuplicatePositionCodeError, errors.New("岗位代码已存在"))
}
position.PositionCode = params.PositionCode
}
// 更新岗位信息
if params.PositionName != "" {
position.PositionName = params.PositionName
}
if params.Description != "" {
position.Description = params.Description
}
if params.Level > 0 {
position.Level = int16(params.Level)
}
if params.CategoryID > 0 {
position.CategoryID = int16(params.CategoryID)
}
if params.CategoryName != "" {
position.CategoryName = params.CategoryName
}
position.IsManagement = params.IsManagement
// 保存更新
r := dblib.DBIns.DB.Save(position)
if r.Error != nil {
return nil, process.FailError(types.UpdatePositionError, r.Error)
}
return position, process.Success(200)
}
// ChangePositionStatus 更改岗位状态(启用/禁用)
func ChangePositionStatus(positionGuid string, status int) (*hr.PositionModel, *process.Process) {
// 获取岗位
position, proc := GetPositionByID(positionGuid)
if proc.IsError() {
return nil, proc
}
// 验证状态值
if status != 0 && status != 1 {
return nil, process.FailError(types.InvalidParamError, errors.New("无效的状态值必须为0或1"))
}
// 更新状态
position.Status = int16(status)
// 保存更新
r := dblib.DBIns.DB.Save(position)
if r.Error != nil {
return nil, process.FailError(types.UpdatePositionError, r.Error)
}
return position, process.Success(200)
}
// DeletePosition 删除岗位(逻辑删除)
func DeletePosition(positionGuid string) *process.Process {
// 获取岗位
position, proc := GetPositionByID(positionGuid)
if proc.IsError() {
return proc
}
// 检查岗位是否有关联的组织
var relationCount int64
r := dblib.DBIns.DB.Model(&hr.OrgPositionRelModel{}).
Where("PositionGuid = ? AND (RecordStatus & 524288) = 0", position.RecordGuid).Count(&relationCount)
if r.Error != nil {
return process.FailError(types.QueryPositionError, r.Error)
}
if relationCount > 0 {
return process.FailError(types.DeletePositionError, errors.New("该岗位已关联组织,不能删除"))
}
// 使用原生SQL执行删除操作设置删除标记
sql := "UPDATE " + hr.PositionTable + " SET RecordStatus = RecordStatus | 524288 WHERE RecordGuid = ?"
r = dblib.DBIns.DB.Exec(sql, position.RecordGuid)
if r.Error != nil {
return process.FailError(types.DeletePositionError, r.Error)
}
return process.Success(200)
}