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