This commit is contained in:
2023-04-04 13:47:28 +08:00
8 changed files with 284 additions and 42 deletions
@@ -118,7 +118,11 @@ namespace IRaCIS.Core.Application.Service
var taskInfo = await _visitTaskRepository.Where(x => x.Id == taskId).IgnoreAutoIncludes().AsNoTracking().FirstNotNullAsync();
taskInfo.ReadingTaskState = ReadingTaskState.Reading;
taskInfo.ReadingTaskState = ReadingTaskState.WaitReading;
taskInfo.FirstReadingTime = null;
taskInfo.SignTime = null;
taskInfo.TaskState = TaskState.Effect;
//taskInfo.IsConvertedTask = true;
taskInfo.BeforeConvertedTaskId = taskId;
taskInfo.Id = NewId.NextGuid();
@@ -268,6 +268,7 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public DateTime? LatestScanDate { get; set; }
public TaskState TaskState { get; set; }
public string TaskName { get; set; }
public decimal VisitTaskNum { get; set; }
@@ -425,7 +425,7 @@ namespace IRaCIS.Application.Services
x.DoctorUserId == taskInfo.DoctorUserId &&
x.ReadingTaskState == ReadingTaskState.HaveSigned &&
x.TrialReadingCriterionId == taskInfo.TrialReadingCriterionId &&
(x.TaskState == TaskState.Effect||x.TaskState==TaskState.Freeze) &&
x.TaskState == TaskState.Effect &&
x.VisitTaskNum <= taskInfo.VisitTaskNum &&
x.IsAnalysisCreate == taskInfo.IsAnalysisCreate &&
x.ReadingCategory == ReadingCategory.Visit) || x.Id == inDto.VisitTaskId);
@@ -475,7 +475,7 @@ namespace IRaCIS.Application.Services
var taskQuery = _visitTaskRepository.Where(x =>
x.TrialId == taskInfo.TrialId &&
x.SubjectId == taskInfo.SubjectId &&
x.VisitTaskNum <= taskInfo.VisitTaskNum &&
x.VisitTaskNum < taskInfo.VisitTaskNum &&
x.ArmEnum == taskInfo.ArmEnum &&
x.Id != inDto.VisitTaskId &&
x.DoctorUserId == taskInfo.DoctorUserId &&
@@ -47,4 +47,9 @@ namespace IRaCIS.Core.Application.ViewModel
{
public bool IsBaseLine { get; set; }
}
public class IRECISTTargetLesionDto
{
}
}
@@ -151,25 +151,25 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// <returns></returns>
public async Task AddConvertedTaskFocus(Guid visitTaskId, Guid beforeConvertedTaskId)
{
var originalTask = await _visitTaskRepository.Where(x => x.Id == beforeConvertedTaskId).Include(x => x.TrialReadingCriterion).FirstNotNullAsync();
var originalTask = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Include(x => x.TrialReadingCriterion).FirstNotNullAsync();
var taskAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == visitTaskId && x.ReadingQuestionTrial.Type != "calculation").IgnoreAutoIncludes().AsNoTracking().ToListAsync();
var taskAnswer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == beforeConvertedTaskId && x.ReadingQuestionTrial.Type != "calculation").IgnoreAutoIncludes().AsNoTracking().ToListAsync();
taskAnswer.ForEach(x => {
x.VisitTaskId = beforeConvertedTaskId;
x.VisitTaskId = visitTaskId;
x.Id = NewId.NextGuid();
});
var tableRowAnswers = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == visitTaskId).AsNoTracking().ProjectTo<CopyTableAnswerRowInfo>(_mapper.ConfigurationProvider).IgnoreAutoIncludes().ToListAsync();
var tableRowAnswers = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == beforeConvertedTaskId).AsNoTracking().ProjectTo<CopyTableAnswerRowInfo>(_mapper.ConfigurationProvider).IgnoreAutoIncludes().ToListAsync();
tableRowAnswers.ForEach(x =>
{
x.VisitTaskId = beforeConvertedTaskId;
x.VisitTaskId = visitTaskId;
x.IsCurrentTaskAdd = false;
x.FristAddTaskId = beforeConvertedTaskId;
x.FristAddTaskId = visitTaskId;
x.Id = NewId.NextGuid();
});
@@ -180,12 +180,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
});
var tableAnswer = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == visitTaskId).IgnoreAutoIncludes().AsNoTracking().ToListAsync();
var tableAnswer = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == beforeConvertedTaskId).IgnoreAutoIncludes().AsNoTracking().ToListAsync();
tableAnswer.ForEach(x =>
{
x.Id = NewId.NextGuid();
x.VisitTaskId = beforeConvertedTaskId;
x.VisitTaskId = visitTaskId;
x.RowId = tableRowAnswers.Where(y => y.OriginalId == x.RowId).Select(x => x.Id).FirstOrDefault();
});
var addrowInfo = _mapper.Map<List<ReadingTableAnswerRowInfo>>(tableRowAnswers);
@@ -311,7 +311,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
BlindName = x.TaskBlindName,
IsBaseLine = x.SourceSubjectVisit.IsBaseLine,
VisitTaskId = x.Id,
TaskState= x.TaskState,
TaskName = x.TaskName,
LatestScanDate= x.SourceSubjectVisit!=null?x.SourceSubjectVisit.LatestScanDate : null,
VisitTaskNum = x.VisitTaskNum,
@@ -320,7 +320,7 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
//CrterionDictionaryGroup = x.CrterionDictionaryGroup,
IsCurrentTask = x.Id == visitTaskId,
}).ToListAsync();
}).OrderBy(x=>x.VisitTaskNum).ThenByDescending(x=>x.TaskState).ToListAsync();
taskInfoList.ForEach(x =>
@@ -66,7 +66,17 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// </summary>
private decimal? sODData;
/// <summary>
/// 获取iSod的值
/// </summary>
private decimal? iSODData;
private string nAString = "NA";
/// <summary>
/// 上一次访视Id
/// </summary>
public Guid? lastVisitTaskId;
#endregion
#region
@@ -420,13 +430,13 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
//与基线访视相比SOD变化百分比
new ReadingCalculateData (){QuestionType=QuestionType.SODPercent,GetDecimalNullFun=GetSODPercent},
//与整个访视期间SOD最低点相比增加的值(mm) //其他任务需要改
//与整个访视期间SOD最低点相比增加的值(mm)
new ReadingCalculateData (){QuestionType=QuestionType.LowestIncrease,GetDecimalNullFun=GetLowestIncrease,/*ChangeAllTaskFun=ChangeAllLowestIncrease*/},
//与整个访视期间SOD最低点相比增加的百分比 //其他任务需要改
//与整个访视期间SOD最低点相比增加的百分比
new ReadingCalculateData (){QuestionType=QuestionType.LowPercent,GetDecimalNullFun=GetLowPercent,/*ChangeAllTaskFun=ChangeAllLowPercent*/},
//整个访视期间SOD最低点访视名称 //其他任务需要改
//整个访视期间SOD最低点访视名称
new ReadingCalculateData (){QuestionType=QuestionType.LowVisit,GetStringFun=GetLowVisit,/*ChangeAllTaskFun=ChangeAllLowVisitName*/},
//是否存在非淋巴结靶病灶
@@ -438,6 +448,15 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
//被评估为NE的单个靶病灶
new ReadingCalculateData (){QuestionType=QuestionType.NETarget,GetStringFun=GetNETarget},
// 与前一访视SOD相比变化量
new ReadingCalculateData (){QuestionType=QuestionType.LastVisitSODChange,GetDecimalNullFun=GetLastTaskSODChange},
//新靶病灶直径之和(iSOD
new ReadingCalculateData (){QuestionType=QuestionType.ISOD,GetDecimalNullFun=GetiSODData},
// 与前一访视相比iSOD变化量
new ReadingCalculateData (){QuestionType=QuestionType.LastVisitiSODChange,GetDecimalNullFun=GetISODChange},
//靶病灶评估
new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetTargetLesionEvaluate},
@@ -739,15 +758,14 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
await _generalCalculateService.AddConvertedTaskFocus(taskinfo.Id, taskinfo.BeforeConvertedTaskId.Value);
}
else
{
var LastVisitTaskId = await _visitTaskRepository.Where(x => (x.ReadingCategory == ReadingCategory.Visit &&
var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
x.IsAnalysisCreate == taskinfo.IsAnalysisCreate &&
x.DoctorUserId == taskinfo.DoctorUserId &&
x.IsSelfAnalysis == taskinfo.IsSelfAnalysis &&
x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ArmEnum == taskinfo.ArmEnum
&& x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect) || (x.Id == taskinfo.BeforeConvertedTaskId)
&& x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect
).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync();
@@ -785,20 +803,20 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
});
List<QuestionMark?> notNeedCopyMarks = new List<QuestionMark?>()
{
QuestionMark.MajorAxis,
QuestionMark.ShortAxis,
QuestionMark.State,
};
if (taskinfo.IsConvertedTask)
{
notNeedCopyMarks = new List<QuestionMark?>()
{
QuestionMark.MajorAxis,
QuestionMark.ShortAxis,
QuestionMark.State,
};
}
//if (taskinfo.IsConvertedTask)
//{
// notNeedCopyMarks = new List<QuestionMark?>()
//{
// QuestionMark.MajorAxis,
// QuestionMark.ShortAxis,
//};
//}
var tableAnswers = copyTableAnswers.Select(x => new ReadingTableQuestionAnswer
{
@@ -1182,6 +1200,96 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
}
#endregion
#region 访SOD相比变化量
/// <summary>
/// 与前一访视SOD相比变化量
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<decimal?> GetLastTaskSODChange(ReadingCalculateDto inDto)
{
var lastTaskId = await this.GetLastVisitTaskId(inDto);
var lastSOD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SOD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
var value = await GetSODData(inDto);
if (value == null || inDto.IsBaseLine)
{
return null;
}
return value.NullChange0() - lastSOD;
}
#endregion
#region iSOD
/// <summary>
/// 获取iSOD
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<decimal?> GetiSODData(ReadingCalculateDto inDto)
{
if (iSODData != null)
{
return iSODData.Value;
}
var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NewTargetLesion).SelectMany(x => x.TableRowInfoList).ToList();
if (tableQuestion.Count() == 0)
{
return null;
}
decimal result = 0;
foreach (var item in tableQuestion)
{
if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes)))
{
// 淋巴结的短径
result += (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0();
}
if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.No)))
{
// 非淋巴结的长径
result += item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.MajorAxis).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
}
}
iSODData = result;
return iSODData.Value;
}
#endregion
#region 访iSOD变化量
/// <summary>
/// 与前一访视相比iSOD变化量
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<decimal?> GetISODChange(ReadingCalculateDto inDto)
{
var lastTaskId = await this.GetLastVisitTaskId(inDto);
var lastiSOD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.ISOD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
var value = await GetiSODData(inDto);
if (value == null || inDto.IsBaseLine)
{
return null;
}
return value.NullChange0() - lastiSOD;
}
#endregion
#region
@@ -1397,26 +1505,75 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
/// <returns></returns>
private async Task<Guid> GetLastVisitTaskId(ReadingCalculateDto inDto)
{
// 拿到这一个访视
var thisNum = await _subjectVisitRepository.Where(x => x.Id == inDto.SubjectVisitId).Select(x => x.VisitNum).FirstOrDefaultAsync();
// 先找到上一个访视
var lastVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == inDto.SubjectId && !x.IsLostVisit && x.VisitNum < thisNum).OrderByDescending(x => x.VisitNum).Select(x => x.Id).FirstOrDefaultAsync();
if (lastVisitTaskId != null)
{
return lastVisitTaskId.Value;
}
else
{
var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).ProjectTo<VisitTaskDto>(_mapper.ConfigurationProvider).FirstNotNullAsync();
var lastTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
x.IsAnalysisCreate == taskinfo.IsAnalysisCreate &&
x.DoctorUserId == taskinfo.DoctorUserId &&
x.IsSelfAnalysis == taskinfo.IsSelfAnalysis &&
x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ArmEnum == taskinfo.ArmEnum
&& x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect
).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync();
lastVisitTaskId = lastTaskId;
return lastTaskId;
}
// 找到访视任务Id
var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
x.TrialReadingCriterionId == inDto.TrialReadingCriterionId &&
x.TaskState == TaskState.Effect &&
x.IsAnalysisCreate == inDto.IsAnalysisCreate
&& x.SourceSubjectVisitId == lastVisitId && x.ArmEnum==inDto.ArmEnum).Select(x => x.Id).FirstOrDefaultAsync();
return LastVisitTaskId;
}
#endregion
#region
#region IRECIST靶病灶评估
/// <summary>
/// 获取IRECIST靶病灶评估
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task<string> GetIRECISTTargetLesionEvaluate(ReadingCalculateDto inDto)
{
//if(基线没有靶病灶)
//{
// 靶病灶疗效为 ND
//}else if ((上一访视评估为iCPD && 本次访视满足RECIST1.1的PD条件)|| 上一访视评估为iUPD || 本次访视SOD增加不小于5mm)
//{
// 靶病灶疗效为 ICPD
//} else if (本次访视满足RECIST1.1的PD条件 && (比整体访视期间最低点SOD增加≥20 % && 比整体访视期间最低点SOD绝对增加值≥5 mm)|| (前一访视评估为iCR && 当前访视至少有一个“存在”状态的靶病灶))
//{
// 靶病灶疗效为 iUPD
//} else if (有任一靶病灶为NE状态)
// {
// 靶病灶疗效为 NE
//}
// else if (所有非淋巴结靶病灶消失,径线总和为0 mm && 所有淋巴结靶病灶的短径缩小到 < 10 mm)
//{
// 靶病灶疗效为 iCR
//} else if (与基线期SOD相比减小≥30 %)
//{
// 靶病灶疗效为 iPR
//}
//else
// {
// 靶病灶疗效为 iSD
//}
//if()
return string.Empty;
}
#endregion
#region
/// <summary>
/// 获取靶病灶评估