WiiCITMS/process/hr/position.go
2025-11-07 14:14:34 +08:00

253 lines
7.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}