394 lines
15 KiB
C#
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);
|
|
}
|
|
}
|