253 lines
7.5 KiB
Go
253 lines
7.5 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"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 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)
|
|||
|
|
}
|