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

289 lines
9.8 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"
"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)
}