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>
<member name="M:IRaCIS.Core.Application.Service.ClinicalAnswerService.AutoAddCRCClinical(IRaCIS.Core.Application.Service.Reading.Dto.AutoAddClinicalInDto)"> <member name="M:IRaCIS.Core.Application.Service.ClinicalAnswerService.AutoAddCRCClinical(IRaCIS.Core.Application.Service.Reading.Dto.AutoAddClinicalInDto)">
<summary> <summary>
自动添加CRC临床数据 自动添加CRC临床数据 (不包括检查级别)
</summary> </summary>
<param name="inDto"></param> <param name="inDto"></param>
<returns></returns> <returns></returns>
@ -12337,7 +12337,7 @@
<param name="trialConfig"></param> <param name="trialConfig"></param>
<returns></returns> <returns></returns>
</member> </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>
配置流程验证 配置流程验证
</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" })] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
public async Task<IResponseOutput> AddOrUpdateArchiveStudy(NewArchiveStudyCommand incommand) 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.Infrastructure.Extention;
using IRaCIS.Core.Application.Service.Reading.Interface; using IRaCIS.Core.Application.Service.Reading.Interface;
using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
namespace IRaCIS.Core.Application.Service namespace IRaCIS.Core.Application.Service
{ {
@ -41,6 +42,7 @@ namespace IRaCIS.Core.Application.Service
private readonly IRepository<Subject> _subjectRepository; private readonly IRepository<Subject> _subjectRepository;
private readonly IRepository<ReadModuleCriterionFrom> _readModuleCriterionFromRepository; private readonly IRepository<ReadModuleCriterionFrom> _readModuleCriterionFromRepository;
private readonly IRepository<ReadModule> _readModuleRepository; private readonly IRepository<ReadModule> _readModuleRepository;
private readonly IRepository<DicomStudy> _dicomStudyRepository;
private readonly IRepository<ClinicalQuestionAnswer> _clinicalQuestionAnswerRepository; private readonly IRepository<ClinicalQuestionAnswer> _clinicalQuestionAnswerRepository;
private readonly IRepository<ClinicalTableAnswer> _clinicalTableAnswerRepository; private readonly IRepository<ClinicalTableAnswer> _clinicalTableAnswerRepository;
@ -64,6 +66,7 @@ namespace IRaCIS.Core.Application.Service
IReadingClinicalDataService iReadingClinicalDataService, IReadingClinicalDataService iReadingClinicalDataService,
IRepository<ReadModuleCriterionFrom> readModuleCriterionFromRepository, IRepository<ReadModuleCriterionFrom> readModuleCriterionFromRepository,
IRepository<ReadModule> readModuleRepository, IRepository<ReadModule> readModuleRepository,
IRepository<DicomStudy> dicomStudyRepository,
IRepository<SubjectVisit> subjectVisitRepository, IRepository<SubjectVisit> subjectVisitRepository,
IRepository<ClinicalTableAnswer> clinicalTableAnswerRepository, IRepository<ClinicalTableAnswer> clinicalTableAnswerRepository,
IRepository<ClinicalQuestionAnswer> clinicalQuestionAnswerRepository, IRepository<ClinicalQuestionAnswer> clinicalQuestionAnswerRepository,
@ -87,6 +90,7 @@ namespace IRaCIS.Core.Application.Service
this._subjectRepository = subjectRepository; this._subjectRepository = subjectRepository;
this._readModuleCriterionFromRepository = readModuleCriterionFromRepository; this._readModuleCriterionFromRepository = readModuleCriterionFromRepository;
this._readModuleRepository = readModuleRepository; this._readModuleRepository = readModuleRepository;
this._dicomStudyRepository = dicomStudyRepository;
_clinicalTableAnswerRepository = clinicalTableAnswerRepository; _clinicalTableAnswerRepository = clinicalTableAnswerRepository;
_iClinicalQuestionService = iClinicalQuestionService; _iClinicalQuestionService = iClinicalQuestionService;
} }
@ -111,11 +115,56 @@ namespace IRaCIS.Core.Application.Service
} }
/// <summary> /// <summary>
/// 自动添加CRC临床数据 /// 删除检查级别临床数据
/// </summary> /// </summary>
/// <param name="inDto"></param> /// <param name="inDto"></param>
/// <returns></returns> /// <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) var dataTrialSetList = await _clinicalDataTrialSetRepository.Where(x =>x.TrialId == inDto.TrialId && x.UploadRole == UploadRole.CRC && x.IsConfirm)
.IgnoreAutoIncludes().ToListAsync(); .IgnoreAutoIncludes().ToListAsync();
@ -194,16 +243,16 @@ namespace IRaCIS.Core.Application.Service
TrialId = inDto.TrialId TrialId = inDto.TrialId
}).ToList()); }).ToList());
readingClinicalDatas.AddRange( //readingClinicalDatas.AddRange(
dataTrialSetList.Where(x => x.ClinicalDataLevel == ClinicalLevel.Study).Where(x => clinicalDataList.Where(y => y.ClinicalDataTrialSetId == x.Id && y.ReadingId == n.VisitId).Count() == 0) // 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() // .Select(x => new ReadingClinicalData()
{ // {
ClinicalDataTrialSetId = x.Id, // ClinicalDataTrialSetId = x.Id,
IsVisit = true, // IsVisit = true,
SubjectId = n.SubjectId, // SubjectId = n.SubjectId,
ReadingId = n.VisitId, // ReadingId = n.VisitId,
TrialId = inDto.TrialId // TrialId = inDto.TrialId
}).ToList()); // }).ToList());
}); });

View File

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

View File

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

View File

@ -11,7 +11,13 @@ namespace IRaCIS.Core.Application.Service.Reading.Interface
{ {
Task<IResponseOutput> CRCSignClinicalData(CRCSignClinicalDataInDto inDto); 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); Task<IResponseOutput> PMConfirmClinical(CRCConfirmClinicalInDto inDto);

View File

@ -1,4 +1,5 @@
using EntityFrameworkCore.Triggered; using EntityFrameworkCore.Triggered;
using IRaCIS.Core.Application.Service.Reading.Interface;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
namespace IRaCIS.Core.Application.Triggers namespace IRaCIS.Core.Application.Triggers
@ -9,13 +10,14 @@ namespace IRaCIS.Core.Application.Triggers
public class SubjectVisitTrigger : IAfterSaveTrigger<NoneDicomStudy>, IAfterSaveTrigger<DicomStudy>, IAfterSaveTrigger<NoneDicomStudyFile> public class SubjectVisitTrigger : IAfterSaveTrigger<NoneDicomStudy>, IAfterSaveTrigger<DicomStudy>, IAfterSaveTrigger<NoneDicomStudyFile>
{ {
private readonly IRepository<SubjectVisit> _subjectVisitRepository; 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; _subjectVisitRepository = subjectVisitRepository;
this._iClinicalAnswerService = iClinicalAnswerService;
_repository = repository; _repository = repository;
} }
//注意删除不能用扩展方法必须用EF跟踪的实体 否则不能取到 SubjectVisitId //注意删除不能用扩展方法必须用EF跟踪的实体 否则不能取到 SubjectVisitId
@ -65,13 +67,33 @@ namespace IRaCIS.Core.Application.Triggers
await UpdateSubjectVisitSubmitStateAsync(subjectVisitId); 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) if (context.ChangeType == ChangeType.Deleted)
{ {
await UpdateSubjectVisitImageDateAsync(subjectVisitId); await UpdateSubjectVisitImageDateAsync(subjectVisitId);
await UpdateSubjectVisitSubmitStateAsync(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> /// </summary>
public Guid ReadingId { get; set; } public Guid ReadingId { get; set; }
public Guid? StudyId { get; set; }
/// <summary> /// <summary>
/// 受试者ID /// 受试者ID
/// </summary> /// </summary>