合并
continuous-integration/drone/push Build is passing Details

IRC_NewDev
he 2024-10-12 16:57:01 +08:00
commit d7379e897b
25 changed files with 36081 additions and 76 deletions

View File

@ -35,6 +35,8 @@ using IRaCIS.Core.Application.MassTransit.Command;
using IRaCIS.Core.Application.MassTransit.Consumer;
using DocumentFormat.OpenXml.InkML;
using IRaCIS.Core.Domain;
using MassTransit.Internals;
using IRaCIS.Core.Domain.BaseModel;
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
@ -182,6 +184,10 @@ builder.Services.AddMassTransit(cfg =>
//使用 Hangfire 进行消息调度
cfg.UseHangfireScheduler();
cfg.UseConsumeFilter(typeof(CultureInfoFilter<>), context,
x => x.Include(type => type.IsAssignableTo(typeof(DomainEvent))));
// 这里可以进行额外的配置
cfg.ConfigureEndpoints(context); // 自动配置所有消费者的端点

View File

@ -937,6 +937,20 @@
<param name="childCode"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.EventStoreRecordService.GetEventStoreRecordList(IRaCIS.Core.Application.ViewModel.EventStoreRecordQuery)">
<summary>
邮件事件消息列表
</summary>
<param name="inQuery"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.Service.EventStoreRecordService.RePublishEvent(System.Guid)">
<summary>
重新发布失败的事件消息
</summary>
<param name="eventId"></param>
<returns></returns>
</member>
<member name="T:IRaCIS.Core.Application.Service.ExploreRecommendService">
<summary>
ExploreRecommendService
@ -12727,6 +12741,22 @@
<param name="_trialRepository"></param>
<param name="_mapper"></param>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.MasstransitHangfireTestConsumer">
<summary>
meditor send 的时候,请求流会先到消费者,返回后才会执行后续代码
publish 请求流不会先到消费者,发布后,直接执行后续代码
</summary>
<param name="_userRepository"></param>
</member>
<member name="M:IRaCIS.Core.Application.MassTransit.Consumer.MasstransitHangfireTestConsumer.#ctor(IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.User})">
<summary>
meditor send 的时候,请求流会先到消费者,返回后才会执行后续代码
publish 请求流不会先到消费者,发布后,直接执行后续代码
</summary>
<param name="_userRepository"></param>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.UrgentMedicalReviewAddedEventConsumer">
<summary>
加急的医学反馈任务 通知MIM
@ -12739,7 +12769,7 @@
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.UrgentIRApplyedReReadingConsumer">
<summary>
加急阅片 IR 申请重阅
加急阅片 IR 申请重阅 或者PM 申请重阅
</summary>
</member>
<member name="T:IRaCIS.Core.Application.MassTransit.Consumer.UserSiteSurveySubmitedEventConsumer">

View File

@ -0,0 +1,31 @@
using MassTransit;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static IRaCIS.Core.Application.Service.TestService;
namespace IRaCIS.Core.Application.MassTransit.Consumer;
/// <summary>
/// meditor send 的时候,请求流会先到消费者,返回后才会执行后续代码
/// publish 请求流不会先到消费者,发布后,直接执行后续代码
///
/// </summary>
/// <param name="_userRepository"></param>
public class MasstransitHangfireTestConsumer(IRepository<User> _userRepository) : IConsumer<MasstransitHangfireTest>
{
public async Task Consume(ConsumeContext<MasstransitHangfireTest> context)
{
Console.WriteLine(_userRepository._dbContext.GetHashCode());
Console.WriteLine("Now is " + DateTime.Now.ToString());
Console.WriteLine($"MassTransit.Consumer :{context.Message.value}");
await context.RespondAsync<IResponseOutput>(ResponseOutput.Ok());
}
}

View File

@ -113,11 +113,11 @@ public class UrgentMIMRepliedMedicalReviewConsumer : IConsumer<UrgentMIMRepliedM
}
/// <summary>
/// 加急阅片 IR 申请重阅
/// 加急阅片 IR 申请重阅 或者PM 申请重阅
/// </summary>
public class UrgentIRApplyedReReadingConsumer : IConsumer<UrgentIRApplyedReReading>
public class UrgentIRApplyedReReadingConsumer : IConsumer<UrgentApplyedReReading>
{
public Task Consume(ConsumeContext<UrgentIRApplyedReReading> context)
public Task Consume(ConsumeContext<UrgentApplyedReReading> context)
{
throw new NotImplementedException();
}

View File

@ -13,6 +13,7 @@ using MassTransit;
using Microsoft.AspNetCore.Components.Routing;
using Microsoft.Extensions.Options;
using MimeKit;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Globalization;
@ -45,56 +46,62 @@ public class UserSiteSurveySubmitedEventConsumer(
var trialId = siteSurveyInfo.TrialId;
var hasSPMOrCPM = await _trialSiteSurveyRepository.AnyAsync(t => t.TrialId == siteSurveyInfo.TrialId && t.Trial.TrialUserList.Any(u => u.User.UserTypeEnum == UserTypeEnum.SPM || u.User.UserTypeEnum == UserTypeEnum.CPM));
var trialUserList = await _trialSiteSurveyRepository.Where(t => t.TrialId == siteSurveyInfo.TrialId ).SelectMany(t=>t.Trial.TrialUserList)
.Where(t=> t.User.UserTypeEnum == UserTypeEnum.SPM || t.User.UserTypeEnum == UserTypeEnum.CPM || t.User.UserTypeEnum == UserTypeEnum.ProjectManager)
.Select(t=>new {t.User.FullName,t.User.EMail,t.User.UserTypeEnum}).ToListAsync();
var sPMOrCPMList = trialUserList.Where(t => t.UserTypeEnum == UserTypeEnum.SPM || t.UserTypeEnum == UserTypeEnum.CPM).ToList();
var pmList = trialUserList.Where(t => t.UserTypeEnum == UserTypeEnum.ProjectManager || t.UserTypeEnum == UserTypeEnum.APM).ToList();
var messageToSend = new MimeMessage();
var toUserName = string.Empty;
var userName = siteSurveyInfo.UserName;
var email = siteSurveyInfo.Email;
var phone = siteSurveyInfo.Phone;
if (hasSPMOrCPM)
//有SPM
if (sPMOrCPMList.Count>0)
{
var user = await _userRepository.FirstOrDefaultAsync(t => t.Id == siteSurveyInfo.PreliminaryUserId);
foreach (var user in sPMOrCPMList)
{
messageToSend.To.Add(new MailboxAddress(user.FullName, user.EMail));
}
userName = user.FullName;
email = user.EMail;
phone = user.Phone;
toUserName = string.Join('、', sPMOrCPMList.Select(t => t.FullName));
messageToSend.To.Add(new MailboxAddress(String.Empty, user.EMail));
}
else
{
messageToSend.To.Add(new MailboxAddress(String.Empty, siteSurveyInfo.Email));
foreach (var user in pmList)
{
messageToSend.To.Add(new MailboxAddress(user.FullName, user.EMail));
}
toUserName = string.Join('、', pmList.Select(t => t.FullName));
}
var trialInfo = await _trialRepository.FirstOrDefaultAsync(t => t.Id == trialId);
var siteInfo = await _trialSiteRepository.FirstOrDefaultAsync(t => t.TrialId == trialId && t.Id == siteSurveyInfo.TrialSiteId, true);
var companyName = isEn_US ? _systemEmailConfig.CompanyShortName : _systemEmailConfig.CompanyShortNameCN;
Func<(string topicStr, string htmlBodyStr), (string topicStr, string htmlBodyStr)> emailConfigFunc = input =>
{
var topicStr = string.Format(input.topicStr, companyName, trialInfo.ResearchProgramNo);
var topicStr = string.Format(input.topicStr, trialInfo.ResearchProgramNo);
var htmlBodyStr = string.Format(CommonEmailHelper.ReplaceCompanyName(_systemEmailConfig, input.htmlBodyStr),
toUserName,
siteInfo.TrialSiteCode,
siteInfo.TrialSiteAliasName,
userName,
email,
phone,
siteSurveyInfo.UserName,
siteSurveyInfo.Email,
siteSurveyInfo.Phone,
_systemEmailConfig.SiteUrl
);
return (topicStr, htmlBodyStr);
};
await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository, EmailBusinessScenario.SiteSurveyReject, messageToSend, emailConfigFunc);
await CommonEmailHelper.GetEmailSubejctAndHtmlInfoAndBuildAsync(_emailNoticeConfigrepository, EmailBusinessScenario.Approval_SubmitSiteSurvey, messageToSend, emailConfigFunc);
await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig);
@ -195,16 +202,14 @@ public class SiteSurverRejectedEventConsumer(
var trialId = siteSurveyInfo.TrialId;
var hasSPMOrCPM = await _trialSiteSurveyRepository.AnyAsync(t => t.TrialId == siteSurveyInfo.TrialId && t.Trial.TrialUserList.Any(u => u.User.UserTypeEnum == UserTypeEnum.SPM || u.User.UserTypeEnum == UserTypeEnum.CPM));
var messageToSend = new MimeMessage();
var name = siteSurveyInfo.UserName;
if (hasSPMOrCPM)
if (context.Message.IsHaveSPMOrCPM)
{
//PM 驳回
//PM 驳回到SPM
if (siteSurveyInfo.State == TrialSiteSurveyEnum.CRCSubmitted)
{
var user = await _userRepository.FirstOrDefaultAsync(t => t.Id == siteSurveyInfo.PreliminaryUserId);
@ -213,15 +218,16 @@ public class SiteSurverRejectedEventConsumer(
messageToSend.To.Add(new MailboxAddress(String.Empty, user.EMail));
}
//SPM 驳回
//SPM 驳回到CRC
else if (siteSurveyInfo.State == TrialSiteSurveyEnum.ToSubmit)
{
messageToSend.To.Add(new MailboxAddress(String.Empty, siteSurveyInfo.Email));
}
}
else
{
//没有SPM 给填表人发
//没有SPM PM驳回到CRC
messageToSend.To.Add(new MailboxAddress(String.Empty, siteSurveyInfo.Email));
}

View File

@ -0,0 +1,34 @@
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Domain.Share;
using MassTransit;
using NPOI.SS.Formula.Functions;
public class CultureInfoFilter<T> (IRepository<EventStoreRecord> _eventStoreRecordRepository) : IFilter<ConsumeContext<T>> where T : DomainEvent
{
public async Task Send(ConsumeContext<T> context, IPipe<ConsumeContext<T>> next)
{
var cultureInfoName = context.Message.CultureInfoName;
var eventId = context.Message.EventId;
if (!string.IsNullOrEmpty(cultureInfoName))
{
CultureInfo.CurrentCulture = new CultureInfo(cultureInfoName);
CultureInfo.CurrentUICulture = new CultureInfo(cultureInfoName);
}
await next.Send(context);
await _eventStoreRecordRepository.BatchUpdateNoTrackingAsync(t => t.Id == eventId, u => new EventStoreRecord() { EventState= EventStateEnum.ConsumeSuccessed } );
}
public void Probe(ProbeContext context)
{
context.CreateFilterScope("CultureInfoFilter");
}
}

View File

@ -15,6 +15,8 @@ public class EventStoreRecordView
public string EventData { get; set; }
public string EventTypeName { get; set; }
public EventStateEnum EventState { get; set; }
public string EventType { get; set; }
@ -33,7 +35,7 @@ public class EventStoreRecordQuery : PageInput
public EventStateEnum? EventState { get; set; }
public string? EventType { get; set; }
public string? EventTypeName { get; set; }
}

View File

@ -15,17 +15,23 @@ using MassTransit.Mediator;
using Newtonsoft.Json;
using MassTransit;
using IRaCIS.Core.Domain;
using IRaCIS.Core.Domain.Share;
using System.Globalization;
namespace IRaCIS.Core.Application.Service;
[ApiExplorerSettings(GroupName = "Common")]
public class EventStoreRecordService(IRepository<EventStoreRecord> _eventStoreRecordRepository, IMediator _mediator) : BaseService
public class EventStoreRecordService(IRepository<EventStoreRecord> _eventStoreRecordRepository, IMediator _mediator,IPublishEndpoint _publishEndpoint) : BaseService
{
/// <summary>
/// 邮件事件消息列表
/// </summary>
/// <param name="inQuery"></param>
/// <returns></returns>
[HttpPost]
public async Task<PageOutput<EventStoreRecordView>> GetEventStoreRecordList(EventStoreRecordQuery inQuery)
{
var eventStoreRecordQueryable = _eventStoreRecordRepository
var eventStoreRecordQueryable = _eventStoreRecordRepository.WhereIf(inQuery.EventTypeName.IsNotNullOrEmpty(),t=>t.EventTypeName.Contains(inQuery.EventTypeName))
.ProjectTo<EventStoreRecordView>(_mapper.ConfigurationProvider);
var pageList = await eventStoreRecordQueryable.ToPagedListAsync(inQuery);
@ -33,20 +39,20 @@ public class EventStoreRecordService(IRepository<EventStoreRecord> _eventStoreRe
return pageList;
}
/// <summary>
/// 重新发布失败的事件消息
/// </summary>
/// <param name="eventId"></param>
/// <returns></returns>
public async Task<IResponseOutput> RePublishEvent(Guid eventId)
{
var storedEvent = await _eventStoreRecordRepository.FirstOrDefaultAsync(t => t.Id == eventId);
var domainEvent = storedEvent.EventData.JsonStrToObject(Type.GetType(storedEvent.EventType));
Console.WriteLine(Type.GetType(storedEvent.EventType));
Console.WriteLine(domainEvent.GetType());
//IMediator 发布的时候设置当前线程的CultureInfo 消费者会与发布线程CultureInfo 一致 分布式的话 _publishEndpoint 会不一致,需要手动设置
Console.WriteLine(new UserSiteSurveySubmitedEvent().GetType().AssemblyQualifiedName);
await _mediator.Publish(domainEvent.GetType(), domainEvent);
await _publishEndpoint.Publish(domainEvent.GetType(), domainEvent);
return ResponseOutput.Ok();

View File

@ -763,6 +763,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
TrialId = sv.TrialId,
SubjectId=sv.SubjectId,
SubjectCode = sv.Subject.Code,
TrialSiteCode=sv.TrialSite.TrialSiteCode,
VisitName = sv.VisitName,
StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
@ -812,6 +813,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
TrialId = result.TrialId,
SubjectId = result.SubjectId,
SubjectCode = result.SubjectCode,
TrialSiteCode = result.TrialSiteCode,
IP = _userInfo.IP,
DownloadStartTime = DateTime.Now,
IsSuccess = false,
@ -969,6 +971,8 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
var subjectVisitIdList = inQuery.SubjectVisitTaskList.Select(t => t.SubjectVisitId).ToList();
var trialSiteCode = _visitTaskRepository.Where(t => t.Id == taskIdList.FirstOrDefault()).Select(t => t.IsAnalysisCreate ? t.BlindTrialSiteCode : t.Subject.TrialSite.TrialSiteCode).FirstOrDefault()??string.Empty;
var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id)))
//一致性分析,导致查询出来两条数据
join visitTask in _visitTaskRepository.Where(t => taskIdList.Contains(t.Id))
@ -1030,6 +1034,7 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
TrialId = info.TrialId,
SubjectId=inQuery.SubjectId,
SubjectCode = inQuery.SubjectCode,
TrialSiteCode= trialSiteCode,
IP = _userInfo.IP,
DownloadStartTime = DateTime.Now,
IsSuccess = false,

View File

@ -4,15 +4,11 @@ namespace IRaCIS.Core.Application.Service.WorkLoad.DTO
{
public class EnrollViewModel
{
[StringLength(50)]
public string ChineseName { get; set; } = string.Empty;
[StringLength(100)]
public string FirstName { get; set; } = string.Empty;
[StringLength(100)]
public string LastName { get; set; } = string.Empty;
public decimal? AdjustmentMultiple { get; set; } = 0;

View File

@ -22,6 +22,7 @@ using Microsoft.Extensions.Options;
using MiniExcelLibs;
using NPOI.SS.Formula.Functions;
using NPOI.XWPF.UserModel;
using System.Globalization;
using System.Runtime.InteropServices;
using System.Text;
using Tea;
@ -152,7 +153,7 @@ namespace IRaCIS.Core.Application.Service
await _testLengthRepository.AddAsync(new TestLength() { Name = "xxxx" });
// The consumer method will inject the repository and add 3 pieces of data, but the savechanges method of the repository will not be called
await _mediatorScoped.Send(new AddSubjectTriggerCommand { SubjectId = Guid.Empty });
await _mediatorScoped.Publish(new AddSubjectTriggerCommand { SubjectId = Guid.Empty });
await _mediator.Send(new AddSubjectTriggerCommand2 { SubjectId = Guid.Empty });
@ -167,18 +168,23 @@ namespace IRaCIS.Core.Application.Service
public string value { get; set; }
}
public class MasstransitHangfireTestConsumer : IConsumer<MasstransitHangfireTest>
public async Task<IResponseOutput> TestMasstransitHangfireOrRequest([FromServices] IMessageScheduler _scheduler,
[FromServices] IRepository<TestLength> _testLengthRepository,
[FromServices] IRequestClient<MasstransitHangfireTest> _requestClient)
{
public Task Consume(ConsumeContext<MasstransitHangfireTest> context)
{
Console.WriteLine("Now is " + DateTime.Now.ToString());
Console.WriteLine($"MassTransit.Consumer1 :{context.Message.value}");
return Task.CompletedTask;
}
}
public async Task<IResponseOutput> TestMasstransitHangfire([FromServices] IMessageScheduler _scheduler)
{
await _scheduler.SchedulePublish(DateTime.Now.AddSeconds(10), new MasstransitHangfireTest() { value = "message at " + DateTime.Now.ToString() });
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
var aa = CultureInfo.CurrentCulture.Name;
CultureInfo.CurrentCulture = new CultureInfo(StaticData.CultureInfo.en_US);
var bb = CultureInfo.CurrentCulture.Name;
var isEn_US2 = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
//await _scheduler.SchedulePublish(DateTime.Now.AddSeconds(10), new MasstransitHangfireTest() { value = "message at " + DateTime.Now.ToString() });
Console.WriteLine(_testLengthRepository._dbContext.GetHashCode());
await _requestClient.GetResponse<IResponseOutput>(new MasstransitHangfireTest() { value = "message at " + DateTime.Now.ToString() });
return ResponseOutput.Ok();
}

View File

@ -96,6 +96,146 @@ namespace IRaCIS.Core.Domain.Share
TrialSubjectVisitFeedBack = 28,
/// <summary>
/// 入组确认-质控任务待领取
/// </summary>
EligibilityVerification_PendingClaim = 29,
/// <summary>
/// 入组确认-质控任务待审核
/// </summary>
EligibilityVerification_PendingImageQC = 30,
/// <summary>
/// PD确认-质控任务待领取
/// </summary>
PDVerification_PendingImageQCClaim = 31,
/// <summary>
/// PD确认-质控任务待审核
/// </summary>
PDVerification_PendingImageQC = 32,
/// <summary>
/// 入组确认-QC质疑待处理
/// </summary>
EligibilityVerification_Pending = 33,
/// <summary>
/// 审批(提交调研表)
/// </summary>
Approval_SubmitSiteSurvey = 34,
/// <summary>
/// 审批(更新调研表)
/// </summary>
Approval_UpdateSiteSurvey = 35,
/// <summary>
/// 中心调研审批
/// </summary>
SiteSurveyApproval = 36,
/// <summary>
/// 入组确认-QC质疑待处理
/// </summary>
EligibilityVerification_UnderQCQuery = 37,
/// <summary>
/// PD确认-QC质疑待处理
/// </summary>
PDVerification_UnderQCQuery = 38,
/// <summary>
/// 入组确认-影像质疑待处理
/// </summary>
EligibilityVerification_ImageQuery = 39,
/// <summary>
/// PD确认-影像质疑待处理
/// </summary>
PDVerification_ImageQuery = 40,
/// <summary>
/// 入组确认-核查质疑待处理
/// </summary>
EligibilityVerification_UnderDR = 41,
/// <summary>
/// PD确认-核查质疑待处理
/// </summary>
PDVerification_UnderDR = 42,
/// <summary>
/// 加急阅片
/// </summary>
ExpeditedReading = 43,
/// <summary>
/// 加急医学反馈
/// </summary>
ExpeditedMedicalQCToIR = 44,
/// <summary>
/// 入组确认-医学审核
/// </summary>
EligibilityVerification_MedicalQC = 45,
/// <summary>
/// PD确认-医学审核
/// </summary>
PDVerification_MedicalQC = 46,
/// <summary>
/// 入组确认-医学反馈
/// </summary>
EligibilityVerification_MedicalQCFeedback = 47,
/// <summary>
/// PD确认-医学反馈
/// </summary>
PDVerification_MedicalQCFeedback = 48,
/// <summary>
/// 入组确认-一致性核查
/// </summary>
EligibilityVerification_DR = 49,
/// <summary>
/// PD确认-一致性核查
/// </summary>
PDVerification_DR = 50,
/// <summary>
/// 入组确认-核查质疑
/// </summary>
EligibilityVerification_UnderDRForPMOrAPM = 51,
/// <summary>
/// PD确认-核查质疑
/// </summary>
PDVerification_UnderDRForPMOrAPM = 52,
/// <summary>
/// 阅片人重阅审批
/// </summary>
ReReadFromIRApproval = 53,
/// <summary>
/// 项目组申请重阅审批
/// </summary>
ReReadFromPMApproval = 54,
/// <summary>
/// 入组确认-加急医学反馈回复
/// </summary>
EligibilityVerification_ExpeditedMedicalQCResponse = 55,
/// <summary>
/// PD确认-加急医学反馈回复
/// </summary>
PDVerification_ExpeditedMedicalQCResponse = 56
}

View File

@ -1,6 +1,7 @@
using IRaCIS.Core.Domain.Models;
using MassTransit;
using System.ComponentModel;
using System.Globalization;
namespace IRaCIS.Core.Domain.BaseModel;
@ -22,6 +23,8 @@ public abstract class DomainEvent
/// 在事件产生多少s后开始消费该事件
/// </summary>
public int DelaySeconds{ get; set; }
public string CultureInfoName { get; set; } = CultureInfo.CurrentCulture.Name;
}
/// <summary>

View File

@ -10,6 +10,11 @@ namespace IRaCIS.Core.Domain.Models;
[Table("EventStoreRecord")]
public class EventStoreRecord : BaseFullAuditEntity
{
[Comment("简单的事件类型名")]
public string EventTypeName { get; set; }
[Comment("完整的事件类型名")]
public string EventType { get; set; }
[MaxLength]

View File

@ -17,6 +17,9 @@ public class TrialImageDownload : BaseFullAuditEntity
public Guid SubjectId { get; set; }
[Comment("一致性分析的就显示一致性分析的中心")]
public string TrialSiteCode { get; set; }
public string SubjectCode { get; set; }
public bool IsSuccess { get; set; }

View File

@ -1,4 +1,5 @@
using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Domain.Models;
using System;
using System.Collections.Generic;
@ -34,9 +35,11 @@ public class UrgentMIMRepliedMedicalReview : DomainEvent
/// <summary>
/// 加急阅片 IR 申请重阅
/// 加急阅片 IR 申请重阅 或者PM 申请重阅
/// </summary>
public class UrgentIRApplyedReReading : DomainEvent
public class UrgentApplyedReReading : DomainEvent
{
public Guid VisitTaskId { get; set; }
public ReReadingApplyState ReReadingApplyState { get; set; }
}

View File

@ -22,4 +22,6 @@ public class SiteSurveySPMSubmitedEvent : DomainEvent
public class SiteSurverRejectedEvent : DomainEvent
{
public Guid TrialSiteSurveyId { get; set; }
public bool IsHaveSPMOrCPM { get; set; }
}

View File

@ -43,14 +43,19 @@ public static class DBContext_Ext
trialSiteSurvey.AddDomainEvent(new SiteSurveySPMSubmitedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id });
}
//PM 驳回 (在消费者中具体判断 是驳回给谁发邮件)
//PM 驳回
else if ((trialSiteSurvey.State == TrialSiteSurveyEnum.CRCSubmitted || trialSiteSurvey.State == TrialSiteSurveyEnum.ToSubmit) && originState == TrialSiteSurveyEnum.SPMApproved)
{
trialSiteSurvey.AddDomainEvent(new SiteSurverRejectedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id });
trialSiteSurvey.AddDomainEvent(new SiteSurverRejectedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id, IsHaveSPMOrCPM = trialSiteSurvey.State == TrialSiteSurveyEnum.CRCSubmitted });
}
//SPM 驳回
else if (trialSiteSurvey.State == TrialSiteSurveyEnum.ToSubmit && originState == TrialSiteSurveyEnum.CRCSubmitted)
{
trialSiteSurvey.AddDomainEvent(new SiteSurverRejectedEvent() { TrialSiteSurveyId = trialSiteSurvey.Id, IsHaveSPMOrCPM = true });
}
//添加进记录
eventStoreList.AddRange(trialSiteSurvey.DomainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventData = t.ToJsonStr() }));
eventStoreList.AddRange(GetStoreEvents(trialSiteSurvey.DomainEvents));
}
@ -86,10 +91,8 @@ public static class DBContext_Ext
subjectVisit.AddDomainEvent(new CheckStateChangedToAuditEvent() { SubjectVisitId = subjectVisit.Id });
}
//添加进记录
eventStoreList.AddRange(subjectVisit.DomainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventData = t.ToJsonStr() }));
eventStoreList.AddRange(GetStoreEvents(subjectVisit.DomainEvents));
}
}
@ -117,7 +120,7 @@ public static class DBContext_Ext
}
//添加进记录
eventStoreList.AddRange(qCChallengeDialog.DomainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventData = t.ToJsonStr() }));
eventStoreList.AddRange(GetStoreEvents(qCChallengeDialog.DomainEvents));
}
}
@ -143,7 +146,7 @@ public static class DBContext_Ext
}
//添加进记录
eventStoreList.AddRange(checkChallengeDialog.DomainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventData = t.ToJsonStr() }));
eventStoreList.AddRange(GetStoreEvents(checkChallengeDialog.DomainEvents));
}
}
@ -180,7 +183,7 @@ public static class DBContext_Ext
taskMedicalReview.AddDomainEvent(new UrgentMedicalReviewAddedEvent() { MedicalReviewId = taskMedicalReview.Id, VisitTaskId = taskMedicalReview.VisitTaskId });
//添加进记录
eventStoreList.AddRange(taskMedicalReview.DomainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventData = t.ToJsonStr() }));
eventStoreList.AddRange(GetStoreEvents(taskMedicalReview.DomainEvents));
}
}
}
@ -221,7 +224,7 @@ public static class DBContext_Ext
}
//添加进记录
eventStoreList.AddRange(readingMedicalReviewDialog.DomainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventData = t.ToJsonStr() }));
eventStoreList.AddRange(GetStoreEvents(readingMedicalReviewDialog.DomainEvents));
}
}
@ -235,7 +238,7 @@ public static class DBContext_Ext
var originReReadingApplyState = entry.Property(p => p.ReReadingApplyState).OriginalValue;
if (originReReadingApplyState == ReReadingApplyState.Default && visitTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed)
if (originReReadingApplyState == ReReadingApplyState.Default && (visitTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed || visitTask.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed))
{
var findSubjectVisit = new EnrollmentConfirmAndPD();
@ -256,10 +259,10 @@ public static class DBContext_Ext
if (findSubjectVisit.IsEnrollmentConfirm || findSubjectVisit.PDState == PDStateEnum.PDProgress)
{
visitTask.AddDomainEvent(new UrgentIRApplyedReReading() { VisitTaskId = visitTask.Id });
visitTask.AddDomainEvent(new UrgentApplyedReReading() { VisitTaskId = visitTask.Id, ReReadingApplyState= visitTask.ReReadingApplyState });
//添加进记录
eventStoreList.AddRange(visitTask.DomainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventData = t.ToJsonStr() }));
eventStoreList.AddRange(GetStoreEvents(visitTask.DomainEvents));
}
}
@ -270,6 +273,10 @@ public static class DBContext_Ext
dbContext.EventStoreRecord.AddRange(eventStoreList);
}
private static List<EventStoreRecord> GetStoreEvents(IReadOnlyCollection<DomainEvent> domainEvents)
{
return domainEvents.Select(t => new EventStoreRecord() { Id = t.EventId, EventType = t.GetType().AssemblyQualifiedName, EventTypeName=t.GetType().Name, EventData = t.ToJsonStr() }).ToList();
}
public class EnrollmentConfirmAndPD
{
public bool IsEnrollmentConfirm { get; set; }

View File

@ -60,6 +60,7 @@ namespace IRaCIS.Core.Infra.EFCore.Interceptor
if (domainEvent.IsScheduleEvent)
{
//延迟调度的消息比如1h后再消费
await _scheduler.SchedulePublish(DateTime.Now.AddSeconds(domainEvent.DelaySeconds), (object)domainEvent);
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,52 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class DownloadAddTrialSiteCode : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "TrialSiteCode",
table: "TrialImageDownload",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "",
comment: "一致性分析的就显示一致性分析的中心");
migrationBuilder.CreateIndex(
name: "IX_TrialImageDownload_SubjectId",
table: "TrialImageDownload",
column: "SubjectId");
migrationBuilder.AddForeignKey(
name: "FK_TrialImageDownload_Subject_SubjectId",
table: "TrialImageDownload",
column: "SubjectId",
principalTable: "Subject",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_TrialImageDownload_Subject_SubjectId",
table: "TrialImageDownload");
migrationBuilder.DropIndex(
name: "IX_TrialImageDownload_SubjectId",
table: "TrialImageDownload");
migrationBuilder.DropColumn(
name: "TrialSiteCode",
table: "TrialImageDownload");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,53 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace IRaCIS.Core.Infra.EFCore.Migrations
{
/// <inheritdoc />
public partial class AddEventTypeName : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "EventType",
table: "EventStoreRecord",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
comment: "完整的事件类型名",
oldClrType: typeof(string),
oldType: "nvarchar(400)",
oldMaxLength: 400);
migrationBuilder.AddColumn<string>(
name: "EventTypeName",
table: "EventStoreRecord",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
defaultValue: "",
comment: "简单的事件类型名");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "EventTypeName",
table: "EventStoreRecord");
migrationBuilder.AlterColumn<string>(
name: "EventType",
table: "EventStoreRecord",
type: "nvarchar(400)",
maxLength: 400,
nullable: false,
oldClrType: typeof(string),
oldType: "nvarchar(400)",
oldMaxLength: 400,
oldComment: "完整的事件类型名");
}
}
}

View File

@ -2130,7 +2130,14 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<string>("EventType")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)");
.HasColumnType("nvarchar(400)")
.HasComment("完整的事件类型名");
b.Property<string>("EventTypeName")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)")
.HasComment("简单的事件类型名");
b.Property<DateTime>("UpdateTime")
.HasColumnType("datetime2");
@ -11287,6 +11294,12 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Property<Guid>("TrialId")
.HasColumnType("uniqueidentifier");
b.Property<string>("TrialSiteCode")
.IsRequired()
.HasMaxLength(400)
.HasColumnType("nvarchar(400)")
.HasComment("一致性分析的就显示一致性分析的中心");
b.Property<DateTime>("UpdateTime")
.HasColumnType("datetime2");
@ -11302,6 +11315,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.HasIndex("CreateUserId");
b.HasIndex("SubjectId");
b.HasIndex("TrialId");
b.ToTable("TrialImageDownload", t =>
@ -16641,6 +16656,12 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.Subject", "Subject")
.WithMany()
.HasForeignKey("SubjectId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("IRaCIS.Core.Domain.Models.Trial", "Trial")
.WithMany()
.HasForeignKey("TrialId")
@ -16649,6 +16670,8 @@ namespace IRaCIS.Core.Infra.EFCore.Migrations
b.Navigation("CreateUser");
b.Navigation("Subject");
b.Navigation("Trial");
});

View File

@ -49,7 +49,6 @@ namespace IRaCIS.Core.Test.CodeFirstTest.MSSQL
{
public Guid TrialImageDownloadId { get; set; }
[StringLength(100)]
public string TestName { get; set; }
}
@ -137,7 +136,6 @@ namespace IRaCIS.Core.Test.CodeFirstTest.MSSQL
{
public string DefaultLength { get; set; }
[MaxLength(300)]
public string UserDefineLength { get; set; }
public string UserDefineText { get; set; }