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