122 lines
3.8 KiB
C#
122 lines
3.8 KiB
C#
|
|
|
|
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<EventStoreRecord>();
|
|
|
|
#region 中心调研邮件通知
|
|
|
|
foreach (var entry in changeTracker.Entries<TrialSiteSurvey>())
|
|
{
|
|
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<SubjectVisit>())
|
|
{
|
|
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
//跟随事务一起保存数据库
|
|
dbContext.EventStoreRecord.AddRangeAsync(eventStoreList);
|
|
}
|
|
|
|
|
|
#region 暂时废弃
|
|
/// <summary>
|
|
/// 暂时废弃,没有场景使用
|
|
/// </summary>
|
|
/// <param name="context"></param>
|
|
public static void AddDomainCommands(this DbContext context)
|
|
{
|
|
var changeTracker = context.ChangeTracker;
|
|
|
|
|
|
|
|
|
|
|
|
//遍历 ChangeTracker 中的实体
|
|
//foreach (var entry in changeTracker.Entries<UserLog>())
|
|
//{
|
|
// var userLog = entry.Entity;
|
|
|
|
// if (entry.State == EntityState.Added)
|
|
// {
|
|
// // 受试者添加 触发访视自动添加
|
|
// var addCommand = new AddUserLogTriggerCommand { UserLog=userLog };
|
|
|
|
// userLog.AddDomainCommand(addCommand);
|
|
// }
|
|
//}
|
|
|
|
//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);
|
|
// }
|
|
//}
|
|
}
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
} |