using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Infrastructure; using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Application.ViewModel; namespace IRaCIS.Core.Application.Service.ReadingCalculate { [ApiExplorerSettings(GroupName = "Image")] public class ReadingCalculateService: BaseService, IReadingCalculateService { /// /// 标准和服务对应 /// Dictionary CalculateServiceDic = new Dictionary() { {CriterionType.RECIST1Pointt1,typeof(RECIST1Point1CalculateService) }, //RECIST1.1 {CriterionType.PCWG3,typeof(PCWG3CalculateService) }, {CriterionType.SelfDefine,typeof(SelfDefineCalculateService) } }; private readonly IEnumerable _criterionServices; private readonly IRepository _visitTaskRepository; private readonly IRepository _readingQuestionCriterionTrialRepository; private ICriterionCalculateService _useCriterion; public ReadingCalculateService(IEnumerable criterionServices, IRepository visitTaskRepository, IRepository readingQuestionCriterionTrialRepository ) { _criterionServices = criterionServices; this._visitTaskRepository = visitTaskRepository; this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository; } /// /// 获取Service /// /// /// public async Task GetService(Guid visitTaskId) { if (_useCriterion == null) { var criterionId = await _visitTaskRepository.Where(x => x.Id == visitTaskId).Select(x => x.TrialReadingCriterionId).FirstNotNullAsync(); var criterionType = await _readingQuestionCriterionTrialRepository.Where(x => x.Id == criterionId).Select(x => x.CriterionType).FirstOrDefaultAsync(); if (criterionType == null) { throw new BusinessValidationFailedException(_localizer["ReadingCalculate_NoDeveloped"]); } try { CriterionType thisCriterionType = criterionType; Type thisServiceType = CalculateServiceDic[thisCriterionType]; _useCriterion = _criterionServices.FirstOrDefault(x => x.GetType().Name == thisServiceType.Name + "Proxy"); } catch (Exception) { _useCriterion = null; } return _useCriterion; } else { return _useCriterion; } } /// /// 自动计算 并修改值 /// /// /// public async Task CalculateTask(CalculateTaskInDto inDto) { var service = await this.GetService(inDto.VisitTaskId); if (service != null) { await service.CalculateTask(inDto); } } /// /// 验证检查批次提交 /// /// /// public async Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto) { var service = await this.GetService(inDto.VisitTaskId); if (service != null) { await service.VerifyVisitTaskQuestions(inDto); } } /// /// 将上一次的检查批次病灶添加到这一次 /// /// /// public async Task AddTaskLesionAnswerFromLastTask(AddTaskLesionAnswerFromLastTaskInDto inDto) { var service = await this.GetService(inDto.VisitTaskId); var visitTaskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); if (service != null&& visitTaskInfo.SourceSubjectVisitId!=null) { var readingTaskState = visitTaskInfo.ReadingTaskState; var result = new AddTaskLesionAnswerFromLastTaskOutDto(); if (readingTaskState == ReadingTaskState.WaitReading) { result= await service.AddTaskLesionAnswerFromLastTask(inDto); await service.CalculateTask(new CalculateTaskInDto() { IsChangeOtherTask = false, VisitTaskId = inDto.VisitTaskId, }); await _visitTaskRepository.BatchUpdateNoTrackingAsync(x=>x.Id==inDto.VisitTaskId, x => new VisitTask() { ReadingTaskState = ReadingTaskState.Reading, }); } return result; } else { return new AddTaskLesionAnswerFromLastTaskOutDto(); } } /// /// 获取报告验证的信息(这里每个标准可能不一样 返回用object) /// /// /// public async Task GetReportVerify(GetReportVerifyInDto inDto) { var service = await this.GetService(inDto.VisitTaskId); if (service != null) { return await service.GetReportVerify(inDto); } else { return new { }; } } /// /// 获取阅片报告 /// /// /// public async Task GetReadingReportEvaluation(GetReadingReportEvaluationInDto inDto) { var service = await this.GetService(inDto.VisitTaskId); if (service != null) { var taskInfo = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).FirstNotNullAsync(); if (taskInfo.ReadingTaskState != ReadingTaskState.HaveSigned&&inDto.IsCalculate) { await service.CalculateTask(new CalculateTaskInDto() { VisitTaskId = inDto.VisitTaskId }); } return await service.GetReadingReportEvaluation(inDto); } else { return new GetReadingReportEvaluationOutDto(); } } /// /// 删除病灶获取起始病灶序号 /// /// public async Task GetDeleteLesionStatrIndex(DeleteReadingRowAnswerInDto inDto) { var service = await this.GetService(inDto.VisitTaskId); if (service != null) { return await service.GetDeleteLesionStatrIndex(inDto); } else { return 1; } } } }