代码简单整理
This commit is contained in:
@@ -0,0 +1,298 @@
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using MassTransit;
|
||||
|
||||
namespace IRaCIS.Application.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 临床数据配置
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "Reading")]
|
||||
public class ClinicalDataSetService : BaseService
|
||||
{
|
||||
|
||||
public IRepository<SubjectVisit> _subjectVisitRepository;
|
||||
|
||||
private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository;
|
||||
private readonly IRepository<ClinicalDataSystemSet> _clinicalDataSystemSetRepository;
|
||||
private readonly IRepository<PreviousPDF> _previousPDFRepository;
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
private readonly IRepository<SystemClinicalDataCriterion> _systemClinicalDataCriterionRepository;
|
||||
private readonly IRepository<TrialClinicalDataCriterion> _trialClinicalDataCriterionRepository;
|
||||
|
||||
public ClinicalDataSetService(IRepository<SubjectVisit> subjectVisitRepository,
|
||||
|
||||
IRepository<ClinicalDataTrialSet> ClinicalDataTrialSetRepository,
|
||||
IRepository<ClinicalDataSystemSet> ClinicalDataSystemSetRepository,
|
||||
IRepository<PreviousPDF> previousPDFRepository,
|
||||
IRepository<Trial> trialRepository,
|
||||
|
||||
IRepository<SystemClinicalDataCriterion> systemClinicalDataCriterionRepository,
|
||||
IRepository<TrialClinicalDataCriterion> trialClinicalDataCriterionRepository
|
||||
)
|
||||
{
|
||||
_systemClinicalDataCriterionRepository = systemClinicalDataCriterionRepository;
|
||||
_trialClinicalDataCriterionRepository = trialClinicalDataCriterionRepository;
|
||||
_subjectVisitRepository = subjectVisitRepository;
|
||||
|
||||
_clinicalDataTrialSetRepository = ClinicalDataTrialSetRepository;
|
||||
_clinicalDataSystemSetRepository = ClinicalDataSystemSetRepository;
|
||||
this._previousPDFRepository = previousPDFRepository;
|
||||
this._trialRepository = trialRepository;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region 系统
|
||||
/// <summary>
|
||||
/// 新增或者修改(系统)
|
||||
/// </summary>
|
||||
/// <param name="indto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddOrUpdateClinicalDataSystemSet(ClinicalDataSystemSetAddOrEdit indto)
|
||||
{
|
||||
|
||||
var existsQuery = _clinicalDataSystemSetRepository
|
||||
.WhereIf(indto.Id != null, x => x.Id != indto.Id)
|
||||
.Where(x => x.ClinicalDataSetName == indto.ClinicalDataSetName);
|
||||
|
||||
if (await existsQuery.AnyAsync())
|
||||
{
|
||||
return ResponseOutput.NotOk("存在同类型的临床数据,操作失败");
|
||||
}
|
||||
|
||||
var entity = await _clinicalDataSystemSetRepository.InsertOrUpdateAsync(indto);
|
||||
|
||||
entity.SystemClinicalDataCriterionList = indto.SystemCriterionIdList.Select(t => new SystemClinicalDataCriterion()
|
||||
{
|
||||
SystemClinicalDataSetId = entity.Id,
|
||||
SystemReadingCriterionId = t
|
||||
}).ToList();
|
||||
|
||||
if (indto.Id != null)
|
||||
{
|
||||
await _systemClinicalDataCriterionRepository.BatchDeleteNoTrackingAsync(t => t.SystemClinicalDataSetId == entity.Id);
|
||||
|
||||
await _systemClinicalDataCriterionRepository.AddRangeAsync(entity.SystemClinicalDataCriterionList);
|
||||
}
|
||||
|
||||
await _clinicalDataSystemSetRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取系统临床数据(系统)
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<ClinicalDataSystemSetView>> GetSystemClinicalDataSystemSetList(GetTrialClinicalDataSystemIndto inDto)
|
||||
{
|
||||
return await _clinicalDataSystemSetRepository.AsQueryable()
|
||||
.WhereIf(inDto.ClinicalDataLevel != null, x => x.ClinicalDataLevel == inDto.ClinicalDataLevel)
|
||||
.WhereIf(inDto.ClinicalUploadType != null, x => x.ClinicalUploadType == inDto.ClinicalUploadType)
|
||||
.WhereIf(inDto.ClinicalDataSetName != String.Empty, x => x.ClinicalDataSetName.Contains(inDto.ClinicalDataSetName))
|
||||
|
||||
.ProjectTo<ClinicalDataSystemSetView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除(系统)
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpDelete("{id:guid}")]
|
||||
public async Task<IResponseOutput> DeleteClinicalSystemSetData(Guid id)
|
||||
{
|
||||
await _clinicalDataSystemSetRepository.DeleteFromQueryAsync(x => x.Id == id, true);
|
||||
return ResponseOutput.Result(true);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 项目
|
||||
/// <summary>
|
||||
/// 新增或者修改(项目)
|
||||
/// </summary>
|
||||
/// <param name="indto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddOrUpdateClinicalDataTrialSet(ClinicalDataTrialSetAddOrEdit indto)
|
||||
{
|
||||
var existsQuery = _clinicalDataTrialSetRepository
|
||||
.WhereIf(indto.Id != null, x => x.Id != indto.Id)
|
||||
.Where(x => x.ClinicalDataSetName == indto.ClinicalDataSetName && x.TrialId == indto.TrialId);
|
||||
|
||||
if (await existsQuery.AnyAsync())
|
||||
{
|
||||
return ResponseOutput.NotOk("存在同类型的临床数据,操作失败");
|
||||
}
|
||||
|
||||
var entity = await _clinicalDataTrialSetRepository.InsertOrUpdateAsync(indto, true);
|
||||
|
||||
entity.TrialClinicalDataCriterionList = indto.TrialCriterionIdList.Select(t => new TrialClinicalDataCriterion()
|
||||
{
|
||||
TrialClinicalDataSetId = entity.Id,
|
||||
TrialReadingCriterionId = t
|
||||
}).ToList();
|
||||
|
||||
if (indto.Id != null)
|
||||
{
|
||||
await _trialClinicalDataCriterionRepository.BatchDeleteNoTrackingAsync(t => t.TrialClinicalDataSetId == entity.Id);
|
||||
|
||||
await _trialClinicalDataCriterionRepository.AddRangeAsync(entity.TrialClinicalDataCriterionList);
|
||||
}
|
||||
await _clinicalDataTrialSetRepository.SaveChangesAsync();
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取项目的临床数据
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
[UnitOfWork]
|
||||
public async Task<List<ClinicalDataTrialSetView>> GetTrialClinicalDataTrialSetList(GetTrialClinicalDataTrialIndto inDto)
|
||||
{
|
||||
await this.AddTrialClinicalDataTrialSet(inDto.TrialId);
|
||||
var trialClinicalDataList = await _clinicalDataTrialSetRepository.AsQueryable()
|
||||
.Where(x => x.TrialId == inDto.TrialId)
|
||||
.WhereIf(inDto.ClinicalDataLevel != null, x => x.ClinicalDataLevel == inDto.ClinicalDataLevel)
|
||||
.WhereIf(inDto.ClinicalUploadType != null, x => x.ClinicalUploadType == inDto.ClinicalUploadType)
|
||||
.WhereIf(inDto.ClinicalDataSetName != String.Empty, x => x.ClinicalDataSetName.Contains(inDto.ClinicalDataSetName))
|
||||
.ProjectTo<ClinicalDataTrialSetView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
return trialClinicalDataList;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 删除(项目)
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpDelete("{id:guid}")]
|
||||
public async Task<IResponseOutput> DeleteClinicalTrialSetData(Guid id)
|
||||
{
|
||||
await _clinicalDataTrialSetRepository.DeleteFromQueryAsync(x => x.Id == id, true);
|
||||
return ResponseOutput.Result(true);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 系统和项目标准下拉 界面上配置和临床数据关联
|
||||
|
||||
[HttpPost]
|
||||
public async Task<List<SystemCriterionSelectDto>> GetSystemCriterionSelectList(SystemCriterionSelectQuery inQuery)
|
||||
{
|
||||
return await _repository.Where<ReadingQuestionCriterionSystem>()
|
||||
.WhereIf(!string.IsNullOrEmpty(inQuery.CriterionName), t => t.CriterionName.Contains(inQuery.CriterionName))
|
||||
.WhereIf(inQuery.IsEnable != null, t => t.IsEnable == inQuery.IsEnable)
|
||||
.WhereIf(inQuery.IsCompleteConfig != null, t => t.IsCompleteConfig == inQuery.IsCompleteConfig)
|
||||
.Select(t => new SystemCriterionSelectDto()
|
||||
{
|
||||
Id = t.Id,
|
||||
CriterionName = t.CriterionName,
|
||||
IsCompleteConfig = t.IsCompleteConfig,
|
||||
IsEnable = t.IsEnable
|
||||
}).ToListAsync();
|
||||
}
|
||||
|
||||
|
||||
[HttpPost]
|
||||
public async Task<List<TrialCriterionSelectDto>> GetTrialCriterionSelectList(TrialCriterionSelectQuery inQuery)
|
||||
{
|
||||
return await _repository.Where<ReadingQuestionCriterionTrial>(t => t.TrialId == inQuery.TrialId)
|
||||
.WhereIf(!string.IsNullOrEmpty(inQuery.CriterionName), t => t.CriterionName.Contains(inQuery.CriterionName))
|
||||
.WhereIf(inQuery.IsEnable != null, t => t.IsEnable == inQuery.IsEnable)
|
||||
.WhereIf(inQuery.IsCompleteConfig != null, t => t.IsCompleteConfig == inQuery.IsCompleteConfig)
|
||||
.Select(t => new TrialCriterionSelectDto()
|
||||
{
|
||||
Id = t.Id,
|
||||
CriterionName = t.CriterionName,
|
||||
IsCompleteConfig = t.IsCompleteConfig,
|
||||
IsEnable = t.IsEnable
|
||||
}).ToListAsync();
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 将系统配置添加到项目配置
|
||||
|
||||
/// <summary>
|
||||
/// 将系统配置添加到项目配置
|
||||
/// </summary>
|
||||
/// <param name="trialId"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
private async Task AddTrialClinicalDataTrialSet(Guid trialId)
|
||||
{
|
||||
var syncClinicalDataTime = await _trialRepository.Where(x => x.Id == trialId).Select(x => x.SyncClinicalDataTime).FirstOrDefaultAsync();
|
||||
if (syncClinicalDataTime == null)
|
||||
{
|
||||
var systemClinicalDataList = await _clinicalDataSystemSetRepository.AsQueryable().ToListAsync();
|
||||
var systemIds = systemClinicalDataList.Select(x => x.Id).ToList();
|
||||
var trialSystemIds = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialId && x.SystemClinicalDataSetId != null).Select(x => x.SystemClinicalDataSetId.Value).ToListAsync();
|
||||
|
||||
var needAddids = systemIds.Except(trialSystemIds).ToList();
|
||||
var systemDataList = systemClinicalDataList.Where(x => needAddids.Contains(x.Id)).ToList();
|
||||
List<ClinicalDataTrialSet> dataSets = systemDataList.Select(x => new ClinicalDataTrialSet()
|
||||
{
|
||||
Id = NewId.NextGuid(),
|
||||
SystemClinicalDataSetId = x.Id,
|
||||
ClinicalDataSetName = x.ClinicalDataSetName,
|
||||
ClinicalDataLevel = x.ClinicalDataLevel,
|
||||
ClinicalUploadType = x.ClinicalUploadType,
|
||||
UploadRole = x.UploadRole,
|
||||
FileName = x.FileName,
|
||||
Path = x.Path,
|
||||
TrialId = trialId,
|
||||
|
||||
|
||||
}).ToList();
|
||||
|
||||
|
||||
dataSets.ForEach(x=>x.TrialClinicalDataCriterionList = systemClinicalDataList.Where(t=>t.Id==x.SystemClinicalDataSetId).Select(t => new TrialClinicalDataCriterion() { TrialReadingCriterionId =x.Id}).ToList());
|
||||
|
||||
await _clinicalDataTrialSetRepository.AddRangeAsync(dataSets);
|
||||
|
||||
//var needUpdateitemList = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == trialId && needUpdateIds.Contains(x.SystemClinicalDataSetId.Value)).ToListAsync();
|
||||
//foreach (var item in needUpdateitemList)
|
||||
//{
|
||||
// var systemData = systemClinicalDataList.FirstOrDefault(x => x.Id == item.SystemClinicalDataSetId);
|
||||
// await _clinicalDataTrialSetRepository.UpdatePartialNoQueryAsync(item.Id,x=>new ClinicalDataTrialSet() {
|
||||
|
||||
// ClinicalDataSetName = systemData.ClinicalDataSetName,
|
||||
// ClinicalDataLevel = systemData.ClinicalDataLevel,
|
||||
// ClinicalUploadType = systemData.ClinicalUploadType,
|
||||
// UploadRole = systemData.UploadRole,
|
||||
// FileName = systemData.FileName,
|
||||
// Path = systemData.Path,
|
||||
// });
|
||||
//}
|
||||
|
||||
await _trialRepository.BatchUpdateNoTrackingAsync(x => x.Id == trialId, x => new Trial()
|
||||
{
|
||||
SyncClinicalDataTime = DateTime.Now,
|
||||
});
|
||||
var result = await _clinicalDataTrialSetRepository.SaveChangesAsync();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,554 @@
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Infra.EFCore.Common;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Service.Inspection.DTO;
|
||||
using Panda.DynamicWebApi.Attributes;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
namespace IRaCIS.Application.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// 阅片临床数据
|
||||
/// </summary>
|
||||
[ApiExplorerSettings(GroupName = "Reading")]
|
||||
public class ReadingClinicalDataService : BaseService, IReadingClinicalDataService
|
||||
{
|
||||
private readonly IRepository<ReadingClinicalData> _readingClinicalDataRepository;
|
||||
private readonly IRepository<ClinicalDataTrialSet> _clinicalDataTrialSetRepository;
|
||||
private readonly IRepository<VisitTask> _visitTaskRepository;
|
||||
private readonly IRepository<PreviousPDF> _previousPDFRepository;
|
||||
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
|
||||
private readonly IRepository<PreviousHistory> _previousHistoryRepository;
|
||||
private readonly IRepository<PreviousOther> _previousOtherRepository;
|
||||
private readonly IRepository<PreviousSurgery> _previousSurgeryRepository;
|
||||
private readonly IServiceProvider iServiceProvider;
|
||||
private readonly IRepository<Subject> _subjectRepository;
|
||||
private readonly IRepository<ReadModule> _readModuleRepository;
|
||||
private readonly IRepository<ReadingClinicalDataPDF> _readingClinicalDataPDFRepository;
|
||||
|
||||
public ReadingClinicalDataService(IRepository<ReadingClinicalData> readingClinicalDataRepository,
|
||||
IRepository<ClinicalDataTrialSet> clinicalDataTrialSetRepository,
|
||||
IRepository<PreviousPDF> previousPDFRepository,
|
||||
IRepository<SubjectVisit> subjectVisitRepository,
|
||||
IRepository<PreviousHistory> previousHistoryRepository,
|
||||
IRepository<PreviousOther> previousOtherRepository,
|
||||
IRepository<PreviousSurgery> previousSurgeryRepository,
|
||||
IServiceProvider IServiceProvider,
|
||||
IRepository<Subject> subjectRepository,
|
||||
IRepository<ReadModule> readModuleRepository,
|
||||
IRepository<ReadingClinicalDataPDF> readingClinicalDataPDFRepository,
|
||||
IRepository<VisitTask> visitTaskRepository)
|
||||
{
|
||||
this._readingClinicalDataRepository = readingClinicalDataRepository;
|
||||
this._clinicalDataTrialSetRepository = clinicalDataTrialSetRepository;
|
||||
this._previousPDFRepository = previousPDFRepository;
|
||||
this._subjectVisitRepository = subjectVisitRepository;
|
||||
this._previousHistoryRepository = previousHistoryRepository;
|
||||
this._previousOtherRepository = previousOtherRepository;
|
||||
this._previousSurgeryRepository = previousSurgeryRepository;
|
||||
this.iServiceProvider = IServiceProvider;
|
||||
this._subjectRepository = subjectRepository;
|
||||
this._readModuleRepository = readModuleRepository;
|
||||
this._readingClinicalDataPDFRepository = readingClinicalDataPDFRepository;
|
||||
this._visitTaskRepository = visitTaskRepository;
|
||||
}
|
||||
|
||||
|
||||
#region 临床数据基本增删改
|
||||
|
||||
/// <summary>
|
||||
/// 新增或者修改
|
||||
/// </summary>
|
||||
/// <param name="indto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> 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<ReadingClinicalData>(indto);
|
||||
entity.ReadingClinicalDataPDFList = indto.AddFileList.Select(x => new ReadingClinicalDataPDF()
|
||||
{
|
||||
|
||||
FileName = x.FileName,
|
||||
Path = x.Path,
|
||||
|
||||
}).ToList();
|
||||
|
||||
entity.ReadingClinicalDataState = ReadingClinicalDataStatus.HaveUploaded;
|
||||
entity.IsBlind = null;
|
||||
entity.IsComplete = null;
|
||||
entity.FileCount = entity.ReadingClinicalDataPDFList.Count();
|
||||
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.BatchDeleteNoTrackingAsync(x => indto.DeleteFileIds.Contains(x.Id));
|
||||
|
||||
var addFileList = indto.AddFileList.Select(x => new ReadingClinicalDataPDF()
|
||||
{
|
||||
|
||||
FileName = x.FileName,
|
||||
Path = x.Path,
|
||||
|
||||
ReadingClinicalDataId = entity.Id,
|
||||
}).ToList();
|
||||
await _readingClinicalDataPDFRepository.AddRangeAsync(addFileList);
|
||||
|
||||
await _readingClinicalDataPDFRepository.SaveChangesAsync();
|
||||
|
||||
var fileCount = await _readingClinicalDataPDFRepository.Where(t => t.ReadingClinicalDataId == indto.Id).CountAsync();
|
||||
entity.ReadingClinicalDataState = ReadingClinicalDataStatus.HaveUploaded;
|
||||
entity.FileCount = fileCount;
|
||||
var success = await _readingClinicalDataRepository.SaveChangesAsync();
|
||||
return ResponseOutput.Ok(entity.Id);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 删除
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpDelete("{id:guid}")]
|
||||
public async Task<IResponseOutput> DeleteReadingClinicalData(Guid id)
|
||||
{
|
||||
|
||||
await _readingClinicalDataRepository.DeleteFromQueryAsync(x => x.Id == id, true);
|
||||
await _readingClinicalDataPDFRepository.DeleteFromQueryAsync(x => x.ReadingClinicalDataId == id, true);
|
||||
return ResponseOutput.Result(true);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 临床数据CRC 相关
|
||||
|
||||
/// <summary>
|
||||
/// 获取CRC上传的文件
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<GetCRCClinicalDataOutDto>> GetCRCClinicalData(GetCRCClinicalDataInDto inDto)
|
||||
{
|
||||
await this.AddCRCClinicalData(inDto);
|
||||
|
||||
List<GetCRCClinicalDataOutDto> cRCClinicalDataList = await _readingClinicalDataRepository.Where(x => x.ReadingId == inDto.SubjectVisitId)
|
||||
.Where(x => x.ClinicalDataTrialSet.TrialId == inDto.TrialId && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC && x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.ImageRead && x.ClinicalDataTrialSet.ClinicalDataLevel != ClinicalLevel.OncologyRead && x.ClinicalDataTrialSet.IsConfirm)
|
||||
.Select(x => new GetCRCClinicalDataOutDto()
|
||||
{
|
||||
Id = x.Id,
|
||||
ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName,
|
||||
ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType,
|
||||
ClinicalDataTrialSetId = x.ClinicalDataTrialSet.Id,
|
||||
FileName = x.ClinicalDataTrialSet.FileName,
|
||||
UploadRole = x.ClinicalDataTrialSet.UploadRole,
|
||||
Path = x.ClinicalDataTrialSet.Path,
|
||||
IsBlind = x.IsBlind,
|
||||
IsComplete = x.IsComplete
|
||||
}).ToListAsync();
|
||||
|
||||
List<GetReadingClinicalDataListOutDto> clinicalData = (await this.GetReadingClinicalDataList(new GetReadingClinicalDataListIndto()
|
||||
{
|
||||
SubjectId = inDto.SubjectId,
|
||||
ReadingId = inDto.SubjectVisitId,
|
||||
TrialId = inDto.TrialId,
|
||||
})).Item1;
|
||||
|
||||
var previousHistoryList = await _previousHistoryRepository.Where(x => x.SubjectVisitId == inDto.SubjectVisitId).ProjectTo<PreviousHistoryView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var previousOtherList = await _previousOtherRepository.Where(x => x.SubjectVisitId == inDto.SubjectVisitId).ProjectTo<PreviousOtherView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var previousSurgeryList = await _previousSurgeryRepository.Where(x => x.SubjectVisitId == inDto.SubjectVisitId).ProjectTo<PreviousSurgeryView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
foreach (var item in cRCClinicalDataList)
|
||||
{
|
||||
item.PDFFileList = clinicalData.Where(y => y.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).SelectMany(x => x.FileList).ToList();
|
||||
item.ClinicalTableData = new ClinicalDataTable()
|
||||
{
|
||||
PreviousHistoryList = previousHistoryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
|
||||
PreviousOtherList = previousOtherList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
|
||||
PreviousSurgeryList = previousSurgeryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
|
||||
};
|
||||
|
||||
}
|
||||
return cRCClinicalDataList;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 添加CRC数据类型
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private async Task AddCRCClinicalData(GetCRCClinicalDataInDto inDto)
|
||||
{
|
||||
var cRCClinicalDataIds = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == inDto.TrialId && x.UploadRole == UploadRole.CRC && x.ClinicalDataLevel != ClinicalLevel.ImageRead && x.ClinicalDataLevel != ClinicalLevel.OncologyRead && x.IsConfirm).Select(x => x.Id).ToListAsync();
|
||||
|
||||
var needAddIds = cRCClinicalDataIds.Where(x => _readingClinicalDataRepository.Where(y => y.ReadingId == inDto.SubjectVisitId && x == y.ClinicalDataTrialSetId).Count() == 0).ToList();
|
||||
|
||||
List<ReadingClinicalData> readingClinicals = needAddIds.Select(x => new ReadingClinicalData()
|
||||
{
|
||||
ClinicalDataTrialSetId = x,
|
||||
IsVisit = true,
|
||||
SubjectId = inDto.SubjectId,
|
||||
ReadingId = inDto.SubjectVisitId,
|
||||
TrialId = inDto.TrialId
|
||||
}).ToList();
|
||||
|
||||
await _readingClinicalDataRepository.AddRangeAsync(readingClinicals);
|
||||
|
||||
await _readingClinicalDataRepository.SaveChangesAsync();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 临床数据签名 和确认
|
||||
|
||||
/// <summary>
|
||||
/// 影像阅片临床数据签名
|
||||
/// </summary>
|
||||
// [HttpPost]
|
||||
|
||||
public async Task<IResponseOutput> ReadClinicalDataSign(ReadingClinicalDataSignIndto inDto)
|
||||
{
|
||||
await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(x => x.Id == inDto.ReadingClinicalDataId, x => new ReadingClinicalData()
|
||||
{
|
||||
IsSign = true,
|
||||
ReadingClinicalDataState = ReadingClinicalDataStatus.HaveSigned
|
||||
});
|
||||
|
||||
var result = await _readingClinicalDataRepository.SaveChangesAsync();
|
||||
|
||||
|
||||
var readingId = await _readingClinicalDataRepository.Where(x => x.Id == inDto.ReadingClinicalDataId).Select(x => x.ReadingId).FirstOrDefaultAsync();
|
||||
|
||||
await this.iServiceProvider.GetService<IReadingImageTaskService>().AddOncologyTask(readingId);
|
||||
|
||||
return ResponseOutput.Result(result);
|
||||
}
|
||||
|
||||
[HttpPut]
|
||||
public async Task<IResponseOutput> PMClinicalDataConfirm(PMClinicalDataConfirmCommand command)
|
||||
{
|
||||
await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(t => t.Id == command.Id, u => new ReadingClinicalData()
|
||||
{
|
||||
IsBlind = command.IsBlind,
|
||||
IsComplete = command.IsComplete,
|
||||
ReadingClinicalDataState = ReadingClinicalDataStatus.HaveChecked
|
||||
});
|
||||
await _readingClinicalDataRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region 临床数据相关查询
|
||||
/// <summary>
|
||||
/// 获取下拉菜单
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<GetTrialClinicalDataSelectOutDto>> GetTrialClinicalDataSelect(GetTrialClinicalDataSelectIndto inDto)
|
||||
{
|
||||
var userTypes = new List<int>() {
|
||||
(int)UserTypeEnum.ProjectManager,
|
||||
(int)UserTypeEnum.SPM,
|
||||
(int)UserTypeEnum.CPM,
|
||||
(int)UserTypeEnum.IndependentReviewer,
|
||||
};
|
||||
|
||||
|
||||
|
||||
if (userTypes.Contains(_userInfo.UserTypeEnumInt))
|
||||
{
|
||||
inDto.UploadRole = UploadRole.PM;
|
||||
}
|
||||
|
||||
ReadModule readModule = null;
|
||||
if (inDto.ReadingId != null)
|
||||
{
|
||||
readModule = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId).FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
Dictionary<ModuleTypeEnum, ClinicalLevel> keyValuePairs = new Dictionary<ModuleTypeEnum, ClinicalLevel>();
|
||||
keyValuePairs.Add(ModuleTypeEnum.Global, ClinicalLevel.ImageRead);
|
||||
keyValuePairs.Add(ModuleTypeEnum.Oncology, ClinicalLevel.OncologyRead);
|
||||
|
||||
var usedIdsQuery = _readingClinicalDataRepository.Where(x => x.ReadingId == inDto.ReadingId && x.Id != inDto.ReadingClinicalDataId).Select(x => x.ClinicalDataTrialSetId);
|
||||
|
||||
List<GetTrialClinicalDataSelectOutDto> clinicalList = await _clinicalDataTrialSetRepository.Where(x => x.TrialId == inDto.TrialId && x.IsConfirm)
|
||||
.WhereIf(inDto.UploadRole != null, x => x.UploadRole == inDto.UploadRole)
|
||||
.Where(x => !usedIdsQuery.Contains(x.Id))
|
||||
.WhereIf(inDto.TrialReadingCriterionId != null, t => t.TrialClinicalDataCriterionList.Any(t => t.TrialReadingCriterionId == inDto.TrialReadingCriterionId))
|
||||
.WhereIf(inDto.IsVisit && inDto.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataLevel == ClinicalLevel.SubjectVisit)
|
||||
.WhereIf(inDto.IsVisit && !inDto.IsBaseLine, x => x.ClinicalDataLevel == ClinicalLevel.SubjectVisit)
|
||||
.WhereIf(!inDto.IsVisit, x => x.ClinicalDataLevel == ClinicalLevel.ImageRead || x.ClinicalDataLevel == ClinicalLevel.OncologyRead)
|
||||
.WhereIf(readModule != null, x => x.ClinicalDataLevel == keyValuePairs[readModule.ModuleType])
|
||||
.Select(x => new GetTrialClinicalDataSelectOutDto()
|
||||
{
|
||||
ClinicalDataLevel = x.ClinicalDataLevel,
|
||||
ClinicalDataSetName = x.ClinicalDataSetName,
|
||||
ClinicalUploadType = x.ClinicalUploadType,
|
||||
FileName = x.FileName,
|
||||
Path = x.Path,
|
||||
Id = x.Id
|
||||
}).ToListAsync();
|
||||
return clinicalList;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取访视 阅片或任务临床数据
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<(List<GetReadingClinicalDataListOutDto>, object)> GetReadingOrTaskClinicalDataList(GetReadingOrTaskClinicalDataListInDto inDto)
|
||||
{
|
||||
var readingNameOrTaskBlindName = string.Empty;
|
||||
if (inDto.ReadingId == null)
|
||||
{
|
||||
var visitTask = await _visitTaskRepository.FirstOrDefaultAsync(x => x.Id == inDto.VisitTaskId);
|
||||
inDto.ReadingId = visitTask.SouceReadModuleId ?? visitTask.SourceSubjectVisitId;
|
||||
readingNameOrTaskBlindName = visitTask.TaskBlindName;
|
||||
}
|
||||
|
||||
if (readingNameOrTaskBlindName.IsNullOrEmpty())
|
||||
{
|
||||
readingNameOrTaskBlindName = await _subjectVisitRepository.Where(x => x.Id == inDto.ReadingId).Select(x => x.VisitName).FirstOrDefaultAsync();
|
||||
if (readingNameOrTaskBlindName.IsNullOrEmpty())
|
||||
{
|
||||
readingNameOrTaskBlindName = await _readModuleRepository.Where(x => x.Id == inDto.ReadingId).Select(x => x.ModuleName).FirstOrDefaultAsync();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
var result = await GetClinicalDataList(inDto);
|
||||
|
||||
var previousHistoryList = await _previousHistoryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousHistoryView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var previousOtherList = await _previousOtherRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousOtherView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var previousSurgeryList = await _previousSurgeryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousSurgeryView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
foreach (var item in result)
|
||||
{
|
||||
item.ClinicalTableData = new ClinicalDataTable()
|
||||
{
|
||||
PreviousHistoryList = previousHistoryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
|
||||
PreviousOtherList = previousOtherList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
|
||||
PreviousSurgeryList = previousSurgeryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
return (result, new
|
||||
{
|
||||
SubjectCode = await _subjectRepository.Where(x => x.Id == inDto.SubjectId).Select(x => x.Code).FirstOrDefaultAsync(),
|
||||
ReadingNameOrTaskBlindName = readingNameOrTaskBlindName,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取阅片临床数据列表
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<(List<GetReadingClinicalDataListOutDto>, object)> GetReadingClinicalDataList(GetReadingClinicalDataListIndto inDto)
|
||||
{
|
||||
GetTrialClinicalDataSelectIndto getTrialClinicalDataSelectIndto = new GetTrialClinicalDataSelectIndto()
|
||||
{
|
||||
ReadingId = inDto.ReadingId,
|
||||
TrialId = inDto.TrialId,
|
||||
IsBaseLine = inDto.IsBaseLine,
|
||||
SubjectId = inDto.SubjectId,
|
||||
IsVisit = inDto.IsVisit,
|
||||
};
|
||||
|
||||
var clinicalDataList = await this.GetTrialClinicalDataSelect(getTrialClinicalDataSelectIndto);
|
||||
|
||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.IQC)
|
||||
{
|
||||
inDto.UploadRole = UploadRole.CRC;
|
||||
}
|
||||
var isBaseLine = await _subjectVisitRepository.AnyAsync(x => x.Id == inDto.ReadingId && x.IsBaseLine);
|
||||
|
||||
|
||||
var result = await this.GetReadingClinicalList(inDto);
|
||||
|
||||
|
||||
var previousHistoryList = await _previousHistoryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousHistoryView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var previousOtherList = await _previousOtherRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousOtherView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var previousSurgeryList = await _previousSurgeryRepository.Where(x => x.SubjectVisitId == inDto.ReadingId).ProjectTo<PreviousSurgeryView>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
foreach (var item in result)
|
||||
{
|
||||
item.ClinicalTableData = new ClinicalDataTable()
|
||||
{
|
||||
PreviousHistoryList = previousHistoryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
|
||||
PreviousOtherList = previousOtherList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
|
||||
PreviousSurgeryList = previousSurgeryList.Where(x => x.ClinicalDataTrialSetId == item.ClinicalDataTrialSetId).ToList(),
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
return (result, new
|
||||
{
|
||||
IsCanAddClinicalData = clinicalDataList.Count() > 0,
|
||||
});
|
||||
}
|
||||
|
||||
[NonDynamicMethod]
|
||||
public async Task<List<GetReadingClinicalDataListOutDto>> GetClinicalDataList(GetReadingOrTaskClinicalDataListInDto inDto)
|
||||
{
|
||||
|
||||
if (inDto.ReadingId == null)
|
||||
{
|
||||
var visitTask = await _visitTaskRepository.FirstOrDefaultAsync(x => x.Id == inDto.VisitTaskId);
|
||||
inDto.ReadingId = visitTask.SouceReadModuleId ?? visitTask.SourceSubjectVisitId;
|
||||
}
|
||||
|
||||
var resultQuery = _readingClinicalDataRepository.Where(x => x.SubjectId == inDto.SubjectId)
|
||||
.WhereIf(inDto.ReadingClinicalDataId != null, x => x.Id == inDto.ReadingClinicalDataId)
|
||||
.Where(x => x.ReadingId == inDto.ReadingId || (x.SubjectId == inDto.SubjectId && x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject))
|
||||
.Select(x => new GetReadingClinicalDataListOutDto()
|
||||
{
|
||||
ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel,
|
||||
SubjectId = x.SubjectId,
|
||||
ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName,
|
||||
ClinicalDataTrialSetId = x.ClinicalDataTrialSetId,
|
||||
IsSign = x.IsSign,
|
||||
ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType,
|
||||
Id = x.Id,
|
||||
UploadRole = x.ClinicalDataTrialSet.UploadRole,
|
||||
IsCRCUpload = x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC,
|
||||
FileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto()
|
||||
{
|
||||
Id = y.Id,
|
||||
FileName = y.FileName,
|
||||
Path = y.Path,
|
||||
CreateTime = y.CreateTime,
|
||||
}).ToList()
|
||||
});
|
||||
|
||||
|
||||
var result = await resultQuery.ToListAsync();
|
||||
result = result.Where(x => !(x.ClinicalUploadType == ClinicalUploadType.PDF && x.FileList.Count() == 0)).ToList();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取临床数据集合
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[NonDynamicMethod]
|
||||
public async Task<List<GetReadingClinicalDataListOutDto>> GetReadingClinicalList(GetReadingClinicalDataListIndto inDto)
|
||||
{
|
||||
var resultQuery = _readingClinicalDataRepository.Where(x => x.SubjectId == inDto.SubjectId)
|
||||
.Where(x => x.ReadingId == inDto.ReadingId)
|
||||
.WhereIf(inDto.UploadRole == UploadRole.CRC, x => x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC)
|
||||
.Select(x => new GetReadingClinicalDataListOutDto()
|
||||
{
|
||||
ClinicalDataLevel = x.ClinicalDataTrialSet.ClinicalDataLevel,
|
||||
SubjectId = x.SubjectId,
|
||||
ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName,
|
||||
ClinicalDataTrialSetId = x.ClinicalDataTrialSetId,
|
||||
IsSign = x.IsSign,
|
||||
ClinicalUploadType = x.ClinicalDataTrialSet.ClinicalUploadType,
|
||||
Id = x.Id,
|
||||
UploadRole = x.ClinicalDataTrialSet.UploadRole,
|
||||
IsCRCUpload = x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC,
|
||||
IsBlind = x.IsBlind,
|
||||
IsComplete = x.IsComplete,
|
||||
FileCount = x.FileCount,
|
||||
|
||||
ReadingClinicalDataState = x.ReadingClinicalDataState,
|
||||
|
||||
FileList = x.ReadingClinicalDataPDFList.Select(y => new GetFileDto()
|
||||
{
|
||||
Id = y.Id,
|
||||
FileName = y.FileName,
|
||||
Path = y.Path,
|
||||
CreateTime = y.CreateTime,
|
||||
}).ToList()
|
||||
});
|
||||
|
||||
var result = await resultQuery.ToListAsync();
|
||||
result = result.Where(x => !(x.UploadRole == UploadRole.CRC && x.ClinicalUploadType == ClinicalUploadType.PDF && x.FileList.Count() == 0)).ToList();
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
#region 阅片临床数据PDF
|
||||
|
||||
/// <summary>
|
||||
/// 获取单个阅片临床数据的所有文件
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<GetReadingClinicalDataPDFListOutDto>> GetReadingClinicalDataPDFList(GetReadingClinicalDataPDFListIndto inDto)
|
||||
{
|
||||
|
||||
var result = await _readingClinicalDataPDFRepository.Where(x => x.ReadingClinicalDataId == inDto.ReadingClinicalDataId).ProjectTo<GetReadingClinicalDataPDFListOutDto>(_mapper.ConfigurationProvider)
|
||||
.ToPagedListAsync(inDto.PageIndex, inDto.PageSize, inDto.SortField == null ? nameof(GetReadingClinicalDataPDFListOutDto.FileName) : inDto.SortField,
|
||||
inDto.Asc);
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除PDF单个文件
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
[HttpDelete("{id:guid}")]
|
||||
public async Task<IResponseOutput> DeleteReadingClinicalDataPDF(Guid id)
|
||||
{
|
||||
await _readingClinicalDataPDFRepository.DeleteFromQueryAsync(x => x.Id == id, true);
|
||||
return ResponseOutput.Result(true);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
///// <summary>
|
||||
///// 设置临床数据是否盲化
|
||||
///// </summary>
|
||||
///// <returns></returns>
|
||||
//[HttpPost]
|
||||
//public async Task<IResponseOutput> SetReadingClinicalDataIsBlind(SetReadingClinicalDataIsBlind inDto)
|
||||
//{
|
||||
// await _readingClinicalDataRepository.UpdatePartialFromQueryAsync(inDto.Id, x=>new ReadingClinicalData() {
|
||||
// IsBlind=inDto.IsBlind,
|
||||
// });
|
||||
// return ResponseOutput.Ok(await _readingClinicalDataRepository.SaveChangesAsync());
|
||||
//}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user