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