阅片导出初步提交

This commit is contained in:
2024-10-10 09:54:48 +08:00
parent 431d2e7a97
commit 1bb62fd134
9 changed files with 987 additions and 241 deletions
@@ -4,6 +4,7 @@ using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Domain.Share;
using MiniExcelLibs.Attributes;
using Newtonsoft.Json;
using Org.BouncyCastle.Asn1.X509;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
@@ -1028,6 +1029,48 @@ namespace IRaCIS.Core.Application.Contracts
}
public class CommonQuesionInfo
{
public string QuestionName { get; set; }
public string QuestionValue { get; set; }
public string TranslateDicName { get; set; }
}
public class CommonEvaluationExport : OverallTumorEvaluationExport
{
public List<CommonQuesionInfo> JudgeQuestionAnswerList { get; set; }
}
public class CommonEvaluationDetailExport : OverallTumorEvaluationExport
{
public List<CommonQuesionInfo> QuestionAnswerList { get; set; }
}
public class DoctorJudgeRatio
{
public Guid? DoctorUserId { get; set; }
public string UserName { get; set; }
public string FullName { get; set; }
public int TotalJudgeCount { get; set; }
public int JudgeAgreeCount { get; set; }
public string JudgeRatioStr => TotalJudgeCount == 0 ? $"NA" : $"{Math.Round((decimal)JudgeAgreeCount * 100 / TotalJudgeCount, 2)}%";
public string ExceptionMark => TotalJudgeCount == 0 ? $"Y" : (JudgeAgreeCount * 3 / TotalJudgeCount < 1) ? "Y" : "N";
}
public class OverallTumorEvaluationExport
{
public String TrialSiteCode { get; set; } = String.Empty;
@@ -1053,30 +1096,37 @@ namespace IRaCIS.Core.Application.Contracts
public ReadingCategory ReadingCategory { get; set; }
[DictionaryTranslateAttribute("ExistDisease", CriterionType.Lugano2014, nameof(OverallTumorEvaluationExport.IsBaseline), "true")]
[DictionaryTranslateAttribute("ImagingOverallAssessment_Lugano", CriterionType.Lugano2014, nameof(OverallTumorEvaluationExport.IsBaseline), "false")]
[DictionaryTranslateAttribute("ExistDisease", CriterionType.Lugano2014WithoutPET, nameof(OverallTumorEvaluationExport.IsBaseline), "true")]
[DictionaryTranslateAttribute("ImagingOverallAssessment_Lugano", CriterionType.Lugano2014WithoutPET, nameof(OverallTumorEvaluationExport.IsBaseline), "false")]
[DictionaryTranslateAttribute("ExistDisease", CriterionType.IRECIST1Point1, nameof(OverallTumorEvaluationExport.IsBaseline), "true")]
[DictionaryTranslateAttribute("OverallAssessment", CriterionType.IRECIST1Point1, nameof(OverallTumorEvaluationExport.IsBaseline), "false")]
[DictionaryTranslateAttribute("ExistDisease", CriterionType.RECIST1Pointt1_MB, nameof(OverallTumorEvaluationExport.IsBaseline), "true")]
[DictionaryTranslateAttribute("OverallAssessment", CriterionType.RECIST1Pointt1_MB, nameof(OverallTumorEvaluationExport.IsBaseline), "false")]
[DictionaryTranslateAttribute("ExistDisease", CriterionType.RECIST1Point1, nameof(OverallTumorEvaluationExport.IsBaseline), "true")]
[DictionaryTranslateAttribute("OverallAssessment", CriterionType.RECIST1Point1, nameof(OverallTumorEvaluationExport.IsBaseline), "false")]
[DictionaryTranslateAttribute("VisitTumorEvaluation", CriterionType.PCWG3)]
//整体肿瘤评估结果 需要翻译
public string OverallTumorEvaluationResult { get; set; }
//裁判结果选择的访视或者全局任务Id
public Arm? JudgeArmEnum { get; set; }
//public Guid? JudgeResultTaskId { get; set; }
//裁判选择标记
//根据裁判的任务结果 设置访视任务的这个字段 该字段表示 裁判认同该任务的结果
[DictionaryTranslateAttribute("YesOrNo")]
public bool? IsGenerateJudge { get; set; }
public bool? IsJudgeSelect { get; set; }
//[JsonIgnore]
//在当前访视触发裁判,或者在截止日期小于等于当前访视的阅片期触发裁判
public bool IsTrigerJudge { get; set; }
//public List<GlobalAnswerInfo> GlobalTaskAnswerList { get; set; }
//(如果是访视点裁判,则仅在所选阅片人对应访视 显示;如果是阅片期裁判,则在所选阅片人 阅片期内的所有访视 显示此原因)
public string JudgeNote { get; set; } = string.Empty;
public string VisitNote { get; set; }
}
public class GlobalAnswerInfo
@@ -1091,22 +1141,89 @@ namespace IRaCIS.Core.Application.Contracts
public class RECIST1Point1EvaluationOfTumorEfficacyExport : OverallTumorEvaluationExport
{
[DictionaryTranslateAttribute("TargetAssessment", CriterionType.RECIST1Pointt1_MB)]
[DictionaryTranslateAttribute("TargetAssessment", CriterionType.RECIST1Point1)]
// 靶病灶评估
public string TargetlesionEvaluationResult { get; set; }
[DictionaryTranslateAttribute("NoTargetAssessment", CriterionType.RECIST1Pointt1_MB)]
[DictionaryTranslateAttribute("NoTargetAssessment", CriterionType.RECIST1Point1)]
// 非靶病灶评估
public string NoneTargetlesionEvaluationResult { get; set; }
// 是否存在新病灶
[DictionaryTranslateAttribute("NewLesionAssessment", CriterionType.RECIST1Pointt1_MB)]
[DictionaryTranslateAttribute("NewLesionAssessment", CriterionType.RECIST1Point1)]
public string IsExistNewlesionEvaluationResult { get; set; }
}
public class Lugano2014EvaluationOfTumorEfficacyExport : OverallTumorEvaluationExport
{
[DictionaryTranslateAttribute("TargetAssessment", CriterionType.Lugano2014)]
public string TargetlesionEvaluationResult { get; set; }
[DictionaryTranslateAttribute("NoTargetAssessment", CriterionType.Lugano2014)]
public string NoneTargetlesionEvaluationResult { get; set; }
[DictionaryTranslateAttribute("NewLesionAssessment", CriterionType.Lugano2014)]
public string IsExistNewlesionEvaluationResult { get; set; }
//肝脏评估
[DictionaryTranslateAttribute("LiverState", CriterionType.Lugano2014)]
public string LiverResponse { get; set; }
//脾脏评估
[DictionaryTranslateAttribute("SpleenAssessment", CriterionType.Lugano2014)]
public string SpleenResponse { get; set; }
//CT/MRI总体评估
[DictionaryTranslateAttribute("CT-MRIOverallAssessment", CriterionType.Lugano2014)]
public string CT_MRI_OverallResponse { get; set; }
//FDG-PET总体评估
[DictionaryTranslateAttribute("FDG-PETOverallAssessment", CriterionType.Lugano2014)]
public string FDG_PET_OverallResponse { get; set; }
}
public class IRECIST1Point1EvaluationOfTumorEfficacyExport : OverallTumorEvaluationExport
{
[DictionaryTranslateAttribute("TargetAssessment", CriterionType.IRECIST1Point1)]
// 靶病灶评估
public string TargetlesionEvaluationResult { get; set; }
[DictionaryTranslateAttribute("NoTargetAssessment", CriterionType.IRECIST1Point1)]
// 非靶病灶评估
public string NoneTargetlesionEvaluationResult { get; set; }
// 是否存在新病灶
[DictionaryTranslateAttribute("NewLesionAssessment", CriterionType.IRECIST1Point1)]
public string IsExistNewlesionEvaluationResult { get; set; }
[DictionaryTranslateAttribute("NewLesionAssessment", CriterionType.IRECIST1Point1)]
public string NewTargetResponse { get; set; }
[DictionaryTranslateAttribute("NewLesionAssessment", CriterionType.IRECIST1Point1)]
public string NewNoneTargetResponse { get; set; }
[DictionaryTranslateAttribute("NewLesionAssessment", CriterionType.IRECIST1Point1)]
public string OtherPreviousNewlesionsResponse { get; set; }
//存在触发iRECIST后新病灶
[DictionaryTranslateAttribute("NewLesionAssessment", CriterionType.IRECIST1Point1)]
public string IsExistNewlesionsAfterTriggeringIRECIST { get; set; }
}
public class PCWG3LessionInfo
{
//病灶编号
@@ -18,6 +18,8 @@ namespace IRaCIS.Core.Application.Service
var isEn_Us = false;
CreateMap<Trial, ReadingPeriodJudgeExportInfo>();
CreateMap<Trial, VisitJudgeExportInfo>();
CreateMap<Trial, ExcelExportInfo>();
CreateMap<SubjectVisit, CRCVisitExportDTO>()
.ForMember(d => d.TrialSiteCode, u => u.MapFrom(s => s.TrialSite.TrialSiteCode))
@@ -193,38 +195,107 @@ namespace IRaCIS.Core.Application.Service
CreateMap<VisitTask, GroupAnalysisExport>().IncludeBase<VisitTask, AnalysisExortCommon>();
CreateMap<VisitTask, SelftAnalysisExport>().IncludeBase<VisitTask, AnalysisExortCommon>();
Guid trialReadingCriterionId = Guid.Empty;
ArbitrationRule? arbitrationRule = null;
CriterionType? criterionType = null;
CreateMap<VisitTask, OverallTumorEvaluationExport>()
// .ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName))
.ForMember(o => o.IsBaseline, t => t.MapFrom(u => u.SourceSubjectVisit.IsBaseLine))
.ForMember(o => o.JudgeArmEnum, t => t.MapFrom(u => u.JudgeResultTask.ArmEnum))
.ForMember(o => o.JudgeArmEnum, t => t.MapFrom(u => u.JudgeResultTask.ArmEnum))
.ForMember(o => o.IsTrigerJudge, t => t.MapFrom(u => arbitrationRule == ArbitrationRule.Visit ? u.JudgeResultTaskId != null :
(arbitrationRule == ArbitrationRule.Reading ?
u.Subject.SubjectVisitTaskList.Any(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Judge && t.TrialReadingCriterionId == trialReadingCriterionId && u.VisitTaskNum < t.VisitTaskNum) :
false)))
.ForMember(o => o.JudgeNote, t => t.MapFrom(u => u.JudgeResultRemark))
.ForMember(o => o.VisitNote, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.AdjustReason).FirstOrDefault()!.Answer))
.ForMember(o => o.OverallTumorEvaluationResult, t => t.MapFrom(u =>
criterionType == CriterionType.RECIST1Point1 ? (u.SourceSubjectVisit.IsBaseLine == true ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault()!.Answer :
criterionType == CriterionType.PCWG3 ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstOrDefault()!.Answer :
(u.SourceSubjectVisit.IsBaseLine == true ?
u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault()!.Answer :
u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).Select(t => t.IsGlobalChange ? t.GlobalChangeAnswer : t.Answer).FirstOrDefault())
: criterionType == CriterionType.PCWG3 ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.SiteVisitForTumorEvaluation).FirstOrDefault()!.Answer : String.Empty
))
.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode))
.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code))
.ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName))
//.ForMember(o => o.GlobalTaskAnswerList, t => t.MapFrom(u => u.GlobalVisitResultList.Where(t=>t.GlobalAnswerType== GlobalAnswerType.Question).Select(c=>new GlobalAnswerInfo() { GlobalTaskVisitNum=c.VisitTask.VisitTaskNum,VisitTaskId=c.TaskId ,Answer=c.Answer})))
.ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName));
CreateMap<VisitTask, CommonEvaluationExport>()
.ForMember(o => o.IsBaseline, t => t.MapFrom(u => u.SourceSubjectVisit.IsBaseLine))
.ForMember(o => o.JudgeArmEnum, t => t.MapFrom(u => u.JudgeResultTask.ArmEnum))
.ForMember(o => o.IsTrigerJudge, t => t.MapFrom(u => arbitrationRule == ArbitrationRule.Visit ? u.JudgeResultTaskId != null :
(arbitrationRule == ArbitrationRule.Reading ?
u.Subject.SubjectVisitTaskList.Any(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Judge && t.TrialReadingCriterionId == trialReadingCriterionId && u.VisitTaskNum < t.VisitTaskNum) :
false)))
.ForMember(o => o.JudgeNote, t => t.MapFrom(u => u.JudgeResultRemark))
.ForMember(o => o.VisitNote, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.AdjustReason).FirstOrDefault()!.Answer))
.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode))
.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code))
.ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName))
.ForMember(o => o.JudgeQuestionAnswerList, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(k => k.ReadingQuestionTrial.ShowOrder)
.Select(c => new CommonQuesionInfo()
{
QuestionName = isEn_Us ? c.ReadingQuestionTrial.QuestionEnName : c.ReadingQuestionTrial.QuestionName,
QuestionValue = c.Answer,
TranslateDicName = c.ReadingQuestionTrial.DictionaryCode
})));
CreateMap<VisitTask, CommonEvaluationDetailExport>()
.ForMember(o => o.IsBaseline, t => t.MapFrom(u => u.SourceSubjectVisit.IsBaseLine))
.ForMember(o => o.JudgeArmEnum, t => t.MapFrom(u => u.JudgeResultTask.ArmEnum))
.ForMember(o => o.IsTrigerJudge, t => t.MapFrom(u => arbitrationRule == ArbitrationRule.Visit ? u.JudgeResultTaskId != null :
(arbitrationRule == ArbitrationRule.Reading ?
u.Subject.SubjectVisitTaskList.Any(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Judge && t.TrialReadingCriterionId == trialReadingCriterionId && u.VisitTaskNum < t.VisitTaskNum) :
false)))
.ForMember(o => o.JudgeNote, t => t.MapFrom(u => u.JudgeResultRemark))
.ForMember(o => o.VisitNote, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.AdjustReason).FirstOrDefault()!.Answer))
.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode))
.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code))
.ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName))
.ForMember(o => o.QuestionAnswerList, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.IsJudgeQuestion).OrderBy(k => k.ReadingQuestionTrial.ShowOrder)
.Select(c => new CommonQuesionInfo()
{
QuestionName = isEn_Us ? c.ReadingQuestionTrial.QuestionEnName : c.ReadingQuestionTrial.QuestionName,
QuestionValue = c.Answer,
TranslateDicName = c.ReadingQuestionTrial.DictionaryCode
})));
;
CreateMap<VisitTask, RECIST1Point1EvaluationOfTumorEfficacyExport>().IncludeBase<VisitTask, OverallTumorEvaluationExport>()
.ForMember(o => o.TargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.TargetLesion).FirstOrDefault()!.Answer))
.ForMember(o => o.NoneTargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NoTargetLesion).FirstOrDefault()!.Answer))
.ForMember(o => o.IsExistNewlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NewLesions).FirstOrDefault()!.Answer))
//.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode))
//.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code))
//.ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName))
;
CreateMap<VisitTask, IRECIST1Point1EvaluationOfTumorEfficacyExport>().IncludeBase<VisitTask, OverallTumorEvaluationExport>()
.ForMember(o => o.TargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.TargetLesion).FirstOrDefault()!.Answer))
.ForMember(o => o.NoneTargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NoTargetLesion).FirstOrDefault()!.Answer))
.ForMember(o => o.IsExistNewlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NewLesions).FirstOrDefault()!.Answer))
.ForMember(o => o.NewTargetResponse, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NewTargetLesion).FirstOrDefault()!.Answer))
.ForMember(o => o.NewNoneTargetResponse, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NewNoTargetLesion).FirstOrDefault()!.Answer))
.ForMember(o => o.OtherPreviousNewlesionsResponse, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.OtherNewTargetLesion).FirstOrDefault()!.Answer))
.ForMember(o => o.IsExistNewlesionsAfterTriggeringIRECIST, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.IRECISTNewTargetLesion).FirstOrDefault()!.Answer))
;
CreateMap<VisitTask, Lugano2014EvaluationOfTumorEfficacyExport>().IncludeBase<VisitTask, OverallTumorEvaluationExport>()
.ForMember(o => o.TargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.TargetLesion).FirstOrDefault()!.Answer))
.ForMember(o => o.NoneTargetlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NoTargetLesion).FirstOrDefault()!.Answer))
.ForMember(o => o.IsExistNewlesionEvaluationResult, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.NewLesions).FirstOrDefault()!.Answer))
.ForMember(o => o.LiverResponse, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.LiverAssessment).FirstOrDefault()!.Answer))
.ForMember(o => o.SpleenResponse, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.SplenicEvaluation).FirstOrDefault()!.Answer))
.ForMember(o => o.CT_MRI_OverallResponse, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.CTandMRI).FirstOrDefault()!.Answer))
.ForMember(o => o.FDG_PET_OverallResponse, t => t.MapFrom(u => u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.FDGPET).FirstOrDefault()!.Answer))
;
CreateMap<VisitTask, RECIST1Point1DetailedOfEvaluatedLesionExport>().IncludeBase<VisitTask, RECIST1Point1EvaluationOfTumorEfficacyExport>()