合并
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
commit
d7379e897b
|
@ -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); // 自动配置所有消费者的端点
|
||||
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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());
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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; }
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -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; }
|
||||
}
|
||||
|
|
|
@ -22,4 +22,6 @@ public class SiteSurveySPMSubmitedEvent : DomainEvent
|
|||
public class SiteSurverRejectedEvent : DomainEvent
|
||||
{
|
||||
public Guid TrialSiteSurveyId { get; set; }
|
||||
|
||||
public bool IsHaveSPMOrCPM { get; set; }
|
||||
}
|
||||
|
|
|
@ -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; }
|
||||
|
|
|
@ -60,6 +60,7 @@ namespace IRaCIS.Core.Infra.EFCore.Interceptor
|
|||
|
||||
if (domainEvent.IsScheduleEvent)
|
||||
{
|
||||
//延迟调度的消息,比如1h后再消费
|
||||
await _scheduler.SchedulePublish(DateTime.Now.AddSeconds(domainEvent.DelaySeconds), (object)domainEvent);
|
||||
}
|
||||
|
||||
|
|
17793
IRaCIS.Core.Infra.EFCore/Migrations/20241012011240_DownloadAddTrialSiteCode.Designer.cs
generated
Normal file
17793
IRaCIS.Core.Infra.EFCore/Migrations/20241012011240_DownloadAddTrialSiteCode.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
17800
IRaCIS.Core.Infra.EFCore/Migrations/20241012022610_AddEventTypeName.Designer.cs
generated
Normal file
17800
IRaCIS.Core.Infra.EFCore/Migrations/20241012022610_AddEventTypeName.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
|
@ -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: "完整的事件类型名");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
});
|
||||
|
||||
|
|
|
@ -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; }
|
||||
|
|
Loading…
Reference in New Issue