diff --git a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs index ca144f0c6..f27c9c3c4 100644 --- a/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs +++ b/IRaCIS.Core.Application/Service/Common/ExcelExportService.cs @@ -1,4 +1,5 @@ using DocumentFormat.OpenXml.Office2010.ExcelAc; +using DocumentFormat.OpenXml.Presentation; using DocumentFormat.OpenXml.Spreadsheet; using IRaCIS.Application.Contracts; using IRaCIS.Application.Interfaces; @@ -159,7 +160,7 @@ namespace IRaCIS.Core.Application.Service.Common exportInfo.List = list; - return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository , _hostEnvironment, _dictionaryService, typeof(SubjectExportDTO)); + return await ExcelExportHelper.DataExportAsync(StaticData.Export.TrialSubjectList_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(SubjectExportDTO)); } @@ -235,15 +236,15 @@ namespace IRaCIS.Core.Application.Service.Common IsFinalVisit = t.IsFinalVisit, IsLostVisit = t.IsLostVisit, ReadingStatus = - t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId==dto.TrialReadingCriterionId && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == (int)trialReadingCriterion.ReadingType ? + t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == dto.TrialReadingCriterionId && t.TaskAllocationState == TaskAllocationState.Allocated && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == (int)trialReadingCriterion.ReadingType ? ReadingStatusEnum.ReadCompleted : t.VisitTaskList.Where(t => t.TaskState == TaskState.Effect && t.TrialReadingCriterionId == dto.TrialReadingCriterionId && t.IsAnalysisCreate == false && t.ReadingCategory == ReadingCategory.Visit && t.TaskAllocationState == TaskAllocationState.Allocated).Count() == (int)trialReadingCriterion.ReadingType ? ReadingStatusEnum.ImageReading : t.ReadingStatus }).ToList(), - ModuleList = subject.ReadModuleList.Where(t=>t.TrialReadingCriterionId==dto.TrialReadingCriterionId).Select(t => new SubjectProgressDto.MouduleProgress() + ModuleList = subject.ReadModuleList.Where(t => t.TrialReadingCriterionId == dto.TrialReadingCriterionId).Select(t => new SubjectProgressDto.MouduleProgress() { TaskName = t.ModuleName, - VisitTaskNum = (t.ReadingSetType == ReadingSetType.ImageReading ? ReadingCommon.TaskNumDic[ReadingCategory.Global] : ReadingCommon.TaskNumDic[ReadingCategory.Oncology]) + t.SubjectVisit.VisitNum, + VisitTaskNum = (t.ReadingSetType == ReadingSetType.ImageReading ? ReadingCommon.TaskNumDic[ReadingCategory.Global] : ReadingCommon.TaskNumDic[ReadingCategory.Oncology]) + t.SubjectVisit.VisitNum, ReadingSetType = t.ReadingSetType, ReadingStatus = t.ModuleTaskList.Where(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && (t.ReadingCategory == ReadingCategory.Oncology || t.ReadingCategory == ReadingCategory.Global) && t.ReadingTaskState == ReadingTaskState.HaveSigned).Count() == (int)trialReadingCriterion.ReadingType ? ReadingStatusEnum.ReadCompleted : t.ModuleTaskList.Where(t => t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && (t.ReadingCategory == ReadingCategory.Oncology || t.ReadingCategory == ReadingCategory.Global) && t.TaskAllocationState == TaskAllocationState.Allocated).Count() == (int)trialReadingCriterion.ReadingType ? @@ -262,7 +263,7 @@ namespace IRaCIS.Core.Application.Service.Common var exportInfo = (await _trialRepository.Where(t => t.Id == dto.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); - exportInfo.CriterionName = await _repository.Where(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId).Select(t=>t.CriterionName).FirstOrDefaultAsync(); + exportInfo.CriterionName = await _repository.Where(u => u.TrialId == dto.TrialId && u.IsConfirm && u.Id == dto.TrialReadingCriterionId).Select(t => t.CriterionName).FirstOrDefaultAsync(); exportInfo.List = list; @@ -385,7 +386,7 @@ namespace IRaCIS.Core.Application.Service.Common UploadFinishedTime = t.UploadFinishedTime, - ArchiveFinishedTime=t.ArchiveFinishedTime, + ArchiveFinishedTime = t.ArchiveFinishedTime, UploadTime = t.CreateTime, @@ -738,7 +739,7 @@ namespace IRaCIS.Core.Application.Service.Common var subjectQuerybal = _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsSelfAnalysis == true).Select(t => t.SubjectId).Distinct(); var allList = await _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && subjectQuerybal.Contains(t.SubjectId) && t.ReadingCategory == ReadingCategory.Visit) - .Where(t => (t.IsSelfAnalysis == true || t.IsSelfAnalysis == null)&& t.VisitTaskNum>0) //一致性分析的结果 + 正常任务的结果 + 仅仅访视的结果 +去除基线 + .Where(t => (t.IsSelfAnalysis == true || t.IsSelfAnalysis == null) && t.VisitTaskNum > 0) //一致性分析的结果 + 正常任务的结果 + 仅仅访视的结果 +去除基线 //.WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId) //.WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState) @@ -812,7 +813,7 @@ namespace IRaCIS.Core.Application.Service.Common if (criterion.CriterionType != CriterionType.RECIST1Point1) { -//---当前标准导出还未支持 + //---当前标准导出还未支持 throw new Exception(_localizer["ExcelExport_UnsupportedExport"]); } @@ -938,7 +939,7 @@ namespace IRaCIS.Core.Application.Service.Common list.Add(new ExportDocumentDes() { Code = StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); } - if(criterion.CriterionType == CriterionType.PCWG3) + if (criterion.CriterionType == CriterionType.PCWG3) { list.Add(new ExportDocumentDes() { Code = StaticData.Export.OverallTumorEvaluation_Export, ExportCatogory = ExportCatogory.OverallTumorEvaluation }); list.Add(new ExportDocumentDes() { Code = StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, ExportCatogory = ExportCatogory.DetailedOfEvaluatedLesion }); @@ -950,9 +951,37 @@ namespace IRaCIS.Core.Application.Service.Common { item.FileName = result.Where(t => t.Code == item.Code).FirstOrDefault()?.FileName; } - return list; + } + public List DealJudgeMark(ArbitrationRule arbitrationRule, IEnumerable list) where T : OverallTumorEvaluationExport + { + //处理裁判标记 + + { + var resultList = list.Where(t => t.ReadingCategory != ReadingCategory.Judge).ToList(); + + if (arbitrationRule == ArbitrationRule.Visit) + { + + foreach (var item in resultList) + { + item.IsGenerateJudge = list.FirstOrDefault(t => t.ReadingCategory == ReadingCategory.Judge && t.SubjectCode == item.SubjectCode + && (t.VisitTaskNum - ReadingCommon.TaskNumDic[ReadingCategory.Judge]) == item.VisitTaskNum)?.JudgeArmEnum == item.ArmEnum ? true : false; + } + + } + if (arbitrationRule == ArbitrationRule.Reading) + { + foreach (var item in resultList) + { + item.IsGenerateJudge = list.Where(t => t.ReadingCategory == ReadingCategory.Judge && t.SubjectCode == item.SubjectCode + ).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault()?.JudgeArmEnum == item.ArmEnum ? true : false; + } + } + + return resultList; + } } @@ -976,11 +1005,11 @@ namespace IRaCIS.Core.Application.Service.Common //每次查询必须是单标准的 - var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstNotNullAsync(); + var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstNotNullAsync(); if (criterion.CriterionType != CriterionType.RECIST1Point1 && criterion.CriterionType != CriterionType.PCWG3) { -//---当前标准导出还未支持 + //---当前标准导出还未支持 throw new Exception(_localizer["ExcelExport_UnsupportedExport"]); } @@ -1006,11 +1035,14 @@ namespace IRaCIS.Core.Application.Service.Common .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1)) .ProjectTo(_mapper.ConfigurationProvider, new { criterionType = criterion.CriterionType }).ToListAsync(); - list= list.OrderBy(t=>t.SubjectCode).ThenBy(t=>t.VisitTaskNum).ToList(); + list = list.OrderBy(t => t.SubjectCode).ThenBy(t => t.VisitTaskNum).ToList(); var exportInfo = (await _trialRepository.Where(t => t.Id == queryVisitTask.TrialId).IgnoreQueryFilters().ProjectTo(_mapper.ConfigurationProvider).FirstOrDefaultAsync()).IfNullThrowException(); exportInfo.CriterionName = criterion.CriterionName; + //处理裁判标记 + list = DealJudgeMark(criterion.ArbitrationRule, list); + exportInfo.List = list; @@ -1034,7 +1066,7 @@ namespace IRaCIS.Core.Application.Service.Common { //每次查询必须是单标准的 - var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName} ).FirstOrDefaultAsync(); + var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName, t.ArbitrationRule }).FirstOrDefaultAsync(); var query = _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned) @@ -1064,14 +1096,18 @@ namespace IRaCIS.Core.Application.Service.Common { var list = await query.ProjectTo(_mapper.ConfigurationProvider, new { criterionType = criterion.CriterionType }).ToListAsync(); + //处理裁判标记 + list = DealJudgeMark(criterion.ArbitrationRule, list); + exportInfo.List = list; + return await ExcelExportHelper.DataExportAsync(StaticData.Export.RECIST1Point1EvaluationOfTumorEfficacy_Export, exportInfo, $"{exportInfo.ResearchProgramNo}_{exportInfo.CriterionName}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1EvaluationOfTumorEfficacyExport), criterion.CriterionType); } else { -//---当前标准导出还未支持 + //---当前标准导出还未支持 throw new Exception(_localizer["ExcelExport_UnsupportedExport"]); } @@ -1095,7 +1131,7 @@ namespace IRaCIS.Core.Application.Service.Common { //每次查询必须是单标准的 - var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName }).FirstOrDefaultAsync(); + var criterion = await _repository.Where(t => t.Id == queryVisitTask.TrialReadingCriterionId).Select(t => new { t.CriterionType, t.CriterionName,t.ArbitrationRule }).FirstOrDefaultAsync(); var query = _repository.Where(t => t.TrialId == queryVisitTask.TrialId && t.TaskState == TaskState.Effect && t.IsAnalysisCreate == false && t.ReadingTaskState == ReadingTaskState.HaveSigned) @@ -1150,6 +1186,8 @@ namespace IRaCIS.Core.Application.Service.Common }); }).ToList(); + //处理裁判标记 + list = DealJudgeMark(criterion.ArbitrationRule, list); exportInfo.List = exportList; return await ExcelExportHelper.DataExportAsync(StaticData.Export.RECIST1Point1DetailedOfEvaluatedLesion_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(RECIST1Point1DetailedOfEvaluatedLesionExport), criterion.CriterionType); @@ -1180,6 +1218,8 @@ namespace IRaCIS.Core.Application.Service.Common }); }).ToList(); + //处理裁判标记 + list = DealJudgeMark(criterion.ArbitrationRule, list); exportInfo.List = exportList; return await ExcelExportHelper.DataExportAsync(StaticData.Export.PCWG3Point1DetailedOfEvaluatedLesion_Export, exportInfo, $"{exportInfo.ResearchProgramNo}", _commonDocumentRepository, _hostEnvironment, _dictionaryService, typeof(PCWG3DetailedOfEvaluatedLesionExport), criterion.CriterionType); @@ -1188,7 +1228,7 @@ namespace IRaCIS.Core.Application.Service.Common else { -//---当前标准导出还未支持 + //---当前标准导出还未支持 throw new Exception(_localizer["ExcelExport_UnsupportedExport"]); } diff --git a/IRaCIS.Core.Application/Service/Fixed/CriterionAdditionalAssessment.cs b/IRaCIS.Core.Application/Service/Fixed/CriterionAdditionalAssessment.cs index 619b10fbe..1a745d64d 100644 --- a/IRaCIS.Core.Application/Service/Fixed/CriterionAdditionalAssessment.cs +++ b/IRaCIS.Core.Application/Service/Fixed/CriterionAdditionalAssessment.cs @@ -20,25 +20,26 @@ namespace IRaCIS.Core.Application.Service public AdditionalAssessmentType AdditionalAssessmentType { get; set; } //附加评估问题 - public List AdditionalQuestionList { get; set; }=new List(); + public List AdditionalQuestionList { get; set; } = new List(); } - public class AdditionalAssessment + public class AdditionalAssessment { - public List SystemDefeaultAdditionalAssessmentList { get; set; } = new List(); + public List SystemDefeaultAdditionalAssessmentList { get; set; } = new List(); public AdditionalAssessment() { - - var gropId = NewId.NextGuid(); //Resist1.1 脑转移 默认评估问题 - SystemDefeaultAdditionalAssessmentList.Add(new CriterionAdditionalAssessment() { - CriterionType = CriterionType.RECIST1Point1, - AdditionalAssessmentType = AdditionalAssessmentType.BrainMetastasis, - AdditionalQuestionList = new List(){ + var gropId = NewId.NextGuid(); + + SystemDefeaultAdditionalAssessmentList.Add(new CriterionAdditionalAssessment() + { + CriterionType = CriterionType.RECIST1Point1, + AdditionalAssessmentType = AdditionalAssessmentType.BrainMetastasis, + AdditionalQuestionList = new List(){ new ReadingQuestionTrial() { @@ -47,7 +48,7 @@ namespace IRaCIS.Core.Application.Service IsJudgeQuestion=false, IsShowInDicom=false, GlobalReadingShowType=GlobalReadingShowType.NotShow, - + QuestionName="脑转移评估", QuestionEnName="Brain Metastasis Assessment", GroupName="脑转移评估", @@ -76,20 +77,79 @@ namespace IRaCIS.Core.Application.Service DataSource=DataSources.ManualEntry, ShowQuestion=ShowQuestion.Show, - + IsAdditional=true } , - + } - }); + }); + } + + //Resist1.1 TNM分期 + { + + var gropId = NewId.NextGuid(); + + SystemDefeaultAdditionalAssessmentList.Add(new CriterionAdditionalAssessment() + { + CriterionType = CriterionType.RECIST1Point1, + AdditionalAssessmentType = AdditionalAssessmentType.TNMStage, + AdditionalQuestionList = new List(){ + + new ReadingQuestionTrial() + { + LimitEdit=LimitEdit.OnlyBaseLine, + Id=gropId, + IsJudgeQuestion=false, + IsShowInDicom=false, + GlobalReadingShowType=GlobalReadingShowType.NotShow, + + QuestionName="TNM分期评估", + QuestionEnName="TNM Stage Assessment", + GroupName="TNM分期评估", + GroupEnName="TNM Stage Assessment", + Type="group", + QuestionGenre=TableQuestionType.Customize, + DataSource=DataSources.ManualEntry, + ShowQuestion=ShowQuestion.Show, + + + IsAdditional=true + } , + + new ReadingQuestionTrial() + { + GroupId=gropId, + LimitEdit=LimitEdit.OnlyBaseLine, + DictionaryCode="YesOrNoOrNa", + IsJudgeQuestion=false, + IsShowInDicom=false, + GlobalReadingShowType=GlobalReadingShowType.NotShow, + QuestionEnName="Brain metastases present", + QuestionName="存在脑转移", + Type="radio", + QuestionGenre=TableQuestionType.Dictionary, + DataSource=DataSources.ManualEntry, + ShowQuestion=ShowQuestion.Show, + + + IsAdditional=true + } , + + } + }); + } + + + } - public List GetSystemDefeaultAdditionalAssessmentList(CriterionType criterionType, AdditionalAssessmentType? additionalAssessmentType=null) + public List GetSystemDefeaultAdditionalAssessmentList(CriterionType criterionType, AdditionalAssessmentType? additionalAssessmentType = null) { return SystemDefeaultAdditionalAssessmentList.Where(t => t.CriterionType == criterionType) - .WhereIf(additionalAssessmentType!=null,t=>t.AdditionalAssessmentType==additionalAssessmentType).ToList(); + .WhereIf(additionalAssessmentType != null, t => t.AdditionalAssessmentType == additionalAssessmentType).ToList(); } } diff --git a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs index 2482f739b..62745fb05 100644 --- a/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs +++ b/IRaCIS.Core.Application/Service/QC/DTO/QCListViewModel.cs @@ -836,6 +836,7 @@ namespace IRaCIS.Core.Application.Contracts public Arm ArmEnum { get; set; } public string UserName { get; set; } + public ReadingCategory ReadingCategory { get; set; } [DictionaryTranslateAttribute("ExistDisease", CriterionType.RECIST1Point1, nameof(OverallTumorEvaluationExport.IsBaseline), "true")] [DictionaryTranslateAttribute("OverallAssessment", CriterionType.RECIST1Point1, nameof(OverallTumorEvaluationExport.IsBaseline), "false")] @@ -844,11 +845,22 @@ namespace IRaCIS.Core.Application.Contracts //整体肿瘤评估结果 需要翻译 public string OverallTumorEvaluationResult { get; set; } - public Guid? JudgeResultTaskId { get; set; } + #region old 废弃 + + //public Guid? JudgeResultTaskId { get; set; } + + //[DictionaryTranslateAttribute("YesOrNo")] + //public bool IsGenerateJudge => JudgeResultTaskId != null; + #endregion + + + public Arm? JudgeArmEnum { get; set; } + + + //根据裁判的任务结果 设置访视任务的这个字段 该字段表示 裁判认同该任务的结果 [DictionaryTranslateAttribute("YesOrNo")] - public bool IsGenerateJudge => JudgeResultTaskId != null; - + public bool IsGenerateJudge { get; set; } } diff --git a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs index dbd55a6fa..b220da1c1 100644 --- a/IRaCIS.Core.Application/Service/QC/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/QC/_MapConfig.cs @@ -172,6 +172,8 @@ namespace IRaCIS.Core.Application.Service // .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.OverallTumorEvaluationResult, t => t.MapFrom(u => criterionType == CriterionType.RECIST1Point1 ?( u.SourceSubjectVisit.IsBaseLine==true ? u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.ExistDisease).FirstOrDefault().Answer: u.ReadingTaskQuestionAnswerList.Where(c => c.ReadingQuestionTrial.QuestionType == QuestionType.Tumor).FirstOrDefault().Answer) diff --git a/IRaCIS.Core.Domain.Share/Reading/UrgentType.cs b/IRaCIS.Core.Domain.Share/Reading/UrgentType.cs index 06788ce7d..4950d4ece 100644 --- a/IRaCIS.Core.Domain.Share/Reading/UrgentType.cs +++ b/IRaCIS.Core.Domain.Share/Reading/UrgentType.cs @@ -33,8 +33,13 @@ namespace IRaCIS.Core.Domain.Share.Reading //TNM分期 - TNM = 2 + TNMStage = 2, + //骨转移 + BoneMetastasis = 3, + + //手术期 + SurgicalPeriod = 4, } ///