using IRaCIS.Application.Interfaces; using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Application.Filter; using Microsoft.AspNetCore.Mvc; using IRaCIS.Core.Application.Service.WorkLoad.DTO; using Microsoft.AspNetCore.Authorization; using IRaCIS.Core.Application.Auth; using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Domain.Share.Reading; using MassTransit; using System.ComponentModel.DataAnnotations; using System.Reflection; using IRaCIS.Core.Infra.EFCore.Common; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Service.Inspection.DTO; using Panda.DynamicWebApi.Attributes; namespace IRaCIS.Application.Services { /// /// 阅片临床数据 /// [ApiExplorerSettings(GroupName = "Reading")] public class ReadingClinicalDataService : BaseService, IReadingClinicalDataService { private readonly IRepository _readingClinicalDataRepository; private readonly IRepository _clinicalDataTrialSetRepository; private readonly IRepository _readingClinicalDataViewRepository; private readonly IRepository _previousPDFRepository; private readonly IRepository _readingClinicalDataPDFRepository; public ReadingClinicalDataService(IRepository readingClinicalDataRepository, IRepository clinicalDataTrialSetRepository, IRepository readingClinicalDataViewRepository, IRepository previousPDFRepository, IRepository readingClinicalDataPDFRepository ) { this._readingClinicalDataRepository = readingClinicalDataRepository; this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository; this._readingClinicalDataViewRepository = readingClinicalDataViewRepository; this._previousPDFRepository = previousPDFRepository; this._readingClinicalDataPDFRepository = readingClinicalDataPDFRepository; } /// /// 新增或者修改 /// /// /// [HttpPost] public async Task AddOrUpdateReadingClinicalData(AddOrUpdateReadingClinicalDataDto indto) { var existsQuery = _readingClinicalDataRepository .WhereIf(indto.Id != null,x=>x.Id!=indto.Id) .Where(x => x.ClinicalDataTrialSetId == indto.ClinicalDataTrialSetId&&x.ReadingId==indto.ReadingId); if (await existsQuery.AnyAsync()) { return ResponseOutput.NotOk("存在同类型的临床数据"); } var clinicalDataTrialSet = (await _clinicalDataTrialSetRepository.Where(x => x.Id == indto.ClinicalDataTrialSetId).FirstOrDefaultAsync()).IfNullThrowException(); if (indto.Id == null) { var entity = _mapper.Map(indto); entity.ReadingClinicalDataPDFList = indto.AddFileList.Select(x => new ReadingClinicalDataPDF() { TrialId = entity.TrialId, SubjectId= indto.SubjectId, FileName=x.FileName, Path=x.Path, ClinicalDataTrialSetId=indto.ClinicalDataTrialSetId, IsVisit= indto.IsVisit, ClinicalDataLevel= clinicalDataTrialSet.ClinicalDataLevel, ReadingId=indto.ReadingId }).ToList(); await _readingClinicalDataRepository.AddAsync(entity, true); var success = await _readingClinicalDataRepository.SaveChangesAsync(); return ResponseOutput.Ok(entity.Id); } else { var entity = (await _readingClinicalDataRepository.Where(t => t.Id == indto.Id, true).FirstOrDefaultAsync()).IfNullThrowException(); _mapper.Map(indto, entity); await _readingClinicalDataPDFRepository.DeleteFromQueryAsync(x => indto.DeleteFileIds.Contains(x.Id)); await _readingClinicalDataRepository.SaveChangesAsync(); var addFileList = indto.AddFileList.Select(x => new ReadingClinicalDataPDF() { TrialId = entity.TrialId, SubjectId = indto.SubjectId, FileName = x.FileName, Path = x.Path, ClinicalDataTrialSetId = indto.ClinicalDataTrialSetId, IsVisit = indto.IsVisit, ClinicalDataLevel = clinicalDataTrialSet.ClinicalDataLevel, ReadingId = indto.ReadingId, ReadingClinicalDataId= entity.Id, }).ToList(); await _readingClinicalDataPDFRepository.AddRangeAsync(addFileList); var success = await _readingClinicalDataRepository.SaveChangesAsync(); return ResponseOutput.Ok(entity.Id); } } /// /// 删除 /// /// /// [HttpDelete("{id:guid}")] public async Task DeleteReadingClinicalData(Guid id) { await _readingClinicalDataRepository.DeleteFromQueryAsync(x => x.Id == id, true); return ResponseOutput.Result(true); } /// /// 获取下拉菜单 /// /// /// [HttpPost] public async Task> GetTrialClinicalDataSelect(GetTrialClinicalDataSelectIndto inDto) { var usedIdsQuery = _readingClinicalDataRepository.Where(x => x.ReadingId == inDto.ReadingId && x.Id != inDto.ReadingClinicalDataId).Select(x => x.ClinicalDataTrialSetId); List clinicalList = await _clinicalDataTrialSetRepository.Where(x=>x.TrialId==inDto.TrialId&&x.IsConfirm&&x.ClinicalDataSetName!= "既往局部治疗史") .Where(x=> !usedIdsQuery.Contains(x.Id)) .WhereIf(inDto.IsVisit,x=>x.ClinicalDataLevel == ClinicalLevel.Subject||x.ClinicalDataLevel== ClinicalLevel.SubjectVisit) .WhereIf(!inDto.IsVisit, x => x.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataLevel == ClinicalLevel.Read) .Select(x => new GetTrialClinicalDataSelectOutDto() { ClinicalDataLevel = x.ClinicalDataLevel, ClinicalDataSetName = x.ClinicalDataSetName, ClinicalUploadType = x.ClinicalUploadType, ClinicalDataLevelName = x.ClinicalDataLevel.GetDisplayName(), ClinicalUploadTypeName = x.ClinicalUploadType.GetDisplayName(), Id = x.Id }).ToListAsync() ; return clinicalList; } /// /// 影像阅片临床数据签名 /// // [HttpPost] [NonDynamicMethod] public async Task ReadClinicalDataSign(ReadingClinicalDataSignIndto inDto) { await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.ReadingClinicalDataId, x => new ReadingClinicalData() { IsSign = true }); var result =await _readingClinicalDataRepository.SaveChangesAsync(); return ResponseOutput.Result(result); } /// /// 获取阅片临床数据列表 /// /// /// [HttpPost] public async Task> GetReadingClinicalDataList(GetReadingClinicalDataListIndto inDto) { var result = await _readingClinicalDataViewRepository.Where(x=>x.SubjectId==inDto.SubjectId) .Where(x=>x.ReadingId==inDto.ReadingId||x.ReadingId==null).ProjectTo(_mapper.ConfigurationProvider).ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? nameof(GetReadingClinicalDataListOutDto.ClinicalDataSetName) : inDto.SortField, inDto.Asc); foreach (var item in result.CurrentPageData) { item.ClinicalDataLevelName = item.ClinicalDataLevel.GetDisplayName(); item.ClinicalUploadTypeName = item.ClinicalUploadType.GetDisplayName(); if (item.IsCRCUpload) { item.FileList = await _previousPDFRepository.Where(x => x.SubjectId == inDto.SubjectId).Select(y => new GetFileDto() { Id = y.Id, FileName = y.FileName, Path = y.Path }).ToListAsync(); } else { if (item.ClinicalDataLevel != ClinicalLevel.Subject) { item.FileList = await _readingClinicalDataPDFRepository.Where(y => y.ReadingClinicalDataId == item.Id).Select(y => new GetFileDto() { Id = y.Id, FileName = y.FileName, Path = y.Path }).ToListAsync(); } else { item.FileList = await _readingClinicalDataPDFRepository.Where(y => y.SubjectId == item.SubjectId).Select(y => new GetFileDto() { Id = y.Id, FileName = y.FileName, Path = y.Path }).ToListAsync(); } } } return result; } /// /// 获取单个阅片临床数据的所有文件 /// /// /// [HttpPost] public async Task> GetReadingClinicalDataPDFList(GetReadingClinicalDataPDFListIndto inDto) { var result = await _readingClinicalDataPDFRepository.Where(x => x.ReadingClinicalDataId == inDto.ReadingClinicalDataId).ProjectTo(_mapper.ConfigurationProvider) .ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? nameof(GetReadingClinicalDataPDFListOutDto.FileName) : inDto.SortField, inDto.Asc); return result; } /// /// 删除PDF单个文件 /// /// /// [HttpDelete("{id:guid}")] public async Task DeleteReadingClinicalDataPDF(Guid id) { await _readingClinicalDataPDFRepository.DeleteFromQueryAsync(x => x.Id == id, true); return ResponseOutput.Result(true); } } }