Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC
commit
658ce479eb
|
@ -8578,6 +8578,59 @@
|
|||
<param name="inDto"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.GetTrialList(IRaCIS.Core.Application.Contracts.TrialToBeDoneQuery)">
|
||||
<summary>
|
||||
项目列表
|
||||
</summary>
|
||||
<param name="inQuery"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.GetVisitTaskList(IRaCIS.Core.Application.Service.Third_partyProject.DTO.VisitTaskQuery_UltrasonicDicom)">
|
||||
<summary>
|
||||
任务列表 第一层级
|
||||
</summary>
|
||||
<param name="queryVisitTask"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.GetDicomAndNoneDicomStudyList(System.Guid,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.VisitTask})">
|
||||
<summary>
|
||||
检查列表 第二层级
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.UpdateTaskImageState(IRaCIS.Core.Application.Service.Third_partyProject.DTO.UpdateTaskImageStateCommand)">
|
||||
<summary>
|
||||
修改任务上的 影像上传状态
|
||||
</summary>
|
||||
<param name="command"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.GetStudyModalityList(System.Guid)">
|
||||
<summary>
|
||||
通过任务Id 获取检查模态下拉框
|
||||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.GetStudyModalityOSSPath(System.Collections.Generic.List{System.Guid},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries})">
|
||||
<summary>
|
||||
通过选择的序列Id 数组,获取下面的Instance 路径
|
||||
</summary>
|
||||
<param name="seriesIdList"></param>
|
||||
<param name="_dicomSeriesRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.Application.Service.Third_partyProject.UltrasonicDicomService.AddOrUpdateArchiveStudy(IRaCIS.Core.Application.Contracts.NewArchiveStudyCommand,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor},Medallion.Threading.IDistributedLockProvider,EasyCaching.Core.IEasyCachingProvider,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomSeries},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.DicomInstance})">
|
||||
<summary>
|
||||
归档接口 -new 一份 序列层级增加了一个参数VisitTaskId 用于绑定从TomTec拉取来的序列(两个人公用的影像,不应该绑定)
|
||||
</summary>
|
||||
<param name="incommand"></param>
|
||||
<param name="_studyMonitorRepository"></param>
|
||||
<param name="_distributedLockProvider"></param>
|
||||
<param name="_provider"></param>
|
||||
<param name="_dicomSeriesRepository"></param>
|
||||
<param name="_dicomInstanceRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="T:IRaCIS.Core.Application.Service.TrialExternalUserService">
|
||||
<summary>
|
||||
项目外部人员 录入流程相关
|
||||
|
|
|
@ -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<AddInstanceDto> InstanceList { get; set; }
|
||||
|
||||
|
||||
public Guid? VisitTaskId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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<SeriesModality> SeriesModalityList { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class StudySeriesModalitySelectDTO
|
||||
{
|
||||
public Guid StudyId { get; set; }
|
||||
|
||||
public List<Guid> SeriesIdList { get; set; }
|
||||
}
|
||||
|
||||
public class SeriesModality
|
||||
{
|
||||
public Guid SeriesId { get; set; }
|
||||
|
||||
public string Modality { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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<Trial> _trialRepository;
|
||||
public readonly IRepository<DicomStudy> _studyRepository;
|
||||
private readonly IRepository<Dictionary> _dictionaryRepository;
|
||||
public readonly IRepository<VisitTask> _visitTaskRepository;
|
||||
|
||||
public UltrasonicDicomService(IRepository<Trial> trialRepository)
|
||||
|
||||
public UltrasonicDicomService(IRepository<Trial> trialRepository, IRepository<DicomStudy> studyRepository, IRepository<VisitTask> visitTaskRepository, IRepository<Dictionary> dictionaryRepository)
|
||||
{
|
||||
_trialRepository = trialRepository;
|
||||
_studyRepository = studyRepository;
|
||||
_visitTaskRepository = visitTaskRepository;
|
||||
_dictionaryRepository = dictionaryRepository;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 项目列表
|
||||
/// </summary>
|
||||
/// <param name="inQuery"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput<PageOutput<TrialToBeDoneDto>>> GetTrialToBeDoneList(TrialToBeDoneQuery inQuery,
|
||||
[FromServices] IRepository<TaskMedicalReview> _taskMedicalReviewRepository)
|
||||
public async Task<IResponseOutput<PageOutput<TrialListDTO_UltrasonicDicom>>> 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<TrialDetailDTO>(_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);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 任务列表 第一层级
|
||||
/// </summary>
|
||||
/// <param name="queryVisitTask"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<VisitTaskDTO_UltrasonicDicom>> 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<VisitTaskDTO_UltrasonicDicom>(_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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检查列表 第二层级
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<List<StudyDTO_UltrasonicDicom>> GetDicomAndNoneDicomStudyList(Guid visiTaskId, [FromServices] IRepository<VisitTask> _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();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 修改任务上的 影像上传状态
|
||||
/// </summary>
|
||||
/// <param name="command"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPut]
|
||||
public async Task<IResponseOutput> UpdateTaskImageState(UpdateTaskImageStateCommand command)
|
||||
{
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.Id == command.VisitTaskId, u => new VisitTask() { ImageStudyState = command.ImageStudyState });
|
||||
|
||||
return ResponseOutput.Ok();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 通过任务Id 获取检查模态下拉框
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<StudySeriesModality>> 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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 通过选择的序列Id 数组,获取下面的Instance 路径
|
||||
/// </summary>
|
||||
/// <param name="seriesIdList"></param>
|
||||
/// <param name="_dicomSeriesRepository"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<string>> GetStudyModalityOSSPath(List<Guid> seriesIdList, [FromServices] IRepository<DicomSeries> _dicomSeriesRepository)
|
||||
{
|
||||
return await _dicomSeriesRepository.Where(t => seriesIdList.Contains(t.Id)).SelectMany(t => t.DicomInstanceList).Select(t => t.Path).ToListAsync();
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 归档接口 -new 一份 序列层级增加了一个参数VisitTaskId 用于绑定从TomTec拉取来的序列(两个人公用的影像,不应该绑定)
|
||||
/// </summary>
|
||||
/// <param name="incommand"></param>
|
||||
/// <param name="_studyMonitorRepository"></param>
|
||||
/// <param name="_distributedLockProvider"></param>
|
||||
/// <param name="_provider"></param>
|
||||
/// <param name="_dicomSeriesRepository"></param>
|
||||
/// <param name="_dicomInstanceRepository"></param>
|
||||
/// <returns></returns>
|
||||
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> AddOrUpdateArchiveStudy(NewArchiveStudyCommand incommand,
|
||||
[FromServices] IRepository<StudyMonitor> _studyMonitorRepository,
|
||||
[FromServices] IDistributedLockProvider _distributedLockProvider,
|
||||
[FromServices] IEasyCachingProvider _provider,
|
||||
[FromServices] IRepository<DicomSeries> _dicomSeriesRepository,
|
||||
[FromServices] IRepository<DicomInstance> _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<DicomStudy>(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<int>($"{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<int>($"{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<DicomSeries>(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<DicomInstance>(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<DicomSeries>(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<DicomInstance>(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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<VisitTask, VisitTaskDTO_UltrasonicDicom>()
|
||||
.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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -426,5 +426,8 @@ namespace IRaCIS.Core.Domain.Models
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public int ImageStudyState { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,5 +63,7 @@ namespace IRaCIS.Core.Domain.Models
|
|||
|
||||
public string IamgeResizePath { get; set; }=string.Empty;
|
||||
|
||||
public Guid? VisitTaskId { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue