Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
commit
3c0199cebd
|
@ -151,9 +151,20 @@ builder.Services.AddMediator(cfg =>
|
||||||
cfg.AddConsumer<ConsistencyCheckConsumer>();
|
cfg.AddConsumer<ConsistencyCheckConsumer>();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 添加 MassTransit 和 InMemory 传输
|
||||||
builder.Services.AddMassTransit(cfg =>
|
builder.Services.AddMassTransit(cfg =>
|
||||||
{
|
{
|
||||||
cfg.UsingInMemory();
|
// 注册消费者
|
||||||
|
cfg.AddConsumer<AddSubjectTriggerConsumer>(); // 替换为你的消费者类
|
||||||
|
|
||||||
|
// 使用 InMemory 作为消息传递机制
|
||||||
|
cfg.UsingInMemory((context, cfg) =>
|
||||||
|
{
|
||||||
|
// 这里可以进行额外的配置
|
||||||
|
cfg.ConfigureEndpoints(context); // 自动配置所有消费者的端点
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@ namespace IRaCIS.Core.API
|
||||||
|
|
||||||
// 全局忽略 DomainEvents 属性
|
// 全局忽略 DomainEvents 属性
|
||||||
automapper.AddGlobalIgnore(nameof(Entity.DomainEvents));
|
automapper.AddGlobalIgnore(nameof(Entity.DomainEvents));
|
||||||
|
automapper.AddGlobalIgnore(nameof(Entity.DomainCommands));
|
||||||
|
|
||||||
#region 会使 IncludeMembers 失效 不能全局使用
|
#region 会使 IncludeMembers 失效 不能全局使用
|
||||||
//mapping an EntityFramework Core DbContext-object.
|
//mapping an EntityFramework Core DbContext-object.
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
|
||||||
|
|
||||||
|
using AutoMapper;
|
||||||
|
using IRaCIS.Core.Domain;
|
||||||
|
using MassTransit;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.Application.MassTransit.Consumer;
|
||||||
|
|
||||||
|
public class AddSubjectTriggerConsumer(IRepository<SubjectVisit> _subjectVisitRepository,
|
||||||
|
|
||||||
|
IRepository<VisitStage> _visitStageRepository,
|
||||||
|
IRepository<Trial> _trialRepository,
|
||||||
|
IMapper _mapper) : IConsumer<AddSubjectTriggerCommand>
|
||||||
|
{
|
||||||
|
public async Task Consume(ConsumeContext<AddSubjectTriggerCommand> context)
|
||||||
|
{
|
||||||
|
var addSubjectEvent= context.Message;
|
||||||
|
|
||||||
|
//添加受试者的时候,获取访视计划列表,添加到受试者访视表。
|
||||||
|
var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == addSubjectEvent.TrialId && t.IsConfirmed).ToListAsync();
|
||||||
|
|
||||||
|
var svList = _mapper.Map<List<SubjectVisit>>(visitPlanList);
|
||||||
|
|
||||||
|
var IsEnrollementQualificationConfirm = await _trialRepository.Where(t => t.Id == addSubjectEvent.TrialId).Select(u => u.IsEnrollementQualificationConfirm).FirstOrDefaultAsync();
|
||||||
|
|
||||||
|
svList.ForEach(t =>
|
||||||
|
{
|
||||||
|
t.SubjectId = addSubjectEvent.SubjectId;
|
||||||
|
t.TrialId = addSubjectEvent.TrialId;
|
||||||
|
t.TrialSiteId = addSubjectEvent.TrialSiteId;
|
||||||
|
t.IsEnrollmentConfirm = t.IsBaseLine ? IsEnrollementQualificationConfirm : false;
|
||||||
|
t.Id = NewId.NextGuid();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
await _subjectVisitRepository.AddRangeAsync(svList);
|
||||||
|
}
|
||||||
|
}
|
|
@ -117,7 +117,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
|
|
||||||
//要根据标准阅片顺序,确定是否查询单个任务的,还是查询所有的
|
//要根据标准阅片顺序,确定是否查询单个任务的,还是查询所有的
|
||||||
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
|
var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
|
||||||
.Select(t => new { t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
|
.Select(t => new { t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
|
||||||
|
|
||||||
var subjectCode = string.Empty;
|
var subjectCode = string.Empty;
|
||||||
var subjectId = inQuery.SubjectId;
|
var subjectId = inQuery.SubjectId;
|
||||||
|
@ -129,9 +129,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
throw new Exception("无序阅片,前端参数传递错误");
|
throw new Exception("无序阅片,前端参数传递错误");
|
||||||
}
|
}
|
||||||
//考虑到一致性分析,必须要这个编号进行过滤
|
//考虑到一致性分析,必须要这个编号进行过滤
|
||||||
var taskInfo = _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => new {
|
var taskInfo = _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => new
|
||||||
SubjectCode= t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
|
{
|
||||||
SubjectId= t.SubjectId,
|
SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
|
||||||
|
SubjectId = t.SubjectId,
|
||||||
}).FirstOrDefault();
|
}).FirstOrDefault();
|
||||||
subjectId = taskInfo.SubjectId;
|
subjectId = taskInfo.SubjectId;
|
||||||
subjectCode = taskInfo.SubjectCode;
|
subjectCode = taskInfo.SubjectCode;
|
||||||
|
@ -649,7 +650,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<List<TaskNoneDicomStudyDTO>> GetIRUploadTaskNoneDicomStudyList(IRUploadStudyQuery inQuery)
|
public async Task<List<TaskNoneDicomStudyDTO>> GetIRUploadTaskNoneDicomStudyList(IRUploadStudyQuery inQuery)
|
||||||
{
|
{
|
||||||
var subjectCode = string.Empty;
|
var subjectCode = inQuery.SubjectCode;
|
||||||
var subjectId = inQuery.SubjectId;
|
var subjectId = inQuery.SubjectId;
|
||||||
var doctorUserId = _userInfo.Id;
|
var doctorUserId = _userInfo.Id;
|
||||||
|
|
||||||
|
@ -658,7 +659,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
//考虑到一致性分析,必须要这个编号进行过滤
|
//考虑到一致性分析,必须要这个编号进行过滤
|
||||||
//医学审核查看下载按钮,这个时候需要知道医生
|
//医学审核查看下载按钮,这个时候需要知道医生
|
||||||
|
|
||||||
var taskInfo = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => new {
|
var taskInfo = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => new
|
||||||
|
{
|
||||||
SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
|
SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
|
||||||
SubjectId = t.SubjectId,
|
SubjectId = t.SubjectId,
|
||||||
t.DoctorUserId,
|
t.DoctorUserId,
|
||||||
|
@ -847,7 +849,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
{
|
{
|
||||||
throw new Exception("无序阅片,前端参数传递错误");
|
throw new Exception("无序阅片,前端参数传递错误");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -859,13 +861,14 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
//考虑到一致性分析,必须要这个编号进行过滤
|
//考虑到一致性分析,必须要这个编号进行过滤
|
||||||
subjectCode = inQuery.SubjectCode;
|
subjectCode = inQuery.SubjectCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inQuery.VisitTaskId != null)
|
if (inQuery.VisitTaskId != null)
|
||||||
{
|
{
|
||||||
//考虑到一致性分析,必须要这个编号进行过滤
|
//考虑到一致性分析,必须要这个编号进行过滤
|
||||||
//医学审核查看下载按钮,这个时候需要知道医生
|
//医学审核查看下载按钮,这个时候需要知道医生
|
||||||
|
|
||||||
var taskInfo = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => new {
|
var taskInfo = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => new
|
||||||
|
{
|
||||||
SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
|
SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
|
||||||
SubjectId = t.SubjectId,
|
SubjectId = t.SubjectId,
|
||||||
t.DoctorUserId,
|
t.DoctorUserId,
|
||||||
|
@ -1047,39 +1050,44 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public async Task<IResponseOutput> GetTaskUploadedDicomStudyList(IRTaskUploadedDicomStudyQuery inQuery)
|
public async Task<IResponseOutput> GetTaskUploadedDicomStudyList(IRTaskUploadedDicomStudyQuery inQuery)
|
||||||
{
|
{
|
||||||
var query = _taskStudyRepository.Where(t => t.VisitTaskId == inQuery.VisitTaskId).Select(t => new
|
var info = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
|
||||||
{
|
.Select(t => new { t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys }).FirstNotNullAsync();
|
||||||
StudyId = t.Id,
|
|
||||||
t.Modalities,
|
var query = _taskStudyRepository.Where(t => t.VisitTaskId == inQuery.VisitTaskId)
|
||||||
t.InstanceCount,
|
.Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
|
||||||
t.SeriesCount,
|
.Select(t => new
|
||||||
t.StudyCode,
|
|
||||||
SeriesList = t.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).Select(u => new
|
|
||||||
{
|
{
|
||||||
u.SeriesTime,
|
StudyId = t.Id,
|
||||||
u.InstanceCount,
|
t.Modalities,
|
||||||
u.ImageResizePath,
|
t.InstanceCount,
|
||||||
u.Modality,
|
t.SeriesCount,
|
||||||
u.Description,
|
t.StudyCode,
|
||||||
u.SeriesInstanceUid,
|
SeriesList = t.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).Select(u => new
|
||||||
u.SeriesNumber,
|
|
||||||
u.SliceThickness,
|
|
||||||
u.StudyInstanceUid,
|
|
||||||
|
|
||||||
IsExistMutiFrames = u.InstanceList.Any(t => t.NumberOfFrames > 1),
|
|
||||||
|
|
||||||
InstanceInfoList = u.InstanceList.OrderBy(t => t.InstanceNumber).Select(k =>
|
|
||||||
new InstanceBasicInfo()
|
|
||||||
{
|
{
|
||||||
Id = k.Id,
|
u.SeriesTime,
|
||||||
NumberOfFrames = k.NumberOfFrames,
|
u.InstanceCount,
|
||||||
HtmlPath = k.HtmlPath,
|
u.ImageResizePath,
|
||||||
Path = k.Path,
|
u.Modality,
|
||||||
InstanceNumber = k.InstanceNumber,
|
u.Description,
|
||||||
|
u.SeriesInstanceUid,
|
||||||
|
u.SeriesNumber,
|
||||||
|
u.SliceThickness,
|
||||||
|
u.StudyInstanceUid,
|
||||||
|
|
||||||
}).ToList()
|
IsExistMutiFrames = u.InstanceList.Any(t => t.NumberOfFrames > 1),
|
||||||
})
|
|
||||||
});
|
InstanceInfoList = u.InstanceList.OrderBy(t => t.InstanceNumber).Select(k =>
|
||||||
|
new InstanceBasicInfo()
|
||||||
|
{
|
||||||
|
Id = k.Id,
|
||||||
|
NumberOfFrames = k.NumberOfFrames,
|
||||||
|
HtmlPath = k.HtmlPath,
|
||||||
|
Path = k.Path,
|
||||||
|
InstanceNumber = k.InstanceNumber,
|
||||||
|
|
||||||
|
}).ToList()
|
||||||
|
})
|
||||||
|
});
|
||||||
var list = await query.ToListAsync();
|
var list = await query.ToListAsync();
|
||||||
|
|
||||||
return ResponseOutput.Ok(list);
|
return ResponseOutput.Ok(list);
|
||||||
|
|
|
@ -1,12 +1,27 @@
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Domain.BaseModel;
|
namespace IRaCIS.Core.Domain.BaseModel;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 事件 不影响数据库提交事务的,不会记录稽查
|
||||||
|
///
|
||||||
|
/// 比如 添加subject 自动添加访视,不适合作为事件,否则自动添加访视后,记录稽查,当前请求url 都不知道
|
||||||
|
/// </summary>
|
||||||
[Description("领域实体事件基类")]
|
[Description("领域实体事件基类")]
|
||||||
public abstract class DomainEvent
|
public abstract class DomainEvent
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 命令,触发一些操作,在当前事务一起提交
|
||||||
|
/// </summary>
|
||||||
|
[Description("领域实体命令基类")]
|
||||||
|
public abstract class DomainCommand
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public class FailedDomainEvent
|
public class FailedDomainEvent
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
|
|
|
@ -21,6 +21,7 @@ public abstract class Entity : IEntity<Guid>
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
|
|
||||||
#region 领域事件 仅仅允许通过提供的方法进行操作
|
#region 领域事件 仅仅允许通过提供的方法进行操作
|
||||||
|
|
||||||
[JsonIgnore]
|
[JsonIgnore]
|
||||||
private readonly List<DomainEvent> _domainEvents = [];
|
private readonly List<DomainEvent> _domainEvents = [];
|
||||||
|
|
||||||
|
@ -41,6 +42,32 @@ public abstract class Entity : IEntity<Guid>
|
||||||
{
|
{
|
||||||
_domainEvents.Clear();
|
_domainEvents.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 领域命令 当前事务一起处理的,触发操作
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
private readonly List<DomainCommand> _domainCommands = [];
|
||||||
|
|
||||||
|
[JsonIgnore]
|
||||||
|
[NotMapped]
|
||||||
|
public IReadOnlyCollection<DomainCommand> DomainCommands => _domainCommands.AsReadOnly();
|
||||||
|
public void AddDomainCommand(DomainCommand domainCommand)
|
||||||
|
{
|
||||||
|
_domainCommands.Add(domainCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveDomainCommand(DomainCommand domainCommand)
|
||||||
|
{
|
||||||
|
_domainCommands.Remove(domainCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearDomainCommands()
|
||||||
|
{
|
||||||
|
_domainCommands.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
#region 减少实体属性,增加基类
|
#region 减少实体属性,增加基类
|
||||||
|
|
|
@ -19,4 +19,8 @@
|
||||||
<PackageReference Include="EntityFrameworkCore.Projectables.Abstractions" Version="3.0.4" />
|
<PackageReference Include="EntityFrameworkCore.Projectables.Abstractions" Version="3.0.4" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="_DomainEvent\" />
|
||||||
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
|
||||||
|
using IRaCIS.Core.Domain.BaseModel;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.Domain;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 添加Subject 触发命令
|
||||||
|
/// </summary>
|
||||||
|
public class AddSubjectTriggerCommand : DomainCommand
|
||||||
|
{
|
||||||
|
public Guid SubjectId { get; set; }
|
||||||
|
public Guid TrialId { get; set; }
|
||||||
|
|
||||||
|
public Guid TrialSiteId { get; set; }
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
|
||||||
|
|
||||||
|
using IRaCIS.Core.Domain;
|
||||||
|
using IRaCIS.Core.Domain.Models;
|
||||||
|
using Microsoft.EntityFrameworkCore.ChangeTracking;
|
||||||
|
|
||||||
|
namespace IRaCIS.Core.Infra.EFCore;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static class DBContext_Ext
|
||||||
|
{
|
||||||
|
public static void AddDomainEvents(this DbContext context)
|
||||||
|
{
|
||||||
|
var changeTracker = context.ChangeTracker;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void AddDomainCommands(this DbContext context)
|
||||||
|
{
|
||||||
|
var changeTracker = context.ChangeTracker;
|
||||||
|
|
||||||
|
// 遍历 ChangeTracker 中的实体
|
||||||
|
foreach (var entry in changeTracker.Entries<Subject>())
|
||||||
|
{
|
||||||
|
var subject = entry.Entity;
|
||||||
|
|
||||||
|
if (entry.State == EntityState.Added)
|
||||||
|
{
|
||||||
|
// 受试者添加 触发访视自动添加
|
||||||
|
var addedEvent = new AddSubjectTriggerCommand { SubjectId = subject.Id, TrialId = subject.TrialId, TrialSiteId = subject.TrialSiteId };
|
||||||
|
|
||||||
|
subject.AddDomainCommand(addedEvent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -2,6 +2,8 @@
|
||||||
using IRaCIS.Core.Domain.Models;
|
using IRaCIS.Core.Domain.Models;
|
||||||
using IRaCIS.Core.Domain.Share;
|
using IRaCIS.Core.Domain.Share;
|
||||||
using IRaCIS.Core.Infra.EFCore.Common;
|
using IRaCIS.Core.Infra.EFCore.Common;
|
||||||
|
using MassTransit;
|
||||||
|
using MassTransit.Transports;
|
||||||
using Microsoft.EntityFrameworkCore.Diagnostics;
|
using Microsoft.EntityFrameworkCore.Diagnostics;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
|
@ -9,7 +11,10 @@ using System.Data;
|
||||||
|
|
||||||
namespace IRaCIS.Core.Infra.EFCore;
|
namespace IRaCIS.Core.Infra.EFCore;
|
||||||
|
|
||||||
public class AuditEntityInterceptor(IUserInfo _userInfo, ILogger<AuditEntityInterceptor> _logger) : SaveChangesInterceptor
|
public class AuditEntityInterceptor(IUserInfo _userInfo,
|
||||||
|
ILogger<AuditEntityInterceptor> _logger
|
||||||
|
//, IBus _bus
|
||||||
|
) : SaveChangesInterceptor
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -22,6 +27,14 @@ public class AuditEntityInterceptor(IUserInfo _userInfo, ILogger<AuditEntityInte
|
||||||
public override ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData,
|
public override ValueTask<InterceptionResult<int>> SavingChangesAsync(DbContextEventData eventData,
|
||||||
InterceptionResult<int> result, CancellationToken cancellationToken = default)
|
InterceptionResult<int> result, CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
//领域命令 (同一个事务提交的一些逻辑,类似Trigger 保存事务之前执行的一些逻辑)
|
||||||
|
eventData.Context.AddDomainCommands();
|
||||||
|
|
||||||
|
//DispatchDomainCommands(eventData.Context).GetAwaiter().GetResult();
|
||||||
|
|
||||||
|
//领域事件
|
||||||
|
eventData.Context.AddDomainEvents();
|
||||||
|
|
||||||
//审计时间
|
//审计时间
|
||||||
AuditEntities(eventData.Context);
|
AuditEntities(eventData.Context);
|
||||||
|
|
||||||
|
@ -32,8 +45,18 @@ public class AuditEntityInterceptor(IUserInfo _userInfo, ILogger<AuditEntityInte
|
||||||
}
|
}
|
||||||
public override InterceptionResult<int> SavingChanges(DbContextEventData eventData, InterceptionResult<int> result)
|
public override InterceptionResult<int> SavingChanges(DbContextEventData eventData, InterceptionResult<int> result)
|
||||||
{
|
{
|
||||||
|
//领域命令 (同一个事务提交的一些逻辑,类似Trigger 保存事务之前执行的一些逻辑)
|
||||||
|
eventData.Context.AddDomainCommands();
|
||||||
|
|
||||||
|
//领域事件
|
||||||
|
eventData.Context.AddDomainEvents();
|
||||||
|
|
||||||
|
//审计时间
|
||||||
AuditEntities(eventData.Context);
|
AuditEntities(eventData.Context);
|
||||||
|
|
||||||
|
//IRC稽查 放在savechange 之前 不影响之前的逻辑
|
||||||
|
IRCDataInspection(eventData.Context);
|
||||||
|
|
||||||
return base.SavingChanges(eventData, result);
|
return base.SavingChanges(eventData, result);
|
||||||
}
|
}
|
||||||
public void AuditEntities(DbContext? context)
|
public void AuditEntities(DbContext? context)
|
||||||
|
@ -140,6 +163,11 @@ public class AuditEntityInterceptor(IUserInfo _userInfo, ILogger<AuditEntityInte
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region 异常处理
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
private void LoggerDBContextException(DbContextErrorEventData eventData)
|
private void LoggerDBContextException(DbContextErrorEventData eventData)
|
||||||
{
|
{
|
||||||
var ex = eventData.Exception;
|
var ex = eventData.Exception;
|
||||||
|
@ -198,4 +226,30 @@ public class AuditEntityInterceptor(IUserInfo _userInfo, ILogger<AuditEntityInte
|
||||||
|
|
||||||
base.SaveChangesFailed(eventData);
|
base.SaveChangesFailed(eventData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region 领域命令分发
|
||||||
|
|
||||||
|
//private async Task DispatchDomainCommands(DbContext? context)
|
||||||
|
//{
|
||||||
|
// if (context == null) return;
|
||||||
|
|
||||||
|
// var entities = context.ChangeTracker
|
||||||
|
// .Entries<Entity>()
|
||||||
|
// .Where(e => e.Entity.DomainCommands.Any())
|
||||||
|
// .Select(e => e.Entity)
|
||||||
|
// .ToList();
|
||||||
|
|
||||||
|
// var domainCommands = entities
|
||||||
|
// .SelectMany(e => e.DomainCommands)
|
||||||
|
// .ToList();
|
||||||
|
|
||||||
|
// entities.ForEach(e => e.ClearDomainCommands());
|
||||||
|
|
||||||
|
// foreach (var domainCommand in domainCommands)
|
||||||
|
// {
|
||||||
|
// await _bus.Send(domainCommand.GetType(), domainCommand);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
#endregion
|
||||||
}
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
using IRaCIS.Core.Domain.Models;
|
using IRaCIS.Core.Domain;
|
||||||
|
using IRaCIS.Core.Domain.Models;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Microsoft.EntityFrameworkCore.Diagnostics;
|
using Microsoft.EntityFrameworkCore.Diagnostics;
|
||||||
using System.Data;
|
using System.Data;
|
||||||
|
@ -48,7 +49,10 @@ namespace IRaCIS.Core.Infra.EFCore.Interceptor
|
||||||
|
|
||||||
foreach (var domainEvent in domainEvents)
|
foreach (var domainEvent in domainEvents)
|
||||||
{
|
{
|
||||||
await publishEndpoint.Publish(domainEvent);
|
//这种方式会导致消息没处理
|
||||||
|
//await publishEndpoint.Publish(domainEvent);
|
||||||
|
|
||||||
|
await publishEndpoint.Publish(domainEvent.GetType(), domainEvent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue