3724 lines
181 KiB
C#
3724 lines
181 KiB
C#
using IRaCIS.Core.Application.Interfaces;
|
||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||
using IRaCIS.Core.Application.Service.ReadingCalculate.Interface;
|
||
using IRaCIS.Core.Application.ViewModel;
|
||
using IRaCIS.Core.Domain.Share;
|
||
using IRaCIS.Core.Infra.EFCore.Common;
|
||
using IRaCIS.Core.Infrastructure;
|
||
using MassTransit;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
|
||
namespace IRaCIS.Core.Application.Service.ReadingCalculate
|
||
{
|
||
|
||
[ApiExplorerSettings(GroupName = "Reading")]
|
||
public class LuganoCalculateService(IRepository<ReadingTableQuestionAnswer> _readingTableQuestionAnswerRepository,
|
||
IRepository<VisitTask> _visitTaskRepository,
|
||
IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
|
||
IRepository<ReadingTableQuestionTrial> _readingTableQuestionTrialRepository,
|
||
IRepository<ReadingTaskQuestionMark> _readingTaskQuestionMarkRepository,
|
||
IRepository<ReadingTableAnswerRowInfo> _readingTableAnswerRowInfoRepository,
|
||
IRepository<ReadingGlobalTaskInfo> _readingGlobalTaskInfoRepository,
|
||
IRepository<ReadingQuestionTrial> _readingQuestionTrialRepository,
|
||
IRepository<OrganInfo> _organInfoRepository,
|
||
IRepository<SubjectVisit> _subjectVisitRepository,
|
||
IRepository<DicomStudy> _dicomStudyRepository,
|
||
IRepository<TumorAssessment_RECIST1Point1> _tumorAssessmentRepository,
|
||
ISubjectVisitService _subjectVisitService,
|
||
IGeneralCalculateService _generalCalculateService,
|
||
IRepository<ReadingTaskQuestionAnswer> _readingTaskQuestionAnswerRepository, IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer) : BaseService, ICriterionCalculateService, ILuganoCalculateService
|
||
{
|
||
|
||
|
||
/// <summary>
|
||
/// 获取阅片的计算数据
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<object> GetReadingCalculationData(GetReadingCalculationDataInDto inDto)
|
||
{
|
||
ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId);
|
||
readingData.ComputationTrigger = ComputationTrigger.LiverBloodPool;
|
||
var baseLinePET5PS = 0m;
|
||
if (!readingData.IsBaseLine)
|
||
{
|
||
var baseLineTaskId = await GetBaseLineTaskId(readingData);
|
||
baseLinePET5PS = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||
|
||
}
|
||
return new
|
||
{
|
||
BaseLinePET5PS = baseLinePET5PS,
|
||
//计算的5ps评分
|
||
CalculatePET5PS = await GetPET5PS(readingData),
|
||
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// 下载阅片报告
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<Stream> DownLoadReadReportStream(DownLoadReadReportInDto inDto)
|
||
{
|
||
throw new BusinessValidationFailedException(_localizer["ReadingCalculate_DownLoadReadReport"]);
|
||
}
|
||
|
||
#region 临时对象 单个请求的生命周期 避免重复查询数据库
|
||
|
||
private List<VisitTaskAnswerInfo> visitTaskAnswerList;
|
||
|
||
/// <summary>
|
||
/// 获取Sod的值
|
||
/// </summary>
|
||
private decimal? sODData;
|
||
|
||
/// <summary>
|
||
/// 基线任务Id
|
||
/// </summary>
|
||
private Guid? BaseLineTaskId;
|
||
|
||
/// <summary>
|
||
/// 影像是否无法融合
|
||
/// </summary>
|
||
private bool? isUnableFuse;
|
||
|
||
|
||
private string nAString = "NA";
|
||
#endregion
|
||
|
||
#region 删除病灶获取起始病灶序号
|
||
/// <summary>
|
||
/// 删除病灶获取起始病灶序号(RECIST1Point1 固定是1)
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
public async Task<int> GetDeleteLesionStatrIndex(DeleteReadingRowAnswerInDto inDto)
|
||
{
|
||
return 1;
|
||
}
|
||
#endregion
|
||
|
||
#region 获取阅片报告
|
||
/// <summary>
|
||
/// 获取阅片报告
|
||
/// </summary>
|
||
/// <param name="indto"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<GetReadingReportEvaluationOutDto> GetReadingReportEvaluation(GetReadingReportEvaluationInDto indto)
|
||
{
|
||
GetReadingReportEvaluationOutDto result = new GetReadingReportEvaluationOutDto();
|
||
|
||
result.CalculateResult = await this.GetReportVerify(new GetReportVerifyInDto()
|
||
{
|
||
VisitTaskId = indto.VisitTaskId
|
||
});
|
||
|
||
|
||
var visitTaskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).FirstNotNullAsync();
|
||
|
||
result.ReadingTaskState = visitTaskInfo.ReadingTaskState;
|
||
var taskInfoList = await _generalCalculateService.GetReadingReportTaskList(indto.VisitTaskId);
|
||
|
||
result.VisitTaskList = taskInfoList;
|
||
|
||
var visitTaskIds = taskInfoList.Select(x => x.VisitTaskId).ToList();
|
||
|
||
var criterionId = visitTaskInfo.TrialReadingCriterionId;
|
||
var questionList = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == criterionId && x.ShowQuestion != ShowQuestion.Hide).ToListAsync();
|
||
var tableQuestionList = await _readingTableQuestionTrialRepository.Where(x => x.TrialCriterionId == criterionId).OrderBy(x => x.ShowOrder).ToListAsync();
|
||
var tableAnsweRowInfos = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == indto.VisitTaskId).ProjectTo<TableAnsweRowInfo>(_mapper.ConfigurationProvider).ToListAsync();
|
||
result.LesionCountList = tableAnsweRowInfos.GroupBy(x => x.LesionType).Select(x => new LesionDto
|
||
{
|
||
LesionType = x.Key,
|
||
Count = x.ToList().Count()
|
||
}).ToList();
|
||
var answers = await _readingTaskQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)).ToListAsync();
|
||
var tableAnswers = await _readingTableQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)).ToListAsync();
|
||
|
||
var globalanswerList = await _readingGlobalTaskInfoRepository.Where(x => visitTaskIds.Contains(x.TaskId) && x.GlobalVisitTask.TaskState == TaskState.Effect && x.Answer != string.Empty).Select(x => new
|
||
{
|
||
x.TaskId,
|
||
x.GlobalVisitTask.VisitTaskNum,
|
||
x.QuestionId,
|
||
x.Answer
|
||
}).ToListAsync();
|
||
|
||
var alltableAnsweRowInfos = await _readingTableAnswerRowInfoRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)).ToListAsync();
|
||
var organIds = alltableAnsweRowInfos.Where(x => x.OrganInfoId != null).Select(x => x.OrganInfoId).Distinct().ToList();
|
||
var organInfos = await _organInfoRepository.Where(x => organIds.Contains(x.Id)).ToListAsync();
|
||
|
||
var needChangeType = new List<QuestionMark?>() {
|
||
QuestionMark.Organ,
|
||
QuestionMark.Location,
|
||
QuestionMark.Part,
|
||
};
|
||
|
||
// 第一级
|
||
|
||
#region 构造问题
|
||
List<ReadingReportDto> questions = questionList.Where(x => x.Type == ReadingQestionType.Group).OrderBy(x => x.ShowOrder).Select(x => new ReadingReportDto()
|
||
{
|
||
QuestionId = x.Id,
|
||
GroupName = x.GroupName,
|
||
GroupEnName = x.GroupEnName,
|
||
IsShowInDicom = x.IsShowInDicom,
|
||
Type = x.Type,
|
||
GroupId = x.GroupId,
|
||
QuestionType = x.QuestionType,
|
||
LesionType = x.LesionType,
|
||
QuestionGenre = x.QuestionGenre,
|
||
DataSource = x.DataSource,
|
||
DictionaryCode = x.DictionaryCode,
|
||
TypeValue = x.TypeValue,
|
||
QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us),
|
||
ShowOrder = x.ShowOrder,
|
||
ValueType = x.ValueType,
|
||
Unit = x.Unit,
|
||
CustomUnit = x.CustomUnit,
|
||
ReportLayType = ReportLayType.Group,
|
||
HighlightAnswer = x.HighlightAnswer,
|
||
HighlightAnswerList = x.HighlightAnswerList,
|
||
}).ToList();
|
||
|
||
// 分组
|
||
foreach (var item in questions)
|
||
{
|
||
item.Childrens = questionList.Where(x => x.GroupId == item.QuestionId).OrderBy(x => x.ShowOrder).Select(x => new ReadingReportDto()
|
||
{
|
||
GroupName = x.GroupName,
|
||
QuestionId = x.Id,
|
||
IsShowInDicom = x.IsShowInDicom,
|
||
GroupEnName = x.GroupEnName,
|
||
QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us),
|
||
LesionType = x.LesionType,
|
||
QuestionGenre = x.QuestionGenre,
|
||
DataSource = x.DataSource,
|
||
DictionaryCode = x.DictionaryCode,
|
||
Type = x.Type,
|
||
QuestionType = x.QuestionType,
|
||
TypeValue = x.TypeValue,
|
||
ShowOrder = x.ShowOrder,
|
||
OrderMark = x.OrderMark,
|
||
ValueType = x.ValueType,
|
||
Unit = x.Unit,
|
||
CustomUnit = x.CustomUnit,
|
||
ReportLayType = ReportLayType.Question,
|
||
HighlightAnswer = x.HighlightAnswer,
|
||
HighlightAnswerList = x.HighlightAnswerList,
|
||
}).ToList();
|
||
|
||
// 问题
|
||
foreach (var question in item.Childrens)
|
||
{
|
||
|
||
foreach (var task in taskInfoList)
|
||
{
|
||
|
||
var globalAnswer = globalanswerList.Where(x => x.TaskId == task.VisitTaskId && x.QuestionId == question.QuestionId).OrderByDescending(x => x.VisitTaskNum).FirstOrDefault();
|
||
var answer = answers.Where(x => x.VisitTaskId == task.VisitTaskId && x.ReadingQuestionTrialId == question.QuestionId).FirstOrDefault();
|
||
question.Answer.Add(new TaskQuestionAnswer()
|
||
{
|
||
Answer = answer == null ? string.Empty : answer.Answer,
|
||
IsGlobalChange = globalAnswer == null ? false : true,
|
||
GlobalChangeAnswer = globalAnswer == null ? string.Empty : globalAnswer.Answer,
|
||
TaskName = task.TaskName,
|
||
VisitTaskId = task.VisitTaskId,
|
||
|
||
});
|
||
}
|
||
|
||
// 构造表格行数据
|
||
|
||
|
||
var rowlist = tableAnsweRowInfos.Where(x => x.QuestionId == question.QuestionId).OrderBy(x => x.RowIndex).ToList();
|
||
|
||
|
||
question.Childrens = rowlist.Select(x => new ReadingReportDto()
|
||
{
|
||
QuestionName = question.OrderMark + x.RowIndex.GetLesionMark(),
|
||
SplitOrMergeLesionName = x.MergeName.IsNullOrEmpty() ? x.SplitName : x.MergeName,
|
||
SplitOrMergeType = x.SplitOrMergeType,
|
||
LesionType = question.LesionType,
|
||
IsShowInDicom = question.IsShowInDicom,
|
||
IsCanEditPosition = x.IsCanEditPosition,
|
||
RowIndex = x.RowIndex,
|
||
BlindName = x.BlindName,
|
||
ReportLayType = ReportLayType.Lesions,
|
||
}).ToList();
|
||
|
||
|
||
foreach (var row in question.Childrens)
|
||
{
|
||
// tableQuestion
|
||
row.Childrens = tableQuestionList.Where(x => x.ReadingQuestionId == question.QuestionId).Select(x => new ReadingReportDto()
|
||
{
|
||
QuestionName = x.QuestionName.LanguageName(x.QuestionEnName, _userInfo.IsEn_Us),
|
||
QuestionId = x.ReadingQuestionId,
|
||
TableQuestionId = x.Id,
|
||
Type = x.Type,
|
||
LesionType = question.LesionType,
|
||
TableQuestionType = x.TableQuestionType,
|
||
RowId = row.RowId,
|
||
IsShowInDicom = question.IsShowInDicom,
|
||
DataSource = x.DataSource,
|
||
DictionaryCode = x.DictionaryCode,
|
||
QuestionMark = x.QuestionMark,
|
||
TypeValue = x.TypeValue,
|
||
RowIndex = row.RowIndex,
|
||
ShowOrder = x.ShowOrder,
|
||
ValueType = x.ValueType,
|
||
Unit = x.Unit,
|
||
ReportLayType = ReportLayType.TableQuestion,
|
||
}).ToList();
|
||
|
||
|
||
foreach (var tableQuestion in row.Childrens)
|
||
{
|
||
foreach (var task in taskInfoList)
|
||
{
|
||
var rowinfo = alltableAnsweRowInfos.Where(x => x.VisitTaskId == task.VisitTaskId && x.QuestionId == tableQuestion.QuestionId && x.RowIndex == tableQuestion.RowIndex).FirstOrDefault();
|
||
var taskQuestionAnswer = new TaskQuestionAnswer()
|
||
{
|
||
Answer = tableAnswers.Where(x => x.VisitTaskId == task.VisitTaskId && x.QuestionId == tableQuestion.QuestionId && x.RowIndex == tableQuestion.RowIndex && x.TableQuestionId == tableQuestion.TableQuestionId).Select(x => x.Answer).FirstIsNullReturnEmpty(),
|
||
TaskName = task.TaskName,
|
||
VisitTaskId = task.VisitTaskId,
|
||
};
|
||
if (rowinfo != null && rowinfo.OrganInfoId != null)
|
||
{
|
||
var organInfo = organInfos.Where(x => x.Id == rowinfo.OrganInfoId).FirstOrDefault();
|
||
|
||
|
||
if (organInfo != null && needChangeType.Contains(tableQuestion.QuestionMark))
|
||
{
|
||
if (_userInfo.IsEn_Us)
|
||
{
|
||
switch (tableQuestion.QuestionMark)
|
||
{
|
||
case QuestionMark.Organ:
|
||
taskQuestionAnswer.Answer = organInfo.TULOCEN;
|
||
|
||
break;
|
||
case QuestionMark.Location:
|
||
if (organInfo.IsCanEditPosition)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
taskQuestionAnswer.Answer = organInfo.TULATEN;
|
||
|
||
}
|
||
break;
|
||
case QuestionMark.Part:
|
||
|
||
taskQuestionAnswer.Answer = organInfo.PartEN;
|
||
|
||
break;
|
||
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
switch (tableQuestion.QuestionMark)
|
||
{
|
||
case QuestionMark.Organ:
|
||
taskQuestionAnswer.Answer = organInfo.TULOC;
|
||
break;
|
||
case QuestionMark.Location:
|
||
if (organInfo.IsCanEditPosition)
|
||
{
|
||
|
||
}
|
||
else
|
||
{
|
||
taskQuestionAnswer.Answer = organInfo.TULAT;
|
||
|
||
}
|
||
break;
|
||
case QuestionMark.Part:
|
||
taskQuestionAnswer.Answer = organInfo.Part;
|
||
break;
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
tableQuestion.Answer.Add(taskQuestionAnswer);
|
||
}
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
};
|
||
}
|
||
#endregion
|
||
|
||
|
||
|
||
result.TaskQuestions = questions;
|
||
|
||
|
||
|
||
return result;
|
||
|
||
}
|
||
#endregion
|
||
|
||
|
||
/// <summary>
|
||
/// 获取是否是最大suvmax 病灶
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<GetIsSuvMaxLesionOutDto> GetIsSuvMaxLesion(GetIsSuvMaxLesionInDto inDto)
|
||
{
|
||
ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId);
|
||
|
||
var maxSuv = await GetSuvMax(readingData);
|
||
var rowInfo = readingData.QuestionInfo.SelectMany(x => x.TableRowInfoList).ToList();
|
||
var tableQuestions = rowInfo.SelectMany(x => x.TableQuestionList).Where(x => x.RowId == inDto.RowId).ToList();
|
||
|
||
var lesionMaxSuv = tableQuestions.Where(x => x.QuestionMark == QuestionMark.SUVmax).Select(x => x.Answer.IsNullOrEmptyReturn0()).MaxOrDefault();
|
||
|
||
|
||
return new GetIsSuvMaxLesionOutDto()
|
||
{
|
||
IsSuvMaxLesion = maxSuv == lesionMaxSuv
|
||
};
|
||
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取是否可选择不能融合影像
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<GetCanChooseNotMergeOutDto> GetCanChooseNotMerge(GetCanChooseNotMergeInDto inDto)
|
||
{
|
||
ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId);
|
||
|
||
List<QuestionType?> questionTypes = new List<QuestionType?>() {
|
||
QuestionType.LiverSUVmax,
|
||
QuestionType.MediastinumSUVmax,
|
||
QuestionType.SUVmax,
|
||
QuestionType.SUVmaxLesion,
|
||
};
|
||
|
||
var pet5ps = readingData.QuestionInfo.Where(x => x.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
|
||
GetCanChooseNotMergeOutDto getCanChooseNotMergeOutDto = new GetCanChooseNotMergeOutDto()
|
||
{
|
||
IsCanChooseNotMerge = !readingData.QuestionInfo.Any(x => questionTypes.Contains(x.QuestionType) && x.Answer != string.Empty)
|
||
|
||
|
||
};
|
||
return getCanChooseNotMergeOutDto;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 测试计算
|
||
/// </summary>
|
||
/// <param name="visitTaskId"></param>
|
||
/// <param name="type"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task TestCalculate(Guid visitTaskId, QuestionType type)
|
||
{
|
||
ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(visitTaskId);
|
||
await ReadingCalculate(readingData, new List<QuestionType>() { type });
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取最低PDD信息
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<GetPPDInfoOutDto> GetLowPPDInfo(GetPPDInfoInDto inDto)
|
||
{
|
||
GetPPDInfoOutDto result = new GetPPDInfoOutDto();
|
||
var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).ProjectTo<VisitTaskDto>(_mapper.ConfigurationProvider).FirstNotNullAsync();
|
||
var visitTaskIds = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
|
||
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
|
||
x.IsAnalysisCreate == taskinfo.IsAnalysisCreate &&
|
||
x.ArmEnum == taskinfo.ArmEnum &&
|
||
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).ToListAsync();
|
||
|
||
var answerList = await _readingTableQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)
|
||
&& x.QuestionId == inDto.QuestionId
|
||
&& x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.PPD && x.RowIndex == inDto.RowIndex)
|
||
.Select(x => new
|
||
{
|
||
x.Answer,
|
||
x.VisitTaskId,
|
||
}).ToListAsync();
|
||
|
||
var lowPddTaskid = answerList.Select(x => new
|
||
{
|
||
Answer = x.Answer.IsNullOrEmptyReturn0(),
|
||
x.VisitTaskId
|
||
}).OrderBy(x => x.Answer).Select(x => x.VisitTaskId).FirstOrDefault();
|
||
|
||
if (lowPddTaskid != default(Guid))
|
||
{
|
||
var lowPPDAnswerList = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == lowPddTaskid
|
||
&& x.QuestionId == inDto.QuestionId
|
||
&& x.RowIndex == inDto.RowIndex).Include(x => x.ReadingTableQuestionTrial)
|
||
.Select(x => new
|
||
{
|
||
x.Answer,
|
||
x.ReadingTableQuestionTrial.QuestionMark,
|
||
}).ToListAsync();
|
||
|
||
result.NadirPPD = lowPPDAnswerList.Where(x => x.QuestionMark == QuestionMark.PPD).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
result.LowPPDLDi = lowPPDAnswerList.Where(x => x.QuestionMark == QuestionMark.MajorAxis).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
result.LowPPDSDi = lowPPDAnswerList.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
result.LowPPDVisit = await _visitTaskRepository.Where(x => x.Id == lowPddTaskid).Select(x => x.TaskBlindName).FirstOrDefaultAsync();
|
||
}
|
||
|
||
return result;
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算任务
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task CalculateTask(CalculateTaskInDto inDto)
|
||
{
|
||
ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId);
|
||
readingData.IsChangeOtherTask = inDto.IsChangeOtherTask;
|
||
readingData.ComputationTrigger = inDto.ComputationTrigger;
|
||
await ReadingCalculate(readingData);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取报告验证的信息(这里每个标准可能不一样 返回用object)
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<GetReportVerifyOutDto> GetReportVerify(GetReportVerifyInDto inDto)
|
||
{
|
||
var calculateDto = await _generalCalculateService.GetReadingCalculateDto(inDto.VisitTaskId);
|
||
return new GetReportVerifyOutDto()
|
||
{
|
||
TumorEvaluate = calculateDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.ImgOncology).Select(x => x.Answer).FirstOrDefault(),
|
||
IsExistDisease = await this.GetReportIsExistDisease(inDto.VisitTaskId),
|
||
|
||
};
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 自动计算
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <param name="calculateType"></param>
|
||
/// <returns></returns>
|
||
public async Task ReadingCalculate(ReadingCalculateDto inDto, List<QuestionType>? calculateType = null)
|
||
{
|
||
|
||
#region 计算 这里顺序非常重要 后面计算的值要依赖前面计算的结果
|
||
var needAddList = new List<ReadingTaskQuestionAnswer>();
|
||
|
||
|
||
List<ReadingCalculateData> calculateList = new List<ReadingCalculateData>()
|
||
{
|
||
// 是否存在Pet
|
||
new ReadingCalculateData (){QuestionType=QuestionType.ExistPET,GetStringFun=GetExistPET ,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, } },
|
||
|
||
//垂直径乘积之和(SPD)
|
||
new ReadingCalculateData (){QuestionType=QuestionType.SPD,GetDecimalFun=GetSPD,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
// 与基线相比SPD变化的百分比
|
||
new ReadingCalculateData (){QuestionType=QuestionType.SPDChange,GetStringFun=CompareBaselineSPD,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
// 脾脏垂直径
|
||
new ReadingCalculateData (){QuestionType=QuestionType.SpleenLength,GetDecimalNullFun=GetSpleenLength,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||
|
||
// 与基线相比脾肿大增加的百分比
|
||
new ReadingCalculateData (){QuestionType=QuestionType.SplenoncusChange,GetStringFun=GetSplenoncusChange,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||
|
||
// 与最低点相比脾脏垂直径长度的增加值
|
||
new ReadingCalculateData (){QuestionType=QuestionType.SplenoncusAdd,GetStringFun=GetSplenoncusAdd,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||
|
||
// 与基线相比脾垂直径变化值
|
||
new ReadingCalculateData (){QuestionType=QuestionType.SplenoncusDiameterChange,GetStringFun=GetSplenoncusDiameterChange,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||
|
||
// 脾肿垂直径最低点访视
|
||
new ReadingCalculateData (){QuestionType=QuestionType.LowestSplenoncusVisit,GetStringFun=GetLowestSplenoncusVisit,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||
|
||
// 获取脾脏状态
|
||
new ReadingCalculateData (){QuestionType=QuestionType.SplenicStatus,GetStringFun=GetSplenicStatus,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,}},
|
||
|
||
// 获取脾脏评估
|
||
new ReadingCalculateData (){QuestionType=QuestionType.SplenicEvaluation,GetStringFun=GetSplenicEvaluation,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,ComputationTrigger.SplenicEvaluation,}},
|
||
|
||
//靶病灶评估
|
||
new ReadingCalculateData (){QuestionType=QuestionType.TargetLesion,GetStringFun=GetTargetLesionEvaluate,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,ComputationTrigger.MergeLesion,}},
|
||
|
||
//非靶病灶评估
|
||
new ReadingCalculateData (){QuestionType=QuestionType.NoTargetLesion,GetStringFun=GetNoTargetLesionEvaluate,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
//新病灶评估
|
||
new ReadingCalculateData (){QuestionType=QuestionType.NewLesionEvaluation,GetStringFun=GetNewLesionEvaluate,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
//获取肝脏评估
|
||
new ReadingCalculateData (){QuestionType=QuestionType.LiverAssessment,GetStringFun=GetLiverAssessment,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.LiverStatus,}},
|
||
|
||
// 骨髓中是否存在局灶性 FDG亲和病灶的证据
|
||
new ReadingCalculateData (){QuestionType=QuestionType.EvidenceFocalFDG,GetStringFun=GetEvidenceFocalFDG,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.ImageQuality, }},
|
||
|
||
//CT/MRI
|
||
new ReadingCalculateData (){QuestionType=QuestionType.CTandMRI,GetStringFun=CTMRIEvaluation,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.LiverStatus,ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,ComputationTrigger.SplenicEvaluation,ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,ComputationTrigger.MergeLesion,}},
|
||
|
||
//SUVmax
|
||
new ReadingCalculateData (){QuestionType=QuestionType.SUVmax,GetDecimalNullFun=GetSuvMax,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
// PET 5PS评分
|
||
new ReadingCalculateData (){QuestionType=QuestionType.PET5PS,GetStringFun=GetPET5PS,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.ImageQuality, ComputationTrigger.LiverBloodPool,ComputationTrigger.MediastinalPool,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
// 修改PET 5PS评分备注
|
||
new ReadingCalculateData (){QuestionType=QuestionType.PSScoreRemarks,GetStringFun=GetPET5PSRemark,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.LiverBloodPool,ComputationTrigger.MediastinalPool,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
//与基线相比摄取值变化
|
||
new ReadingCalculateData (){QuestionType=QuestionType.UptakeChange,GetStringFun=GetUptakeChange,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.ImageQuality, ComputationTrigger.LiverBloodPool,ComputationTrigger.MediastinalPool,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
// FDG-PET 评估结果
|
||
new ReadingCalculateData (){QuestionType=QuestionType.FDGPET,GetStringFun=GetFDGPETOverallAssessment,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.ImageQuality, ComputationTrigger.LiverBloodPool,ComputationTrigger.MediastinalPool,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,ComputationTrigger.PDGPET,}},
|
||
|
||
// 上一次 FDG-PET 评估结果
|
||
new ReadingCalculateData (){QuestionType=QuestionType.LastFDGPET,GetStringFun=GetLastFDGPETOverallAssessment,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
// 影像学整体肿瘤评估
|
||
new ReadingCalculateData (){QuestionType=QuestionType.ImgOncology,GetStringFun=GetImgOncology,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.ImageQuality, ComputationTrigger.LiverStatus,ComputationTrigger.SplenicApexPosition,ComputationTrigger.PositionSpleenFloor,ComputationTrigger.SplenicEvaluation,ComputationTrigger.LiverBloodPool,ComputationTrigger.MediastinalPool,ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,ComputationTrigger.PDGPET,ComputationTrigger.MergeLesion,}},
|
||
|
||
|
||
|
||
// SUVmax所在病灶
|
||
new ReadingCalculateData (){QuestionType=QuestionType.SUVmaxLesion,GetStringFun=GetSuvMaxFocus,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
|
||
//是否存在疾病
|
||
new ReadingCalculateData (){QuestionType=QuestionType.ExistDisease,GetStringFun=GetIsExistDisease,ComputationTriggerList=new List<ComputationTrigger>(){ ComputationTrigger.InitialCalculation, ComputationTrigger.CTSave,ComputationTrigger.MergeSave,ComputationTrigger.RemoveLesion,}},
|
||
|
||
|
||
|
||
////靶病灶径线之和(SOD)
|
||
//new ReadingCalculateData (){QuestionType=QuestionType.SOD,GetDecimalNullFun=GetSODData},
|
||
|
||
////非淋巴结靶病灶长径之和
|
||
//new ReadingCalculateData (){QuestionType=QuestionType.SumOfDiameter,GetDecimalNullFun=GetSumOfDiameter},
|
||
|
||
////与基线SOD相比变化量(mm)
|
||
// new ReadingCalculateData (){QuestionType=QuestionType.SODChange,GetDecimalNullFun=GetSODChange},
|
||
|
||
////与基线访视相比SOD变化百分比
|
||
// new ReadingCalculateData (){QuestionType=QuestionType.SODPercent,GetDecimalNullFun=GetSODPercent},
|
||
|
||
////与整个访视期间SOD最低点相比增加的值(mm) //其他任务需要改
|
||
// new ReadingCalculateData (){QuestionType=QuestionType.LowestIncrease,GetDecimalNullFun=GetLowestIncrease,/*ChangeAllTaskFun=ChangeAllLowestIncrease*/},
|
||
|
||
// //与整个访视期间SOD最低点相比增加的百分比 //其他任务需要改
|
||
// new ReadingCalculateData (){QuestionType=QuestionType.LowPercent,GetDecimalNullFun=GetLowPercent,/*ChangeAllTaskFun=ChangeAllLowPercent*/},
|
||
|
||
////整个访视期间SOD最低点访视名称 //其他任务需要改
|
||
// new ReadingCalculateData (){QuestionType=QuestionType.LowVisit,GetStringFun=GetLowVisit,/*ChangeAllTaskFun=ChangeAllLowVisitName*/},
|
||
|
||
// //是否存在非淋巴结靶病灶
|
||
// new ReadingCalculateData (){QuestionType=QuestionType.IsLymphTarget,GetStringFun=GetIsLymphTarget},
|
||
|
||
// //是否存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上
|
||
// new ReadingCalculateData (){QuestionType=QuestionType.IsAddFive,GetStringFun=GetIsAddFive},
|
||
|
||
// //被评估为NE的单个靶病灶
|
||
// new ReadingCalculateData (){QuestionType=QuestionType.NETarget,GetStringFun=GetNETarget},
|
||
|
||
|
||
|
||
// //脾脏评估
|
||
//new ReadingCalculateData (){QuestionType=QuestionType.SplenicEvaluation,GetStringFun=GetNewLesionEvaluate},
|
||
|
||
// //整体肿瘤评估
|
||
// new ReadingCalculateData (){QuestionType=QuestionType.Tumor,GetStringFun=GetTumor},
|
||
|
||
// //是否存在疾病
|
||
// new ReadingCalculateData (){QuestionType=QuestionType.ExistDisease,GetStringFun=GetIsExistDisease},
|
||
|
||
};
|
||
|
||
// 没有靶病灶只计算最后几个
|
||
//if (inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).Sum(x => x.TableRowInfoList.Count()) == 0)
|
||
//{
|
||
|
||
// List<QuestionType> questionTypes = new List<QuestionType>()
|
||
// {
|
||
// QuestionType.TargetLesion,
|
||
// QuestionType.NoTargetLesion,
|
||
// QuestionType.NewLesions,
|
||
// QuestionType.Tumor,
|
||
// QuestionType.ExistDisease,
|
||
// };
|
||
|
||
// // 没有靶病灶就删除其他几个答案的值
|
||
// var isNeedDeleteTypes = calculateList.Where(x => !questionTypes.Contains(x.QuestionType)).Select(x => x.QuestionType).ToList();
|
||
|
||
|
||
// var isNeedDeleteIds = inDto.QuestionInfo.Where(x => x.QuestionType != null && isNeedDeleteTypes.Contains(x.QuestionType.Value)).Select(x => x.QuestionId).ToList();
|
||
|
||
// await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == inDto.VisitTaskId && isNeedDeleteIds.Contains(x.ReadingQuestionTrialId), x => new ReadingTaskQuestionAnswer
|
||
// {
|
||
// Answer = string.Empty
|
||
// });
|
||
|
||
|
||
|
||
// calculateList = calculateList.Where(x => questionTypes.Contains(x.QuestionType)).ToList();
|
||
|
||
|
||
|
||
|
||
|
||
//}
|
||
|
||
if (calculateType != null)
|
||
{
|
||
calculateList = calculateList.Where(x => calculateType.Contains(x.QuestionType)).ToList();
|
||
}
|
||
|
||
|
||
calculateList = calculateList.Where(x => x.ComputationTriggerList.Contains(inDto.ComputationTrigger)).ToList();
|
||
var typeNAList = new List<QuestionType>
|
||
{
|
||
QuestionType.SODChange,
|
||
QuestionType.SODPercent,
|
||
QuestionType.LowestIncrease,
|
||
QuestionType.LowPercent,
|
||
};
|
||
|
||
foreach (var calculate in calculateList)
|
||
{
|
||
var item = inDto.QuestionInfo.FirstOrDefault(x => x.QuestionType == calculate.QuestionType);
|
||
|
||
if (item != null)
|
||
{
|
||
//计算答案
|
||
if (inDto.IsOnlyChangeAllTask == false)
|
||
{
|
||
|
||
#region 计算答案
|
||
if (calculate.GetDecimalFun != null)
|
||
{
|
||
item.Answer = (await calculate.GetDecimalFun(inDto)).ToString();
|
||
|
||
}
|
||
else if (calculate.GetDecimalNullFun != null)
|
||
{
|
||
var value = await calculate.GetDecimalNullFun(inDto);
|
||
item.Answer = value == null ? string.Empty : value.Value.ToString();
|
||
}
|
||
else if (calculate.GetStringFun != null)
|
||
{
|
||
item.Answer = await calculate.GetStringFun(inDto);
|
||
}
|
||
#endregion
|
||
// 修改修约小数位数
|
||
|
||
List<ValueOfType?> valueOfTypes = new List<ValueOfType?>() {
|
||
|
||
ValueOfType.Decimals,
|
||
ValueOfType.Percentage
|
||
};
|
||
|
||
if (inDto.DigitPlaces != -1)
|
||
{
|
||
try
|
||
{
|
||
|
||
if (valueOfTypes.Contains(item.ValueType))
|
||
{
|
||
item.Answer = decimal.Round(decimal.Parse(item.Answer ?? "0"), inDto.DigitPlaces).ToString("F" + inDto.DigitPlaces.ToString());
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
needAddList.Add(new ReadingTaskQuestionAnswer()
|
||
{
|
||
Answer = item.Answer,
|
||
ReadingQuestionTrialId = item.QuestionId,
|
||
});
|
||
}
|
||
|
||
// 修改全局
|
||
if (inDto.IsChangeOtherTask && calculate.ChangeAllTaskFun != null)
|
||
{
|
||
await calculate.ChangeAllTaskFun(new ChangeAllTaskDto()
|
||
{
|
||
calculateDto = inDto,
|
||
QuestionId = item.QuestionId,
|
||
});
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
var questionIds = needAddList.Select(x => x.ReadingQuestionTrialId).ToList();
|
||
|
||
await _readingTaskQuestionAnswerRepository.BatchDeleteNoTrackingAsync(x => questionIds.Contains(x.ReadingQuestionTrialId) && x.VisitTaskId == inDto.VisitTaskId);
|
||
needAddList.ForEach(x =>
|
||
{
|
||
x.SubjectId = inDto.SubjectId;
|
||
x.ReadingQuestionCriterionTrialId = inDto.CriterionId;
|
||
x.VisitTaskId = inDto.VisitTaskId;
|
||
x.TrialId = inDto.TrialId;
|
||
x.SubjectId = inDto.SubjectId;
|
||
});
|
||
|
||
await _readingTaskQuestionAnswerRepository.AddRangeAsync(needAddList);
|
||
|
||
await _readingTaskQuestionAnswerRepository.SaveChangesAsync();
|
||
#endregion
|
||
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取影像是否无法融合
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<bool> ImageQualityIsUnableFuse(ReadingCalculateDto inDto)
|
||
{
|
||
if (isUnableFuse != null)
|
||
{
|
||
return isUnableFuse.Value;
|
||
}
|
||
else
|
||
{
|
||
var imageQualityProblem = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.ImageQualityProblem).Select(x => x.Answer).FirstOrDefault();
|
||
isUnableFuse = imageQualityProblem == ((int)ImageQualityIssues.PETCTFailureFuse).ToString();
|
||
return isUnableFuse.Value;
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取报告整体整体评估
|
||
/// </summary>
|
||
/// <param name="visitTaskId"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetReportTumor(Guid visitTaskId)
|
||
{
|
||
return await GetTumor(await _generalCalculateService.GetReadingCalculateDto(visitTaskId));
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取报告是否存在疾病
|
||
/// </summary>
|
||
/// <param name="visitTaskId"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetReportIsExistDisease(Guid visitTaskId)
|
||
{
|
||
return await GetIsExistDisease(await _generalCalculateService.GetReadingCalculateDto(visitTaskId));
|
||
}
|
||
|
||
/// <summary>
|
||
/// 验证访视提交
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto)
|
||
{
|
||
|
||
if (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.ReadingQuestionTrial.QuestionType == QuestionType.ImageQualityAssessment && x.VisitTaskId == inDto.VisitTaskId && x.Answer == ImageQualityEvaluation.Abnormal.GetEnumInt()))
|
||
{
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
|
||
|
||
|
||
var tableAnswerList = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && (x.Answer == string.Empty || x.Answer == null)
|
||
&& x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State
|
||
)
|
||
.Select(x => new
|
||
{
|
||
x.ReadingQuestionTrial.OrderMark,
|
||
x.RowIndex,
|
||
QuestionMark = x.ReadingTableQuestionTrial.QuestionMark,
|
||
Answer = x.Answer,
|
||
|
||
}).ToListAsync();
|
||
|
||
|
||
string errorMassage = string.Empty;
|
||
|
||
var rowAnswerList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && (x.MeasureData == string.Empty || x.MeasureData == null))
|
||
.Select(x => new
|
||
{
|
||
x.ReadingQuestionTrial.OrderMark,
|
||
x.RowIndex,
|
||
x.Id,
|
||
}).ToListAsync();
|
||
|
||
|
||
var unableEvaluateRowIds = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId &&
|
||
(x.Answer == TargetState.UnableEvaluate.GetEnumInt() || x.Answer == TargetState.Loss.GetEnumInt())
|
||
&& x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State
|
||
)
|
||
.Select(x => x.RowId).Distinct().ToListAsync();
|
||
|
||
|
||
List<string> measureDataList = rowAnswerList.Where(x => !unableEvaluateRowIds.Contains(x.Id)).Select(x => x.OrderMark + x.RowIndex.GetLesionMark()).ToList();
|
||
|
||
List<string> stateIsNullList = tableAnswerList.Select(x => x.OrderMark + x.RowIndex.GetLesionMark()).ToList();
|
||
|
||
|
||
List<string> allExists = measureDataList.Intersect(stateIsNullList).ToList();
|
||
measureDataList = measureDataList.Except(allExists).ToList();
|
||
stateIsNullList = stateIsNullList.Except(allExists).ToList();
|
||
|
||
|
||
if (measureDataList.Count() > 0)
|
||
{
|
||
errorMassage += _localizer["ReadingCalculate_NoMarker", string.Join(',', measureDataList)] + ",";
|
||
}
|
||
|
||
|
||
if (tableAnswerList.Count > 0)
|
||
{
|
||
errorMassage += _localizer["ReadingCalculate_StatusIsEmpty", string.Join(',', stateIsNullList)] + ",";
|
||
}
|
||
|
||
if (allExists.Count > 0)
|
||
{
|
||
errorMassage += _localizer["ReadingCalculate_NoMarkerEmpty", string.Join(',', stateIsNullList)] + ",";
|
||
}
|
||
|
||
// 判断是否有pet
|
||
if (await _readingTaskQuestionAnswerRepository.AnyAsync(x => x.ReadingQuestionTrial.QuestionType == QuestionType.ExistPET && x.VisitTaskId == inDto.VisitTaskId && x.Answer == ReadingYesOrNo.Yes.GetEnumInt()))
|
||
{
|
||
|
||
List<QuestionType?> required = new List<QuestionType?>() {
|
||
QuestionType.LiverSUVmax,
|
||
QuestionType.MediastinumSUVmax,
|
||
QuestionType.SUVmax,
|
||
QuestionType.SUVmaxLesion,
|
||
QuestionType.PET5PS,
|
||
};
|
||
if (taskinfo.VisitTaskNum != 0m)
|
||
{
|
||
required.Add(QuestionType.UptakeChange);
|
||
required.Add(QuestionType.EvidenceFocalFDG);
|
||
}
|
||
|
||
if ((await _readingTaskQuestionAnswerRepository.CountAsync(x => required.Contains(x.ReadingQuestionTrial.QuestionType) && x.VisitTaskId == inDto.VisitTaskId && x.Answer != string.Empty)) != required.Count())
|
||
{
|
||
if (taskinfo.VisitTaskNum != 0m)
|
||
{
|
||
errorMassage += _localizer["ReadingCalculate_LuganoPetVerification"];
|
||
}
|
||
else
|
||
{
|
||
errorMassage += _localizer["ReadingCalculate_LuganoBaseLinePetVerification"];
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
|
||
if (errorMassage != string.Empty)
|
||
{
|
||
//errorMassage = errorMassage;
|
||
throw new BusinessValidationFailedException(errorMassage);
|
||
}
|
||
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算融合靶病灶的状态
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task CalculateMergeTargetLesionStatus(CalculateTargetLesionStatusInDto inDto)
|
||
{
|
||
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
|
||
|
||
// 找到靶病灶问题
|
||
var targetQuestion = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskInfo.TrialReadingCriterionId && x.LesionType == LesionType.TargetLesion).FirstOrDefaultAsync();
|
||
if (targetQuestion != null)
|
||
{
|
||
// 找到状态问题
|
||
var stateQuestion = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionId == targetQuestion.Id && x.QuestionMark == QuestionMark.State).FirstOrDefaultAsync();
|
||
if (stateQuestion != null)
|
||
{
|
||
|
||
//// 找到主病灶的状态
|
||
//var state = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.RowIndex == (int)Math.Floor(inDto.RowNumber) && x.TableQuestionId == stateQuestion.Id).Select(x => x.Answer).FirstOrDefaultAsync();
|
||
|
||
// 长径
|
||
var majorAxis = (await _readingTableQuestionAnswerRepository.Where(x =>
|
||
x.VisitTaskId == inDto.VisitTaskId &&
|
||
x.RowIndex == inDto.RowNumber &&
|
||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.MajorAxis &&
|
||
x.QuestionId == targetQuestion.Id
|
||
).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||
|
||
// 短径
|
||
var shortAxis = (await _readingTableQuestionAnswerRepository.Where(x =>
|
||
x.VisitTaskId == inDto.VisitTaskId &&
|
||
x.RowIndex == inDto.RowNumber &&
|
||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.ShortAxis &&
|
||
x.QuestionId == targetQuestion.Id
|
||
).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||
|
||
// 找到ppd问题
|
||
var ppdQuestion = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionId == targetQuestion.Id && x.QuestionMark == QuestionMark.PPD).FirstOrDefaultAsync();
|
||
|
||
if (ppdQuestion != null)
|
||
{
|
||
var pPdAnswer = (await _readingTableQuestionAnswerRepository.Where(x =>
|
||
x.VisitTaskId == inDto.VisitTaskId &&
|
||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.PPD &&
|
||
x.QuestionId == targetQuestion.Id &&
|
||
x.RowIndex == inDto.RowNumber
|
||
).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||
|
||
|
||
// 是否符合疾病进展
|
||
var accord = false;
|
||
|
||
var lowPPDInfo = await GetLowPPDInfo(new GetPPDInfoInDto()
|
||
{
|
||
RowIndex = inDto.RowNumber,
|
||
VisitTaskId = inDto.VisitTaskId,
|
||
QuestionId = inDto.QuestionId,
|
||
});
|
||
|
||
|
||
if (lowPPDInfo.NadirPPD != 0)
|
||
{
|
||
//当前融合靶病灶LDi>15 mm &&
|
||
//(当前融合靶病灶的ppd-最低点PPD)/最低点PPD ≥50 %
|
||
|
||
if (majorAxis >= 15 &&
|
||
(pPdAnswer - lowPPDInfo.NadirPPD) * 100 / lowPPDInfo.NadirPPD >= 50)
|
||
{
|
||
accord = true;
|
||
}
|
||
}
|
||
|
||
// 符合疾病进展
|
||
if (accord)
|
||
{
|
||
await _readingTableQuestionAnswerRepository.UpdatePartialFromQueryAsync(x =>
|
||
x.VisitTaskId == inDto.VisitTaskId &&
|
||
x.RowIndex == inDto.RowNumber &&
|
||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State &&
|
||
x.QuestionId == targetQuestion.Id, x => new ReadingTableQuestionAnswer()
|
||
{
|
||
Answer = TargetState.DiseaseProgression.GetEnumInt()
|
||
}
|
||
);
|
||
}
|
||
//else if (state == TargetState.DiseaseProgression.GetEnumInt())
|
||
//{
|
||
// //await _readingTableQuestionAnswerRepository.UpdatePartialFromQueryAsync(x =>
|
||
// // x.VisitTaskId == inDto.VisitTaskId &&
|
||
// // x.RowIndex == inDto.RowNumber &&
|
||
// // x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State &&
|
||
// // x.QuestionId == targetQuestion.Id, x => new ReadingTableQuestionAnswer()
|
||
// // {
|
||
// // Answer = TargetState.Exist.GetEnumInt()
|
||
// // }
|
||
// // );
|
||
//}
|
||
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算分裂靶病灶状态
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task CalculateTargetLesionStatus(CalculateTargetLesionStatusInDto inDto)
|
||
{
|
||
if (inDto.RowNumber % 1 != 0)
|
||
{
|
||
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
|
||
|
||
// 找到靶病灶问题
|
||
var targetQuestion = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskInfo.TrialReadingCriterionId && x.LesionType == LesionType.TargetLesion).FirstOrDefaultAsync();
|
||
if (targetQuestion != null)
|
||
{
|
||
// 找到状态问题
|
||
var stateQuestion = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionId == targetQuestion.Id && x.QuestionMark == QuestionMark.State).FirstOrDefaultAsync();
|
||
if (stateQuestion != null)
|
||
{
|
||
|
||
// 找到主病灶的状态
|
||
var state = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && x.RowIndex == (int)Math.Floor(inDto.RowNumber) && x.TableQuestionId == stateQuestion.Id).Select(x => x.Answer).FirstOrDefaultAsync();
|
||
|
||
// 长径
|
||
var majorAxis = (await _readingTableQuestionAnswerRepository.Where(x =>
|
||
x.VisitTaskId == inDto.VisitTaskId &&
|
||
x.RowIndex >= (int)Math.Floor(inDto.RowNumber) && x.RowIndex < ((int)Math.Floor(inDto.RowNumber) + 1) &&
|
||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.MajorAxis &&
|
||
x.QuestionId == targetQuestion.Id
|
||
).Select(x => x.Answer).ToListAsync()).Select(x => x.IsNullOrEmptyReturn0()).Sum();
|
||
|
||
// 短径
|
||
var shortAxis = (await _readingTableQuestionAnswerRepository.Where(x =>
|
||
x.VisitTaskId == inDto.VisitTaskId &&
|
||
x.RowIndex >= (int)Math.Floor(inDto.RowNumber) && x.RowIndex < ((int)Math.Floor(inDto.RowNumber) + 1) &&
|
||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.ShortAxis &&
|
||
x.QuestionId == targetQuestion.Id
|
||
).Select(x => x.Answer).ToListAsync()).Select(x => x.IsNullOrEmptyReturn0()).Sum();
|
||
|
||
// 找到ppd问题
|
||
var ppdQuestion = await _readingTableQuestionTrialRepository.Where(x => x.ReadingQuestionId == targetQuestion.Id && x.QuestionMark == QuestionMark.PPD).FirstOrDefaultAsync();
|
||
|
||
if (ppdQuestion != null)
|
||
{
|
||
var ppdAnswerList = await _readingTableQuestionAnswerRepository.Where(x =>
|
||
x.VisitTaskId == inDto.VisitTaskId &&
|
||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.PPD &&
|
||
x.QuestionId == targetQuestion.Id &&
|
||
x.RowIndex >= (int)Math.Floor(inDto.RowNumber) && x.RowIndex < ((int)Math.Floor(inDto.RowNumber) + 1)
|
||
).Select(x => x.Answer).ToListAsync();
|
||
|
||
var allPPd = ppdAnswerList.Select(x => x.IsNullOrEmptyReturn0()).Sum();
|
||
|
||
// 是否符合疾病进展
|
||
var accord = false;
|
||
|
||
var lowPPDInfo = await GetLowPPDInfo(new GetPPDInfoInDto()
|
||
{
|
||
RowIndex = (int)Math.Floor(inDto.RowNumber),
|
||
VisitTaskId = inDto.VisitTaskId,
|
||
QuestionId = inDto.QuestionId,
|
||
});
|
||
|
||
|
||
if (lowPPDInfo.NadirPPD != 0)
|
||
{
|
||
//15mm < 当前靶病灶LDi≤20mm &&
|
||
//&& 相比最低点PPD增加百分比 ≥50% &&
|
||
//(相比PPD最低点LDi增加值 ≥5 mm
|
||
//or相比PPD最低点SDi增加值≥5 mm)
|
||
if (15 < majorAxis && majorAxis <= 20 &&
|
||
(allPPd - lowPPDInfo.NadirPPD) * 100 / lowPPDInfo.NadirPPD >= 50 &&
|
||
(majorAxis - lowPPDInfo.LowPPDLDi >= 5 ||
|
||
shortAxis - lowPPDInfo.LowPPDSDi >= 5)
|
||
)
|
||
{
|
||
accord = true;
|
||
}
|
||
|
||
//当前靶病灶LDi>20 mm
|
||
//相比最低点PPD增加百分比 ≥50%
|
||
// (相比PPD最低点LDi增加值 ≥10 mm
|
||
// 或者相比PPD最低点SDi增加值Sdi ≥10 mm)
|
||
if (majorAxis > 20 &&
|
||
(allPPd - lowPPDInfo.NadirPPD) * 100 / lowPPDInfo.NadirPPD >= 50 &&
|
||
(majorAxis - lowPPDInfo.LowPPDLDi >= 10 ||
|
||
shortAxis - lowPPDInfo.LowPPDSDi >= 10)
|
||
)
|
||
{
|
||
accord = true;
|
||
}
|
||
|
||
}
|
||
|
||
// 符合疾病进展
|
||
if (accord)
|
||
{
|
||
await _readingTableQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x =>
|
||
x.VisitTaskId == inDto.VisitTaskId &&
|
||
x.RowIndex == (int)Math.Floor(inDto.RowNumber) &&
|
||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State &&
|
||
x.QuestionId == targetQuestion.Id, x => new ReadingTableQuestionAnswer()
|
||
{
|
||
Answer = TargetState.DiseaseProgression.GetEnumInt()
|
||
}
|
||
);
|
||
}
|
||
else if (state == TargetState.DiseaseProgression.GetEnumInt())
|
||
{
|
||
await _readingTableQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x =>
|
||
x.VisitTaskId == inDto.VisitTaskId &&
|
||
x.RowIndex == (int)Math.Floor(inDto.RowNumber) &&
|
||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State &&
|
||
x.QuestionId == targetQuestion.Id, x => new ReadingTableQuestionAnswer()
|
||
{
|
||
Answer = TargetState.Exist.GetEnumInt()
|
||
}
|
||
);
|
||
}
|
||
|
||
await _readingTableQuestionAnswerRepository.SaveChangesAsync();
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 获取分裂病灶的PPd之和 不包括当前的主病灶
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<List<GetSplitPPdOutDto>> GetSplitPPdSum(GetSplitPPdInDto inDto)
|
||
{
|
||
List<GetSplitPPdOutDto> result = new List<GetSplitPPdOutDto>();
|
||
var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync();
|
||
var targetQuestion = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskInfo.TrialReadingCriterionId && x.LesionType == LesionType.TargetLesion).FirstOrDefaultAsync();
|
||
if (targetQuestion != null)
|
||
{
|
||
var ppdAnswerList = await _readingTableQuestionAnswerRepository.Where(x =>
|
||
x.VisitTaskId == inDto.VisitTaskId &&
|
||
//x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.PPD &&
|
||
x.QuestionId == targetQuestion.Id)
|
||
.Select(x => new
|
||
{
|
||
x.RowId,
|
||
x.RowIndex,
|
||
x.Answer,
|
||
x.ReadingTableQuestionTrial.QuestionMark,
|
||
}).ToListAsync();
|
||
var answerList = ppdAnswerList.Select(x => new
|
||
{
|
||
x.RowId,
|
||
x.RowIndex,
|
||
Answer = x.Answer.IsNullOrEmptyReturn0(),
|
||
x.QuestionMark,
|
||
}).ToList();
|
||
var maxRowIndex = answerList.MaxOrDefault(x => x.RowIndex);
|
||
for (int i = 1; i < maxRowIndex; i++)
|
||
{
|
||
result.Add(new GetSplitPPdOutDto()
|
||
{
|
||
RowId = answerList.Where(x => x.RowIndex == i).Select(x => x.RowId).FirstOrDefault(),
|
||
RowIndex = answerList.Where(x => x.RowIndex == i).Select(x => x.RowIndex).FirstOrDefault().ToString(),
|
||
AllPPD = answerList.Where(x => x.QuestionMark == QuestionMark.PPD).Where(x => x.RowIndex > i && x.RowIndex < (i + 1)).Sum(x => x.Answer),
|
||
AllLDi = answerList.Where(x => x.QuestionMark == QuestionMark.MajorAxis).Where(x => x.RowIndex > i && x.RowIndex < (i + 1)).Sum(x => x.Answer),
|
||
AllSDi = answerList.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Where(x => x.RowIndex > i && x.RowIndex < (i + 1)).Sum(x => x.Answer),
|
||
});
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
#region 将上一次的访视病灶添加到这一次
|
||
|
||
/// <summary>
|
||
/// 将上一次的访视病灶添加到这一次
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<AddTaskLesionAnswerFromLastTaskOutDto> AddTaskLesionAnswerFromLastTask(AddTaskLesionAnswerFromLastTaskInDto inDto)
|
||
{
|
||
var visitTaskId = inDto.VisitTaskId;
|
||
|
||
var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
|
||
|
||
var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == taskinfo.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync();
|
||
|
||
|
||
ReadingCalculateDto readingData = await _generalCalculateService.GetReadingCalculateDto(visitTaskId);
|
||
|
||
await ReadingCalculate(readingData, new List<QuestionType>() { QuestionType.ExistPET });
|
||
|
||
|
||
// 判断当前任务是否是基线
|
||
if (taskinfo.SourceSubjectVisitId != baseLineVisitId)
|
||
{
|
||
// 判断当前任务是是否有表格问题答案
|
||
if (!(await _readingTableQuestionAnswerRepository.AnyAsync(x => x.VisitTaskId == visitTaskId)))
|
||
{
|
||
|
||
var LastVisitTaskId = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
|
||
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
|
||
x.IsAnalysisCreate == taskinfo.IsAnalysisCreate &&
|
||
x.ArmEnum == taskinfo.ArmEnum &&
|
||
x.IsSelfAnalysis == taskinfo.IsSelfAnalysis &&
|
||
x.SubjectId == taskinfo.SubjectId && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTaskNum < taskinfo.VisitTaskNum && x.TaskState == TaskState.Effect && x.ArmEnum == taskinfo.ArmEnum
|
||
).OrderByDescending(x => x.VisitTaskNum).Select(x => x.Id).FirstOrDefaultAsync();
|
||
|
||
|
||
|
||
var copyTableAnswers = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == LastVisitTaskId).Select(x => new CopyTableAnswerDto()
|
||
{
|
||
Answer = x.Answer,
|
||
QuestionId = x.QuestionId,
|
||
RowId = x.RowId,
|
||
QuestionMark = x.ReadingTableQuestionTrial.QuestionMark,
|
||
TableQuestionId = x.TableQuestionId,
|
||
RowIndex = x.RowIndex,
|
||
TrialId = x.TrialId
|
||
}).ToListAsync();
|
||
|
||
var tableRowAnswers = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == LastVisitTaskId).OrderBy(x => x.RowIndex).ProjectTo<CopyTableAnswerRowInfo>(_mapper.ConfigurationProvider).ToListAsync();
|
||
|
||
|
||
tableRowAnswers.ForEach(x =>
|
||
{
|
||
|
||
switch (x.SplitOrMergeType)
|
||
{
|
||
case SplitOrMergeType.Merge:
|
||
case SplitOrMergeType.Merged:
|
||
x.SplitOrMergeType = SplitOrMergeType.Merged;
|
||
break;
|
||
case SplitOrMergeType.MergeMain:
|
||
case SplitOrMergeType.MergeMained:
|
||
x.SplitOrMergeType = SplitOrMergeType.MergeMained;
|
||
break;
|
||
default:
|
||
x.SplitOrMergeType = null;
|
||
break;
|
||
}
|
||
x.VisitTaskId = visitTaskId;
|
||
x.IsCurrentTaskAdd = false;
|
||
x.Id = NewId.NextGuid();
|
||
x.SeriesId = null;
|
||
x.InstanceId = null;
|
||
x.MeasureData = string.Empty;
|
||
x.PicturePath = string.Empty;
|
||
|
||
|
||
});
|
||
|
||
tableRowAnswers.ForEach(x =>
|
||
{
|
||
x.SplitRowId = tableRowAnswers.Where(y => y.OriginalId == x.SplitRowId).FirstOrDefault()?.Id;
|
||
x.MergeRowId = tableRowAnswers.Where(y => y.OriginalId == x.MergeRowId).FirstOrDefault()?.Id;
|
||
|
||
});
|
||
|
||
List<QuestionMark?> needCopyMarks = new List<QuestionMark?>()
|
||
{
|
||
|
||
QuestionMark.IsLymph,
|
||
QuestionMark.Lesion,
|
||
QuestionMark.Organ,
|
||
QuestionMark.Location,
|
||
QuestionMark.Part,
|
||
QuestionMark.BodyPartDescription,
|
||
QuestionMark.LowPPDLDi,
|
||
QuestionMark.LowPPDSDi,
|
||
QuestionMark.NadirPPD,
|
||
QuestionMark.LowPPDVisit,
|
||
};
|
||
|
||
|
||
|
||
var rowIndexList = copyTableAnswers.Select(x => x.RowIndex).Distinct().ToList();
|
||
// 找到靶病灶问题Id
|
||
var questionId = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId && x.LesionType == LesionType.TargetLesion).Select(x => x.Id).FirstNotNullAsync();
|
||
|
||
foreach (var item in rowIndexList)
|
||
{
|
||
var lowPPD = await this.GetLowPPDInfo(new GetPPDInfoInDto()
|
||
{
|
||
|
||
VisitTaskId = visitTaskId,
|
||
QuestionId = questionId,
|
||
RowIndex = item
|
||
});
|
||
|
||
copyTableAnswers.Where(x => x.RowIndex == item).ForEach(x =>
|
||
{
|
||
|
||
|
||
switch (x.QuestionMark)
|
||
{
|
||
case QuestionMark.LowPPDLDi:
|
||
x.Answer = lowPPD.LowPPDLDi == null ? string.Empty : lowPPD.LowPPDLDi.Value.ToString();
|
||
break;
|
||
case QuestionMark.LowPPDSDi:
|
||
x.Answer = lowPPD.LowPPDSDi == null ? string.Empty : lowPPD.LowPPDSDi.Value.ToString();
|
||
break;
|
||
case QuestionMark.NadirPPD:
|
||
x.Answer = lowPPD.NadirPPD == null ? string.Empty : lowPPD.NadirPPD.Value.ToString();
|
||
break;
|
||
case QuestionMark.LowPPDVisit:
|
||
x.Answer = lowPPD.LowPPDVisit == null ? string.Empty : lowPPD.LowPPDVisit.ToString();
|
||
break;
|
||
|
||
|
||
}
|
||
|
||
|
||
});
|
||
}
|
||
|
||
var tableAnswers = new List<ReadingTableQuestionAnswer>();
|
||
// 处理状态
|
||
|
||
var mergedRowIds = tableRowAnswers.Where(x => x.SplitOrMergeType == SplitOrMergeType.Merged).Select(x => x.Id).ToList();
|
||
copyTableAnswers.ForEach(x =>
|
||
{
|
||
var tableAnswer = new ReadingTableQuestionAnswer()
|
||
{
|
||
Id = NewId.NextGuid(),
|
||
Answer = needCopyMarks.Contains(x.QuestionMark) ? x.Answer : string.Empty,
|
||
QuestionId = x.QuestionId,
|
||
RowIndex = x.RowIndex,
|
||
RowId = tableRowAnswers.Where(y => y.OriginalId == x.RowId).Select(x => x.Id).FirstOrDefault(),
|
||
TableQuestionId = x.TableQuestionId,
|
||
TrialId = x.TrialId,
|
||
VisitTaskId = visitTaskId,
|
||
};
|
||
if (mergedRowIds.Contains(tableAnswer.RowId) && x.QuestionMark == QuestionMark.State)
|
||
{
|
||
tableAnswer.Answer = TargetState.Loss.GetEnumInt();
|
||
|
||
}
|
||
tableAnswers.Add(tableAnswer);
|
||
});
|
||
|
||
var questionMarkList = await _readingTaskQuestionMarkRepository.Where(x => x.VisitTaskId == LastVisitTaskId).Select(x => new ReadingTaskQuestionMark()
|
||
{
|
||
VisitTaskId = visitTaskId,
|
||
FirstAddTaskId = x.FirstAddTaskId,
|
||
QuestionId = x.QuestionId,
|
||
QuestionType = x.QuestionType,
|
||
OrderMarkName = x.OrderMarkName,
|
||
|
||
}).ToListAsync();
|
||
questionMarkList.ForEach(x =>
|
||
{
|
||
x.Id = NewId.NextGuid();
|
||
});
|
||
|
||
|
||
var addList = _mapper.Map<List<ReadingTableAnswerRowInfo>>(tableRowAnswers).OrderBy(x => x.RowIndex).ToList();
|
||
|
||
foreach (var item in addList)
|
||
{
|
||
await _readingTableAnswerRowInfoRepository.AddAsync(item);
|
||
await _readingTableQuestionAnswerRepository.SaveChangesAsync();
|
||
}
|
||
await _readingTaskQuestionMarkRepository.AddRangeAsync(questionMarkList);
|
||
//await _readingTableAnswerRowInfoRepository.AddRangeAsync(addList);
|
||
await _readingTableQuestionAnswerRepository.AddRangeAsync(tableAnswers);
|
||
//addList.ForEach(x =>
|
||
//{
|
||
// x.MergeRow = null;
|
||
// x.SplitRow = null;
|
||
|
||
//});
|
||
await _readingTableQuestionAnswerRepository.SaveChangesAsync();
|
||
|
||
}
|
||
}
|
||
|
||
return new AddTaskLesionAnswerFromLastTaskOutDto()
|
||
{
|
||
|
||
IsBaseLine = taskinfo.SourceSubjectVisitId == baseLineVisitId,
|
||
};
|
||
|
||
}
|
||
#endregion
|
||
|
||
#region 获取SOD
|
||
|
||
/// <summary>
|
||
/// 获取SOD
|
||
/// </summary>
|
||
/// <remarks>
|
||
/// 靶病灶径线之和(SOD)
|
||
/// 非淋巴结的长径 和淋巴结的短径
|
||
/// </remarks>
|
||
/// <returns></returns>
|
||
public async Task<decimal?> GetSODData(ReadingCalculateDto inDto)
|
||
{
|
||
if (sODData != null)
|
||
{
|
||
return sODData.Value;
|
||
}
|
||
|
||
var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).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();
|
||
}
|
||
}
|
||
|
||
sODData = result;
|
||
|
||
return sODData.Value;
|
||
|
||
|
||
|
||
}
|
||
#endregion
|
||
|
||
#region 非淋巴结靶病灶长径之和
|
||
/// <summary>
|
||
/// 非淋巴结靶病灶长径之和
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<decimal?> GetSumOfDiameter(ReadingCalculateDto inDto)
|
||
{
|
||
var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).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.No)))
|
||
{
|
||
// 非淋巴结的长径
|
||
result += item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.MajorAxis).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
}
|
||
}
|
||
|
||
|
||
return result;
|
||
}
|
||
#endregion
|
||
|
||
#region 与基线SOD相比变化量(mm)
|
||
/// <summary>
|
||
/// 与基线SOD相比变化量(mm)
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<decimal?> GetSODChange(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
var value = await GetSODData(inDto);
|
||
|
||
if (value == null || inDto.IsBaseLine)
|
||
{
|
||
return null;
|
||
}
|
||
return value.NullChange0() - await GetBaseLineSOD(inDto);
|
||
}
|
||
#endregion
|
||
|
||
#region 与基线访视相比SOD变化百分比
|
||
/// <summary>
|
||
/// 与基线访视相比SOD变化百分比
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<decimal?> GetSODPercent(ReadingCalculateDto inDto)
|
||
{
|
||
var thisSOD = await GetSODData(inDto);
|
||
|
||
if (thisSOD == null || inDto.IsBaseLine)
|
||
{
|
||
return null;
|
||
}
|
||
|
||
var baseLineSOD = await GetBaseLineSOD(inDto);
|
||
|
||
if (baseLineSOD == 0)
|
||
{
|
||
return 100;
|
||
}
|
||
else
|
||
{
|
||
return (thisSOD.NullChange0() - baseLineSOD) * 100 / baseLineSOD;
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 与整个访视期间SOD最低点相比增加的值(mm)
|
||
/// <summary>
|
||
/// 与整个访视期间SOD最低点相比增加的值(mm)
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <remarks>
|
||
/// 要更新之前的
|
||
/// </remarks>
|
||
/// <returns></returns>
|
||
public async Task<decimal?> GetLowestIncrease(ReadingCalculateDto inDto)
|
||
{
|
||
var value = await GetSODData(inDto);
|
||
if (value == null || inDto.IsBaseLine)
|
||
{
|
||
return null;
|
||
}
|
||
var decimalAnswerList = await GetLowSODVisit(inDto);
|
||
var minSOD = decimalAnswerList.OrderBy(x => x.SOD).Select(x => x.SOD).FirstOrDefault();
|
||
return value.NullChange0() - minSOD;
|
||
}
|
||
#endregion
|
||
|
||
#region 与整个访视期间SOD最低点相比增加的百分比
|
||
/// <summary>
|
||
/// 与整个访视期间SOD最低点相比增加的百分比
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <remarks>
|
||
/// 要更新之前的
|
||
/// </remarks>
|
||
/// <returns></returns>
|
||
public async Task<decimal?> GetLowPercent(ReadingCalculateDto inDto)
|
||
{
|
||
var thisSOD = await GetSODData(inDto);
|
||
if (thisSOD == null || inDto.IsBaseLine)
|
||
{
|
||
return null;
|
||
}
|
||
var decimalAnswerList = await GetLowSODVisit(inDto);
|
||
var minSOD = decimalAnswerList.OrderBy(x => x.SOD).Select(x => x.SOD).FirstOrDefault();
|
||
|
||
if (minSOD == 0)
|
||
{
|
||
return 100;
|
||
}
|
||
else
|
||
{
|
||
return (thisSOD.NullChange0() - minSOD) * 100 / minSOD;
|
||
}
|
||
|
||
|
||
}
|
||
#endregion
|
||
|
||
#region 整个访视期间SOD最低点访视名称
|
||
/// <summary>
|
||
/// 整个访视期间SOD最低点访视名称
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <remarks>
|
||
/// 要更新之前的
|
||
/// </remarks>
|
||
/// <returns></returns>
|
||
public async Task<string> GetLowVisit(ReadingCalculateDto inDto)
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return nameof(YesOrNoOrNa.NA);
|
||
}
|
||
var targetCount = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).Count();
|
||
if (targetCount == 0)
|
||
{
|
||
return nameof(YesOrNoOrNa.NA);
|
||
}
|
||
|
||
var decimalAnswerList = await GetLowSODVisit(inDto);
|
||
return decimalAnswerList.OrderBy(x => x.SOD).Select(x => x.BlindName).FirstOrDefault() ?? string.Empty;
|
||
}
|
||
#endregion
|
||
|
||
#region 是否存在非淋巴结靶病灶
|
||
/// <summary>
|
||
/// 是否存在非淋巴结靶病灶
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetIsLymphTarget(ReadingCalculateDto inDto)
|
||
{
|
||
var result = IsLymph.No.GetEnumInt();
|
||
var tableQuestion = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList();
|
||
|
||
foreach (var item in tableQuestion)
|
||
{
|
||
if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(IsLymph.No)))
|
||
{
|
||
result = IsLymph.Yes.GetEnumInt();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
return result;
|
||
}
|
||
#endregion
|
||
|
||
#region 是否存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上
|
||
/// <summary>
|
||
/// 是否存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetIsAddFive(ReadingCalculateDto inDto)
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return YesOrNoOrNa.NA.GetEnumInt();
|
||
}
|
||
var addFiveList = await GetIsAddFiveRowIndexs(inDto);
|
||
var isExists = addFiveList.Count() > 0 ? true : false;
|
||
|
||
return isExists ? YesOrNoOrNa.Yes.GetEnumInt() : YesOrNoOrNa.No.GetEnumInt();
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取存在淋巴结靶病灶且该病灶比上一访视短径增加5MM以上的病灶
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<List<decimal>> GetIsAddFiveRowIndexs(ReadingCalculateDto inDto)
|
||
{
|
||
List<decimal> result = new List<decimal>();
|
||
var LastVisitTaskId = await this.GetLastVisitTaskId(inDto);
|
||
var questionIds = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).Select(x => x.QuestionId).ToList();
|
||
var lastQuestionAsnwer = await _readingTableQuestionAnswerRepository.Where(x => x.VisitTaskId == LastVisitTaskId && questionIds.Contains(x.QuestionId)).Include(x => x.ReadingQuestionTrial).Include(x => x.ReadingTableQuestionTrial).ToListAsync();
|
||
var rowIndexs = lastQuestionAsnwer.Where(x => x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes)).Select(x => x.RowIndex).Distinct().OrderBy(x => x).ToList();
|
||
var thisQuestionAsnwer = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList();
|
||
foreach (var item in rowIndexs)
|
||
{
|
||
var lastValue = lastQuestionAsnwer.Where(x => x.RowIndex == item && x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
|
||
var thisRowData = thisQuestionAsnwer.Where(x => x.RowIndex == item).SelectMany(x => x.TableQuestionList).ToList();
|
||
var thisValue = thisRowData.Where(x => x.QuestionMark == QuestionMark.ShortAxis).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
|
||
if (thisValue - lastValue >= 5)
|
||
{
|
||
result.Add(item);
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
#endregion
|
||
|
||
#region 被评估为NE的单个靶病灶
|
||
/// <summary>
|
||
/// 被评估为NE的单个靶病灶
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetNETarget(ReadingCalculateDto inDto)
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return ExistOrNA.NA.GetEnumInt();
|
||
}
|
||
|
||
var result = inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.TargetLesion && x.Answer.EqEnum(TargetAssessment.NE));
|
||
|
||
return result ? ExistOrNA.Exist.GetEnumInt() : ExistOrNA.NotExist.GetEnumInt();
|
||
}
|
||
#endregion
|
||
|
||
#region 整体肿瘤评估
|
||
|
||
/// <summary>
|
||
/// 整体肿瘤评估
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetTumor(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return OverallAssessment.NA.GetEnumInt();
|
||
}
|
||
|
||
var targetLesion = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.TargetLesion).Select(x => x.Answer).FirstOrDefault();
|
||
var noTargetLesion = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NoTargetLesion).Select(x => x.Answer).FirstOrDefault();
|
||
var newLesions = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesions).Select(x => x.Answer).FirstOrDefault();
|
||
var result = await _tumorAssessmentRepository.Where(x =>
|
||
x.TargetLesion == (TargetAssessment)int.Parse(targetLesion.IsNullOrEmpty() ? TargetAssessment.NA.GetEnumInt() : targetLesion) &&
|
||
x.NonTargetLesions == (NoTargetAssessment)int.Parse(noTargetLesion.IsNullOrEmpty() ? NoTargetAssessment.NA.GetEnumInt() : noTargetLesion) &&
|
||
x.NewLesion == (NewLesionAssessment)int.Parse(newLesions.IsNullOrEmpty() ? NewLesionAssessment.NA.GetEnumInt() : newLesions)).Select(x => x.OverallEfficacy).ToListAsync();
|
||
|
||
return result.Count == 0 ? OverallAssessment.NE.GetEnumInt() : result[0].GetEnumInt();
|
||
}
|
||
#endregion
|
||
|
||
#region 是否存在疾病
|
||
/// <summary>
|
||
/// 是否存在疾病
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetIsExistDisease(ReadingCalculateDto inDto)
|
||
{
|
||
if (!inDto.IsBaseLine)
|
||
{
|
||
return string.Empty;
|
||
}
|
||
|
||
var lesionCount = inDto.QuestionInfo.SelectMany(x => x.TableRowInfoList).Count();
|
||
|
||
return lesionCount > 0 ? ExistDisease.Yes.GetEnumInt() : ExistDisease.No.GetEnumInt();
|
||
}
|
||
#endregion
|
||
|
||
|
||
#region 修改其他标准
|
||
|
||
|
||
|
||
|
||
#region 修改整个访视期间SOD最低点相比增加的百分比
|
||
|
||
/// <summary>
|
||
/// 修改整个访视期间SOD最低点相比增加的百分比
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
//public async Task ChangeAllLowPercent(ChangeAllTaskDto inDto)
|
||
//{
|
||
// var visitTaskList = await GetVisitTaskAnswerList(inDto.calculateDto);
|
||
|
||
// var lowSod = (await GetLowSODVisit(inDto.calculateDto)).Select(x => x.SOD).OrderBy(x => x).FirstOrDefault();
|
||
|
||
// foreach (var item in visitTaskList.Where(x => x.VisitTaskId != inDto.calculateDto.BaseLineTaskId))
|
||
// {
|
||
// decimal percent = 0;
|
||
// if (lowSod == 0)
|
||
// {
|
||
// percent = 100;
|
||
// }
|
||
// else
|
||
// {
|
||
// percent = decimal.Round((item.SOD - lowSod) * 100 / lowSod, 2);
|
||
// }
|
||
|
||
// await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => x.VisitTaskId == item.VisitTaskId && x.ReadingQuestionTrialId == inDto.QuestionId, x => new ReadingTaskQuestionAnswer()
|
||
// {
|
||
// Answer = percent.ToString()
|
||
// });
|
||
// }
|
||
//}
|
||
|
||
#endregion
|
||
|
||
#region 修改最低方式点名称
|
||
/// <summary>
|
||
/// 修改最低方式点名称
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task ChangeAllLowVisitName(ChangeAllTaskDto inDto)
|
||
{
|
||
// 找到所有访视任务的Id
|
||
|
||
var visitTaskIds = await _visitTaskRepository.Where(x => x.IsAnalysisCreate == inDto.IsAnalysisCreate &&
|
||
x.ReadingCategory == ReadingCategory.Visit &&
|
||
x.TrialReadingCriterionId == inDto.calculateDto.TrialReadingCriterionId &&
|
||
x.TaskState == TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ArmEnum == inDto.calculateDto.ArmEnum).Select(x => x.Id).ToListAsync();
|
||
|
||
var answer = (await GetLowSODVisit(inDto.calculateDto)).OrderBy(x => x.SOD).Select(x => x.BlindName).FirstOrDefault();
|
||
visitTaskIds = visitTaskIds.Where(x => x != inDto.calculateDto.BaseLineTaskId).ToList();
|
||
await this.ChangeAllVisitTaskAnswer(visitTaskIds, inDto.QuestionId, answer);
|
||
|
||
}
|
||
#endregion
|
||
|
||
|
||
#endregion
|
||
|
||
#region 通用方法
|
||
|
||
#region 修改所有访视任务的答案
|
||
/// <summary>
|
||
/// 修改所有访视任务的答案
|
||
/// </summary>
|
||
/// <param name="visitTaskGuids"></param>
|
||
/// <param name="questionId"></param>
|
||
/// <param name="answer"></param>
|
||
/// <returns></returns>
|
||
private async Task ChangeAllVisitTaskAnswer(List<Guid> visitTaskGuids, Guid questionId, string answer)
|
||
{
|
||
await _readingTaskQuestionAnswerRepository.BatchUpdateNoTrackingAsync(x => visitTaskGuids.Contains(x.VisitTaskId) && x.ReadingQuestionTrialId == questionId, x => new ReadingTaskQuestionAnswer()
|
||
{
|
||
Answer = answer
|
||
});
|
||
}
|
||
#endregion
|
||
|
||
|
||
#region 获取基线任务ID
|
||
|
||
/// <summary>
|
||
/// 获取基线任务的Id
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
private async Task<Guid> GetBaseLineTaskId(ReadingCalculateDto inDto)
|
||
{
|
||
if (this.BaseLineTaskId == null)
|
||
{
|
||
this.BaseLineTaskId = await _visitTaskRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ReadingCategory == ReadingCategory.Visit
|
||
&& x.TrialReadingCriterionId == inDto.TrialReadingCriterionId &&
|
||
|
||
x.SourceSubjectVisit.IsBaseLine && x.TaskState == TaskState.Effect &&
|
||
x.IsAnalysisCreate == inDto.IsAnalysisCreate
|
||
&& x.ArmEnum == inDto.ArmEnum
|
||
&& x.IsSelfAnalysis == inDto.IsSelfAnalysis && x.ArmEnum == inDto.ArmEnum)
|
||
.Select(x => x.Id).FirstOrDefaultAsync();
|
||
}
|
||
|
||
return this.BaseLineTaskId.Value;
|
||
|
||
}
|
||
#endregion
|
||
|
||
#region 获取基线SOD
|
||
/// <summary>
|
||
/// 获取基线SOD
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
private async Task<decimal> GetBaseLineSOD(ReadingCalculateDto inDto)
|
||
{
|
||
if (await _visitTaskRepository.AnyAsync(x => x.Id == inDto.VisitTaskId && x.SourceSubjectVisit.IsBaseLine && x.IsAnalysisCreate == inDto.IsAnalysisCreate && x.ArmEnum == inDto.ArmEnum))
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
// 先找到基线的任务
|
||
var baseLineTaskId = await _visitTaskRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ReadingCategory == ReadingCategory.Visit
|
||
&& x.TrialReadingCriterionId == inDto.TrialReadingCriterionId &&
|
||
|
||
x.SourceSubjectVisit.IsBaseLine && x.TaskState == TaskState.Effect &&
|
||
x.IsAnalysisCreate == inDto.IsAnalysisCreate
|
||
&& x.ArmEnum == inDto.ArmEnum
|
||
&& x.IsSelfAnalysis == inDto.IsSelfAnalysis && x.ArmEnum == inDto.ArmEnum)
|
||
.Select(x => x.Id).FirstOrDefaultAsync();
|
||
|
||
|
||
var baseLineSOD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SOD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||
return baseLineSOD;
|
||
}
|
||
#endregion
|
||
|
||
|
||
/// <summary>
|
||
/// 获取最低方式
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<List<VisitTaskAnswerInfo>> GetLowSODVisit(ReadingCalculateDto inDto)
|
||
{
|
||
var taskAnswerList = await GetVisitTaskAnswerList(inDto);
|
||
|
||
taskAnswerList = taskAnswerList.Where(x => x.VisitTaskId != inDto.VisitTaskId).ToList();
|
||
|
||
var taskIds = taskAnswerList.Select(x => x.VisitTaskId).ToList();
|
||
|
||
// 排除无法评估
|
||
var unableEvaluateTaskIds = await _readingTableQuestionAnswerRepository.Where(x => taskIds.Contains(x.VisitTaskId) &&
|
||
x.ReadingTableQuestionTrial.QuestionMark == QuestionMark.State
|
||
&& x.ReadingQuestionTrial.LesionType == LesionType.TargetLesion
|
||
&& x.Answer == TargetState.UnableEvaluate.GetEnumInt()
|
||
)
|
||
.Select(x => x.VisitTaskId).Distinct().ToListAsync();
|
||
|
||
taskAnswerList = taskAnswerList.Where(x => !unableEvaluateTaskIds.Contains(x.VisitTaskId)).ToList();
|
||
return taskAnswerList.OrderBy(x => x.SOD).ToList();
|
||
}
|
||
|
||
#region 获取访视任务信息
|
||
/// <summary>
|
||
/// 获取访视任务信息
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<List<VisitTaskAnswerInfo>> GetVisitTaskAnswerList(ReadingCalculateDto inDto)
|
||
{
|
||
if (visitTaskAnswerList == null)
|
||
{
|
||
// 查询的时候要把自己排除 因为查询出来的可能不是计算出的最新的
|
||
visitTaskAnswerList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId != inDto.VisitTaskId && x.VisitTask.ReadingCategory == ReadingCategory.Visit
|
||
&& x.VisitTask.IsAnalysisCreate == inDto.IsAnalysisCreate
|
||
&& x.VisitTask.IsSelfAnalysis == inDto.IsSelfAnalysis
|
||
&& x.VisitTask.VisitTaskNum < inDto.VisitTaskNum
|
||
&& x.ReadingQuestionCriterionTrialId == inDto.TrialReadingCriterionId
|
||
&& x.SubjectId == inDto.SubjectId && x.VisitTask.ReadingTaskState == ReadingTaskState.HaveSigned && x.VisitTask.ArmEnum == inDto.ArmEnum && x.VisitTask.TaskState == TaskState.Effect && x.ReadingQuestionTrial.QuestionType == QuestionType.SpleenLength)
|
||
.Select(x => new VisitTaskAnswerInfo
|
||
{
|
||
VisitTaskId = x.VisitTaskId,
|
||
QuestionId = x.ReadingQuestionTrialId,
|
||
VisitName = x.VisitTask.SourceSubjectVisit.VisitName,
|
||
BlindName = x.VisitTask.TaskBlindName,
|
||
|
||
SpleenLength = x.Answer.IsNullOrEmptyReturn0(),
|
||
}).ToListAsync();
|
||
|
||
//// 这里是需要加上自己的 基线不用管
|
||
//if (visitTaskAnswerList.Count > 0)
|
||
//{
|
||
// visitTaskAnswerList.Add(new VisitTaskAnswerInfo()
|
||
// {
|
||
// VisitTaskId = inDto.VisitTaskId,
|
||
// BlindName = inDto.TaskBlindName,
|
||
// QuestionId = visitTaskAnswerList[0].QuestionId,
|
||
// VisitName = inDto.VisitName,
|
||
// SOD = (await GetSODData(inDto)).ToString().IsNullOrEmptyReturn0(),
|
||
// });
|
||
//}
|
||
|
||
|
||
}
|
||
|
||
return visitTaskAnswerList;
|
||
}
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// 获取上一个访视任务Id
|
||
/// </summary>
|
||
/// <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();
|
||
|
||
// 找到访视任务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 获取SPD
|
||
|
||
/// <summary>
|
||
/// 获取SPD
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<decimal> GetSPD(ReadingCalculateDto inDto)
|
||
{
|
||
decimal result = 0;
|
||
var rowInfo = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList();
|
||
|
||
var tableQuestionList = rowInfo.SelectMany(x => x.TableQuestionList).ToList();
|
||
|
||
result = tableQuestionList.Where(x => x.QuestionMark == QuestionMark.PPD).Sum(x => x.Answer.IsNullOrEmptyReturn0());
|
||
return result;
|
||
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 脾脏垂直径
|
||
/// <summary>
|
||
/// 获取脾脏垂直径
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<decimal?> GetSpleenLength(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
// 脾尖答案
|
||
var splenicTopAnswer = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SplenicTopPosition).Select(x => x.Answer).FirstOrDefault();
|
||
// 脾底答案
|
||
var splenicBottomAnswer = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SplenicBottomPosition).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
decimal? spleenLength = null;
|
||
if (splenicTopAnswer != null && splenicBottomAnswer != null && splenicTopAnswer != string.Empty && splenicBottomAnswer != string.Empty)
|
||
{
|
||
spleenLength = splenicTopAnswer.IsNullOrEmptyReturn0() - splenicBottomAnswer.IsNullOrEmptyReturn0();
|
||
if (spleenLength < 0)
|
||
{
|
||
spleenLength = 0 - spleenLength;
|
||
}
|
||
return spleenLength;
|
||
}
|
||
|
||
return spleenLength;
|
||
}
|
||
#endregion
|
||
|
||
#region 与基线相比SPD变化的百分比
|
||
/// <summary>
|
||
/// 与基线相比SPD变化的百分比
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> CompareBaselineSPD(ReadingCalculateDto inDto)
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return "NA";
|
||
}
|
||
var baseLineTaskId = await GetBaseLineTaskId(inDto);
|
||
|
||
var baseLineSpd = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SPD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||
|
||
var presentSpd = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SPD).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
if (baseLineSpd != 0)
|
||
{
|
||
return ReserveDecimal((presentSpd - baseLineSpd) * 100 / baseLineSpd, inDto.DigitPlaces);
|
||
}
|
||
else
|
||
{
|
||
return "NA";
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 与基线相比脾肿大增加的百分比
|
||
/// <summary>
|
||
/// 与基线相比脾肿大增加的百分比
|
||
/// [(当前垂直径-130)-(基线垂直径-130)]/(基线垂直径-130)
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetSplenoncusChange(ReadingCalculateDto inDto)
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return "NA";
|
||
}
|
||
|
||
|
||
var baseLineSpleenLength = await GetBaseLineSpleenLength(inDto);
|
||
|
||
var presentSpleenLength = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SpleenLength).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
if (baseLineSpleenLength - 130 > 0 && presentSpleenLength > 130)
|
||
{
|
||
return ReserveDecimal((presentSpleenLength - 130 - (baseLineSpleenLength - 130)) * 100 / (baseLineSpleenLength - 130), inDto.DigitPlaces);
|
||
}
|
||
else
|
||
{
|
||
return "NA";
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 与最低点相比脾脏垂直径长度的增加值
|
||
|
||
/// <summary>
|
||
/// 与最低点相比脾脏垂直径长度的增加值
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetSplenoncusAdd(ReadingCalculateDto inDto)
|
||
{
|
||
var TaskAnswer = await GetVisitTaskAnswerList(inDto);
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return "NA";
|
||
}
|
||
if (TaskAnswer.Count() == 0)
|
||
{
|
||
return "0";
|
||
}
|
||
var presentSpd = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SpleenLength).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
var lowSplenoncus = TaskAnswer.OrderBy(x => x.SpleenLength).Select(x => x.SpleenLength).FirstOrDefault();
|
||
return (presentSpd - lowSplenoncus).ToString();
|
||
|
||
|
||
}
|
||
#endregion
|
||
|
||
|
||
#region 脾肿垂直径最低点访视
|
||
|
||
/// <summary>
|
||
/// 脾肿垂直径最低点访视
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetLowestSplenoncusVisit(ReadingCalculateDto inDto)
|
||
{
|
||
var taskAnswer = await GetVisitTaskAnswerList(inDto);
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return "NA";
|
||
}
|
||
if (taskAnswer.Count() == 0)
|
||
{
|
||
return "NA";
|
||
}
|
||
|
||
var lowSplenoncus = taskAnswer.OrderBy(x => x.SpleenLength).FirstOrDefault();
|
||
return lowSplenoncus.BlindName;
|
||
|
||
|
||
}
|
||
#endregion
|
||
|
||
#region 获取脾脏状态
|
||
|
||
/// <summary>
|
||
/// 获取脾脏状态
|
||
/// </summary>
|
||
/// <param name="visitTaskId"></param>
|
||
/// <param name="spleenLength"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<string> GetSplenicState(Guid visitTaskId, decimal spleenLength)
|
||
{
|
||
|
||
var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
|
||
ReadingCalculateDto inDto = await _generalCalculateService.GetReadingCalculateDto(visitTaskId);
|
||
var result = SpleenAssessment.NotEvaluable;
|
||
if (spleenLength < 0)
|
||
{
|
||
return SpleenAssessment.NotEvaluable.GetEnumInt();
|
||
}
|
||
else if (0 < spleenLength && spleenLength <= 130)
|
||
{
|
||
return SpleenAssessment.Normal.GetEnumInt();
|
||
|
||
}
|
||
else if (inDto.IsBaseLine)
|
||
{
|
||
return SpleenAssessment.Swelling.GetEnumInt();
|
||
}
|
||
|
||
|
||
var lowSpleenLength = await this.GetLowSpleenLength(taskinfo);
|
||
|
||
|
||
|
||
|
||
|
||
var presentSpd = spleenLength;
|
||
var baseLineSpleenLength = await GetBaseLineSpleenLength(inDto);
|
||
|
||
var baseLineTaskId = await GetBaseLineTaskId(inDto);
|
||
var baseLineState = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SplenicStatus).Select(x => x.Answer).FirstOrDefaultAsync();
|
||
|
||
|
||
var differenceValue = presentSpd - baseLineSpleenLength;
|
||
|
||
var differenceLowValue = presentSpd - lowSpleenLength;
|
||
|
||
|
||
decimal getPercentage()
|
||
{
|
||
decimal percentage = 0;
|
||
if (baseLineSpleenLength != 0)
|
||
{
|
||
percentage = differenceValue * 100 / (baseLineSpleenLength - 130);
|
||
}
|
||
return percentage;
|
||
}
|
||
|
||
|
||
|
||
// 1、基线 垂直径> 130 mm
|
||
//2、与基线相比脾垂直径变化值≥10 mm
|
||
// 当前垂直径>130 mm
|
||
//与基线相比脾肿大增加的百分比 > 50%
|
||
if (baseLineSpleenLength > 130 && differenceValue >= 10 && spleenLength > 130 && getPercentage() > 50)
|
||
{
|
||
result = SpleenAssessment.Increase;
|
||
}
|
||
//1、基线垂直径≤130mm
|
||
//2、与基线相比脾垂直径变化值≥20 mm
|
||
//当前垂直径 > 130 mm
|
||
else if (baseLineSpleenLength <= 130 && differenceValue >= 20 && presentSpd > 130)
|
||
{
|
||
result = SpleenAssessment.Increase;
|
||
}
|
||
//1、基线 垂直径> 130 mm
|
||
//2、当前访视的前面访视中 存在垂直径≤130mm
|
||
//3、与最低点相比脾脏垂直径的增加值≥20 mm
|
||
//4、当前垂直径 > 130 mm
|
||
else if (baseLineSpleenLength > 130 && lowSpleenLength <= 130 && differenceLowValue >= 20 && presentSpd > 130)
|
||
{
|
||
result = SpleenAssessment.Increase;
|
||
}
|
||
// 当前垂直径≤130mm
|
||
else if (spleenLength <= 130)
|
||
{
|
||
result = SpleenAssessment.Normal;
|
||
}
|
||
//1、基线期 状态为“肿大”
|
||
// 当前垂直径>130 mm
|
||
//与基线相比脾肿大增加的百分比 < -50%
|
||
else if (baseLineState.EqEnum(SpleenAssessment.Swelling) && spleenLength > 130 && getPercentage() < -50)
|
||
{
|
||
result = SpleenAssessment.Remission;
|
||
}
|
||
else
|
||
{
|
||
result = SpleenAssessment.Stabilization;
|
||
}
|
||
return result.GetEnumInt();
|
||
}
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// 获取最低垂直径
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
private async Task<decimal> GetLowSpleenLength(VisitTask taskinfo)
|
||
{
|
||
var visitTaskIds = await _visitTaskRepository.Where(x => x.ReadingCategory == ReadingCategory.Visit &&
|
||
x.TrialReadingCriterionId == taskinfo.TrialReadingCriterionId &&
|
||
x.IsAnalysisCreate == taskinfo.IsAnalysisCreate &&
|
||
x.ArmEnum == taskinfo.ArmEnum &&
|
||
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).ToListAsync();
|
||
|
||
var questionId = await _readingQuestionTrialRepository.Where(x => x.ReadingQuestionCriterionTrialId == taskinfo.TrialReadingCriterionId && x.QuestionType == QuestionType.SpleenLength).Select(x => x.Id).FirstNotNullAsync();
|
||
var answerList = await _readingTaskQuestionAnswerRepository.Where(x => visitTaskIds.Contains(x.VisitTaskId)
|
||
&& x.ReadingQuestionTrialId == questionId)
|
||
.Select(x => new
|
||
{
|
||
x.Answer,
|
||
x.VisitTaskId,
|
||
}).ToListAsync();
|
||
|
||
var lowSpleenLength = answerList.Select(x => new
|
||
{
|
||
Answer = x.Answer.IsNullOrEmptyReturn0(),
|
||
x.VisitTaskId
|
||
}).OrderBy(x => x.Answer).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
return lowSpleenLength;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取脾脏验证
|
||
/// </summary>
|
||
/// <param name="visitTaskId"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public async Task<object> GetSplenicVerify(Guid visitTaskId)
|
||
{
|
||
|
||
ReadingCalculateDto inDto = await _generalCalculateService.GetReadingCalculateDto(visitTaskId);
|
||
|
||
// 基线垂直径
|
||
var baseLineSpleenLength = await GetBaseLineSpleenLength(inDto);
|
||
|
||
var taskinfo = await _visitTaskRepository.Where(x => x.Id == visitTaskId).FirstNotNullAsync();
|
||
|
||
var baseLineTaskId = await GetBaseLineTaskId(inDto);
|
||
|
||
// 最低垂直经
|
||
var lowSpleenLength = await this.GetLowSpleenLength(taskinfo);
|
||
|
||
// 基线状态
|
||
var baseLineState = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SplenicStatus).Select(x => x.Answer).FirstOrDefaultAsync();
|
||
|
||
return new
|
||
{
|
||
|
||
//基线垂直径
|
||
BaseLineSpleenLength = baseLineSpleenLength,
|
||
// 最低垂直经
|
||
LowSpleenLength = lowSpleenLength,
|
||
// 基线状态
|
||
BaseLineState = baseLineState,
|
||
|
||
// 脾脏状态
|
||
SplenicStatus = await GetSplenicStatus(inDto),
|
||
};
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取脾脏状态
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetSplenicStatus(ReadingCalculateDto inDto)
|
||
{
|
||
var spleenLength = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SpleenLength).Select(x => x.Answer).FirstOrDefault();
|
||
if (spleenLength == string.Empty)
|
||
{
|
||
return string.Empty;
|
||
}
|
||
else
|
||
{
|
||
return await GetSplenicState(inDto.VisitTaskId, spleenLength.IsNullOrEmptyReturn0());
|
||
}
|
||
}
|
||
|
||
#region 获取脾脏评估
|
||
|
||
/// <summary>
|
||
/// 获取脾脏评估
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetSplenicEvaluation(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
return inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SplenicStatus).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||
|
||
//if (inDto.IsBaseLine)
|
||
//{
|
||
// return SpleenAssessment.Stabilization.GetEnumInt();
|
||
//}
|
||
|
||
//var result = SpleenAssessment.Stabilization;
|
||
|
||
|
||
//var presentSpd = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SpleenLength).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
//var baseLineSpleenLength = await GetBaseLineSpleenLength(inDto);
|
||
|
||
//var baseLineTaskId = await GetBaseLineTaskId(inDto);
|
||
//var baseLineState = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SplenicStatus).Select(x => x.Answer).FirstOrDefaultAsync();
|
||
|
||
|
||
//var differenceValue = presentSpd - baseLineSpleenLength;
|
||
//decimal percentage = 0;
|
||
//if (baseLineSpleenLength != 0)
|
||
//{
|
||
// percentage = differenceValue * 100 / baseLineSpleenLength;
|
||
//}
|
||
|
||
//// 1、基线 垂直径> 130 mm
|
||
////2、与基线相比脾垂直径变化值≥10 mm
|
||
////与基线相比脾肿大增加的百分比 > 50%
|
||
//if (baseLineSpleenLength > 130 && differenceValue >= 10 && percentage > 50)
|
||
//{
|
||
// result = SpleenAssessment.Increase;
|
||
//}
|
||
////1、基线垂直径≤130mm
|
||
////2、与基线相比脾垂直径变化值≥20 mm
|
||
////当前垂直径 > 130 mm
|
||
//else if (baseLineSpleenLength <= 130 && differenceValue >= 20 && presentSpd > 130)
|
||
//{
|
||
// result = SpleenAssessment.Increase;
|
||
//}
|
||
////1、基线 垂直径> 130 mm
|
||
////2、当前访视的前面访视中 存在垂直径≤130mm
|
||
////3、与最低点相比脾脏垂直径的增加值≥20 mm
|
||
////4、当前垂直径 > 130 mm
|
||
//else if (baseLineSpleenLength > 130 && presentSpd <= 130 && differenceValue >= 20 && presentSpd > 130)
|
||
//{
|
||
// result = SpleenAssessment.Increase;
|
||
//}
|
||
//// 基线垂直径≤130mm
|
||
//else if (baseLineSpleenLength <= 130)
|
||
//{
|
||
// result = SpleenAssessment.Normal;
|
||
//}
|
||
////1、基线期 状态为“肿大”
|
||
////与基线相比脾肿大增加的百分比 > 50%
|
||
//else if (baseLineState.EqEnum(SpleenState.Swelling) && percentage > 50)
|
||
//{
|
||
// result = SpleenAssessment.Remission;
|
||
//}
|
||
//else
|
||
//{
|
||
// result = SpleenAssessment.Remission;
|
||
//}
|
||
//return result.GetEnumInt();
|
||
|
||
|
||
}
|
||
#endregion
|
||
|
||
|
||
#region PET 5PS
|
||
|
||
/// <summary>
|
||
/// 获取PET5PS评分
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetPET5PS(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
// 如果是保存影像进来 PET-CT不能融合 就是NE
|
||
if (inDto.ComputationTrigger == ComputationTrigger.ImageQuality)
|
||
{
|
||
if (await ImageQualityIsUnableFuse(inDto))
|
||
{
|
||
return PET5PSScore.NE.GetEnumInt();
|
||
}
|
||
}
|
||
|
||
|
||
// 先在数据库查这几个值
|
||
List<QuestionType?> needSearchTypes = new List<QuestionType?>()
|
||
{
|
||
QuestionType.SUVmax,
|
||
QuestionType.PET5PS,
|
||
};
|
||
|
||
var dataBaseDataList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && needSearchTypes.Contains(x.ReadingQuestionTrial.QuestionType)).Select(x => new
|
||
{
|
||
x.Answer,
|
||
x.ReadingQuestionTrial.QuestionType
|
||
}).ToListAsync();
|
||
|
||
|
||
// 数据库中最大SUVmax
|
||
var dataBaseSUVmax = dataBaseDataList.Where(x => x.QuestionType == QuestionType.SUVmax).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||
|
||
// 如果不是保存肝脏血池和纵隔血池
|
||
if (inDto.ComputationTrigger != ComputationTrigger.InitialCalculation && inDto.ComputationTrigger != ComputationTrigger.LiverBloodPool && inDto.ComputationTrigger != ComputationTrigger.MediastinalPool && dataBaseSUVmax == (await GetSuvMax(inDto)).ToString())
|
||
{
|
||
|
||
|
||
return dataBaseDataList.Where(x => x.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||
|
||
}
|
||
|
||
|
||
|
||
//if (inDto.IsBaseLine)
|
||
//{
|
||
// return SpleenAssessment.Stabilization.GetEnumInt();
|
||
//}
|
||
|
||
else if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt()))
|
||
{
|
||
return PET5PSScore.NE.GetEnumInt();
|
||
}
|
||
|
||
|
||
var existPET = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.ExistPET).Select(x => x.Answer).FirstOrDefault();
|
||
if (existPET.EqEnum(ReadingYesOrNo.No))
|
||
{
|
||
return PET5PSScore.NE.GetEnumInt();
|
||
}
|
||
|
||
|
||
PET5PSScore result = PET5PSScore.X;
|
||
|
||
// 最大Suvmax
|
||
var maxSUVmax = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SUVmax).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
|
||
// 肝脏血池Suvmax
|
||
var LiverSUVmax = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LiverSUVmax).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
|
||
// 纵膈血池
|
||
var MediastinumSUVmax = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.MediastinumSUVmax).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
|
||
|
||
if (existPET.EqEnum(ReadingYesOrNo.No))
|
||
{
|
||
result = PET5PSScore.NE;
|
||
}
|
||
|
||
// 本访视病灶的 max SUVmax(所有病灶中最大的)> 2 * 肝脏血池SUVmax
|
||
else if (maxSUVmax > 2 * LiverSUVmax && LiverSUVmax != 0m)
|
||
{
|
||
result = PET5PSScore.Five;
|
||
}
|
||
//本访视病灶的SUVmax(所有病灶中最大的)>肝脏血池SUVmax
|
||
else if (maxSUVmax > LiverSUVmax && LiverSUVmax != 0)
|
||
{
|
||
result = PET5PSScore.Four;
|
||
}
|
||
//纵隔血池SUVmax<本访视点病灶的max SUVmax(所有病灶中最大的)≤1*肝脏血池SUVmax
|
||
else if (MediastinumSUVmax < maxSUVmax && maxSUVmax <= LiverSUVmax && MediastinumSUVmax != 0)
|
||
{
|
||
result = PET5PSScore.Three;
|
||
}
|
||
//本访视点病灶的SUVmax(所有病灶中最大的)<=纵隔血池SUVmax
|
||
else if (maxSUVmax <= MediastinumSUVmax && maxSUVmax != 0)
|
||
{
|
||
result = PET5PSScore.Two;
|
||
}
|
||
//无需标记,自主选择
|
||
else
|
||
{
|
||
return string.Empty;
|
||
}
|
||
|
||
return result.GetEnumInt();
|
||
}
|
||
#endregion
|
||
|
||
#region 修改PET 5PS评分备注
|
||
|
||
/// <summary>
|
||
/// 获取PET5PS评分备注
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetPET5PSRemark(ReadingCalculateDto inDto)
|
||
{
|
||
List<QuestionType?> needSearchTypes = new List<QuestionType?>()
|
||
{
|
||
QuestionType.PET5PS,
|
||
QuestionType.PSScoreRemarks,
|
||
};
|
||
|
||
var dataBaseDataList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && needSearchTypes.Contains(x.ReadingQuestionTrial.QuestionType)).Select(x => new
|
||
{
|
||
x.Answer,
|
||
x.ReadingQuestionTrial.QuestionType
|
||
}).ToListAsync(); ;
|
||
|
||
|
||
// 数据库中PET5PS
|
||
var pET5PS = dataBaseDataList.Where(x => x.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||
|
||
// 如果PET5PS没变 就不重新计算
|
||
if (pET5PS == (await GetPET5PS(inDto)).ToString())
|
||
{
|
||
return dataBaseDataList.Where(x => x.QuestionType == QuestionType.PSScoreRemarks).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||
|
||
}
|
||
else
|
||
{
|
||
return string.Empty;
|
||
}
|
||
|
||
}
|
||
#endregion
|
||
|
||
|
||
#region 与基线相比摄取值变化
|
||
|
||
/// <summary>
|
||
/// 与基线相比摄取值变化
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetUptakeChange(ReadingCalculateDto inDto)
|
||
{
|
||
var existPET = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.ExistPET).Select(x => x.Answer).FirstOrDefault();
|
||
if (await ImageQualityIsUnableFuse(inDto) || existPET.EqEnum(ReadingYesOrNo.No))
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return string.Empty;
|
||
}
|
||
else
|
||
{
|
||
return SUVChangeVSBaseline.NotEvaluable.GetEnumInt();
|
||
}
|
||
|
||
}
|
||
|
||
//PET5ps评分改变时,才计算
|
||
|
||
List<QuestionType?> needSearchTypes = new List<QuestionType?>()
|
||
{
|
||
QuestionType.PET5PS,
|
||
QuestionType.UptakeChange,
|
||
};
|
||
|
||
var dataBaseDataList = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == inDto.VisitTaskId && needSearchTypes.Contains(x.ReadingQuestionTrial.QuestionType)).Select(x => new
|
||
{
|
||
x.Answer,
|
||
x.ReadingQuestionTrial.QuestionType
|
||
}).ToListAsync(); ;
|
||
|
||
|
||
// 数据库中PET5ps评分
|
||
var dataBasePET5ps = dataBaseDataList.Where(x => x.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||
|
||
|
||
if (dataBasePET5ps == await GetPET5PS(inDto))
|
||
{
|
||
return dataBaseDataList.Where(x => x.QuestionType == QuestionType.UptakeChange).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||
|
||
}
|
||
|
||
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return SUVChangeVSBaseline.NA.GetEnumInt();
|
||
}
|
||
|
||
var result = SUVChangeVSBaseline.NotEvaluable;
|
||
var baseLineTaskId = await GetBaseLineTaskId(inDto);
|
||
|
||
var PET5PS = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
if (PET5PS == 0)
|
||
{
|
||
return string.Empty;
|
||
}
|
||
|
||
var baseLinePET5PSValue = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstOrDefaultAsync();
|
||
|
||
|
||
var baseLinePET5PS = baseLinePET5PSValue.IsNullOrEmptyReturn0();
|
||
|
||
|
||
|
||
|
||
|
||
// 基线为NE或者X 为空
|
||
if (baseLinePET5PSValue.EqEnum(PET5PSScore.X) || baseLinePET5PSValue.EqEnum(PET5PSScore.NE))
|
||
{
|
||
return string.Empty;
|
||
}
|
||
|
||
//本访视PET评分>基线PET评分
|
||
else if (PET5PS > baseLinePET5PS)
|
||
{
|
||
result = SUVChangeVSBaseline.Increase;
|
||
}
|
||
|
||
//本访视PET评分<基线PET评分
|
||
else if (PET5PS < baseLinePET5PS)
|
||
{
|
||
result = SUVChangeVSBaseline.Decrease;
|
||
}
|
||
|
||
//访视PET评分 等于 基线PET评分
|
||
else if (PET5PS == baseLinePET5PS)
|
||
{
|
||
return string.Empty;
|
||
//result = SUVChangeVSBaseline.DidNotChange;
|
||
}
|
||
|
||
return result.GetEnumInt();
|
||
|
||
}
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// 获取上一次FDGPET 评估
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetLastFDGPETOverallAssessment(ReadingCalculateDto inDto)
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return FDGPETOverallAssessment.NA.GetEnumInt();
|
||
}
|
||
|
||
var lastTaskId = await GetLastVisitTaskId(inDto);
|
||
|
||
|
||
var answer = await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == lastTaskId).Include(x => x.ReadingQuestionTrial).Where(x => x.ReadingQuestionTrial.QuestionType == QuestionType.FDGPET).Select(x => x.Answer).FirstOrDefaultAsync();
|
||
return answer ?? string.Empty;
|
||
}
|
||
|
||
#region FDG-PET总体评估结果
|
||
|
||
/// <summary>
|
||
/// FDG-PET总体评估结果
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetFDGPETOverallAssessment(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
// 如果是保存影像进来 PET-CT不能融合 就是NE
|
||
if (inDto.ComputationTrigger == ComputationTrigger.ImageQuality)
|
||
{
|
||
if (await ImageQualityIsUnableFuse(inDto))
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return FDGPETOverallAssessment.NA.GetEnumInt();
|
||
}
|
||
else
|
||
{
|
||
return FDGPETOverallAssessment.NE.GetEnumInt();
|
||
}
|
||
}
|
||
}
|
||
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return FDGPETOverallAssessment.NA.GetEnumInt();
|
||
}
|
||
|
||
var notExistPET = inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt());
|
||
|
||
|
||
|
||
if (notExistPET || (await ImageQualityIsUnableFuse(inDto)))
|
||
{
|
||
return FDGPETOverallAssessment.NE.GetEnumInt();
|
||
}
|
||
|
||
//FDGPETOverallAssessment result = FDGPETOverallAssessment.NA;
|
||
|
||
// PET5PS
|
||
var pET5PS = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.PET5PS).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
// UptakeChange
|
||
var uptakeChange = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.UptakeChange).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
// EvidenceFocalFDG
|
||
var evidenceFocalFDG = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.EvidenceFocalFDG).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
|
||
return CalculationFDGPETOverallAssessment(pET5PS, uptakeChange, evidenceFocalFDG);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 计算FDG-PET总体评估结果【测试】
|
||
/// </summary>
|
||
/// <param name="pET5PS">PET5PS评分</param>
|
||
/// <param name="uptakeChange"> 与基线相比摄取值变化</param>
|
||
/// <param name="evidenceFocalFDG">骨髓中是否存在局灶性 FDG亲和病灶的证据</param>
|
||
/// <returns></returns>
|
||
public string CalculationFDGPETOverallAssessment(string? pET5PS, string uptakeChange, string? evidenceFocalFDG)
|
||
{
|
||
List<CalculationDto> data = new List<CalculationDto>() {
|
||
|
||
//NE NE NE NE
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.NE }),
|
||
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.NotEvaluable }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.NE}),
|
||
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
|
||
},
|
||
|
||
//NE/5分/4分/3分/2分/1分/X NE/增大/减少/无明显变化 是,存在新的/复发的FDG高亲和性病灶 PMD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.NE,PET5PSScore.Five,PET5PSScore.Four,PET5PSScore.Three,PET5PSScore.Two,PET5PSScore.One,PET5PSScore.X, }),
|
||
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.NotEvaluable,SUVChangeVSBaseline.Increase,SUVChangeVSBaseline.Decrease,SUVChangeVSBaseline.DidNotChange, }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.YesHaveNew,}),
|
||
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD }),
|
||
},
|
||
|
||
//5分/4分 增大 NE/(是,存在新的/复发的FDG高亲和性病灶)/(是,存在持续的局灶性变化)/否 PMD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.Five,PET5PSScore.Four, }),
|
||
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.Increase }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.NE, FDGAffinityFociInBM.YesHaveNew, FDGAffinityFociInBM.YesSustain, FDGAffinityFociInBM.No}),
|
||
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD }),
|
||
},
|
||
|
||
//3分/2分/1分/X NE/增大/减少/无明显变化 否 CMR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.Three,PET5PSScore.Two,PET5PSScore.One,PET5PSScore.X, }),
|
||
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.NotEvaluable,SUVChangeVSBaseline.Increase,SUVChangeVSBaseline.Decrease,SUVChangeVSBaseline.DidNotChange, }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.No}),
|
||
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.CMR }),
|
||
},
|
||
|
||
//3分/2分/1分/X NE/增大/减少/无明显变化 是,存在持续的局灶性变化 PMR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.Three,PET5PSScore.Two,PET5PSScore.One,PET5PSScore.X, }),
|
||
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.NotEvaluable,SUVChangeVSBaseline.Increase,SUVChangeVSBaseline.Decrease,SUVChangeVSBaseline.DidNotChange, }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.YesSustain }),
|
||
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMR }),
|
||
},
|
||
|
||
//5分/4分 减少 否/是,存在持续的局灶性变化 PMR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.Five,PET5PSScore.Four }),
|
||
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.Decrease }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.No, FDGAffinityFociInBM.YesSustain}),
|
||
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMR }),
|
||
},
|
||
|
||
//5分/4分 无明显变化 否/是,存在持续的局灶性变化 NMR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<PET5PSScore>() { PET5PSScore.Five,PET5PSScore.Four }),
|
||
Column2=ReadingCommon.EnumToString(new List<SUVChangeVSBaseline>() { SUVChangeVSBaseline.DidNotChange }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGAffinityFociInBM>() { FDGAffinityFociInBM.No, FDGAffinityFociInBM.YesSustain}),
|
||
Column4=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NMR }),
|
||
},
|
||
};
|
||
|
||
|
||
var resultdata = data.Where(x =>
|
||
(x.NotEq.Contains(1) ? !x.Column1.Contains(pET5PS) : x.Column1.Contains(pET5PS) || x.Column1.Count() == 0) &&
|
||
(x.NotEq.Contains(2) ? !x.Column2.Contains(uptakeChange) : x.Column2.Contains(uptakeChange) || x.Column2.Count() == 0) &&
|
||
(x.NotEq.Contains(3) ? !x.Column3.Contains(evidenceFocalFDG) : x.Column3.Contains(evidenceFocalFDG) || x.Column3.Count() == 0))
|
||
.Select(x => x.Column4.FirstOrDefault())
|
||
.FirstOrDefault();
|
||
return resultdata ?? string.Empty;
|
||
}
|
||
|
||
#endregion
|
||
#region 骨髓中是否存在局灶性 FDG亲和病灶的证据
|
||
|
||
/// <summary>
|
||
/// 骨髓中是否存在局灶性 FDG亲和病灶的证据
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetEvidenceFocalFDG(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
if (await ImageQualityIsUnableFuse(inDto) || inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt()))
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return string.Empty;
|
||
}
|
||
else
|
||
{
|
||
return FDGAffinityFociInBM.NE.GetEnumInt();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.EvidenceFocalFDG).Select(x => x.Answer).FirstOrDefault() ?? string.Empty;
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
#region 肝脏评估
|
||
/// <summary>
|
||
/// 获取肝脏评估
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetLiverAssessment(ReadingCalculateDto inDto)
|
||
{
|
||
return inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LiverState).Select(x => x.Answer).FirstIsNullReturnEmpty();
|
||
}
|
||
#endregion
|
||
|
||
#region SuvMax所在病灶
|
||
|
||
/// <summary>
|
||
/// SuvMax所在病灶
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetSuvMaxFocus(ReadingCalculateDto inDto)
|
||
{
|
||
var rowInfo = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList();
|
||
|
||
if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt())
|
||
|| !inDto.QuestionInfo.SelectMany(x => x.TableRowInfoList).Any(x => x.OtherMeasureData != null && x.OtherMeasureData != string.Empty))
|
||
{
|
||
return string.Empty;
|
||
}
|
||
|
||
var tableQuestions = rowInfo.SelectMany(x => x.TableQuestionList).ToList();
|
||
|
||
var maxSuv = tableQuestions.Where(x => x.QuestionMark == QuestionMark.SUVmax).Select(x => new
|
||
{
|
||
x.RowIndex,
|
||
Answer = x.Answer.IsNullOrEmptyReturn0(),
|
||
|
||
|
||
}).OrderByDescending(x => x.Answer).FirstOrDefault();
|
||
if (maxSuv == null || maxSuv.Answer == 0m)
|
||
{
|
||
return "NE";
|
||
}
|
||
else
|
||
{
|
||
var orderMark = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).FirstOrDefault()!.OrderMark;
|
||
return orderMark + maxSuv.RowIndex.GetLesionMark();
|
||
}
|
||
|
||
|
||
}
|
||
#endregion
|
||
|
||
#region SuvMax
|
||
/// <summary>
|
||
/// 最大sum
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<decimal?> GetSuvMax(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
|
||
|
||
if (inDto.QuestionInfo.Any(x => x.QuestionType == QuestionType.ExistPET && x.Answer == ReadingYesOrNo.No.GetEnumInt())
|
||
|| !inDto.QuestionInfo.SelectMany(x => x.TableRowInfoList).Any(x => x.OtherMeasureData != null && x.OtherMeasureData != string.Empty))
|
||
{
|
||
return null;
|
||
}
|
||
var rowInfo = inDto.QuestionInfo.SelectMany(x => x.TableRowInfoList).ToList();
|
||
var tableQuestions = rowInfo.SelectMany(x => x.TableQuestionList).ToList();
|
||
|
||
var maxSuv = tableQuestions.Where(x => x.QuestionMark == QuestionMark.SUVmax).Select(x => x.Answer.IsNullOrEmptyReturn0()).MaxOrDefault();
|
||
return maxSuv;
|
||
}
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// 是否存在PET
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetExistPET(ReadingCalculateDto inDto)
|
||
{
|
||
//var studyList = await this._subjectVisitService.GetReadingVisitStudyList(new Contracts.GetReadingVisitStudyListIndto()
|
||
//{
|
||
// TrialId = inDto.TrialId,
|
||
// SujectVisitId = inDto.SubjectVisitId,
|
||
// VisitTaskId=inDto.VisitTaskId,
|
||
//});
|
||
|
||
var existPet = await _dicomStudyRepository.Where(x => x.TrialId == inDto.TrialId && x.SubjectVisitId == inDto.SubjectVisitId).AnyAsync(x => x.Modalities.Contains("PT"));
|
||
|
||
return existPet ? ReadingYesOrNo.Yes.GetEnumInt() : ReadingYesOrNo.No.GetEnumInt();
|
||
}
|
||
|
||
#region 影像学整体肿瘤评估
|
||
/// <summary>
|
||
/// 影像学整体肿瘤评估
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetImgOncology(ReadingCalculateDto inDto)
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return ImagingOverallAssessment_Lugano.NA.GetEnumInt();
|
||
}
|
||
|
||
//var imageQualityEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.ImageQualityAssessment&&x.Answer.EqEnum(ImageQualityEvaluation.Abnormal)).FirstOrDefault();
|
||
//if (imageQualityEvaluation != null)
|
||
//{
|
||
// return ImagingOverallAssessment_Lugano.NE.GetEnumInt();
|
||
//}
|
||
|
||
// CTandMRI
|
||
var cTandMRIData = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.CTandMRI).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
// FDGPET
|
||
var fDGPETData = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.FDGPET).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
var baseLineTaskId = await GetBaseLineTaskId(inDto);
|
||
// lastFDGPET
|
||
var lastFDGPETData = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LastFDGPET).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
return CalculationGetImgOncology(cTandMRIData, fDGPETData, lastFDGPETData);
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算整体肿瘤评估 【测试】
|
||
/// </summary>
|
||
/// <param name="cTandMRIData"> CT/MRI总体评估</param>
|
||
/// <param name="fDGPETData"> FDG-PET总体评估</param>
|
||
/// <param name="lastFDGPETData">上一次 FDG-PET总体评估</param>
|
||
/// <returns></returns>
|
||
public string CalculationGetImgOncology(string? cTandMRIData, string? fDGPETData, string? lastFDGPETData)
|
||
{
|
||
List<CalculationDto> data = new List<CalculationDto>() {
|
||
|
||
//1、ND NE NE/NA ND
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA}),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.ND }),
|
||
},
|
||
//2、ND/PD/CR/NE/PR/SD PMD PMD/CMR/PMR/NMR/NE/NA PMD/PD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND, CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD}),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD, }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() {FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMDPD }),
|
||
},
|
||
//3、ND/PD/CR/NE/PR/SD NE PMD PMD/PD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND, CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD}),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() {FDGPETOverallAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD, }),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMDPD }),
|
||
},
|
||
//4、PD NE CMR/PMR/NMR/NE/NA PMD/PD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD}),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMDPD }),
|
||
},
|
||
//5、NE NE NE/NA NE
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.NE }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.NE }),
|
||
},
|
||
|
||
//6、CR、PR、SD、NE、ND、PD CMR CMR/PMR/NMR/PMD/NE/NA CMR/CR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.ND,CTMRIOverallAssessment.PD }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.CMR }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA }),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.CMRCR }),
|
||
},
|
||
//7、CR NE NE/NA CMR/CR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.CMRCR }),
|
||
},
|
||
|
||
//8、CR、PR、SD、NE、ND NE CMR CMR/CR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.CMR,}),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.CMRCR }),
|
||
},
|
||
|
||
|
||
|
||
|
||
//9、ND/PD/CR/NE/PR/SD PMR PMD/CMR/PMR/NMR/NE PMR/PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND, CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMR }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR,FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE,FDGPETOverallAssessment.NA, }),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMRPR }),
|
||
},
|
||
//10、PR NE NE/NA PMR/PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PR }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMRPR }),
|
||
},
|
||
//11、CR/PR/SD/NE/ND NE PMR PMR/PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMR}),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.PMRPR }),
|
||
},
|
||
//12、ND/PD/CR/NE/PR/SD NMR PMD/CMR/PMR/NMR/NE NMR/SD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND,CTMRIOverallAssessment.PD,CTMRIOverallAssessment.CR,CTMRIOverallAssessment.NE,CTMRIOverallAssessment.PR,CTMRIOverallAssessment.SD }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NMR }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.PMD, FDGPETOverallAssessment.CMR, FDGPETOverallAssessment.PMR, FDGPETOverallAssessment.NMR, FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.NMRSD }),
|
||
},
|
||
//13、CR/PR/SD/ND/NE NE NMR NMR/SD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR, CTMRIOverallAssessment.PR, CTMRIOverallAssessment.SD, CTMRIOverallAssessment.ND, CTMRIOverallAssessment.NE }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NMR}),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.NMRSD }),
|
||
},
|
||
//14、SD NE NE NMR/SD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.SD }),
|
||
Column2=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<FDGPETOverallAssessment>() { FDGPETOverallAssessment.NE, FDGPETOverallAssessment.NA,}),
|
||
Column4=ReadingCommon.EnumToString(new List<ImagingOverallAssessment_Lugano>() { ImagingOverallAssessment_Lugano.NMRSD }),
|
||
},
|
||
};
|
||
|
||
var resultdata = data.Where(x =>
|
||
(x.NotEq.Contains(1) ? !x.Column1.Contains(cTandMRIData) : x.Column1.Contains(cTandMRIData) || x.Column1.Count() == 0) &&
|
||
(x.NotEq.Contains(2) ? !x.Column2.Contains(fDGPETData) : x.Column2.Contains(fDGPETData) || x.Column2.Count() == 0) &&
|
||
(x.NotEq.Contains(3) ? !x.Column3.Contains(lastFDGPETData) : x.Column3.Contains(lastFDGPETData) || x.Column3.Count() == 0))
|
||
.Select(x => x.Column4.FirstOrDefault())
|
||
.FirstOrDefault();
|
||
return resultdata ?? string.Empty;
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 获取基线脾脏长度
|
||
/// <summary>
|
||
/// 获取基线脾脏长度
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<decimal> GetBaseLineSpleenLength(ReadingCalculateDto inDto)
|
||
{
|
||
var baseLineTaskId = await GetBaseLineTaskId(inDto);
|
||
|
||
var baseLineSpleenLength = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SpleenLength).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||
return baseLineSpleenLength;
|
||
}
|
||
|
||
|
||
#endregion
|
||
|
||
#region 与最低点相比脾脏垂直径长度的增加值
|
||
/// <summary>
|
||
/// 与最低点相比脾脏垂直径长度的增加值
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetSplenoncusDiameterChange(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return "NA";
|
||
}
|
||
|
||
var baseLineTaskId = await GetBaseLineTaskId(inDto);
|
||
var presentSpleenLength = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SpleenLength).Select(x => x.Answer).FirstOrDefault().IsNullOrEmptyReturn0();
|
||
var baseLineSpleenLength = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SpleenLength).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||
|
||
return (presentSpleenLength - baseLineSpleenLength).ToString();
|
||
|
||
|
||
}
|
||
#endregion
|
||
|
||
|
||
#region 获取靶病灶评估
|
||
/// <summary>
|
||
/// 获取靶病灶评估
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetTargetLesionEvaluate(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
|
||
|
||
var rowInfo = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.TargetLesion).SelectMany(x => x.TableRowInfoList).ToList();
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return TargetAssessment.NA.GetEnumInt();
|
||
}
|
||
var tableQuestions = rowInfo.SelectMany(x => x.TableQuestionList).ToList();
|
||
|
||
TargetAssessment result = TargetAssessment.SD;
|
||
|
||
//或者当前访视非淋巴结靶病灶全部消失;
|
||
//并且 2.当前访视淋巴结靶病灶的状态全部变为“消失”。
|
||
|
||
var eqCR = true;
|
||
//当前访视中,靶病灶的Σ PPD;
|
||
decimal spd = 0;
|
||
foreach (var item in rowInfo)
|
||
{
|
||
if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.No)))
|
||
{
|
||
// 或者当前访视非淋巴结靶病灶全部消失;
|
||
eqCR = eqCR && item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.Loss));
|
||
}
|
||
spd += (item.TableQuestionList.Where(x => x.QuestionMark == QuestionMark.PPD).Select(x => x.Answer).FirstOrDefault()).IsNullOrEmptyReturn0();
|
||
if (item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.IsLymph && x.Answer.EqEnum(YesOrNoOrNa.Yes)))
|
||
{
|
||
// 当前访视淋巴结靶病灶的状态全部变为“消失”
|
||
eqCR = eqCR && item.TableQuestionList.Any(x => x.QuestionMark == QuestionMark.State && (x.Answer.EqEnum(TargetState.Loss) || x.Answer.EqEnum(TargetState.TooSmall)));
|
||
}
|
||
}
|
||
// 1、与基线相比SPD变化的百分比 ≥50%,;
|
||
var eqPR = false;
|
||
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
eqPR = false;
|
||
}
|
||
else
|
||
{
|
||
// 先找到基线的任务
|
||
var baseLineTaskId = await _visitTaskRepository.Where(x => x.SubjectId == inDto.SubjectId && x.ReadingCategory == ReadingCategory.Visit
|
||
&& x.TrialReadingCriterionId == inDto.TrialReadingCriterionId &&
|
||
x.SourceSubjectVisit.IsBaseLine && x.TaskState == TaskState.Effect &&
|
||
x.IsAnalysisCreate == inDto.IsAnalysisCreate
|
||
&& x.ArmEnum == inDto.ArmEnum
|
||
&& x.IsSelfAnalysis == inDto.IsSelfAnalysis && x.ArmEnum == inDto.ArmEnum)
|
||
.Select(x => x.Id).FirstOrDefaultAsync();
|
||
|
||
var baseLineSPD = (await _readingTaskQuestionAnswerRepository.Where(x => x.VisitTaskId == baseLineTaskId && x.ReadingQuestionTrial.QuestionType == QuestionType.SPD).Select(x => x.Answer).FirstOrDefaultAsync()).IsNullOrEmptyReturn0();
|
||
var presentSPD = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SPD).Select(x => x.Answer).FirstIsNullReturnEmpty().IsNullOrEmptyReturn0();
|
||
|
||
if (baseLineSPD > 0)
|
||
{
|
||
eqPR = (presentSPD - baseLineSPD) / baseLineSPD <= -0.5m;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//基线未选择靶病灶
|
||
if (rowInfo.Count() == 0)
|
||
{
|
||
result = TargetAssessment.ND;
|
||
}
|
||
// 任一单个病灶进展即可
|
||
else if (tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.DiseaseProgression)))
|
||
{
|
||
result = TargetAssessment.PD;
|
||
}
|
||
|
||
//当前访视存在至少一个状态为“不可评估”的靶病灶。
|
||
else if (
|
||
tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(TargetState.UnableEvaluate)))
|
||
{
|
||
result = TargetAssessment.NE;
|
||
}
|
||
//当前访视非淋巴结靶病灶全部消失 && (当前访视淋巴结靶病灶的状态全部变为“消失” 或者 "太小" )
|
||
else if (eqCR)
|
||
{
|
||
result = TargetAssessment.CR;
|
||
}
|
||
// 与基线相比SPD变化的百分比 <=-50%,;
|
||
else if (eqPR)
|
||
{
|
||
result = TargetAssessment.PR;
|
||
}
|
||
|
||
|
||
return result.GetEnumInt();
|
||
}
|
||
#endregion
|
||
|
||
#region 获取非靶病灶评估
|
||
|
||
/// <summary>
|
||
/// 获取非靶病灶评估
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetNoTargetLesionEvaluate(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
NoTargetAssessment result = NoTargetAssessment.PD;
|
||
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return NoTargetAssessment.NA.GetEnumInt();
|
||
}
|
||
|
||
var tableRows = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NonTargetLesions).SelectMany(x => x.TableRowInfoList).ToList();
|
||
|
||
var tableQuestions = tableRows.SelectMany(x => x.TableQuestionList).ToList();
|
||
|
||
//基线未选择非靶病灶
|
||
if (tableQuestions.Count() == 0)
|
||
{
|
||
result = NoTargetAssessment.ND;
|
||
}
|
||
// 随访至少存在一个状态为“显著增大”的非靶病灶
|
||
else if (tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NoTargetState.Increase)))
|
||
{
|
||
result = NoTargetAssessment.PD;
|
||
}
|
||
|
||
// 随访存在至少一个状态为“不可评估”的非靶病灶
|
||
else if (tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NoTargetState.UnableEvaluate)))
|
||
{
|
||
result = NoTargetAssessment.NE;
|
||
}
|
||
//所有单个病灶/病灶组状态评估状态为“消失”
|
||
else if (tableQuestions.Count(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NoTargetState.Loss)) == tableQuestions.Count(x => x.QuestionMark == QuestionMark.State) && tableQuestions.Count(x => x.QuestionMark == QuestionMark.State) > 0)
|
||
{
|
||
result = NoTargetAssessment.CR;
|
||
}
|
||
else
|
||
{
|
||
result = NoTargetAssessment.PRSD;
|
||
}
|
||
|
||
return result.GetEnumInt();
|
||
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 获取新病灶评估
|
||
/// <summary>
|
||
/// 获取新病灶评估
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> GetNewLesionEvaluate(ReadingCalculateDto inDto)
|
||
{
|
||
|
||
NewLesionAssessment result = NewLesionAssessment.No;
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return NewLesionAssessment.NA.GetEnumInt();
|
||
}
|
||
|
||
var tableRows = inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NewLesions).SelectMany(x => x.TableRowInfoList).ToList();
|
||
|
||
var tableQuestions = tableRows.SelectMany(x => x.TableQuestionList).ToList();
|
||
|
||
|
||
|
||
// 当前访视存在至少一个明确新病灶
|
||
if (tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewLesionState.Exist)))
|
||
{
|
||
result = NewLesionAssessment.Yes;
|
||
}
|
||
//只要有任何一个新病灶状态为“无法评估”
|
||
else if (tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewLesionState.UnableEvaluate)))
|
||
{
|
||
result = NewLesionAssessment.NE;
|
||
}
|
||
//当前访视不存在明确新病灶且存在至少一个疑似新病灶
|
||
else if (!tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewLesionState.Exist)) &&
|
||
tableQuestions.Any(x => x.QuestionMark == QuestionMark.State && x.Answer.EqEnum(NewLesionState.Suspected))
|
||
)
|
||
{
|
||
result = NewLesionAssessment.Suspected;
|
||
}
|
||
|
||
|
||
else
|
||
{
|
||
result = NewLesionAssessment.No;
|
||
}
|
||
return result.GetEnumInt();
|
||
|
||
}
|
||
#endregion
|
||
|
||
|
||
#region CTMRI 总体评估
|
||
|
||
/// <summary>
|
||
/// CTMRI 总体评估
|
||
/// </summary>
|
||
/// <param name="inDto"></param>
|
||
/// <returns></returns>
|
||
public async Task<string> CTMRIEvaluation(ReadingCalculateDto inDto)
|
||
{
|
||
if (inDto.IsBaseLine)
|
||
{
|
||
return CTMRIOverallAssessment.NA.GetEnumInt();
|
||
}
|
||
// 靶病灶评估
|
||
var targetEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.TargetLesion).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
// 非靶病灶评估
|
||
var noTargetEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NoTargetLesion).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
// 存在新病灶
|
||
var existsNewTarget = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.NewLesionEvaluation).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
// 肝脏评估
|
||
var liverEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.LiverAssessment).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
// 脾脏评估
|
||
var spleenEvaluation = inDto.QuestionInfo.Where(x => x.QuestionType == QuestionType.SplenicEvaluation).Select(x => x.Answer).FirstOrDefault();
|
||
|
||
return CalculationCTMRIEvaluation(targetEvaluation, noTargetEvaluation, existsNewTarget, liverEvaluation, spleenEvaluation);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 计算CTMRI 总体评估 【测试】
|
||
/// </summary>
|
||
/// <param name="targetEvaluation">靶病灶评估</param>
|
||
/// <param name="noTargetEvaluation">非靶病灶评估</param>
|
||
/// <param name="existsNewTarget">存在新病灶</param>
|
||
/// <param name="liverEvaluation">肝脏评估</param>
|
||
/// <param name="spleenEvaluation">脾脏评估</param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
public string CalculationCTMRIEvaluation(string? targetEvaluation, string? noTargetEvaluation, string? existsNewTarget, string? liverEvaluation, string? spleenEvaluation)
|
||
{
|
||
List<CalculationDto> data = new List<CalculationDto>() {
|
||
|
||
//ND ND 否/疑似 正常 正常 ND
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.ND }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No, NewLesionAssessment.Suspected }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Normal }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.ND }),
|
||
},
|
||
|
||
//PD 任一结果 任一结果 任一结果 任一结果 PD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.PD }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
|
||
},
|
||
//任一结果 PD 任一结果 任一结果 任一结果 PD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.PD }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() {}),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
|
||
},
|
||
//任一结果 任一结果 是 任一结果 任一结果 PD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.Yes }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
|
||
},
|
||
//任一结果 任一结果 任一结果 显著增大 任一结果 PD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Increase }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
|
||
},
|
||
//任一结果 任一结果 任一结果 任一结果 显著增大 PD
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() {}),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Increase }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PD }),
|
||
},
|
||
//CR CR/ND 否 正常 正常 CR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.CR }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.CR, NoTargetAssessment.ND }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Normal }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR }),
|
||
},
|
||
//ND CR 否 正常 正常 CR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.CR }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Normal }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.CR }),
|
||
},
|
||
//NE 非PD 否/疑似/无法评估 非显著增大 非显著增大 NE
|
||
new CalculationDto(){
|
||
NotEq=new List<int>(){ 2,4,5},
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.NE }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.PD }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No,NewLesionAssessment.Suspected, NewLesionAssessment.NE}),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Increase }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Increase }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.NE }),
|
||
},
|
||
//ND NE 否/疑似/无法评估(不为是) 正常/稳定/无法评估/部分缓解(非显著增大) 正常/稳定/无法评估/部分缓解(非显著增大) NE
|
||
new CalculationDto(){
|
||
NotEq=new List<int>(){ 3,4,5},
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.Yes }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Increase }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Increase }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.NE }),
|
||
},
|
||
//ND ND 无法评估 正常/稳定/无法评估/部分缓解(非显著增大) 正常/稳定/无法评估/部分缓解(非显著增大) NE
|
||
new CalculationDto(){
|
||
NotEq=new List<int>(){ 4,5},
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.ND }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.NE }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Increase }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Increase }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.NE }),
|
||
},
|
||
//ND ND 否/疑似 无法评估 正常/稳定/无法评估/部分缓解(非显著增大) NE
|
||
new CalculationDto(){
|
||
NotEq=new List<int>(){ 5},
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.ND }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No,NewLesionAssessment.Suspected }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.NotEvaluable }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Increase }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.NE }),
|
||
},
|
||
// ND ND 否/疑似 正常/稳定 NE NE
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.ND }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No,NewLesionAssessment.Suspected }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Normal,LiverAssessment.Stabilization }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.NotEvaluable }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.NE }),
|
||
},
|
||
//1 PR CR或PR/SD或NE或ND 否/疑似/无法评估NE 正常/稳定/NE 正常/部分缓解/稳定/NE PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.PR }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.CR,NoTargetAssessment.PRSD,NoTargetAssessment.NE,NoTargetAssessment.ND }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No,NewLesionAssessment.Suspected,NewLesionAssessment.NE }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Normal,LiverAssessment.Stabilization,LiverAssessment.NotEvaluable}),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal,SpleenAssessment.Remission,SpleenAssessment.Stabilization,SpleenAssessment.NotEvaluable }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PR }),
|
||
},
|
||
//2 CR (PR/SD)或者NE 否/疑似/无法评估 正常/稳定/NE 正常/部分缓解/稳定/NE PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.CR }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.PRSD,NoTargetAssessment.NE }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No,NewLesionAssessment.Suspected ,NewLesionAssessment.NE}),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Normal,LiverAssessment.Stabilization,LiverAssessment.NotEvaluable}),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal,SpleenAssessment.Remission ,SpleenAssessment.Stabilization,SpleenAssessment.NotEvaluable}),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PR }),
|
||
},
|
||
//3 CR CR/ND 疑似/无法评估 正常/稳定/NE 正常/部分缓解/稳定/NE PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.CR }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.CR,NoTargetAssessment.ND }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.Suspected, NewLesionAssessment.NE }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Normal,LiverAssessment.Stabilization,LiverAssessment.NotEvaluable}),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal,SpleenAssessment.Remission ,SpleenAssessment.Stabilization,SpleenAssessment.NotEvaluable }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PR }),
|
||
},
|
||
//4 CR CR/ND 否 稳定/NE 正常/部分缓解/稳定/NE PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.CR }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.CR,NoTargetAssessment.ND }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() {LiverAssessment.Stabilization,LiverAssessment.NotEvaluable}),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal,SpleenAssessment.Remission ,SpleenAssessment.Stabilization,SpleenAssessment.NotEvaluable }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PR }),
|
||
},
|
||
//5 CR CR/ND 否 正常 部分缓解/稳定/NE PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.CR }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.CR,NoTargetAssessment.ND }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() {LiverAssessment.Normal}),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Remission ,SpleenAssessment.Stabilization,SpleenAssessment.NotEvaluable }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PR }),
|
||
},
|
||
// 6 ND CR 疑似/无法评估 正常/稳定/NE 正常/部分缓解/稳定/NE PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.CR }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.Suspected, NewLesionAssessment.NE }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { LiverAssessment.Normal,LiverAssessment.Stabilization,LiverAssessment.NotEvaluable}),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal,SpleenAssessment.Remission,SpleenAssessment.Stabilization,SpleenAssessment.NotEvaluable }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PR }),
|
||
},
|
||
// 7 ND CR 否 稳定/NE 正常/部分缓解/稳定/NE PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.CR }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() {LiverAssessment.Stabilization,LiverAssessment.NotEvaluable}),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Normal,SpleenAssessment.Remission,SpleenAssessment.Stabilization,SpleenAssessment.NotEvaluable }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PR }),
|
||
},
|
||
// 8 ND CR 否 正常 部分缓解/稳定/NE PR
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { TargetAssessment.ND }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { NoTargetAssessment.CR }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { NewLesionAssessment.No }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() {LiverAssessment.Normal}),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { SpleenAssessment.Remission,SpleenAssessment.Stabilization,SpleenAssessment.NotEvaluable }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.PR }),
|
||
},
|
||
new CalculationDto(){
|
||
Column1=ReadingCommon.EnumToString(new List<TargetAssessment>() { }),
|
||
Column2=ReadingCommon.EnumToString(new List<NoTargetAssessment>() { }),
|
||
Column3=ReadingCommon.EnumToString(new List<NewLesionAssessment>() { }),
|
||
Column4=ReadingCommon.EnumToString(new List<LiverAssessment>() { }),
|
||
Column5=ReadingCommon.EnumToString(new List<SpleenAssessment>() { }),
|
||
Column6=ReadingCommon.EnumToString(new List<CTMRIOverallAssessment>() { CTMRIOverallAssessment.SD }),
|
||
},
|
||
};
|
||
|
||
var index = data.FindIndex(x =>
|
||
(x.NotEq.Contains(1) ? !x.Column1.Contains(targetEvaluation) : x.Column1.Contains(targetEvaluation) || x.Column1.Count() == 0) &&
|
||
(x.NotEq.Contains(2) ? !x.Column2.Contains(noTargetEvaluation) : x.Column2.Contains(noTargetEvaluation) || x.Column2.Count() == 0) &&
|
||
(x.NotEq.Contains(3) ? !x.Column3.Contains(existsNewTarget) : x.Column3.Contains(existsNewTarget) || x.Column3.Count() == 0) &&
|
||
(x.NotEq.Contains(4) ? !x.Column4.Contains(liverEvaluation) : x.Column4.Contains(liverEvaluation) || x.Column4.Count() == 0) &&
|
||
(x.NotEq.Contains(5) ? !x.Column5.Contains(spleenEvaluation) : x.Column5.Contains(spleenEvaluation) || x.Column5.Count() == 0))
|
||
;
|
||
var result = data.Where(x =>
|
||
(x.NotEq.Contains(1) ? !x.Column1.Contains(targetEvaluation) : x.Column1.Contains(targetEvaluation) || x.Column1.Count() == 0) &&
|
||
(x.NotEq.Contains(2) ? !x.Column2.Contains(noTargetEvaluation) : x.Column2.Contains(noTargetEvaluation) || x.Column2.Count() == 0) &&
|
||
(x.NotEq.Contains(3) ? !x.Column3.Contains(existsNewTarget) : x.Column3.Contains(existsNewTarget) || x.Column3.Count() == 0) &&
|
||
(x.NotEq.Contains(4) ? !x.Column4.Contains(liverEvaluation) : x.Column4.Contains(liverEvaluation) || x.Column4.Count() == 0) &&
|
||
(x.NotEq.Contains(5) ? !x.Column5.Contains(spleenEvaluation) : x.Column5.Contains(spleenEvaluation) || x.Column5.Count() == 0))
|
||
.Select(x => x.Column6.FirstOrDefault())
|
||
.FirstOrDefault();
|
||
return result ?? string.Empty;
|
||
}
|
||
|
||
#endregion
|
||
|
||
/// <summary>
|
||
/// 保留小数
|
||
/// </summary>
|
||
/// <param name="answer"></param>
|
||
/// <param name="digitPlaces"></param>
|
||
/// <returns></returns>
|
||
public string ReserveDecimal(decimal answer, int digitPlaces)
|
||
{
|
||
return decimal.Round(answer, digitPlaces).ToString();
|
||
}
|
||
|
||
#region 脾脏评估
|
||
|
||
///// <summary>
|
||
///// 获取脾脏评估
|
||
///// </summary>
|
||
///// <param name="inDto"></param>
|
||
///// <returns></returns>
|
||
//public async Task<string> GetSplenicEvaluation(ReadingCalculateDto inDto)
|
||
//{
|
||
|
||
//}
|
||
#endregion
|
||
|
||
#endregion
|
||
|
||
}
|
||
|
||
}
|