任务根据有序 无序 盲态名称设置为FollwUp

Uat_Study
{872297557@qq.com} 2022-12-02 14:41:38 +08:00
parent 0ae4277022
commit 196c5757e2
7 changed files with 534 additions and 495 deletions

View File

@ -82,7 +82,9 @@
"DefaultInternalOrganizationName": "ExtImaging", "DefaultInternalOrganizationName": "ExtImaging",
"ImageShareExpireDays": 10 "ImageShareExpireDays": 10,
"BlindTaskPrefix": "Follow Up "
} }
//访 dicom ... ip //访 dicom ... ip

View File

@ -4211,6 +4211,11 @@
序号标记 序号标记
</summary> </summary>
</member> </member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.CalculateRelationDto.CustomCalculateMark">
<summary>
自定义计算标记
</summary>
</member>
<member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialViewInDto.ReadingQuestionCriterionTrialId"> <member name="P:IRaCIS.Core.Application.Service.Reading.Dto.ReadingQuestionTrialViewInDto.ReadingQuestionCriterionTrialId">
<summary> <summary>
系统标准Id 系统标准Id

View File

@ -79,10 +79,10 @@ namespace IRaCIS.Core.Application.Service
} }
//基于标准签名 产生任务
public async Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId) public async Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId)
{ {
//找到一致性核查通过且没有产生任务的访视
var needGenerateVisit = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.CheckState == CheckStateEnum.CVPassed && var needGenerateVisit = await _subjectVisitRepository.Where(t => t.TrialId == trialId && t.CheckState == CheckStateEnum.CVPassed &&
!t.VisitTaskList.Any(u=>u.TrialReadingCriterionId== confirmedTrialReadingCriterionId &&u.SourceSubjectVisitId==t.Id)).ToListAsync(); !t.VisitTaskList.Any(u=>u.TrialReadingCriterionId== confirmedTrialReadingCriterionId &&u.SourceSubjectVisitId==t.Id)).ToListAsync();
@ -97,10 +97,27 @@ namespace IRaCIS.Core.Application.Service
int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode; int currentMaxCodeInt = cacheMaxCodeInt > dbMaxCode ? cacheMaxCodeInt : dbMaxCode;
foreach (var subjectVisit in needGenerateVisit)
{
var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync();
foreach (var subjectGroup in needGenerateVisit.GroupBy(t=>t.SubjectId).Select(g=> new { SubjectId= g.Key, SubjectVisitList= g.ToList() }))
{
var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectGroup.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync();
var visitNumList = _subjectVisitRepository.Where(t => t.SubjectId == subjectGroup.SubjectId).Select(t=>t.VisitNum).ToList();
foreach (var subjectVisit in subjectGroup.SubjectVisitList)
{
var blindTaskName = string.Empty;
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder)
{
blindTaskName = AppSettings.BlindTaskPrefix + visitNumList.IndexOf(subjectVisit.VisitNum);
}
else
{
blindTaskName = AppSettings.BlindTaskPrefix;
}
if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double) if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double)
{ {
@ -110,7 +127,7 @@ namespace IRaCIS.Core.Application.Service
TrialId = trialId, TrialId = trialId,
SubjectId = subjectVisit.SubjectId, SubjectId = subjectVisit.SubjectId,
IsUrgent = subjectVisit.IsUrgent, IsUrgent = subjectVisit.IsUrgent,
TaskBlindName = subjectVisit.BlindName, TaskBlindName = blindTaskName,
TaskName = subjectVisit.VisitName, TaskName = subjectVisit.VisitName,
VisitTaskNum = subjectVisit.VisitNum, VisitTaskNum = subjectVisit.VisitNum,
//CheckPassedTime = subjectVisit.CheckPassedTime, //CheckPassedTime = subjectVisit.CheckPassedTime,
@ -128,7 +145,7 @@ namespace IRaCIS.Core.Application.Service
TrialId = trialId, TrialId = trialId,
SubjectId = subjectVisit.SubjectId, SubjectId = subjectVisit.SubjectId,
IsUrgent = subjectVisit.IsUrgent, IsUrgent = subjectVisit.IsUrgent,
TaskBlindName = subjectVisit.BlindName, TaskBlindName = blindTaskName,
TaskName = subjectVisit.VisitName, TaskName = subjectVisit.VisitName,
VisitTaskNum = subjectVisit.VisitNum, VisitTaskNum = subjectVisit.VisitNum,
//CheckPassedTime = subjectVisit.CheckPassedTime, //CheckPassedTime = subjectVisit.CheckPassedTime,
@ -178,7 +195,7 @@ namespace IRaCIS.Core.Application.Service
TrialId = trialId, TrialId = trialId,
SubjectId = subjectVisit.SubjectId, SubjectId = subjectVisit.SubjectId,
IsUrgent = subjectVisit.IsUrgent, IsUrgent = subjectVisit.IsUrgent,
TaskBlindName = subjectVisit.BlindName, TaskBlindName = blindTaskName,
TaskName = subjectVisit.VisitName, TaskName = subjectVisit.VisitName,
VisitTaskNum = subjectVisit.VisitNum, VisitTaskNum = subjectVisit.VisitNum,
//CheckPassedTime = subjectVisit.CheckPassedTime, //CheckPassedTime = subjectVisit.CheckPassedTime,
@ -221,6 +238,9 @@ namespace IRaCIS.Core.Application.Service
} }
}
public async Task AddTaskAsync(GenerateTaskCommand generateTaskCommand) public async Task AddTaskAsync(GenerateTaskCommand generateTaskCommand)
{ {
@ -239,15 +259,37 @@ namespace IRaCIS.Core.Application.Service
switch (generateTaskCommand.ReadingCategory) switch (generateTaskCommand.ReadingCategory)
{ {
case GenerateTaskCategory.Visit: case GenerateTaskCategory.Visit:
foreach (var subjectVisit in generateTaskCommand.VisitGenerataTaskList)
//每个Subject 的每个访视 都要根据每个标准进行任务的生成 和分配(考虑回退后 的分配)
foreach (var subjectGroup in generateTaskCommand.VisitGenerataTaskList.GroupBy(t=>t.SubjectId).Select(g=>new {SubjectId=g.Key,SubjectVisitList=g.ToList()}))
{ {
foreach (var subjectVisit in subjectGroup.SubjectVisitList)
{
var visitNumList = _subjectVisitRepository.Where(t => t.SubjectId == subjectGroup.SubjectId).Select(t => t.VisitNum).ToList();
foreach (var trialReadingCriterionConfig in trialReadingCriterionConfigList) foreach (var trialReadingCriterionConfig in trialReadingCriterionConfigList)
{ {
var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync(); var assignConfigList = await _subjectUserRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.OrignalSubjectUserId == null && t.IsConfirmed).Select(u => new { u.DoctorUserId, u.ArmEnum }).ToListAsync();
var blindTaskName = string.Empty;
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder)
{
blindTaskName = AppSettings.BlindTaskPrefix + visitNumList.IndexOf(subjectVisit.VisitNum);
}
else
{
blindTaskName = AppSettings.BlindTaskPrefix;
}
if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double) if (trialReadingCriterionConfig.ReadingType == ReadingMethod.Double)
{ {
//每个访视 根据项目配置生成任务 双审生成两个 //每个访视 根据项目配置生成任务 双审生成两个
@ -256,7 +298,7 @@ namespace IRaCIS.Core.Application.Service
TrialId = trialId, TrialId = trialId,
SubjectId = subjectVisit.SubjectId, SubjectId = subjectVisit.SubjectId,
IsUrgent = subjectVisit.IsUrgent, IsUrgent = subjectVisit.IsUrgent,
TaskBlindName = subjectVisit.BlindName, TaskBlindName = blindTaskName,
TaskName = subjectVisit.VisitName, TaskName = subjectVisit.VisitName,
VisitTaskNum = subjectVisit.VisitNum, VisitTaskNum = subjectVisit.VisitNum,
//CheckPassedTime = subjectVisit.CheckPassedTime, //CheckPassedTime = subjectVisit.CheckPassedTime,
@ -274,7 +316,7 @@ namespace IRaCIS.Core.Application.Service
TrialId = trialId, TrialId = trialId,
SubjectId = subjectVisit.SubjectId, SubjectId = subjectVisit.SubjectId,
IsUrgent = subjectVisit.IsUrgent, IsUrgent = subjectVisit.IsUrgent,
TaskBlindName = subjectVisit.BlindName, TaskBlindName = blindTaskName,
TaskName = subjectVisit.VisitName, TaskName = subjectVisit.VisitName,
VisitTaskNum = subjectVisit.VisitNum, VisitTaskNum = subjectVisit.VisitNum,
//CheckPassedTime = subjectVisit.CheckPassedTime, //CheckPassedTime = subjectVisit.CheckPassedTime,
@ -309,20 +351,6 @@ namespace IRaCIS.Core.Application.Service
} }
else else
{ {
#region 验证历史任务 停用影响体验
//if (_taskAllocationRuleRepository.Where(t => t.TrialId == trialId && t.IsEnable).Count() < 2)
//{
// throw new BusinessValidationFailedException("能参与读片的医生数量必须>=2,自动分配任务中止");
//}
//if (!(assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm1) && assignConfigList.Any(t => t.ArmEnum == Arm.DoubleReadingArm2)))
//{
// throw new BusinessValidationFailedException("该受试者阅片医生未配置完成");
//}
#endregion
//并且配置了医生 //并且配置了医生
if (assignConfigList.Count > 0 && trialReadingCriterionConfig.IsFollowVisitAutoAssign) if (assignConfigList.Count > 0 && trialReadingCriterionConfig.IsFollowVisitAutoAssign)
{ {
@ -332,7 +360,7 @@ namespace IRaCIS.Core.Application.Service
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder) if (trialReadingCriterionConfig.IsReadingTaskViewInOrder)
{ {
//之前有回退到影像上传的访视 那么当前访视一致性核查通过的时候,当前访视生成但是不分配出去 //之前有回退到影像上传的访视 那么当前访视一致性核查通过的时候,当前访视生成但是不分配出去(排除失访的)
var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
@ -371,7 +399,7 @@ namespace IRaCIS.Core.Application.Service
} }
//后续最近的未一致性核查通过的访视任务 //后续最近的未一致性核查通过的访视任务
var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.TrialReadingCriterionId == trialReadingCriterionConfig.TrialReadingCriterionId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit==false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
//大于当前访视 同时小于最近的未一致性核查通过的访视任务分配 或者生成 //大于当前访视 同时小于最近的未一致性核查通过的访视任务分配 或者生成
@ -411,7 +439,7 @@ namespace IRaCIS.Core.Application.Service
SourceSubjectVisitId = latestTask.SourceSubjectVisitId, SourceSubjectVisitId = latestTask.SourceSubjectVisitId,
VisitTaskNum = latestTask.VisitTaskNum, VisitTaskNum = latestTask.VisitTaskNum,
TaskBlindName = latestTask.TaskBlindName, TaskBlindName = AppSettings.BlindTaskPrefix + visitNumList.IndexOf(latestTask.VisitTaskNum) ,
TaskName = latestTask.TaskName, TaskName = latestTask.TaskName,
BlindSubjectCode = latestTask.BlindSubjectCode, BlindSubjectCode = latestTask.BlindSubjectCode,
@ -456,7 +484,7 @@ namespace IRaCIS.Core.Application.Service
SourceSubjectVisitId = latestTask.SourceSubjectVisitId, SourceSubjectVisitId = latestTask.SourceSubjectVisitId,
VisitTaskNum = latestTask.VisitTaskNum, VisitTaskNum = latestTask.VisitTaskNum,
TaskBlindName = latestTask.TaskBlindName, TaskBlindName = AppSettings.BlindTaskPrefix + visitNumList.IndexOf(latestTask.VisitTaskNum),
TaskName = latestTask.TaskName, TaskName = latestTask.TaskName,
BlindSubjectCode = latestTask.BlindSubjectCode, BlindSubjectCode = latestTask.BlindSubjectCode,
@ -533,7 +561,7 @@ namespace IRaCIS.Core.Application.Service
TrialId = trialId, TrialId = trialId,
SubjectId = subjectVisit.SubjectId, SubjectId = subjectVisit.SubjectId,
IsUrgent = subjectVisit.IsUrgent, IsUrgent = subjectVisit.IsUrgent,
TaskBlindName = subjectVisit.BlindName, TaskBlindName = blindTaskName,
TaskName = subjectVisit.VisitName, TaskName = subjectVisit.VisitName,
VisitTaskNum = subjectVisit.VisitNum, VisitTaskNum = subjectVisit.VisitNum,
//CheckPassedTime = subjectVisit.CheckPassedTime, //CheckPassedTime = subjectVisit.CheckPassedTime,
@ -569,27 +597,22 @@ namespace IRaCIS.Core.Application.Service
//不是初次分配 //不是初次分配
if (allocateSubjectArmList.Count != 0) if (allocateSubjectArmList.Count != 0)
{ {
if (_taskAllocationRuleRepository.Where(t => t.TrialId == trialId && t.IsEnable).Count() < 2) //if (_taskAllocationRuleRepository.Where(t => t.TrialId == trialId && t.IsEnable).Count() < 2)
{ //{
throw new BusinessValidationFailedException("能参与读片的医生数量必须>=2,自动分配任务中止"); // throw new BusinessValidationFailedException("能参与读片的医生数量必须>=2,自动分配任务中止");
//break; //}
}
//配置了医生 //配置了医生
if (assignConfigList.Count > 0) if (assignConfigList.Count > 0)
{ {
#region 重阅/退回的时候,需要将取消分配的访视类型的 任务重新分配 #region 重阅/退回的时候,需要将取消分配的访视类型的 任务重新分配
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder) if (trialReadingCriterionConfig.IsReadingTaskViewInOrder)
{ {
//之前有回退的访视 那么当前访视一致性核查通过的时候,对后续访视不生成或者分配 当前访视生成但是不分配出去 //之前有回退到影像上传的访视 那么当前访视一致性核查通过的时候,当前访视生成但是不分配出去(排除失访的)
var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit==false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
if (beforeBackVisitTask == null) if (beforeBackVisitTask == null)
@ -614,7 +637,7 @@ namespace IRaCIS.Core.Application.Service
#endregion #endregion
var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync(); var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
//存在退回访视1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过但是访视1还未通过时 生成任务 //存在退回访视1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过但是访视1还未通过时 生成任务
var followVisitTaskList = await _visitTaskRepository var followVisitTaskList = await _visitTaskRepository
@ -654,7 +677,7 @@ namespace IRaCIS.Core.Application.Service
SourceSubjectVisitId = latestTask.SourceSubjectVisitId, SourceSubjectVisitId = latestTask.SourceSubjectVisitId,
VisitTaskNum = latestTask.VisitTaskNum, VisitTaskNum = latestTask.VisitTaskNum,
TaskBlindName = latestTask.TaskBlindName, TaskBlindName = AppSettings.BlindTaskPrefix + visitNumList.IndexOf(latestTask.VisitTaskNum),
TaskName = latestTask.TaskName, TaskName = latestTask.TaskName,
BlindSubjectCode = latestTask.BlindSubjectCode, BlindSubjectCode = latestTask.BlindSubjectCode,
@ -677,6 +700,7 @@ namespace IRaCIS.Core.Application.Service
//之前有回退的 后续访视不生成或者分配 当前访视生成但是不分配出去 //之前有回退的 后续访视不生成或者分配 当前访视生成但是不分配出去
else else
{ {
//不用进行额外处理 //不用进行额外处理
} }
@ -732,7 +756,16 @@ namespace IRaCIS.Core.Application.Service
await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.Id == subjectVisit.Id, u => new SubjectVisit() { IsVisitTaskGenerated = true }); await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.TrialId == trialId && t.Id == subjectVisit.Id, u => new SubjectVisit() { IsVisitTaskGenerated = true });
} }
}
break; break;
case GenerateTaskCategory.ReReading: case GenerateTaskCategory.ReReading:
var reReadingVisitTask = generateTaskCommand.ReReadingTask; var reReadingVisitTask = generateTaskCommand.ReReadingTask;
@ -915,7 +948,7 @@ namespace IRaCIS.Core.Application.Service
SouceReadModuleId = firstTask.SouceReadModuleId, SouceReadModuleId = firstTask.SouceReadModuleId,
TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)), TaskCode = AppSettings.GetCodeStr(currentMaxCodeInt + 1, nameof(VisitTask)),
TaskState = TaskState.Effect, TaskState = TaskState.Effect,
TaskBlindName = firstTask.TaskName, TaskBlindName = firstTask.TaskBlindName,
DoctorUserId = subjectUser == null ? null : subjectUser.DoctorUserId, DoctorUserId = subjectUser == null ? null : subjectUser.DoctorUserId,
TaskAllocationState = subjectUser == null ? TaskAllocationState.NotAllocate : TaskAllocationState.Allocated, TaskAllocationState = subjectUser == null ? TaskAllocationState.NotAllocate : TaskAllocationState.Allocated,
AllocateTime = subjectUser == null ? null : DateTime.Now, AllocateTime = subjectUser == null ? null : DateTime.Now,

View File

@ -594,6 +594,7 @@ namespace IRaCIS.Core.Application.Service.Allocation
//以前访视未产生任务的,在查询这里要产生 //以前访视未产生任务的,在查询这里要产生
var svIdList = await _subjectVisitRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.CheckState == CheckStateEnum.CVPassed && t.IsVisitTaskGenerated == false).Select(t => t.Id).ToListAsync(); var svIdList = await _subjectVisitRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.CheckState == CheckStateEnum.CVPassed && t.IsVisitTaskGenerated == false).Select(t => t.Id).ToListAsync();
//之前没有生成任务的逻辑 但是现在加了,任务要自动生成
await _visitTaskCommonService.GenerateVisitTaskAsync(queryVisitTask.TrialId, svIdList); await _visitTaskCommonService.GenerateVisitTaskAsync(queryVisitTask.TrialId, svIdList);

View File

@ -99,9 +99,9 @@ namespace IRaCIS.Core.Application.Services
throw new BusinessValidationFailedException("设置末次评估后,不允许添加计划外访视。"); throw new BusinessValidationFailedException("设置末次评估后,不允许添加计划外访视。");
} }
if (await _repository.AnyAsync<VisitTask>(t=>t.SubjectId==svCommand.SubjectId && t.TaskState==TaskState.Effect && t.VisitTaskNum > svCommand.VisitNum && t.SignTime != null)) if (await _repository.AnyAsync<VisitTask>(t=>t.SubjectId==svCommand.SubjectId && t.TaskState==TaskState.Effect && t.VisitTaskNum > svCommand.VisitNum && t.SignTime != null && t.TrialReadingCriterion.IsReadingTaskViewInOrder))
{ {
throw new BusinessValidationFailedException("该受试者后续访视已有任务完成阅片,不允许在此添加,如果确实需要,请回退"); throw new BusinessValidationFailedException("该受试者后续访视已有任务完成阅片(有序阅片标准),不允许在此添加,如果确实需要,请回退");
} }
} }

View File

@ -55,7 +55,7 @@ namespace IRaCIS.Core.Domain.Share
public static string SystemSiteCodePrefix { get; set; } public static string SystemSiteCodePrefix { get; set; }
public static string BlindTaskPrefix { get; set; }
/// <summary> /// <summary>
/// 用户默认密码 /// 用户默认密码
@ -85,6 +85,7 @@ namespace IRaCIS.Core.Domain.Share
ImageShareExpireDays = configuration.GetSection("IRaCISBasicConfig").GetValue<int>("ImageShareExpireDays"); ImageShareExpireDays = configuration.GetSection("IRaCISBasicConfig").GetValue<int>("ImageShareExpireDays");
BlindTaskPrefix = configuration.GetSection("IRaCISBasicConfig").GetValue<string>("BlindTaskPrefix");
} }

View File

@ -135,13 +135,10 @@ public static class StaticData
public const string TrialSubjectVisitCheckList_Export = "TrialSubjectVisitCheckList_Export"; public const string TrialSubjectVisitCheckList_Export = "TrialSubjectVisitCheckList_Export";
public const string TrialReadingTaskList_Export = "TrialReadingTaskList_Export"; public const string TrialReadingTaskList_Export = "TrialReadingTaskList_Export";
public const string TrialReReadingTaskList_Export = "TrialReReadingTaskList_Export"; public const string TrialReReadingTaskList_Export = "TrialReReadingTaskList_Export";
public const string TrialMedicalReviewList_Export = "TrialMedicalReviewList_Export"; public const string TrialMedicalReviewList_Export = "TrialMedicalReviewList_Export";