using Microsoft.Extensions.Logging; using Model.Entity.System; using ORM; using Service.Interface; using SqlSugar; namespace Service.Implement { /// /// 审计日志记录器实现:操作人/角色自动取自 ICurrentUser(JWT Claims),失败不抛出(审计不应阻断业务) /// public class AuditRecorder : IAuditRecorder { private readonly ICurrentUser _currentUser; private readonly ILogger _logger; public AuditRecorder(ICurrentUser currentUser, ILogger logger) { _currentUser = currentUser; _logger = logger; } public async Task RecordAsync(string operationType, string operationTarget, long targetId, long deviceId = 0, string? oldValue = null, string? newValue = null, string? ip = null, string? description = null) { try { var now = DateTime.Now; var roleId = _currentUser.RoleIds.FirstOrDefault(); var roleName = _currentUser.RoleNames.FirstOrDefault(); await SqlSugarContext.DbContext.Insertable(new AuditLogEntity { UserId = _currentUser.UserId, UserName = _currentUser.UserName, RoleId = roleId, RoleName = roleName ?? "", OperationType = operationType, OperationTarget = operationTarget, TargetId = targetId, DeviceId = deviceId, OldValue = oldValue, NewValue = newValue, Ip = ip, Description = description, OperateTime = now, CreateTime = now }).ExecuteCommandAsync(); } catch (Exception ex) { // 审计失败只记日志,不阻断业务 _logger.LogError(ex, "写审计日志失败({OperationType} {OperationTarget} {TargetId})", operationType, operationTarget, targetId); } } } }