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; }
+
}
}