irc-netcore-api/IRaCIS.Core.Application/Service/Visit/PatientService.cs

1324 lines
71 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//using IRaCIS.Application.Interfaces;
//using IRaCIS.Application.Contracts;
//using IRaCIS.Core.Application.Filter;
//using IRaCIS.Core.Domain.Share;
//using Microsoft.AspNetCore.Mvc;
//using Microsoft.AspNetCore.Authorization;
//using IRaCIS.Core.Application.Auth;
//using MassTransit;
//using Panda.DynamicWebApi.Attributes;
//using DocumentFormat.OpenXml.Spreadsheet;
//using AutoMapper.EntityFrameworkCore;
//using IRaCIS.Core.Domain.Models;
//using IRaCIS.Core.Application.Service.Reading.Dto;
//using Microsoft.Extensions.Options;
//using Microsoft.Extensions.Configuration;
//using Microsoft.Extensions.Configuration.Json;
//using Newtonsoft.Json;
//using Newtonsoft.Json.Linq;
//using SharpCompress.Common;
//using System.Reactive.Subjects;
//using Subject = IRaCIS.Core.Domain.Models.Subject;
//using IRaCIS.Core.Application.ViewModel;
//using Medallion.Threading;
//using IRaCIS.Core.Infrastructure;
//using EasyCaching.Core;
//using Pipelines.Sockets.Unofficial.Arenas;
//using IRaCIS.Core.Application.Contracts;
//using MailKit.Search;
//using DocumentFormat.OpenXml.Office2010.Excel;
//using IRaCIS.Core.Application.Contracts.Dicom.DTO;
//using IRaCIS.Core.Application.Helper;
//using NPOI.SS.Formula.Functions;
//using System.Linq;
//using System.Linq.Dynamic.Core;
//using System.Text;
//using DocumentFormat.OpenXml.EMMA;
//using Azure;
//using System.IO.Compression;
//using static IRaCIS.Core.Domain.Share.StaticData;
//using FellowOakDicom;
//using DocumentFormat.OpenXml.Office2010.Drawing;
//using EasyCaching.Core.DistributedLock;
//using IDistributedLockProvider = Medallion.Threading.IDistributedLockProvider;
//using DocumentFormat.OpenXml.InkML;
//namespace IRaCIS.Application.Services
//{
// [ApiExplorerSettings(GroupName = "Trial")]
// public class PatientService : BaseService
// {
// private readonly IRepository<Trial> _trialRepository;
// private readonly IRepository<SCPPatient> _patientRepository;
// private readonly IRepository<SCPStudy> _studyRepository;
// private readonly IRepository<Subject> _subjectRepository;
// private readonly IRepository<SubjectVisit> _subjectVisitRepository;
// private readonly IDistributedLockProvider _distributedLockProvider;
// public PatientService(IRepository<SCPStudy> studyRepository, IRepository<Trial> trialRepository, IRepository<SCPPatient> patientRepository, IRepository<Subject> subjectRepository, IRepository<SubjectVisit> subjectVisitRepository, IDistributedLockProvider distributedLockProvider)
// {
// _studyRepository = studyRepository;
// _trialRepository = trialRepository;
// _patientRepository = patientRepository;
// _subjectRepository = subjectRepository;
// _subjectVisitRepository = subjectVisitRepository;
// _distributedLockProvider = distributedLockProvider;
// }
// #region 患者检查管理
// /// <summary>
// ///检查管理-> 检查Tab 患者列表 (带加入的项目信息 以及检查统计) 原型标注错误,不是检查列表
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<IResponseOutput<PageOutput<PatientTrialView>>> GetPatientList(PatientTrialQuery inQuery)
// {
// var isAdminOrOA = _userInfo.UserTypeEnumInt == (int)UserTypeEnum.Admin || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.OA || _userInfo.UserTypeEnumInt == (int)UserTypeEnum.SuperAdmin;
// #region new ok
// var query = _patientRepository
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), t => t.PatientIdStr.Contains(inQuery.PatientIdStr))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientName), t => t.PatientName.Contains(inQuery.PatientName))
// //.WhereIf(!string.IsNullOrWhiteSpace(inQuery.ExperimentName), t => t.SubjectPatientList.Any(t => t.Subject.Trial.ExperimentName.Contains(inQuery.ExperimentName)))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.CallingAE), t => t.SCPStudyList.Any(t => t.CallingAE == inQuery.CallingAE))
// .WhereIf(inQuery.BeginPushTime != null, t => t.LatestPushTime >= inQuery.BeginPushTime)
// .WhereIf(inQuery.EndPushTime != null, t => t.LatestPushTime <= inQuery.EndPushTime);
// foreach (var calledAE in inQuery.CalledAEList)
// {
// query = query.Where(t => t.SCPStudyList.Select(c => c.CalledAE).Contains(calledAE));
// }
// var resultQuery = from patient in query
// select new PatientTrialView()
// {
// PatientId = patient.Id,
// PatientBirthDate = patient.PatientBirthDate,
// CreateTime = patient.CreateTime,
// CalledAEList = patient.SCPStudyList.Select(t => t.CalledAE).Distinct().ToList(),
// CallingAEList = patient.SCPStudyList.Select(t => t.CallingAE).Distinct().ToList(),
// CreateUserId = patient.CreateUserId,
// UpdateTime = patient.UpdateTime,
// UpdateUserId = patient.UpdateUserId,
// EarliestStudyTime = patient.EarliestStudyTime,
// LatestStudyTime = patient.LatestStudyTime,
// LatestPushTime = patient.LatestPushTime,
// PatientAge = patient.PatientAge,
// PatientName = patient.PatientName,
// PatientIdStr = patient.PatientIdStr,
// PatientSex = patient.PatientSex,
// StudyCount = patient.SCPStudyList.Count(),
// TrialList = patient.SubjectPatientList.Where(t => isAdminOrOA ? true : t.Subject.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id)).Select(c => new PatientTrialStatInfo()
// {
// ExperimentName = c.Subject.Trial.ExperimentName,
// VisitCount = c.Subject.SubjectVisitList.Count()
// }).ToList(),
// };
// var pageList = await resultQuery.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField == string.Empty ? nameof(PatientQueryView.PatientIdStr) : inQuery.SortField, inQuery.Asc);
// #endregion
// return ResponseOutput.Ok(pageList);
// }
// /// <summary>
// /// 检查管理-> 获取患者检查列表(同步影像数据之前的)
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<List<PatientStudySimpleView>> GetPatientStudyList(PatientStudyInfoQuery inQuery)
// {
// var query = from scpStudy in _studyRepository.Where(t => t.PatientId == inQuery.PatientId)
// .WhereIf(inQuery.EarliestStudyTime != null, t => t.StudyTime >= inQuery.EarliestStudyTime)
// .WhereIf(inQuery.LatestStudyTime != null, t => t.StudyTime <= inQuery.LatestStudyTime)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.Modalities), t => t.Modalities.Contains(inQuery.Modalities))
// select new PatientStudySimpleView()
// {
// Description = scpStudy.Description,
// CalledAE = scpStudy.CalledAE,
// CallingAE = scpStudy.CallingAE,
// InstanceCount = scpStudy.InstanceCount,
// Modalities = scpStudy.Modalities,
// PatientId = scpStudy.PatientId,
// SCPStudyId = scpStudy.Id,
// SeriesCount = scpStudy.SeriesCount,
// StudyTime = scpStudy.StudyTime,
// };
// var sortField = string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(PatientStudySimpleView.StudyTime) : inQuery.SortField;
// var orderQuery = inQuery.Asc ? query.OrderBy(sortField) : query.OrderBy(sortField + " desc");
// var list = await orderQuery.ToListAsync();
// return list;
// }
// public async Task<IResponseOutput<List<PatientSeriesDTO>>> GetPatientSeriesList(Guid scpStudyId,
// [FromServices] IRepository<SCPSeries> _seriesRepository,
// [FromServices] IRepository<SCPInstance> _instanceRepository
// )
// {
// var seriesList = await _seriesRepository.Where(s => s.StudyId == scpStudyId).OrderBy(s => s.SeriesNumber).
// ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime)
// .ProjectTo<PatientSeriesDTO>(_mapper.ConfigurationProvider).ToListAsync();
// var idList = await _instanceRepository.Where(s => s.StudyId == scpStudyId).OrderBy(t => t.SeriesId).ThenBy(t => t.InstanceNumber)
// .ThenBy(s => s.InstanceTime).ThenBy(s => s.CreateTime)
// .Select(t => new { t.SeriesId, t.Id, t.Path, t.NumberOfFrames, t.InstanceNumber }).ToListAsync();//.GroupBy(u => u.SeriesId);
// foreach (var item in seriesList)
// {
// item.InstanceList = idList.Where(s => s.SeriesId == item.Id).Select(u => u.Id).ToList();
// //处理多帧
// item.InstancePathList = idList.Where(s => s.SeriesId == item.Id).OrderBy(t => t.InstanceNumber)
// .SelectMany(u =>
// {
// if (u.NumberOfFrames > 1)
// {
// var pathList = new List<string>();
// for (int i = 1; i <= u.NumberOfFrames; i++)
// {
// pathList.Add(u.Path + "?frame=" + (i - 1));
// }
// return pathList;
// }
// else
// {
// return new List<string> { u.Path };
// }
// })
// .ToList();
// }
// var study = await _studyRepository.FindAsync(scpStudyId);
// return ResponseOutput.Ok(seriesList, study);
// }
// /// <summary>
// /// 清除该患者绑定的受试者的所有的数据、(subject subjectVisit visitTask dicom)
// /// </summary>
// /// <param name="patientId"></param>
// /// <returns></returns>
// [UnitOfWork]
// public async Task<IResponseOutput> DeletePatientStudyAllData(Guid patientId,
// [FromServices] IRepository<VisitTask> _visitTaskRepository,
// [FromServices] IRepository<SCPSeries> _SeriesRepository,
// [FromServices] IRepository<SCPInstance> _instanceRepository,
// [FromServices] IRepository<DicomStudy> _dicomStudyRepository,
// [FromServices] IRepository<DicomSeries> _dicomSeriesRepository,
// [FromServices] IRepository<DicomInstance> _dicomInstanceRepository,
// [FromServices] IOSSService oSSService)
// {
// //清理自己管理的项目的数据
// var subjectPatientList = await _subjectPatientRepository.Where(t => t.PatientId == patientId && t.Subject.Trial.TrialUserList.Any(t => t.UserId == _userInfo.Id))
// .Select(t => new { t.SubjectId, StudyInstanceUidList = t.Patient.SCPStudyList.Select(t => t.StudyInstanceUid).ToList() }).ToListAsync();
// if (_studyRepository.Any(t => t.IsUploadFinished == false && t.PatientId == patientId))
// {
// return ResponseOutput.NotOk("当前患者有检查正在上传,不允许清理数据");
// }
// foreach (var item in subjectPatientList)
// {
// var subjectId = item.SubjectId;
// await _subjectRepository.BatchDeleteNoTrackingAsync(t => t.Id == subjectId);
// await _subjectVisitRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == subjectId);
// await _visitTaskRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == subjectId);
// await _dicomStudyRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == subjectId);
// await _dicomSeriesRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == subjectId);
// await _dicomInstanceRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == subjectId);
// }
// var instanceUidList = subjectPatientList.SelectMany(t => t.StudyInstanceUidList).Distinct().ToList();
// foreach (var studyInstanceUid in instanceUidList)
// {
// {
// var ossFolderPath = $"Dicom/{studyInstanceUid}";
// await oSSService.DeleteFromPrefix(ossFolderPath);
// }
// }
// var sCPStudyIdList = _studyRepository.Where(t => t.PatientId == patientId).Select(t => t.Id).ToList();
// await _patientRepository.BatchDeleteNoTrackingAsync(t => t.Id == patientId);
// foreach (var item in sCPStudyIdList)
// {
// await _studyRepository.BatchDeleteNoTrackingAsync(t => t.Id == item);
// await _SeriesRepository.BatchDeleteNoTrackingAsync(t => t.StudyId == item);
// await _instanceRepository.BatchDeleteNoTrackingAsync(t => t.StudyId == item);
// }
// return ResponseOutput.Ok();
// }
// #endregion
// #region 受试者管理
// [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
// [HttpPost]
// public async Task<IResponseOutput<string>> AddOrUpdateSubject([FromBody] AddOrUpdateSubjectCommand subjectCommand)
// {
// var svlist = new List<SubjectVisit>();
// var verifyExp1 = new EntityVerifyExp<Subject>()
// {
// VerifyExp = u => u.Code == subjectCommand.Code && u.TrialId == subjectCommand.TrialId,
// //---已存在具有相关受试者编号的受试者。
// VerifyMsg = _localizer["Subject_DuplicateSubjectNum"]
// };
// Subject? mapedSubject = null;
// if (subjectCommand.Id == null) //insert
// {
// mapedSubject = await _subjectRepository.InsertFromDTOAsync(subjectCommand, false, verifyExp1);
// }
// else //update
// {
// mapedSubject = await _subjectRepository.UpdateFromDTOAsync(subjectCommand, false, false, verifyExp1/*, verifyExp2*/);
// }
// await _subjectRepository.SaveChangesAsync();
// return ResponseOutput.Ok(mapedSubject.Id.ToString());
// }
// /// <summary>
// /// 受试者管理-> 受试者列表 (带患者信息,患者信息是数组)
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<IResponseOutput<PageOutput<PatienSubejctView>>> GetPatientSubejctList(PatientSubjectQuery inQuery)
// {
// var subjectQuery = _subjectRepository.Where(u => u.TrialId == inQuery.TrialId)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.Code), t => t.Code.Contains(inQuery.Code))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.ShortName), t => t.ShortName.Contains(inQuery.ShortName))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.Sex), t => t.Sex.Contains(inQuery.Sex))
// //.WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), t => t.SubjectPatientList.Any(t => t.Patient.PatientIdStr.Contains(inQuery.PatientIdStr)))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientName), t => t.SubjectPatientList.Any(t => t.Patient.PatientName.Contains(inQuery.PatientName)))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientSex), t => t.SubjectPatientList.Any(t => t.Patient.PatientSex.Contains(inQuery.PatientSex)))
// .WhereIf(inQuery.Status != null, t => t.Status == inQuery.Status)
// .ProjectTo<PatienSubejctView>(_mapper.ConfigurationProvider);
// var pageList = await subjectQuery.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField == string.Empty ? nameof(PatienSubejctView.Code) : inQuery.SortField, inQuery.Asc);
// return ResponseOutput.Ok(pageList);
// }
// /// <summary>
// /// 受试者管理-> 患者列表 subject 列表进入,进行关系绑定初始化列表,排除已绑定的患者和已绑定给其他subject的患者
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<IResponseOutput<PageOutput<PatientQueryView>>> GetPatientInitList(PatientQuery inQuery)
// {
// var query = _patientRepository
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), t => t.PatientIdStr.Contains(inQuery.PatientIdStr))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientName), t => t.PatientName.Contains(inQuery.PatientName))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.CallingAE), t => t.SCPStudyList.Any(t => t.CallingAE == inQuery.CallingAE))
// .WhereIf(inQuery.EarliestStudyTime != null, t => t.EarliestStudyTime >= inQuery.EarliestStudyTime)
// .WhereIf(inQuery.LatestStudyTime != null, t => t.LatestStudyTime <= inQuery.LatestStudyTime)
// //排除该受试者已绑定的患者
// //.WhereIf(inQuery.SubjectId != null, t => !t.SubjectPatientList.Any(u => u.SubjectId == inQuery.SubjectId))
// //排除该项目已绑定的其他患者
// .Where(t => !t.SubjectPatientList.Any(c => c.Subject.TrialId == inQuery.TrialId));
// foreach (var calledAE in inQuery.CalledAEList)
// {
// query = query.Where(t => t.SCPStudyList.Select(c => c.CalledAE).Contains(calledAE));
// }
// var patientQuery = query.ProjectTo<PatientQueryView>(_mapper.ConfigurationProvider);
// var pageList = await patientQuery.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField == string.Empty ? nameof(PatientQueryView.PatientIdStr) : inQuery.SortField, inQuery.Asc);
// return ResponseOutput.Ok(pageList);
// }
// /// <summary>
// /// 受试者管理->患者列表 Dicom AE 下拉框数据获取
// /// </summary>
// /// <returns></returns>
// public async Task<List<string>> GetDicomCalledAEList()
// {
// var list = await _studyRepository.Select(t => t.CalledAE).Distinct().ToListAsync();
// return list;
// }
// public async Task<List<string>> GetDicomCallingAEList()
// {
// var list = await _studyRepository.Select(t => t.CallingAE).Distinct().ToListAsync();
// return list;
// }
// /// <summary>
// ///受试者管理-> 患者列表 模糊搜索下拉 选择subject 排除已绑定并提交的
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<List<SubjectSelectDto>> GetTrialSubejctSelectList(SubjectSelectQuery inQuery)
// {
// var list = await _subjectRepository.Where(t => t.TrialId == inQuery.TrialId && t.Status == SubjectStatus.OnVisit)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), u => u.Code.Contains(inQuery.SubjectCode))
// .WhereIf(inQuery.SubjectId != null, t => t.Id == inQuery.SubjectId)
// //.Where(t => !t.SubjectVisitList.SelectMany(t => t.SCPStudySubjectVisitList).Any(c => c.StudyId != null))
// .Select(t => new SubjectSelectDto()
// {
// SubejctId = t.Id,
// SubjectCode = t.Code,
// Status = t.Status,
// Sex = t.Sex,
// ShortName = t.ShortName,
// Age = t.Age,
// BirthDate = t.BirthDate,
// //PatientList = t.SubjectPatientList.Select(c => new PatienBasicInfo() { PatientId = c.PatientId, PatientIdStr = c.Patient.PatientIdStr }).ToList()
// })
// .ToListAsync();
// return list;
// }
// #endregion
// #region 患者和受试者绑定,生成访视,预先绑定检查和访视
// /// <summary>
// /// 提交 患者检查和访视的绑定
// /// </summary>
// /// <param name="inCommand"></param>
// /// <returns></returns>
// [HttpPost]
// [UnitOfWork]
// [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
// public async Task<IResponseOutput> SubmitVisitStudyBinding(SubmitVisitStudyBindingCommand inCommand, [FromServices] IOptionsMonitor<ServiceVerifyConfigOption> _basicSystemConfigConfig)
// {
// //防止访视重复
// inCommand.SubjectVisitIdList = inCommand.SubjectVisitIdList.Distinct().ToList();
// //确认当前提交的最大的访视之前所有的访视都已提交,并且没有漏的
// var curentMaxNum = await _subjectVisitRepository.Where(t => inCommand.SubjectVisitIdList.Contains(t.Id)).Select(t => t.VisitNum).MaxAsync();
// var allVisitList = _subjectVisitRepository.Where(t => t.TrialId == inCommand.TrialId && t.SubjectId == inCommand.SubjectId && t.VisitNum <= curentMaxNum).Select(t => new { SubjectVisitId = t.Id, t.Subject.Status, t.VisitNum, t.SubmitState }).OrderBy(t => t.VisitNum).ToList();
// //批量提交
// if (inCommand.SubjectVisitIdList.Count > 1)
// {
// if (allVisitList.Where(t => t.SubmitState != SubmitStateEnum.Submitted).Count() != inCommand.SubjectVisitIdList.Count())
// {
// return ResponseOutput.NotOk(_localizer["当前批量提交的访视中间有遗漏的访视或者前序有访视未提交"]);
// }
// }
// else
// {
// if (allVisitList.Any(t => t.VisitNum < curentMaxNum && t.SubmitState != SubmitStateEnum.Submitted))
// {
// return ResponseOutput.NotOk(_localizer["前序有访视未提交,请先提交前序访视"]);
// }
// }
// if (allVisitList.Any(t => t.Status == SubjectStatus.EndOfVisit))
// {
// return ResponseOutput.NotOk(_localizer["受试者状态为访视结束,不允许提交访视生成任务"]);
// }
// //var list = await _studySubjectVisitRepository.Where(t => inCommand.SubjectVisitIdList.Contains(t.SubjectVisitId)).Select(t => new { t.SCPStudyId, t.SCPStudy.PatientId, t.SubjectVisitId, t.SubjectVisit.VisitNum, t.SubjectVisit.SubjectId, SubjectCode = t.SubjectVisit.Subject.Code, t.SubjectVisit.TrialId, t.SCPStudy.StudyTime, t.StudyId, t.SCPStudy.IsUploadFinished }).OrderBy(t => t.StudyTime).ToListAsync();
// //if (list.Any(t => t.StudyId != null))
// //{
// // return ResponseOutput.NotOk(_localizer["有访视和检查处于已绑定关系,不允许再次提交绑定"]);
// //}
// //if (list.Any(t => t.IsUploadFinished == false))
// //{
// // return ResponseOutput.NotOk(_localizer["有访视检查正在传输中,不允许提交"]);
// //}
// ////判断每个subject 批量提交的是否符合时间要求
// //foreach (var g in list.GroupBy(t => new { t.SubjectId, t.SubjectCode }))
// //{
// // var visitOrderStudyList = g.OrderBy(t => t.VisitNum).ThenBy(t => t.StudyTime).ToList();
// // var studyTimeOrderList = visitOrderStudyList.OrderBy(t => t.StudyTime).ToList();
// // bool arraysEqual = visitOrderStudyList.SequenceEqual(studyTimeOrderList);
// // if (!arraysEqual)
// // {
// // return ResponseOutput.NotOk(_localizer[$"{g.Key.SubjectCode}所提交的访视中的检查时间,不符合后续访视的检查时间比前序检查的时间大的要求"]);
// // }
// // if (DateTime.Now < studyTimeOrderList.Max(t => t.StudyTime))
// // {
// // return ResponseOutput.NotOk(_localizer[$"您当前修改了服务器时间,试图绕过软件授权,请恢复服务器时间,并联系授权方授权才可进行操作"]);
// // }
// //}
// var trialConfig = await _trialRepository.Where(t => t.Id == inCommand.TrialId).Select(t => new { t.IsEnrollementQualificationConfirm, t.IsPDProgressView, t.AuthorizationEncrypt }).FirstOrDefaultAsync();
// //var decodedText = Cryptography.DecryptString(trialConfig.AuthorizationEncrypt, _basicSystemConfigConfig.CurrentValue.AESKey, "Trial_AuthorizationEncrypt");
// //var authInfo = JsonConvert.DeserializeObject<TrialAuthorizationInfo>(decodedText);
// var @lock = _distributedLockProvider.CreateLock($"StudyCode");
// using (await @lock.AcquireAsync())
// {
// var dbStudyCodeIntMax = _repository.Where<DicomStudy>(s => s.TrialId == inCommand.TrialId).Select(t => t.Code).DefaultIfEmpty().Max();
// int currentNextCodeInt = dbStudyCodeIntMax + 1;
// foreach (var item in list)
// {
// var dbSubjectVisit = await _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == item.SubjectVisitId);
// //处理脏数据,可能之前的绑定的数据状态是待上传,但是已经绑定了检查
// if (dbSubjectVisit.SubmitState == SubmitStateEnum.ToSubmit || dbSubjectVisit.SubmitState == SubmitStateEnum.None)
// {
// dbSubjectVisit.SubmitState = SubmitStateEnum.Submitted;
// dbSubjectVisit.SubmitTime = DateTime.Now;
// dbSubjectVisit.SubmitUserId = _userInfo.Id;
// //维护统一状态
// //dbSubjectVisit.ReadingStatus = ReadingStatusEnum.TaskAllocate;
// dbSubjectVisit.AuditState = AuditStateEnum.QCPassed;
// dbSubjectVisit.CheckState = CheckStateEnum.CVPassed;
// dbSubjectVisit.IsEnrollmentConfirm = dbSubjectVisit.IsBaseLine ? trialConfig.IsEnrollementQualificationConfirm : false;
// dbSubjectVisit.PDState = trialConfig.IsPDProgressView ? PDStateEnum.PDProgress : PDStateEnum.None;
// }
// var find = _studyRepository.Where(t => t.Id == item.SCPStudyId).Include(t => t.SeriesList).Include(t => t.InstanceList).FirstOrDefault();
// if (find != null)
// {
// //重新算Id
// Guid studyId = IdentifierHelper.CreateGuid(item.TrialId.ToString(), find.StudyInstanceUid);
// find.Id = studyId;
// var newStuty = _mapper.Map<DicomStudy>(find);
// await _repository.AddAsync(newStuty);
// //newStuty.Id = NewId.NextSequentialGuid();
// newStuty.SeqId = Guid.Empty;
// newStuty.Code = currentNextCodeInt;
// newStuty.StudyCode = AppSettings.GetCodeStr(currentNextCodeInt, nameof(DicomStudy));
// newStuty.TrialId = item.TrialId;
// newStuty.SubjectId = item.SubjectId;
// newStuty.SubjectVisitId = item.SubjectVisitId;
// var newSeriesList = _mapper.Map<List<DicomSeries>>(find.SeriesList);
// foreach (var series in newSeriesList)
// {
// Guid seriesId = IdentifierHelper.CreateGuid(item.TrialId.ToString(), find.StudyInstanceUid, series.SeriesInstanceUid);
// //重新算Id
// series.Id = seriesId;
// series.StudyId = newStuty.Id;
// series.SeqId = Guid.Empty;
// series.TrialId = item.TrialId;
// series.SubjectId = item.SubjectId;
// series.SubjectVisitId = item.SubjectVisitId;
// }
// await _repository.AddRangeAsync(newSeriesList);
// var newInstanceList = _mapper.Map<List<DicomInstance>>(find.InstanceList);
// foreach (var instance in newInstanceList)
// {
// Guid seriesId = IdentifierHelper.CreateGuid(item.TrialId.ToString(), find.StudyInstanceUid, instance.SeriesInstanceUid);
// Guid instanceId = IdentifierHelper.CreateGuid(item.TrialId.ToString(), find.StudyInstanceUid, instance.SeriesInstanceUid, instance.SopInstanceUid);
// //重新算Id
// instance.Id = instanceId;
// instance.SeriesId = seriesId;
// instance.StudyId = newStuty.Id;
// instance.SeqId = Guid.Empty;
// instance.TrialId = item.TrialId;
// instance.SubjectId = item.SubjectId;
// instance.SubjectVisitId = item.SubjectVisitId;
// }
// await _repository.AddRangeAsync(newInstanceList);
// }
// currentNextCodeInt++;
// //await _studySubjectVisitRepository.BatchUpdateNoTrackingAsync(t => t.SubjectVisitId == item.SubjectVisitId && t.SCPStudyId == item.SCPStudyId, u => new SCPStudySubjectVisit() { StudyId = find.Id });
// //await _subjectPatientRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == item.SubjectId && t.PatientId == item.PatientId, u => new SubjectPatient() { IsBinded = true });
// }
// }
// //await _studySubjectVisitRepository.SaveChangesAsync();
// return ResponseOutput.Ok();
// }
// #endregion
// #region 访视基本管理
// /// <summary>
// /// 绑定访视 初始化患者检查列表
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<List<PatientStudySelectDto>> GetVisitPatientStudyList(PatientStudyQuery inQuery)
// {
// var patientQuery = from scpStudy in _studyRepository
// .Where(t => inQuery.PatientIdList.Contains(t.PatientId))
// .WhereIf(inQuery.EarliestStudyTime != null, t => t.StudyTime >= inQuery.EarliestStudyTime)
// .WhereIf(inQuery.LatestStudyTime != null, t => t.StudyTime <= inQuery.LatestStudyTime)
// join scpStudySubjectVisit in _studySubjectVisitRepository.Where(t => t.SubjectVisit.TrialId == inQuery.TrialId) on scpStudy.Id equals scpStudySubjectVisit.SCPStudyId into cc
// from scpStudySubjectVisit in cc.DefaultIfEmpty()
// select new PatientStudySelectDto()
// {
// Description = scpStudy.Description,
// CalledAE = scpStudy.CalledAE,
// InstanceCount = scpStudy.InstanceCount,
// Modalities = scpStudy.Modalities,
// PatientId = scpStudy.Patient.Id,
// PatientIdStr = scpStudy.PatientIdStr,
// PatientAge = scpStudy.PatientAge,
// PatientBirthDate = scpStudy.PatientBirthDate,
// PatientSex = scpStudy.PatientSex,
// PatientName = scpStudy.PatientName,
// SCPStudyId = scpStudy.Id,
// SeriesCount = scpStudy.SeriesCount,
// StudyTime = scpStudy.StudyTime,
// CallingAE = scpStudy.CallingAE,
// SubmitState = scpStudySubjectVisit.SubjectVisit.SubmitState,
// SubjectVisitId = scpStudySubjectVisit.SubjectVisitId
// }
// ;
// var sortField = string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(VisitPatientStudyView.StudyTime) : inQuery.SortField;
// var orderQuery = inQuery.Asc ? patientQuery.OrderBy(sortField) : patientQuery.OrderBy(sortField + " desc");
// var list = await orderQuery.ToListAsync();
// return list;
// }
// /// <summary>
// /// 访视管理- 获取subject 已存在的访视列表 ,同时获取项目访视的配置 在otherData里
// /// </summary>
// /// <param name="inQuery"></param>
// /// <param name="_subjectVisitReposiotry"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<IResponseOutput> GetSubjectVisitSelectList(SubjectVisitSelectQuery inQuery, [FromServices] IRepository<SubjectVisit> _subjectVisitReposiotry)
// {
// var scpStudyList = await _studySubjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId && t.SubjectId == inQuery.SubjectId && t.SCPStudyId != inQuery.SCPStudyId)
// .Select(t => new { t.SubjectVisitId, StudyTime = t.SCPStudy.StudyTime })
// .ToListAsync();
// var result = scpStudyList.GroupBy(t => t.SubjectVisitId)
// .Select(g => new
// {
// SubejctVisitId = g.Key,
// VisitMaxStudyTime = g.Max(c => c.StudyTime),
// VisitMinStudyTime = g.Min(c => c.StudyTime)
// }).ToList();
// var list = _subjectVisitReposiotry.Where(t => t.SubjectId == inQuery.SubjectId).ProjectTo<SubjectVisitSelectDto>(_mapper.ConfigurationProvider).ToList();
// foreach (var item in list)
// {
// item.VisitMaxStudyTime = result.Where(t => t.SubejctVisitId == item.Id).FirstOrDefault()?.VisitMaxStudyTime;
// item.VisitMinStudyTime = result.Where(t => t.SubejctVisitId == item.Id).FirstOrDefault()?.VisitMinStudyTime;
// }
// var trialconfig = _trialRepository.Where(t => t.Id == inQuery.TrialId).Select(t => new { t.BlindBaseLineName, t.BlindFollowUpPrefix }).FirstOrDefault();
// return ResponseOutput.Ok(list, trialconfig);
// }
// /// <summary>
// ///访视管理-> 访视列表 (带患者信息,患者信息是数组)
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<IResponseOutput<PageOutput<PatientSubjectVisitView>>> GetPatientSubejctVisitList(PatientSubejctVisitQuery inQuery)
// {
// var query = _subjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), u => u.Subject.Code.Contains(inQuery.SubjectCode))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectSex), u => u.Subject.Sex.Contains(inQuery.SubjectSex))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectShortName), u => u.Subject.ShortName.Contains(inQuery.SubjectShortName))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.VisitName), u => u.VisitName.Contains(inQuery.VisitName))
// .WhereIf(inQuery.SubmitState != null, u => u.SubmitState == inQuery.SubmitState)
// .WhereIf(inQuery.BeginStudyTime != null, t => t.SCPStudySubjectVisitList.Min(t => t.SCPStudy.StudyTime) >= inQuery.BeginStudyTime)
// .WhereIf(inQuery.EndStudyTime != null, t => t.SCPStudySubjectVisitList.Max(t => t.SCPStudy.StudyTime) <= inQuery.EndStudyTime)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), t => t.Subject.SubjectPatientList.Any(t => t.Patient.PatientIdStr.Contains(inQuery.PatientIdStr)))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientName), t => t.Subject.SubjectPatientList.Any(t => t.Patient.PatientName.Contains(inQuery.PatientName)))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientSex), t => t.Subject.SubjectPatientList.Any(t => t.Patient.PatientSex.Contains(inQuery.PatientSex)))
// .Select(t => new PatientSubjectVisitView()
// {
// PatientList = t.Subject.SubjectPatientList.Select(c => new PatientBasicInfo()
// {
// PatientId = c.PatientId,
// PatientAge = c.Patient.PatientAge,
// PatientBirthDate = c.Patient.PatientBirthDate,
// PatientIdStr = c.Patient.PatientIdStr,
// PatientSex = c.Patient.PatientSex,
// PatientName = c.Patient.PatientName,
// }).ToList(),
// TrialId = t.TrialId,
// SubjectId = t.SubjectId,
// SubjectVisitId = t.Id,
// SubjectAge = t.Subject.Age,
// SubjectSex = t.Subject.Sex,
// SubjectShortName = t.Subject.ShortName,
// SubjectCode = t.Subject.Code,
// SubmitState = t.SubmitState,
// SubmitTime = t.SubmitTime,
// VisitNum = t.VisitNum,
// VisitName = t.VisitName,
// VisitEarliestStudyTime = t.SCPStudySubjectVisitList.Min(t => t.SCPStudy.StudyTime),
// VisitLatestStudyTime = t.SCPStudySubjectVisitList.Max(t => t.SCPStudy.StudyTime),
// VisitImageZipPath = t.VisitImageZipPath,
// PackState = t.PackState,
// });
// var defalutSortArray = new string[] { nameof(PatientSubjectVisitView.SubjectId), nameof(PatientSubjectVisitView.VisitNum) };
// var pageList = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc, string.IsNullOrWhiteSpace(inQuery.SortField), defalutSortArray);
// return ResponseOutput.Ok(pageList);
// }
// /// <summary>
// ///访视管理-> 获取当前访视 已绑定的患者检查 (从访视列表 进入修改绑定)
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<List<VisitPatientStudyView>> GetCurrentVisitPatientStudyList(SubjectVisitStudyQuery inQuery)
// {
// var patientQuery = _studySubjectVisitRepository.Where(t => t.SubjectVisitId == inQuery.SujectVisitId && t.SubjectVisit.SubmitState != SubmitStateEnum.Submitted)
// //.WhereIf(inQuery.SubmitState != null, u => u.SubjectVisit.SubmitState == inQuery.SubmitState)
// .ProjectTo<VisitPatientStudyView>(_mapper.ConfigurationProvider);
// var sortField = string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(VisitPatientStudyView.StudyTime) : inQuery.SortField;
// var orderQuery = inQuery.Asc ? patientQuery.OrderBy(sortField) : patientQuery.OrderBy(sortField + " desc");
// var list = await orderQuery.ToListAsync();
// return list;
// }
// /// <summary>
// /// 访视管理-> 获取可选访视列表 (从访视列表 进入修改绑定)
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<List<VisitPatientStudyView>> GetPatientOtherStudyList(PatientStudyOtherQuery inQuery)
// {
// var query = from scpStudy in _studyRepository.Where(t => inQuery.PatientIdList.Contains(t.PatientId) && !t.SCPStudySubjectVisitList.Any(t => (t.SubjectVisitId == inQuery.SujectVisitId || t.SubjectVisit.SubmitState == SubmitStateEnum.Submitted) && t.TrialId == inQuery.TrialId))
// .WhereIf(inQuery.EarliestStudyTime != null, t => t.StudyTime >= inQuery.EarliestStudyTime)
// .WhereIf(inQuery.LatestStudyTime != null, t => t.StudyTime <= inQuery.LatestStudyTime)
// .WhereIf(!string.IsNullOrEmpty(inQuery.PatientIdStr), t => t.PatientIdStr.Contains(inQuery.PatientIdStr))
// //不属于该访视的检查 或者未绑定的检查
// join scpStudySubjectVisit in _studySubjectVisitRepository.Where(c => c.TrialId == inQuery.TrialId) on scpStudy.Id equals scpStudySubjectVisit.SCPStudyId
// into dd
// from scpStudySV in dd.DefaultIfEmpty()
// select new VisitPatientStudyView()
// {
// PatientIdStr = scpStudy.PatientIdStr,
// PatientBirthDate = scpStudy.PatientBirthDate,
// PatientAge = scpStudy.PatientAge,
// PatientName = scpStudy.PatientName,
// PatientSex = scpStudy.PatientSex,
// Description = scpStudy.Description,
// CalledAE = scpStudy.CalledAE,
// CallingAE = scpStudy.CallingAE,
// InstanceCount = scpStudy.InstanceCount,
// Modalities = scpStudy.Modalities,
// PatientId = scpStudy.PatientId,
// SCPStudyId = scpStudy.Id,
// SeriesCount = scpStudy.SeriesCount,
// StudyTime = scpStudy.StudyTime,
// SubmitState = scpStudySV.SubjectVisit.SubmitState,
// SubjectVisitId = scpStudySV.SubjectVisitId,
// VisitName = scpStudySV.SubjectVisit.VisitName,
// };
// #region 废弃
// //var notCurrentVisitQuey = _studySubjectVisitRepository.Where(t => t.SubjectVisitId != inQuery.SujectVisitId && t.SCPStudy.Patient.Id == inQuery.PatientId)
// // .Select(t => new VisitPatientStudyView()
// // {
// // Description = t.SCPStudy.Description,
// // CalledAE = t.SCPStudy.CalledAE,
// // InstanceCount = t.SCPStudy.InstanceCount,
// // Modalities = t.SCPStudy.Modalities,
// // PatientId = t.SCPStudy.PatientId,
// // SCPStudyId = t.SCPStudy.PatientId,
// // SeriesCount = t.SCPStudy.SeriesCount,
// // StudyTime = t.SCPStudy.StudyTime,
// // SubjectVisitId = t.SubjectVisitId,
// // VisitName = t.SubjectVisit.VisitName,
// // });
// //var notBindQuery= _studyRepository.Where(t => t.PatientId == inQuery.PatientId && t.pa)
// //var patientQuery = query
// // .ProjectTo<VisitPatientStudyView>(_mapper.ConfigurationProvider);
// #endregion
// var sortField = string.IsNullOrWhiteSpace(inQuery.SortField) ? nameof(VisitPatientStudyView.StudyTime) : inQuery.SortField;
// var orderQuery = inQuery.Asc ? query.OrderBy(sortField) : query.OrderBy(sortField + " desc");
// var list = await orderQuery.ToListAsync();
// return list;
// }
// #endregion
// #region 检查管理
// /// <summary>
// ///检查管理-> 检查列表 (同步影像数据之前的)
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<IResponseOutput<PageOutput<PatientStudyBeforeConfirmView>>> GetPatientStudyBeforeConfirmList(TrialPatientStudyQuery inQuery)
// {
// #region 只查询已绑定的
// //var query = _studySubjectVisitRepository.Where(t => t.SubjectVisit.TrialId == inQuery.TrialId)
// // .WhereIf(inQuery.PatientId != null, t => t.SCPStudy.PatientId == inQuery.PatientId)
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), u => u.SubjectVisit.Subject.Code.Contains(inQuery.SubjectCode))
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), u => u.SCPStudy.Patient.PatientIdStr.Contains(inQuery.PatientIdStr))
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientSex), t => t.SCPStudy.Patient.PatientSex.Contains(inQuery.PatientSex))
// // .WhereIf(inQuery.SubjectAge != null, t => t.SubjectVisit.Subject.Age == inQuery.SubjectAge)
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), u => u.SubjectVisit.Subject.Code.Contains(inQuery.SubjectCode))
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectSex), u => u.SubjectVisit.Subject.Sex.Contains(inQuery.SubjectSex))
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectShortName), t => t.SubjectVisit.Subject.ShortName.Contains(inQuery.SubjectShortName))
// // .WhereIf(inQuery.BeginStudyTime != null, t => t.SCPStudy.StudyTime >= inQuery.BeginStudyTime)
// // .WhereIf(inQuery.EndStudyTime != null, t => t.SCPStudy.StudyTime <= inQuery.EndStudyTime)
// // .Select(t => new PatientStudyBeforeConfirmView()
// // {
// // SubjectId = t.SubjectVisit.SubjectId,
// // SubjectAge = t.SubjectVisit.Subject.Age,
// // SubjectSex = t.SubjectVisit.Subject.Sex,
// // SubjectShortName = t.SubjectVisit.Subject.ShortName,
// // PatientId = t.SCPStudy.PatientId,
// // PatientAge = t.SCPStudy.PatientAge,
// // PatientBirthDate = t.SCPStudy.PatientBirthDate,
// // PatientIdStr = t.SCPStudy.PatientIdStr,
// // PatientSex = t.SCPStudy.PatientSex,
// // //PatientList = t.SubjectVisit.Subject.SubjectPatientList.Select(t => new PatientBasicInfo()
// // //{
// // // PatientId = t.PatientId,
// // // PatientAge = t.Patient.PatientAge,
// // // PatientBirthDate = t.Patient.PatientBirthDate,
// // // PatientIdStr = t.Patient.PatientIdStr,
// // // PatientSex = t.Patient.PatientSex,
// // //}).ToList(),
// // SubjectCode = t.SubjectVisit.Subject.Code,
// // SubmitState = t.SubjectVisit.SubmitState,
// // SubmitTime = t.SubjectVisit.SubmitTime,
// // VisitName = t.SubjectVisit.VisitName,
// // SubjectVisitId = t.SubjectVisitId,
// // VisitEarliestStudyTime = t.SubjectVisit.SCPStudySubjectVisitList.Min(t => t.SCPStudy.StudyTime),
// // VisitLatestStudyTime = t.SubjectVisit.SCPStudySubjectVisitList.Max(t => t.SCPStudy.StudyTime),
// // StudyId = t.SCPStudyId,
// // StudyTime = t.SCPStudy.StudyTime,
// // CallingAE = t.SCPStudy.CallingAE,
// // CalledAE = t.SCPStudy.CalledAE
// // });
// #endregion
// var query = from scpStudy in _studyRepository.Where(t => !t.SCPStudySubjectVisitList.Any(t => t.SubjectVisit.SubmitState == SubmitStateEnum.Submitted && t.TrialId == inQuery.TrialId))
// .WhereIf(inQuery.IsBindedVisit == false, t => !t.SCPStudySubjectVisitList.Any(t => t.TrialId == inQuery.TrialId))
// .WhereIf(inQuery.IsBindedVisit == true, t => t.SCPStudySubjectVisitList.Any(t => t.TrialId == inQuery.TrialId))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.VisitName), t => t.SCPStudySubjectVisitList.Any(t => t.TrialId == inQuery.TrialId && t.SubjectVisit.VisitName.Contains(inQuery.VisitName)))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientSex), t => t.Patient.PatientSex.Contains(inQuery.PatientSex))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), u => u.Patient.PatientIdStr.Contains(inQuery.PatientIdStr))
// .WhereIf(inQuery.BeginStudyTime != null, t => t.StudyTime >= inQuery.BeginStudyTime)
// .WhereIf(inQuery.EndStudyTime != null, t => t.StudyTime <= inQuery.EndStudyTime)
// join subjectPatient in _subjectPatientRepository.Where(t => t.Subject.TrialId == inQuery.TrialId)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), u => u.Subject.Code.Contains(inQuery.SubjectCode))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectSex), u => u.Subject.Sex.Contains(inQuery.SubjectSex))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectShortName), t => t.Subject.ShortName.Contains(inQuery.SubjectShortName))
// on scpStudy.PatientId equals subjectPatient.PatientId
// join scpStudySubjectVisit in _studySubjectVisitRepository.Where(t => t.TrialId == inQuery.TrialId)
// on scpStudy.Id equals scpStudySubjectVisit.SCPStudyId into dd
// from scpStudySV in dd.DefaultIfEmpty()
// select new PatientStudyBeforeConfirmView()
// {
// SubjectId = subjectPatient.Subject.Id,
// SubjectAge = subjectPatient.Subject.Age,
// SubjectSex = subjectPatient.Subject.Sex,
// SubjectShortName = subjectPatient.Subject.ShortName,
// SubjectCode = subjectPatient.Subject.Code,
// PatientId = scpStudy.PatientId,
// PatientName = scpStudy.PatientName,
// PatientAge = scpStudy.PatientAge,
// PatientBirthDate = scpStudy.PatientBirthDate,
// PatientIdStr = scpStudy.PatientIdStr,
// PatientSex = scpStudy.PatientSex,
// //PatientList = t.SubjectVisit.Subject.SubjectPatientList.Select(t => new PatientBasicInfo()
// //{
// // PatientId = t.PatientId,
// // PatientAge = t.Patient.PatientAge,
// // PatientBirthDate = t.Patient.PatientBirthDate,
// // PatientIdStr = t.Patient.PatientIdStr,
// // PatientSex = t.Patient.PatientSex,
// //}).ToList(),
// SubmitState = scpStudySV.SubjectVisit.SubmitState,
// SubmitTime = scpStudySV.SubjectVisit.SubmitTime,
// VisitName = scpStudySV.SubjectVisit.VisitName,
// VisitNum = scpStudySV.SubjectVisit.VisitNum,
// SubjectVisitId = scpStudySV.SubjectVisit.Id,
// VisitEarliestStudyTime = scpStudySV.SubjectVisit.SCPStudySubjectVisitList.Min(t => t.SCPStudy.StudyTime),
// VisitLatestStudyTime = scpStudySV.SubjectVisit.SCPStudySubjectVisitList.Max(t => t.SCPStudy.StudyTime),
// StudyId = scpStudy.Id,
// StudyTime = scpStudy.StudyTime,
// CallingAE = scpStudy.CallingAE,
// CalledAE = scpStudy.CalledAE,
// Description = scpStudy.Description,
// InstanceCount = scpStudy.InstanceCount,
// Modalities = scpStudy.Modalities,
// ModalityForEdit = scpStudy.ModalityForEdit,
// SeriesCount = scpStudy.SeriesCount
// };
// var defalutSortArray = new string[] { nameof(PatientStudyBeforeConfirmView.SubjectCode), nameof(PatientStudyBeforeConfirmView.VisitNum), nameof(PatientStudyBeforeConfirmView.StudyTime) };
// var pageList = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc, string.IsNullOrWhiteSpace(inQuery.SortField), defalutSortArray);
// return ResponseOutput.Ok(pageList);
// }
// /// <summary>
// ///检查管理-> 检查列表 (同步影像数据之后的 带患者信息 患者信息是数组)
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<IResponseOutput<PageOutput<PatientStudyView>>> GetTrialPatientStudyList(TrialPatientStudyQuery inQuery)
// {
// var query = _repository.Where<DicomStudy>(t => t.SubjectVisit.TrialId == inQuery.TrialId)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), u => u.SubjectVisit.Subject.Code.Contains(inQuery.SubjectCode))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), u => u.PatientIdStr.Contains(inQuery.PatientIdStr))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientSex), t => t.PatientSex.Contains(inQuery.PatientSex))
// .WhereIf(inQuery.SubjectAge != null, t => t.SubjectVisit.Subject.Age == inQuery.SubjectAge)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), u => u.SubjectVisit.Subject.Code.Contains(inQuery.SubjectCode))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectSex), u => u.SubjectVisit.Subject.Sex.Contains(inQuery.SubjectSex))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectShortName), t => t.SubjectVisit.Subject.ShortName.Contains(inQuery.SubjectShortName))
// .WhereIf(inQuery.BeginStudyTime != null, t => t.StudyTime >= inQuery.BeginStudyTime)
// .WhereIf(inQuery.EndStudyTime != null, t => t.StudyTime <= inQuery.EndStudyTime)
// .Select(t => new PatientStudyView()
// {
// SubjectId = t.SubjectVisit.SubjectId,
// SubjectAge = t.Subject.Age,
// SubjectSex = t.Subject.Sex,
// SubjectShortName = t.Subject.ShortName,
// //PatientId = Guid.Empty,
// PatientAge = t.PatientAge,
// PatientName = t.PatientName,
// PatientBirthDate = t.PatientBirthDate,
// PatientIdStr = t.PatientIdStr,
// PatientSex = t.PatientSex,
// //PatientList = t.Subject.SubjectPatientList.Select(t => new PatientBasicInfo()
// //{
// // PatientId = t.PatientId,
// // PatientAge = t.Patient.PatientAge,
// // PatientBirthDate = t.Patient.PatientBirthDate,
// // PatientIdStr = t.Patient.PatientIdStr,
// // PatientSex = t.Patient.PatientSex,
// //}).ToList(),
// Modalities = t.Modalities,
// ModalityForEdit = t.ModalityForEdit,
// SubjectCode = t.SubjectVisit.Subject.Code,
// SubmitState = t.SubjectVisit.SubmitState,
// SubmitTime = t.SubjectVisit.SubmitTime,
// VisitName = t.SubjectVisit.VisitName,
// VisitNum = t.SubjectVisit.VisitNum,
// SubjectVisitId = t.SubjectVisitId,
// VisitEarliestStudyTime = t.SubjectVisit.StudyList.Min(t => t.StudyTime),
// VisitLatestStudyTime = t.SubjectVisit.StudyList.Max(t => t.StudyTime),
// StudyId = t.Id,
// StudyTime = t.StudyTime,
// Description = t.Description,
// SeriesCount = t.SeriesCount,
// InstanceCount = t.InstanceCount,
// });
// var defalutSortArray = new string[] { nameof(PatientStudyView.SubjectCode), nameof(PatientStudyView.VisitNum), nameof(PatientStudyView.StudyTime) };
// var pageList = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc, string.IsNullOrWhiteSpace(inQuery.SortField), defalutSortArray);
// return ResponseOutput.Ok(pageList);
// }
// /// <summary>
// /// 获取该项目 患者已绑定subject ,新来了的检查 可能需要新建访视 但是新增的检查未绑定访视的检查列表
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<IResponseOutput<PageOutput<UnbindStudyView>>> GetTrialUnbindSubjectVisitStudyList(TrialPatientStudyQuery inQuery)
// {
// //属于该项目的已绑定患者的检查,同时没有绑定任何访视
// var query = from scpStudy in _studyRepository.Where(t => !t.SCPStudySubjectVisitList.Any(t => t.TrialId == inQuery.TrialId))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientSex), t => t.Patient.PatientSex.Contains(inQuery.PatientSex))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), u => u.Patient.PatientIdStr.Contains(inQuery.PatientIdStr))
// .WhereIf(inQuery.BeginStudyTime != null, t => t.StudyTime >= inQuery.BeginStudyTime)
// .WhereIf(inQuery.EndStudyTime != null, t => t.StudyTime <= inQuery.EndStudyTime)
// join subjectPatient in _subjectPatientRepository.Where(t => t.Subject.TrialId == inQuery.TrialId)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), u => u.Subject.Code.Contains(inQuery.SubjectCode))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectSex), u => u.Subject.Sex.Contains(inQuery.SubjectSex))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectShortName), t => t.Subject.ShortName.Contains(inQuery.SubjectShortName))
// on scpStudy.PatientId equals subjectPatient.PatientId
// join scpStudySubjectVisit in _studySubjectVisitRepository.AsQueryable() on scpStudy.Id equals scpStudySubjectVisit.SCPStudyId
// into dd
// from scpStudySV in dd.DefaultIfEmpty()
// select new UnbindStudyView()
// {
// PatientIdStr = scpStudy.PatientIdStr,
// PatientBirthDate = scpStudy.PatientBirthDate,
// PatientAge = scpStudy.PatientAge,
// PatientName = scpStudy.PatientName,
// PatientSex = scpStudy.PatientSex,
// Description = scpStudy.Description,
// CalledAE = scpStudy.CalledAE,
// InstanceCount = scpStudy.InstanceCount,
// Modalities = scpStudy.Modalities,
// PatientId = scpStudy.PatientId,
// SCPStudyId = scpStudy.Id,
// SeriesCount = scpStudy.SeriesCount,
// StudyTime = scpStudy.StudyTime,
// SubjectVisitId = scpStudySV.SubjectVisitId,
// VisitName = scpStudySV.SubjectVisit.VisitName,
// SubjectId = subjectPatient.SubjectId,
// SubjectCode = subjectPatient.Subject.Code,
// TrialId = subjectPatient.Subject.TrialId,
// SubjectAge = subjectPatient.Subject.Age,
// SubjectSex = subjectPatient.Subject.Sex,
// SubjectShortName = subjectPatient.Subject.ShortName,
// SubjectBirthDate = subjectPatient.Subject.BirthDate
// };
// #region 废弃
// //var query = from subject in _subjectRepository.Where(t => t.TrialId == inQuery.TrialId)
// // .WhereIf(inQuery.SubjectAge != null, t => t.Age == inQuery.SubjectAge)
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectCode), u => u.Code.Contains(inQuery.SubjectCode))
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectSex), u => u.Sex.Contains(inQuery.SubjectSex))
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.SubjectShortName), t => t.ShortName.Contains(inQuery.SubjectShortName))
// // join subjectPatient in _subjectPatientRepository.AsQueryable() on subject.Id equals subjectPatient.PatientId
// // //没有绑定任何访视
// // join scpStudy in _studyRepository.AsQueryable()
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientSex), t => t.Patient.PatientSex.Contains(inQuery.PatientSex))
// // .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), u => u.Patient.PatientIdStr.Contains(inQuery.PatientIdStr))
// // .WhereIf(inQuery.BeginStudyTime != null, t => t.StudyTime >= inQuery.BeginStudyTime)
// // .WhereIf(inQuery.EndStudyTime != null, t => t.StudyTime <= inQuery.EndStudyTime)
// // on subjectPatient.PatientId equals scpStudy.PatientId
// // select new SubjectPatientStudyView()
// // {
// // SubjectId = subject.Id,
// // SubjectAge = subject.Age,
// // SubjectSex = subject.Sex,
// // SubjectShortName = subject.ShortName,
// // PatientList = subject.SubjectPatientList.Select(t => new PatientBasicInfo()
// // {
// // PatientId = t.PatientId,
// // PatientAge = t.Patient.PatientAge,
// // PatientBirthDate = t.Patient.PatientBirthDate,
// // PatientIdStr = t.Patient.PatientIdStr,
// // PatientSex = t.Patient.PatientSex,
// // }).ToList(),
// // SubjectCode = subject.Code,
// // SeriesCount = scpStudy.SeriesCount,
// // CalledAE = scpStudy.CalledAE,
// // InstanceCount = scpStudy.InstanceCount,
// // Description = scpStudy.Description,
// // Modalities = scpStudy.Modalities,
// // PatientId = scpStudy.PatientId,
// // SCPStudyId = scpStudy.Id,
// // StudyTime = scpStudy.StudyTime
// // };
// #endregion
// var pageList = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField == string.Empty ? nameof(UnbindStudyView.StudyTime) : inQuery.SortField, inQuery.Asc);
// return ResponseOutput.Ok(pageList);
// }
// /// <summary>
// /// 删除某个项目 未提交的访视检查绑定, 清理数据,方便测试自动绑定
// /// </summary>
// /// <param name="trialId"></param>
// /// <returns></returns>
// [HttpDelete]
// public async Task<IResponseOutput> DeleteUnSubmittedStudyBind(Guid trialId, Guid? subjectId,
// [FromServices] IRepository<VisitTask> _visitTaskRepository,
// [FromServices] IRepository<DicomStudy> _dicomStudyRepository,
// [FromServices] IRepository<DicomSeries> _dicomSeriesRepository,
// [FromServices] IRepository<DicomInstance> _dicomInstanceRepository)
// {
// if (subjectId != null)
// {
// await _studySubjectVisitRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId && t.SubjectId == subjectId);
// await _subjectVisitRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == subjectId);
// await _visitTaskRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == subjectId);
// await _dicomStudyRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == subjectId);
// await _dicomSeriesRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == subjectId);
// await _dicomInstanceRepository.BatchDeleteNoTrackingAsync(t => t.SubjectId == subjectId);
// }
// else
// {
// await _studySubjectVisitRepository.BatchDeleteNoTrackingAsync(t => t.TrialId == trialId && t.SubjectVisit.SubmitState != SubmitStateEnum.Submitted);
// }
// return ResponseOutput.Ok();
// }
// /// <summary>
// /// 阅片管理-> 任务列表
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<IResponseOutput<PageOutput<PatientVisitTaskDTO>>> GetPatientVisitTaskList([FromServices] IRepository<VisitTask> _visitTaskRepository, PatientVisitTaskQuery inQuery)
// {
// var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId && t.IsAnalysisCreate == false)
// .WhereIf(inQuery.ReadingCategory != null, t => t.ReadingCategory == inQuery.ReadingCategory)
// .WhereIf(inQuery.ReadingCategory == null, t => t.ReadingCategory != ReadingCategory.Judge)
// .WhereIf(inQuery.ReadingTaskState != null, t => t.ReadingTaskState == inQuery.ReadingTaskState)
// .WhereIf(inQuery.TaskState != null, t => t.TaskState == inQuery.TaskState)
// .WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId)
// .WhereIf(inQuery.DoctorUserId != null, t => t.DoctorUserId == inQuery.DoctorUserId)
// .WhereIf(inQuery.TrialReadingCriterionId != null, t => t.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
// .WhereIf(!string.IsNullOrEmpty(inQuery.TaskName), t => t.TaskName.Contains(inQuery.TaskName) || t.TaskBlindName.Contains(inQuery.TaskName))
// .WhereIf(inQuery.BeginSignTime != null, t => t.SignTime >= inQuery.BeginSignTime)
// .WhereIf(inQuery.EndSignTime != null, t => t.SignTime <= inQuery.EndSignTime)
// .WhereIf(inQuery.BeginTaskCreateTime != null, t => t.CreateTime >= inQuery.BeginTaskCreateTime)
// .WhereIf(inQuery.EndTaskCreateTime != null, t => t.CreateTime <= inQuery.EndTaskCreateTime)
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientIdStr), t => t.Subject.SubjectPatientList.Any(t => t.Patient.PatientIdStr.Contains(inQuery.PatientIdStr)))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientName), t => t.Subject.SubjectPatientList.Any(t => t.Patient.PatientName.Contains(inQuery.PatientName)))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.PatientSex), t => t.Subject.SubjectPatientList.Any(t => t.Patient.PatientSex.Contains(inQuery.PatientSex)))
// .WhereIf(!string.IsNullOrEmpty(inQuery.SubjectShortName), t => t.Subject.ShortName.Contains(inQuery.SubjectShortName))
// .WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => (t.Subject.Code.Contains(inQuery.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(inQuery.SubjectCode) && t.IsAnalysisCreate))
// .ProjectTo<PatientVisitTaskDTO>(_mapper.ConfigurationProvider);
// var defalutSortArray = new string[] { nameof(PatientVisitTaskDTO.SubjectId), nameof(PatientVisitTaskDTO.VisitTaskNum) };
// var pageList = await visitTaskQueryable.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField, inQuery.Asc, string.IsNullOrWhiteSpace(inQuery.SortField), defalutSortArray);
// return ResponseOutput.Ok(pageList);
// }
// #endregion
// /// <summary>
// /// scp 影像推送记录表
// /// </summary>
// /// <param name="inQuery"></param>
// /// <returns></returns>
// [HttpPost]
// public async Task<IResponseOutput<PageOutput<SCPImageUploadView>>> GetSCPImageUploadList(SCPImageUploadQuery inQuery)
// {
// var query = _repository.Where<SCPImageUpload>()
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.CalledAE), t => t.CalledAE.Contains(inQuery.CalledAE))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.CallingAEIP), t => t.CallingAEIP.Contains(inQuery.CallingAEIP))
// .WhereIf(!string.IsNullOrWhiteSpace(inQuery.CallingAE), t => t.CallingAE.Contains(inQuery.CallingAE))
// .WhereIf(inQuery.StartTime != null, t => t.StartTime >= inQuery.StartTime)
// .WhereIf(inQuery.EndTime != null, t => t.EndTime <= inQuery.EndTime)
// .ProjectTo<SCPImageUploadView>(_mapper.ConfigurationProvider);
// var pageList = await query.ToPagedListAsync(inQuery.PageIndex, inQuery.PageSize, inQuery.SortField == string.Empty ? nameof(SCPImageUploadView.CallingAE) : inQuery.SortField, inQuery.Asc);
// return ResponseOutput.Ok(pageList);
// }
// }
//}