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