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

227 lines
7.7 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"
)
// PositionPermissionRequest 岗位权限分配请求
type PositionPermissionRequest struct {
PositionGuid string `json:"positionGuid"` // 岗位GUID
PermissionGuid string `json:"permissionGuid"` // 权限GUID
GrantType int `json:"grantType"` // 授权类型0-直接授权1-继承授权
}
// CheckPermissionRequest 权限检查请求
type CheckPermissionRequest struct {
StaffGuid string `json:"staffGuid"` // 员工GUID
PermissionID int `json:"permissionId"` // 权限ID
OrganizationGuid string `json:"organizationGuid"` // 相关组织GUID可选
}
// AssignPermissionToPosition 为岗位分配权限
func AssignPermissionToPosition(params PositionPermissionRequest) (*hr.PositionPermissionModel, *process.Process) {
// 验证岗位是否存在
positionGuid, err := unique.FromString(params.PositionGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
position := &hr.PositionModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", positionGuid).First(position)
if r.Error != nil {
return nil, process.FailError(types.PositionNotFoundError, r.Error)
}
// 验证权限是否存在
permissionGuid, err := unique.FromString(params.PermissionGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
permission := &hr.PermissionModel{}
r = dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", permissionGuid).First(permission)
if r.Error != nil {
return nil, process.FailError(types.PermissionNotFoundError, r.Error)
}
// 检查是否已存在相同的岗位权限关系
var count int64
r = dblib.DBIns.DB.Model(&hr.PositionPermissionModel{}).
Where("PositionGuid = ? AND PermissionGuid = ? AND (RecordStatus & 524288) = 0",
positionGuid, permissionGuid).Count(&count)
if r.Error != nil {
return nil, process.FailError(types.QueryPermissionError, r.Error)
}
if count > 0 {
return nil, process.FailError(types.DuplicatePermissionError, errors.New("该岗位已拥有此权限"))
}
// 创建岗位权限关系
relation := hr.PositionPermissionInstance()
relation.PositionGuid = positionGuid
relation.PermissionGuid = permissionGuid
relation.PositionID = position.PositionID
relation.PermissionID = permission.PermissionID
relation.GrantType = int16(params.GrantType)
// 保存到数据库
r = dblib.DBIns.DB.Create(relation)
if r.Error != nil {
return nil, process.FailError(types.CreatePermissionError, r.Error)
}
return relation, process.Success(200)
}
// RemovePermissionFromPosition 从岗位中移除权限
func RemovePermissionFromPosition(relationGuid string) *process.Process {
// 验证关系ID
guid, err := unique.FromString(relationGuid)
if err != nil {
return process.FailError(types.InvalidParamError, err)
}
// 查询岗位权限关系
relation := &hr.PositionPermissionModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", guid).First(relation)
if r.Error != nil {
return process.FailError(types.PositionPermNotFoundError, r.Error)
}
// 使用原生SQL执行删除操作设置删除标记
sql := "UPDATE " + hr.PositionPermissionTable + " SET RecordStatus = RecordStatus | 524288 WHERE RecordGuid = ?"
r = dblib.DBIns.DB.Exec(sql, guid)
if r.Error != nil {
return process.FailError(types.DeletePermissionError, r.Error)
}
return process.Success(200)
}
// QueryPositionPermissions 查询岗位的权限列表
func QueryPositionPermissions(positionGuid string) ([]*hr.PermissionModel, *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)
}
// 查询岗位权限
result := make([]*hr.PermissionModel, 0)
r = dblib.DBIns.DB.Table(hr.PermissionTable+" p").
Select("p.*").
Joins("JOIN "+hr.PositionPermissionTable+" pp ON p.RecordGuid = pp.PermissionGuid").
Where("pp.PositionGuid = ? AND (p.RecordStatus & 524288) = 0 AND (pp.RecordStatus & 524288) = 0", guid).
Find(&result)
if r.Error != nil {
return nil, process.FailError(types.QueryPermissionError, r.Error)
}
return result, process.Success(200)
}
// HasPermission 检查岗位是否拥有特定权限
func HasPermission(positionGuid string, permissionID int) (bool, *process.Process) {
// 验证岗位ID
guid, err := unique.FromString(positionGuid)
if err != nil {
return false, process.FailError(types.InvalidParamError, err)
}
// 查询岗位是否拥有指定权限
var count int64
r := dblib.DBIns.DB.Model(&hr.PositionPermissionModel{}).
Where("PositionGuid = ? AND PermissionID = ? AND (RecordStatus & 524288) = 0", guid, permissionID).
Count(&count)
if r.Error != nil {
return false, process.FailError(types.QueryPermissionError, r.Error)
}
// 如果找到记录,则表示有权限
return count > 0, process.Success(200)
}
// CheckStaffPermission 检查员工是否拥有特定权限
// 该方法会检查员工在指定组织下的岗位是否拥有相关权限
func CheckStaffPermission(params CheckPermissionRequest) (bool, *process.Process) {
// 验证员工ID
staffGuid, err := unique.FromString(params.StaffGuid)
if err != nil {
return false, process.FailError(types.InvalidParamError, err)
}
// 构建查询条件
query := dblib.DBIns.DB.Table(hr.PositionPermissionTable+" pp").
Joins("JOIN "+hr.Staff2OrganizationTable+" so ON pp.PositionGuid = so.PositionGuid").
Where("so.ObjectGuid = ? AND pp.PermissionID = ? AND (pp.RecordStatus & 524288) = 0 AND (so.RecordStatus & 524288) = 0", staffGuid, params.PermissionID)
// 如果指定了组织,则限定在该组织范围内
if params.OrganizationGuid != "" {
orgGuid, err := unique.FromString(params.OrganizationGuid)
if err != nil {
return false, process.FailError(types.InvalidParamError, err)
}
query = query.Where("so.TargetGuid = ?", orgGuid)
}
// 执行查询
var count int64
r := query.Count(&count)
if r.Error != nil {
return false, process.FailError(types.QueryPermissionError, r.Error)
}
// 如果找到记录,则表示有权限
return count > 0, process.Success(200)
}
// GetPermissionsByStaff 获取员工的所有权限
func GetPermissionsByStaff(staffGuid string) ([]*hr.PermissionModel, *process.Process) {
// 验证员工ID
guid, err := unique.FromString(staffGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询员工的所有权限
result := make([]*hr.PermissionModel, 0)
r := dblib.DBIns.DB.Table(hr.PermissionTable+" p").
Select("DISTINCT p.*").
Joins("JOIN "+hr.PositionPermissionTable+" pp ON p.RecordGuid = pp.PermissionGuid").
Joins("JOIN "+hr.Staff2OrganizationTable+" so ON pp.PositionGuid = so.PositionGuid").
Where("so.ObjectGuid = ? AND (p.RecordStatus & 524288) = 0 AND (pp.RecordStatus & 524288) = 0 AND (so.RecordStatus & 524288) = 0", guid).
Find(&result)
if r.Error != nil {
return nil, process.FailError(types.QueryPermissionError, r.Error)
}
return result, process.Success(200)
}
// IsSystemAdmin 检查员工是否是系统管理员
func IsSystemAdmin(staffGuid string) (bool, *process.Process) {
// 系统管理员权限特殊处理
params := CheckPermissionRequest{
StaffGuid: staffGuid,
PermissionID: hr.PermSystemAdmin,
}
return CheckStaffPermission(params)
}