diff --git a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs index 1e28a772d..b605f591d 100644 --- a/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs +++ b/IRaCIS.Core.Application/Service/Reading/Dto/ReadingCalculateViewModel.cs @@ -162,11 +162,16 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto { public decimal RowIndex { get; set; } + + public string MeasureData { get; set; } + public List TableQuestionList { get; set; } = new List(); } public class TableQuestionInfo { + public Guid RowId { get; set; } + /// /// 答案 /// @@ -186,6 +191,8 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto /// public QuestionMark? QuestionMark { get; set; } + public QuestionType? QuestionType { get; set; } + } diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCalculateService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCalculateService.cs index 79fd5d5ef..071b417b8 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingCalculateService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCalculateService.cs @@ -22,12 +22,13 @@ namespace IRaCIS.Core.Application.Service /// [ApiExplorerSettings(GroupName = "Reading")] - public class ReadingCalculateService : BaseService, IReadingCalculateService + public partial class ReadingCalculateService : BaseService, IReadingCalculateService { private readonly IRepository _readingTableQuestionAnswerRepository; private readonly IRepository _visitTaskRepository; private readonly IRepository _readingQuestionCriterionTrialRepository; private readonly IRepository _readingTableQuestionTrialRepository; + private readonly IRepository _readingTableAnswerRowInfoRepository; private readonly IRepository _readingQuestionTrialRepository; private readonly IRepository _subjectVisitRepository; private readonly IRepository _tumorAssessmentRepository; @@ -38,6 +39,7 @@ namespace IRaCIS.Core.Application.Service IRepository visitTaskRepository, IRepository readingQuestionCriterionTrialRepository, IRepository readingTableQuestionTrialRepository, + IRepository readingTableAnswerRowInfoRepository, IRepository readingQuestionTrialRepository, IRepository subjectVisitRepository, IRepository tumorAssessmentRepository, @@ -48,6 +50,7 @@ namespace IRaCIS.Core.Application.Service this._visitTaskRepository = visitTaskRepository; this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository; this._readingTableQuestionTrialRepository = readingTableQuestionTrialRepository; + this._readingTableAnswerRowInfoRepository = readingTableAnswerRowInfoRepository; this._readingQuestionTrialRepository = readingQuestionTrialRepository; this._subjectVisitRepository = subjectVisitRepository; this._tumorAssessmentRepository = tumorAssessmentRepository; @@ -303,6 +306,7 @@ namespace IRaCIS.Core.Application.Service var baseLineVisitId = await _subjectVisitRepository.Where(x => x.SubjectId == visitTask.SubjectId && x.IsBaseLine).Select(x => x.Id).FirstOrDefaultAsync(); + var rowInfoList = await _readingTableAnswerRowInfoRepository.Where(x => x.VisitTaskId == visitTaskId).ToListAsync(); var baseLinetaskId = await _visitTaskRepository.Where(x => x.SourceSubjectVisitId == baseLineVisitId && x.TaskState == TaskState.Effect && x.ArmEnum == visitTask.ArmEnum).Select(x => x.Id).FirstOrDefaultAsync(); var criterionId = await _readingQuestionCriterionTrialRepository.Where(x => x.TrialId == visitTask.TrialId && x.IsConfirm).Select(x => x.Id).FirstOrDefaultAsync(); @@ -326,22 +330,31 @@ namespace IRaCIS.Core.Application.Service QuestionMark = x.ReadingTableQuestionTrial.QuestionMark, TableQuestionId = x.TableQuestionId, QuestionId = x.QuestionId, - + QuestionType=x.ReadingQuestionTrial.QuestionType, RowIndex = x.RowIndex, + RowId=x.RowId, }).ToListAsync(); foreach (var item in questionInfos) { item.Answer = questionAnswers.Where(y => y.ReadingQuestionTrialId == item.QuestionId).Select(x => x.Answer).FirstOrDefault() ?? string.Empty; + + var thisItemRowInfo = rowInfoList.Where(x => x.QuestionId == item.QuestionId).ToList(); + var thisItemTableQuestions = tableQuestion.Where(x => x.QuestionId == item.QuestionId).ToList(); - item.TableRowInfoList = thisItemTableQuestions.GroupBy(x => new { x.RowIndex }) - .Select(g => new TableRowInfo() - { - RowIndex = g.Key.RowIndex, - TableQuestionList = g.ToList() - }).ToList(); + item.TableRowInfoList = thisItemRowInfo.Select(x => new TableRowInfo() + { + RowIndex = x.RowIndex, + MeasureData = x.MeasureData, + TableQuestionList = tableQuestion.Where(y => y.QuestionId == item.QuestionId && y.RowId == x.Id).ToList(), + + }).ToList(); + + + + } ReadingCalculateDto readingData = new ReadingCalculateDto() diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingCriterionVerify.cs b/IRaCIS.Core.Application/Service/Reading/ReadingCriterionVerify.cs new file mode 100644 index 000000000..18b79a0b7 --- /dev/null +++ b/IRaCIS.Core.Application/Service/Reading/ReadingCriterionVerify.cs @@ -0,0 +1,77 @@ +using IRaCIS.Core.Domain.Models; +using Microsoft.AspNetCore.Mvc; +using IRaCIS.Core.Application.Interfaces; +using IRaCIS.Core.Application.ViewModel; +using Panda.DynamicWebApi.Attributes; +using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infra.EFCore.Common; +using Microsoft.Extensions.Caching.Memory; +using IRaCIS.Core.Application.Service.Reading.Dto; +using IRaCIS.Core.Infrastructure; + +namespace IRaCIS.Core.Application.Service +{ + /// + /// 阅片验证 + /// + [NonDynamicWebApi] + public partial class ReadingCalculateService : BaseService, IReadingCalculateService + { + + /// + /// 标准验证 + /// + /// + public async Task CriterionVerify(Guid visitTaskId) + { + ReadingCalculateDto readingData = await GetReadingCalculateDto(visitTaskId); + } + + + /// + /// RECIST 1.1验证 + /// + /// + /// + public async Task RECIST1Point1Verify(ReadingCalculateDto inDto) + { + var tableAnswerList = inDto.QuestionInfo.SelectMany(x => x.TableRowInfoList).SelectMany(x=>x.TableQuestionList).ToList(); + + List errorList = new List(); + + // 判断是否为基线 + if (inDto.IsBaseLine) + { + // 不能有状态为 无法评估 消失 太小 显著增大 疑似的病灶 + List targetStates = new List() { + TargetState.TooSmall.GetEnumInt(), + TargetState.Loss.GetEnumInt(), + TargetState.UnableEvaluate.GetEnumInt(), + }; + + if (tableAnswerList.Any(x => x.QuestionMark == QuestionMark.State && targetStates.Contains(x.Answer))) + { + errorList.Add("基线不能有状态为 无法评估 消失 太小 显著增大 疑似的病灶!"); + + } + + if (inDto.QuestionInfo.Where(x => x.LesionType == LesionType.NewLesions).SelectMany(x => x.TableRowInfoList).Count() > 0) + { + errorList.Add($"基线不能有新病灶!"); + } + + } + else + { + + } + + if (errorList.Count > 0) + { + throw new BusinessValidationFailedException(string.Join(',',errorList)); + } + } + + + } +} diff --git a/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs b/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs index f2254ecc9..818d9bcd5 100644 --- a/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs +++ b/IRaCIS.Core.Application/Service/Reading/ReadingImageTaskService.cs @@ -238,7 +238,7 @@ namespace IRaCIS.Application.Services { var visitTaskInfo = await _visitTaskRepository.Where(x => x.Id == indto.VisitTaskId).FirstNotNullAsync(); GetReadingToolOutDto result = new GetReadingToolOutDto(); - result.ReadingTool = await _trialRepository.Where(x => x.Id == visitTaskInfo.TrialId).Select(x => x.ReadingTool).FirstNotNullAsync(); + result.ReadingTool = await _trialRepository.Where(x => x.Id == visitTaskInfo.TrialId).Select(x => x.ReadingTool).FirstOrDefaultAsync(); return result; } diff --git a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs index c4e81a7ab..6a1903b79 100644 --- a/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs +++ b/IRaCIS.Core.Domain.Share/Reading/ReadEnum.cs @@ -276,7 +276,7 @@ namespace IRaCIS.Core.Domain.Share /// - /// 非把病灶状态 + /// 非靶病灶状态 /// public enum NoTargetState {