using IRaCIS.Core.Domain; using IRaCIS.Core.Domain.BaseModel; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure.Extention; using Microsoft.EntityFrameworkCore.ChangeTracking; using Newtonsoft.Json; namespace IRaCIS.Core.Infra.EFCore; public static class DBContext_Ext { public static void AddDomainEvents(this DbContext context) { var dbContext = (IRaCISDBContext)context; var changeTracker = context.ChangeTracker; //记录要保存到数据库的事件 var eventStoreList = new List(); #region 中心调研邮件通知 foreach (var entry in changeTracker.Entries()) { var trialSiteSurvey = entry.Entity; var originState = entry.Property(p => p.State).OriginalValue; //状态从待提交 变为CRC提交 (驳回也会变为已提交,所以必须设置前置状态是待提交) if (trialSiteSurvey.State == TrialSiteSurveyEnum.CRCSubmitted && originState == TrialSiteSurveyEnum.ToSubmit) { trialSiteSurvey.AddDomainEvent(new UserSiteSurveySubmitedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id }); } //SPM CPM 提交的时候 else if (trialSiteSurvey.State == TrialSiteSurveyEnum.SPMApproved && originState == TrialSiteSurveyEnum.CRCSubmitted) { trialSiteSurvey.AddDomainEvent(new SiteSurveySPMSubmitedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id }); } //PM 驳回 (在消费者中具体判断 是驳回给谁发邮件) else if ((trialSiteSurvey.State == TrialSiteSurveyEnum.CRCSubmitted || trialSiteSurvey.State == TrialSiteSurveyEnum.ToSubmit) && originState == TrialSiteSurveyEnum.SPMApproved) { trialSiteSurvey.AddDomainEvent(new SiteSurverRejectedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id }); } //添加进记录 eventStoreList.AddRange(trialSiteSurvey.DomainEvents.Select(t => new EventStoreRecord() { EventType = t.GetType().Name, EventData = t.ToJsonStr() })); } #endregion #region PD 入组发送邮件(不侵入之前的代码,有些判断过于复杂的,在代码里面有的,就手动 在跟踪的实体添加领域事件) foreach (var entry in changeTracker.Entries()) { } #endregion //跟随事务一起保存数据库 dbContext.EventStoreRecord.AddRangeAsync(eventStoreList); } #region 暂时废弃 /// /// 暂时废弃,没有场景使用 /// /// public static void AddDomainCommands(this DbContext context) { var changeTracker = context.ChangeTracker; //遍历 ChangeTracker 中的实体 //foreach (var entry in changeTracker.Entries()) //{ // var userLog = entry.Entity; // if (entry.State == EntityState.Added) // { // // 受试者添加 触发访视自动添加 // var addCommand = new AddUserLogTriggerCommand { UserLog=userLog }; // userLog.AddDomainCommand(addCommand); // } //} //foreach (var entry in changeTracker.Entries()) //{ // 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); // } //} } #endregion }