2274 lines
		
	
	
		
			107 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			2274 lines
		
	
	
		
			107 KiB
		
	
	
	
		
			C#
		
	
	
using DocumentFormat.OpenXml.EMMA;
 | 
						||
using FellowOakDicom;
 | 
						||
using FellowOakDicom.Media;
 | 
						||
using IRaCIS.Core.Application.Contracts;
 | 
						||
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
 | 
						||
using IRaCIS.Core.Application.Filter;
 | 
						||
using IRaCIS.Core.Application.Helper;
 | 
						||
using IRaCIS.Core.Application.Service.ImageAndDoc.DTO;
 | 
						||
using IRaCIS.Core.Application.Service.Reading.Dto;
 | 
						||
using IRaCIS.Core.Domain.Models;
 | 
						||
using IRaCIS.Core.Domain.Share;
 | 
						||
using IRaCIS.Core.Infra.EFCore.Common;
 | 
						||
using IRaCIS.Core.Infrastructure;
 | 
						||
using MassTransit;
 | 
						||
using MassTransit.Initializers;
 | 
						||
using Medallion.Threading;
 | 
						||
using Microsoft.AspNetCore.Mvc;
 | 
						||
using NetTopologySuite.Mathematics;
 | 
						||
using Newtonsoft.Json;
 | 
						||
using NPOI.SS.Formula.Functions;
 | 
						||
using System.Data;
 | 
						||
using System.IO;
 | 
						||
using System.IO.Compression;
 | 
						||
using System.Text;
 | 
						||
using System.Web;
 | 
						||
using ZiggyCreatures.Caching.Fusion;
 | 
						||
 | 
						||
namespace IRaCIS.Core.Application.Service.ImageAndDoc
 | 
						||
{
 | 
						||
    public interface IDownloadAndUploadService
 | 
						||
    {
 | 
						||
        Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true);
 | 
						||
 | 
						||
        Task<IResponseOutput> SubejctRandomReadingTaskNameDeal(Guid subjectId, Guid trialReadingCriterionId);
 | 
						||
    }
 | 
						||
 | 
						||
    [ApiExplorerSettings(GroupName = "Trial")]
 | 
						||
    public class DownloadAndUploadService(IRepository<SystemAnonymization> _systemAnonymizationRepository, IRepository<DicomStudy> _dicomStudyRepository,
 | 
						||
        IRepository<VisitTask> _visitTaskRepository,
 | 
						||
        IRepository<SubjectVisit> _subjectVisitRepository,
 | 
						||
        IOSSService _oSSService,
 | 
						||
        IRepository<Dictionary> _dictionaryRepository,
 | 
						||
        IRepository<Trial> _trialRepository,
 | 
						||
        IRepository<StudyMonitor> _studyMonitorRepository,
 | 
						||
        IRepository<TaskStudy> _taskStudyRepository,
 | 
						||
        IRepository<TaskSeries> _taskSeriesRepository,
 | 
						||
        IRepository<TaskInstance> _taskInstanceRepository,
 | 
						||
        IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrialRepository,
 | 
						||
        IRepository<NoneDicomStudy> _noneDicomStudyReposiotry,
 | 
						||
        IRepository<NoneDicomStudyFile> _noneDicomStudyFileReposiotry,
 | 
						||
        IDistributedLockProvider _distributedLockProvider,
 | 
						||
        IRepository<TrialImageDownload> _trialImageDownloadRepository,
 | 
						||
        IRepository<Subject> _subjectRepository,
 | 
						||
        IMapper _mapper, IUserInfo _userInfo, IStringLocalizer _localizer, IFusionCache _fusionCache) : BaseService, IDownloadAndUploadService
 | 
						||
    {
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 受试者随机阅片,任务进行随机编号
 | 
						||
        /// 进入阅片任务前,随机挑选出该受试者的一个任务,然后给该任务一个编号,编号给的逻辑是:TimePoint Ran+ 已阅任务数量+1
 | 
						||
        /// 根据当前受试者该标准已阅任务数量(生效失效的任务都算,考虑重阅,最后编号不重复)  第一个就是TimePoint Ran1,后面依次随机挑选出来的阅片序号依次递增
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="subjectId"></param>
 | 
						||
        /// <param name="trialReadingCriterionId"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        public async Task<IResponseOutput> SubejctRandomReadingTaskNameDeal(Guid subjectId, Guid trialReadingCriterionId)
 | 
						||
        {
 | 
						||
            //subject 随机阅片  或者无序 有上传 才处理任务编号
 | 
						||
            if (_visitTaskRepository.Any(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId &&
 | 
						||
           (t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.SubjectRandom ||
 | 
						||
           (t.TrialReadingCriterion.IsReadingTaskViewInOrder == ReadingOrder.Random && t.TrialReadingCriterion.ImageDownloadEnum != ReadingImageDownload.None))))
 | 
						||
            {
 | 
						||
                //找到 非一致性分析,未签名,状态正常的 并且任务名称是TimePoint的 任务
 | 
						||
                var needDealTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.UserRoleId
 | 
						||
                   && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.TaskBlindName == "Timepoint" && t.ReadingCategory == ReadingCategory.Visit
 | 
						||
                   && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze), true).ToListAsync();
 | 
						||
 | 
						||
                if (needDealTaskList.Count > 0)
 | 
						||
                {
 | 
						||
                    //已完成的访视任务数量(包含重阅的)
 | 
						||
                    var haveFinishedTaskCount = await _visitTaskRepository.CountAsync(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.UserRoleId
 | 
						||
                    && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.ReadingCategory == ReadingCategory.Visit);
 | 
						||
 | 
						||
                    //已经处理过的任务名称的数量
 | 
						||
 | 
						||
                    var haveDealedTaskList = await _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == trialReadingCriterionId && t.IsAnalysisCreate == false && t.DoctorUserId == _userInfo.UserRoleId
 | 
						||
                    && t.ReadingTaskState != ReadingTaskState.HaveSigned && t.ReadingCategory == ReadingCategory.Visit && t.TaskBlindName != "Timepoint").Select(t => new { t.TaskBlindName, t.SourceSubjectVisitId, t.SouceReadModuleId }).ToListAsync();
 | 
						||
 | 
						||
 | 
						||
                    //随机赋值编号  比如要处理5个任务,实例化一个包含1-5的数组,每次随机取出一个
 | 
						||
                    List<int> availableNumbers = Enumerable.Range(haveDealedTaskList.Count + haveFinishedTaskCount + 1, needDealTaskList.Count).ToList();
 | 
						||
                    Random rng = new Random();
 | 
						||
                    foreach (var visitTask in needDealTaskList)
 | 
						||
                    {
 | 
						||
                        int randomIndex = rng.Next(availableNumbers.Count);
 | 
						||
 | 
						||
                        var findOldTask = haveDealedTaskList.Where(t => t.SourceSubjectVisitId == visitTask.SourceSubjectVisitId && t.SouceReadModuleId == visitTask.SouceReadModuleId).FirstOrDefault();
 | 
						||
 | 
						||
                        if (findOldTask != null)
 | 
						||
                        {
 | 
						||
                            visitTask.TaskBlindName = findOldTask.TaskBlindName;
 | 
						||
                        }
 | 
						||
                        else
 | 
						||
                        {
 | 
						||
                            visitTask.TaskBlindName = $"Timepoint Ran {availableNumbers[randomIndex]}";
 | 
						||
                        }
 | 
						||
 | 
						||
                        availableNumbers.RemoveAt(randomIndex);
 | 
						||
                    }
 | 
						||
                    await _visitTaskRepository.SaveChangesAsync();
 | 
						||
                }
 | 
						||
            }
 | 
						||
            return ResponseOutput.Ok();
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 获取该受试者任务上传列表(展示已上传情况)
 | 
						||
        /// </summary>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<List<SubjectImageUploadDTO>>> GetSubjectImageUploadList(IRUploadStudyQuery inQuery)
 | 
						||
        {
 | 
						||
 | 
						||
            //要根据标准阅片顺序,确定是否查询单个任务的,还是查询所有的
 | 
						||
            var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
 | 
						||
                 .Select(t => new { t.IsReadingTaskViewInOrder, t.Trial.Modalitys }).FirstNotNullAsync();
 | 
						||
 | 
						||
            var subjectCode = string.Empty;
 | 
						||
            var subjectId = inQuery.SubjectId;
 | 
						||
 | 
						||
            if (criterionInfo.IsReadingTaskViewInOrder == ReadingOrder.Random)
 | 
						||
            {
 | 
						||
                if (inQuery.VisitTaskId == null)
 | 
						||
                {
 | 
						||
                    throw new Exception("无序阅片,前端参数传递错误");
 | 
						||
                }
 | 
						||
                //考虑到一致性分析,必须要这个编号进行过滤
 | 
						||
                var taskInfo = _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => new
 | 
						||
                {
 | 
						||
                    SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
 | 
						||
                    SubjectId = t.SubjectId,
 | 
						||
                }).FirstOrDefault();
 | 
						||
                subjectId = taskInfo.SubjectId;
 | 
						||
                subjectCode = taskInfo.SubjectCode;
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                if (inQuery.SubjectId == null || inQuery.SubjectCode == null)
 | 
						||
                {
 | 
						||
                    throw new Exception("有序阅片,前端参数传递错误");
 | 
						||
                }
 | 
						||
 | 
						||
                //考虑到一致性分析,必须要这个编号进行过滤
 | 
						||
                subjectCode = inQuery.SubjectCode;
 | 
						||
            }
 | 
						||
 | 
						||
            await SubejctRandomReadingTaskNameDeal((Guid)subjectId, inQuery.TrialReadingCriterionId);
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId && t.SourceSubjectVisitId != null
 | 
						||
            && t.DoctorUserId == _userInfo.UserRoleId && t.TaskState == TaskState.Effect)
 | 
						||
                //满足 有序,或者随机只看到当前任务的dicom 非dicom检查
 | 
						||
                .WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
 | 
						||
                .Select(u => new SubjectImageUploadDTO()
 | 
						||
                {
 | 
						||
                    VisitTaskId = u.Id,
 | 
						||
 | 
						||
                    SubejctId = u.SubjectId,
 | 
						||
 | 
						||
                    TrialSiteId = u.Subject.TrialSiteId,
 | 
						||
 | 
						||
                    IsImageFilter = u.TrialReadingCriterion.IsImageFilter,
 | 
						||
 | 
						||
                    CriterionModalitys = u.TrialReadingCriterion.CriterionModalitys,
 | 
						||
 | 
						||
                    SubjectCode = u.IsAnalysisCreate == true ? u.BlindSubjectCode : u.Subject.Code,
 | 
						||
                    TaskBlindName = u.TaskBlindName,
 | 
						||
                    TaskName = u.TaskName,
 | 
						||
                    ReadingTaskState = u.ReadingTaskState,
 | 
						||
 | 
						||
                    SourceSubjectVisitId = u.SourceSubjectVisitId,
 | 
						||
 | 
						||
                    OrginalStudyList = u.SourceSubjectVisit.StudyList
 | 
						||
                    .Where(t => u.TrialReadingCriterion.IsImageFilter ? ("|" + u.TrialReadingCriterion.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
 | 
						||
                    .Select(t => new StudyBasicInfo()
 | 
						||
                    {
 | 
						||
                        Id = t.Id,
 | 
						||
                        StudyInstanceUid = t.StudyInstanceUid,
 | 
						||
                        ModalityForEdit = t.ModalityForEdit,
 | 
						||
                        BodyPartExamined = t.BodyPartExamined,
 | 
						||
                        BodyPartForEdit = t.BodyPartForEdit,
 | 
						||
                        BodyPartForEditOther = t.BodyPartForEditOther,
 | 
						||
 | 
						||
                        StudyCode = t.StudyCode,
 | 
						||
                        StudyTime = t.StudyTime,
 | 
						||
                        Description = t.Description,
 | 
						||
                        InstanceCount = t.InstanceCount,
 | 
						||
                        Modalities = t.Modalities,
 | 
						||
                        SeriesCount = t.SeriesCount,
 | 
						||
 | 
						||
                        ReadingInstanceCount = t.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading).Count(),
 | 
						||
                        ReadingSeriesCount = t.SeriesList.Where(t => t.IsReading).Count(),
 | 
						||
                    }).ToList(),
 | 
						||
 | 
						||
                    UploadStudyList = u.TaskStudyList.Select(t => new StudyBasicInfo()
 | 
						||
                    {
 | 
						||
                        Id = t.Id,
 | 
						||
                        StudyInstanceUid = t.StudyInstanceUid,
 | 
						||
                        ModalityForEdit = t.ModalityForEdit,
 | 
						||
                        BodyPartExamined = t.BodyPartExamined,
 | 
						||
                        BodyPartForEdit = t.BodyPartForEdit,
 | 
						||
                        BodyPartForEditOther = t.BodyPartForEditOther,
 | 
						||
 | 
						||
                        StudyCode = t.StudyCode,
 | 
						||
                        StudyTime = t.StudyTime,
 | 
						||
                        Description = t.Description,
 | 
						||
                        InstanceCount = t.InstanceCount,
 | 
						||
                        Modalities = t.Modalities,
 | 
						||
                        SeriesCount = t.SeriesCount,
 | 
						||
 | 
						||
                        SopInstanceUidList = t.InstanceList.Select(t => t.SopInstanceUid).ToList(),
 | 
						||
 | 
						||
                        ReadingInstanceCount = t.InstanceCount,
 | 
						||
                        ReadingSeriesCount = t.SeriesCount,
 | 
						||
 | 
						||
                    }).ToList()
 | 
						||
                })
 | 
						||
                ;
 | 
						||
            //var test = await query.ToListAsync();
 | 
						||
 | 
						||
            var list = await query.Where(t => t.SubjectCode == subjectCode).ToListAsync();
 | 
						||
 | 
						||
 | 
						||
            return ResponseOutput.Ok(list, new { TrialModality = criterionInfo.Modalitys });
 | 
						||
        }
 | 
						||
 | 
						||
        private void SpecialArchiveStudyDeal(TaskStudy 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
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        [TrialGlobalLimit("AfterStopCannNotOpt")]
 | 
						||
 | 
						||
        public async Task<IResponseOutput> PreArchiveDicomStudy(PriArchiveTaskStudyCommand preArchiveStudyCommand)
 | 
						||
        {
 | 
						||
 | 
						||
            var studyMonitor = new StudyMonitor()
 | 
						||
            {
 | 
						||
                TrialId = preArchiveStudyCommand.TrialId,
 | 
						||
                SubjectId = preArchiveStudyCommand.SubjectId,
 | 
						||
                SubjectVisitId = preArchiveStudyCommand.SubjectVisitId,
 | 
						||
                IsSuccess = false,
 | 
						||
                UploadStartTime = DateTime.Now,
 | 
						||
                IsDicom = true,
 | 
						||
                IP = _userInfo.IP,
 | 
						||
                FileCount = preArchiveStudyCommand.FileCount,
 | 
						||
            };
 | 
						||
 | 
						||
 | 
						||
            var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true);
 | 
						||
 | 
						||
            return ResponseOutput.Ok(addEntity.Id);
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 在调用预归档前验证 这些检查是否可以全新上传还是已存在补充 目前前端允许  IsAllowUpload==true 全新、IsAllowReUpload==true 补充的study   ,全部丢到后端,后端判断存在,就删除之前的检查,全新插入
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inCommand"></param>
 | 
						||
        /// <param name="_dicomStudyRepository"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        public async Task<List<TaskStudyArchiveConfirmResult>> VerifyIRStudyAllowUpload(TaskStudyAchivePreConfirmCommand inCommand, [FromServices] IRepository<DicomStudy> _dicomStudyRepository)
 | 
						||
        {
 | 
						||
 | 
						||
            var currentUploadSubjectVisitId = inCommand.VisitTaskId == null ? null : _visitTaskRepository.Where(t => t.Id == inCommand.VisitTaskId).Select(t => t.SourceSubjectVisitId).FirstOrDefault();
 | 
						||
 | 
						||
            //重阅任务排除
 | 
						||
            var notAllowedUidList1 = _taskStudyRepository.Where(t => t.TrialId == inCommand.TrialId && t.VisitTask.TaskState == TaskState.Effect && inCommand.StudyInstanceUidList.Contains(t.StudyInstanceUid)).Select(t => new
 | 
						||
            {
 | 
						||
                t.StudyInstanceUid,
 | 
						||
                t.SubjectId,
 | 
						||
                SubjectVisitId = t.VisitTask.SourceSubjectVisitId,
 | 
						||
                SubejectCode = t.VisitTask.IsAnalysisCreate ? t.VisitTask.BlindSubjectCode : t.Subject.Code,
 | 
						||
                VisitTaskId = (Guid?)t.VisitTaskId
 | 
						||
            }).ToList();
 | 
						||
 | 
						||
            var notAllowedUidList2 = _dicomStudyRepository.Where(t => t.TrialId == inCommand.TrialId && inCommand.StudyInstanceUidList.Contains(t.StudyInstanceUid)).Select(t => new
 | 
						||
            {
 | 
						||
                t.StudyInstanceUid,
 | 
						||
                t.SubjectId,
 | 
						||
                SubjectVisitId = (Guid?)t.SubjectVisitId,
 | 
						||
                SubejectCode = t.Subject.Code,
 | 
						||
                VisitTaskId = (Guid?)null
 | 
						||
            }).ToList();
 | 
						||
 | 
						||
            var notAllowedUidList = notAllowedUidList1.Union(notAllowedUidList2);
 | 
						||
 | 
						||
            var result = new List<TaskStudyArchiveConfirmResult>();
 | 
						||
 | 
						||
            foreach (var studyUid in inCommand.StudyInstanceUidList)
 | 
						||
            {
 | 
						||
                var findStudy = notAllowedUidList.Where(t => t.StudyInstanceUid == studyUid).FirstOrDefault();
 | 
						||
                if (findStudy != null)
 | 
						||
                {
 | 
						||
 | 
						||
                    //同一个subject 同一份影响
 | 
						||
                    if (findStudy.SubejectCode == inCommand.SubjectCode && findStudy.SubjectId == inCommand.SubjectId)
 | 
						||
                    {
 | 
						||
                        //上传给后处理其他访视了
 | 
						||
                        if (inCommand.VisitTaskId != null && findStudy.VisitTaskId != null && findStudy.VisitTaskId != inCommand.VisitTaskId && findStudy.SubjectVisitId != currentUploadSubjectVisitId)
 | 
						||
                        {
 | 
						||
                            result.Add(new TaskStudyArchiveConfirmResult() { StudyInstanceUid = studyUid, IsAllowReUpload = false, IsAllowUpload = false });
 | 
						||
                        }
 | 
						||
                        //在原始crc 里面上传了,并且不是当前访视
 | 
						||
                        else if (inCommand.VisitTaskId != null && findStudy.VisitTaskId == null && findStudy.SubjectVisitId != currentUploadSubjectVisitId)
 | 
						||
                        {
 | 
						||
                            result.Add(new TaskStudyArchiveConfirmResult() { StudyInstanceUid = studyUid, IsAllowReUpload = false, IsAllowUpload = false });
 | 
						||
                        }
 | 
						||
                        else
 | 
						||
                        {
 | 
						||
                            result.Add(new TaskStudyArchiveConfirmResult() { StudyInstanceUid = studyUid, IsAllowReUpload = true });
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        result.Add(new TaskStudyArchiveConfirmResult() { StudyInstanceUid = studyUid, IsAllowReUpload = false, IsAllowUpload = false });
 | 
						||
                    }
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    //说明没上传 不用管
 | 
						||
                    result.Add(new TaskStudyArchiveConfirmResult() { StudyInstanceUid = studyUid, IsAllowUpload = true });
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            return result;
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        [TrialGlobalLimit("AfterStopCannNotOpt")]
 | 
						||
        public async Task<IResponseOutput> AddOrUpdateArchiveTaskStudy(TaskArchiveStudyCommand incommand)
 | 
						||
        {
 | 
						||
            #region 获取该subject 已生成任务的访视的检查
 | 
						||
 | 
						||
            //var queryStudy = _visitTaskRepository.Where(t => t.SubjectId == incommand.SubjectId && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.Id).Select(u => new
 | 
						||
            //{
 | 
						||
            //    VisitTaskId = u.Id,
 | 
						||
            //    SourceSubjectVisitId = u.SourceSubjectVisitId,
 | 
						||
            //    OrginalStudyList = u.SourceSubjectVisit.StudyList.Select(t => new StudyBasicInfo()
 | 
						||
            //    {
 | 
						||
            //        Id = t.Id,
 | 
						||
            //        StudyInstanceUid = t.StudyInstanceUid
 | 
						||
            //    }).ToList(),
 | 
						||
            //});
 | 
						||
 | 
						||
            //var studyList = await queryStudy.ToListAsync();
 | 
						||
 | 
						||
 | 
						||
            //var findOriginStudy = studyList.FirstOrDefault(c => c.OrginalStudyList.Any(t => t.StudyInstanceUid == incommand.Study.StudyInstanceUid));
 | 
						||
 | 
						||
            //if (findOriginStudy == null)
 | 
						||
            //{
 | 
						||
            //    return ResponseOutput.NotOk("该检查不属于该受试者,请核查");
 | 
						||
            //}
 | 
						||
 | 
						||
            #endregion
 | 
						||
 | 
						||
            //总数为0的检查不允许提交
 | 
						||
            if (incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Count() == 0)
 | 
						||
            {
 | 
						||
                return ResponseOutput.NotOk("Study_InstanceCountZero");
 | 
						||
            }
 | 
						||
 | 
						||
            var @uploadLock = _distributedLockProvider.CreateLock($"UploadTaskDicom");
 | 
						||
 | 
						||
            using (await @uploadLock.AcquireAsync())
 | 
						||
            {
 | 
						||
                if (_fusionCache.GetOrDefault<Guid>(CacheKeys.TrialTaskStudyUidDBLock(incommand.TrialId, incommand.VisitTaskId, incommand.Study.StudyInstanceUid)) != Guid.Empty)
 | 
						||
                {
 | 
						||
                    //---当前已有人正在上传和归档该检查!
 | 
						||
                    return ResponseOutput.NotOk(I18n.T("UploadDownLoad_ArchiveInProgress"));
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    //在事务未完成前 防止前端重复提交
 | 
						||
                    await _fusionCache.SetAsync(CacheKeys.TrialTaskStudyUidDBLock(incommand.TrialId, incommand.VisitTaskId, incommand.Study.StudyInstanceUid), _userInfo.UserRoleId, TimeSpan.FromMinutes(1));
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            var visiTaskId = incommand.VisitTaskId;
 | 
						||
 | 
						||
            var modalitys = string.Empty;
 | 
						||
 | 
						||
            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 = incommand.FailedFileCount == 0;
 | 
						||
                studyMonitor.RecordPath = incommand.RecordPath;
 | 
						||
                studyMonitor.FileSize = incommand.Study.SeriesList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize);
 | 
						||
 | 
						||
                var studyId = IdentifierHelper.CreateGuid(incommand.Study.StudyInstanceUid, incommand.TrialId.ToString(), visiTaskId.ToString());
 | 
						||
                var findStudy = await _taskStudyRepository.FirstOrDefaultAsync(t => t.Id == studyId);
 | 
						||
 | 
						||
 | 
						||
                studyMonitor.StudyId = studyId;
 | 
						||
                studyMonitor.StudyCode = findStudy?.StudyCode ?? "";
 | 
						||
 | 
						||
                studyMonitor.IsDicomReUpload = findStudy != null;
 | 
						||
 | 
						||
                //上传
 | 
						||
                if (studyMonitor.IsDicomReUpload == false)
 | 
						||
                {
 | 
						||
 | 
						||
 | 
						||
                    var study = _mapper.Map<TaskStudy>(incommand.Study);
 | 
						||
 | 
						||
                    var @lock = _distributedLockProvider.CreateLock($"StudyCode");
 | 
						||
 | 
						||
                    using (await @lock.AcquireAsync())
 | 
						||
                    {
 | 
						||
                        //查询数据库获取最大的Code 没有记录则为0
 | 
						||
                        var dbStudyCodeIntMax = _taskStudyRepository.Where(s => s.TrialId == trialId).Select(t => t.Code).DefaultIfEmpty().Max();
 | 
						||
 | 
						||
                        //获取缓存中的值 并发的时候,需要记录,已被占用的值 这样其他线程在此占用的最大的值上递增
 | 
						||
                        var cacheMaxCodeInt = await _fusionCache.GetOrDefaultAsync<int>(CacheKeys.TrialStudyMaxCode(trialId));
 | 
						||
 | 
						||
                        int currentNextCodeInt = cacheMaxCodeInt > dbStudyCodeIntMax ? cacheMaxCodeInt + 1 : dbStudyCodeIntMax + 1;
 | 
						||
                        study.Code = currentNextCodeInt;
 | 
						||
 | 
						||
                        study.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(TaskStudy));
 | 
						||
 | 
						||
                        await _fusionCache.SetAsync<int>(CacheKeys.TrialStudyMaxCode(trialId), study.Code, TimeSpan.FromMinutes(30));
 | 
						||
 | 
						||
                    }
 | 
						||
 | 
						||
 | 
						||
                    study.Id = studyId;
 | 
						||
                    study.TrialId = incommand.TrialId;
 | 
						||
                    study.SubjectId = incommand.SubjectId;
 | 
						||
                    study.VisitTaskId = visiTaskId;
 | 
						||
                    //study.SubjectVisitId = incommand.SubjectVisitId;
 | 
						||
 | 
						||
 | 
						||
                    //特殊处理逻辑
 | 
						||
                    study.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Distinct());
 | 
						||
                    SpecialArchiveStudyDeal(study);
 | 
						||
                    modalitys = study.Modalities;
 | 
						||
 | 
						||
                    await _taskStudyRepository.AddAsync(study);
 | 
						||
 | 
						||
 | 
						||
                    studyMonitor.StudyCode = study.StudyCode;
 | 
						||
 | 
						||
 | 
						||
                    foreach (var seriesItem in incommand.Study.SeriesList)
 | 
						||
                    {
 | 
						||
                        var series = _mapper.Map<TaskSeries>(seriesItem);
 | 
						||
 | 
						||
                        series.Id = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, incommand.TrialId.ToString(), visiTaskId.ToString());
 | 
						||
                        series.StudyId = study.Id;
 | 
						||
 | 
						||
                        series.TrialId = incommand.TrialId;
 | 
						||
                        series.SubjectId = incommand.SubjectId;
 | 
						||
                        //series.SubjectVisitId = incommand.SubjectVisitId;
 | 
						||
                        series.VisitTaskId = visiTaskId;
 | 
						||
 | 
						||
                        //前端传递的数量不准,上传的时候,把失败的也加进来了,以实际数组的数字为准
 | 
						||
                        series.InstanceCount = seriesItem.InstanceList.Count;
 | 
						||
 | 
						||
                        await _taskSeriesRepository.AddAsync(series);
 | 
						||
 | 
						||
                        foreach (var instanceItem in seriesItem.InstanceList)
 | 
						||
                        {
 | 
						||
                            var isntance = _mapper.Map<TaskInstance>(instanceItem);
 | 
						||
 | 
						||
                            Guid instanceId = IdentifierHelper.CreateGuid(study.StudyInstanceUid, series.SeriesInstanceUid, isntance.SopInstanceUid, study.TrialId.ToString(), visiTaskId.ToString());
 | 
						||
 | 
						||
                            isntance.Id = instanceId;
 | 
						||
                            isntance.StudyId = study.Id;
 | 
						||
                            isntance.SeriesId = series.Id;
 | 
						||
 | 
						||
                            isntance.TrialId = incommand.TrialId;
 | 
						||
                            isntance.SubjectId = incommand.SubjectId;
 | 
						||
                            //isntance.SubjectVisitId = incommand.SubjectVisitId;
 | 
						||
                            isntance.VisitTaskId = visiTaskId;
 | 
						||
 | 
						||
                            await _taskInstanceRepository.AddAsync(isntance);
 | 
						||
                        }
 | 
						||
                    }
 | 
						||
 | 
						||
 | 
						||
                    findStudy = study;
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
 | 
						||
 | 
						||
 | 
						||
                    //重传的时候也要赋值检查Id
 | 
						||
                    studyMonitor.StudyId = findStudy.Id;
 | 
						||
                    studyMonitor.StudyCode = findStudy.StudyCode;
 | 
						||
 | 
						||
                    //特殊处理逻辑
 | 
						||
                    findStudy.Modalities = string.Join("、", incommand.Study.SeriesList.Select(t => t.Modality).Union(findStudy.Modalities.Split("、", StringSplitOptions.RemoveEmptyEntries)).Distinct());
 | 
						||
                    SpecialArchiveStudyDeal(findStudy);
 | 
						||
                    modalitys = findStudy.Modalities;
 | 
						||
 | 
						||
 | 
						||
                    // 少了整个序列
 | 
						||
 | 
						||
                    //某个序列下少了instance
 | 
						||
                    foreach (var seriesItem in incommand.Study.SeriesList)
 | 
						||
                    {
 | 
						||
                        var seriesId = IdentifierHelper.CreateGuid(seriesItem.StudyInstanceUid, seriesItem.SeriesInstanceUid, trialId.ToString(), visiTaskId.ToString());
 | 
						||
 | 
						||
                        TaskSeries dicomSeries = await _taskSeriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
 | 
						||
 | 
						||
                        //判断重复
 | 
						||
                        if (dicomSeries == null)
 | 
						||
                        {
 | 
						||
                            var series = _mapper.Map<TaskSeries>(seriesItem);
 | 
						||
 | 
						||
                            series.Id = seriesId;
 | 
						||
                            series.StudyId = findStudy.Id;
 | 
						||
 | 
						||
                            series.TrialId = incommand.TrialId;
 | 
						||
                            series.SubjectId = incommand.SubjectId;
 | 
						||
                            series.VisitTaskId = visiTaskId;
 | 
						||
                            //series.SubjectVisitId = incommand.SubjectVisitId;
 | 
						||
 | 
						||
 | 
						||
                            dicomSeries = await _taskSeriesRepository.AddAsync(series);
 | 
						||
 | 
						||
                            //新的序列 那么  检查的序列数量+1
 | 
						||
                            findStudy.SeriesCount += 1;
 | 
						||
                        }
 | 
						||
                        //else
 | 
						||
                        //{
 | 
						||
                        //    //该序列掉了instance
 | 
						||
                        //    dicomSeries.InstanceCount += seriesItem.InstanceList.Count;
 | 
						||
                        //}
 | 
						||
 | 
						||
                        //找到该序列已经存在的instanceId
 | 
						||
                        var existInstanceIdList = _taskInstanceRepository.Where(t => t.SeriesId == dicomSeries.Id).Select(t => t.Id).ToList();
 | 
						||
 | 
						||
                        foreach (var instanceItem in seriesItem.InstanceList)
 | 
						||
                        {
 | 
						||
                            var insntance = _mapper.Map<TaskInstance>(instanceItem);
 | 
						||
 | 
						||
                            var instanceId = IdentifierHelper.CreateGuid(insntance.StudyInstanceUid, insntance.SeriesInstanceUid, insntance.SopInstanceUid, trialId.ToString(), visiTaskId.ToString());
 | 
						||
 | 
						||
 | 
						||
                            if (!existInstanceIdList.Any(t => t == instanceId))
 | 
						||
                            {
 | 
						||
                                insntance.Id = instanceId;
 | 
						||
                                insntance.StudyId = findStudy.Id;
 | 
						||
                                insntance.SeriesId = dicomSeries.Id;
 | 
						||
 | 
						||
                                insntance.TrialId = incommand.TrialId;
 | 
						||
                                insntance.SubjectId = incommand.SubjectId;
 | 
						||
                                insntance.VisitTaskId = visiTaskId;
 | 
						||
 | 
						||
                                await _taskInstanceRepository.AddAsync(insntance);
 | 
						||
 | 
						||
                                dicomSeries.InstanceCount++;
 | 
						||
                                findStudy.InstanceCount++;
 | 
						||
                            }
 | 
						||
 | 
						||
                        }
 | 
						||
                        //  不管是新的序列  还是 该序列 掉了Instance   重传的时候 检查的instance 数量都会增加
 | 
						||
                        //findStudy.InstanceCount += seriesItem.InstanceList.Count;
 | 
						||
 | 
						||
                    }
 | 
						||
 | 
						||
 | 
						||
                }
 | 
						||
 | 
						||
                #region 只配置单个部位自动赋值
 | 
						||
 | 
						||
                var originStudy = _dicomStudyRepository.Where(t => t.TrialId == incommand.TrialId && t.StudyInstanceUid == findStudy.StudyInstanceUid).FirstOrDefault();
 | 
						||
 | 
						||
                if (originStudy != null)
 | 
						||
                {
 | 
						||
                    findStudy.BodyPartForEdit = originStudy.BodyPartForEdit;
 | 
						||
 | 
						||
                    findStudy.BodyPartForEditOther = originStudy.BodyPartForEditOther;
 | 
						||
                }
 | 
						||
 | 
						||
 | 
						||
                ////项目配置的影像部位
 | 
						||
                //var trialBodyParts = _trialRepository.Where(t => t.Id == trialId).Select(t => t.BodyPartTypes).FirstOrDefault();
 | 
						||
 | 
						||
                //var trialBodyPartList = trialBodyParts.Split('|', StringSplitOptions.RemoveEmptyEntries);
 | 
						||
 | 
						||
                //if (trialBodyPartList.Count() == 1)
 | 
						||
                //{
 | 
						||
                //    var first = trialBodyPartList.First();
 | 
						||
                //    findStudy.BodyPartForEdit = first;
 | 
						||
                //}
 | 
						||
                #endregion
 | 
						||
 | 
						||
                var @lock2 = _distributedLockProvider.CreateLock($"StudyCommit");
 | 
						||
 | 
						||
                using (await @lock2.AcquireAsync())
 | 
						||
                {
 | 
						||
                    await _taskStudyRepository.SaveChangesAsync();
 | 
						||
                }
 | 
						||
            }
 | 
						||
            catch (Exception ex)
 | 
						||
            {
 | 
						||
 | 
						||
                return ResponseOutput.NotOk(ex.Message);
 | 
						||
            }
 | 
						||
            finally
 | 
						||
            {
 | 
						||
                await _fusionCache.RemoveAsync(CacheKeys.TrialTaskStudyUidDBLock(incommand.TrialId, incommand.VisitTaskId, incommand.Study.StudyInstanceUid));
 | 
						||
                await _fusionCache.RemoveAsync(CacheKeys.TrialTaskStudyUidUploading(incommand.TrialId, incommand.VisitTaskId, incommand.Study.StudyInstanceUid));
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            return ResponseOutput.Ok(modalitys);
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        [HttpDelete]
 | 
						||
        public async Task<IResponseOutput> DeleteTaskStudy(Guid visitTaskId, bool isDicom, Guid? dicomStudyId, Guid? noneDicomStudyId)
 | 
						||
        {
 | 
						||
            if (isDicom)
 | 
						||
            {
 | 
						||
                if (dicomStudyId == null)
 | 
						||
                {
 | 
						||
                    var deleteStudyPathList = await _taskInstanceRepository.Where(t => t.VisitTaskId == visitTaskId).GroupBy(t => t.StudyId).Select(g => g.First().Path).ToListAsync();
 | 
						||
 | 
						||
                    foreach (var fisrtPath in deleteStudyPathList)
 | 
						||
                    {
 | 
						||
                        var prefix = fisrtPath.Substring(1, fisrtPath.LastIndexOf('/') - 1);
 | 
						||
                        await _oSSService.DeleteFromPrefix(prefix, true);
 | 
						||
                    }
 | 
						||
 | 
						||
 | 
						||
                    await _taskStudyRepository.DeleteFromQueryAsync(t => t.VisitTaskId == visitTaskId);
 | 
						||
                    await _taskSeriesRepository.BatchDeleteNoTrackingAsync(t => t.VisitTaskId == visitTaskId);
 | 
						||
                    await _taskInstanceRepository.BatchDeleteNoTrackingAsync(t => t.VisitTaskId == visitTaskId);
 | 
						||
                }
 | 
						||
                else
 | 
						||
                {
 | 
						||
                    var fisrtPath = await _taskInstanceRepository.Where(t => t.VisitTaskId == visitTaskId && t.StudyId == dicomStudyId).Select(t => t.Path).FirstOrDefaultAsync();
 | 
						||
                    var prefix = fisrtPath.Substring(1, fisrtPath.LastIndexOf('/') - 1);
 | 
						||
                    await _oSSService.DeleteFromPrefix(prefix, true);
 | 
						||
 | 
						||
                    await _taskStudyRepository.DeleteFromQueryAsync(t => t.VisitTaskId == visitTaskId && t.Id == dicomStudyId);
 | 
						||
                    await _taskSeriesRepository.BatchDeleteNoTrackingAsync(t => t.VisitTaskId == visitTaskId && t.Id == dicomStudyId);
 | 
						||
                    await _taskInstanceRepository.BatchDeleteNoTrackingAsync(t => t.VisitTaskId == visitTaskId && t.Id == dicomStudyId);
 | 
						||
                }
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                await _noneDicomStudyFileReposiotry.DeleteFromQueryAsync(t => t.VisitTaskId == visitTaskId && t.OriginNoneDicomStudyId == noneDicomStudyId);
 | 
						||
            }
 | 
						||
 | 
						||
            await _noneDicomStudyFileReposiotry.SaveChangesAsync();
 | 
						||
 | 
						||
            return ResponseOutput.Ok();
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// IR 上传任务  nonedicom 列表  后处理的数据UploadedFileCount不能排序  --new
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<List<TaskNoneDicomStudyDTO>> GetIRUploadTaskNoneDicomStudyList(IRUploadStudyQuery inQuery)
 | 
						||
        {
 | 
						||
            var subjectCode = inQuery.SubjectCode;
 | 
						||
            var subjectId = inQuery.SubjectId;
 | 
						||
            var doctorUserId = _userInfo.UserRoleId;
 | 
						||
 | 
						||
            if (inQuery.VisitTaskId != null)
 | 
						||
            {
 | 
						||
                //考虑到一致性分析,必须要这个编号进行过滤
 | 
						||
                //医学审核查看下载按钮,这个时候需要知道医生
 | 
						||
 | 
						||
                var taskInfo = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => new
 | 
						||
                {
 | 
						||
                    SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
 | 
						||
                    SubjectId = t.SubjectId,
 | 
						||
                    t.DoctorUserId,
 | 
						||
                    t.IsAnalysisCreate
 | 
						||
                }).FirstNotNullAsync();
 | 
						||
 | 
						||
                subjectId = taskInfo.SubjectId;
 | 
						||
                subjectCode = taskInfo.SubjectCode;
 | 
						||
                doctorUserId = (Guid)taskInfo.DoctorUserId!;
 | 
						||
            }
 | 
						||
 | 
						||
            var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
 | 
						||
                 .Select(t => new { t.IsImageFilter, t.CriterionModalitys, t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
 | 
						||
 | 
						||
            var query = from u in _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
 | 
						||
                                                   && t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId && t.TaskState == TaskState.Effect)
 | 
						||
                         //满足 有序,或者随机只看到当前任务的dicom 非dicom检查
 | 
						||
                         .WhereIf(info.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
 | 
						||
                        join ns in _noneDicomStudyReposiotry.Where(t => t.SubjectId == subjectId).WhereIf(info.IsImageFilter, t => ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|"))
 | 
						||
                        on u.SourceSubjectVisitId equals ns.SubjectVisitId
 | 
						||
 | 
						||
                        select new TaskNoneDicomStudyDTO()
 | 
						||
                        {
 | 
						||
                            SubjectId = u.SubjectId,
 | 
						||
                            SubjectCode = u.IsSelfAnalysis == true ? u.BlindSubjectCode : u.Subject.Code,
 | 
						||
                            TaskBlindName = u.TaskBlindName,
 | 
						||
                            TaskName = u.TaskName,
 | 
						||
                            ReadingTaskState = u.ReadingTaskState,
 | 
						||
                            SourceSubjectVisitId = u.SourceSubjectVisitId,
 | 
						||
                            VisitTaskId = u.Id,
 | 
						||
 | 
						||
                            Id = ns.Id,
 | 
						||
                            Description = ns.Description,
 | 
						||
                            ImageDate = ns.ImageDate,
 | 
						||
                            BodyPart = ns.BodyPart,
 | 
						||
                            BodyPartForEditOther=ns.BodyPartForEditOther,
 | 
						||
                            FileCount = ns.FileCount,
 | 
						||
                            Modality = ns.Modality,
 | 
						||
                            StudyCode = ns.StudyCode,
 | 
						||
 | 
						||
                            FileList = ns.NoneDicomFileList.Select(t => new NoneDicomFileInfo()
 | 
						||
                            {
 | 
						||
                                FileType = t.FileType,
 | 
						||
                                FileName = t.FileName,
 | 
						||
                                FileSize = t.FileSize,
 | 
						||
                                Path = t.Path
 | 
						||
                            }).ToList(),
 | 
						||
 | 
						||
                            ReadingFileCount = ns.FileCount,
 | 
						||
 | 
						||
                        };
 | 
						||
 | 
						||
            var list = await query.Where(t => t.SubjectCode == subjectCode).SortToListAsync(inQuery);
 | 
						||
 | 
						||
            var noneDicomStudyTaskIdList = list.Select(t => t.VisitTaskId).ToList();
 | 
						||
 | 
						||
 | 
						||
            var taskNoneDicomStudyList = _visitTaskRepository.Where(t => noneDicomStudyTaskIdList.Contains(t.Id))
 | 
						||
                  .SelectMany(t => t.TaskNoneDicomStudyFileList).Where(t => noneDicomStudyTaskIdList.Contains((Guid)t.VisitTaskId))
 | 
						||
                  .Select(u => new NoneDicomFileInfo
 | 
						||
                  {
 | 
						||
                      OriginNoneDicomStudyId = u.OriginNoneDicomStudyId,
 | 
						||
 | 
						||
                      FileType = u.FileType,
 | 
						||
                      FileName = u.FileName,
 | 
						||
                      FileSize = u.FileSize,
 | 
						||
                      Path = u.Path
 | 
						||
                  })
 | 
						||
                 .ToList();
 | 
						||
 | 
						||
            foreach (var item in list)
 | 
						||
            {
 | 
						||
                item.UploadedFileCount = taskNoneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).Count();
 | 
						||
                item.UploadedFileList = taskNoneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).ToList();
 | 
						||
            }
 | 
						||
 | 
						||
            return list;
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// IQC  获取CRC 上传到某一个访视的的检查信息 (原始影像信息  包含dicom  非dicom)
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput> GetCRCUploadedStudyInfo(CRCUploadedStudyQuqry inQuery)
 | 
						||
        {
 | 
						||
            var isQueryDicom = inQuery.DicomStudyIdList.Count > 0;
 | 
						||
            var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0;
 | 
						||
 | 
						||
            var imageType = (isQueryDicom && isQueryNoneDicom) ? ImageType.DicomAndNoneDicom : (isQueryDicom ? ImageType.Dicom : ImageType.NoneDicom);
 | 
						||
 | 
						||
            var dirDic = new Dictionary<string, string>();
 | 
						||
            #region DIR处理导出文件名,并将对应关系上传到OSS里面存储
 | 
						||
 | 
						||
            //有传输语法值的导出 才生成DIR
 | 
						||
            if (_subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSytaxUID != string.Empty))
 | 
						||
            {
 | 
						||
                var list = _subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId).SelectMany(t => t.StudyList)
 | 
						||
                    .Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
 | 
						||
                    .SelectMany(t => t.InstanceList)
 | 
						||
                    .Select(t => new StudyDIRInfo()
 | 
						||
                    {
 | 
						||
 | 
						||
                        DicomStudyId = t.DicomStudy.Id,
 | 
						||
 | 
						||
                        PatientId = t.DicomStudy.PatientId,
 | 
						||
                        PatientName = t.DicomStudy.PatientName,
 | 
						||
                        PatientBirthDate = t.DicomStudy.PatientBirthDate,
 | 
						||
                        PatientSex = t.DicomStudy.PatientSex,
 | 
						||
 | 
						||
                        StudyInstanceUid = t.StudyInstanceUid,
 | 
						||
                        StudyId = t.DicomStudy.StudyId,
 | 
						||
                        DicomStudyDate = t.DicomStudy.DicomStudyDate,
 | 
						||
                        DicomStudyTime = t.DicomStudy.DicomStudyTime,
 | 
						||
                        AccessionNumber = t.DicomStudy.AccessionNumber,
 | 
						||
 | 
						||
                        StudyDescription = t.DicomStudy.Description,
 | 
						||
 | 
						||
                        SeriesInstanceUid = t.DicomSerie.SeriesInstanceUid,
 | 
						||
                        Modality = t.DicomSerie.Modality,
 | 
						||
                        DicomSeriesDate = t.DicomSerie.DicomSeriesDate,
 | 
						||
                        DicomSeriesTime = t.DicomSerie.DicomSeriesTime,
 | 
						||
                        SeriesNumber = t.DicomSerie.SeriesNumber,
 | 
						||
                        SeriesDescription = t.DicomSerie.Description,
 | 
						||
 | 
						||
                        InstanceId = t.Id,
 | 
						||
                        SopInstanceUid = t.SopInstanceUid,
 | 
						||
                        SOPClassUID = t.SOPClassUID,
 | 
						||
                        InstanceNumber = t.InstanceNumber,
 | 
						||
                        MediaStorageSOPClassUID = t.MediaStorageSOPClassUID,
 | 
						||
                        MediaStorageSOPInstanceUID = t.MediaStorageSOPInstanceUID,
 | 
						||
                        TransferSytaxUID = t.TransferSytaxUID,
 | 
						||
 | 
						||
                    }).ToList();
 | 
						||
 | 
						||
                var pathInfo = await _subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId).Select(t => new { t.TrialId, t.SubjectId, VisitId = t.Id }).FirstNotNullAsync();
 | 
						||
 | 
						||
                foreach (var item in list.GroupBy(t => new { t.StudyInstanceUid, t.DicomStudyId }))
 | 
						||
                {
 | 
						||
                    var ossFolder = $"{pathInfo.TrialId}/Image/{pathInfo.SubjectId}/{pathInfo.VisitId}/{item.Key.StudyInstanceUid}";
 | 
						||
 | 
						||
                    var isSucess = await SafeBussinessHelper.RunAsync(async () => await DicomDIRHelper.GenerateStudyDIRAndUploadAsync(item.ToList(), dirDic, ossFolder, _oSSService));
 | 
						||
 | 
						||
 | 
						||
                    if (isSucess)
 | 
						||
                    {
 | 
						||
                        await _dicomStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Key.DicomStudyId, u => new DicomStudy() { StudyDIRPath = $"/{ossFolder}/DICOMDIR" });
 | 
						||
                    }
 | 
						||
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
            #endregion
 | 
						||
 | 
						||
            var query = from sv in _subjectVisitRepository.Where(t => t.Id == inQuery.SubjectVisitId)
 | 
						||
 | 
						||
 | 
						||
                        select new ImageDownloadDto()
 | 
						||
                        {
 | 
						||
                            TrialId = sv.TrialId,
 | 
						||
                            SubjectId = sv.SubjectId,
 | 
						||
                            SubjectCode = sv.Subject.Code,
 | 
						||
                            TrialSiteCode = sv.TrialSite.TrialSiteCode,
 | 
						||
                            VisitName = sv.VisitName,
 | 
						||
                            VisitId = sv.Id,
 | 
						||
 | 
						||
                            StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
 | 
						||
 | 
						||
                            .Select(u => new DownloadDicomStudyDto()
 | 
						||
                            {
 | 
						||
                                PatientId = u.PatientId,
 | 
						||
                                StudyTime = u.StudyTime,
 | 
						||
                                StudyCode = u.StudyCode,
 | 
						||
                                StudyInstanceUid = u.StudyInstanceUid,
 | 
						||
                                StudyDIRPath = u.StudyDIRPath,
 | 
						||
 | 
						||
                                SeriesList = u.SeriesList.Select(z => new DownloadDicomSeriesDto()
 | 
						||
                                {
 | 
						||
                                    Modality = z.Modality,
 | 
						||
 | 
						||
                                    InstanceList = z.DicomInstanceList.Select(k => new DownloadDicomInstanceDto()
 | 
						||
                                    {
 | 
						||
                                        IsEncapsulated = k.IsEncapsulated,
 | 
						||
                                        InstanceId = k.Id,
 | 
						||
                                        FileName = string.Empty,
 | 
						||
                                        Path = k.Path,
 | 
						||
                                        FileSize = k.FileSize
 | 
						||
                                    }).ToList()
 | 
						||
                                }).ToList()
 | 
						||
 | 
						||
                            }).ToList(),
 | 
						||
 | 
						||
                            NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false)
 | 
						||
 | 
						||
                            .Select(nd => new DownloadNoneDicomStudyDto()
 | 
						||
                            {
 | 
						||
                                Modality = nd.Modality,
 | 
						||
                                StudyCode = nd.StudyCode,
 | 
						||
                                ImageDate = nd.ImageDate,
 | 
						||
 | 
						||
                                FileList = nd.NoneDicomFileList.Select(file => new DownloadNoneDicomFileDto()
 | 
						||
                                {
 | 
						||
                                    FileName = file.FileName,
 | 
						||
                                    Path = file.Path,
 | 
						||
                                    FileType = file.FileType,
 | 
						||
                                    FileSize = file.FileSize
 | 
						||
                                }).ToList()
 | 
						||
                            }).ToList()
 | 
						||
                        };
 | 
						||
 | 
						||
            var result = query.FirstOrDefault();
 | 
						||
 | 
						||
            foreach (var item in result.StudyList.SelectMany(t => t.SeriesList).SelectMany(t => t.InstanceList))
 | 
						||
            {
 | 
						||
                var key = item.InstanceId.ToString();
 | 
						||
                if (dirDic.ContainsKey(key))
 | 
						||
                {
 | 
						||
                    item.FileName = dirDic[key];
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            var preDownloadInfo = new TrialImageDownload()
 | 
						||
            {
 | 
						||
                Id = NewId.NextSequentialGuid(),
 | 
						||
                TrialId = result.TrialId,
 | 
						||
                SubjectId = result.SubjectId,
 | 
						||
                SubjectCode = result.SubjectCode,
 | 
						||
                TrialSiteCode = result.TrialSiteCode,
 | 
						||
                IP = _userInfo.IP,
 | 
						||
                DownloadStartTime = DateTime.Now,
 | 
						||
                IsSuccess = false,
 | 
						||
                ImageType = imageType,
 | 
						||
                VisitName = string.Join(" | ", result.VisitName),
 | 
						||
                NoneDicomStudyCount = result.NoneDicomStudyList.Count(),
 | 
						||
                DicomStudyCount = result.StudyList.Count(),
 | 
						||
                ImageCount = result.StudyList.Sum(s => s.SeriesList.Sum(s => s.InstanceList.Count())) + result.NoneDicomStudyList.Sum(s => s.FileList.Count()),
 | 
						||
                ImageSize = result.StudyList.Sum(t => t.SeriesList.Sum(s => s.InstanceList.Sum(i => i.FileSize))) + result.NoneDicomStudyList.Sum(t => t.FileList.Sum(s => s.FileSize))
 | 
						||
              ?? 0
 | 
						||
            };
 | 
						||
            await _trialImageDownloadRepository.AddAsync(preDownloadInfo, true);
 | 
						||
            return ResponseOutput.Ok(result, preDownloadInfo.Id);
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// IR 阅片页面 和IR 任务列表页面下载  勾选下载列表(后端要考虑到一致性分析 subjectCode的问题)
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<List<SubjectCRCImageUploadedStudyDto>> GetSubjectImageDownloadSelectList(IRReadingDownloadQuery inQuery)
 | 
						||
        {
 | 
						||
 | 
						||
            var doctorUserId = _userInfo.UserRoleId;
 | 
						||
            var isAnalysisCreate = false;
 | 
						||
 | 
						||
            //要根据标准阅片顺序,确定是否查询单个任务的,还是查询所有的
 | 
						||
            var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
 | 
						||
                 .Select(t => new { t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
 | 
						||
 | 
						||
            var subjectCode = string.Empty;
 | 
						||
            var subjectId = inQuery.SubjectId;
 | 
						||
 | 
						||
            if (criterionInfo.IsReadingTaskViewInOrder == ReadingOrder.Random)
 | 
						||
            {
 | 
						||
                if (inQuery.VisitTaskId == null)
 | 
						||
                {
 | 
						||
                    throw new Exception("无序阅片,前端参数传递错误");
 | 
						||
                }
 | 
						||
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                if (inQuery.SubjectId == null || inQuery.SubjectCode == null)
 | 
						||
                {
 | 
						||
                    throw new Exception("有序阅片,前端参数传递错误");
 | 
						||
                }
 | 
						||
 | 
						||
                //考虑到一致性分析,必须要这个编号进行过滤
 | 
						||
                subjectCode = inQuery.SubjectCode;
 | 
						||
            }
 | 
						||
 | 
						||
            //下载这里查看也需要维护编号,维护的时候不会处理一致性分析任务
 | 
						||
            if (inQuery.SubjectId != null && inQuery.TrialReadingCriterionId != null)
 | 
						||
            {
 | 
						||
                await SubejctRandomReadingTaskNameDeal((Guid)subjectId, inQuery.TrialReadingCriterionId);
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
            TaskState? taskState = null;
 | 
						||
            if (inQuery.VisitTaskId != null)
 | 
						||
            {
 | 
						||
                //考虑到一致性分析,必须要这个编号进行过滤
 | 
						||
                //医学审核查看下载按钮,这个时候需要知道医生
 | 
						||
 | 
						||
                var taskInfo = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId).Select(t => new
 | 
						||
                {
 | 
						||
                    SubjectCode = t.IsAnalysisCreate ? t.BlindSubjectCode : t.Subject.Code,
 | 
						||
                    SubjectId = t.SubjectId,
 | 
						||
                    t.DoctorUserId,
 | 
						||
                    t.IsAnalysisCreate,
 | 
						||
                    t.TaskState
 | 
						||
                }).FirstNotNullAsync();
 | 
						||
 | 
						||
                subjectId = taskInfo.SubjectId;
 | 
						||
                subjectCode = taskInfo.SubjectCode;
 | 
						||
                doctorUserId = (Guid)taskInfo.DoctorUserId!;
 | 
						||
                isAnalysisCreate = taskInfo.IsAnalysisCreate;
 | 
						||
 | 
						||
                taskState = taskInfo.TaskState;
 | 
						||
            }
 | 
						||
 | 
						||
            var query = _visitTaskRepository.Where(t => t.SubjectId == subjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
 | 
						||
                                                    && t.SourceSubjectVisitId != null && t.DoctorUserId == doctorUserId)
 | 
						||
                //满足 有序,或者随机只看到当前任务的dicom 非dicom检查
 | 
						||
                .WhereIf(inQuery.VisitTaskId == null, t => t.TaskState == TaskState.Effect)//从待阅列表进入,要筛选出有效的,任务可能重阅了,也要看到该任务的
 | 
						||
                .WhereIf(criterionInfo.IsReadingTaskViewInOrder != ReadingOrder.SubjectRandom && inQuery.VisitTaskId != null, t => t.Id == inQuery.VisitTaskId)
 | 
						||
                .WhereIf(taskState == TaskState.Effect || taskState == TaskState.Freeze, t => t.TaskState == TaskState.Effect)//subject 随机可能当前阅片人有退回任务,此时传递了任务Id,但是要看整个subject得,要只留生效的
 | 
						||
                .WhereIf(taskState != null && taskState != TaskState.Effect && taskState != TaskState.Freeze, t => t.Id == inQuery.VisitTaskId) //非生效只查当前任务
 | 
						||
                .ProjectTo<SubjectCRCImageUploadedDto>(_mapper.ConfigurationProvider);
 | 
						||
 | 
						||
            //这里过滤是否是一致性分析的
 | 
						||
            var list = await query.Where(t => t.SubjectCode == subjectCode).ToListAsync();
 | 
						||
 | 
						||
            foreach (var item in list)
 | 
						||
            {
 | 
						||
                if (item.IsImageFilter)
 | 
						||
                {
 | 
						||
                    item.DicomStudyList = item.DicomStudyList.Where(t => ("|" + item.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|")).ToList();
 | 
						||
                    item.NoneDicomStudyList = item.NoneDicomStudyList.Where(t => ("|" + item.CriterionModalitys + "|").Contains("|" + t.Modality + "|")).ToList();
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
            #region 将任务级别转为检查级别
 | 
						||
 | 
						||
            var result = new List<SubjectCRCImageUploadedStudyDto>();
 | 
						||
 | 
						||
            var dicomStudyList = list.Where(item => item.DicomStudyList.Count > 0)
 | 
						||
              .Select(item => new SubjectCRCImageUploadedStudyDto
 | 
						||
              {
 | 
						||
                  VisitTaskId = item.VisitTaskId,
 | 
						||
                  SubjectId = item.SubjectId,
 | 
						||
                  SubjectCode = item.SubjectCode,
 | 
						||
                  TaskBlindName = item.TaskBlindName,
 | 
						||
                  TaskName = item.TaskName,
 | 
						||
                  IsImageFilter = item.IsImageFilter,
 | 
						||
                  CriterionModalitys = item.CriterionModalitys,
 | 
						||
                  SourceSubjectVisitId = item.SourceSubjectVisitId,
 | 
						||
                  //取dicom
 | 
						||
                  DicomStudyList = item.DicomStudyList,
 | 
						||
              }).ToList();
 | 
						||
 | 
						||
            var noneStudyList = list.Where(item => item.NoneDicomStudyList.Count > 0)
 | 
						||
           .Select(item => new SubjectCRCImageUploadedStudyDto
 | 
						||
           {
 | 
						||
               VisitTaskId = item.VisitTaskId,
 | 
						||
               SubjectId = item.SubjectId,
 | 
						||
               SubjectCode = item.SubjectCode,
 | 
						||
               TaskBlindName = item.TaskBlindName,
 | 
						||
               TaskName = item.TaskName,
 | 
						||
               IsImageFilter = item.IsImageFilter,
 | 
						||
               CriterionModalitys = item.CriterionModalitys,
 | 
						||
               SourceSubjectVisitId = item.SourceSubjectVisitId,
 | 
						||
               //非dicom
 | 
						||
               NoneDicomStudyList = item.NoneDicomStudyList,
 | 
						||
           }).ToList();
 | 
						||
 | 
						||
 | 
						||
            result.AddRange(dicomStudyList);
 | 
						||
            result.AddRange(noneStudyList);
 | 
						||
            #endregion
 | 
						||
 | 
						||
 | 
						||
            return result;
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// IR 阅片页面获取下载检查的信息  会根据标准进行过滤检查,(后端要考虑到一致性分析 subjectCode的问题)
 | 
						||
        /// 检查在访视下面,所以需要传递下载的访视Id,另外下载访视下面那些检查,就把访视下的对应的检查Id 丢到数组里就好
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput> GetIRReadingDownloadStudyInfo(IRDownloadQuery inQuery)
 | 
						||
        {
 | 
						||
            var info = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId)
 | 
						||
                  .Select(t => new { t.IsImageFilter, t.CriterionModalitys, t.TrialId, t.IsReadingTaskViewInOrder }).FirstNotNullAsync();
 | 
						||
 | 
						||
            var isQueryDicom = inQuery.DicomStudyIdList.Count > 0;
 | 
						||
            var isQueryNoneDicom = inQuery.NoneDicomStudyIdList.Count > 0;
 | 
						||
 | 
						||
            var imageType = (isQueryDicom && isQueryNoneDicom) ? ImageType.DicomAndNoneDicom : (isQueryDicom ? ImageType.Dicom : ImageType.NoneDicom);
 | 
						||
 | 
						||
            var taskIdList = inQuery.SubjectVisitTaskList.Select(t => t.TaskId).ToList();
 | 
						||
 | 
						||
            var subjectVisitIdList = inQuery.SubjectVisitTaskList.Select(t => t.SubjectVisitId).ToList();
 | 
						||
 | 
						||
            var trialSiteCode = _visitTaskRepository.Where(t => t.Id == taskIdList.FirstOrDefault()).Select(t => t.IsAnalysisCreate ? t.BlindTrialSiteCode : t.Subject.TrialSite.TrialSiteCode).FirstOrDefault() ?? string.Empty;
 | 
						||
 | 
						||
            var dirDic = new Dictionary<string, string>();
 | 
						||
            #region 在下载前先处理DIR文件
 | 
						||
 | 
						||
            //有传输语法值的导出 才生成DIR
 | 
						||
            if (_subjectVisitRepository.Where(t => t.SubjectId == inQuery.SubjectId).SelectMany(t => t.StudyList.SelectMany(t => t.InstanceList)).All(c => c.TransferSytaxUID != string.Empty))
 | 
						||
            {
 | 
						||
                var dirInfolist = _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id))).SelectMany(t => t.StudyList)
 | 
						||
               .Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
 | 
						||
               .Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
 | 
						||
               .SelectMany(t => t.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading))
 | 
						||
               .Select(t => new StudyDIRInfo()
 | 
						||
               {
 | 
						||
                   SubjectVisitId = t.SubjectVisitId,
 | 
						||
 | 
						||
                   DicomStudyId = t.DicomStudy.Id,
 | 
						||
 | 
						||
                   PatientId = t.DicomStudy.PatientId,
 | 
						||
                   PatientName = t.DicomStudy.PatientName,
 | 
						||
                   PatientBirthDate = t.DicomStudy.PatientBirthDate,
 | 
						||
                   PatientSex = t.DicomStudy.PatientSex,
 | 
						||
 | 
						||
                   StudyInstanceUid = t.StudyInstanceUid,
 | 
						||
                   StudyId = t.DicomStudy.StudyId,
 | 
						||
                   DicomStudyDate = t.DicomStudy.DicomStudyDate,
 | 
						||
                   DicomStudyTime = t.DicomStudy.DicomStudyTime,
 | 
						||
                   AccessionNumber = t.DicomStudy.AccessionNumber,
 | 
						||
 | 
						||
                   StudyDescription = t.DicomStudy.Description,
 | 
						||
 | 
						||
                   SeriesInstanceUid = t.DicomSerie.SeriesInstanceUid,
 | 
						||
                   Modality = t.DicomSerie.Modality,
 | 
						||
                   DicomSeriesDate = t.DicomSerie.DicomSeriesDate,
 | 
						||
                   DicomSeriesTime = t.DicomSerie.DicomSeriesTime,
 | 
						||
                   SeriesNumber = t.DicomSerie.SeriesNumber,
 | 
						||
                   SeriesDescription = t.DicomSerie.Description,
 | 
						||
 | 
						||
                   InstanceId = t.Id,
 | 
						||
                   SopInstanceUid = t.SopInstanceUid,
 | 
						||
                   SOPClassUID = t.SOPClassUID,
 | 
						||
                   InstanceNumber = t.InstanceNumber,
 | 
						||
                   MediaStorageSOPClassUID = t.MediaStorageSOPClassUID,
 | 
						||
                   MediaStorageSOPInstanceUID = t.MediaStorageSOPInstanceUID,
 | 
						||
                   TransferSytaxUID = t.TransferSytaxUID,
 | 
						||
 | 
						||
               }).ToList();
 | 
						||
 | 
						||
                var pathInfo = await _subjectRepository.Where(t => t.Id == inQuery.SubjectId).Select(t => new { t.TrialId, SubjectId = t.Id }).FirstNotNullAsync();
 | 
						||
 | 
						||
                foreach (var item in dirInfolist.GroupBy(t => new { t.StudyInstanceUid, t.DicomStudyId }))
 | 
						||
                {
 | 
						||
                    var visitId = item.First().SubjectVisitId;
 | 
						||
 | 
						||
                    var ossFolder = $"{pathInfo.TrialId}/Image/{pathInfo.SubjectId}/{visitId}/{item.Key.StudyInstanceUid}";
 | 
						||
 | 
						||
                    var isSucess = await SafeBussinessHelper.RunAsync(async () => await DicomDIRHelper.GenerateStudyDIRAndUploadAsync(item.ToList(), dirDic, ossFolder, _oSSService));
 | 
						||
 | 
						||
 | 
						||
                    if (isSucess)
 | 
						||
                    {
 | 
						||
                        await _dicomStudyRepository.BatchUpdateNoTrackingAsync(t => t.Id == item.Key.DicomStudyId, u => new DicomStudy() { StudyDIRPath = $"/{ossFolder}/DICOMDIR" });
 | 
						||
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            #endregion
 | 
						||
 | 
						||
            var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubjectId).SelectMany(t => t.SubjectVisitList.Where(t => subjectVisitIdList.Contains(t.Id)))
 | 
						||
                            //一致性分析,导致查询出来两条数据
 | 
						||
                        join visitTask in _visitTaskRepository.Where(t => taskIdList.Contains(t.Id))
 | 
						||
 | 
						||
                        on sv.Id equals visitTask.SourceSubjectVisitId
 | 
						||
                        select new ImageDownloadDto()
 | 
						||
                        {
 | 
						||
                            SubjectCode = inQuery.SubjectCode,
 | 
						||
                            VisitName = sv.VisitName,
 | 
						||
                            TaskBlindName = visitTask.TaskBlindName,
 | 
						||
                            StudyList = sv.StudyList.Where(t => isQueryDicom ? inQuery.DicomStudyIdList.Contains(t.Id) : false)
 | 
						||
                            .Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
 | 
						||
                            .Select(u => new DownloadDicomStudyDto()
 | 
						||
                            {
 | 
						||
                                PatientId = u.PatientId,
 | 
						||
                                StudyTime = u.StudyTime,
 | 
						||
                                StudyCode = u.StudyCode,
 | 
						||
                                StudyInstanceUid = u.StudyInstanceUid,
 | 
						||
                                StudyDIRPath = u.StudyDIRPath,
 | 
						||
 | 
						||
                                SeriesList = u.SeriesList.Where(t => t.IsReading).Select(z => new DownloadDicomSeriesDto()
 | 
						||
                                {
 | 
						||
                                    Modality = z.Modality,
 | 
						||
 | 
						||
                                    InstanceList = z.DicomInstanceList.Where(t => t.IsReading).Select(k => new DownloadDicomInstanceDto()
 | 
						||
                                    {
 | 
						||
                                        IsEncapsulated = k.IsEncapsulated,
 | 
						||
                                        InstanceId = k.Id,
 | 
						||
                                        FileName = string.Empty,
 | 
						||
                                        Path = k.Path,
 | 
						||
                                        FileSize = k.FileSize
 | 
						||
                                    }).ToList()
 | 
						||
                                }).ToList()
 | 
						||
                            }).ToList(),
 | 
						||
 | 
						||
                            NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isQueryNoneDicom ? inQuery.NoneDicomStudyIdList.Contains(t.Id) : false)
 | 
						||
                             .Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.Modality + "|") : true)
 | 
						||
                             .Where(t => t.IsReading)
 | 
						||
                              .Select(nd => new DownloadNoneDicomStudyDto()
 | 
						||
                              {
 | 
						||
                                  Modality = nd.Modality,
 | 
						||
                                  StudyCode = nd.StudyCode,
 | 
						||
                                  ImageDate = nd.ImageDate,
 | 
						||
 | 
						||
                                  FileList = nd.NoneDicomFileList.Where(t => t.IsReading).Select(file => new DownloadNoneDicomFileDto()
 | 
						||
                                  {
 | 
						||
                                      FileName = file.FileName,
 | 
						||
                                      Path = file.Path,
 | 
						||
                                      FileType = file.FileType,
 | 
						||
                                      FileSize = file.FileSize
 | 
						||
                                  }).ToList()
 | 
						||
                              }).ToList()
 | 
						||
                        };
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            var list = await query.ToListAsync();
 | 
						||
 | 
						||
            foreach (var result in list)
 | 
						||
            {
 | 
						||
                foreach (var item in result.StudyList.SelectMany(t => t.SeriesList).SelectMany(t => t.InstanceList))
 | 
						||
                {
 | 
						||
                    var key = item.InstanceId.ToString();
 | 
						||
                    if (dirDic.ContainsKey(key))
 | 
						||
                    {
 | 
						||
                        item.FileName = dirDic[key];
 | 
						||
                    }
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
            var preDownloadInfo = new TrialImageDownload()
 | 
						||
            {
 | 
						||
                Id = NewId.NextSequentialGuid(),
 | 
						||
                TrialId = info.TrialId,
 | 
						||
                SubjectId = inQuery.SubjectId,
 | 
						||
                SubjectCode = inQuery.SubjectCode,
 | 
						||
                TrialSiteCode = trialSiteCode,
 | 
						||
                IP = _userInfo.IP,
 | 
						||
                DownloadStartTime = DateTime.Now,
 | 
						||
                IsSuccess = false,
 | 
						||
                ImageType = imageType,
 | 
						||
                VisitName = string.Join(" | ", list.Select(t => t.VisitName).OrderBy(t => t).ToList()),
 | 
						||
                NoneDicomStudyCount = list.Sum(t => t.NoneDicomStudyList.Count()),
 | 
						||
                DicomStudyCount = list.Sum(t => t.StudyList.Count()),
 | 
						||
                ImageCount = list.Sum(t => t.StudyList.Sum(s => s.SeriesList.Sum(s => s.InstanceList.Count())) + t.NoneDicomStudyList.Sum(s => s.FileList.Count())),
 | 
						||
                ImageSize = list.Sum(t => t.StudyList.Sum(t => t.SeriesList.Sum(s => s.InstanceList.Sum(i => i.FileSize))) + t.NoneDicomStudyList.Sum(t => t.FileList.Sum(s => s.FileSize))
 | 
						||
                ) ?? 0
 | 
						||
            };
 | 
						||
 | 
						||
            await _trialImageDownloadRepository.AddAsync(preDownloadInfo, true);
 | 
						||
 | 
						||
            return ResponseOutput.Ok(list, new { PreDownloadId = preDownloadInfo.Id, info.IsReadingTaskViewInOrder });
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// dicom 影像后处理预览接口
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput> GetTaskUploadedDicomStudyList(IRTaskUploadedDicomStudyQuery inQuery)
 | 
						||
        {
 | 
						||
            var info = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
 | 
						||
                 .Select(t => new { t.TrialReadingCriterion.IsImageFilter, t.TrialReadingCriterion.CriterionModalitys }).FirstNotNullAsync();
 | 
						||
 | 
						||
            var query = _taskStudyRepository.Where(t => t.VisitTaskId == inQuery.VisitTaskId)
 | 
						||
                .Where(t => info.IsImageFilter ? ("|" + info.CriterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|") : true)
 | 
						||
                .Select(t => new
 | 
						||
                {
 | 
						||
                    StudyId = t.Id,
 | 
						||
                    t.Modalities,
 | 
						||
                    t.InstanceCount,
 | 
						||
                    t.SeriesCount,
 | 
						||
                    t.StudyCode,
 | 
						||
                    SeriesList = t.SeriesList.OrderBy(s => s.SeriesNumber).ThenBy(s => s.SeriesTime).Select(u => new
 | 
						||
                    {
 | 
						||
                        u.SeriesTime,
 | 
						||
                        u.InstanceCount,
 | 
						||
                        u.ImageResizePath,
 | 
						||
                        u.Modality,
 | 
						||
                        u.Description,
 | 
						||
                        u.SeriesInstanceUid,
 | 
						||
                        u.SeriesNumber,
 | 
						||
                        u.SliceThickness,
 | 
						||
                        u.StudyInstanceUid,
 | 
						||
 | 
						||
                        IsExistMutiFrames = u.InstanceList.Any(t => t.NumberOfFrames > 1),
 | 
						||
 | 
						||
                        InstanceInfoList = u.InstanceList.OrderBy(t => t.InstanceNumber).Select(k =>
 | 
						||
                        new InstanceBasicInfo()
 | 
						||
                        {
 | 
						||
                            Id = k.Id,
 | 
						||
                            NumberOfFrames = k.NumberOfFrames,
 | 
						||
                            HtmlPath = k.HtmlPath,
 | 
						||
                            Path = k.Path,
 | 
						||
                            InstanceNumber = k.InstanceNumber,
 | 
						||
                            FileSize = k.FileSize,
 | 
						||
                        }).ToList()
 | 
						||
                    })
 | 
						||
                });
 | 
						||
            var list = await query.ToListAsync();
 | 
						||
 | 
						||
            return ResponseOutput.Ok(list);
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 更新后处理上传的检查modality
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="taskStudyId"></param>
 | 
						||
        /// <param name="modality"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPut]
 | 
						||
        public async Task<IResponseOutput> UpdateTaskStudyModality(Guid taskStudyId, string modality)
 | 
						||
        {
 | 
						||
            await _taskStudyRepository.UpdatePartialFromQueryAsync(t => t.Id == taskStudyId, u => new TaskStudy() { ModalityForEdit = modality }, true);
 | 
						||
            return ResponseOutput.Ok();
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 影像下载成功回调
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialImageDownloadId"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        public async Task<IResponseOutput> DownloadImageSuccess(Guid trialImageDownloadId)
 | 
						||
        {
 | 
						||
            await _trialImageDownloadRepository.UpdatePartialFromQueryAsync(t => t.Id == trialImageDownloadId, u => new TrialImageDownload()
 | 
						||
            { DownloadEndTime = DateTime.Now, IsSuccess = true }, true);
 | 
						||
            return ResponseOutput.Ok();
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 项目影像下载监控列表
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<PageOutput<TrialImageDownloadView>> GetTrialDownloadList(TrialIamgeDownQuery inQuery)
 | 
						||
        {
 | 
						||
            var query = _trialImageDownloadRepository.Where(t => t.TrialId == inQuery.TrialId)
 | 
						||
                  .WhereIf(inQuery.SubjectCode.IsNotNullOrEmpty(), t => t.SubjectCode.Contains(inQuery.SubjectCode))
 | 
						||
                  .WhereIf(inQuery.IP.IsNotNullOrEmpty(), t => t.IP.Contains(inQuery.IP))
 | 
						||
                   .WhereIf(inQuery.Name.IsNotNullOrEmpty(), t => t.CreateUserRole.IdentityUser.UserName.Contains(inQuery.Name) || t.CreateUserRole.FullName.Contains(inQuery.Name))
 | 
						||
                  .WhereIf(inQuery.ImageType != null, t => t.ImageType == inQuery.ImageType)
 | 
						||
                  .WhereIf(inQuery.UserType != null, t => t.CreateUserRole.UserTypeEnum == inQuery.UserType)
 | 
						||
                  .WhereIf(inQuery.IsSuccess != null, t => t.IsSuccess == inQuery.IsSuccess)
 | 
						||
                  .WhereIf(inQuery.DownloadStartTime != null, t => t.DownloadStartTime >= inQuery.DownloadStartTime)
 | 
						||
                  .WhereIf(inQuery.DownloadEndTime != null, t => t.DownloadEndTime <= inQuery.DownloadEndTime)
 | 
						||
 | 
						||
                  .ProjectTo<TrialImageDownloadView>(_mapper.ConfigurationProvider);
 | 
						||
 | 
						||
            return await query.ToPagedListAsync(inQuery);
 | 
						||
        }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        #region 影像汇总页面
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput<PageOutput<TrialVisitImageStatView>>> GetTrialVisitImageStatList(TrialVisitImageQuery inQuery)
 | 
						||
        {
 | 
						||
            var query = _subjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId)
 | 
						||
                  .WhereIf(inQuery.TrialSiteId != null, t => t.TrialSiteId == inQuery.TrialSiteId)
 | 
						||
                  .WhereIf(inQuery.SubjectCode.IsNotNullOrEmpty(), t => t.Subject.Code.Contains(inQuery.SubjectCode))
 | 
						||
                  .WhereIf(inQuery.BeginScanDate != null, t => t.LatestScanDate >= inQuery.BeginScanDate)
 | 
						||
                  .WhereIf(inQuery.EndScanDate != null, t => t.LatestScanDate == inQuery.EndScanDate)
 | 
						||
                  .Select(t => new TrialVisitImageStatView()
 | 
						||
                  {
 | 
						||
                      TrialId = t.TrialId,
 | 
						||
                      SubjectVisitId = t.Id,
 | 
						||
                      SubjectCode = t.Subject.Code,
 | 
						||
                      TrialSiteCode = t.TrialSite.TrialSiteCode,
 | 
						||
                      TrialSiteId = t.TrialSiteId,
 | 
						||
                      VisitName = t.VisitName,
 | 
						||
                      VisitNum = t.VisitNum,
 | 
						||
                      EarliestScanDate = t.EarliestScanDate,
 | 
						||
                      LatestScanDate = t.LatestScanDate,
 | 
						||
 | 
						||
                      IsHaveDicom = t.StudyList.Any(),
 | 
						||
 | 
						||
                      IsHaveNoneDicom = t.NoneDicomStudyList.Any(),
 | 
						||
 | 
						||
 | 
						||
                      TotalStudyCount = t.StudyList.Count() + t.NoneDicomStudyList.Count(),
 | 
						||
 | 
						||
                      TotalImageCount = t.StudyList.Sum(t => t.InstanceCount) + t.NoneDicomStudyList.Sum(t => t.FileCount),
 | 
						||
 | 
						||
                      TotalImageSize = t.StudyList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize) + t.NoneDicomStudyList.SelectMany(t => t.NoneDicomFileList).Sum(t => t.FileSize),
 | 
						||
 | 
						||
                      TotalReadingImageSize = t.StudyList.SelectMany(t => t.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading)).Sum(t => t.FileSize)
 | 
						||
                      + t.NoneDicomStudyList.Where(t => t.IsReading).SelectMany(t => t.NoneDicomFileList.Where(t => t.IsReading)).Sum(t => t.FileSize),
 | 
						||
 | 
						||
 | 
						||
                      //DicomStudyCount = t.StudyList.Count(),
 | 
						||
                      //NoneDicomStudyCount = t.NoneDicomStudyList.Count(),
 | 
						||
 | 
						||
                      //DicomImageCount = t.StudyList.Sum(t => t.InstanceCount),
 | 
						||
                      //NoneDicomImageCount = t.NoneDicomStudyList.Sum(t => t.FileCount),
 | 
						||
 | 
						||
                      //DicomImageSize = t.StudyList.SelectMany(t => t.InstanceList).Sum(t => t.FileSize),
 | 
						||
                      //NoneDicomImageSize = t.NoneDicomStudyList.SelectMany(t => t.NoneDicomFileList).Sum(t => t.FileSize)
 | 
						||
                  });
 | 
						||
            var defalutSortArray = new string[] { nameof(TrialVisitImageStatView.TrialSiteCode), nameof(QCCRCVisitViewModel.SubjectCode), nameof(QCCRCVisitViewModel.VisitNum) };
 | 
						||
 | 
						||
            var pagelist = await query.Where(t => t.TotalImageCount > 0).ToPagedListAsync(inQuery, defalutSortArray);
 | 
						||
 | 
						||
            return ResponseOutput.Ok(pagelist);
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 获取项目影像统计,有影像的subject 数量  访视数量
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialId"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        public async Task<IResponseOutput<TrialImageStatInfo>> GetTrialVisitImageStatInfo(Guid trialId)
 | 
						||
        {
 | 
						||
            var subjectImageList = _subjectVisitRepository.Where(t => t.TrialId == trialId)
 | 
						||
                  .Where(t => t.StudyList.Sum(t => t.InstanceCount) > 0 || t.NoneDicomStudyList.Sum(t => t.FileCount) > 0)
 | 
						||
                   .GroupBy(t => t.SubjectId)
 | 
						||
                  .Select(g => new
 | 
						||
                  {
 | 
						||
                      SubjectId = g.Key,
 | 
						||
                      VisitCount = g.Count(),
 | 
						||
                      ReadingImageSize = g.SelectMany(t => t.NoneDicomStudyList.Where(t => t.IsReading)).SelectMany(t => t.NoneDicomFileList.Where(t => t.IsReading)).Sum(t => t.FileSize)
 | 
						||
 | 
						||
                       + g.SelectMany(t => t.StudyList).SelectMany(t => t.InstanceList.Where(t => t.IsReading && t.DicomSerie.IsReading)).Sum(t => t.FileSize),
 | 
						||
 | 
						||
                      ImageSize = g.SelectMany(t => t.NoneDicomStudyList).SelectMany(t => t.NoneDicomFileList).Sum(t => t.FileSize)
 | 
						||
 | 
						||
                       + g.SelectMany(t => t.StudyList).SelectMany(t => t.InstanceList).Sum(t => t.FileSize)
 | 
						||
                  })
 | 
						||
                  .ToList();
 | 
						||
 | 
						||
            var subjectCount = subjectImageList.Count;
 | 
						||
 | 
						||
            var subjectVisitCount = subjectImageList.Sum(t => t.VisitCount);
 | 
						||
 | 
						||
            var totalImageSize = subjectImageList.Sum(t => t.ImageSize);
 | 
						||
 | 
						||
            var totalReadingImageSize = subjectImageList.Sum(t => t.ReadingImageSize);
 | 
						||
 | 
						||
            return ResponseOutput.Ok(new TrialImageStatInfo { SubjectCount = subjectCount, SubjectVisitCount = subjectVisitCount, TotalImageSize = totalImageSize, TotalReadingImageSize = totalReadingImageSize });
 | 
						||
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 批量勾选访视 进行下载
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inCommand"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        public async Task<IResponseOutput> GetExportSubjectVisitImageList(TrialExportImageCommand inCommand)
 | 
						||
        {
 | 
						||
 | 
						||
            var isExportReading = inCommand.IsExportReading == true;
 | 
						||
 | 
						||
            if (inCommand.IsKeyImage)
 | 
						||
            {
 | 
						||
                var downloadInfoList = _visitTaskRepository.Where(t => t.TrialId == inCommand.TrialId && (t.ReadingCategory == ReadingCategory.Visit || t.ReadingCategory == ReadingCategory.Global)
 | 
						||
                    && t.ReadingTaskState == ReadingTaskState.HaveSigned && t.IsAnalysisCreate == false && (t.TaskState == TaskState.Effect || t.TaskState == TaskState.Freeze))
 | 
						||
                    .Where(t => inCommand.SubjectVisitIdList.Contains((Guid)t.SourceSubjectVisitId))
 | 
						||
                    .Select(t => new TrialKeyImageExportDTO()
 | 
						||
                    {
 | 
						||
                        ResearchProgramNo = t.Trial.ResearchProgramNo,
 | 
						||
                        CriterionName = t.TrialReadingCriterion.CriterionName,
 | 
						||
                        ArbitrationRule = t.TrialReadingCriterion.ArbitrationRule,
 | 
						||
                        IsGlobalReading = t.TrialReadingCriterion.IsGlobalReading,
 | 
						||
                        SubjectCriterionReadingPeriodVisitNumList = t.Subject.ReadModuleList
 | 
						||
                        .Where(u => u.TrialReadingCriterionId == t.TrialReadingCriterionId && u.ReadingSetType == ReadingSetType.ImageReading).Select(c => c.SubjectVisit.VisitNum).ToList(),
 | 
						||
 | 
						||
                        TrialSiteCode = t.Subject.TrialSite.TrialSiteCode,
 | 
						||
                        SubjectCode = t.Subject.Code,
 | 
						||
 | 
						||
                        ReadingCategory = t.ReadingCategory,
 | 
						||
 | 
						||
                        VisitName = t.ReadingCategory == ReadingCategory.Visit ? t.SourceSubjectVisit.VisitName : "",
 | 
						||
 | 
						||
                        VisitTaskNum = t.VisitTaskNum,
 | 
						||
 | 
						||
                        ArmEnum = t.ArmEnum,
 | 
						||
 | 
						||
                        ReadingNoneDicomMarkPathList = t.ReadingNoneDicomMarkList.Select(c => new TrialKeyPicturePath { PicturePath = c.Path, OtherPicturePath = string.Empty }).ToList(),
 | 
						||
 | 
						||
                        QuestionMarkPictureList = t.ReadingTaskQuestionMarkList.Select(c => new TrialKeyPicturePath { PicturePath = c.PicturePath, OtherPicturePath = c.OtherPicturePath }).ToList(),
 | 
						||
 | 
						||
                        TableQuestionRowPictureList = t.LesionList.Select(c => new TrialKeyPicturePath { PicturePath = c.PicturePath, OtherPicturePath = c.OtherPicturePath }).ToList(),
 | 
						||
 | 
						||
                        Id = t.Id,
 | 
						||
                        //裁判选择结果
 | 
						||
                        JudgeResultTaskId = t.JudgeVisitTask.JudgeResultTaskId,
 | 
						||
 | 
						||
                        //是否触发裁判
 | 
						||
                        IsTrigerJudge = t.JudgeVisitTaskId != null,
 | 
						||
 | 
						||
                        IsJudgeSelect = null
 | 
						||
 | 
						||
 | 
						||
                    }).ToList();
 | 
						||
 | 
						||
                foreach (var subjectCriterionGroup in downloadInfoList.GroupBy(t => new { t.SubjectCode, t.CriterionName, t.ArbitrationRule, t.IsGlobalReading }))
 | 
						||
                {
 | 
						||
                    var arbitrationRule = subjectCriterionGroup.Key.ArbitrationRule;
 | 
						||
                    var isGlobalReading = subjectCriterionGroup.Key.IsGlobalReading;
 | 
						||
 | 
						||
                    foreach (var item in subjectCriterionGroup)
 | 
						||
                    {
 | 
						||
                        if (arbitrationRule == ArbitrationRule.Visit)
 | 
						||
                        {
 | 
						||
                            //是否产生裁判
 | 
						||
 | 
						||
                            if (item.IsTrigerJudge == true)
 | 
						||
                            {
 | 
						||
                                //裁判做完了
 | 
						||
                                if (item.JudgeResultTaskId != null)
 | 
						||
                                {
 | 
						||
                                    //裁判选择了自己,那么设置
 | 
						||
                                    if (item.JudgeResultTaskId == item.Id)
 | 
						||
                                    {
 | 
						||
                                        item.IsJudgeSelect = true;
 | 
						||
                                    }
 | 
						||
                                    else
 | 
						||
                                    {
 | 
						||
                                        item.IsJudgeSelect = false;
 | 
						||
                                    }
 | 
						||
                                }
 | 
						||
 | 
						||
                            }
 | 
						||
                            else
 | 
						||
                            {
 | 
						||
                                //没产生 且两个人做完了  默认R1
 | 
						||
 | 
						||
                                if (subjectCriterionGroup.Where(t => t.VisitTaskNum == item.VisitTaskNum && t.SubjectCode == item.SubjectCode).Select(t => t.ArmEnum).Distinct().Count() == 2)
 | 
						||
                                {
 | 
						||
                                    if (item.ArmEnum == Arm.DoubleReadingArm1)
 | 
						||
                                    {
 | 
						||
                                        item.IsJudgeSelect = true;
 | 
						||
                                    }
 | 
						||
                                    else
 | 
						||
                                    {
 | 
						||
                                        item.IsJudgeSelect = false;
 | 
						||
                                    }
 | 
						||
                                }
 | 
						||
 | 
						||
 | 
						||
                            }
 | 
						||
 | 
						||
                        }
 | 
						||
                        else if (arbitrationRule == ArbitrationRule.Reading)
 | 
						||
                        {
 | 
						||
 | 
						||
                            //阅片期访视号
 | 
						||
                            var subjectReadingPeriondVisitNumList = subjectCriterionGroup.FirstOrDefault()?.SubjectCriterionReadingPeriodVisitNumList;
 | 
						||
 | 
						||
                            //两个人完成最大得任务号(访视+全局)
 | 
						||
                            var subjectMaxFinishedTaskNum = subjectCriterionGroup.GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).DefaultIfEmpty().Max();
 | 
						||
 | 
						||
                            var addReadingPeriodNum = isGlobalReading ? ReadingCommon.TaskNumDic[ReadingCategory.Global] : 0;
 | 
						||
 | 
						||
                            //可能没有配置阅片期 ,或者配置了 没有完成
 | 
						||
                            var finishedGlobalCount = 0;
 | 
						||
 | 
						||
                            var globalFinishedVisitTaskNumList = new List<decimal>();
 | 
						||
 | 
						||
                            //没有配置阅片期
 | 
						||
                            if (subjectReadingPeriondVisitNumList == null)
 | 
						||
                            {
 | 
						||
                                finishedGlobalCount = 0;
 | 
						||
                            }
 | 
						||
                            {
 | 
						||
                                globalFinishedVisitTaskNumList = subjectCriterionGroup.Where(t => subjectReadingPeriondVisitNumList.Any(c => (c + addReadingPeriodNum) == t.VisitTaskNum))
 | 
						||
                                                        .Select(t => new { t.VisitTaskNum, t.ArmEnum }).Distinct()
 | 
						||
                                                        .GroupBy(t => t.VisitTaskNum).Where(g => g.Count() == 2).Select(g => g.Key).ToList();
 | 
						||
 | 
						||
                                finishedGlobalCount = globalFinishedVisitTaskNumList.Count();
 | 
						||
 | 
						||
                            }
 | 
						||
 | 
						||
                            if (finishedGlobalCount != 0)
 | 
						||
                            {
 | 
						||
                                //最大的完成的全局是否产生裁判
 | 
						||
 | 
						||
                                var maxFinishedGlobalNum = globalFinishedVisitTaskNumList.Max();
 | 
						||
 | 
						||
                                var globalMaxTask = subjectCriterionGroup.FirstOrDefault(t => t.VisitTaskNum == maxFinishedGlobalNum);
 | 
						||
 | 
						||
                                // 触发了裁判
 | 
						||
                                if (globalMaxTask.IsTrigerJudge == true)
 | 
						||
                                {
 | 
						||
                                    //最大裁判完成了
 | 
						||
 | 
						||
                                    var maxJudgeVisitTaskNum = maxFinishedGlobalNum + ReadingCommon.TaskNumDic[ReadingCategory.Judge];
 | 
						||
 | 
						||
                                    if (globalMaxTask.JudgeResultTaskId != null)
 | 
						||
                                    {
 | 
						||
 | 
						||
                                        var maxJudgeArmEnum = subjectCriterionGroup.Where(t => t.Id == globalMaxTask.JudgeResultTaskId).FirstOrDefault().ArmEnum;
 | 
						||
 | 
						||
                                        if (item.VisitTaskNum < maxJudgeVisitTaskNum)
 | 
						||
                                        {
 | 
						||
                                            //触发裁判
 | 
						||
                                            item.IsTrigerJudge = true;
 | 
						||
 | 
						||
                                            if (item.ArmEnum == maxJudgeArmEnum)
 | 
						||
                                            {
 | 
						||
                                                item.IsJudgeSelect = true;
 | 
						||
                                            }
 | 
						||
                                            //裁判没选择的人设置为false
 | 
						||
                                            else
 | 
						||
                                            {
 | 
						||
                                                item.IsJudgeSelect = false;
 | 
						||
                                            }
 | 
						||
                                        }
 | 
						||
                                    }
 | 
						||
                                    else
 | 
						||
                                    {
 | 
						||
                                        //最大的裁判未完成
 | 
						||
 | 
						||
                                        //找到当前未阅最大裁判之前的已完成的最大裁判任务
 | 
						||
 | 
						||
                                        var finishedGlobalFinishedMaxJudge = subjectCriterionGroup.Where(t => globalFinishedVisitTaskNumList.Contains(t.VisitTaskNum) && t.IsTrigerJudge == true && t.JudgeResultTaskId != null).OrderByDescending(t => t.VisitTaskNum).FirstOrDefault();
 | 
						||
 | 
						||
 | 
						||
                                        //未完成裁判之前 没有已完成的全局裁判
 | 
						||
                                        if (finishedGlobalFinishedMaxJudge == null)
 | 
						||
                                        {
 | 
						||
                                            if (item.VisitTaskNum < maxJudgeVisitTaskNum)
 | 
						||
                                            {
 | 
						||
                                                item.IsTrigerJudge = true;
 | 
						||
                                                //item.IsJudgeSelect = null;
 | 
						||
                                            }
 | 
						||
                                        }
 | 
						||
                                        else
 | 
						||
                                        {
 | 
						||
 | 
						||
 | 
						||
                                            var maxFinishedJudgeVisitTaskNum = finishedGlobalFinishedMaxJudge.VisitTaskNum + +ReadingCommon.TaskNumDic[ReadingCategory.Judge];
 | 
						||
 | 
						||
                                            var maxFinishedJudgeArmEnum = subjectCriterionGroup.Where(t => t.Id == finishedGlobalFinishedMaxJudge.JudgeResultTaskId).FirstOrDefault().ArmEnum;
 | 
						||
 | 
						||
                                            if (item.VisitTaskNum < maxFinishedJudgeVisitTaskNum)
 | 
						||
                                            {
 | 
						||
                                                item.IsTrigerJudge = true;
 | 
						||
 | 
						||
                                                if (item.ArmEnum == maxFinishedJudgeArmEnum)
 | 
						||
                                                {
 | 
						||
                                                    item.IsJudgeSelect = true;
 | 
						||
                                                }
 | 
						||
                                                //裁判没选择的人设置为false
 | 
						||
                                                else
 | 
						||
                                                {
 | 
						||
                                                    item.IsJudgeSelect = false;
 | 
						||
                                                }
 | 
						||
                                            }
 | 
						||
                                            else if (item.VisitTaskNum > maxFinishedJudgeVisitTaskNum && item.VisitTaskNum < maxJudgeVisitTaskNum)
 | 
						||
                                            {
 | 
						||
                                                //完成裁判 和未完成裁判之间的 裁判选择标记默认是null
 | 
						||
 | 
						||
                                                item.IsTrigerJudge = true;
 | 
						||
                                            }
 | 
						||
                                            else
 | 
						||
                                            {
 | 
						||
                                                //在未完成全局裁判之后的访视  未知   都是null
 | 
						||
 | 
						||
                                                item.IsTrigerJudge = null;
 | 
						||
                                            }
 | 
						||
                                        }
 | 
						||
 | 
						||
 | 
						||
                                    }
 | 
						||
                                }
 | 
						||
                                else
 | 
						||
                                {
 | 
						||
                                    //最大的全局未产生裁判
 | 
						||
 | 
						||
                                    if (item.VisitTaskNum <= maxFinishedGlobalNum)
 | 
						||
                                    {
 | 
						||
                                        item.IsTrigerJudge = false;
 | 
						||
 | 
						||
                                        if (item.ArmEnum == Arm.DoubleReadingArm1)
 | 
						||
                                        {
 | 
						||
                                            item.IsJudgeSelect = true;
 | 
						||
 | 
						||
                                        }
 | 
						||
                                        else
 | 
						||
                                        {
 | 
						||
                                            item.IsJudgeSelect = false;
 | 
						||
                                        }
 | 
						||
                                    }
 | 
						||
                                }
 | 
						||
                            }
 | 
						||
 | 
						||
 | 
						||
                        }
 | 
						||
 | 
						||
                    }
 | 
						||
 | 
						||
                }
 | 
						||
 | 
						||
                downloadInfoList = downloadInfoList.Where(t => t.ReadingCategory == ReadingCategory.Visit).ToList();
 | 
						||
                return ResponseOutput.Ok(downloadInfoList);
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
 | 
						||
                var downloadInfo = _trialRepository.Where(t => t.Id == inCommand.TrialId).Select(t => new
 | 
						||
                {
 | 
						||
                    t.ResearchProgramNo,
 | 
						||
 | 
						||
                    VisitList = t.SubjectVisitList.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id)).Select(sv => new
 | 
						||
                    {
 | 
						||
                        TrialSiteCode = sv.TrialSite.TrialSiteCode,
 | 
						||
                        SubjectCode = sv.Subject.Code,
 | 
						||
                        VisitName = sv.VisitName,
 | 
						||
                        StudyList = sv.StudyList.Select(u => new
 | 
						||
                        {
 | 
						||
                            u.PatientId,
 | 
						||
                            u.StudyTime,
 | 
						||
                            u.StudyCode,
 | 
						||
 | 
						||
                            SeriesList = u.SeriesList.Where(t => isExportReading ? t.IsReading : true).Select(z => new
 | 
						||
                            {
 | 
						||
                                z.Modality,
 | 
						||
 | 
						||
                                InstancePathList = z.DicomInstanceList.Where(t => isExportReading ? t.IsReading : true).Select(k => new
 | 
						||
                                {
 | 
						||
                                    k.Path
 | 
						||
                                })
 | 
						||
                            })
 | 
						||
 | 
						||
                        }),
 | 
						||
 | 
						||
                        NoneDicomStudyList = sv.NoneDicomStudyList.Where(t => isExportReading ? t.IsReading : true).Select(nd => new
 | 
						||
                        {
 | 
						||
                            nd.Modality,
 | 
						||
                            nd.StudyCode,
 | 
						||
                            nd.ImageDate,
 | 
						||
 | 
						||
                            FileList = nd.NoneDicomFileList.Where(t => isExportReading ? t.IsReading : true).Select(file => new
 | 
						||
                            {
 | 
						||
                                file.FileName,
 | 
						||
                                file.Path,
 | 
						||
                                file.FileType
 | 
						||
                            })
 | 
						||
                        })
 | 
						||
                    }).ToList()
 | 
						||
 | 
						||
                }).FirstOrDefault();
 | 
						||
 | 
						||
 | 
						||
                return ResponseOutput.Ok(downloadInfo);
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        #endregion
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        #region 之前后端下载废弃
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 受试者级别所有的影像
 | 
						||
        /// 访视级别的影响 传递subjectVisitId
 | 
						||
        /// 标准Id是可选的  不同标准有些检查可能有过滤
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="_subjectRepository"></param>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [Obsolete]
 | 
						||
        public async Task<IResponseOutput> GetSubejectOrVisitZipInfo([FromServices] IRepository<Subject> _subjectRepository, SubejctZipInfoQuery inQuery)
 | 
						||
        {
 | 
						||
            var isImageFilter = false;
 | 
						||
 | 
						||
            var criterionModalitys = string.Empty;
 | 
						||
 | 
						||
            if (inQuery.TrialReadingCriterionId != null)
 | 
						||
            {
 | 
						||
                var criterionInfo = await _readingQuestionCriterionTrialRepository.Where(t => t.Id == inQuery.TrialReadingCriterionId).Select(t => new { t.IsImageFilter, t.CriterionModalitys }).FirstOrDefaultAsync();
 | 
						||
 | 
						||
                if (criterionInfo != null)
 | 
						||
                {
 | 
						||
                    isImageFilter = criterionInfo.IsImageFilter;
 | 
						||
                    criterionModalitys = criterionInfo.CriterionModalitys;
 | 
						||
                }
 | 
						||
 | 
						||
            }
 | 
						||
 | 
						||
            if (inQuery.SubejectVisitId != null)
 | 
						||
            {
 | 
						||
                var query = from sv in _subjectVisitRepository.Where(t => t.Id == inQuery.SubejectVisitId)
 | 
						||
 | 
						||
 | 
						||
                            select new
 | 
						||
                            {
 | 
						||
                                SubjectCode = sv.Subject.Code,
 | 
						||
                                VisitName = sv.VisitName,
 | 
						||
                                StudyList = sv.StudyList.AsQueryable().WhereIf(isImageFilter, t => ("|" + criterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))
 | 
						||
                                .Select(u => new
 | 
						||
                                {
 | 
						||
                                    u.PatientId,
 | 
						||
                                    u.StudyTime,
 | 
						||
                                    u.StudyCode,
 | 
						||
 | 
						||
                                    SeriesList = u.SeriesList.Select(z => new
 | 
						||
                                    {
 | 
						||
                                        z.Modality,
 | 
						||
 | 
						||
                                        InstancePathList = z.DicomInstanceList.Select(k => new
 | 
						||
                                        {
 | 
						||
                                            k.Path
 | 
						||
                                        })
 | 
						||
                                    })
 | 
						||
 | 
						||
                                }),
 | 
						||
 | 
						||
                                NoneDicomStudyList = sv.NoneDicomStudyList.AsQueryable().WhereIf(isImageFilter, t => ("|" + criterionModalitys + "|").Contains("|" + t.Modality + "|"))
 | 
						||
                                .Select(nd => new
 | 
						||
                                {
 | 
						||
                                    nd.Modality,
 | 
						||
                                    nd.StudyCode,
 | 
						||
                                    nd.ImageDate,
 | 
						||
 | 
						||
                                    FileList = nd.NoneDicomFileList.Select(file => new
 | 
						||
                                    {
 | 
						||
                                        file.FileName,
 | 
						||
                                        file.Path,
 | 
						||
                                        file.FileType
 | 
						||
                                    })
 | 
						||
                                })
 | 
						||
                            };
 | 
						||
 | 
						||
                var result = query.ToList();
 | 
						||
 | 
						||
                return ResponseOutput.Ok(result);
 | 
						||
            }
 | 
						||
            else if (inQuery.SubejctId != null)
 | 
						||
            {
 | 
						||
                var query = from sv in _subjectRepository.Where(t => t.Id == inQuery.SubejctId).SelectMany(t => t.SubjectVisitList)
 | 
						||
 | 
						||
 | 
						||
                            select new
 | 
						||
                            {
 | 
						||
                                SubjectCode = sv.Subject.Code,
 | 
						||
                                VisitName = sv.VisitName,
 | 
						||
                                StudyList = sv.StudyList.AsQueryable().WhereIf(isImageFilter, t => ("|" + criterionModalitys + "|").Contains("|" + t.ModalityForEdit + "|"))
 | 
						||
                                .Select(u => new
 | 
						||
                                {
 | 
						||
                                    u.PatientId,
 | 
						||
                                    u.StudyTime,
 | 
						||
                                    u.StudyCode,
 | 
						||
 | 
						||
                                    SeriesList = u.SeriesList.Select(z => new
 | 
						||
                                    {
 | 
						||
                                        z.Modality,
 | 
						||
 | 
						||
                                        InstancePathList = z.DicomInstanceList.Select(k => new
 | 
						||
                                        {
 | 
						||
                                            k.Path
 | 
						||
                                        })
 | 
						||
                                    })
 | 
						||
 | 
						||
                                }),
 | 
						||
 | 
						||
                                NoneDicomStudyList = sv.NoneDicomStudyList.AsQueryable().WhereIf(isImageFilter, t => ("|" + criterionModalitys + "|").Contains("|" + t.Modality + "|"))
 | 
						||
                                .Select(nd => new
 | 
						||
                                {
 | 
						||
                                    nd.Modality,
 | 
						||
                                    nd.StudyCode,
 | 
						||
                                    nd.ImageDate,
 | 
						||
 | 
						||
                                    FileList = nd.NoneDicomFileList.Select(file => new
 | 
						||
                                    {
 | 
						||
                                        file.FileName,
 | 
						||
                                        file.Path,
 | 
						||
                                        file.FileType
 | 
						||
                                    })
 | 
						||
                                })
 | 
						||
                            };
 | 
						||
 | 
						||
                var result = query.ToList();
 | 
						||
 | 
						||
                return ResponseOutput.Ok(result);
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
                return ResponseOutput.NotOk("不允许 subjectId  SubejectVisitId 都不传递");
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// 后台任务调用,前端忽略该接口
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="trialId"></param>
 | 
						||
        /// <param name="subjectVisitId"></param>
 | 
						||
        /// <param name="isDicom"></param>
 | 
						||
        /// <param name="isAnonymize"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        [Obsolete]
 | 
						||
        public async Task PackageAndAnonymizImage(Guid trialId, Guid subjectVisitId, bool isDicom, bool isAnonymize = true)
 | 
						||
        {
 | 
						||
 | 
						||
            var subjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == subjectVisitId);
 | 
						||
 | 
						||
            try
 | 
						||
            {
 | 
						||
                var addOrUpdateFixedFieldList = new List<SystemAnonymization>();
 | 
						||
 | 
						||
                var ircFieldList = new List<SystemAnonymization>();
 | 
						||
 | 
						||
                if (isAnonymize)
 | 
						||
                {
 | 
						||
                    var systemAnonymizationList = _systemAnonymizationRepository.Where(t => t.IsEnable).ToList();
 | 
						||
 | 
						||
                    addOrUpdateFixedFieldList = systemAnonymizationList.Where(t => t.IsFixed).ToList();
 | 
						||
 | 
						||
                    ircFieldList = systemAnonymizationList.Where(t => t.IsFixed == false).ToList();
 | 
						||
                }
 | 
						||
 | 
						||
                var subjectAndVisitInfo = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new { SubjectCode = t.Subject.Code, t.Trial.TrialCode, t.VisitNum }).FirstOrDefault();
 | 
						||
 | 
						||
                var query = from sv in _subjectVisitRepository.Where(t => t.Id == subjectVisitId)
 | 
						||
 | 
						||
                            select new
 | 
						||
                            {
 | 
						||
                                SubjectCode = sv.Subject.Code,
 | 
						||
                                VisitName = sv.VisitName,
 | 
						||
                                StudyList = sv.StudyList.Select(u => new
 | 
						||
                                {
 | 
						||
                                    u.PatientId,
 | 
						||
                                    u.StudyTime,
 | 
						||
                                    u.StudyCode,
 | 
						||
 | 
						||
                                    SeriesList = u.SeriesList.Select(z => new
 | 
						||
                                    {
 | 
						||
                                        z.Modality,
 | 
						||
 | 
						||
                                        InstancePathList = z.DicomInstanceList.Select(k => new
 | 
						||
                                        {
 | 
						||
                                            k.Path
 | 
						||
                                        })
 | 
						||
                                    })
 | 
						||
 | 
						||
                                }),
 | 
						||
 | 
						||
                                NoneDicomStudyList = sv.NoneDicomStudyList.Select(nd => new
 | 
						||
                                {
 | 
						||
                                    nd.Modality,
 | 
						||
                                    nd.StudyCode,
 | 
						||
                                    nd.ImageDate,
 | 
						||
 | 
						||
                                    FileList = nd.NoneDicomFileList.Select(file => new
 | 
						||
                                    {
 | 
						||
                                        file.FileName,
 | 
						||
                                        file.Path,
 | 
						||
                                        file.FileType
 | 
						||
                                    })
 | 
						||
                                })
 | 
						||
                            };
 | 
						||
 | 
						||
                var info = query.FirstOrDefault();
 | 
						||
 | 
						||
                if (info != null)
 | 
						||
                {
 | 
						||
                    // 创建一个临时文件夹来存放文件
 | 
						||
                    string tempFolderPath = Path.Combine(Directory.GetCurrentDirectory(), $"DownloadTemp_{NewId.NextGuid()}");
 | 
						||
                    Directory.CreateDirectory(tempFolderPath);
 | 
						||
 | 
						||
                    //dicom  处理
 | 
						||
 | 
						||
                    if (isDicom)
 | 
						||
                    {
 | 
						||
                        // 遍历查询结果
 | 
						||
                        foreach (var studyInfo in info.StudyList)
 | 
						||
                        {
 | 
						||
                            // 遍历 Series
 | 
						||
                            foreach (var seriesInfo in studyInfo.SeriesList)
 | 
						||
                            {
 | 
						||
                                string studyDicomFolderPath = Path.Combine(tempFolderPath, "Dicom",/* $"{info.SubjectCode}_{info.VisitName}",*/ $"{studyInfo.StudyCode}_{studyInfo.StudyTime?.ToString("yyyy-MM-dd")}_{seriesInfo.Modality}");
 | 
						||
 | 
						||
                                // 创建 影像 文件夹
 | 
						||
                                Directory.CreateDirectory(studyDicomFolderPath);
 | 
						||
 | 
						||
                                // 遍历 InstancePathList
 | 
						||
                                foreach (var instanceInfo in seriesInfo.InstancePathList)
 | 
						||
                                {
 | 
						||
                                    // 复制文件到相应的文件夹
 | 
						||
                                    string destinationPath = Path.Combine(studyDicomFolderPath, Path.GetFileName(instanceInfo.Path));
 | 
						||
 | 
						||
                                    //下载到当前目录
 | 
						||
                                    await _oSSService.DownLoadFromOSSAsync(instanceInfo.Path, destinationPath);
 | 
						||
 | 
						||
                                    #region 匿名化逻辑
 | 
						||
 | 
						||
 | 
						||
                                    if (isAnonymize)
 | 
						||
                                    {
 | 
						||
                                        //受试者随机阅片,需要匿名化检查时间
 | 
						||
                                        DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
 | 
						||
                                        DicomDataset dataset = dicomFile.Dataset;
 | 
						||
                                        dataset.AddOrUpdate(DicomTag.StudyDate, string.Empty);
 | 
						||
                                        dataset.AddOrUpdate(DicomTag.StudyTime, string.Empty);
 | 
						||
 | 
						||
                                        #region 前端已经匿名化,不需要做相关tag匿名化
 | 
						||
                                        //DicomFile dicomFile = await DicomFile.OpenAsync(destinationPath, Encoding.Default);
 | 
						||
 | 
						||
                                        //DicomDataset dataset = dicomFile.Dataset;
 | 
						||
 | 
						||
                                        //foreach (var item in addOrUpdateFixedFieldList)
 | 
						||
                                        //{
 | 
						||
 | 
						||
                                        //    var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
 | 
						||
 | 
						||
                                        //    dataset.AddOrUpdate(dicomTag, item.ReplaceValue);
 | 
						||
                                        //}
 | 
						||
 | 
						||
                                        //foreach (var item in ircFieldList)
 | 
						||
                                        //{
 | 
						||
 | 
						||
                                        //    var dicomTag = new DicomTag(Convert.ToUInt16(item.Group, 16), Convert.ToUInt16(item.Element, 16));
 | 
						||
 | 
						||
                                        //    if (dicomTag == DicomTag.ClinicalTrialProtocolID)
 | 
						||
                                        //    {
 | 
						||
                                        //        dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode);
 | 
						||
 | 
						||
                                        //    }
 | 
						||
                                        //    if (dicomTag == DicomTag.ClinicalTrialSiteID)
 | 
						||
                                        //    {
 | 
						||
                                        //        //dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialSiteCode);
 | 
						||
 | 
						||
                                        //    }
 | 
						||
                                        //    if (dicomTag == DicomTag.ClinicalTrialSubjectID)
 | 
						||
                                        //    {
 | 
						||
                                        //        dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.SubjectCode);
 | 
						||
 | 
						||
                                        //    }
 | 
						||
                                        //    if (dicomTag == DicomTag.ClinicalTrialTimePointID)
 | 
						||
                                        //    {
 | 
						||
                                        //        dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.VisitNum.ToString());
 | 
						||
 | 
						||
                                        //    }
 | 
						||
                                        //    if (dicomTag == DicomTag.PatientID)
 | 
						||
                                        //    {
 | 
						||
                                        //        dataset.AddOrUpdate(dicomTag, subjectAndVisitInfo.TrialCode + "_" + subjectAndVisitInfo.SubjectCode);
 | 
						||
 | 
						||
                                        //    }
 | 
						||
 | 
						||
                                        //}
 | 
						||
                                        #endregion
 | 
						||
 | 
						||
                                    }
 | 
						||
                                    #endregion
 | 
						||
                                }
 | 
						||
                            }
 | 
						||
                        }
 | 
						||
 | 
						||
 | 
						||
                        var zipDicomPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy_Dicom.zip");
 | 
						||
                        ZipFile.CreateFromDirectory(Path.Combine(tempFolderPath, "Dicom"), zipDicomPath);
 | 
						||
                        //上传到Oss
 | 
						||
                        var relativeDicomPath = await _oSSService.UploadToOSSAsync(zipDicomPath, $"download_zip", false);
 | 
						||
 | 
						||
                        //await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitImageZipPath = relativeDicomPath });
 | 
						||
 | 
						||
 | 
						||
                        File.Delete(zipDicomPath);
 | 
						||
                    }
 | 
						||
                    else
 | 
						||
                    {
 | 
						||
                        var relativeNoneDicomPath = string.Empty;
 | 
						||
 | 
						||
                        if (info.NoneDicomStudyList.Count() == 1 && info.NoneDicomStudyList.SelectMany(t => t.FileList).Count() == 1)
 | 
						||
                        {
 | 
						||
                            relativeNoneDicomPath = info.NoneDicomStudyList.First().FileList.First().Path;
 | 
						||
                        }
 | 
						||
                        else
 | 
						||
                        {
 | 
						||
                            //非dicom 处理
 | 
						||
 | 
						||
                            foreach (var noneDicomStudy in info.NoneDicomStudyList)
 | 
						||
                            {
 | 
						||
                                string studyNoneDicomFolderPath = Path.Combine(tempFolderPath, "NoneDicom", /*$"{info.SubjectCode}_{info.VisitName}",*/ $"{noneDicomStudy.StudyCode}_{noneDicomStudy.ImageDate.ToString("yyyy-MM-dd")}_{noneDicomStudy.Modality}");
 | 
						||
 | 
						||
                                Directory.CreateDirectory(studyNoneDicomFolderPath);
 | 
						||
 | 
						||
                                foreach (var file in noneDicomStudy.FileList)
 | 
						||
                                {
 | 
						||
                                    string destinationPath = Path.Combine(studyNoneDicomFolderPath, Path.GetFileName(file.FileName));
 | 
						||
 | 
						||
                                    //下载到当前目录
 | 
						||
                                    await _oSSService.DownLoadFromOSSAsync(HttpUtility.UrlDecode(file.Path), destinationPath);
 | 
						||
                                }
 | 
						||
                            }
 | 
						||
 | 
						||
                            var zipNoneDicomPath = Path.Combine(Directory.GetCurrentDirectory(), $"{info.SubjectCode}_{info.VisitName}_ImageStudy_NoneDicom.zip");
 | 
						||
                            ZipFile.CreateFromDirectory(Path.Combine(tempFolderPath, "NoneDicom"), zipNoneDicomPath);
 | 
						||
                            relativeNoneDicomPath = await _oSSService.UploadToOSSAsync(zipNoneDicomPath, $"download_zip", false);
 | 
						||
 | 
						||
                            File.Delete(zipNoneDicomPath);
 | 
						||
                        }
 | 
						||
 | 
						||
                        //await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.Packed, VisitNoDicomImageZipPath = relativeNoneDicomPath });
 | 
						||
 | 
						||
 | 
						||
                    }
 | 
						||
 | 
						||
                    //清理文件夹
 | 
						||
                    Directory.Delete(tempFolderPath, true);
 | 
						||
 | 
						||
                }
 | 
						||
            }
 | 
						||
            catch (Exception ex)
 | 
						||
            {
 | 
						||
                //await _subjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.Id == subjectVisitId, u => new SubjectVisit() { PackState = PackState.WaitPack });
 | 
						||
 | 
						||
            }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
        }
 | 
						||
        #endregion
 | 
						||
 | 
						||
        #region 按照任务为维度 展示上传的列表  废弃
 | 
						||
        /// <summary>
 | 
						||
        /// IR 影像上传任务列表 --old  20240903 界面调整,现在先废弃
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        [Obsolete]
 | 
						||
        public async Task<List<SubjectUploadTaskInfo>> GetIRUploadTaskList_Old(CRCUploadTaskQuery inQuery)
 | 
						||
        {
 | 
						||
            var query = _visitTaskRepository.Where(t => t.SubjectId == inQuery.SubjectId && t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId
 | 
						||
                                                   && t.SourceSubjectVisitId != null && t.DoctorUserId == _userInfo.UserRoleId && t.TaskState == TaskState.Effect)
 | 
						||
               .ProjectTo<SubjectUploadTaskInfo>(_mapper.ConfigurationProvider);
 | 
						||
 | 
						||
 | 
						||
            var list = await query.Where(t => t.SubjectCode == inQuery.SubjectCode).ToListAsync();
 | 
						||
 | 
						||
            return list;
 | 
						||
        }
 | 
						||
        /// <summary>
 | 
						||
        /// IR 上传任务  dicom 列表  后处理的数据不能排序  --old  20240903 界面调整,现在先废弃
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        [Obsolete]
 | 
						||
        public async Task<List<IRUploadTaskDicomStudyDto>> GetIRUploadTaskDicomStudyList_Old(CRCUploadTaskStudyQuery inQuery)
 | 
						||
        {
 | 
						||
            var list = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
 | 
						||
                  .SelectMany(t => t.SourceSubjectVisit.StudyList)
 | 
						||
                 .ProjectTo<IRUploadTaskDicomStudyDto>(_mapper.ConfigurationProvider).SortToListAsync(inQuery);
 | 
						||
 | 
						||
            var taskDicomStudyList = _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
 | 
						||
                  .SelectMany(t => t.TaskStudyList)
 | 
						||
                  .Select(u => new
 | 
						||
                  {
 | 
						||
                      u.Id,
 | 
						||
                      u.SeriesCount,
 | 
						||
                      u.InstanceCount,
 | 
						||
                      SopInstanceList = u.InstanceList.Select(t => t.SopInstanceUid).ToList()
 | 
						||
                  })
 | 
						||
                 .ToList();
 | 
						||
 | 
						||
            foreach (var item in list)
 | 
						||
            {
 | 
						||
                var find = taskDicomStudyList.FirstOrDefault(t => t.Id == item.Id);
 | 
						||
 | 
						||
                if (find != null)
 | 
						||
                {
 | 
						||
                    item.UploadedInstanceCount = find.InstanceCount;
 | 
						||
                    item.UploadedSopInstanceUidList = find.SopInstanceList;
 | 
						||
                    item.UploadedSeriesCount = find.SeriesCount;
 | 
						||
                }
 | 
						||
            }
 | 
						||
 | 
						||
            return list;
 | 
						||
        }
 | 
						||
 | 
						||
        /// <summary>
 | 
						||
        /// IR 上传任务  nonedicom 列表  后处理的数据不能排序  --old  20240903 界面调整,现在先废弃
 | 
						||
        /// </summary>
 | 
						||
        /// <param name="inQuery"></param>
 | 
						||
        /// <returns></returns>
 | 
						||
        [HttpPost]
 | 
						||
        [Obsolete]
 | 
						||
        public async Task<List<IRUploadTaskNoneDicomStudyDto>> GetIRUploadTaskNoneDicomStudyList_Old(CRCUploadTaskStudyQuery inQuery)
 | 
						||
        {
 | 
						||
            var list = await _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
 | 
						||
                 .SelectMany(t => t.SourceSubjectVisit.StudyList)
 | 
						||
                .ProjectTo<IRUploadTaskNoneDicomStudyDto>(_mapper.ConfigurationProvider).SortToListAsync(inQuery);
 | 
						||
 | 
						||
            var taskNoneDicomStudyList = _visitTaskRepository.Where(t => t.Id == inQuery.VisitTaskId)
 | 
						||
                  .SelectMany(t => t.TaskNoneDicomStudyFileList).Where(t => t.VisitTaskId == inQuery.VisitTaskId)
 | 
						||
                  .Select(u => new
 | 
						||
                  {
 | 
						||
                      u.OriginNoneDicomStudyId,
 | 
						||
                  })
 | 
						||
                 .ToList();
 | 
						||
 | 
						||
            foreach (var item in list)
 | 
						||
            {
 | 
						||
                item.UploadedFileCount = taskNoneDicomStudyList.Where(t => t.OriginNoneDicomStudyId == item.Id).Count();
 | 
						||
            }
 | 
						||
 | 
						||
            return list;
 | 
						||
 | 
						||
        }
 | 
						||
        #endregion
 | 
						||
 | 
						||
    }
 | 
						||
 | 
						||
 | 
						||
}
 |