From 0e55c50d4c32c5b15dee4f159150abfc1f7f6722 Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Mon, 6 Mar 2023 13:09:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=BB=E5=8A=A1=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Allocation/DTO/VisitTaskViewModel.cs | 2 +- .../Service/Allocation/VisitTaskService.cs | 64 +++-- .../ConsistencyVerificationHandler.cs | 270 ++++++++++-------- IRaCIS.Core.Domain/Allocation/VisitTask.cs | 2 + 4 files changed, 197 insertions(+), 141 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs index 462e238d1..f10194f6a 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs @@ -265,7 +265,7 @@ namespace IRaCIS.Core.Application.ViewModel public bool ExistReadingApply { get; set; } - public DateTime? SuggesteFinishedTime => UnReadTaskList.Max(t => t.SuggesteFinishedTime); + public DateTime? SuggesteFinishedTime { get; set; } public List UnReadCanReadTaskList => UnReadTaskList.Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true)).ToList(); diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index 4019c776b..e783aae80 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -15,6 +15,11 @@ using IRaCIS.Core.Infra.EFCore.Common; using System.Linq.Expressions; using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Filter; +using DocumentFormat.OpenXml.Office2010.Word; +using System.Linq.Dynamic.Core; +using System.Linq; +using DocumentFormat.OpenXml.Bibliography; +using Org.BouncyCastle.Crypto; namespace IRaCIS.Core.Application.Service.Allocation { @@ -82,7 +87,7 @@ namespace IRaCIS.Core.Application.Service.Allocation }); - return await _visitTaskRepository.SaveChangesAsync(); + return await _visitTaskRepository.SaveChangesAsync(); } public async Task> GetTrialCriterionList(Guid trialId, bool isHaveSigned = true) @@ -710,7 +715,7 @@ namespace IRaCIS.Core.Application.Service.Allocation public async Task/*, object?)*/> GetReadingTaskList(VisitTaskQuery queryVisitTask) { var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false) - //.Where(t => t.IsAnalysisCreate == false && t.DoctorUserId != null) + //.Where(t => t.IsAnalysisCreate == false && t.DoctorUserId != null) .WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState) .WhereIf(queryVisitTask.SiteId != null, t => t.Subject.SiteId == queryVisitTask.SiteId) @@ -723,8 +728,8 @@ namespace IRaCIS.Core.Application.Service.Allocation .WhereIf(queryVisitTask.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == queryVisitTask.TrialReadingCriterionId) .WhereIf(queryVisitTask.ReReadingApplyState != null, t => t.ReReadingApplyState == queryVisitTask.ReReadingApplyState) - .WhereIf(queryVisitTask.CompleteClinicalDataEnum == CompleteClinicalDataEnum.Complete , t => t.IsClinicalDataSign && t.IsNeedClinicalDataSign == true) - .WhereIf(queryVisitTask.CompleteClinicalDataEnum == CompleteClinicalDataEnum.NotComplete, t => t.IsClinicalDataSign==false && t.IsNeedClinicalDataSign==true) + .WhereIf(queryVisitTask.CompleteClinicalDataEnum == CompleteClinicalDataEnum.Complete, t => t.IsClinicalDataSign && t.IsNeedClinicalDataSign == true) + .WhereIf(queryVisitTask.CompleteClinicalDataEnum == CompleteClinicalDataEnum.NotComplete, t => t.IsClinicalDataSign == false && t.IsNeedClinicalDataSign == true) .WhereIf(queryVisitTask.CompleteClinicalDataEnum == CompleteClinicalDataEnum.NA, t => t.IsNeedClinicalDataSign == false) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate == false)) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.TaskName.Contains(queryVisitTask.TaskName) || t.TaskBlindName.Contains(queryVisitTask.TaskName)) @@ -773,10 +778,10 @@ namespace IRaCIS.Core.Application.Service.Allocation .WhereIf(queryVisitTask.RequestReReadingResultEnum != null, t => t.RequestReReadingResultEnum == queryVisitTask.RequestReReadingResultEnum) - + .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.OriginalReReadingTask.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate) || (t.OriginalReReadingTask.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate == false)) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.OriginalReReadingTask.TaskName.Contains(queryVisitTask.TaskName) || t.OriginalReReadingTask.TaskBlindName.Contains(queryVisitTask.TaskName)) - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.OriginalReReadingTask.Subject.Code.Contains(queryVisitTask.SubjectCode)&& t.OriginalReReadingTask.IsAnalysisCreate==false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(queryVisitTask.SubjectCode)&& t.OriginalReReadingTask.IsAnalysisCreate)) + .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.OriginalReReadingTask.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate)) .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime > queryVisitTask.BeginAllocateDate) .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1)) .ProjectTo(_mapper.ConfigurationProvider); @@ -785,7 +790,7 @@ namespace IRaCIS.Core.Application.Service.Allocation var defalutSortArray = new string[] { nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.TaskState), nameof(ReReadingTaskView.RequestReReadingResultEnum) , - nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.IsUrgent) + " desc", + nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.IsUrgent) + " desc", nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.SubjectId),nameof(ReReadingTaskView.OriginalReReadingTask) + "." + nameof(ReReadingTaskView.OriginalReReadingTask.VisitTaskNum) }; @@ -825,7 +830,7 @@ namespace IRaCIS.Core.Application.Service.Allocation .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.OriginalReReadingTask.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate) || (t.OriginalReReadingTask.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate == false)) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.OriginalReReadingTask.TaskName.Contains(queryVisitTask.TaskName) || t.NewReReadingTask.TaskBlindName.Contains(queryVisitTask.TaskName)) - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.OriginalReReadingTask.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate)) + .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.OriginalReReadingTask.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate)) .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime > queryVisitTask.BeginAllocateDate) .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1)) .ProjectTo(_mapper.ConfigurationProvider); @@ -860,7 +865,7 @@ namespace IRaCIS.Core.Application.Service.Allocation .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.OriginalReReadingTask.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate) || (t.OriginalReReadingTask.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.OriginalReReadingTask.IsAnalysisCreate == false)) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.OriginalReReadingTask.TaskName.Contains(queryVisitTask.TaskName) || t.NewReReadingTask.TaskBlindName.Contains(queryVisitTask.TaskName)) - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.OriginalReReadingTask.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate)) + .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.OriginalReReadingTask.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate == false) || (t.OriginalReReadingTask.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.OriginalReReadingTask.IsAnalysisCreate)) .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime > queryVisitTask.BeginAllocateDate) .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.OriginalReReadingTask.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1)) .ProjectTo(_mapper.ConfigurationProvider); @@ -997,6 +1002,9 @@ namespace IRaCIS.Core.Application.Service.Allocation var visitGroupQuery = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect /*&& x.TrialReadingCriterionId== inDto.TrialReadingCriterionId*/) + + //.Where(t => t.VisitTaskNum < t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) ) + .Where(t => t.Subject.SubjectVisitList.Any(t => t.CheckState != CheckStateEnum.CVPassed) ? t.VisitTaskNum < t.Subject.SubjectVisitList.Where(t => t.CheckState != CheckStateEnum.CVPassed).Min(t => t.VisitNum) : true) //满足前序访视不存在 需要签署但是未签署 sql 相当复杂 同时想查询所有未读的统计数字 就无法统计 byzhouhang //但是加字段 IsFrontTaskNeedSignButNotSign 那么签名临床数据的时候,要对该subject 该标准的有效的任务 这个字段需要在签名的时候维护 采取这种方式 统计数字灵活 //.Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)) @@ -1008,8 +1016,10 @@ namespace IRaCIS.Core.Application.Service.Allocation SubjectId = x.Key.SubjectId, SubjectCode = x.Key.BlindSubjectCode == string.Empty ? x.Key.Code : x.Key.BlindSubjectCode, + SuggesteFinishedTime = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).Min(x => x.SuggesteFinishedTime), + //未读任务量 - UnReadTaskCount = x.Where(y => y.TrialReadingCriterionId== trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).Count(), + UnReadTaskCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).Count(), //未读 里可读任务量 UnReadCanReadTaskCount = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned && y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true) @@ -1024,7 +1034,7 @@ namespace IRaCIS.Core.Application.Service.Allocation ExistReadingApply = x.Any(y => y.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed || y.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed), //查出所有未读的 未读的可读的 在这个列表基础上 过滤下 y.IsFrontTaskNeedSignButNotSign==false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true) 这样容易排错 确认这三个字段是否维护有误 - UnReadTaskList = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned ).OrderBy(x => x.VisitTaskNum) + UnReadTaskList = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).OrderBy(x => x.VisitTaskNum) .Select(u => new IRUnreadTaskView() { Id = u.Id, @@ -1035,30 +1045,31 @@ namespace IRaCIS.Core.Application.Service.Allocation SuggesteFinishedTime = u.SuggesteFinishedTime, ReadingCategory = u.ReadingCategory, IsAnalysisCreate = u.IsAnalysisCreate, - ArmEnum= u.ArmEnum, + ArmEnum = u.ArmEnum, TrialReadingCriterionId = u.TrialReadingCriterionId, - IsNeedClinicalDataSign =u.IsNeedClinicalDataSign, - IsClinicalDataSign=u.IsClinicalDataSign, - IsFrontTaskNeedSignButNotSign=u.IsFrontTaskNeedSignButNotSign + IsNeedClinicalDataSign = u.IsNeedClinicalDataSign, + IsClinicalDataSign = u.IsClinicalDataSign, + IsFrontTaskNeedSignButNotSign = u.IsFrontTaskNeedSignButNotSign }) .ToList(), - }).Where(x => x.UnReadCanReadTaskCount > 0).OrderBy(x => x.UnReadCanReadTaskCount); + }).Where(x => x.UnReadCanReadTaskCount > 0)/*.OrderBy(x => x.UnReadCanReadTaskCount)*/; // 有序阅片需要找到最小需要 var count = visitGroupQuery.Count(); - var result = new List(); + + var visitTaskOrderQuery = inDto.Page.Asc ? visitTaskQuery.OrderBy(inDto.Page.SortField) : visitTaskQuery.OrderBy(inDto.Page.SortField + " desc"); if (inDto.Page != null) { - result = await visitTaskQuery + result = await visitTaskOrderQuery .Skip((inDto.Page.PageIndex - 1) * inDto.Page.PageSize) .Take(inDto.Page.PageSize).ToListAsync(); } else { - result = await visitTaskQuery.ToListAsync(); + result = await visitTaskOrderQuery.ToListAsync(); } @@ -1091,7 +1102,7 @@ namespace IRaCIS.Core.Application.Service.Allocation .WhereIf(queryVisitTask.TaskState != null, t => t.TaskState == queryVisitTask.TaskState) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate == false)) .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.TaskName.Contains(queryVisitTask.TaskName) || t.TaskBlindName.Contains(queryVisitTask.TaskName)) - .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate==false) || (t.BlindSubjectCode.Contains(queryVisitTask.SubjectCode)&& t.IsAnalysisCreate)) + .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate)) .WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime > queryVisitTask.BeginAllocateDate) .WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1)) .ProjectTo(_mapper.ConfigurationProvider); @@ -1940,7 +1951,7 @@ namespace IRaCIS.Core.Application.Service.Allocation var criterionConfig = (await _trialReadingCriterionRepository.Where(x => x.Id == task.TrialReadingCriterionId).Select(x => new { x.ReadingTool, x.IsReadingTaskViewInOrder }).FirstOrDefaultAsync()).IfNullThrowException(); - if (task.TaskState != TaskState.Effect || task.ReadingCategory != ReadingCategory.Visit || task.ReadingTaskState == ReadingTaskState.HaveSigned ) + if (task.TaskState != TaskState.Effect || task.ReadingCategory != ReadingCategory.Visit || task.ReadingTaskState == ReadingTaskState.HaveSigned) { return ResponseOutput.NotOk("仅仅允许针对生效、未完成的访视任务进行退回操作,请刷新页面数据"); } @@ -2266,13 +2277,18 @@ namespace IRaCIS.Core.Application.Service.Allocation if (sv.IsBaseLine) { - await _readingClinicalDataReposiotry.UpdatePartialFromQueryAsync(t => t.ReadingId == sv.Id && (t.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject || t.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit),c=>new ReadingClinicalData() { IsSign=false,ReadingClinicalDataState=ReadingClinicalDataStatus.HaveUploaded}); + await _readingClinicalDataReposiotry.UpdatePartialFromQueryAsync(t => t.ReadingId == sv.Id && (t.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject || t.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit), c => new ReadingClinicalData() { IsSign = false, ReadingClinicalDataState = ReadingClinicalDataStatus.HaveUploaded }); } else { - await _readingClinicalDataReposiotry.UpdatePartialFromQueryAsync(t => t.ReadingId == sv.Id && t.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit, c => new ReadingClinicalData() { - IsSign = false, ReadingClinicalDataState =ReadingClinicalDataStatus.HaveUploaded,IsBlind=null,IsComplete=null }); + await _readingClinicalDataReposiotry.UpdatePartialFromQueryAsync(t => t.ReadingId == sv.Id && t.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit, c => new ReadingClinicalData() + { + IsSign = false, + ReadingClinicalDataState = ReadingClinicalDataStatus.HaveUploaded, + IsBlind = null, + IsComplete = null + }); } diff --git a/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs b/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs index 23cf94d5c..927ecf907 100644 --- a/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs +++ b/IRaCIS.Core.Application/_MediatR/Handlers/ConsistencyVerificationHandler.cs @@ -59,7 +59,7 @@ namespace IRaCIS.Core.Application.MediatR.Handlers { SubjectVisitId = sv.Id, SiteCode = trialSite.TrialSiteCode, - StudyDate = study.StudyTime == null?string.Empty: ((DateTime)study.StudyTime).ToString("yyyy-MM-dd"), + StudyDate = study.StudyTime == null ? string.Empty : ((DateTime)study.StudyTime).ToString("yyyy-MM-dd"), StudyId = study.Id, Modality = study.ModalityForEdit, SubjectCode = subject.Code, @@ -81,143 +81,181 @@ namespace IRaCIS.Core.Application.MediatR.Handlers VisitName = sv.VisitName, }; - var dbList = (await dicomQuery.ToListAsync()).Union(await noneDicomQuey.ToListAsync()); + var dbList = (await dicomQuery.ToListAsync()).Union(await noneDicomQuey.ToListAsync()).ToList(); //处理数据库 大小写 dbList.ForEach(t => { t.Modality = t.Modality.ToUpper().Trim(); t.SiteCode = t.SiteCode.ToUpper().Trim(); t.VisitName = t.VisitName.ToUpper().Trim(); t.SubjectCode = t.SubjectCode.ToUpper().Trim(); }); var dbCheckList = _mapper.Map>(dbList); - //按照数据库数据访视分组 - var svGroup = dbList.GroupBy(t => new { t.SubjectVisitId, t.SiteCode, t.SubjectCode, t.VisitName }) - .Select(g => new { g.Key.SubjectCode, g.Key.VisitName, g.Key.SiteCode, g.Key.SubjectVisitId, StudyList = g.ToList() }).ToList(); + ////按照数据库数据访视分组 按照数据库的数据 一个个的访视对比 + //var svGroup = dbList.GroupBy(t => new { t.SubjectVisitId, t.SiteCode, t.SubjectCode, t.VisitName }) + // .Select(g => new { g.Key.SubjectCode, g.Key.VisitName, g.Key.SiteCode, g.Key.SubjectVisitId, StudyList = g.ToList() }).ToList(); - - foreach (var sv in svGroup) + //按照Excel数据访视分组 按照数据库的数据 一个个的访视对比 + var svExcelGroup = etcList.GroupBy(t => new { t.SiteCode, t.SubjectCode, t.VisitName }) + .Select(g => new { g.Key.SubjectCode, g.Key.VisitName, g.Key.SiteCode, ExcelStudyList = g.ToList() }).ToList(); + + + foreach (var sv in svExcelGroup) { - //找到etc 当前visit site 和subject 一致的检查列表 - var etcVisitStudyList = etcList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList(); - var dbVisitStudyList = dbCheckList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList(); - - - StringBuilder dialogMsg = new StringBuilder(); - dialogMsg.Append("您好,根据本系统自动识别,该受试者当前访视在IRC系统中已提交的影像检查情况如下:"); - var num = 0; - List paramInfoList = new List(); - foreach (var item in sv.StudyList) + //Excel 的数据 在IRC 中可以找到该访视 + if (dbCheckList.Any(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName)) { - num++; - dialogMsg.AppendLine($"
{num}.{item.StudyDate}的{item.Modality}影像检查"); - paramInfoList.Add(new ParamInfoDto() - { - Modality= item.Modality, - StudyDate= item.StudyDate, - }); - } - var dbSV = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == sv.SubjectVisitId)).IfNullThrowException(); + var dbVisitStudyList = dbList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList(); + + //找到etc 当前visit site 和subject 一致的检查列表 + var etcVisitStudyList = etcList.Where(t => t.SubjectCode == sv.SubjectCode && t.SiteCode == sv.SiteCode && t.VisitName == sv.VisitName).ToList(); - // 该访视 在EDC Excel中没有任何数据 - if (etcVisitStudyList.Count == 0) - { - dialogMsg.AppendLine($"
"); - dialogMsg.AppendLine($"
存在问题如下:"); - num = 0; - foreach (var item in sv.StudyList) + + StringBuilder dialogMsg = new StringBuilder(); + dialogMsg.Append("您好,根据本系统自动识别,该受试者当前访视在IRC系统中已提交的影像检查情况如下:"); + var num = 0; + List paramInfoList = new List(); + foreach (var item in dbVisitStudyList) { num++; - dialogMsg.AppendLine($"
{num}.{item.StudyDate}的{item.Modality}影像检查(EDC 缺少) "); - } - - dialogMsg.AppendLine($"
"); - dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。"); - - dbSV.CheckResult = "当前访视在EDC表中未找到数据,请核对 SubjectCode、 SiteCode 、VisitName 是否和EDC系统保持一致"; - dbSV.CheckState = CheckStateEnum.CVIng; - dbSV.ForwardState = ForwardStateEnum.ToForward; - dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply; - dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() { - SubjectVisitId = sv.SubjectVisitId, - IsCRCNeedReply= true, - TalkContent = dialogMsg.ToString(), - ParamInfo= JsonConvert.SerializeObject(paramInfoList), - UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt,CreateTime=DateTime.Now }); - } - else - { - //etc 和数据库 并集 - var unionList = dbVisitStudyList.Union(etcVisitStudyList); - // 数据库存在 - var dbExceptExcel = dbVisitStudyList.Except(etcVisitStudyList); - - // excel 存在 - var excelExceptDB = etcVisitStudyList.Except(dbCheckList); - - //ETC 和系统的完全一致 两者没有差别 - if (dbExceptExcel.Count() == 0 && excelExceptDB.Count()==0) - { - dialogMsg.AppendLine($"
"); - dialogMsg.AppendLine($"核对EDC数据,完全一致, 审核通过"); - - - // dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。"); - dbSV.CheckState = CheckStateEnum.CVPassed; - dbSV.CheckUserId = _userInfo.Id; - dbSV.CheckPassedTime = DateTime.Now; - dbSV.CheckResult = "核对EDC数据,完全一致"; - dbSV.ManualPassReason = "自动核查通过"; - - //维护状态 - dbSV.ReadingStatus = ReadingStatusEnum.TaskAllocate; - - dbSV.RequestBackState = dbSV.RequestBackState== RequestBackStateEnum.CRC_RequestBack? RequestBackStateEnum.PM_NotAgree: RequestBackStateEnum.NotRequest; - dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() { SubjectVisitId = sv.SubjectVisitId, - ParamInfo = JsonConvert.SerializeObject(paramInfoList), - TalkContent = dialogMsg.ToString(), UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, CreateTime = DateTime.Now }); - } - // ETC 和系统的有区别 - else - { - dialogMsg.AppendLine($"
"); - dialogMsg.AppendLine($"
存在问题如下:"); - - num = 0; - foreach (var item in dbExceptExcel) + dialogMsg.AppendLine($"
{num}.{item.StudyDate}的{item.Modality}影像检查"); + paramInfoList.Add(new ParamInfoDto() { - num++; - dialogMsg.AppendLine($"
{num}.{item.StudyDate}的{item.Modality}影像检查(EDC 缺少) "); + Modality = item.Modality, + StudyDate = item.StudyDate, + }); + } + + var subjectVisitId = dbVisitStudyList.FirstOrDefault().SubjectVisitId; + var dbSV = (await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId)).IfNullThrowException(); + + #region 更换核对的顺序 以Excel 数据为准 注释 + //// 该访视 在EDC Excel中没有任何数据 + //if (etcVisitStudyList.Count == 0) + //{ + // dialogMsg.AppendLine($"
"); + // dialogMsg.AppendLine($"
存在问题如下:"); + // num = 0; + // foreach (var item in sv.StudyList) + // { + // num++; + // dialogMsg.AppendLine($"
{num}.{item.StudyDate}的{item.Modality}影像检查(EDC 缺少) "); + // } + + // dialogMsg.AppendLine($"
"); + // dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。"); + + // dbSV.CheckResult = "当前访视在EDC表中未找到数据,请核对 SubjectCode、 SiteCode 、VisitName 是否和EDC系统保持一致"; + // dbSV.CheckState = CheckStateEnum.CVIng; + // dbSV.ForwardState = ForwardStateEnum.ToForward; + // dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply; + // dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() + // { + // SubjectVisitId = sv.SubjectVisitId, + // IsCRCNeedReply = true, + // TalkContent = dialogMsg.ToString(), + // ParamInfo = JsonConvert.SerializeObject(paramInfoList), + // UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, + // CreateTime = DateTime.Now + // }); + //} + //else + #endregion + + { + //etc 和数据库 并集 + var unionList = dbVisitStudyList.Union(etcVisitStudyList); + // 数据库存在 + var dbExceptExcel = dbVisitStudyList.Except(etcVisitStudyList); + + // excel 存在 + var excelExceptDB = etcVisitStudyList.Except(dbCheckList); + + //ETC 和系统的完全一致 两者没有差别 + if (dbExceptExcel.Count() == 0 && excelExceptDB.Count() == 0) + { + dialogMsg.AppendLine($"
"); + dialogMsg.AppendLine($"核对EDC数据,完全一致, 审核通过"); + + + // dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。"); + dbSV.CheckState = CheckStateEnum.CVPassed; + dbSV.CheckUserId = _userInfo.Id; + dbSV.CheckPassedTime = DateTime.Now; + dbSV.CheckResult = "核对EDC数据,完全一致"; + dbSV.ManualPassReason = "自动核查通过"; + + //维护状态 + dbSV.ReadingStatus = ReadingStatusEnum.TaskAllocate; + + dbSV.RequestBackState = dbSV.RequestBackState == RequestBackStateEnum.CRC_RequestBack ? RequestBackStateEnum.PM_NotAgree : RequestBackStateEnum.NotRequest; + dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() + { + SubjectVisitId = subjectVisitId, + ParamInfo = JsonConvert.SerializeObject(paramInfoList), + TalkContent = dialogMsg.ToString(), + UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, + CreateTime = DateTime.Now + }); + } + // ETC 和系统的有区别 + else + { + dialogMsg.AppendLine($"
"); + dialogMsg.AppendLine($"
存在问题如下:"); + + num = 0; + foreach (var item in dbExceptExcel) + { + num++; + dialogMsg.AppendLine($"
{num}.{item.StudyDate}的{item.Modality}影像检查(EDC 缺少) "); + } + + foreach (var item in excelExceptDB) + { + num++; + dialogMsg.AppendLine($"
{num}.{item.StudyDate}的{item.Modality}影像检查(IRC 缺少) "); + } + + dialogMsg.AppendLine($"
"); + dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。"); + + dbSV.CheckResult = "根据导入的一致性核查数据,请确认本访视以下不一致检查项信息:" + String.Join(" | ", dbExceptExcel.Select(t => $"EDC 缺少:{t.StudyDate} {t.Modality} ")) + " | " + + String.Join(" | ", excelExceptDB.Select(t => $"IRC 缺少:{t.StudyDate} {t.Modality}")); + //新增一致性核查质疑记录 + + + dbSV.CheckState = CheckStateEnum.CVIng; + dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply; + + //讲核查结果发送消息给CRC + dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() + { + SubjectVisitId = subjectVisitId, + IsCRCNeedReply = true, + TalkContent = dialogMsg.ToString(), + ParamInfo = JsonConvert.SerializeObject(paramInfoList), + UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, + CreateTime = DateTime.Now + }); } - foreach (var item in excelExceptDB) - { - num++; - dialogMsg.AppendLine($"
{num}.{item.StudyDate}的{item.Modality}影像检查(IRC 缺少) "); - } - - dialogMsg.AppendLine($"
"); - dialogMsg.AppendLine(@$"
说明:为高效解决/处理以上全部质疑问题,麻烦您准确核实实际影像检查情况。请注意影像日期与实际检查的日期可能会不一致,部分检查(如PET -CT)可能同时存在多种模态影像。准确核实后,请回复该访视正确的影像检查情况。"); - - dbSV.CheckResult = "根据导入的一致性核查数据,请确认本访视以下不一致检查项信息:" + String.Join(" | ", dbExceptExcel.Select(t => $"EDC 缺少:{t.StudyDate} {t.Modality} ")) + " | " - + String.Join(" | ", excelExceptDB.Select(t => $"IRC 缺少:{t.StudyDate} {t.Modality}")); - //新增一致性核查质疑记录 - - - dbSV.CheckState = CheckStateEnum.CVIng; - dbSV.CheckChallengeState = CheckChanllengeTypeEnum.PMWaitCRCReply; - - //讲核查结果发送消息给CRC - dbSV.CheckChallengeDialogList.Add(new CheckChallengeDialog() { SubjectVisitId = sv.SubjectVisitId, IsCRCNeedReply = true, TalkContent = dialogMsg.ToString(), - ParamInfo = JsonConvert.SerializeObject(paramInfoList), - UserTypeEnum = (UserTypeEnum)_userInfo.UserTypeEnumInt, CreateTime = DateTime.Now }); } - + dbSV.CheckTime = DateTime.Now; } - dbSV.CheckTime = DateTime.Now; - + + + + + + + + + + + } await _subjectVisitRepository.SaveChangesAsync(); diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index d02357bc6..5e6c6af15 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -310,6 +310,8 @@ namespace IRaCIS.Core.Domain.Models + + [JsonIgnore] public Trial Trial { get; set; }