using DocumentFormat.OpenXml.Office2019.Excel.ThreadedComments;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.Service.ImageAndDoc;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Application.Service.ReadingCalculate.Interface;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore.Common;
using IRaCIS.Core.Infrastructure;
using MassTransit;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NPOI.POIFS.Properties;
using NPOI.SS.Formula.Functions;
using Panda.DynamicWebApi.Attributes;
using System.Reactive.Concurrency;
using ZiggyCreatures.Caching.Fusion;
using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Domain._DomainEvent;
using Microsoft.Extensions.Logging;
namespace IRaCIS.Core.Application.Service
{
///
/// IR影像阅片
///
[ApiExplorerSettings(GroupName = "Reading")]
public partial class ReadingImageTaskService(
IRepository _noneDicomStudyRepository,
IRepository _visitTaskRepository,
IRepository _trialRepository,
IMessageScheduler _scheduler,
IRepository _readingTableQuestionAnswerRepository,
IRepository _readingOncologyTaskInfoRepository,
IVisitTaskHelpeService _visitTaskHelpeService,
IVisitTaskService _visitTaskService,
IReadingClinicalDataService _readingClinicalDataService,
IReadingCalculateService _readingCalculateService,
IRepository _subjectVisitRepository,
IRepository _subjectRepository,
IOptionsMonitor _verifyConfig,
IRepository _readingGlobalTaskInfoRepository,
IRepository _readingCriterionPageRepository,
IRepository _readingTaskRelationRepository,
IRepository _readingJudgeInfoRepository,
IRepository _readModuleRepository,
IRepository _dicomInstanceRepository,
IRepository _organInfoRepository,
ILuganoCalculateService _luganoCalculateService,
IRepository _readingCustomTagRepository,
IRepository _readingTaskQuestionMarkRepository,
IRepository _readingTrialCriterionDictionaryRepository,
IRepository _readingTableAnswerRowInfoRepository,
IRepository _readingTableQuestionSystemRepository,
IRepository _readingTableQuestionTrialRepository,
IRepository _readingTaskQuestionAnswerRepository,
IRepository _readingQuestionCriterionTrialRepository,
IRepository _readingQuestionSystem,
IRepository _noneDicomStudyFileSystem,
IGeneralCalculateService _generalCalculateService,
IRepository _readingQuestionTrialRepository,
IRepository _taskStudyRepository,
IDownloadAndUploadService _downloadAndUploadService,
IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IReadingImageTaskService
{
///
/// 获取阅片报告数据和图像
///
///
///
[HttpPost]
public async Task> GetReadingReportAndImage(GetReadingReportAndImageInDto inDto)
{
var taskList=new List { };
if (inDto.VisitTaskIdList.Count != 0)
{
if (await _visitTaskRepository.AnyAsync(x => inDto.VisitTaskIdList.Contains(x.Id) && (x.TaskState != TaskState.Effect || x.ReadingTaskState != ReadingTaskState.HaveSigned)))
{
throw new BusinessValidationFailedException(_localizer["ReadingImage_ReportDataInvalid"]);
}
taskList=await _visitTaskRepository.Where(x => inDto.VisitTaskIdList.Contains(x.Id)&&x.ReadingCategory==ReadingCategory.Visit).Include(x=>x.LesionList).Include(x=>x.Subject).Include(x=>x.SourceSubjectVisit).ToListAsync();
}
else
{
taskList = await _visitTaskRepository.Where(x => x.TrialReadingCriterionId==inDto.TrialCriterionId && x.ReadingCategory == ReadingCategory.Visit && x.TaskState== TaskState.Effect && x.ReadingTaskState == ReadingTaskState.HaveSigned && x.ReadingCategory == ReadingCategory.Visit)
.Include(x => x.LesionList)
.Include(x => x.Subject)
.Include(x => x.SourceSubjectVisit)
.ToListAsync();
}
List< ReadingReportAndImage > result = new List() { };
foreach (var item in taskList)
{
ReadingReportAndImage data = new ReadingReportAndImage()
{
SubjectCode = item.Subject != null ? item.Subject.Code : string.Empty,
VisitName = item.SourceSubjectVisit != null ? item.SourceSubjectVisit.VisitName : string.Empty,
ImageUrlList = item.LesionList != null ? item.LesionList.Where(x => x.PicturePath != string.Empty).Select(x => x.PicturePath).ToList() : new List() { },
ReportUrlList = new List()
{
},
};
if (item.ReportExportUrl != string.Empty)
{
data.ReportUrlList.Add(item.ReportExportUrl);
}
else
{
data.ReportUrlList.Add(await _readingCalculateService.GetVisitReadReportUrl(new CaGetVisitReadReportUrl()
{
VisitTaskId = item.Id,
}));
}
if (item.TumorEvaluationUrl != string.Empty)
{
data.ReportUrlList.Add(item.TumorEvaluationUrl);
}
else
{
data.ReportUrlList.Add(await _readingCalculateService.GetTumorEvaluationReportUrl(new CaGetVisitReadReportUrl()
{
VisitTaskId = item.Id,
}));
}
result.Add(data);
}
return result;
}
///
/// 获取TNMValue
///
///
///
[HttpPost]
public async Task GetTNMValue(TNMValueDto inDto)
{
var result = await _visitTaskRepository.Where(x => x.Id == inDto.VisitTaskId).Select(x => new TNMValueDto()
{
VisitTaskId = inDto.VisitTaskId,
TNMValue = x.TNMValue
}).FirstOrDefaultAsync();
return result;
}
///
/// 设置tTNMValue
///
///
///
[HttpPost]
public async Task SetTNMValue(TNMValueDto inDto)
{
await this.VerifyTaskIsSign(inDto.VisitTaskId);
await _visitTaskRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.VisitTaskId, x => new VisitTask()
{
TNMValue = inDto.TNMValue
}, true);
return inDto;
}
///
/// 下载阅片报告
///
///
///
public async Task DownLoadReadReport(DownLoadReadReportInDto inDto)
{
return await _readingCalculateService.DownLoadReadReport(inDto);
}
///
/// 获取阅片报告
///
///
///
[HttpPost]
public async Task GetVisitReadReportUrl(GenerateReadingReportInDto inDto)
{
return await _readingCalculateService.GetVisitReadReportUrl(new CaGetVisitReadReportUrl()
{
VisitTaskId = inDto.VisitTaskId,
});
}
///
/// 下载瘤评估
///
///
///
[HttpPost]
public async Task DownTumorEvaluation(DownLoadReadReportInDto inDto)
{
return await _readingCalculateService.DownLoadTumorEvaluation(inDto);
}
///
/// 获取肿瘤评估
///
///
///
[HttpPost]
public async Task GetTumorEvaluationUrl(GenerateReadingReportInDto inDto)
{
return await _readingCalculateService.GetTumorEvaluationReportUrl(new CaGetVisitReadReportUrl()
{
VisitTaskId = inDto.VisitTaskId,
});
}
#region 计算
///
/// 获取阅片的计算数据
///
///
///
[HttpPost]
public async Task