IRC_NewDev
he 2024-04-12 14:47:16 +08:00
parent 146fc916d1
commit b3178e6f8d
9 changed files with 147 additions and 36 deletions

View File

@ -3202,7 +3202,7 @@
</member>
<member name="M:IRaCIS.Core.Application.Service.ClinicalAnswerService.AutoAddCRCClinical(IRaCIS.Core.Application.Service.Reading.Dto.AutoAddClinicalInDto)">
<summary>
自动添加CRC临床数据
自动添加CRC临床数据 (不包括检查级别)
</summary>
<param name="inDto"></param>
<returns></returns>
@ -12337,7 +12337,7 @@
<param name="trialConfig"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.Application.TrialConfigService.ConfigTrialProcessInfoVerification(IRaCIS.Core.Application.Contracts.TrialProcessConfig)">
<member name="M:IRaCIS.Core.Application.TrialConfigService.ConfigTrialProcessInfoVerification(IRaCIS.Core.Application.Contracts.ConfigTrialProcessInfoVerificationInDto)">
<summary>
配置流程验证
</summary>

View File

@ -139,7 +139,11 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
}
/// <summary>
/// 上传临床数据
/// </summary>
/// <param name="incommand"></param>
/// <returns></returns>
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
public async Task<IResponseOutput> AddOrUpdateArchiveStudy(NewArchiveStudyCommand incommand)
{

View File

@ -16,6 +16,7 @@ using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infrastructure.Extention;
using IRaCIS.Core.Application.Service.Reading.Interface;
using IRaCIS.Core.Application.Contracts;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
namespace IRaCIS.Core.Application.Service
{
@ -41,6 +42,7 @@ namespace IRaCIS.Core.Application.Service
private readonly IRepository<Subject> _subjectRepository;
private readonly IRepository<ReadModuleCriterionFrom> _readModuleCriterionFromRepository;
private readonly IRepository<ReadModule> _readModuleRepository;
private readonly IRepository<DicomStudy> _dicomStudyRepository;
private readonly IRepository<ClinicalQuestionAnswer> _clinicalQuestionAnswerRepository;
private readonly IRepository<ClinicalTableAnswer> _clinicalTableAnswerRepository;
@ -64,6 +66,7 @@ namespace IRaCIS.Core.Application.Service
IReadingClinicalDataService iReadingClinicalDataService,
IRepository<ReadModuleCriterionFrom> readModuleCriterionFromRepository,
IRepository<ReadModule> readModuleRepository,
IRepository<DicomStudy> dicomStudyRepository,
IRepository<SubjectVisit> subjectVisitRepository,
IRepository<ClinicalTableAnswer> clinicalTableAnswerRepository,
IRepository<ClinicalQuestionAnswer> clinicalQuestionAnswerRepository,
@ -87,6 +90,7 @@ namespace IRaCIS.Core.Application.Service
this._subjectRepository = subjectRepository;
this._readModuleCriterionFromRepository = readModuleCriterionFromRepository;
this._readModuleRepository = readModuleRepository;
this._dicomStudyRepository = dicomStudyRepository;
_clinicalTableAnswerRepository = clinicalTableAnswerRepository;
_iClinicalQuestionService = iClinicalQuestionService;
}
@ -111,11 +115,56 @@ namespace IRaCIS.Core.Application.Service
}
/// <summary>
/// 自动添加CRC临床数据
/// 删除检查级别临床数据
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task AutoAddCRCClinical(AutoAddClinicalInDto inDto)
public async Task DeleteStudyClinical(DeleteStudyClinicalInDto inDto)
{
await _readingClinicalDataRepository.BatchDeleteNoTrackingAsync(x => x.StudyId == inDto.StudyId);
}
/// <summary>
/// 添加检查级别临床数据
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task AddStudyClinical(AddStudyClinicalInDto inDto)
{
var studyInfo = await _dicomStudyRepository.Where(x => x.Id == inDto.StudyId).FirstNotNullAsync();
List<ClinicalDataTrialSet> clinicals = await _clinicalDataTrialSetRepository.Where(x =>
x.TrialId == studyInfo.TrialId && x.IsConfirm&&x.ClinicalDataLevel== ClinicalLevel.Study).ToListAsync();
List<ReadingClinicalData> datas = new List<ReadingClinicalData>();
clinicals.ForEach(x =>
{
datas.Add(new ReadingClinicalData()
{
ClinicalDataTrialSetId = x.Id,
IsVisit = true,
SubjectId = studyInfo.SubjectId,
ReadingId = studyInfo.SubjectVisitId,
TrialId = studyInfo.TrialId,
StudyId = studyInfo.Id
});
});
await _readingClinicalDataRepository.AddRangeAsync(datas);
await _readingClinicalDataRepository.SaveChangesAsync();
}
/// <summary>
/// 自动添加CRC临床数据 (不包括检查级别)
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
public async Task AutoAddCRCClinical(AutoAddClinicalInDto inDto)
{
var dataTrialSetList = await _clinicalDataTrialSetRepository.Where(x =>x.TrialId == inDto.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm)
.IgnoreAutoIncludes().ToListAsync();
@ -194,16 +243,16 @@ namespace IRaCIS.Core.Application.Service
TrialId = inDto.TrialId
}).ToList());
readingClinicalDatas.AddRange(
dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.Study).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.ReadingId == n.VisitId).Count() == 0)
.Select(x => new ReadingClinicalData()
{
ClinicalDataTrialSetId = x.Id,
IsVisit = true,
SubjectId = n.SubjectId,
ReadingId = n.VisitId,
TrialId = inDto.TrialId
}).ToList());
//readingClinicalDatas.AddRange(
// dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.Study).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.ReadingId == n.VisitId).Count() == 0)
// .Select(x => new ReadingClinicalData()
// {
// ClinicalDataTrialSetId = x.Id,
// IsVisit = true,
// SubjectId = n.SubjectId,
// ReadingId = n.VisitId,
// TrialId = inDto.TrialId
// }).ToList());
});

View File

@ -9,6 +9,7 @@ using Microsoft.Extensions.DependencyInjection;
using System.Linq.Expressions;
using IRaCIS.Core.Infrastructure;
using System.Linq.Dynamic.Core;
using Microsoft.Extensions.Logging;
namespace IRaCIS.Application.Services
{
@ -178,19 +179,33 @@ namespace IRaCIS.Application.Services
#region 临床数据CRC 相关
/// <summary>
/// 获取CRC上传的文件
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
/// <summary>
/// 获取CRC上传的文件
/// </summary>
/// <param name="inDto"></param>
/// <returns></returns>
[HttpPost]
public async Task<List<GetCRCClinicalDataOutDto>> GetCRCClinicalData(GetCRCClinicalDataInDto inDto)
{
List<GetCRCClinicalDataOutDto> cRCClinicalDataList = await _readingClinicalDataRepository.Where(x => x.ReadingId == inDto.SubjectVisitId)
.WhereIf(inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit|| x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Study)
.WhereIf(!inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Study)
.Where(x => x.ClinicalDataTrialSet.TrialId == inDto.TrialId && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC)
.Select(x => new GetCRCClinicalDataOutDto()
var query = _readingClinicalDataRepository.AsQueryable();
if (inDto.StudyId != null)
{
query = query.Where(x => x.StudyId == inDto.StudyId.Value);
}
else
{
query = query.Where(x => x.ReadingId == inDto.SubjectVisitId)
.WhereIf(inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.Subject || x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit)
.WhereIf(!inDto.IsBaseline, x => x.ClinicalDataTrialSet.ClinicalDataLevel == ClinicalLevel.SubjectVisit)
.Where(x => x.ClinicalDataTrialSet.TrialId == inDto.TrialId && x.ClinicalDataTrialSet.UploadRole == UploadRole.CRC);
}
List<GetCRCClinicalDataOutDto> cRCClinicalDataList = await query
.Select(x => new GetCRCClinicalDataOutDto()
{
Id = x.Id,
ClinicalDataSetName = x.ClinicalDataTrialSet.ClinicalDataSetName.LanguageName(x.ClinicalDataTrialSet.ClinicalDataSetEnName, _userInfo.IsEn_Us) ,

View File

@ -12,7 +12,19 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
{
public Guid ReadingClinicalDataId { get; set; }
}
public class AutoAddClinicalInDto
public class DeleteStudyClinicalInDto
{
public Guid StudyId { get; set; }
}
public class AddStudyClinicalInDto
{
public Guid StudyId { get; set; }
}
public class AutoAddClinicalInDto
{
public Guid? SubjectId { get; set; }

View File

@ -143,16 +143,17 @@ namespace IRaCIS.Core.Application.Service.Reading.Dto
public class GetCRCClinicalDataInDto
{
[NotDefault]
public Guid SubjectVisitId { get; set; }
[NotDefault]
public Guid TrialId { get; set; }
[NotDefault]
public Guid SubjectId { get; set; }
public bool IsBaseline { get; set; }
public Guid? StudyId { get; set; }
}
/// <summary>

View File

@ -11,7 +11,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Interface
{
Task<IResponseOutput> CRCSignClinicalData(CRCSignClinicalDataInDto inDto);
Task AutoAddCRCClinical(AutoAddClinicalInDto inDto);
Task DeleteStudyClinical(DeleteStudyClinicalInDto inDto);
Task AddStudyClinical(AddStudyClinicalInDto inDto);
Task AutoAddCRCClinical(AutoAddClinicalInDto inDto);
Task<IResponseOutput> PMConfirmClinical(CRCConfirmClinicalInDto inDto);

View File

@ -1,4 +1,5 @@
using EntityFrameworkCore.Triggered;
using IRaCIS.Core.Application.Service.Reading.Interface;
using IRaCIS.Core.Domain.Share;
namespace IRaCIS.Core.Application.Triggers
@ -9,13 +10,14 @@ namespace IRaCIS.Core.Application.Triggers
public class SubjectVisitTrigger : IAfterSaveTrigger<NoneDicomStudy>, IAfterSaveTrigger<DicomStudy>, IAfterSaveTrigger<NoneDicomStudyFile>
{
private readonly IRepository<SubjectVisit> _subjectVisitRepository;
private readonly IRepository _repository;
private readonly IClinicalAnswerService _iClinicalAnswerService;
private readonly IRepository _repository;
public SubjectVisitTrigger(IRepository<SubjectVisit> subjectVisitRepository,IRepository repository)
public SubjectVisitTrigger(IRepository<SubjectVisit> subjectVisitRepository, IClinicalAnswerService iClinicalAnswerService,IRepository repository)
{
_subjectVisitRepository = subjectVisitRepository;
_repository = repository;
this._iClinicalAnswerService = iClinicalAnswerService;
_repository = repository;
}
//注意删除不能用扩展方法必须用EF跟踪的实体 否则不能取到 SubjectVisitId
@ -65,13 +67,33 @@ namespace IRaCIS.Core.Application.Triggers
await UpdateSubjectVisitSubmitStateAsync(subjectVisitId);
//添加检查级别临床数据
// 检查类型 ModalityForEdit
// 检查模态 Modalities
var modalityForEdit = context.Entity.ModalityForEdit;
if (modalityForEdit.Contains("PT") && modalityForEdit.Contains("CT"))
{
await _iClinicalAnswerService.AddStudyClinical(new Service.Reading.Dto.AddStudyClinicalInDto()
{
StudyId = studyId,
});
}
}
if (context.ChangeType == ChangeType.Deleted)
{
await UpdateSubjectVisitImageDateAsync(subjectVisitId);
await UpdateSubjectVisitSubmitStateAsync(subjectVisitId);
}
//删除检查级别临床数据
await _iClinicalAnswerService.DeleteStudyClinical(new Service.Reading.Dto.DeleteStudyClinicalInDto()
{
StudyId = context.Entity.Id,
});
}
}

View File

@ -24,6 +24,8 @@ namespace IRaCIS.Core.Domain.Models
/// </summary>
public Guid ReadingId { get; set; }
public Guid? StudyId { get; set; }
/// <summary>
/// 受试者ID
/// </summary>