WiiCITMS/process/hr/permission.go

289 lines
9.8 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"
"fmt"
)
// 权限管理请求参数
type CreatePermissionRequest struct {
PermissionID int `json:"permissionId"` // 权限ID
PermissionName string `json:"permissionName"` // 权限名称
PermissionCode string `json:"permissionCode"` // 权限代码
Description string `json:"description"` // 权限描述
Category int `json:"category"` // 权限分类
}
type QueryPermissionRequest struct {
PermissionName string `json:"permissionName"` // 权限名称,模糊查询
PermissionCode string `json:"permissionCode"` // 权限代码,精确查询
Category int `json:"category"` // 权限分类
Limit int `json:"limit"` // 分页参数,每页数量
Offset int `json:"offset"` // 分页参数,偏移量
}
// CreatePermission 创建权限
func CreatePermission(params CreatePermissionRequest) (*hr.PermissionModel, *process.Process) {
// 验证权限ID是否已存在
var count int64
r := dblib.DBIns.DB.Model(&hr.PermissionModel{}).Where("PermissionID = ? AND (RecordStatus & 524288) = 0", params.PermissionID).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("权限ID已存在"))
}
// 验证权限代码是否已存在
r = dblib.DBIns.DB.Model(&hr.PermissionModel{}).Where("PermissionCode = ? AND (RecordStatus & 524288) = 0", params.PermissionCode).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("权限代码已存在"))
}
// 创建权限
permission := hr.PermissionInstance()
permission.PermissionID = params.PermissionID
permission.PermissionName = params.PermissionName
permission.PermissionCode = params.PermissionCode
permission.Description = params.Description
permission.Category = int16(params.Category)
// 保存到数据库
r = dblib.DBIns.DB.Create(permission)
if r.Error != nil {
return nil, process.FailError(types.CreatePermissionError, r.Error)
}
return permission, process.Success(200)
}
// UpdatePermission 更新权限信息
func UpdatePermission(permissionGuid string, params CreatePermissionRequest) (*hr.PermissionModel, *process.Process) {
// 获取权限
permission, proc := GetPermissionByID(permissionGuid)
if proc.IsError() {
return nil, proc
}
// 如果修改了权限ID验证是否已存在
if params.PermissionID > 0 && params.PermissionID != permission.PermissionID {
var count int64
r := dblib.DBIns.DB.Model(&hr.PermissionModel{}).Where("PermissionID = ? AND RecordGuid != ? AND (RecordStatus & 524288) = 0", params.PermissionID, permission.RecordGuid).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("权限ID已存在"))
}
permission.PermissionID = params.PermissionID
}
// 如果修改了权限代码,验证是否已存在
if params.PermissionCode != "" && params.PermissionCode != permission.PermissionCode {
var count int64
r := dblib.DBIns.DB.Model(&hr.PermissionModel{}).Where("PermissionCode = ? AND RecordGuid != ? AND (RecordStatus & 524288) = 0", params.PermissionCode, permission.RecordGuid).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("权限代码已存在"))
}
permission.PermissionCode = params.PermissionCode
}
// 更新其他字段
if params.PermissionName != "" {
permission.PermissionName = params.PermissionName
}
if params.Description != "" {
permission.Description = params.Description
}
if params.Category > 0 {
permission.Category = int16(params.Category)
}
// 保存更新
r := dblib.DBIns.DB.Save(permission)
if r.Error != nil {
return nil, process.FailError(types.UpdatePermissionError, r.Error)
}
return permission, process.Success(200)
}
// GetPermissionByID 根据ID获取权限
func GetPermissionByID(permissionGuid string) (*hr.PermissionModel, *process.Process) {
// 验证权限ID
guid, err := unique.FromString(permissionGuid)
if err != nil {
return nil, process.FailError(types.InvalidParamError, err)
}
// 查询权限
permission := &hr.PermissionModel{}
r := dblib.DBIns.DB.Where("RecordGuid = ? AND (RecordStatus & 524288) = 0", guid).First(permission)
if r.Error != nil {
return nil, process.FailError(types.PermissionNotFoundError, r.Error)
}
return permission, process.Success(200)
}
// GetPermissionByCode 根据代码获取权限
func GetPermissionByCode(permissionCode string) (*hr.PermissionModel, *process.Process) {
// 查询权限
permission := &hr.PermissionModel{}
r := dblib.DBIns.DB.Where("PermissionCode = ? AND (RecordStatus & 524288) = 0", permissionCode).First(permission)
if r.Error != nil {
return nil, process.FailError(types.PermissionNotFoundError, r.Error)
}
return permission, process.Success(200)
}
// QueryPermissions 查询权限列表
func QueryPermissions(params QueryPermissionRequest) ([]*hr.PermissionModel, *process.Process) {
result := make([]*hr.PermissionModel, 0)
// 构建查询条件
db := dblib.DBIns.DB.Model(&hr.PermissionModel{}).Where("(RecordStatus & 524288) = 0")
// 按权限名称模糊查询
if params.PermissionName != "" {
db = db.Where("PermissionName LIKE ?", "%"+params.PermissionName+"%")
}
// 按权限代码精确查询
if params.PermissionCode != "" {
db = db.Where("PermissionCode = ?", params.PermissionCode)
}
// 按权限分类筛选
if params.Category > 0 {
db = db.Where("Category = ?", params.Category)
}
// 分页查询
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.QueryPermissionError, r.Error)
}
return result, process.Success(200)
}
// DeletePermission 删除权限(逻辑删除)
func DeletePermission(permissionGuid string) *process.Process {
// 获取权限
permission, proc := GetPermissionByID(permissionGuid)
if proc.IsError() {
return proc
}
// 检查是否有岗位关联该权限
var relationCount int64
r := dblib.DBIns.DB.Model(&hr.PositionPermissionModel{}).Where("PermissionGuid = ? AND (RecordStatus & 524288) = 0", permission.RecordGuid).Count(&relationCount)
if r.Error != nil {
return process.FailError(types.QueryPermissionError, r.Error)
}
if relationCount > 0 {
return process.FailError(types.DeletePermissionError, errors.New("该权限已被岗位引用,不能删除"))
}
// 使用原生SQL执行删除操作设置删除标记
sql := "UPDATE " + hr.PermissionTable + " SET RecordStatus = RecordStatus | 524288 WHERE RecordGuid = ?"
r = dblib.DBIns.DB.Exec(sql, permission.RecordGuid)
if r.Error != nil {
return process.FailError(types.DeletePermissionError, r.Error)
}
return process.Success(200)
}
// InitSystemPermissions 初始化系统权限
func InitSystemPermissions() *process.Process {
// 系统预定义权限列表
permissionList := []struct {
ID int
Name string
Code string
Desc string
Category int
}{
{hr.PermOrganizationView, "组织查看", "org:view", "允许查看组织信息", 1},
{hr.PermOrganizationCreate, "组织创建", "org:create", "允许创建新组织", 1},
{hr.PermOrganizationUpdate, "组织更新", "org:update", "允许更新组织信息", 1},
{hr.PermOrganizationDelete, "组织删除", "org:delete", "允许删除组织", 1},
{hr.PermPositionView, "岗位查看", "position:view", "允许查看岗位信息", 2},
{hr.PermPositionCreate, "岗位创建", "position:create", "允许创建新岗位", 2},
{hr.PermPositionUpdate, "岗位更新", "position:update", "允许更新岗位信息", 2},
{hr.PermPositionDelete, "岗位删除", "position:delete", "允许删除岗位", 2},
{hr.PermStaffView, "人员查看", "staff:view", "允许查看人员信息", 3},
{hr.PermStaffCreate, "人员创建", "staff:create", "允许创建新人员", 3},
{hr.PermStaffUpdate, "人员更新", "staff:update", "允许更新人员信息", 3},
{hr.PermStaffDelete, "人员删除", "staff:delete", "允许删除人员", 3},
{hr.PermLeaveApprove, "请假审批", "leave:approve", "允许审批请假申请", 4},
{hr.PermLeaveView, "请假查看", "leave:view", "允许查看请假记录", 4},
{hr.PermWorkflowAdmin, "工作流管理", "workflow:admin", "允许管理工作流程", 5},
{hr.PermSystemAdmin, "系统管理", "system:admin", "系统管理员权限", 9},
}
for _, perm := range permissionList {
// 检查权限是否已存在
var count int64
r := dblib.DBIns.DB.Model(&hr.PermissionModel{}).Where("PermissionID = ? OR PermissionCode = ?", perm.ID, perm.Code).Count(&count)
if r.Error != nil {
return process.FailError(types.QueryPermissionError, r.Error)
}
// 如果不存在,则创建
if count == 0 {
permission := hr.PermissionInstance()
permission.PermissionID = perm.ID
permission.PermissionName = perm.Name
permission.PermissionCode = perm.Code
permission.Description = perm.Desc
permission.Category = int16(perm.Category)
r = dblib.DBIns.DB.Create(permission)
if r.Error != nil {
return process.FailError(types.CreatePermissionError, fmt.Errorf("创建权限[%s]失败: %w", perm.Code, r.Error))
}
}
}
return process.Success(200)
}