From 0f60809c327179a46f14e3bac4b2f3088312ce8a Mon Sep 17 00:00:00 2001 From: "{872297557@qq.com}" <872297557@qq.com> Date: Wed, 11 Jan 2023 16:22:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=20IsFrontTaskNeedSignButN?= =?UTF-8?q?otSign?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Allocation/DTO/VisitTaskViewModel.cs | 7 ++++- .../Service/Allocation/VisitTaskService.cs | 31 ++++++++++++++----- .../ReadingClinicalDataService.cs | 20 ++++++++++-- IRaCIS.Core.Application/TestService.cs | 14 ++++++++- IRaCIS.Core.Domain/Allocation/VisitTask.cs | 2 ++ IRaCIS.Core.Domain/SQLFile/Test.sql | 17 +++++++++- 6 files changed, 78 insertions(+), 13 deletions(-) diff --git a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs index cc0e7eec2..27a2e30da 100644 --- a/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs +++ b/IRaCIS.Core.Application/Service/Allocation/DTO/VisitTaskViewModel.cs @@ -244,6 +244,8 @@ namespace IRaCIS.Core.Application.ViewModel public int UnReadTaskCount { get; set; } + public int UnReadCanReadTaskCount { get; set; } + public int HaveReadTaskCount { get; set; } public int TotalTaskCount { get; set; } @@ -278,7 +280,10 @@ namespace IRaCIS.Core.Application.ViewModel public Guid TrialReadingCriterionId { get; set; } - public bool IsClinicalDataSigned { get; set; } = false; + public bool IsNeedClinicalDataSign { get; set; } + + public bool IsClinicalDataSign { get; set; } + } diff --git a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs index 2f8ba3dd6..548cb04fd 100644 --- a/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs +++ b/IRaCIS.Core.Application/Service/Allocation/VisitTaskService.cs @@ -957,19 +957,36 @@ namespace IRaCIS.Core.Application.Service.Allocation /// public async Task<(int, List)> GetOrderReadingIQueryable(GetOrderReadingIQueryableInDto inDto) { - var visitGroupQuery = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect) - .Where(t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId) + + + //Expression> visitTaskLambda = x => x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect && x.TrialReadingCriterionId == inDto.TrialReadingCriterionId; + + var visitGroupQuery = _visitTaskRepository.Where(x => x.TrialId == inDto.TrialId && x.DoctorUserId == _userInfo.Id && x.TaskState == TaskState.Effect && x.TrialReadingCriterionId== inDto.TrialReadingCriterionId) + //满足前序访视不存在 需要签署但是未签署 sql 相当复杂 同时想查询所有未读的统计数字 就无法统计 byzhouhang + //但是加字段 IsFrontTaskNeedSignButNotSign 那么签名临床数据的时候,要对该subject 该标准的有效的任务 这个字段需要在签名的时候维护 采取这种方式 统计数字灵活 + //.Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)) .WhereIf(!string.IsNullOrEmpty(inDto.SubjectCode), t => t.Subject.Code.Contains(inDto.SubjectCode) || t.BlindSubjectCode.Contains(inDto.SubjectCode)) - //.Where(t => (t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskState == TaskState.Effect)) .GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode }); var visitTaskQuery = visitGroupQuery.Select(x => new IRUnReadSubjectView() { SubjectId = x.Key.SubjectId, SubjectCode = x.Key.BlindSubjectCode == string.Empty ? x.Key.Code : x.Key.BlindSubjectCode, + + //未读任务量 UnReadTaskCount = x.Where(y => y.ReadingTaskState != ReadingTaskState.HaveSigned).Count(), + + //未读 里可读任务量 + UnReadCanReadTaskCount = x.Where(y => y.ReadingTaskState != ReadingTaskState.HaveSigned && y.IsFrontTaskNeedSignButNotSign==false + //(y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true) + //不能对包含聚合或子查询的表达式执行聚合函数 + //&& !x.Any(t => t.ReadingTaskState != ReadingTaskState.HaveSigned && t.IsNeedClinicalDataSign == true && t.IsClinicalDataSign == false && t.VisitTaskNum y.ReadingTaskState == ReadingTaskState.HaveSigned).Count(), ExistReadingApply = x.Any(y => y.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed || y.ReReadingApplyState == ReReadingApplyState.TrialGroupHaveApplyed), - UnReadTaskList = x.Where(y => y.ReadingTaskState != ReadingTaskState.HaveSigned).OrderBy(x => x.VisitTaskNum) + UnReadTaskList = x.Where(y => y.ReadingTaskState != ReadingTaskState.HaveSigned /*&& y.IsFrontTaskNeedSignButNotSign == false*/).OrderBy(x => x.VisitTaskNum) .Select(u => new IRUnreadTaskView() { Id = u.Id, @@ -981,11 +998,11 @@ namespace IRaCIS.Core.Application.Service.Allocation ReadingCategory = u.ReadingCategory, IsAnalysisCreate = u.IsAnalysisCreate, TrialReadingCriterionId = u.TrialReadingCriterionId, - IsClinicalDataSigned = u.Subject.ClinicalDataList.Any(c => c.IsSign && (c.ReadingId == u.SouceReadModuleId || c.ReadingId == u.SourceSubjectVisitId)) + IsNeedClinicalDataSign =u.IsNeedClinicalDataSign, + IsClinicalDataSign=u.IsClinicalDataSign }) - //.Where(z=>z.IsClinicalDataSigned) .ToList(), - }).Where(x => x.UnReadTaskCount > 0).OrderBy(x => x.SubjectId); + }).Where(x => x.UnReadTaskCount > 0).OrderBy(x => x.UnReadCanReadTaskCount); // 有序阅片需要找到最小需要 diff --git a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs index ef6f4a777..4f2ca8084 100644 --- a/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ClinicalData/ReadingClinicalDataService.cs @@ -6,6 +6,7 @@ using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Service.Inspection.DTO; using Panda.DynamicWebApi.Attributes; using Microsoft.Extensions.DependencyInjection; +using System.Linq.Expressions; namespace IRaCIS.Application.Services { @@ -300,13 +301,26 @@ namespace IRaCIS.Application.Services needSignCount = trialClinicalDataSetList.Where(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.SubjectVisit && t.UploadRole == UploadRole.PM).Count(); } - if (needSignCount == haveSignedCount ) + if (needSignCount == haveSignedCount && needSignCount!=0 ) { + //将该标准 该subject 该访视 任务临床数据状态变更 await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCritrialId && t.SourceSubjectVisitId == readingId, u => new VisitTask() { IsClinicalDataSign = true }); + + Expression> visitTaskLambda = x => x.TrialId == trialId && x.SubjectId == subjectId && x.TrialReadingCriterionId == trialReadingCritrialId; + + + var visitTaskIdQueryable = _visitTaskRepository.Where(visitTaskLambda) //该Subject 该标准的任务 + //小于自己任务号的任务 存在需要签名 但是没签名 + .Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)).Select(t => t.Id); + + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t=>visitTaskIdQueryable.Contains(t.Id), u => new VisitTask() + { + IsFrontTaskNeedSignButNotSign = true + }); } @@ -327,7 +341,7 @@ namespace IRaCIS.Application.Services needSignCount = trialClinicalDataSetList.Where(t => t.CriterionEnumList.Any(c => c == (int)criterionType) && t.ClinicalDataLevel == ClinicalLevel.OncologyRead).Count(); } - if (needSignCount == haveSignedCount) + if (needSignCount == haveSignedCount && needSignCount != 0) { //将该标准 该subject 该阅片期|肿瘤学 任务临床数据状态变更 await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCritrialId && t.SouceReadModuleId == readingId, u => new VisitTask() @@ -408,7 +422,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.CriterionEnumListStr.Contains($"|{(int)criterion.CriterionType}|")) .Select(x => new GetTrialClinicalDataSelectOutDto() { ClinicalDataLevel = x.ClinicalDataLevel, diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index a025364f1..8bbfda763 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Options; +using System.Linq.Expressions; using System.Text.RegularExpressions; @@ -43,6 +44,17 @@ namespace IRaCIS.Application.Services [UnitOfWork] public async Task Get() { + + Expression> visitTaskLambda = x => x.TrialId == Guid.Empty && x.SubjectId == Guid.Empty && x.TrialReadingCriterionId == Guid.Empty; + + var visitTaskIdQueryable = _visitTaskRepositoryy.Where(visitTaskLambda).Where(t => t.Subject.SubjectVisitTaskList.AsQueryable().Where(visitTaskLambda).Any(c => c.IsNeedClinicalDataSign == true && c.IsClinicalDataSign == false && c.VisitTaskNum < t.VisitTaskNum)).Select(t => t.Id); + + await _visitTaskRepositoryy.BatchUpdateNoTrackingAsync(t => visitTaskIdQueryable.Contains(t.Id), u => new VisitTask() + { + IsFrontTaskNeedSignButNotSign = true + }); + + //var a = ((Decimal)1.00).ToString().TrimEnd(new char[] { '.', '0' }); //var b = ((Decimal)1.01).ToString().TrimEnd(new char[] { '.', '0' }); //var c = ((Decimal)100).ToString().TrimEnd(new char[] { '.', '0' }); @@ -105,7 +117,7 @@ namespace IRaCIS.Application.Services //await _visitTaskRepositoryy.UpdatePartialFromQueryAsync( Guid.Parse("78360000-3E2C-0016-9B53-08DA6A002040"), c => new VisitTask() { UpdateTime = DateTime.Now.AddMinutes(1) }); - var a= _userInfo.IsTestUser; + var a= _userInfo.IsTestUser; var list1 = await _repository.Where().Select(t => t.TranslateValue(t.Value, t.ValueCN,true)).ToListAsync(); var list2 = await _repository.Where().Select(t => t.TranslateValue(t.Value, t.ValueCN, false)).ToListAsync(); diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index e7f6dab72..e766565f0 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -228,6 +228,8 @@ namespace IRaCIS.Core.Domain.Models public bool IsClinicalDataSign { get; set; } + //前序任务需要签名 但是未签名 + public bool IsFrontTaskNeedSignButNotSign { get; set; } [JsonIgnore] diff --git a/IRaCIS.Core.Domain/SQLFile/Test.sql b/IRaCIS.Core.Domain/SQLFile/Test.sql index 4fc898121..5703a8d6a 100644 --- a/IRaCIS.Core.Domain/SQLFile/Test.sql +++ b/IRaCIS.Core.Domain/SQLFile/Test.sql @@ -290,4 +290,19 @@ inner join ReadModule on VisitTask.SouceReadModuleId=ReadModule.Id and (select count(*) from ClinicalDataTrialSet where TrialId=VisitTask.TrialId and CriterionEnumListStr LIKE '%'+ CAST(ReadingQuestionCriterionTrial.CriterionType AS varchar(20))+'%' and ClinicalDataLevel=2) =(select count(*) from ReadingClinicalData inner join ClinicalDataTrialSet on ReadingClinicalData.ClinicalDataTrialSetId =ClinicalDataTrialSet.Id where ReadingClinicalData.TrialId=VisitTask.TrialId and IsSign=1 and ReadingClinicalDataState=3 and ReadingId=VisitTask.SourceSubjectVisitId and ClinicalDataTrialSet.UploadRole=1) - \ No newline at end of file + + + --处理字段 IsFrontTaskNeedSignButNotSign + UPDATE v SET [v].[IsFrontTaskNeedSignButNotSign] =1 +FROM [VisitTask] AS [v] +WHERE EXISTS ( + + SELECT 1 + FROM [VisitTask] AS [v0] + where [v0].SubjectId=v.SubjectId and [v0].TrialReadingCriterionId=V.TrialReadingCriterionId and [v0].TrialId=V.TrialId and + + EXISTS( + SELECT 1 + FROM [VisitTask] AS [v1] + WHERE [v1].SubjectId=v.SubjectId and V1.TrialReadingCriterionId=V.TrialReadingCriterionId and V1.TrialId=V.TrialId and [v1].[IsNeedClinicalDataSign]=1 and V1.IsClinicalDataSign=0 and V1.VisitTaskNum< [v0].[VisitTaskNum] AND [v0].[Id] = [v].[Id] + )) \ No newline at end of file