125 lines
5.2 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|