diff --git a/IRaCIS.Core.API/Progranm.cs b/IRaCIS.Core.API/Progranm.cs index c06f45d52..ef03b3be1 100644 --- a/IRaCIS.Core.API/Progranm.cs +++ b/IRaCIS.Core.API/Progranm.cs @@ -151,9 +151,20 @@ builder.Services.AddMediator(cfg => cfg.AddConsumer(); }); +// 添加 MassTransit 和 InMemory 传输 builder.Services.AddMassTransit(cfg => { - cfg.UsingInMemory(); + // 注册消费者 + cfg.AddConsumer(); // 替换为你的消费者类 + + // 使用 InMemory 作为消息传递机制 + cfg.UsingInMemory((context, cfg) => + { + // 这里可以进行额外的配置 + cfg.ConfigureEndpoints(context); // 自动配置所有消费者的端点 + }); + + }); #endregion diff --git a/IRaCIS.Core.Application/MassTransit/Consumer/AddSubjectConsumer.cs b/IRaCIS.Core.Application/MassTransit/Consumer/AddSubjectConsumer.cs new file mode 100644 index 000000000..f0c5e41ae --- /dev/null +++ b/IRaCIS.Core.Application/MassTransit/Consumer/AddSubjectConsumer.cs @@ -0,0 +1,38 @@ + + +using AutoMapper; +using IRaCIS.Core.Domain; +using MassTransit; + +namespace IRaCIS.Core.Application.MassTransit.Consumer; + +public class AddSubjectConsumer(IRepository _subjectVisitRepository, + + IRepository _visitStageRepository, + IRepository _trialRepository, + IMapper _mapper) : IConsumer +{ + public async Task Consume(ConsumeContext context) + { + var addSubjectEvent= context.Message; + + //添加受试者的时候,获取访视计划列表,添加到受试者访视表。 + var visitPlanList = await _visitStageRepository.Where(t => t.TrialId == addSubjectEvent.TrialId && t.IsConfirmed).ToListAsync(); + + var svList = _mapper.Map>(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); + } +} diff --git a/IRaCIS.Core.Domain/BaseModel/Entity.cs b/IRaCIS.Core.Domain/BaseModel/Entity.cs index f30d88e48..eecd81ff9 100644 --- a/IRaCIS.Core.Domain/BaseModel/Entity.cs +++ b/IRaCIS.Core.Domain/BaseModel/Entity.cs @@ -21,6 +21,7 @@ public abstract class Entity : IEntity public Guid Id { get; set; } #region 领域事件 仅仅允许通过提供的方法进行操作 + [JsonIgnore] private readonly List _domainEvents = []; @@ -41,6 +42,7 @@ public abstract class Entity : IEntity { _domainEvents.Clear(); } + #endregion } #region 减少实体属性,增加基类 diff --git a/IRaCIS.Core.Domain/_DomainEvent/AddSubjectEvent.cs b/IRaCIS.Core.Domain/_DomainEvent/AddSubjectEvent.cs new file mode 100644 index 000000000..0a23e13c4 --- /dev/null +++ b/IRaCIS.Core.Domain/_DomainEvent/AddSubjectEvent.cs @@ -0,0 +1,12 @@ + +using IRaCIS.Core.Domain.BaseModel; + +namespace IRaCIS.Core.Domain; + +public class AddSubjectEvent : DomainEvent +{ + public Guid SubjectId { get; set; } + public Guid TrialId { get; set; } + + public Guid TrialSiteId { get; set; } +} diff --git a/IRaCIS.Core.Infra.EFCore/Interceptor/AddDomainEvent.cs b/IRaCIS.Core.Infra.EFCore/Interceptor/AddDomainEvent.cs new file mode 100644 index 000000000..5519ece20 --- /dev/null +++ b/IRaCIS.Core.Infra.EFCore/Interceptor/AddDomainEvent.cs @@ -0,0 +1,31 @@ + + +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; + + // 遍历 ChangeTracker 中的实体 + foreach (var entry in changeTracker.Entries()) + { + var subject = entry.Entity; + + if (entry.State == EntityState.Added) + { + // 受试者添加 触发访视自动添加 + var addedEvent = new AddSubjectEvent { SubjectId = subject.Id, TrialId = subject.TrialId, TrialSiteId = subject.TrialSiteId }; + + subject.AddDomainEvent(addedEvent); + } + } + } +} \ No newline at end of file diff --git a/IRaCIS.Core.Infra.EFCore/Interceptor/AuditEntityInterceptor.cs b/IRaCIS.Core.Infra.EFCore/Interceptor/AuditEntityInterceptor.cs index c851f0f65..7c3b36322 100644 --- a/IRaCIS.Core.Infra.EFCore/Interceptor/AuditEntityInterceptor.cs +++ b/IRaCIS.Core.Infra.EFCore/Interceptor/AuditEntityInterceptor.cs @@ -22,6 +22,9 @@ public class AuditEntityInterceptor(IUserInfo _userInfo, ILogger> SavingChangesAsync(DbContextEventData eventData, InterceptionResult result, CancellationToken cancellationToken = default) { + //测试领域事件 + eventData.Context.AddDomainEvents(); + //审计时间 AuditEntities(eventData.Context);