Files
OrpaonVision/OrpaonVision.ConfigApp/Infrastructure/Services/RoleService.cs
2026-04-06 22:04:05 +08:00

394 lines
15 KiB
C#

using Microsoft.Extensions.Logging;
using OrpaonVision.Core.Results;
using OrpaonVision.Model.Security;
using OrpaonVision.ConfigApp.Infrastructure.Services;
namespace OrpaonVision.ConfigApp.Infrastructure.Services;
/// <summary>
/// 角色管理服务实现。
/// </summary>
public sealed class RoleService : IRoleService
{
private readonly ILogger<RoleService> _logger;
private readonly List<RoleModel> _roles;
/// <summary>
/// 构造函数。
/// </summary>
public RoleService(ILogger<RoleService> logger)
{
_logger = logger;
_roles = new List<RoleModel>();
InitializeSampleData();
}
/// <inheritdoc />
public Result<RoleModel> CreateRole(RoleModel role)
{
try
{
if (role == null)
{
return Result<RoleModel>.Fail("ROLE_NULL", "角色不能为空。");
}
if (string.IsNullOrWhiteSpace(role.Name))
{
return Result<RoleModel>.Fail("ROLE_NAME_REQUIRED", "角色名称不能为空。");
}
// 检查角色名称是否已存在
if (_roles.Any(r => r.Name.Equals(role.Name, StringComparison.OrdinalIgnoreCase)))
{
return Result<RoleModel>.Fail("ROLE_NAME_EXISTS", "角色名称已存在。");
}
_logger.LogInformation("正在创建角色: {RoleName}", role.Name);
role.Id = Guid.NewGuid();
role.Status = RoleStatus.Enabled;
role.SortOrder = _roles.Count + 1;
role.CreatedAtUtc = DateTime.UtcNow;
role.UpdatedAtUtc = DateTime.UtcNow;
_roles.Add(role);
_logger.LogInformation("角色创建成功: {RoleId} - {RoleName}", role.Id, role.Name);
return Result<RoleModel>.Success(role, message: "角色创建成功。");
}
catch (Exception ex)
{
var traceId = Guid.NewGuid().ToString("N");
_logger.LogError(ex, "创建角色失败。TraceId: {TraceId}", traceId);
var result = Result.FromException(ex, "CREATE_ROLE_FAILED", "创建角色失败。", traceId);
return Result<RoleModel>.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray());
}
}
/// <inheritdoc />
public Result<RoleModel> UpdateRole(RoleModel role)
{
try
{
if (role == null)
{
return Result<RoleModel>.Fail("ROLE_NULL", "角色不能为空。");
}
var existingRole = _roles.FirstOrDefault(r => r.Id == role.Id);
if (existingRole == null)
{
return Result<RoleModel>.Fail("ROLE_NOT_FOUND", $"未找到ID为 {role.Id} 的角色。");
}
_logger.LogInformation("正在更新角色: {RoleId} - {RoleName}", role.Id, role.Name);
existingRole.Name = role.Name;
existingRole.DisplayName = role.DisplayName;
existingRole.Description = role.Description;
existingRole.SortOrder = role.SortOrder;
existingRole.Remark = role.Remark;
existingRole.UpdatedAtUtc = DateTime.UtcNow;
existingRole.UpdatedBy = role.UpdatedBy;
_logger.LogInformation("角色更新成功: {RoleId} - {RoleName}", role.Id, role.Name);
return Result<RoleModel>.Success(existingRole, message: "角色更新成功。");
}
catch (Exception ex)
{
var traceId = Guid.NewGuid().ToString("N");
_logger.LogError(ex, "更新角色失败。TraceId: {TraceId}", traceId);
var result = Result.FromException(ex, "UPDATE_ROLE_FAILED", "更新角色失败。", traceId);
return Result<RoleModel>.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray());
}
}
/// <inheritdoc />
public Result DeleteRole(Guid roleId)
{
try
{
var role = _roles.FirstOrDefault(r => r.Id == roleId);
if (role == null)
{
return Result.Fail("ROLE_NOT_FOUND", $"未找到ID为 {roleId} 的角色。");
}
if (role.IsSystemRole)
{
return Result.Fail("CANNOT_DELETE_SYSTEM_ROLE", "不能删除系统角色。");
}
_logger.LogInformation("正在删除角色: {RoleId} - {RoleName}", role.Id, role.Name);
_roles.Remove(role);
_logger.LogInformation("角色删除成功: {RoleId} - {RoleName}", role.Id, role.Name);
return Result.Success(message: "角色删除成功。");
}
catch (Exception ex)
{
var traceId = Guid.NewGuid().ToString("N");
_logger.LogError(ex, "删除角色失败。TraceId: {TraceId}", traceId);
var result = Result.FromException(ex, "DELETE_ROLE_FAILED", "删除角色失败。", traceId);
return Result.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray());
}
}
/// <inheritdoc />
public Result<RoleModel> GetRoleById(Guid roleId)
{
try
{
var role = _roles.FirstOrDefault(r => r.Id == roleId);
if (role == null)
{
return Result<RoleModel>.Fail("ROLE_NOT_FOUND", $"未找到ID为 {roleId} 的角色。");
}
return Result<RoleModel>.Success(role, message: "获取角色成功。");
}
catch (Exception ex)
{
var traceId = Guid.NewGuid().ToString("N");
_logger.LogError(ex, "获取角色失败。TraceId: {TraceId}", traceId);
var result = Result.FromException(ex, "GET_ROLE_FAILED", "获取角色失败。", traceId);
return Result<RoleModel>.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray());
}
}
/// <inheritdoc />
public Result<PagedResult<RoleModel>> GetRolePagedList(int pageIndex = 1, int pageSize = 20, RoleStatus? status = null, string? keyword = null)
{
try
{
var query = _roles.AsQueryable();
// 状态过滤
if (status.HasValue)
{
query = query.Where(r => r.Status == status.Value);
}
// 关键词搜索
if (!string.IsNullOrWhiteSpace(keyword))
{
query = query.Where(r =>
r.Name.Contains(keyword, StringComparison.OrdinalIgnoreCase) ||
r.DisplayName.Contains(keyword, StringComparison.OrdinalIgnoreCase));
}
// 排序
query = query.OrderBy(r => r.SortOrder).ThenBy(r => r.Name);
var totalCount = query.Count();
var items = query.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
var pagedResult = PagedResult<RoleModel>.Success(items, totalCount, pageIndex, pageSize);
return Result<PagedResult<RoleModel>>.Success(pagedResult, message: "获取角色列表成功。");
}
catch (Exception ex)
{
var traceId = Guid.NewGuid().ToString("N");
_logger.LogError(ex, "获取角色列表失败。TraceId: {TraceId}", traceId);
var result = Result.FromException(ex, "GET_ROLE_LIST_FAILED", "获取角色列表失败。", traceId);
return Result<PagedResult<RoleModel>>.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray());
}
}
/// <inheritdoc />
public Result EnableRole(Guid roleId, string enabledBy)
{
try
{
var role = _roles.FirstOrDefault(r => r.Id == roleId);
if (role == null)
{
return Result.Fail("ROLE_NOT_FOUND", $"未找到ID为 {roleId} 的角色。");
}
_logger.LogInformation("正在启用角色: {RoleId} - {RoleName}", role.Id, role.Name);
role.Status = RoleStatus.Enabled;
role.UpdatedAtUtc = DateTime.UtcNow;
role.UpdatedBy = enabledBy;
_logger.LogInformation("角色启用成功: {RoleId} - {RoleName}", role.Id, role.Name);
return Result.Success(message: "角色启用成功。");
}
catch (Exception ex)
{
var traceId = Guid.NewGuid().ToString("N");
_logger.LogError(ex, "启用角色失败。TraceId: {TraceId}", traceId);
var result = Result.FromException(ex, "ENABLE_ROLE_FAILED", "启用角色失败。", traceId);
return Result.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray());
}
}
/// <inheritdoc />
public Result DisableRole(Guid roleId, string disabledBy)
{
try
{
var role = _roles.FirstOrDefault(r => r.Id == roleId);
if (role == null)
{
return Result.Fail("ROLE_NOT_FOUND", $"未找到ID为 {roleId} 的角色。");
}
if (role.IsSystemRole)
{
return Result.Fail("CANNOT_DISABLE_SYSTEM_ROLE", "不能禁用系统角色。");
}
_logger.LogInformation("正在禁用角色: {RoleId} - {RoleName}", role.Id, role.Name);
role.Status = RoleStatus.Disabled;
role.UpdatedAtUtc = DateTime.UtcNow;
role.UpdatedBy = disabledBy;
_logger.LogInformation("角色禁用成功: {RoleId} - {RoleName}", role.Id, role.Name);
return Result.Success(message: "角色禁用成功。");
}
catch (Exception ex)
{
var traceId = Guid.NewGuid().ToString("N");
_logger.LogError(ex, "禁用角色失败。TraceId: {TraceId}", traceId);
var result = Result.FromException(ex, "DISABLE_ROLE_FAILED", "禁用角色失败。", traceId);
return Result.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray());
}
}
/// <inheritdoc />
public Result<List<RoleModel>> GetEnabledRoles()
{
try
{
var enabledRoles = _roles.Where(r => r.Status == RoleStatus.Enabled).OrderBy(r => r.SortOrder).ToList();
return Result<List<RoleModel>>.Success(enabledRoles, message: "获取启用角色列表成功。");
}
catch (Exception ex)
{
var traceId = Guid.NewGuid().ToString("N");
_logger.LogError(ex, "获取启用角色列表失败。TraceId: {TraceId}", traceId);
var result = Result.FromException(ex, "GET_ENABLED_ROLES_FAILED", "获取启用角色列表失败。", traceId);
return Result<List<RoleModel>>.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray());
}
}
/// <inheritdoc />
public Result<bool> CheckRoleNameExists(string name, Guid? excludeRoleId = null)
{
try
{
if (string.IsNullOrWhiteSpace(name))
{
return Result<bool>.Fail("ROLE_NAME_REQUIRED", "角色名称不能为空。");
}
var query = _roles.Where(r => r.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
if (excludeRoleId.HasValue)
{
query = query.Where(r => r.Id != excludeRoleId.Value);
}
var exists = query.Any();
return Result<bool>.Success(exists, message: exists ? "角色名称已存在" : "角色名称可用");
}
catch (Exception ex)
{
var traceId = Guid.NewGuid().ToString("N");
_logger.LogError(ex, "检查角色名称是否存在失败。TraceId: {TraceId}", traceId);
var result = Result.FromException(ex, "CHECK_ROLE_NAME_EXISTS_FAILED", "检查角色名称是否存在失败。", traceId);
return Result<bool>.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray());
}
}
/// <summary>
/// 初始化示例数据。
/// </summary>
private void InitializeSampleData()
{
var sampleRoles = new List<RoleModel>
{
new RoleModel
{
Id = Guid.NewGuid(),
Name = "SuperAdmin",
DisplayName = "超级管理员",
Description = "系统超级管理员,拥有所有权限",
Status = RoleStatus.Enabled,
IsSystemRole = true,
SortOrder = 1,
CreatedAtUtc = DateTime.UtcNow.AddDays(-30),
UpdatedAtUtc = DateTime.UtcNow.AddDays(-30),
CreatedBy = "System",
UpdatedBy = "System"
},
new RoleModel
{
Id = Guid.NewGuid(),
Name = "Admin",
DisplayName = "管理员",
Description = "系统管理员,拥有大部分管理权限",
Status = RoleStatus.Enabled,
IsSystemRole = true,
SortOrder = 2,
CreatedAtUtc = DateTime.UtcNow.AddDays(-30),
UpdatedAtUtc = DateTime.UtcNow.AddDays(-30),
CreatedBy = "System",
UpdatedBy = "System"
},
new RoleModel
{
Id = Guid.NewGuid(),
Name = "Operator",
DisplayName = "操作员",
Description = "现场操作员,负责日常操作",
Status = RoleStatus.Enabled,
IsSystemRole = true,
SortOrder = 3,
CreatedAtUtc = DateTime.UtcNow.AddDays(-30),
UpdatedAtUtc = DateTime.UtcNow.AddDays(-30),
CreatedBy = "System",
UpdatedBy = "System"
},
new RoleModel
{
Id = Guid.NewGuid(),
Name = "Engineer",
DisplayName = "工程师",
Description = "系统工程师,负责配置和维护",
Status = RoleStatus.Enabled,
IsSystemRole = true,
SortOrder = 4,
CreatedAtUtc = DateTime.UtcNow.AddDays(-30),
UpdatedAtUtc = DateTime.UtcNow.AddDays(-30),
CreatedBy = "System",
UpdatedBy = "System"
},
new RoleModel
{
Id = Guid.NewGuid(),
Name = "Viewer",
DisplayName = "查看者",
Description = "只读权限,只能查看信息",
Status = RoleStatus.Enabled,
IsSystemRole = true,
SortOrder = 5,
CreatedAtUtc = DateTime.UtcNow.AddDays(-30),
UpdatedAtUtc = DateTime.UtcNow.AddDays(-30),
CreatedBy = "System",
UpdatedBy = "System"
}
};
_roles.AddRange(sampleRoles);
_logger.LogInformation("已初始化 {Count} 个示例角色", sampleRoles.Count);
}
}