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

125 lines
5.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}