using Microsoft.Extensions.Logging; using OrpaonVision.Core.Results; using OrpaonVision.Model.Security; using OrpaonVision.ConfigApp.Infrastructure.Services; namespace OrpaonVision.ConfigApp.Infrastructure.Services; /// /// 角色管理服务实现。 /// public sealed class RoleService : IRoleService { private readonly ILogger _logger; private readonly List _roles; /// /// 构造函数。 /// public RoleService(ILogger logger) { _logger = logger; _roles = new List(); InitializeSampleData(); } /// public Result CreateRole(RoleModel role) { try { if (role == null) { return Result.Fail("ROLE_NULL", "角色不能为空。"); } if (string.IsNullOrWhiteSpace(role.Name)) { return Result.Fail("ROLE_NAME_REQUIRED", "角色名称不能为空。"); } // 检查角色名称是否已存在 if (_roles.Any(r => r.Name.Equals(role.Name, StringComparison.OrdinalIgnoreCase))) { return Result.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.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.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray()); } } /// public Result UpdateRole(RoleModel role) { try { if (role == null) { return Result.Fail("ROLE_NULL", "角色不能为空。"); } var existingRole = _roles.FirstOrDefault(r => r.Id == role.Id); if (existingRole == null) { return Result.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.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.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray()); } } /// 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()); } } /// public Result GetRoleById(Guid roleId) { try { var role = _roles.FirstOrDefault(r => r.Id == roleId); if (role == null) { return Result.Fail("ROLE_NOT_FOUND", $"未找到ID为 {roleId} 的角色。"); } return Result.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.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray()); } } /// public Result> 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.Success(items, totalCount, pageIndex, pageSize); return Result>.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>.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray()); } } /// 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()); } } /// 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()); } } /// public Result> GetEnabledRoles() { try { var enabledRoles = _roles.Where(r => r.Status == RoleStatus.Enabled).OrderBy(r => r.SortOrder).ToList(); return Result>.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>.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray()); } } /// public Result CheckRoleNameExists(string name, Guid? excludeRoleId = null) { try { if (string.IsNullOrWhiteSpace(name)) { return Result.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.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.FailWithTrace(result.Code, result.Message, result.TraceId ?? traceId, result.Errors.ToArray()); } } /// /// 初始化示例数据。 /// private void InitializeSampleData() { var sampleRoles = new List { 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); } }