diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index e19efdf09..cf8e74cd1 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -18531,6 +18531,17 @@ 入组流程-向CRO提交医生[Submit] + + + 阅片任务退回,删除影像数据,解除访视和检查绑定关系 + + + + + + + + 获取医院的配置信息 diff --git a/IRaCIS.Core.Application/Service/Visit/DTO/PatientViewModel.cs b/IRaCIS.Core.Application/Service/Visit/DTO/PatientViewModel.cs index 488782087..9fc5974a7 100644 --- a/IRaCIS.Core.Application/Service/Visit/DTO/PatientViewModel.cs +++ b/IRaCIS.Core.Application/Service/Visit/DTO/PatientViewModel.cs @@ -346,6 +346,8 @@ namespace IRaCIS.Application.Contracts public DateTime UpdateTime { get; set; } = DateTime.Now; public Guid CreateUserId { get; set; } public DateTime CreateTime { get; set; } = DateTime.Now; + + public int? SCPStudyCount { get; set; } } public class UpdateSubjectVisitStudyBindingCommand @@ -1225,4 +1227,15 @@ namespace IRaCIS.Application.Contracts public string Path { get; set; } public long? FileSize { get; set; } } + + public class VisitImageBackCommand + { + [NotDefault] + public Guid TrialId { get; set; } + + [NotDefault] + public Guid SubjectId { get; set; } + [NotDefault] + public Guid SubjectVisitId { get; set; } + } } diff --git a/IRaCIS.Core.Application/Service/Visit/PatientService.cs b/IRaCIS.Core.Application/Service/Visit/PatientService.cs index 84ea2012b..42f35d2c6 100644 --- a/IRaCIS.Core.Application/Service/Visit/PatientService.cs +++ b/IRaCIS.Core.Application/Service/Visit/PatientService.cs @@ -74,7 +74,83 @@ namespace IRaCIS.Application.Services ) : BaseService { + #region 访视提交生成任务了,但是需要退回 + /// + /// 阅片任务退回,删除影像数据,解除访视和检查绑定关系 + /// + /// + /// + /// + /// + /// + /// + [HttpPut] + public async Task VisitImageBack(VisitImageBackCommand inCommand, + [FromServices] IRepository _dicomStudyRepository, + [FromServices] IRepository _dicomSeriesRepository, + [FromServices] IRepository _dicomInstanceRepository, + [FromServices] IRepository _repository) + { + var minVisitNum = _subjectVisitRepository.Where(t => t.Id == inCommand.SubjectVisitId).Select(t => t.VisitNum).FirstOrDefault(); + + + + //修改提交状态 + + await _subjectVisitRepository.UpdatePartialFromQueryAsync(t => t.SubjectId == inCommand.SubjectId && t.VisitNum >= minVisitNum && t.SubmitState == SubmitStateEnum.Submitted, t => new SubjectVisit() + { + SubmitState = SubmitStateEnum.ToSubmit, + SubmitTime = null, + SubmitUserId = null, + AuditState = AuditStateEnum.None, + CheckState = CheckStateEnum.None, + + }); + + + //清理影像检查 + + await _dicomStudyRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == inCommand.SubjectId && t.SubjectVisit.VisitNum >= minVisitNum); + await _dicomSeriesRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == inCommand.SubjectId && t.SubjectVisit.VisitNum >= minVisitNum); + await _dicomInstanceRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == inCommand.SubjectId && t.SubjectVisit.VisitNum >= minVisitNum); + + + + //解除当前以及后续访视检查绑定关系 + await _studySubjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectVisit.VisitNum >= minVisitNum && t.SubjectVisit.SubjectId == inCommand.SubjectId, u => new SCPStudySubjectVisit() { StudyId = null }); + + await _subjectPatientRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == inCommand.SubjectId, u => new SubjectPatient() { IsBinded = false }); + + //清理任务 + + var deleteVisitTaskIdList = _repository.Where(t => t.SubjectId == inCommand.SubjectId && t.SourceSubjectVisit.VisitNum >= minVisitNum).Select(t => t.Id).ToList(); + + await _repository.BatchDeleteNoTrackingAsync(t => t.SubjectId == inCommand.SubjectId && t.SourceSubjectVisit.VisitNum >= minVisitNum); + + + + await _repository.BatchDeleteNoTrackingAsync(t => deleteVisitTaskIdList.Contains(t.VisitTaskId)); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == inCommand.TrialId && deleteVisitTaskIdList.Contains(t.TaskId)); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == inCommand.TrialId && (deleteVisitTaskIdList.Contains(t.TaskIdOne) || deleteVisitTaskIdList.Contains(t.TaskIdTwo))); + + await _repository.BatchDeleteNoTrackingAsync(t => deleteVisitTaskIdList.Contains(t.VisitTaskId)); + + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == inCommand.TrialId && deleteVisitTaskIdList.Contains(t.VisitTaskId)); + + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == inCommand.TrialId && deleteVisitTaskIdList.Contains(t.VisitTaskId)); + await _repository.BatchDeleteNoTrackingAsync(t => t.TrialId == inCommand.TrialId && deleteVisitTaskIdList.Contains(t.VisitTaskId)); + await _repository.BatchDeleteNoTrackingAsync(t => t.VisitTask.TrialId == inCommand.TrialId && deleteVisitTaskIdList.Contains(t.VisitTaskId)); + + await _repository.BatchDeleteNoTrackingAsync(t => t.VisitTask.TrialId == inCommand.TrialId && deleteVisitTaskIdList.Contains(t.TaskId)); + + await _subjectVisitRepository.SaveChangesAsync(); + + return ResponseOutput.Ok(); + } + + + #endregion #region 医院信息管理 @@ -649,7 +725,7 @@ namespace IRaCIS.Application.Services #region new ok var query = _patientRepository.Where(t => isAdminOrOA ? true : t.SCPStudyList.Any(c => c.HospitalGroupList.Any(c => currentUserHospitalGroupIdList.Contains(c.HospitalGroupId)))) - .WhereIf(inQuery.CalledAEList.Any(), t => t.SCPStudyList.Any(c=> inQuery.CalledAEList.Contains(c.CalledAE))) + .WhereIf(inQuery.CalledAEList.Any(), t => t.SCPStudyList.Any(c => inQuery.CalledAEList.Contains(c.CalledAE))) .WhereIf(inQuery.HospitalGroupIdList.Any(), t => t.SCPStudyList.Any(c => c.HospitalGroupList.Any(c => inQuery.HospitalGroupIdList.Contains(c.HospitalGroupId)))) .WhereIf(inQuery.PatientHospitalGroupTagIdList.Any(), t => t.PatientHospitalGroupTagList.Any(k => inQuery.PatientHospitalGroupTagIdList.Contains(k.HospitalGroupTagId))) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), t => t.PatientIdStr.Contains(inQuery.PatientIdStr)) @@ -858,7 +934,7 @@ namespace IRaCIS.Application.Services SeriesCount = scpStudy.SeriesCount, StudyTime = scpStudy.StudyTime, StudyIdStr = scpStudy.StudyId, - StudyInstanceUid= scpStudy.StudyInstanceUid, + StudyInstanceUid = scpStudy.StudyInstanceUid, HospitalGroupList = scpStudy.HospitalGroupList.Select(t => new SCPStudyHospitalGroupInfo() { diff --git a/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs b/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs index 7f225ac77..aaff7cdf3 100644 --- a/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Visit/_MapConfig.cs @@ -112,7 +112,8 @@ namespace IRaCIS.Core.Application.Service CreateMap() .ForMember(d => d.CalledAEList, u => u.MapFrom(s => s.SCPStudyList.Select(t => t.CalledAE).Distinct())) .ForMember(d => d.CallingAEList, u => u.MapFrom(s => s.SCPStudyList.Select(t => t.CallingAE).Distinct())) - .ForMember(d => d.PatientId, u => u.MapFrom(s => s.Id)); + .ForMember(d => d.PatientId, u => u.MapFrom(s => s.Id)) + .ForMember(d => d.SCPStudyCount, u => u.MapFrom(s => s.SCPStudyList.Count())); CreateMap().IncludeMembers(t => t.SCPStudy) .ForMember(d => d.VisitName, u => u.MapFrom(s => s.SubjectVisit.VisitName)); diff --git a/IRaCIS.Core.Domain/Image/DicomInstance.cs b/IRaCIS.Core.Domain/Image/DicomInstance.cs index 38743a6ff..fb7816ab9 100644 --- a/IRaCIS.Core.Domain/Image/DicomInstance.cs +++ b/IRaCIS.Core.Domain/Image/DicomInstance.cs @@ -13,6 +13,9 @@ public class DicomInstance : BaseFullAuditEntity, IEntitySeqId [ForeignKey("StudyId")] public DicomStudy DicomStudy { get; set; } + [JsonIgnore] + public SubjectVisit SubjectVisit { get; set; } + [JsonIgnore] public List ReadingTableAnswerRowInfoList { get; set; } #endregion diff --git a/IRaCIS.Core.Domain/Image/DicomSeries.cs b/IRaCIS.Core.Domain/Image/DicomSeries.cs index 41d0c6e51..d99e1d0dc 100644 --- a/IRaCIS.Core.Domain/Image/DicomSeries.cs +++ b/IRaCIS.Core.Domain/Image/DicomSeries.cs @@ -12,6 +12,9 @@ public class DicomSeries : BaseFullDeleteAuditEntity, IEntitySeqId [JsonIgnore] public List DicomInstanceList { get; set; } + [JsonIgnore] + public SubjectVisit SubjectVisit { get; set; } + [JsonIgnore] public List SubjectCriteriaEvaluationVisitStudyFilterList { get; set; } #endregion