Files
SecMPS/api_sqlsugar/VolPro.Core/Log/ActionChangeChannel.cs
T
2026-05-15 23:22:48 +08:00

125 lines
5.2 KiB
C#

using Microsoft.AspNetCore.SignalR;
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Channels;
using System.Threading.Tasks;
using VolPro.Core.DbSqlSugar;
using VolPro.Core.EFDbContext;
using VolPro.Core.Extensions;
using VolPro.Core.ManageUser;
using VolPro.Core.Services;
using VolPro.Core.SignalR;
using VolPro.Core.WeChat;
using VolPro.Entity.DomainModels;
using Logger = VolPro.Core.Services.Logger;
namespace VolPro.Core.Log
{
public class ActionChangeChannel
{
private bool IsStarted = false;
private readonly Channel<ActionChangeQueue> _actionChannel = Channel.CreateUnbounded<ActionChangeQueue>();
public async Task Run()
{
Console.WriteLine("审计日志服务已启动");
IsStarted = true;
try
{
while (await _actionChannel.Reader.WaitToReadAsync())
{
if (_actionChannel.Reader.TryRead(out ActionChangeQueue channelData))
{
var list = channelData.Datas.Select(s => new Sys_ActionLog()
{
ActionLogId = Guid.NewGuid(),
TableName = channelData.TableName,
TableCNName = channelData.TableCNName,
OriginalData = s.OriginalData.Serialize(),
ChangedData = s.ChangedData.Serialize(),
DbServiceId = channelData.DbServiceId,
TenancyId = channelData.DbServiceId?.ToString(),
RequestParameter = channelData.RequestParameter,
OperationType = channelData.ActionChangeType.ToString(),
CreateID = channelData.CreateID,
CreateDate = channelData.CreateDate,
Creator = channelData.Creator
}).ToList();
DbManger.SysDbContext.Insertable<Sys_ActionLog>(list).ExecuteCommand();
}
}
}
catch (Exception ex)
{
IsStarted = false;
string messg = $"日志审计队列异常:{ex.Message},{ex?.StackTrace}";
Logger.AddAsync(messg);
}
}
public void Write<T>(ActionChangeType changeType, T originalData, T changedData,string requestParameter=null) where T : class
{
if (!CheckIsStarted()) return;
_actionChannel.Writer.TryWrite(GetQueueData<T>(changeType, originalData, changedData,requestParameter));
}
public async Task WriteAsync<T>(ActionChangeType changeType, T originalData, T changedData, string requestParameter = null) where T : class
{
if (!CheckIsStarted()) return;
await _actionChannel.Writer.WriteAsync(GetQueueData<T>(changeType, originalData, changedData,requestParameter));
}
public void WriteRange<T>(ActionChangeType changeType, List<T> originalData, string requestParameter = null) where T : class
{
if (!CheckIsStarted()) return;
var userInfo = UserContext.Current.UserInfo;
var data = new ActionChangeQueue()
{
ActionChangeType = changeType,
TableName = typeof(T).GetEntityTableName(),
TableCNName = typeof(T).GetEntityTableCnName(),
CreateID = userInfo.User_Id,
CreateDate = DateTime.Now,
Creator = userInfo.UserTrueName,
DbServiceId = UserContext.CurrentServiceId,
RequestParameter=requestParameter,
Datas = originalData.Select(s => new ActionChangeData()
{
OriginalData = s
}).ToList()
};
_actionChannel.Writer.TryWrite(data);
}
private ActionChangeQueue GetQueueData<T>(ActionChangeType changeType, object originalData, object changedData = null, string requestParameter = null) where T : class
{
var userInfo = UserContext.Current.UserInfo;
return new ActionChangeQueue()
{
ActionChangeType = changeType,
TableName = typeof(T).GetEntityTableName(),
TableCNName = typeof(T).GetEntityTableCnName(),
CreateID = userInfo.User_Id,
CreateDate = DateTime.Now,
Creator = userInfo.UserTrueName,
RequestParameter = requestParameter,
DbServiceId = UserContext.CurrentServiceId,
Datas = new List<ActionChangeData>()
{
new(){
OriginalData= originalData,
ChangedData= changedData
}
}
};
}
private bool CheckIsStarted()
{
if (!IsStarted)
{
Console.WriteLine("审计日志服务未启动,请按更新文档在Program.cs或Startup.cs中开启");
return false;
}
return true;
}
}
}