diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index 1da83f575..1accf30d6 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -1771,6 +1771,13 @@
+
+
+ 计算融合靶病灶的状态
+
+
+
+
计算靶病灶状态
diff --git a/IRaCIS.Core.Application/Service/Common/DTO/DictionaryModel.cs b/IRaCIS.Core.Application/Service/Common/DTO/DictionaryModel.cs
index 0ff1c4cf8..8769f96a6 100644
--- a/IRaCIS.Core.Application/Service/Common/DTO/DictionaryModel.cs
+++ b/IRaCIS.Core.Application/Service/Common/DTO/DictionaryModel.cs
@@ -91,7 +91,9 @@ namespace IRaCIS.Application.Contracts
public class GetBasicDataAllSelectInDto
{
public Guid? TrialReadingCriterionId { get; set; }
- }
+
+ public Guid? SystemReadingCriterionId { get; set; }
+ }
public class GetTrialCriterionDictionaryListInDto
diff --git a/IRaCIS.Core.Application/Service/Common/DictionaryService.cs b/IRaCIS.Core.Application/Service/Common/DictionaryService.cs
index 720fd0c02..ff7a8fe42 100644
--- a/IRaCIS.Core.Application/Service/Common/DictionaryService.cs
+++ b/IRaCIS.Core.Application/Service/Common/DictionaryService.cs
@@ -23,7 +23,7 @@ namespace IRaCIS.Application.Services
private readonly IRepository _systemCriterionDictionaryCodeRepository;
private readonly IRepository _trialCriterionDictionaryCodeRepository;
private readonly IRepository _readingTrialCriterionDictionaryRepository;
-
+ private readonly IRepository _readingSystemCriterionDictionaryRepository;
private readonly IRepository _readingCriterionDictionaryRepository;
private readonly IRepository _readingQuestionCriterionSystem;
private readonly IRepository _readingQuestionCriterionTrial;
@@ -34,6 +34,7 @@ namespace IRaCIS.Application.Services
IRepository systemCriterionDictionaryCodeRepository,
IRepository trialCriterionDictionaryCodeRepository,
IRepository readingTrialCriterionDictionaryRepository,
+ IRepository readingSystemCriterionDictionaryRepository,
IRepository readingCriterionDictionaryRepository,
IRepository readingQuestionCriterionSystem,
IRepository readingQuestionCriterionTrial
@@ -49,6 +50,7 @@ namespace IRaCIS.Application.Services
this._systemCriterionDictionaryCodeRepository = systemCriterionDictionaryCodeRepository;
this._trialCriterionDictionaryCodeRepository = trialCriterionDictionaryCodeRepository;
this._readingTrialCriterionDictionaryRepository = readingTrialCriterionDictionaryRepository;
+ this._readingSystemCriterionDictionaryRepository = readingSystemCriterionDictionaryRepository;
this._readingCriterionDictionaryRepository = readingCriterionDictionaryRepository;
this._readingQuestionCriterionSystem = readingQuestionCriterionSystem;
this._readingQuestionCriterionTrial = readingQuestionCriterionTrial;
@@ -462,11 +464,11 @@ namespace IRaCIS.Application.Services
var result = searchList.GroupBy(t => t.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
- if (inDto.TrialReadingCriterionId == null)
+ if (inDto.TrialReadingCriterionId == null && inDto.SystemReadingCriterionId == null)
{
return result;
}
- else
+ else if (inDto.TrialReadingCriterionId != null)
{
var trialCriterionType = await _readingQuestionCriterionTrial.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => x.CriterionType).FirstOrDefaultAsync();
if (trialCriterionType == CriterionType.SelfDefine)
@@ -520,8 +522,52 @@ namespace IRaCIS.Application.Services
return result;
}
+ else
+ {
+ List selectCode = await _systemCriterionDictionaryCodeRepository.Where(x => x.SystemCriterionId == inDto.SystemReadingCriterionId).Select(x => x.Code).ToListAsync();
+ var criterionCode = await _dicRepository.Where(x => x.ConfigDictionary.Code == "Reading_eCRF_Criterion").Select(x => x.Code).ToListAsync();
+
+
+ foreach (var item in criterionCode)
+ {
+ if (result.ContainsKey(item))
+ {
+ result[item] = new List();
+ }
+ }
+
+ var criterionDictionList = await _readingSystemCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.SystemReadingCriterionId).Select(x => new BasicDicSelect()
+ {
+ ChildGroup = x.Dictionary.ChildGroup,
+ Code = x.Dictionary.Code,
+ Description = x.Dictionary.Description,
+ DataTypeEnum = x.Dictionary.DataTypeEnum,
+ ParentChildCodeEnum = x.Dictionary.Parent.ChildCodeEnum,
+ ShowOrder = x.Dictionary.ShowOrder,
+ ParentCode = x.ParentCode,
+ Id = x.DictionaryId,
+ CrterionDictionaryGroup = x.CrterionDictionaryGroup,
+ ParentId = x.Dictionary.ParentId,
+ Value = x.Dictionary.Value,
+ ValueCN = x.Dictionary.ValueCN
+
+ }).ToListAsync();
+
+ criterionDictionList = criterionDictionList.Where(x => selectCode.Contains(x.ParentCode)).ToList();
+
+ var criterionDic = criterionDictionList.GroupBy(x => x.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
+
+ foreach (var item in criterionDic)
+ {
+ result[item.Key] = item.Value;
+ }
+
+ return result;
+
+ }
+
}
#region 稽查相关
diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs
index f22e2b2fe..620042d14 100644
--- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs
+++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTask/ReadingImageTaskService.cs
@@ -1435,7 +1435,7 @@ namespace IRaCIS.Application.Services
QuestionMark.MajorAxis,
QuestionMark.ShortAxis,
QuestionMark.State,
-
+ QuestionMark.PPD,
};
tableAnswers.ForEach(x =>
@@ -1468,6 +1468,7 @@ namespace IRaCIS.Application.Services
{
await VerifyTaskIsSign(inDto.VisitTaskId);
await this.VerifyIsBaseLineTask(inDto.VisitTaskId);
+ var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.MergeMainRowId).Include(x => x.TrialReadingCriterion).FirstNotNullAsync();
var mergeRow = await _readingTableAnswerRowInfoRepository.Where(x => x.Id == inDto.MergeMainRowId).Include(x => x.ReadingQuestionTrial).FirstNotNullAsync();
var mark = mergeRow.ReadingQuestionTrial.OrderMark + mergeRow.RowIndex.GetLesionMark();
@@ -1496,6 +1497,19 @@ namespace IRaCIS.Application.Services
VisitTaskId = inDto.VisitTaskId,
ComputationTrigger = ComputationTrigger.Lesion,
});
+
+ // 保存完了计算疾病进展
+ switch (taskinfo.TrialReadingCriterion.CriterionType)
+ {
+ case CriterionType.Lugano2014:
+ await _luganoCalculateService.CalculateMergeTargetLesionStatus(new CalculateTargetLesionStatusInDto()
+ {
+ QuestionId = inDto.QuestionId,
+ VisitTaskId = inDto.VisitTaskId,
+ RowNumber = mergeRow.RowIndex,
+ });
+ break;
+ }
}
///
@@ -1863,7 +1877,7 @@ namespace IRaCIS.Application.Services
throw new BusinessValidationFailedException(_localizer["ReadingImage_Idnotcorrespond"]);
}
}
- var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Include(x => x.TrialReadingCriterion).FirstNotNullAsync();
+ var taskinfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Include(x => x.TrialReadingCriterion).Include(x => x.SourceSubjectVisit).FirstNotNullAsync();
inDto.BlindName = taskinfo.TaskBlindName;
switch (taskinfo.TrialReadingCriterion.CriterionType)
{
@@ -1993,9 +2007,9 @@ namespace IRaCIS.Application.Services
var targetlymphQuestion = targetTablequestionList.Where(x => x.QuestionMark == QuestionMark.IsLymph).FirstOrDefault();
- // 判断是否存在淋巴结问题
- if (targetlymphQuestion != null)
- {
+ // 判断是否存在淋巴结问题
+ if (targetlymphQuestion != null && taskinfo.SourceSubjectVisit.VisitNum == 0)
+ {
// 判断是否为淋巴结
if (inDto.QuestionId == targetTablequestionList[0].ReadingQuestionId && inDto.AnswerList.Any(x => x.TableQuestionId == targetlymphQuestion.Id && x.Answer.EqEnum(ReadingYesOrNo.No)))
{
diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ILuganoCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ILuganoCalculateService.cs
index 6ee6012e7..81624907a 100644
--- a/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ILuganoCalculateService.cs
+++ b/IRaCIS.Core.Application/Service/ReadingCalculate/Interface/ILuganoCalculateService.cs
@@ -15,5 +15,12 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate.Interface
///
///
Task CalculateTargetLesionStatus(CalculateTargetLesionStatusInDto inDto);
+
+ ///
+ /// 计算靶病灶融合后状态
+ ///
+ ///
+ ///
+ Task CalculateMergeTargetLesionStatus(CalculateTargetLesionStatusInDto inDto);
}
}
diff --git a/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs b/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs
index 402bb334d..42c162eaa 100644
--- a/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs
+++ b/IRaCIS.Core.Application/Service/ReadingCalculate/LuganoCalculateService.cs
@@ -869,11 +869,117 @@ namespace IRaCIS.Core.Application.Service.ReadingCalculate
}
///
- /// 计算靶病灶状态
+ /// 计算融合靶病灶的状态
///
///
///
- public async Task CalculateTargetLesionStatus(CalculateTargetLesionStatusInDto inDto)
+ 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 == (int)Math.Floor(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 == (int)Math.Floor(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 = (int)Math.Floor(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()
+ }
+ );
+ }
+
+
+ }
+ }
+
+ }
+ }
+
+ ///
+ /// 计算靶病灶状态
+ ///
+ ///
+ ///
+ public async Task CalculateTargetLesionStatus(CalculateTargetLesionStatusInDto inDto)
{
if (inDto.RowNumber % 1 != 0)
{