Merge branch '中心影像_Test环境' of http://192.168.1.2:8033/IRaCIS_Core_Api into 中心影像_Test环境
commit
32a7fc3239
|
@ -267,7 +267,7 @@ namespace IRaCIS.Core.API.Controllers
|
|||
[DisableFormValueModelBinding]
|
||||
[DisableRequestSizeLimit]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> ArchiveStudyNew(/*[FromForm] ArchiveStudyCommand archiveStudyCommand,*/ Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId,Guid studyMonitorId,
|
||||
public async Task<IResponseOutput> ArchiveStudyNew(/*[FromForm] ArchiveStudyCommand archiveStudyCommand,*/ Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId, Guid studyMonitorId,
|
||||
[FromServices] ILogger<UploadDownLoadController> _logger,
|
||||
[FromServices] IEasyCachingProvider _provider,
|
||||
[FromServices] IStudyService _studyService,
|
||||
|
@ -301,9 +301,9 @@ namespace IRaCIS.Core.API.Controllers
|
|||
{
|
||||
_provider.Set($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(30));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}"))
|
||||
//{
|
||||
// //---当前已有人正在上传和归档该检查!
|
||||
|
@ -406,7 +406,7 @@ namespace IRaCIS.Core.API.Controllers
|
|||
studyMonitor.IsSuccess = true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -423,7 +423,7 @@ namespace IRaCIS.Core.API.Controllers
|
|||
studyMonitor.StudyCode = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.StudyCode;
|
||||
studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
||||
|
||||
await _studyMonitorRepository.SaveChangesAsync();
|
||||
await _studyMonitorRepository.SaveChangesAsync();
|
||||
}
|
||||
|
||||
|
||||
|
@ -671,24 +671,43 @@ namespace IRaCIS.Core.API.Controllers
|
|||
|
||||
|
||||
|
||||
public class UploadNoneDicomFileCommand
|
||||
{
|
||||
public Guid TrialId { get; set; }
|
||||
public Guid SubjectVisitId { get; set; }
|
||||
public Guid NoneDicomStudyId { get; set; }
|
||||
public Guid StudyMonitorId { get; set; }
|
||||
|
||||
|
||||
public List<OSSFileDTO> UploadedFileList { get; set; } = new List<OSSFileDTO>();
|
||||
|
||||
|
||||
public class OSSFileDTO
|
||||
{
|
||||
public string FilePath { get; set; }
|
||||
public string FileName { get; set; }
|
||||
public int FileFize { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 上传非Dicom 文件 支持压缩包 多文件上传
|
||||
/// </summary>
|
||||
/// <param name="formCollection"></param>
|
||||
/// <param name="subjectVisitId"></param>
|
||||
/// <param name="noneDicomStudyId"></param>
|
||||
/// <param name="studyMonitorId"></param>
|
||||
/// <param name="_noneDicomStudyRepository"></param>
|
||||
/// <returns></returns>
|
||||
//[DisableRequestSizeLimit]
|
||||
[RequestSizeLimit(1_073_741_824)]
|
||||
[HttpPost("NoneDicomStudy/UploadNoneDicomFile/{trialId:guid}/{subjectVisitId:guid}/{noneDicomStudyId:guid}/{studyMonitorId:guid}")]
|
||||
[HttpPost("NoneDicomStudy/UploadNoneDicomFile")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
//[Authorize(Policy = IRaCISPolicy.CRC)]
|
||||
public async Task<IResponseOutput> UploadNoneDicomFile(IFormCollection formCollection, Guid subjectVisitId, Guid noneDicomStudyId, Guid studyMonitorId,
|
||||
public async Task<IResponseOutput> UploadNoneDicomFile(UploadNoneDicomFileCommand incommand,
|
||||
[FromServices] IRepository<NoneDicomStudy> _noneDicomStudyRepository, [FromServices] IRepository<StudyMonitor> _studyMonitorRepository)
|
||||
{
|
||||
|
||||
var subjectVisitId = incommand.SubjectVisitId;
|
||||
var studyMonitorId=incommand.StudyMonitorId;
|
||||
var noneDicomStudyId=incommand.NoneDicomStudyId;
|
||||
|
||||
|
||||
await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
|
||||
|
||||
var sv = (await _repository.Where<SubjectVisit>(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.SiteId, t.SubjectId }).FirstOrDefaultAsync()).IfNullThrowConvertException();
|
||||
|
@ -697,33 +716,24 @@ namespace IRaCIS.Core.API.Controllers
|
|||
|
||||
studyMonitor.UploadFinishedTime = DateTime.Now;
|
||||
|
||||
await FileUploadAsync(async (fileName) =>
|
||||
foreach (var item in incommand.UploadedFileList)
|
||||
{
|
||||
await _repository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, NoneDicomStudyId = noneDicomStudyId });
|
||||
|
||||
var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetNoneDicomFilePath(_hostEnvironment, fileName, sv.TrialId, sv.SiteId, sv.SubjectId, subjectVisitId);
|
||||
|
||||
await _repository.AddAsync(new NoneDicomStudyFile() { FileName = fileRealName, Path = relativePath, NoneDicomStudyId = noneDicomStudyId });
|
||||
|
||||
return serverFilePath;
|
||||
});
|
||||
|
||||
}
|
||||
var uploadFinishedTime = DateTime.Now;
|
||||
|
||||
|
||||
//// 上传非Dicom 后 将状态改为待提交 分为普通上传 和QC后重传 普通上传时才改为待提交
|
||||
//await _repository.UpdatePartialFromQueryAsync<SubjectVisit>(t => t.Id == subjectVisitId && t.SubmitState == SubmitStateEnum.None, u => new SubjectVisit() { SubmitState = SubmitStateEnum.ToSubmit });
|
||||
|
||||
var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync((t => t.Id == noneDicomStudyId));
|
||||
|
||||
noneDicomStudy.FileCount = noneDicomStudy.FileCount + formCollection.Files.Count;
|
||||
noneDicomStudy.FileCount = noneDicomStudy.FileCount + incommand.UploadedFileList.Count;
|
||||
|
||||
studyMonitor.FileCount = formCollection.Files.Count;
|
||||
studyMonitor.FileSize = formCollection.Files.Sum(t => t.Length);
|
||||
studyMonitor.FileCount = incommand.UploadedFileList.Count;
|
||||
studyMonitor.FileSize = incommand.UploadedFileList.Sum(t => t.FileFize);
|
||||
studyMonitor.IsDicom = false;
|
||||
studyMonitor.IsDicomReUpload = false;
|
||||
studyMonitor.StudyId = noneDicomStudyId;
|
||||
studyMonitor.StudyCode = noneDicomStudy.StudyCode;
|
||||
studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
||||
studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
||||
studyMonitor.IP = _userInfo.IP;
|
||||
|
||||
await _repository.SaveChangesAsync();
|
||||
|
@ -752,7 +762,7 @@ namespace IRaCIS.Core.API.Controllers
|
|||
|
||||
if (!fileName.EndsWith(".xlsx") && !fileName.EndsWith(".csv") && !fileName.EndsWith(".xls"))
|
||||
{
|
||||
//---支持.xlsx、.xls、.csv格式的文件上传。
|
||||
//---支持.xlsx、.xls、.csv格式的文件上传。
|
||||
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_SupportedFormats"));
|
||||
}
|
||||
|
||||
|
@ -910,11 +920,11 @@ namespace IRaCIS.Core.API.Controllers
|
|||
|
||||
var dt = DateTime.Now;
|
||||
|
||||
etcCheckList = etcCheckList.Where(t => !(t.Modality == string.Empty || t.SiteCode == string.Empty || t.SubjectCode == string.Empty || t.VisitName == string.Empty || t.StudyDate == string.Empty ||! DateTime.TryParse(t.StudyDate, out dt))).ToList();
|
||||
etcCheckList = etcCheckList.Where(t => !(t.Modality == string.Empty || t.SiteCode == string.Empty || t.SubjectCode == string.Empty || t.VisitName == string.Empty || t.StudyDate == string.Empty || !DateTime.TryParse(t.StudyDate, out dt))).ToList();
|
||||
|
||||
if (etcCheckList.Count == 0)
|
||||
{
|
||||
//---请保证上传数据符合模板文件中的样式,且存在有效数据。
|
||||
//---请保证上传数据符合模板文件中的样式,且存在有效数据。
|
||||
return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_InvalidData"));
|
||||
}
|
||||
|
||||
|
@ -994,7 +1004,7 @@ namespace IRaCIS.Core.API.Controllers
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
|
|
@ -266,14 +266,10 @@
|
|||
<param name="taskMedicalReviewId"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadNoneDicomFile(Microsoft.AspNetCore.Http.IFormCollection,System.Guid,System.Guid,System.Guid,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor})">
|
||||
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadNoneDicomFile(IRaCIS.Core.API.Controllers.StudyController.UploadNoneDicomFileCommand,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor})">
|
||||
<summary>
|
||||
上传非Dicom 文件 支持压缩包 多文件上传
|
||||
</summary>
|
||||
<param name="formCollection"></param>
|
||||
<param name="subjectVisitId"></param>
|
||||
<param name="noneDicomStudyId"></param>
|
||||
<param name="studyMonitorId"></param>
|
||||
<param name="_noneDicomStudyRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
|
|
|
@ -9,6 +9,7 @@ using Microsoft.Extensions.Logging;
|
|||
using Quartz;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
|
||||
namespace IRaCIS.Application.Services.BackGroundJob
|
||||
{
|
||||
|
@ -40,9 +41,12 @@ namespace IRaCIS.Application.Services.BackGroundJob
|
|||
|
||||
if (isInOrder)
|
||||
{
|
||||
Guid id = (Guid)dataMap.Get("SubjectId");
|
||||
Guid subjectId = (Guid)dataMap.Get("SubjectId");
|
||||
|
||||
Guid trialReadingCriterionId = (Guid)dataMap.Get("TrialReadingCriterionId");
|
||||
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectId && t.TrialReadingCriterionId==trialReadingCriterionId, u => new VisitTask() { SubjectCriterionClaimUserId = null });
|
||||
|
||||
await _subjectRepository.UpdatePartialFromQueryAsync(t => t.Id ==id, u => new Subject() { ClaimUserId = null }, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -11841,6 +11841,14 @@
|
|||
</summary>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.ClaimOrCancelSubjectAsync(IRaCIS.Core.Application.ViewModel.ClaimSubjectDto)">
|
||||
<summary>
|
||||
前端 仅仅释放的时候使用,领取是后端调用该方法
|
||||
</summary>
|
||||
<param name="claimSubjectDto"></param>
|
||||
<returns></returns>
|
||||
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Application.Services.ReadingImageTaskService.SubmitTaskChangeState(System.Guid)">
|
||||
<summary>
|
||||
签名提交任务修改状态
|
||||
|
|
|
@ -894,6 +894,8 @@ namespace IRaCIS.Core.Application.ViewModel
|
|||
|
||||
public Guid? VisitTaskId { get; set; }
|
||||
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
|
||||
public Guid SubejctId { get; set; }
|
||||
|
||||
public bool IsClaim { get; set; }
|
||||
|
|
|
@ -17,6 +17,7 @@ using IRaCIS.Core.Infra.EFCore.Common;
|
|||
using System.Linq.Expressions;
|
||||
using IRaCIS.Core.Domain.Share.Reading;
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
|
@ -608,6 +609,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
foreach (var trialReadingCriterionConfig in trialReadingCriterionConfigList)
|
||||
{
|
||||
var trialReadingCriterionId = trialReadingCriterionConfig.TrialReadingCriterionId;
|
||||
|
||||
if (trialReadingCriterionConfig.IsAutoCreate == true)
|
||||
{
|
||||
|
@ -615,8 +617,8 @@ namespace IRaCIS.Core.Application.Service
|
|||
|
||||
var blindTaskName = string.Empty;
|
||||
|
||||
var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList);
|
||||
var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionConfig.TrialReadingCriterionId, clinicalDataConfirmList, subjectVisit.Id, trialId);
|
||||
var isNeedClinicalDataSign = IsNeedClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionId, clinicalDataConfirmList);
|
||||
var isClinicalDataSign = IsClinicalDataSign(ReadingCategory.Visit, subjectVisit.IsBaseLine, trialReadingCriterionId, clinicalDataConfirmList, subjectVisit.Id, trialId);
|
||||
|
||||
|
||||
if (visitNumList.IndexOf(subjectVisit.VisitNum) == 0)
|
||||
|
@ -677,7 +679,7 @@ namespace IRaCIS.Core.Application.Service
|
|||
if (trialReadingCriterionConfig.IsReadingTaskViewInOrder)
|
||||
{
|
||||
//之前有回退到影像上传的访视 那么当前访视一致性核查通过的时候,当前访视生成但是不分配出去(排除失访的)
|
||||
var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
|
||||
var beforeBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.TrialReadingCriterionId== trialReadingCriterionId && t.VisitTaskNum < subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
|
||||
|
||||
|
||||
if (beforeBackVisitTask == null)
|
||||
|
@ -686,11 +688,11 @@ namespace IRaCIS.Core.Application.Service
|
|||
singleTask.SuggesteFinishedTime = GetSuggessFinishTime(true, UrgentType.NotUrget);
|
||||
|
||||
|
||||
var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
|
||||
var followBackVisitTask = await _visitTaskRepository.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.VisitTaskNum > subjectVisit.VisitNum && t.ReadingCategory == ReadingCategory.Visit && t.SourceSubjectVisit.CheckState != CheckStateEnum.CVPassed && t.SourceSubjectVisit.IsLostVisit == false).OrderBy(t => t.VisitTaskNum).FirstOrDefaultAsync();
|
||||
|
||||
//存在退回访视1 又退回基线 这种情况 生成任务 考虑基线先一致性核查通过,但是访视1还未通过时 生成任务
|
||||
var followVisitTaskList = await _visitTaskRepository
|
||||
.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.VisitTaskNum > subjectVisit.VisitNum && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false, true)
|
||||
.Where(t => t.TrialId == trialId && t.SubjectId == subjectVisit.SubjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.VisitTaskNum > subjectVisit.VisitNum && t.SourceSubjectVisit.CheckState == CheckStateEnum.CVPassed && t.ReadingCategory == ReadingCategory.Visit && t.IsAnalysisCreate == false, true)
|
||||
.WhereIf(followBackVisitTask != null, t => t.VisitTaskNum < followBackVisitTask.VisitTaskNum)
|
||||
.ToListAsync();
|
||||
|
||||
|
|
|
@ -609,11 +609,11 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
|||
|
||||
//PI 读基线的时候,subject 如果PI基线没阅片完,SR就不能看
|
||||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.SR && piReadingScopenEnum == PIReadingScopenEnum.AllBaseline,
|
||||
t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect))
|
||||
t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterionId==trialReadingCriterionId))
|
||||
|
||||
//PI 读随访的时候, subject 如果SR基线没阅片完,PI就不能看
|
||||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.PI && piReadingScopenEnum == PIReadingScopenEnum.AllVisit,
|
||||
t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect))
|
||||
t => t.Subject.SubjectVisitTaskList.Any(c => c.SourceSubjectVisit.IsBaseLine == true && c.ReadingTaskState == ReadingTaskState.HaveSigned && c.TaskState == TaskState.Effect && c.TrialReadingCriterionId == trialReadingCriterionId))
|
||||
|
||||
|
||||
|
||||
|
@ -652,13 +652,14 @@ namespace IRaCIS.Core.Application.Service.Allocation
|
|||
.WhereIf(!string.IsNullOrEmpty(inDto.SubjectCode), t => (t.Subject.Code.Contains(inDto.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(inDto.SubjectCode) && t.IsAnalysisCreate));
|
||||
|
||||
|
||||
var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode, x.Subject.ClaimUserId ,x.Subject.ClaimUser.UserName });
|
||||
var visitGroupQuery = visitQuery.GroupBy(x => new { x.SubjectId, x.Subject.Code, x.BlindSubjectCode, x.SubjectCriterionClaimUserId ,x.SubjectCriterionClaimUser.UserName });
|
||||
|
||||
var visitTaskQuery = visitGroupQuery.Select(x => new IRUnReadSubjectView()
|
||||
{
|
||||
SubjectId = x.Key.SubjectId,
|
||||
SubjectCode = x.Key.BlindSubjectCode == string.Empty ? x.Key.Code : x.Key.BlindSubjectCode,
|
||||
ClaimUserId = x.Key.ClaimUserId,
|
||||
|
||||
ClaimUserId = x.Key.SubjectCriterionClaimUserId,
|
||||
ClaimUserName=x.Key.UserName,
|
||||
|
||||
SuggesteFinishedTime = x.Where(y => y.TrialReadingCriterionId == trialReadingCriterionId && y.ReadingTaskState != ReadingTaskState.HaveSigned).Min(x => x.SuggesteFinishedTime),
|
||||
|
|
|
@ -30,6 +30,8 @@ namespace IRaCIS.Core.Application.Contracts
|
|||
public bool IsDeleted { get; set; }
|
||||
public bool IsReading { get; set; } = true;
|
||||
|
||||
public string ImageResizePath { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@
|
|||
public string WindowCenter { get; set; } = string.Empty;
|
||||
public string WindowWidth { get; set; } = string.Empty;
|
||||
|
||||
public string IamgeResizePath { get; set; }
|
||||
public string ImageResizePath { get; set; }
|
||||
}
|
||||
|
||||
public class DicomSeriesWithLabelDTO : DicomSeriesDTO
|
||||
|
|
|
@ -280,7 +280,7 @@ namespace IRaCIS.Core.Application.Contracts
|
|||
public string AcquisitionNumber { get; set; } = string.Empty;
|
||||
public string TriggerTime { get; set; } = string.Empty;
|
||||
|
||||
public string IamgeResizePath { get; set; }=string.Empty;
|
||||
public string ImageResizePath { get; set; }=string.Empty;
|
||||
public List<AddInstanceDto> InstanceList { get; set; }
|
||||
|
||||
|
||||
|
|
|
@ -23,11 +23,15 @@ namespace IRaCIS.Core.Application.Services
|
|||
/// <summary> 指定资源Id,获取Dicom序列所属的实例信息列表 </summary>
|
||||
/// <param name="seriesId"> Dicom序列的Id </param>
|
||||
[HttpGet("{seriesId:guid}")]
|
||||
public async Task<IEnumerable<DicomInstanceDTO>> List(Guid seriesId)
|
||||
public async Task<IResponseOutput<List<DicomInstanceDTO>> > List(Guid seriesId)
|
||||
{
|
||||
return await _instanceRepository.Where(s => s.SeriesId == seriesId).OrderBy(s => s.InstanceNumber).
|
||||
var list= await _instanceRepository.Where(s => s.SeriesId == seriesId).OrderBy(s => s.InstanceNumber).
|
||||
ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime)
|
||||
.ProjectTo<DicomInstanceDTO>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var imageResizePath = await _instanceRepository.Where(s => s.SeriesId == seriesId).Select(t=>t.DicomSerie.ImageResizePath).FirstOrDefaultAsync();
|
||||
|
||||
return ResponseOutput.Ok(list, new { ImageResizePath = imageResizePath });
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ namespace IRaCIS.Core.Application.Services
|
|||
public interface IInstanceService
|
||||
{
|
||||
Task<FileContentResult> Content(Guid instanceId);
|
||||
Task<IEnumerable<DicomInstanceDTO>> List(Guid seriesId);
|
||||
Task<IResponseOutput<List<DicomInstanceDTO>>> List(Guid seriesId);
|
||||
IEnumerable<Guid> List(Guid seriesId, string tpCode, bool? key);
|
||||
Task<FileContentResult> Preview(Guid instanceId);
|
||||
}
|
||||
|
|
|
@ -214,6 +214,10 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||
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;
|
||||
|
||||
|
@ -830,6 +834,13 @@ namespace IRaCIS.Core.Application.Service.ImageAndDoc
|
|||
_provider.Set($"StudyUid_{trialId}_{studyInstanceUid}", _userInfo.Id, TimeSpan.FromSeconds(30));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lock (lockObj)
|
||||
{
|
||||
_provider.Remove($"StudyUid_{trialId}_{studyInstanceUid}");
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -14,7 +14,8 @@ namespace IRaCIS.Core.Application.Service
|
|||
{
|
||||
CreateMap<AddOrUpdateStudyDto, DicomStudy>()
|
||||
.ForMember(d => d.SeriesList, u => u.Ignore());
|
||||
CreateMap<AddOrUpdateSeriesDto, DicomSeries>();
|
||||
CreateMap<AddOrUpdateSeriesDto, DicomSeries>()
|
||||
.ForMember(d => d.DicomInstanceList, u => u.Ignore());
|
||||
CreateMap<AddInstanceDto, DicomInstance>();
|
||||
|
||||
CreateMap<Report, ReportDTO>();
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace IRaCIS.Core.Application.Contracts
|
|||
|
||||
public string FullFilePath => Path;
|
||||
|
||||
public string PreviewPath => "/Common/LocalFilePreview?relativePath=" + Path;
|
||||
public string PreviewPath => Path;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -624,7 +624,7 @@ namespace IRaCIS.Application.Services
|
|||
throw new BusinessValidationFailedException(_localizer["ReadingImage_BeSigned"]);
|
||||
}
|
||||
|
||||
if(await _visitTaskRepository.AnyAsync(x=> x.Id == visitTaskid && x.DoctorUserId != _userInfo.Id && x.Subject.ClaimUserId != _userInfo.Id))
|
||||
if(await _visitTaskRepository.AnyAsync(x=> x.Id == visitTaskid && x.DoctorUserId != _userInfo.Id && x.SubjectCriterionClaimUserId != _userInfo.Id))
|
||||
{
|
||||
throw new BusinessValidationFailedException("当前任务领取人不是你,不允许提交签名");
|
||||
}
|
||||
|
@ -2290,7 +2290,7 @@ namespace IRaCIS.Application.Services
|
|||
if (task != null)
|
||||
{
|
||||
// 有序 自动领取该Subject
|
||||
await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, SubejctId = task.SubjectId, VisitTaskId=task.VisitTaskId, IsInOrder = true });
|
||||
await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, SubejctId = task.SubjectId, TrialReadingCriterionId=task.TrialReadingCriterionId, VisitTaskId=task.VisitTaskId, IsInOrder = true });
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -2315,8 +2315,8 @@ namespace IRaCIS.Application.Services
|
|||
|
||||
if (task != null)
|
||||
{
|
||||
// 无序 自动领取该Subject
|
||||
await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, VisitTaskId = task.VisitTaskId, IsInOrder = false });
|
||||
// 无序
|
||||
await ClaimOrCancelSubjectAsync(new ClaimSubjectDto() { IsClaim = true, VisitTaskId = task.VisitTaskId, IsInOrder = false });
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2448,26 +2448,34 @@ namespace IRaCIS.Application.Services
|
|||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 前端 仅仅释放的时候使用,领取是后端调用该方法
|
||||
/// </summary>
|
||||
/// <param name="claimSubjectDto"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||
[HttpPost]
|
||||
public async Task ClaimOrCancelSubjectAsync(ClaimSubjectDto claimSubjectDto)
|
||||
{
|
||||
IScheduler scheduler = await _schedulerFactory.GetScheduler();
|
||||
|
||||
//有序 用SubjectCriterionClaimUserId 某个标准的所有任务,该字段保持一致
|
||||
if (claimSubjectDto.IsInOrder)
|
||||
{
|
||||
|
||||
if (claimSubjectDto.IsClaim)
|
||||
{
|
||||
|
||||
if(_subjectRepository.Any(t=>t.Id== claimSubjectDto.SubejctId && t.ClaimUserId != _userInfo.Id && t.ClaimUserId!=null))
|
||||
//每个subject 每个标准的领取放在 任务上 免得加表
|
||||
if(_visitTaskRepository.Any(t=>t.Id== claimSubjectDto.SubejctId && t.TrialReadingCriterionId==claimSubjectDto.TrialReadingCriterionId
|
||||
&& t.SubjectCriterionClaimUserId != _userInfo.Id && t.SubjectCriterionClaimUserId != null))
|
||||
{
|
||||
throw new BusinessValidationFailedException("当前任务已被其他人领取,请进行其他的阅片任务");
|
||||
}
|
||||
else
|
||||
{
|
||||
await _subjectRepository.UpdatePartialFromQueryAsync(t => t.Id == claimSubjectDto.SubejctId, u => new Subject() { ClaimUserId = _userInfo.Id }, true);
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == claimSubjectDto.SubejctId && t.TrialReadingCriterionId == claimSubjectDto.TrialReadingCriterionId , u => new VisitTask() { SubjectCriterionClaimUserId = _userInfo.Id });
|
||||
|
||||
//列表可以看到当前阅片人是谁
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.Id == claimSubjectDto.VisitTaskId, u => new VisitTask() { DoctorUserId = _userInfo.Id });
|
||||
|
||||
}
|
||||
|
@ -2478,6 +2486,7 @@ namespace IRaCIS.Application.Services
|
|||
IJobDetail job = JobBuilder.Create<CancelTaskQuartZJob>()
|
||||
|
||||
.UsingJobData("SubjectId", claimSubjectDto.SubejctId) // 传递GUID参数给任务
|
||||
.UsingJobData("TrialReadingCriterionId", claimSubjectDto.TrialReadingCriterionId)
|
||||
.UsingJobData("IsInOrder", claimSubjectDto.IsInOrder)
|
||||
.Build();
|
||||
|
||||
|
@ -2494,9 +2503,10 @@ namespace IRaCIS.Application.Services
|
|||
}
|
||||
else
|
||||
{
|
||||
await _subjectRepository.UpdatePartialFromQueryAsync(t => t.Id == claimSubjectDto.SubejctId, u => new Subject() { ClaimUserId = null }, true);
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == claimSubjectDto.SubejctId && t.TrialReadingCriterionId == claimSubjectDto.TrialReadingCriterionId , u => new VisitTask() { SubjectCriterionClaimUserId = null });
|
||||
}
|
||||
}
|
||||
//无序 直接用DoctorUserId 当做领取人
|
||||
else
|
||||
{
|
||||
if (claimSubjectDto.IsClaim)
|
||||
|
|
|
@ -180,11 +180,11 @@ namespace IRaCIS.Application.Services
|
|||
[AllowAnonymous]
|
||||
public async Task<object> GetEnvironmentName([FromServices] IWebHostEnvironment env)
|
||||
{
|
||||
var a = IdentifierHelper.CreateGuid("123456");
|
||||
var a = IdentifierHelper.CreateGuid("1.2.840.113619.2.416.3358551739363725609857319676326094825431.2.840.113619.2.80.2338912612.50499.1563432834.1.4.11.2.840.113619.2.80.2338912612.50499.1563432835.4b8340000-3e2c-0016-fbdd-08db883b137f");
|
||||
|
||||
var k = MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("123456"));
|
||||
|
||||
var c = MD5Helper.Md5("123456");
|
||||
var c = MD5Helper.Md5("1.2.840.113619.2.416.3358551739363725609857319676326094825431.2.840.113619.2.80.2338912612.50499.1563432834.1.4.11.2.840.113619.2.80.2338912612.50499.1563432835.4b8340000-3e2c-0016-fbdd-08db883b137f");
|
||||
|
||||
|
||||
//update DicomInstance set Path = '/IRaCISData/TrialData/' + cast(DicomInstance.TrialId as varchar) + '/' + DicomInstance.SiteId + '/' + DicomInstance.SubjectId + '/' + DicomInstance.SubjectVisitId + '/Dicom/' + DicomInstance.StudyId + '/' + DicomInstance.Id + '.dcm'
|
||||
|
||||
|
|
|
@ -31,13 +31,15 @@ namespace IRaCIS.Core.Application.Triggers
|
|||
{
|
||||
var visitTask = context.Entity;
|
||||
|
||||
|
||||
|
||||
if (visitTask.SignTime != null && visitTask.ReadingTaskState == ReadingTaskState.HaveSigned
|
||||
&& _subjectRepository.Where(t=>t.Id==visitTask.SubjectId).SelectMany(c=>c.SubjectVisitList)
|
||||
.Any(t=>t.Id==visitTask.SourceSubjectVisitId && t.IsBaseLine))
|
||||
{
|
||||
|
||||
await _subjectRepository.BatchUpdateNoTrackingAsync(t => t.Id == visitTask.SubjectId , t=>new Subject() { ClaimUserId=null});
|
||||
//&& _subjectRepository.Where(t=>t.Id==visitTask.SubjectId).SelectMany(c=>c.SubjectVisitList)
|
||||
//.Any(t=>t.Id==visitTask.SourceSubjectVisitId && t.IsBaseLine)
|
||||
)
|
||||
{
|
||||
//任务阅片完成 自动释放
|
||||
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == visitTask.SubjectId && t.TrialReadingCriterionId==visitTask.TrialReadingCriterionId , t=>new VisitTask() { SubjectCriterionClaimUserId=null});
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -469,6 +469,10 @@ namespace IRaCIS.Core.Domain.Models
|
|||
public Guid? LatestReplyUserId { get;set; }
|
||||
public DateTime? LatestReplyTime { get; set; }
|
||||
|
||||
public User SubjectCriterionClaimUser { get; set; }
|
||||
|
||||
public Guid? SubjectCriterionClaimUserId { get; set; }
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace IRaCIS.Core.Domain.Models
|
|||
public bool IsDeleted {get;set;}
|
||||
public bool IsReading { get; set; } = true;
|
||||
|
||||
public string IamgeResizePath { get; set; }=string.Empty;
|
||||
public string ImageResizePath { get; set; }=string.Empty;
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -116,11 +116,6 @@ namespace IRaCIS.Core.Domain.Models
|
|||
public List<ClinicalForm> ClinicalFormList { get; set; }
|
||||
|
||||
|
||||
public Guid? ClaimUserId { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public User ClaimUser { get; set;}
|
||||
|
||||
//是否分配了读片医生
|
||||
//public bool IsAssignDoctorUser{get;set;}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue