353 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			353 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
	
| using IRaCIS.Core.Domain.Share;
 | ||
| using System.Linq;
 | ||
| using ZstdSharp.Unsafe;
 | ||
| 
 | ||
| namespace IRaCIS.Core.Domain.Models;
 | ||
| 
 | ||
| [Comment("项目 - 项目基本信息与配置")]
 | ||
| [Table("Trial")]
 | ||
| public partial class Trial : BaseFullDeleteAuditEntity
 | ||
| {
 | ||
|     #region 导航属性
 | ||
|     [JsonIgnore]
 | ||
|     [ForeignKey("SponsorId")]
 | ||
|     public Sponsor Sponsor { get; set; }
 | ||
|     [JsonIgnore]
 | ||
|     [ForeignKey("CROId")]
 | ||
|     public CRO CRO { get; set; }
 | ||
|     [JsonIgnore]
 | ||
|     public List<TrialBodyPart> TrialBodyPartList { get; set; }
 | ||
|     [JsonIgnore]
 | ||
|     public List<TaskMedicalReview> TaskMedicalReviewList { get; set; }
 | ||
|     [JsonIgnore]
 | ||
|     public List<TaskConsistentRule> TaskConsistentRuleList { get; set; }
 | ||
|     [JsonIgnore]
 | ||
|     public List<SubjectUser> SubjectDoctorUserList { get; set; } = new List<SubjectUser>();
 | ||
|     [JsonIgnore]
 | ||
|     public List<VisitTask> VisitTaskList { get; set; } = new List<VisitTask>() { };
 | ||
| 
 | ||
|     [JsonIgnore]
 | ||
|     public List<VisitTaskReReading> VisitTaskReReadingList { get; set; }
 | ||
|     [JsonIgnore]
 | ||
|     public List<TrialSiteSurvey> TrialSiteSurveyList { get; set; } = new List<TrialSiteSurvey>();
 | ||
| 
 | ||
|     [JsonIgnore]
 | ||
|     public List<TrialDocument> TrialDocumentList { get; set; }
 | ||
|     [JsonIgnore]
 | ||
|     public List<Enroll> EnrollList { get; set; } = new List<Enroll>();
 | ||
|     [JsonIgnore]
 | ||
|     public List<Workload> WorkloadList { get; set; } = new List<Workload>();
 | ||
|     [JsonIgnore]
 | ||
|     public List<TrialUserRole> TrialUserRoleList { get; set; } = new List<TrialUserRole>();
 | ||
| 
 | ||
|     [JsonIgnore]
 | ||
|     public List<TrialIdentityUser> TrialIdentityUserList { get; set; }  
 | ||
|     [JsonIgnore]
 | ||
|     public List<ReadingQuestionCriterionTrial> TrialReadingCriterionList { get; set; } = new List<ReadingQuestionCriterionTrial>();
 | ||
|     [JsonIgnore]
 | ||
|     public List<Subject> SubjectList { get; set; } = new List<Subject>();
 | ||
|     [JsonIgnore]
 | ||
|     public List<SubjectVisit> SubjectVisitList { get; set; } = new List<SubjectVisit>();
 | ||
| 
 | ||
|     [JsonIgnore]
 | ||
|     public List<NoneDicomStudy> NoneDicomStudyList { get; set; }
 | ||
|     [JsonIgnore]
 | ||
|     public List<DicomStudy> StudyList { get; set; } = new List<DicomStudy>();
 | ||
|     [JsonIgnore]
 | ||
|     public List<TrialSite> TrialSiteList { get; set; } = new List<TrialSite>();
 | ||
|     [JsonIgnore]
 | ||
|     public List<TrialSiteUserRole> TrialSiteUserList { get; set; } = new List<TrialSiteUserRole>();
 | ||
|     [JsonIgnore]
 | ||
|     public List<ReadModule> ReadModuleList { get; set; } = new List<ReadModule>();
 | ||
|     [JsonIgnore]
 | ||
|     public List<UserFeedBack> UserFeedBackList { get; set; } = new List<UserFeedBack>();
 | ||
|     [JsonIgnore]
 | ||
|     [ForeignKey("IndicationTypeId")]
 | ||
|     public Dictionary IndicationType { get; set; }
 | ||
|     [JsonIgnore]
 | ||
|     [ForeignKey("PhaseId")]
 | ||
|     public Dictionary Phase { get; set; }
 | ||
|     [JsonIgnore]
 | ||
|     [ForeignKey("ReviewModeId")]
 | ||
|     public Dictionary ReviewMode { get; set; }
 | ||
| 
 | ||
|     [JsonIgnore]
 | ||
|     public List<ClinicalDataTrialSet> ClinicalDataTrialSetList { get; set; } = new List<ClinicalDataTrialSet> { };
 | ||
|     [JsonIgnore]
 | ||
|     public List<TrialStatusDetail> ClinicalTrialProjectDetails { get; set; } = new List<TrialStatusDetail> { };
 | ||
|     [JsonIgnore]
 | ||
|     public List<TrialDictionary> TrialDicList { get; set; } = new List<TrialDictionary>();
 | ||
| 
 | ||
|     [JsonIgnore]
 | ||
|     public List<ReadingClinicalData> ReadingClinicalDataList { get; set; }
 | ||
| 
 | ||
|     [JsonIgnore]
 | ||
|     public List<TrialStateChange> TrialStateChangeList { get; set; } = new List<TrialStateChange>();
 | ||
|     #endregion
 | ||
| 
 | ||
|     public Guid IndicationTypeId { get; set; } = Guid.Empty;
 | ||
|     public Guid? PhaseId { get; set; } = Guid.Empty;
 | ||
| 
 | ||
|     public string TrialCode { get; set; } = string.Empty;
 | ||
| 
 | ||
|     public int Code { get; set; }
 | ||
| 
 | ||
|     public string Indication { get; set; } = string.Empty;
 | ||
| 
 | ||
|     [Comment("入组那一块的状态")]
 | ||
|     public int TrialEnrollStatus { get; set; }
 | ||
| 
 | ||
|     [Comment("启动状态")]
 | ||
|     public string TrialStatusStr { get; set; } = StaticData.TrialState.TrialInitializing;
 | ||
| 
 | ||
|     public Guid? CROId { get; set; } = Guid.Empty;
 | ||
| 
 | ||
|     public Guid? SponsorId { get; set; } = Guid.Empty;
 | ||
|     public Guid? ReviewModeId { get; set; } = Guid.Empty;
 | ||
|     public string ProjectCycle { get; set; } = string.Empty;
 | ||
|     public int ExpectedPatients { get; set; }
 | ||
| 
 | ||
|     public decimal TimePointsPerPatient { get; set; }
 | ||
| 
 | ||
|     public int GRRReviewers { get; set; }
 | ||
| 
 | ||
|     public int TotalReviewers { get; set; }
 | ||
| 
 | ||
|     public string ReviewProtocol { get; set; } = string.Empty;
 | ||
| 
 | ||
|     public string MessageFromClient { get; set; } = string.Empty;
 | ||
| 
 | ||
|     public string Note { get; set; } = string.Empty;
 | ||
|     public string ReviewProtocolName { get; set; } = string.Empty;
 | ||
|     public string MessageFromClientName { get; set; } = string.Empty;
 | ||
|     public int Expedited { get; set; }
 | ||
|     public string DeclarationTypes { get; set; } = string.Empty;
 | ||
| 
 | ||
|     [NotMapped]
 | ||
|     public List<DeclarationType> DeclarationTypeEnumList => DeclarationTypes.Split('|', StringSplitOptions.RemoveEmptyEntries)
 | ||
|        .Select(s => Enum.Parse(typeof(DeclarationType), s)).Cast<DeclarationType>().ToList();
 | ||
| 
 | ||
|     [NotMapped]
 | ||
|     public List<AttendedReviewerType> AttendedReviewerTypeEnumList => AttendedReviewerTypes.Split('|', StringSplitOptions.RemoveEmptyEntries)
 | ||
|         .Select(s => Enum.Parse(typeof(AttendedReviewerType), s)).Cast<AttendedReviewerType>().ToList();
 | ||
| 
 | ||
|     public string AttendedReviewerTypes { get; set; } = string.Empty;
 | ||
| 
 | ||
|     [StringLength(1000)]
 | ||
|     public string TrialExtraConfigJsonStr { get; set; } = string.Empty;
 | ||
| 
 | ||
|     public bool VisitPlanConfirmed { get; set; }
 | ||
| 
 | ||
|     [Comment("受试者编号具体规则")]
 | ||
|     public string SubjectCodeRule { get; set; } = I18n.T("Trial_number");
 | ||
|     [Comment("是否 提醒受试者编号规则")]
 | ||
|     public bool IsNoticeSubjectCodeRule { get; set; } = true;
 | ||
| 
 | ||
|     [Comment("是否 有基准时间(首次给药时间)")]
 | ||
|     public bool IsHaveFirstGiveMedicineDate { get; set; } = true;
 | ||
| 
 | ||
|     [Comment("是否有  受试者年龄")]
 | ||
|     public bool IsHaveSubjectAge { get; set; } = false;
 | ||
|     [Comment("是否有 入组性确认")]
 | ||
|     public bool IsEnrollementQualificationConfirm { get; set; } = false;
 | ||
|     [Comment("出组后计划外访视名称")]
 | ||
|     public string OutEnrollmentVisitName { get; set; } = "EOT";
 | ||
|     [Comment("是否 验证拍片日期")]
 | ||
|     public bool IsVerifyVisitImageDate { get; set; } = true;
 | ||
|     [Comment("临床信息传输 1:系统录入  2:系统录入+PDF  0:无")]
 | ||
|     public int ClinicalInformationTransmissionEnum { get; set; } = 1;
 | ||
| 
 | ||
|     [Comment("是否审核 临床信息")]
 | ||
|     public bool IsCRAAuditClinicalInformation { get; set; } = false;
 | ||
| 
 | ||
|     [Comment("QC流程  0 不审,1 单审,2双审")]
 | ||
|     public TrialQCProcess QCProcessEnum { get; set; } = TrialQCProcess.DoubleAudit;
 | ||
| 
 | ||
|     [Comment("影像一致性核查")]
 | ||
|     public bool IsImageConsistencyVerification { get; set; } = true;
 | ||
| 
 | ||
|     [Comment("影像导出")]
 | ||
|     public bool IsImageExport { get; set; } = false;
 | ||
| 
 | ||
|     public bool IsSubjectSecondCodeView { get; set; }
 | ||
|     [Comment("阅片方式")]
 | ||
|     public int ReadingMode { get; set; } = 1;
 | ||
| 
 | ||
|     public int ChangeDefalutDays { get; set; } = 7;
 | ||
| 
 | ||
|     [Comment("跨项目复制")]
 | ||
|     public bool IsImageReplicationAcrossTrial { get; set; } = false;
 | ||
| 
 | ||
|     [MaxLength]
 | ||
|     public string BodyPartTypes { get; set; } = "鼻咽部|脑部|颈部|胸部|上/下腹部|盆腔|全身|其他";
 | ||
|     public string Modalitys { get; set; } = "CT|MRI";
 | ||
| 
 | ||
|     [NotMapped]
 | ||
|     public List<string> ModalityList => Modalitys.Split('|', StringSplitOptions.RemoveEmptyEntries).Where(t => !string.IsNullOrEmpty(t)).ToList();
 | ||
|     public string PreliminaryAuditReuploadText { get; set; } = string.Empty;
 | ||
| 
 | ||
|     public string ReviewAuditReuploadText { get; set; } = string.Empty;
 | ||
|     [Comment("PD 进展是否显示   配置访视 是否显示 PD进展 (从而可以设置状态)")]
 | ||
|     public bool IsPDProgressView { get; set; }
 | ||
| 
 | ||
|     [Comment("研究方案号")]
 | ||
|     public string ResearchProgramNo { get; set; } = string.Empty;
 | ||
| 
 | ||
|     [Comment("实验名称")]
 | ||
|     public string ExperimentName { get; set; } = string.Empty;
 | ||
| 
 | ||
|     [Comment("主研单位")]
 | ||
|     public string MainResearchUnit { get; set; } = string.Empty;
 | ||
| 
 | ||
|     [Comment("负责人PI")]
 | ||
|     public string HeadPI { get; set; } = string.Empty;
 | ||
| 
 | ||
|     public bool IsUrgent { get; set; }
 | ||
| 
 | ||
|     [Comment("项目类型 1 正式项目、0 非正式项目  2是培训项目")]
 | ||
|     public TrialType TrialType { get; set; }
 | ||
|     public int PlanSiteCount { get; set; }
 | ||
| 
 | ||
|     public int PlanVisitCount { get; set; }
 | ||
| 
 | ||
|     public DateTime? TrialFinishedTime { get; set; }
 | ||
| 
 | ||
|     public bool IsSubjectSexView { get; set; } = false;
 | ||
| 
 | ||
|     [Comment("配置Suject  Edit页面 是否显示 加急")]
 | ||
|     public bool IsSubjectExpeditedView { get; set; } = false;
 | ||
| 
 | ||
|     public bool IsTrialStart { get; set; } = false;
 | ||
|     [Comment("QC 问题流程")]
 | ||
|     public UserRole QCQuestionConfirmedUser { get; set; }
 | ||
|     public Guid? QCQuestionConfirmedUserId { get; set; }
 | ||
|     public DateTime? QCQuestionConfirmedTime { get; set; }
 | ||
| 
 | ||
|     [Comment("项目完成时间")]
 | ||
|     public DateTime? TrialFinishTime { get; set; }
 | ||
| 
 | ||
|     public int? DigitPlaces { get; set; } = 1;
 | ||
| 
 | ||
|     public bool IsTrialProcessConfirmed { get; set; }
 | ||
|     public bool IsTrialBasicLogicConfirmed { get; set; }
 | ||
|     public bool IsTrialUrgentConfirmed { get; set; }
 | ||
| 
 | ||
|     public bool IsQCQuestionConfirmed { get; set; }
 | ||
|     [Comment("同步临床数据时间")]
 | ||
|     public DateTime? SyncClinicalDataTime { get; set; }
 | ||
|     public string BlindBaseLineName { get; set; } = "Baseline";
 | ||
| 
 | ||
|     public string BlindFollowUpPrefix { get; set; } = "Follow-up";
 | ||
| 
 | ||
|     public int IndicationEnum { get; set; } = -1;
 | ||
| 
 | ||
|     public string VitrualSiteCode { get; set; } = string.Empty;
 | ||
| 
 | ||
|     #region 检查相关新加字段
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// 是否显示检查名称
 | ||
|     /// </summary>
 | ||
|     public bool IsShowStudyName { get; set; } = false;
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// 检查名称列表
 | ||
|     /// </summary>
 | ||
|     public List<StudyName> StudyNameList { get; set; } = new List<StudyName>();
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// 图像格式
 | ||
|     /// </summary>
 | ||
|     [StringLength(2000)]
 | ||
|     public List<string> ImageFormatList { get; set; } = new List<string>() {"jpg","jpeg","png","bmp","pdf","zip" };
 | ||
|     #endregion
 | ||
| 
 | ||
|     #region 邮件配置
 | ||
|     [Comment("发件箱账号")]
 | ||
|     public string EmailFromEmail { get; set; } = string.Empty;
 | ||
| 
 | ||
|     [Comment("发件人")]
 | ||
|     public string EmailFromName { get; set; } = string.Empty;
 | ||
| 
 | ||
|     [Comment("密码/授权码")]
 | ||
|     public string EmailAuthorizationCode { get; set; } = string.Empty;
 | ||
| 
 | ||
|     [Comment("SMTP服务器")]
 | ||
|     public string EmailSMTPServerAddress { get; set; } = string.Empty;
 | ||
| 
 | ||
|     [Comment("SMTP端口")]
 | ||
|     public int EmailSMTPServerPort { get; set; }
 | ||
| 
 | ||
|     [Comment("是否配置过邮箱")]
 | ||
|     public bool IsConfigureEmail { get; set; } = false;
 | ||
|     #endregion
 | ||
|     public bool IsPACSConnect { get; set; }
 | ||
| 
 | ||
|     public bool IsTrialPACSConfirmed { get; set; }
 | ||
| 
 | ||
|     [Comment("项目术语配置Json字符串")]
 | ||
|     [StringLength(2000)]
 | ||
|     public List<TrialObjectNameConfig> TrialObjectNameList { get; set; }
 | ||
| 
 | ||
|     [Comment("SPM 参与中心调研")]
 | ||
|     public bool IsSPMJoinSiteSurvey { get; set; }
 | ||
| 
 | ||
|     [Comment("SPM 参与阅片人筛选")]
 | ||
|     public bool IsSPMJoinReviewerSelect { get; set; }
 | ||
| 
 | ||
|     [Comment("SPM 参与重阅审批")]
 | ||
|     public bool IsSPMJoinReReadingApproval { get; set; }
 | ||
| 
 | ||
|     [Comment("阅片任务产生之前 采集影像")]
 | ||
|     public CollectImagesType CollectImagesEnum { get; set; }
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// IQC自动下一个任务
 | ||
|     /// </summary>
 | ||
|     public bool IsIQCAutoNextTask { get; set; }
 | ||
| 
 | ||
|     public bool IsIQCAutoTaskDistinguishType { get; set; }
 | ||
| 
 | ||
| }
 | ||
| 
 | ||
| public enum CollectImagesType
 | ||
| {
 | ||
|     None = 0,
 | ||
| 
 | ||
|     Dicom = 1,
 | ||
| 
 | ||
|     NoneDicom = 2
 | ||
| }
 | ||
| 
 | ||
| /// <summary>
 | ||
| /// 检查名称
 | ||
| /// </summary>
 | ||
| 
 | ||
| [ComplexType]
 | ||
| public class StudyName
 | ||
| {
 | ||
|     /// <summary>
 | ||
|     /// 是否选中
 | ||
|     /// </summary>
 | ||
|     public bool IsChoose { get; set; }
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// 名称
 | ||
|     /// </summary>
 | ||
|     public string Name { get; set; }
 | ||
| 
 | ||
|     /// <summary>
 | ||
|     /// 英文名称
 | ||
|     /// </summary>
 | ||
|     public string EnName { get; set; }
 | ||
| }
 | ||
| 
 | ||
| [ComplexType]
 | ||
| public class TrialObjectNameConfig
 | ||
| {
 | ||
|     public string Name { get; set; }
 | ||
| 
 | ||
|     public string TrialName { get; set; }
 | ||
| 
 | ||
|     public bool IsDefault { get; set; }
 | ||
| } |