diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs index c926c4090..f31eaaac8 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/TaskAllocationRuleViewModel.cs @@ -288,7 +288,7 @@ namespace IRaCIS.Core.Application.ViewModel public String VisitName { get; set; } - public String BlindName { get; set; } + public bool IsBaseLine { get; set; } public DateTime? CheckPassedTime { get; set; } diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/TaskConsistentRuleViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/TaskConsistentRuleViewModel.cs index 3b2ae4baa..a8b4f7aeb 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/TaskConsistentRuleViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/TaskConsistentRuleViewModel.cs @@ -137,6 +137,9 @@ namespace IRaCIS.Core.Application.ViewModel public string BlindSubjectCode { get; set; } = string.Empty; public string BlindTrialSiteCode { get; set; } = string.Empty; + + public bool IsNeedClinicalDataSign { get; set; } + public bool IsClinicalDataSign { get; set; } } public class VisitTaskSimpleDTO :VisitTaskGroupSimpleDTO diff --git a/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs b/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs index 095b8fb04..f7be20a48 100644 --- a/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/TaskConsistentRuleService.cs @@ -519,7 +519,10 @@ namespace IRaCIS.Core.Application.Service SouceReadModuleId = c.SouceReadModuleId, + TrialReadingCriterionId=c.TrialReadingCriterionId, + IsClinicalDataSign = c.IsClinicalDataSign, + IsNeedClinicalDataSign = c.IsNeedClinicalDataSign, //自身一致性才有意义 //IsHaveGeneratedTask = c.Subject.SubjectVisitTaskList.Any(t => t.ConsistentAnalysisOriginalTaskId == c.Id), @@ -539,6 +542,10 @@ namespace IRaCIS.Core.Application.Service TrialId = c.TrialId, SourceSubjectVisitId = c.SourceSubjectVisitId, SouceReadModuleId = c.SouceReadModuleId, + + TrialReadingCriterionId = c.TrialReadingCriterionId, + IsClinicalDataSign = c.IsClinicalDataSign, + IsNeedClinicalDataSign = c.IsNeedClinicalDataSign, }).ToList(), }).ToList() @@ -629,7 +636,10 @@ namespace IRaCIS.Core.Application.Service SourceSubjectVisitId = c.SourceSubjectVisitId, SouceReadModuleId = c.SouceReadModuleId, + TrialReadingCriterionId = c.TrialReadingCriterionId, + IsClinicalDataSign = c.IsClinicalDataSign, + IsNeedClinicalDataSign = c.IsNeedClinicalDataSign, }).ToList() diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs index e1425d62e..818806b2d 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskHelpeService.cs @@ -39,13 +39,18 @@ namespace IRaCIS.Core.Application.Service private readonly IRepository _trialReadingCriterionRepository; + private readonly IRepository _trialClinicalDataSetRepository; + public VisitTaskHelpeService(IRepository visitTaskRepository, IRepository subjectUserRepository, IRepository trialRepository, IEasyCachingProvider provider, IRepository subjectVisitRepository, IRepository readModuleRepository, IRepository readingJudgeInfoRepository, - IRepository taskAllocationRuleRepository, IMapper mapper, IUserInfo userInfo, IRepository visitTaskReReadingRepository, IRepository trialReadingCriterionRepository) + IRepository taskAllocationRuleRepository, IMapper mapper, IUserInfo userInfo, IRepository visitTaskReReadingRepository, + IRepository trialReadingCriterionRepository, IRepository trialClinicalDataSetRepository) { + _trialClinicalDataSetRepository = trialClinicalDataSetRepository; + _visitTaskRepository = visitTaskRepository; _trialRepository = trialRepository; this._readModuleRepository = readModuleRepository; @@ -252,16 +257,59 @@ namespace IRaCIS.Core.Application.Service } + + private bool IsNeedClinicalDataSign(ReadingCategory readingCategory, bool isbaseLine, CriterionType criterionType ,List trialClinicalDataSetList) + { + //访视 + if (readingCategory==ReadingCategory.Visit) + { + if (isbaseLine) + { + //return trialClinicalDataSetList.Where(t=>t.CriterionEnumList.Any(c=>c==(int)criterionType) && (t.ClinicalDataLevel == ClinicalLevel.Subject || t.ClinicalDataLevel == ClinicalLevel.SubjectVisit)).Count()> 0; + + return trialClinicalDataSetList.Any(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && (t.ClinicalDataLevel == ClinicalLevel.Subject || t.ClinicalDataLevel == ClinicalLevel.SubjectVisit)); + } + else + { + return trialClinicalDataSetList.Any(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.SubjectVisit); + } + } + + else if (readingCategory == ReadingCategory.Judge) + { + return false; + } + //阅片期 + else if (readingCategory == ReadingCategory.Global) + { + return trialClinicalDataSetList.Any(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.ImageRead); + } + // 肿瘤学 + else if (readingCategory == ReadingCategory.Oncology) + { + return trialClinicalDataSetList.Any(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead); + } + else + { + return false; + } + + } + public async Task AddTaskAsync(GenerateTaskCommand generateTaskCommand) { var trialId = generateTaskCommand.TrialId; var isAssignSubjectToDoctor = generateTaskCommand.IsAssignSubjectToDoctor; - var trialReadingCriterionConfigList = _trialReadingCriterionRepository.Where(t => t.TrialId == trialId && t.ReadingInfoSignTime != null).Select(t => new { TrialReadingCriterionId = t.Id, t.ReadingTool, t.ReadingType, t.IsReadingTaskViewInOrder, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState, t.TaskAllocateObjEnum }).ToList(); + var trialReadingCriterionConfigList = _trialReadingCriterionRepository.Where(t => t.TrialId == trialId && t.ReadingInfoSignTime != null).Select(t => new { TrialReadingCriterionId = t.Id, t.ReadingTool, t.ReadingType, t.IsReadingTaskViewInOrder, t.IsFollowVisitAutoAssign, t.IsFollowGlobalVisitAutoAssign, t.FollowGlobalVisitAutoAssignDefaultState, t.FollowVisitAutoAssignDefaultState, t.TaskAllocateObjEnum,t.CriterionType }).ToList(); var visitBlindConfig = _trialRepository.Where(t => t.Id == trialId).Select(t => new { t.BlindBaseLineName, t.BlindFollowUpPrefix }).FirstOrDefault(); + //获取确认的临床数据配置 + var clinicalDataConfirmList = _trialClinicalDataSetRepository.Where(t => t.TrialId == trialId && t.IsConfirm).ToList(); + + var dbMaxCode = _visitTaskRepository.Where(t => t.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); var cacheMaxCodeInt = _provider.Get($"{trialId}_{StaticData.CacheKey.TaskMaxCode}").Value; @@ -330,8 +378,9 @@ namespace IRaCIS.Core.Application.Service TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), ReadingCategory = ReadingCategory.Visit, - TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId - }); + TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, + IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList) + }); ; var task2 = await _visitTaskRepository.AddAsync(new VisitTask() { @@ -348,7 +397,8 @@ namespace IRaCIS.Core.Application.Service TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 2, nameof(VisitTask)), ReadingCategory = ReadingCategory.Visit, - TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId + TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, + IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList) }); currentMaxCodeInt = currentMaxCodeInt + 2; @@ -478,7 +528,8 @@ namespace IRaCIS.Core.Application.Service AllocateTime = DateTime.Now, DoctorUserId = task1.DoctorUserId, SuggesteFinishedTime = DateTime.Now.AddDays(7), - TrialReadingCriterionId = latestTask.TrialReadingCriterionId + TrialReadingCriterionId = latestTask.TrialReadingCriterionId, + IsNeedClinicalDataSign = latestTask.IsNeedClinicalDataSign, }); currentMaxCodeInt = currentMaxCodeInt + 1; @@ -533,7 +584,8 @@ namespace IRaCIS.Core.Application.Service DoctorUserId = task2.DoctorUserId, SuggesteFinishedTime = DateTime.Now.AddDays(7), - TrialReadingCriterionId = latestTask.TrialReadingCriterionId + TrialReadingCriterionId = latestTask.TrialReadingCriterionId, + IsNeedClinicalDataSign = latestTask.IsNeedClinicalDataSign, }); currentMaxCodeInt = currentMaxCodeInt + 1; @@ -609,7 +661,9 @@ namespace IRaCIS.Core.Application.Service SourceSubjectVisitId = subjectVisit.Id, TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), ReadingCategory = ReadingCategory.Visit, - TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId + + TrialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId, + IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.CriterionType, clinicalDataConfirmList) }); @@ -732,7 +786,11 @@ namespace IRaCIS.Core.Application.Service IsSelfAnalysis = latestTask.IsSelfAnalysis, TaskAllocationState = TaskAllocationState.Allocated, AllocateTime = DateTime.Now, - DoctorUserId = singleTask.DoctorUserId + DoctorUserId = singleTask.DoctorUserId, + + TrialReadingCriterionId = latestTask.TrialReadingCriterionId, + IsNeedClinicalDataSign = latestTask.IsNeedClinicalDataSign, + }); currentMaxCodeInt = currentMaxCodeInt + 1; @@ -823,7 +881,6 @@ namespace IRaCIS.Core.Application.Service var newTask = await _visitTaskRepository.AddAsync(new VisitTask() { - TrialReadingCriterionId = reReadingVisitTask.TrialReadingCriterionId, TrialId = reReadingVisitTask.TrialId, SubjectId = reReadingVisitTask.SubjectId, @@ -847,6 +904,9 @@ namespace IRaCIS.Core.Application.Service BlindTrialSiteCode = reReadingVisitTask.BlindTrialSiteCode, + TrialReadingCriterionId = reReadingVisitTask.TrialReadingCriterionId, + IsNeedClinicalDataSign=reReadingVisitTask.IsNeedClinicalDataSign, + IsClinicalDataSign= reReadingVisitTask.IsClinicalDataSign, // TaskAllocationState = reReadingVisitTask.TaskAllocationState, // AllocateTime = DateTime.Now, @@ -914,13 +974,16 @@ namespace IRaCIS.Core.Application.Service SouceReadModuleId = task.SouceReadModuleId, SourceSubjectVisitId = task.SourceSubjectVisitId, - BlindTrialSiteCode = task.BlindTrialSiteCode, - BlindSubjectCode = task.BlindSubjectCode, + ConsistentAnalysisOriginalTaskId = task.Id, IsAnalysisCreate = true, IsSelfAnalysis = true, TrialReadingCriterionId = task.TrialReadingCriterionId, + BlindTrialSiteCode = task.BlindTrialSiteCode, + BlindSubjectCode = task.BlindSubjectCode, + IsNeedClinicalDataSign =task.IsNeedClinicalDataSign, + IsClinicalDataSign=task.IsClinicalDataSign }; await _visitTaskRepository.AddAsync(consistentTask); @@ -965,6 +1028,8 @@ namespace IRaCIS.Core.Application.Service TrialReadingCriterionId = task.TrialReadingCriterionId, BlindTrialSiteCode = task.BlindTrialSiteCode, BlindSubjectCode = task.BlindSubjectCode, + IsNeedClinicalDataSign = task.IsNeedClinicalDataSign, + IsClinicalDataSign = task.IsClinicalDataSign }; @@ -1033,6 +1098,8 @@ namespace IRaCIS.Core.Application.Service var originalTaskInfo = await _visitTaskRepository.Where(x => x.Id == generateTaskCommand.OriginalVisitId).Include(x => x.TrialReadingCriterion).FirstNotNullAsync(); + var criterionType = await _trialReadingCriterionRepository.Where(t => t.Id == originalTaskInfo.TrialReadingCriterionId).Select(t => t.CriterionType).FirstOrDefaultAsync(); + // 需要添加全局任务再添加 if (originalTaskInfo.TrialReadingCriterion.IsGlobalReading) { @@ -1060,6 +1127,7 @@ namespace IRaCIS.Core.Application.Service ReadingCategory = item.ReadingCategory, TrialReadingCriterionId = originalTaskInfo.TrialReadingCriterionId, + IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Global, false, criterionType, clinicalDataConfirmList) }); currentMaxCodeInt = currentMaxCodeInt + 1; @@ -1073,7 +1141,7 @@ namespace IRaCIS.Core.Application.Service originalTaskInfo = await _visitTaskRepository.Where(x => x.Id == generateTaskCommand.OriginalVisitId).FirstNotNullAsync(); - + criterionType = await _trialReadingCriterionRepository.Where(t => t.Id == originalTaskInfo.TrialReadingCriterionId).Select(t => t.CriterionType).FirstOrDefaultAsync(); foreach (var item in generateTaskCommand.ReadingGenerataTaskList) { @@ -1105,6 +1173,9 @@ namespace IRaCIS.Core.Application.Service ReadingCategory = item.ReadingCategory, TrialReadingCriterionId = originalTaskInfo.TrialReadingCriterionId, + + IsNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Oncology, false, criterionType, clinicalDataConfirmList) + }); singleTask.AllocateTime = DateTime.Now; diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index b4666da48..75db3f101 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -1669,33 +1669,33 @@ namespace IRaCIS.Core.Application.Service.Allocation newTask.SuggesteFinishedTime = DateTime.Now.AddDays(7); //拷贝后续表单 - //if (visitTaskReReadingAppply.IsCopyFollowForms && origenalTask.VisitTaskNum != influenceTask.VisitTaskNum) - //{ - // if (origenalTask.ReadingCategory == ReadingCategory.Visit) - // { - // var list = _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList(); + if (visitTaskReReadingAppply.IsCopyFollowForms && origenalTask.VisitTaskNum != influenceTask.VisitTaskNum) + { + if (origenalTask.ReadingCategory == ReadingCategory.Visit) + { + var list = _readingTaskQuestionAnswerRepository.Where(t => t.VisitTaskId == origenalTask.Id).ToList(); - // foreach (var item in list) - // { - // item.Id = Guid.Empty; - // item.VisitTaskId = newTask.Id; - // } + foreach (var item in list) + { + item.Id = Guid.Empty; + item.VisitTaskId = newTask.Id; + } - // _ = _readingTaskQuestionAnswerRepository.AddRangeAsync(list).Result; - // } - // else if (origenalTask.ReadingCategory == ReadingCategory.Global) - // { - // var list = _repository.Where(t => t.GlobalTaskId == origenalTask.Id).ToList(); + _ = _readingTaskQuestionAnswerRepository.AddRangeAsync(list).Result; + } + //else if (origenalTask.ReadingCategory == ReadingCategory.Global) + //{ + // var list = _repository.Where(t => t.GlobalTaskId == origenalTask.Id).ToList(); - // foreach (var item in list) - // { - // item.Id = Guid.Empty; - // item.GlobalTaskId = newTask.Id; - // } + // foreach (var item in list) + // { + // item.Id = Guid.Empty; + // item.GlobalTaskId = newTask.Id; + // } - // _ = _repository.AddRangeAsync(list).Result; - // } - //} + // _ = _repository.AddRangeAsync(list).Result; + //} + } } }); @@ -1799,18 +1799,18 @@ namespace IRaCIS.Core.Application.Service.Allocation _ = _readingTaskQuestionAnswerRepository.AddRangeAsync(list).Result; } - else if (origenalTask.ReadingCategory == ReadingCategory.Global) - { - var list = _repository.Where(t => t.GlobalTaskId == origenalTask.Id).ToList(); + //else if (origenalTask.ReadingCategory == ReadingCategory.Global) + //{ + // var list = _repository.Where(t => t.GlobalTaskId == origenalTask.Id).ToList(); - foreach (var item in list) - { - item.Id = Guid.Empty; - item.GlobalTaskId = newTask.Id; - } + // foreach (var item in list) + // { + // item.Id = Guid.Empty; + // item.GlobalTaskId = newTask.Id; + // } - _ = _repository.AddRangeAsync(list).Result; - } + // _ = _repository.AddRangeAsync(list).Result; + //} } diff --git a/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs b/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs index 2bd508c47..1e4b7cb04 100644 --- a/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs +++ b/IRaCIS.Core.Application/Service/Inspection/DTO/InspectionModel.cs @@ -272,6 +272,9 @@ namespace IRaCIS.Core.Application.Service.Inspection.DTO /// 阅片临床数据ID /// public Guid ReadingClinicalDataId { get; set; } + + [NotDefault] + public Guid TrialReadingCriterionId { get; set; } } /// diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs index 5978d8ead..af896f5f2 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -19,7 +19,7 @@ namespace IRaCIS.Application.Services private readonly IRepository _clinicalDataTrialSetRepository; private readonly IRepository _visitTaskRepository; private readonly IRepository _previousPDFRepository; - + private readonly IRepository _subjectVisitRepository; private readonly IRepository _previousHistoryRepository; private readonly IRepository _previousOtherRepository; @@ -35,7 +35,7 @@ namespace IRaCIS.Application.Services IRepository previousPDFRepository, IRepository subjectVisitRepository, IRepository previousHistoryRepository, - + IRepository previousOtherRepository, IRepository previousSurgeryRepository, IRepository readingQuestionCriterionTrialRepository, @@ -161,7 +161,7 @@ namespace IRaCIS.Application.Services { await this.AddCRCClinicalData(inDto); } - + List cRCClinicalDataList = await _readingClinicalDataRepository.Where(x => x.ReadingId == inDto.SubjectVisitId) .Where(x => x.ClinicalDataTrialSet.TrialId == inDto.TrialId && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.ImageRead && x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.OncologyRead) @@ -248,11 +248,16 @@ namespace IRaCIS.Application.Services public async Task ReadClinicalDataSign(ReadingClinicalDataSignIndto inDto) { - await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.ReadingClinicalDataId, x => new ReadingClinicalData() - { - IsSign = true, - ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned - }); + var data = await _readingClinicalDataRepository.FirstOrDefaultAsync(t => t.Id == inDto.ReadingClinicalDataId); + + data.IsSign = true; + data.ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned; + + //await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.ReadingClinicalDataId, x => new ReadingClinicalData() + //{ + // IsSign = true, + // ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned + //}); var result = await _readingClinicalDataRepository.SaveChangesAsync(); @@ -261,9 +266,83 @@ namespace IRaCIS.Application.Services await this.iServiceProvider.GetService().AddOncologyTask(readingId); + await DealVisiTaskClinicalDataSignedAsync(data.TrialId, data.SubjectId, data.ReadingId, data.IsVisit, inDto.TrialReadingCriterionId); + return ResponseOutput.Result(result); } + //处理 任务 临床数据是否签名 + private async Task DealVisiTaskClinicalDataSignedAsync(Guid trialId, Guid subjectId, Guid readingId, bool isVisit, Guid trialReadingCritrialId) + { + //获取确认的临床数据配置 + var trialClinicalDataSetList = _clinicalDataTrialSetRepository.Where(t => t.TrialId == trialId && t.IsConfirm).ToList(); + + var criterionType = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == trialReadingCritrialId).Select(t => t.CriterionType).FirstOrDefaultAsync(); + + // 获取确认的项目标准 废弃 签名的时候 传递标准Id + //var confirmedCtritrialList = _repository.Where(t => t.TrialId == trialId && t.ReadingInfoSignTime != null).Select(t => new { t.Id, t.CriterionType }).ToList(); + + var needSignCount = 0; + var haveSignedCount = _readingClinicalDataRepository.Where(t => t.IsSign && t.ReadingClinicalDataState == ReadingClinicalDataStatus.HaveSigned && t.ReadingId == readingId && t.ClinicalDataTrialSet.UploadRole == UploadRole.PM).Count(); + + if (isVisit) + { + var isBaseLine = await _subjectVisitRepository.Where(t => t.Id == readingId).Select(t => t.IsBaseLine).FirstOrDefaultAsync(); + + //判断是否基线 + if (isBaseLine) + { + //CRC 的自动签名 不用管 只用处理PM 的就好 + needSignCount = trialClinicalDataSetList.Where(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && (t.ClinicalDataLevel == ClinicalLevel.Subject || t.ClinicalDataLevel == ClinicalLevel.SubjectVisit) && t.UploadRole == UploadRole.PM).Count(); + } + else + { + needSignCount = trialClinicalDataSetList.Where(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.SubjectVisit && t.UploadRole == UploadRole.PM).Count(); + } + + if (needSignCount == haveSignedCount ) + { + //将该标准 该subject 该访视 任务临床数据状态变更 + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCritrialId && t.SourceSubjectVisitId == readingId, u => new VisitTask() + { + IsClinicalDataSign = true + }); + } + + + } + else + { + //判断是影像学 还是肿瘤学阅片 + var readingSetType = await _readModuleRepository.Where(t => t.Id == readingId).Select(t => t.ReadingPeriodSet.ReadingSetType).FirstOrDefaultAsync(); + + //影像学 + if (readingSetType == ReadingSetType.ImageReading) + { + needSignCount = trialClinicalDataSetList.Where(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.ImageRead).Count(); + } + //肿瘤学 + else + { + needSignCount = trialClinicalDataSetList.Where(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead).Count(); + } + + if (needSignCount == haveSignedCount) + { + //将该标准 该subject 该阅片期|肿瘤学 任务临床数据状态变更 + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCritrialId && t.SouceReadModuleId == readingId, u => new VisitTask() + { + IsClinicalDataSign = true + }); + } + + } + + } + + + + [HttpPut] public async Task PMClinicalDataConfirm(PMClinicalDataConfirmCommand command) { @@ -329,7 +408,7 @@ namespace IRaCIS.Application.Services .WhereIf(inDto.IsVisit && !inDto.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit) .WhereIf(!inDto.IsVisit, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalDataLevel == ClinicalLevel.OncologyRead) .WhereIf(readModule != null, x => x.ClinicalDataLevel == keyValuePairs[readModule.ModuleType]) - //.WhereIf(criterion!=null,x=>x.CriterionEnumList.Contains((int)criterion.CriterionType)) + .WhereIf(criterion!=null,x=>x.CriterionEnumList.Contains((int)criterion.CriterionType)) .Select(x => new GetTrialClinicalDataSelectOutDto() { ClinicalDataLevel = x.ClinicalDataLevel, @@ -422,7 +501,7 @@ namespace IRaCIS.Application.Services } var isBaseLine = await _subjectVisitRepository.AnyAsync(x => x.Id == inDto.ReadingId && x.IsBaseLine); - + var result = await this.GetReadingClinicalList(inDto); var readingIds = result.Select(x => x.ReadingId).ToList(); @@ -465,12 +544,12 @@ namespace IRaCIS.Application.Services { ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel, SubjectId = x.SubjectId, - ReadingId= x.ReadingId, + ReadingId = x.ReadingId, ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName, ClinicalDataTrialSetId = x.ClinicalDataTrialSetId, IsSign = x.IsSign, ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType, - CriterionEnumList= x.ClinicalDataTrialSet.CriterionEnumList, + CriterionEnumList = x.ClinicalDataTrialSet.CriterionEnumList, Id = x.Id, UploadRole = x.ClinicalDataTrialSet.UploadRole, IsCRCUpload = x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC, @@ -488,11 +567,11 @@ namespace IRaCIS.Application.Services // 根据标准 if (inDto.VisitTaskId != null) { - var criterionType = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Include(x=>x.TrialReadingCriterion).Select(x => x.TrialReadingCriterion.CriterionType).FirstNotNullAsync(); + var criterionType = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Include(x => x.TrialReadingCriterion).Select(x => x.TrialReadingCriterion.CriterionType).FirstNotNullAsync(); result = result.Where(x => x.CriterionEnumList.Contains((int)criterionType)).ToList(); } - + result = result.Where(x => !(x.ClinicalUploadType == ClinicalUploadType.PDF && x.FileList.Count() == 0)).ToList(); // 需要排除表格为空的数据 @@ -521,18 +600,18 @@ namespace IRaCIS.Application.Services { var criterionType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => x.CriterionType).FirstNotNullAsync(); - + var resultQuery = _readingClinicalDataRepository.Where(x => x.SubjectId == inDto.SubjectId).Include(x => x.ClinicalDataTrialSet) .Where(x => x.ReadingId == inDto.ReadingId || (x.SubjectId == inDto.SubjectId && x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject)) //.WhereIf(inDto.UploadRole == UploadRole.CRC, x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC) - - .Where(x=>x.ClinicalDataTrialSet.CriterionEnumListStr.Contains(((int)criterionType).ToString())) + + .Where(x => x.ClinicalDataTrialSet.CriterionEnumListStr.Contains(((int)criterionType).ToString())) .Select(x => new GetReadingClinicalDataListOutDto() { ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel, SubjectId = x.SubjectId, - ReadingId=x.ReadingId, + ReadingId = x.ReadingId, ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName, ClinicalDataTrialSetId = x.ClinicalDataTrialSetId, IsSign = x.IsSign, diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index b9088c40f..5b943c51e 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -222,6 +222,13 @@ namespace IRaCIS.Core.Domain.Models #endregion + //临床数据 + + public bool IsNeedClinicalDataSign { get; set; } + + public bool IsClinicalDataSign { get; set; } + + [JsonIgnore] public Trial Trial { get; set; }