From 21bd7814680984e55356ed953f9c32e1379e680a Mon Sep 17 00:00:00 2001 From: hang <872297557@qq.com> Date: Tue, 17 Oct 2023 15:49:24 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B6=85=E5=A3=B0=E5=AF=B9=E6=8E=A5=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRaCIS.Core.Application.xml | 53 +++ .../ImageAndDoc/DTO/UnionStudyViewDodel.cs | 4 +- .../DTO/UltrasonicDicomViewModel.cs | 99 ++++- .../UltrasonicDicomService.cs | 414 ++++++++++++++++-- .../Service/Third-partyProject/_MapConfig.cs | 7 +- IRaCIS.Core.Domain/Allocation/VisitTask.cs | 3 + IRaCIS.Core.Domain/Image/DicomSeries.cs | 2 + 7 files changed, 553 insertions(+), 29 deletions(-) diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index 17ad2fafd..1a0dd5f22 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -8578,6 +8578,59 @@ + + + 项目列表 + + + + + + + 任务列表 第一层级 + + + + + + + 检查列表 第二层级 + + + + + + 修改任务上的 影像上传状态 + + + + + + + 通过任务Id 获取检查模态下拉框 + + + + + + 通过选择的序列Id 数组,获取下面的Instance 路径 + + + + + + + + 归档接口 -new 一份 序列层级增加了一个参数VisitTaskId 用于绑定从TomTec拉取来的序列(两个人公用的影像,不应该绑定) + + + + + + + + + 项目外部人员 录入流程相关 diff --git a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs index 42c9c3a71..4b08c12d0 100644 --- a/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs +++ b/IRaCIS.Core.Application/Service/ImageAndDoc/DTO/UnionStudyViewDodel.cs @@ -173,6 +173,8 @@ namespace IRaCIS.Core.Application.Contracts public string[]? VisitPlanArray { get; set; } + public Guid? VisitTaskId { get; set; } + } @@ -283,7 +285,7 @@ namespace IRaCIS.Core.Application.Contracts public string IamgeResizePath { get; set; }=string.Empty; public List InstanceList { get; set; } - + public Guid? VisitTaskId { get; set; } } diff --git a/IRaCIS.Core.Application/Service/Third-partyProject/DTO/UltrasonicDicomViewModel.cs b/IRaCIS.Core.Application/Service/Third-partyProject/DTO/UltrasonicDicomViewModel.cs index 109e353bf..0068f91db 100644 --- a/IRaCIS.Core.Application/Service/Third-partyProject/DTO/UltrasonicDicomViewModel.cs +++ b/IRaCIS.Core.Application/Service/Third-partyProject/DTO/UltrasonicDicomViewModel.cs @@ -1,5 +1,8 @@ -using System; +using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Domain.Share; +using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -7,5 +10,99 @@ using System.Threading.Tasks; namespace IRaCIS.Core.Application.Service.Third_partyProject.DTO { + public class TrialListDTO_UltrasonicDicom: TrialBaseInfoDto + { + public DateTime CreateTime { get; set; } + + public string Sponsor { get; set; } + public string TrialStatusStr { get; set; } + } + + public class VisitTaskQuery_UltrasonicDicom : PageInput + { + [NotDefault] + public Guid TrialId { get; set; } + + public Guid? SiteId { get; set; } + + public Guid? SubjectId { get; set; } + + public string SubjectCode { get; set; } = String.Empty; + + public bool? IsUrgent { get; set; } + + public string TaskName { get; set; } = String.Empty; + + public Guid? DoctorUserId { get; set; } + + public string? TaskCode { get; set; } + + public String? TrialSiteCode { get; set; } + + public Arm? ArmEnum { get; set; } + + public Guid? TrialReadingCriterionId { get; set; } + + + + } + public class VisitTaskDTO_UltrasonicDicom + { + public Guid Id { get;set; } + public String TrialSiteCode { get; set; } = String.Empty; + public string SubjectCode { get; set; } = String.Empty; + public string UserName { get; set; } + public string FullName { get; set; } + public Arm ArmEnum { get; set; } + public Guid? DoctorUserId { get; set; } + public string TaskCode { get; set; } + public string TaskName { get; set; } + public string TaskBlindName { get; set; } + + public decimal VisitTaskNum { get; set; } + + public int ImageStudyState { get; set; } + } + + public class UpdateTaskImageStateCommand + { + [NotDefault] + public Guid VisitTaskId { get; set; } + public int ImageStudyState { get; set; } + } + + + public class StudyDTO_UltrasonicDicom : UnionStudyViewModel + { + + } + + public class StudySeriesModality + { + public Guid StudyId { get; set; } + + public int SeriesCount { get; set; } + + public string StudyCode { get; set; } + + public List SeriesModalityList { get; set; } + + } + + public class StudySeriesModalitySelectDTO + { + public Guid StudyId { get; set; } + + public List SeriesIdList { get; set; } + } + + public class SeriesModality + { + public Guid SeriesId { get; set; } + + public string Modality { get; set; } + } + + } diff --git a/IRaCIS.Core.Application/Service/Third-partyProject/UltrasonicDicomService.cs b/IRaCIS.Core.Application/Service/Third-partyProject/UltrasonicDicomService.cs index 3d79a14af..f2d496d29 100644 --- a/IRaCIS.Core.Application/Service/Third-partyProject/UltrasonicDicomService.cs +++ b/IRaCIS.Core.Application/Service/Third-partyProject/UltrasonicDicomService.cs @@ -1,7 +1,14 @@ -using IRaCIS.Application.Contracts; +using EasyCaching.Core; +using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; +using IRaCIS.Core.Application.Filter; +using IRaCIS.Core.Application.Service.Third_partyProject.DTO; +using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Share; +using IRaCIS.Core.Infrastructure; +using Medallion.Threading; using Microsoft.AspNetCore.Mvc; +using OfficeOpenXml.FormulaParsing.Utilities; using System; using System.Collections.Generic; using System.Linq; @@ -13,21 +20,30 @@ namespace IRaCIS.Core.Application.Service.Third_partyProject { [ApiExplorerSettings(GroupName = "Trial")] - public class UltrasonicDicomService:BaseService + public class UltrasonicDicomService : BaseService { public readonly IRepository _trialRepository; + public readonly IRepository _studyRepository; + private readonly IRepository _dictionaryRepository; + public readonly IRepository _visitTaskRepository; - public UltrasonicDicomService(IRepository trialRepository) + + public UltrasonicDicomService(IRepository trialRepository, IRepository studyRepository, IRepository visitTaskRepository, IRepository dictionaryRepository) { _trialRepository = trialRepository; + _studyRepository = studyRepository; + _visitTaskRepository = visitTaskRepository; + _dictionaryRepository = dictionaryRepository; } - - + /// + /// 项目列表 + /// + /// + /// [HttpPost] - public async Task>> GetTrialToBeDoneList(TrialToBeDoneQuery inQuery, - [FromServices] IRepository _taskMedicalReviewRepository) + public async Task>> GetTrialList(TrialToBeDoneQuery inQuery) { var isPM = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.ProjectManager || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.APM; @@ -44,7 +60,7 @@ namespace IRaCIS.Core.Application.Service.Third_partyProject .WhereIf(!string.IsNullOrEmpty(inQuery.ResearchProgramNo), o => o.ResearchProgramNo.Contains(inQuery.ResearchProgramNo)) .WhereIf(!string.IsNullOrWhiteSpace(inQuery.ExperimentName), o => o.ExperimentName.Contains(inQuery.ExperimentName)) .WhereIf(_userInfo.UserTypeEnumInt != (int)UserTypeEnum.SuperAdmin, t => t.TrialUserList.Any(t => t.UserId == _userInfo.Id && t.IsDeleted == false) && t.IsDeleted == false) - .Select(t => new TrialToBeDoneDto() + .Select(t => new TrialListDTO_UltrasonicDicom() { TrialId = t.Id, ResearchProgramNo = t.ResearchProgramNo, @@ -52,29 +68,375 @@ namespace IRaCIS.Core.Application.Service.Third_partyProject TrialCode = t.TrialCode, CreateTime = t.CreateTime, Sponsor = _userInfo.IsEn_Us ? t.Sponsor.SponsorName : t.Sponsor.SponsorNameCN, - TrialStatusStr = t.TrialStatusStr, - - ExpetiedTaskCount = isPM ? t.VisitTaskList.Where(t => t.IsUrgent).Count() : 0, - - ReReadingApprovalCount = isPM ? t.VisitTaskReReadingList.Where(t => t.OriginalReReadingTask.ReReadingApplyState == ReReadingApplyState.DocotorHaveApplyed).Count() : 0, - - PendingReconciliationCount = isPM ? t.SubjectVisitList.Where(t => t.CheckState == CheckStateEnum.ToCheck).Count() : 0, - - PendingResponseCount = isPM ? t.SubjectVisitList.Where(u => u.CheckState == CheckStateEnum.CVIng && - u.CheckChallengeDialogList.OrderByDescending(t => t.CreateTime).First().UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Count() : 0 - - - + TrialStatusStr = t.TrialStatusStr }); - - - //.ProjectTo(_mapper.ConfigurationProvider, new { userTypeEnumInt = _userInfo.UserTypeEnumInt, userId = _userInfo.Id }); - - var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? "CreateTime" : inQuery.SortField, inQuery.Asc); + var result = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(TrialListDTO_UltrasonicDicom.CreateTime) : inQuery.SortField, inQuery.Asc); return ResponseOutput.Ok(result); } + + /// + /// 任务列表 第一层级 + /// + /// + /// + [HttpPost] + public async Task> GetVisitTaskList(VisitTaskQuery_UltrasonicDicom queryVisitTask) + { + var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == queryVisitTask.TrialId && t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect && t.SourceSubjectVisitId != null) + + .WhereIf(queryVisitTask.SiteId != null, t => t.Subject.SiteId == queryVisitTask.SiteId) + .WhereIf(queryVisitTask.SubjectId != null, t => t.SubjectId == queryVisitTask.SubjectId) + .WhereIf(queryVisitTask.IsUrgent != null, t => t.IsUrgent == queryVisitTask.IsUrgent) + .WhereIf(queryVisitTask.DoctorUserId != null, t => t.DoctorUserId == queryVisitTask.DoctorUserId) + .WhereIf(queryVisitTask.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == queryVisitTask.TrialReadingCriterionId) + .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate == false)) + .WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.TaskName.Contains(queryVisitTask.TaskName) || t.TaskBlindName.Contains(queryVisitTask.TaskName)) + .WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate)) + + .ProjectTo(_mapper.ConfigurationProvider); + + var defalutSortArray = new string[] { nameof(VisitTask.SubjectId), nameof(VisitTask.VisitTaskNum) }; + + var pageList = await visitTaskQueryable.ToPagedListAsync(queryVisitTask.PageIndex, queryVisitTask.PageSize, queryVisitTask.SortField, queryVisitTask.Asc, string.IsNullOrWhiteSpace(queryVisitTask.SortField), defalutSortArray); + + return pageList; + } + + /// + /// 检查列表 第二层级 + /// + /// + [HttpGet] + public async Task> GetDicomAndNoneDicomStudyList(Guid visiTaskId, [FromServices] IRepository _visitTaskRepository) + { + + var query = from dicomStudy in _visitTaskRepository.Where(t => t.Id == visiTaskId).Select(t => t.SourceSubjectVisit).SelectMany(t => t.StudyList) + select new StudyDTO_UltrasonicDicom() + { + TrialId = dicomStudy.TrialId, + SiteId = dicomStudy.SiteId, + SubjectId = dicomStudy.SubjectId, + SubjectVisitId = dicomStudy.SubjectVisitId, + VisitName = dicomStudy.SubjectVisit.VisitName, + VisitNum = dicomStudy.SubjectVisit.VisitNum, + IsDicom = true, + SubjectCode = dicomStudy.Subject.Code, + + Id = dicomStudy.Id, + + Bodypart = dicomStudy.BodyPartExamined, + + Modalities = dicomStudy.Modalities, + + Count = dicomStudy.SeriesCount, + + StudyCode = dicomStudy.StudyCode, + + StudyTime = dicomStudy.StudyTime, + + TrialSiteAliasName = dicomStudy.TrialSite.TrialSiteAliasName, + + TrialSiteCode = dicomStudy.TrialSite.TrialSiteCode, + + Uploader = dicomStudy.Uploader.UserName, + + UploadTime = dicomStudy.CreateTime + }; + + + + + + return await query.ToListAsync(); + } + + /// + /// 修改任务上的 影像上传状态 + /// + /// + /// + [HttpPut] + public async Task UpdateTaskImageState(UpdateTaskImageStateCommand command) + { + await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.Id == command.VisitTaskId, u => new VisitTask() { ImageStudyState = command.ImageStudyState }); + + return ResponseOutput.Ok(); + } + + /// + /// 通过任务Id 获取检查模态下拉框 + /// + /// + public async Task> GetStudyModalityList(Guid visiTaskId) + { + + var list = await _visitTaskRepository.Where(t => t.Id == visiTaskId).Select(t => t.SourceSubjectVisit).SelectMany(t => t.StudyList).Select(t => new StudySeriesModality + { + SeriesCount = t.SeriesCount, + StudyCode = t.StudyCode, + SeriesModalityList = t.SeriesList.Select(t => new SeriesModality { SeriesId = t.Id, Modality = t.Modality }).ToList() + + }).ToListAsync(); + + return list; + } + + /// + /// 通过选择的序列Id 数组,获取下面的Instance 路径 + /// + /// + /// + /// + [HttpPost] + public async Task> GetStudyModalityOSSPath(List seriesIdList, [FromServices] IRepository _dicomSeriesRepository) + { + return await _dicomSeriesRepository.Where(t => seriesIdList.Contains(t.Id)).SelectMany(t => t.DicomInstanceList).Select(t => t.Path).ToListAsync(); + } + + + /// + /// 归档接口 -new 一份 序列层级增加了一个参数VisitTaskId 用于绑定从TomTec拉取来的序列(两个人公用的影像,不应该绑定) + /// + /// + /// + /// + /// + /// + /// + /// + + [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] + public async Task AddOrUpdateArchiveStudy(NewArchiveStudyCommand incommand, + [FromServices] IRepository _studyMonitorRepository, + [FromServices] IDistributedLockProvider _distributedLockProvider, + [FromServices] IEasyCachingProvider _provider, + [FromServices] IRepository _dicomSeriesRepository, + [FromServices] IRepository _dicomInstanceRepository) + { + try + { + var trialId = incommand.TrialId; + + var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == incommand.StudyMonitorId); + studyMonitor.UploadFinishedTime = DateTime.Now; + studyMonitor.ArchiveFinishedTime = DateTime.Now; + studyMonitor.FailedFileCount = incommand.FailedFileCount; + studyMonitor.IsSuccess = true; + + //上传 + if (studyMonitor.IsDicomReUpload == false) + { + var study = _mapper.Map(incommand.Study); + + var @lock = _distributedLockProvider.CreateLock($"StudyCode"); + + using (await @lock.AcquireAsync()) + { + //查询数据库获取最大的Code 没有记录则为0 + var dbStudyCodeIntMax = _studyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max(); + + //获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增 + var cacheMaxCodeInt = _provider.Get($"{trialId}_{StaticData.CacheKey.StudyMaxCode}").Value; + + int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1; + + study.Code = currentNextCodeInt; + study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy)); + + _provider.Set($"{trialId}_{StaticData.CacheKey.StudyMaxCode}", study.Code, TimeSpan.FromMinutes(30)); + + } + + + study.Id = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString()); + study.TrialId = incommand.TrialId; + study.SiteId = incommand.SiteId; + study.SubjectId = incommand.SubjectId; + study.SubjectVisitId = incommand.SubjectVisitId; + + + //特殊处理逻辑 + study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Distinct()); + SpecialArchiveStudyDeal(study); + + await _studyRepository.AddAsync(study); + + + studyMonitor.StudyId = study.Id; + studyMonitor.StudyCode = study.StudyCode; + + + foreach (var seriesItem in incommand.Study.SeriesList) + { + var series = _mapper.Map(seriesItem); + + series.Id = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, incommand.TrialId.ToString()); + series.StudyId = study.Id; + + series.TrialId = incommand.TrialId; + series.SiteId = incommand.SiteId; + series.SubjectId = incommand.SubjectId; + series.SubjectVisitId = incommand.SubjectVisitId; + + await _dicomSeriesRepository.AddAsync(series); + + foreach (var instanceItem in seriesItem.InstanceList) + { + var isntance = _mapper.Map(instanceItem); + + Guid instanceId = IdentifierHelper.CreateGuid(study.StudyInstanceUid, series.SeriesInstanceUid, isntance.SopInstanceUid, study.TrialId.ToString()); + + isntance.Id = instanceId; + isntance.StudyId = study.Id; + isntance.SeriesId = series.Id; + + isntance.TrialId = incommand.TrialId; + isntance.SiteId = incommand.SiteId; + isntance.SubjectId = incommand.SubjectId; + isntance.SubjectVisitId = incommand.SubjectVisitId; + + await _dicomInstanceRepository.AddAsync(isntance); + } + } + + + + + } + else + { + + var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString()); ; + + var study = await _studyRepository.FirstOrDefaultAsync(t => t.Id == studyId); + + + //特殊处理逻辑 + study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(study.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct()); + SpecialArchiveStudyDeal(study); + + + + // 少了整个序列 + + //某个序列下少了instance + foreach (var seriesItem in incommand.Study.SeriesList) + { + var seriesId = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, trialId.ToString()); + + DicomSeries dicomSeries = await _dicomSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId); + + //判断重复 + if (dicomSeries == null) + { + var series = _mapper.Map(seriesItem); + + series.Id = seriesId; + series.StudyId = study.Id; + + series.TrialId = incommand.TrialId; + series.SiteId = incommand.SiteId; + series.SubjectId = incommand.SubjectId; + series.SubjectVisitId = incommand.SubjectVisitId; + + + dicomSeries = await _dicomSeriesRepository.AddAsync(series); + + //新的序列 那么 检查的序列数量+1 + study.SeriesCount += 1; + } + else + { + //该序列掉了instance + dicomSeries.InstanceCount += seriesItem.InstanceList.Count; + } + + foreach (var instanceItem in seriesItem.InstanceList) + { + var insntance = _mapper.Map(instanceItem); + insntance.Id = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString()); + insntance.StudyId = study.Id; + insntance.SeriesId = dicomSeries.Id; + + insntance.TrialId = incommand.TrialId; + insntance.SiteId = incommand.SiteId; + insntance.SubjectId = incommand.SubjectId; + insntance.SubjectVisitId = incommand.SubjectVisitId; + + await _dicomInstanceRepository.AddAsync(insntance); + } + + + // 不管是新的序列 还是 该序列 掉了Instance 重传的时候 检查的instance 数量都会增加 + study.InstanceCount += seriesItem.InstanceList.Count; + + } + + + } + + var @lock2 = _distributedLockProvider.CreateLock($"StudyCommit"); + + using (await @lock2.AcquireAsync()) + { + await _dicomInstanceRepository.SaveChangesAsync(); + } + } + catch (Exception ex) + { + + return ResponseOutput.NotOk(ex.Message); + } + finally + { + _provider.Remove($"StudyUid_{incommand.TrialId}_{incommand.Study.StudyInstanceUid}"); + } + + + + + + + + return ResponseOutput.Ok(); + } + + private void SpecialArchiveStudyDeal(DicomStudy study) + { + #region 特殊逻辑 + + + if (study.PatientBirthDate.Length == 8) + { + study.PatientBirthDate = $"{study.PatientBirthDate[0]}{study.PatientBirthDate[1]}{study.PatientBirthDate[2]}{study.PatientBirthDate[3]}-{study.PatientBirthDate[4]}{study.PatientBirthDate[5]}-{study.PatientBirthDate[6]}{study.PatientBirthDate[7]}"; + } + + var dicModalityList = _dictionaryRepository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList(); + + + var modality = study.Modalities; + + var modalityForEdit = dicModalityList.Contains(modality) ? modality : String.Empty; + + if (modality == "MR") + { + modalityForEdit = "MRI"; + } + + if (modality == "PT") + { + modalityForEdit = "PET"; + } + if (modality == "PT、CT") + { + modalityForEdit = "PET-CT"; + } + + study.ModalityForEdit = modalityForEdit; + #endregion + } } } diff --git a/IRaCIS.Core.Application/Service/Third-partyProject/_MapConfig.cs b/IRaCIS.Core.Application/Service/Third-partyProject/_MapConfig.cs index 0cbd714ec..582212586 100644 --- a/IRaCIS.Core.Application/Service/Third-partyProject/_MapConfig.cs +++ b/IRaCIS.Core.Application/Service/Third-partyProject/_MapConfig.cs @@ -4,6 +4,7 @@ using DocumentFormat.OpenXml.Spreadsheet; using IRaCIS.Application.Contracts; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Contracts.DTO; +using IRaCIS.Core.Application.Service.Third_partyProject.DTO; using IRaCIS.Core.Application.ViewModel; using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Share; @@ -15,7 +16,11 @@ namespace IRaCIS.Core.Application.Service public UltrasonicDicomConfig() { - + CreateMap() + .ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode)) + .ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code)) + .ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName)) + .ForMember(o => o.FullName, t => t.MapFrom(u => u.DoctorUser.FullName)); } } diff --git a/IRaCIS.Core.Domain/Allocation/VisitTask.cs b/IRaCIS.Core.Domain/Allocation/VisitTask.cs index 73daba8ce..bbc4b3fa8 100644 --- a/IRaCIS.Core.Domain/Allocation/VisitTask.cs +++ b/IRaCIS.Core.Domain/Allocation/VisitTask.cs @@ -426,5 +426,8 @@ namespace IRaCIS.Core.Domain.Models } } + + public int ImageStudyState { get; set; } + } } diff --git a/IRaCIS.Core.Domain/Image/DicomSeries.cs b/IRaCIS.Core.Domain/Image/DicomSeries.cs index 46820e012..4b74fbd7e 100644 --- a/IRaCIS.Core.Domain/Image/DicomSeries.cs +++ b/IRaCIS.Core.Domain/Image/DicomSeries.cs @@ -63,5 +63,7 @@ namespace IRaCIS.Core.Domain.Models public string IamgeResizePath { get; set; }=string.Empty; + public Guid? VisitTaskId { get; set; } + } }