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 { /// <summary> /// 标准和服务对应 /// </summary> Dictionary<CriterionType, Type> CalculateServiceDic = new Dictionary<CriterionType, Type>() { {CriterionType.RECIST1Pointt1,typeof(RECIST1Point1CalculateService) }, //RECIST1.1 {CriterionType.PCWG3,typeof(PCWG3CalculateService) } }; private readonly IEnumerable<ICriterionCalculateService> _criterionServices; private readonly IRepository<VisitTask> _visitTaskRepository; private readonly IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository; private ICriterionCalculateService _useCriterion; public ReadingCalculateService(IEnumerable<ICriterionCalculateService> criterionServices, IRepository<VisitTask> visitTaskRepository, IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrialRepository ) { _criterionServices = criterionServices; this._visitTaskRepository = visitTaskRepository; this._readingQuestionCriterionTrialRepository = readingQuestionCriterionTrialRepository; } /// <summary> /// 获取Service /// </summary> /// <param name="visitTaskId"></param> /// <returns></returns> public async Task<ICriterionCalculateService> 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($"当前标准计算未开发好"); } try { CriterionType thisCriterionType = criterionType.Value; Type thisServiceType = CalculateServiceDic[thisCriterionType]; _useCriterion = _criterionServices.FirstOrDefault(x => x.GetType().Name == thisServiceType.Name + "Proxy"); if (criterionType == null) { throw new BusinessValidationFailedException($"当前标准计算未开发好"); } } catch (Exception) { throw new BusinessValidationFailedException($"当前标准计算未开发好"); } return _useCriterion; } else { return _useCriterion; } } /// <summary> /// 自动计算 并修改值 /// </summary> /// <param name="inDto"></param> /// <returns></returns> public async Task CalculateTask(CalculateTaskInDto inDto) { var service = await this.GetService(inDto.VisitTaskId); await service.CalculateTask(inDto); } /// <summary> /// 验证访视提交 /// </summary> /// <param name="inDto"></param> /// <returns></returns> public async Task VerifyVisitTaskQuestions(VerifyVisitTaskQuestionsInDto inDto) { var service = await this.GetService(inDto.VisitTaskId); await service.VerifyVisitTaskQuestions(inDto); } /// <summary> /// 将上一次的访视病灶添加到这一次 /// </summary> /// <param name="inDto"></param> /// <returns></returns> public async Task<AddTaskLesionAnswerFromLastTaskOutDto> AddTaskLesionAnswerFromLastTask(AddTaskLesionAnswerFromLastTaskInDto inDto) { var service = await this.GetService(inDto.VisitTaskId); return await service.AddTaskLesionAnswerFromLastTask(inDto); } /// <summary> /// 获取报告验证的信息(这里每个标准可能不一样 返回用object) /// </summary> /// <param name="inDto"></param> /// <returns></returns> public async Task<object> GetReportVerify(GetReportVerifyInDto inDto) { var service = await this.GetService(inDto.VisitTaskId); return await service.GetReportVerify(inDto); } } }