using AutoMapper; using IRaCIS.Application.Interfaces; using IRaCIS.Core.Application.Contracts.Dicom.DTO; using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Application.Contracts; using IRaCIS.Core.Application.Service.Inspection.Interface; using IRaCIS.Core.Application.Service.Inspection.DTO; using Newtonsoft.Json; namespace IRaCIS.Application.Services { //[Intercept(typeof(QANoticeAOP))] public class StudyService : IStudyService { private readonly IRepository _studyRepository; private readonly IRepository _subjectVisitRepository; private readonly IRepository _dicomInstanceRepository; private readonly IRepository _dicomSeriesRepository; private readonly IInspectionService _inspectionService; private readonly IUserInfo _userInfo; private readonly IMapper _mapper; private static string _fileStorePath = string.Empty; private readonly IRepository _dicomStudyMonitorRepository; public StudyService(IRepository studyRepository, IRepository subjectVisitRepository, IRepository dicomInstanceRepository, IRepository dicomSeriesRepository, IInspectionService inspectionService, IUserInfo userInfo, IRepository dicomStudyMonitorRepository, IMapper mapper) { _dicomStudyMonitorRepository = dicomStudyMonitorRepository; _userInfo = userInfo; _studyRepository = studyRepository; _subjectVisitRepository = subjectVisitRepository; _dicomInstanceRepository = dicomInstanceRepository; _dicomSeriesRepository = dicomSeriesRepository; this._inspectionService = inspectionService; _mapper = mapper; } /// /// 获取保存到Dicom文件中的信息 /// /// /// public DicomTrialSiteSubjectInfo GetSaveToDicomInfo(Guid subjectVisitId) { //6表连接 subject trial trialSite sponsor subjectVisit site var info = _subjectVisitRepository.Where(t => t.Id == subjectVisitId).ProjectTo(_mapper.ConfigurationProvider).FirstOrDefault().IfNullThrowException(); return info; } public void GetHasUploadSeriesAndInstance(Guid studyId, ref List seriesInstanceUidList, ref List sopInstanceUidList) { seriesInstanceUidList = _dicomSeriesRepository.Where(t => t.StudyId == studyId).Select(t => t.SeriesInstanceUid).ToList(); sopInstanceUidList = _dicomInstanceRepository.Where(t => t.StudyId == studyId).Select(t => t.SopInstanceUid).ToList(); } public void UploadOrReUploadNeedTodo(ArchiveStudyCommand archiveStudyCommand, List archiveStudyIds, ref DicomArchiveResult result,StudyMonitor monitor) { var archivedStudyId = archiveStudyIds[0]; result.ArchivedDicomStudies = _studyRepository.Where(t => t.SubjectVisitId == archiveStudyCommand.SubjectVisitId) .ProjectTo(_mapper.ConfigurationProvider).ToList(); #region 更新受试者访视信息 及访视状态为待提交 最早最晚拍片时间 访视已执行 var subjectVisit = _subjectVisitRepository.FirstOrDefaultAsync(t => t.Id == archiveStudyCommand.SubjectVisitId).Result; //正常情况下 上传或者重传(待提交之前 要改为待提交 ) QA后上传 不能改为待提交 if (subjectVisit.SubmitState == SubmitStateEnum.None) { subjectVisit.SubmitState = SubmitStateEnum.ToSubmit; } subjectVisit.VisitExecuted = VisitExecutedEnum.Executed; //处理拍片日期 var svTime = _subjectVisitRepository.Where(t => t.Id == archiveStudyCommand.SubjectVisitId).Select(t => new { DicomStudyMinStudyTime = t.StudyList.Min(t => (DateTime?)t.StudyTime), DicomStudyMaxStudyTime = t.StudyList.Max(t => (DateTime?)t.StudyTime), NoneDicomStudyMinStudyTime = t.NoneDicomStudyList.Min(t => (DateTime?)t.ImageDate), NoneDicomStudyMaxStudyTime = t.NoneDicomStudyList.Max(t => (DateTime?)t.ImageDate) }).FirstOrDefault(); var minArray = new DateTime?[] { svTime.DicomStudyMinStudyTime, svTime.NoneDicomStudyMinStudyTime }; var maxArray = new DateTime?[] { svTime.DicomStudyMaxStudyTime, svTime.NoneDicomStudyMaxStudyTime }; subjectVisit.EarliestScanDate = minArray.Min(); subjectVisit.LatestScanDate = maxArray.Max(); #endregion //按照访视维度,上传只存在重传同一份,和上传新的(不存在之前检查维度 重传同一份 和重传不同的) if (archiveStudyCommand.AbandonStudyId != null && archiveStudyCommand.AbandonStudyId == archivedStudyId) { result.ReuploadNewStudyId = archivedStudyId; // 1、普通上传后重传 // 2、QC后重传 //_studyService.ReUploadSameStudy(archiveStudyCommand.SubjectVisitId, archivedDicomStudy.Id); }//上传 else { //汇总 Series的Modality 更新到检查里面 检查状态 上传人 var seriesModalityList = _dicomSeriesRepository.Where(t => t.StudyId == archivedStudyId).Select(u => u.Modality).Distinct(); string ModaliyStr = string.Join('、', seriesModalityList.ToList()); var study = _studyRepository.FirstOrDefaultAsync(t => t.Id == archivedStudyId).Result.IfNullThrowException(); study.Status = (int)StudyStatus.Uploaded; study.Modalities = ModaliyStr; } _ = _dicomStudyMonitorRepository.AddAsync(monitor).Result; _ = _studyRepository.SaveChangesAsync().Result; // 这里上传dicom影像之后修改之后修改访视的状态 _inspectionService.AddInspectionRecordAsync(new DataInspectionAddDTO() { SiteId = subjectVisit.SiteId, SubjectId = subjectVisit.SubjectId, IsSign = false, VisitStageId = subjectVisit.VisitStageId, SubjectVisitName = subjectVisit.VisitName, BlindName = subjectVisit.BlindName, SubjectVisitId = subjectVisit.Id, Identification = "Edit|Visit|Status|Visit-Image Uplo", JsonDetail= JsonConvert.SerializeObject(new { SubmitState= subjectVisit.SubmitState, VisitExecuted= subjectVisit.VisitExecuted, }) }).Wait(); } //public virtual IResponseOutput ForwardStudy(Guid studyId) //{ // var study = _studyRepository.FirstOrDefault(u => u.Id == studyId); // //数据库状态,其他人已经操作过了,此时提醒 // if (study.Status != (int)StudyStatus.Anonymized) // { // ResponseOutput.NotOk($"当前界面Study:{study.StudyCode} 状态被其他人已变更,不允许该操作,请刷新界面"); // } // _studyRepository.Update(t => t.Id == studyId, u => new DicomStudy() // { // Status = (int)StudyStatus.Forwarding // }); // var subject = _subjectRepository.FirstOrDefault(u => u.Id == study.SubjectId); // var trial = _trialRepository.FirstOrDefault(u => u.Id == study.TrialId); // var subjectVisit = _subjectVisitRepository.FirstOrDefault(u => u.Id == study.SubjectVisitId); // var targetPath = Path.Combine("/IMPORT-IMAGES", // trial.TrialCode + "_" + subject.Code + "_" + subjectVisit.VisitName + "_" + study.StudyCode); // var path = Path.Combine(_fileStorePath, study.CreateTime.Year.ToString(), study.TrialId.ToString(), // study.SiteId.ToString(), study.SubjectId.ToString(), study.SubjectVisitId.ToString(), study.Id.ToString(), "Data"); // try // { // // 主机及端口信息后面可以改到 配置文件 // SessionOptions sessionOptions = new SessionOptions // { // Protocol = Protocol.Sftp, // PortNumber = 8022, // HostName = "CS-690-sftp.mint-imaging.com", // UserName = "zdong", // Password = "Everest@2021", // //GiveUpSecurityAndAcceptAnySshHostKey = true, // SshHostKeyFingerprint = @"ecdsa-sha2-nistp384 384 59gkjJ5lMwv3jsB8Wz2B35tBAIor5pSd8PcJYtoamPo=" // }; // using (Session session = new Session()) // { // session.Open(sessionOptions); // if (!session.FileExists(targetPath)) // { // session.CreateDirectory(targetPath); // } // var files = (new DirectoryInfo(path)).GetFiles(); // foreach (var file in files) // { // if (file.Name.Contains("Anonymize") && file.Extension.Contains("dcm")) // { // string remoteFilePath = // RemotePath.TranslateLocalPathToRemote(file.FullName, path, targetPath); // var result = session.PutFiles(file.FullName, remoteFilePath, false); // if (!result.IsSuccess) // { // return ResponseOutput.NotOk("Forward Failed"); // } // } // } // //_studyStatusDetailRepository.Add(new StudyStatusDetail // //{ // // Status = (int)StudyStatus.Forwarded, // // StudyId = studyId, // // Note = string.Empty, // // OptUserName = _userInfo.RealName, // // OptTime = DateTime.Now // //}); // study.Status = (int)StudyStatus.Forwarded; // _studyRepository.Update(study); // //_workloadTPRepository.Add(new WorkloadTP // //{ // // SiteId = study.SiteId, // // StudyId = study.Id, // // SubjectId = study.SubjectId, // // SubjectVisitId = study.SubjectVisitId, // // Status = 0, // // ReviewerId = Guid.Empty, // // TrialId = study.TrialId, // // UpdateTime = DateTime.Now, // // TimepointCode = study.StudyCode + "_T01" // //}); // //if (study.IsDoubleReview) //双重阅片,则再添加一条,编号变为T02 // //{ // // _workloadTPRepository.Add(new WorkloadTP // // { // // SiteId = study.SiteId, // // StudyId = study.Id, // // SubjectId = study.SubjectId, // // SubjectVisitId = study.SubjectVisitId, // // Status = 0, // // ReviewerId = Guid.Empty, // // TrialId = study.TrialId, // // UpdateTime = DateTime.Now, // // TimepointCode = study.StudyCode + "_T02" // // }); // //} // return ResponseOutput.Result(_studyRepository.SaveChanges()); // } // } // catch (Exception e) // { // _studyRepository.Update(t => t.Id == studyId, u => new DicomStudy() // { // Status = (int)StudyStatus.ForwardFailed // }); // return ResponseOutput.NotOk("Forward Failed " + e.Message); // } //} #region 暂存 读片 //public IEnumerable GetSeriesList(Guid studyId) //{ // return _dicomSeriesRepository.Where(s => s.StudyId == studyId).OrderBy(s => s.SeriesNumber). // ThenBy(s => s.SeriesTime).ThenBy(s => s.CreateTime) // .ProjectTo(_mapper.ConfigurationProvider); //} //public IEnumerable GetImageLabel(string tpCode) //{ // return _imageLabelRepository.Where(s => s.TpCode == tpCode) // .ProjectTo(_mapper.ConfigurationProvider); //} //public bool SaveImageLabelList(ImageLabelCommand imageLabelCommand) //{ // var success = _imageLabelRepository.Delete(u => u.TpCode == imageLabelCommand.TpCode); // _keyInstanceRepository.Delete(u => u.TpCode == imageLabelCommand.TpCode); // if (imageLabelCommand.ImageLabelList.Count == 0) // { // return true; // } // else // { // foreach (var label in imageLabelCommand.ImageLabelList) // { // _imageLabelRepository.Add(new ImageLabel // { // TpCode = imageLabelCommand.TpCode, // StudyId = label.StudyId, // SeriesId = label.SeriesId, // InstanceId = label.InstanceId, // LabelValue = label.LabelValue // }); // _keyInstanceRepository.Add(new KeyInstance // { // TpCode = imageLabelCommand.TpCode, // SeriesId = label.SeriesId, // InstanceId = label.InstanceId, // }); // } // success = _imageLabelRepository.SaveChanges(); // return success; // } //} #endregion #region 废弃 //public DicomStudyDTO GetStudyItem(Guid studyId) //{ // return _mapper.Map(_studyRepository.FirstOrDefault(s => s.Id == studyId)); //} //public virtual async Task DicomAnonymize(Guid studyId, string optUserName) //{ // var study = _studyRepository.FirstOrDefault(t => t.Id == studyId); // //数据库状态,其他人已经操作过了,此时提醒 // if (study.Status != (int)StudyStatus.QAFinish) // { // ResponseOutput.NotOk($"当前界面Study:{study.StudyCode} 状态被其他人已变更,不允许该操作,请刷新界面"); // } // var subject = _subjectRepository.Select(t => new { Id = t.Id, Code = t.Code }).FirstOrDefault(u => u.Id == study.SubjectId).IfNullThrowException(); // var trial = _trialRepository.Select(t => new { Id = t.Id, Code = t.TrialCode }).FirstOrDefault(u => u.Id == study.TrialId).IfNullThrowException(); // study.Status = (int)StudyStatus.Anonymizing; // // 查询受试者 信息 // //string subjectCde = string.Empty; // //string subjectSex = string.Empty; // //读取Dicom 文件,匿名化 // //按照配置文件 匿名化 // var dicomSeries = _dicomSeriesRepository.Where(s => s.StudyId == studyId).ToList(); // foreach (var seriesItem in dicomSeries) // { // var dicomInstances = _dicomInstanceRepository.Where(s => s.SeriesId == seriesItem.Id).ToList(); // foreach (var instanceItem in dicomInstances) // { // _dicomInstanceRepository.Attach(instanceItem); // try // { // string filePath = _dicomFileStoreHelper.CreateInstanceFilePath(study, seriesItem.Id, instanceItem.Id); // DicomFile dicomFile = await DicomFile.OpenAsync(filePath, Encoding.Default); // #region 废弃 // //if (SystemConfig.AddClinicalInfo) //是否需要写入临床信息 // //{ // // dicomFile.Dataset.AddOrUpdate(DicomTag.ClinicalTrialSubjectID, subjectCde + " " + subjectSex);//SubjectId // //} // //DicomDataset dataset = dicomFile.Dataset; // #endregion // foreach (var anonymizeItem in AppSettings.AnonymizeTagList) // { // if (anonymizeItem.Enable) // { // ushort group = Convert.ToUInt16(anonymizeItem.Group, 16); // ushort element = Convert.ToUInt16(anonymizeItem.Element, 16); // dicomFile.Dataset.AddOrUpdate(new DicomTag(group, element), anonymizeItem.ReplaceValue); // } // } // dicomFile.Dataset.AddOrUpdate(DicomTag.PatientID, trial.Code + "_" + subject.Code); // //_dicomFileStoreHelper.CreateInstanceFilePath(study, seriesItem.Id, instanceItem.Id); // string path = Path.Combine(_fileStorePath, study.CreateTime.Year.ToString(), // study.TrialId.ToString(), // study.SiteId.ToString(), study.SubjectId.ToString(), study.SubjectVisitId.ToString(), study.Id.ToString(), "Data"); // //await dicomFile.SaveAsync(Path.Combine(path, instanceItem.Id.ToString() + ".dcm")); // await dicomFile.SaveAsync( // Path.Combine(path, instanceItem.Id.ToString() + ".Anonymize" + ".dcm")); // instanceItem.Anonymize = true; // //_dicomInstanceRepository.Update(instanceItem); // } // catch (Exception ex) // { // study.Status = (int)StudyStatus.AnonymizeFailed; // _dicomInstanceRepository.SaveChanges(); // //这个地方返回没用 // return ResponseOutput.NotOk(ex.Message); // } // } // } // study.Status = (int)StudyStatus.Anonymized; // var success = _dicomInstanceRepository.SaveChanges(); // return ResponseOutput.Result(success); //} //public string GetStudyPreview(Guid studyId) //{ // DicomInstance dicomInstance = _dicomInstanceRepository.FirstOrDefault(s => s.StudyId == studyId); // if (dicomInstance != null) // { // DicomStudy dicomStudy = _studyRepository.FirstOrDefault(s => s.Id == dicomInstance.StudyId); // if (dicomStudy != null) // { // return _dicomFileStoreHelper.GetInstanceFilePath(dicomStudy, dicomInstance.SeriesId, dicomInstance.Id.ToString()); // } // } // return string.Empty; //} //public IEnumerable GetAllRelationStudyList(Guid subjectVisitId) //{ // #region 废弃 // //var studylist = _studyRepository.Where(u => u.SubjectVisitId == subjectVisitId && u.IsDeleted == false).Select(t => new { StudyId = t.Id, t.SubjectId, t.TrialId }).ToList(); // //var subjectId = studylist.FirstOrDefault().SubjectId; // //var trialId = studylist.FirstOrDefault().TrialId; // //var studyIds = studylist.Select(t => t.StudyId).ToList(); // //var query = from studyItem in _studyRepository.Where(u => u.SubjectId == subjectId // // && u.TrialId == trialId && u.IsDeleted == false && // // !studyIds.Contains(u.Id) // // /* && u.Status != (int)StudyStatus.Abandon*/) // // join visitItem in _subjectVisitRepository.AsQueryable() // // on studyItem.SubjectVisitId equals visitItem.Id // // select new RelationStudyDTO // // { // // StudyId = studyItem.Id, // // StudyCode = studyItem.StudyCode, // // VisitName = visitItem.VisitName, // // Modalities = studyItem.Modalities, // // Description = studyItem.Description, // // SeriesCount = studyItem.SeriesCount // // }; // #endregion // var studyInfo = _studyRepository.Where(u => u.SubjectVisitId == subjectVisitId).Select(t => new { t.SubjectId, t.TrialId }).FirstOrDefault().IfNullThrowException(); // var query = _studyRepository.Where(t => t.SubjectVisitId != subjectVisitId && t.TrialId == studyInfo.TrialId && t.SubjectId == studyInfo.SubjectId) // .ProjectTo(_mapper.ConfigurationProvider).ToList(); // return query.OrderBy(u => u.VisitName).ThenBy(s => s.StudyCode).ToList(); //} ///// ///// 检查列表 ///// ///// ///// //public PageOutput GetStudyList(StudyQueryDTO queryDto) //{ // var query = _studyRepository.Where(x => x.TrialId == queryDto.TrialId) // .WhereIf(queryDto.SubjectId != null, t => t.SubjectId == queryDto.SubjectId) // .WhereIf(queryDto.SubjectVisitId != null, t => t.SubjectId == queryDto.SubjectVisitId) // .WhereIf(!string.IsNullOrEmpty(queryDto.VisitPlanInfo), queryDto.VisitPlanInfo.Contains('.') ? t => t.SubjectVisit.VisitNum.ToString().Contains(".") : t => t.SubjectVisit.VisitNum == decimal.Parse(queryDto.VisitPlanInfo)) // .WhereIf(queryDto.StudyTimeBegin != null, t => t.StudyTime >= queryDto.StudyTimeBegin) // .WhereIf(queryDto.StudyTimeEnd != null, t => t.StudyTime <= queryDto.StudyTimeEnd) // .WhereIf(queryDto.UpdateTimeBegin != null, t => t.StudyTime >= queryDto.UpdateTimeBegin) // .WhereIf(queryDto.UpdateTimeEnd != null, t => t.StudyTime <= queryDto.UpdateTimeEnd) // .WhereIf(queryDto.SiteId != null, t => t.SiteId == queryDto.SiteId) // .WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ClinicalResearchCoordinator, t => t.TrialSite.CRCUserList.Any(t => t.UserId == _userInfo.Id)) // .WhereIf(!string.IsNullOrWhiteSpace(queryDto.SubjectInfo), t => t.Subject.Code.Contains(queryDto.SubjectInfo)) // .ProjectTo(_mapper.ConfigurationProvider); // var list = query.ToPagedList(queryDto.PageIndex, queryDto.PageSize, queryDto.SortField == string.Empty ? "StudyCode" : queryDto.SortField, queryDto.Asc); // foreach (var item in list.CurrentPageData) // { // if (item.PatientBirthDate.Length == 8) // { // item.PatientBirthDate = // $"{item.PatientBirthDate[0]}{item.PatientBirthDate[1]}{item.PatientBirthDate[2]}{item.PatientBirthDate[3]}-{item.PatientBirthDate[4]}{item.PatientBirthDate[5]}-{item.PatientBirthDate[6]}{item.PatientBirthDate[7]}"; // } // } // return list; //} //public IResponseOutput DeleteStudy(Guid id) //{ // var needDelete = _studyRepository.FirstOrDefault(t => t.Id == id); // if (needDelete == null) // { // return ResponseOutput.DBNotExistIfNUll(needDelete); // } // else //移除内存中缓存的StudyCode 这样刚上传的,删除 再上传还是用同样的Code // { // if (_provider.Get($"{needDelete.TrialId }_{ StaticData.StudyMaxCode}").Value == needDelete.StudyCode) // { // _provider.Remove($"{needDelete.TrialId }_{ StaticData.StudyMaxCode}"); // } // } // //if (study.Status != (int)StudyStatus.Uploaded) // //{ // // return ResponseOutput.NotOk("This study has been quality controlled and couldn't be deleted "); // //} // #region 废弃的直接删除了 这里不用处理了 // ////处理废弃的Study 如果有的话 // //var oldStudy = _studyRepository.FirstOrDefault(t => t.StudyCode == study.StudyCode && t.Id != id); // //if (oldStudy != null) // //{ // // _studyRepository.Delete(t => t.Id == oldStudy.Id); // // _dicomInstanceRepository.Delete(t => t.StudyId == oldStudy.Id); // // _dicomSeriesRepository.Delete(t => t.StudyId == oldStudy.Id); // //} // //处理废弃的Study // //var success5 = _studyRepository.Delete(t => t.StudyCode == study.StudyCode); // #endregion // //清除现有Study记录 // var success1 = _studyRepository.Delete(t => t.Id == id); // var succeess2 = _dicomInstanceRepository.Delete(t => t.StudyId == id); // var success3 = _dicomSeriesRepository.Delete(t => t.StudyId == id); // //一个访视下面有多个检查,所以需要检测 没有的时候才清空 // if (_studyRepository.Count(t => t.SubjectVisitId == needDelete.SubjectVisitId) == 0) // { // _subjectVisitRepository.Update(t => t.Id == needDelete.SubjectVisitId, // u => new SubjectVisit() { VisitExecuted = VisitExecutedEnum.UnExecuted, SVENDTC = null, SVSTDTC = null }); // _qcChallengeRepository.Delete(t => t.SubjectVisitId == needDelete.SubjectVisitId); // //_qcChallengeRepository.Delete(t => t.SubjectVisitId == subjectVisitId); // //_trialQCQuestionAnswerRepository.Delete(t => t.SubjectVisitId == subjectVisitId); // } // return ResponseOutput.Result(success1 || succeess2 || success3); //} //public void ClearStudyInstanceAndSeriseData(Guid studyId) //{ // //重新开始计数,怕数据库又脏数据,影响数量 // _studyRepository.Update(t => t.Id == studyId, u => new DicomStudy() // { // InstanceCount = 0, // SeriesCount = 0 // }); // _dicomSeriesRepository.Delete(t => t.StudyId == studyId); // _dicomInstanceRepository.Delete(t => t.StudyId == studyId); //} //public bool ReUploadDifferentStudy(Guid subjectVisitId, Guid abandonStudyId, Guid newStudyId) //{ // //_qcChallengeRepository.Update(t => t.SubjectVisitId == subjectVisitId && t.NeedReUpload == true, u => new QCChallenge() { ReUploadedTime = DateTime.Now, ReUploader = _userInfo.RealName }); // //注意这里不是用SeqId 主键查询,因为Seq id 是后续加的,为了不改变代码和前端接口参数 // var study = _studyRepository.FirstOrDefault(t => t.Id == abandonStudyId); // var code = study.StudyCode; // //清理以前的数据 // _studyRepository.Delete(t => t.Id == abandonStudyId); // _dicomInstanceRepository.Delete(t => t.StudyId == abandonStudyId); // _dicomSeriesRepository.Delete(t => t.StudyId == abandonStudyId); // ////将以前的qa记录数据绑定到现在新生成的Study上 // //_qaNoticeRepository.Update(t => t.SubjectVisitId == abandonStudyId, u => new QANotice() { SubjectVisitId = newStudyId }); // //_qaNoticeUserRepository.Update(t => t.SubjectVisitId == abandonStudyId, // // u => new QANoticeUser() { SubjectVisitId = newStudyId }); // //_qaRecordRepository.Update(t => t.SubjectVisitId == abandonStudyId, u => new QARecord() { SubjectVisitId = newStudyId }); // var success = false; // if (study.Status == (int)StudyStatus.Uploading) // { // success = _studyRepository.Update(t => t.Id == newStudyId, u => new DicomStudy() // { // Status = (int)StudyStatus.Uploaded, // StudyCode = code // }); // } // else // { // //新一份的影像状态为旧影像的状态 不改变 // success = _studyRepository.Update(t => t.Id == newStudyId, u => new DicomStudy() // { // Status = study.Status, // StudyCode = code // }); // } // #region 废弃之前的Study记录 讲新产生的记录的StudyCode 变更为老的 这样可以关联在一起 // //var realName = _userInfo.RealName; // //var code = _studyRepository.GetAll().First(t => t.Id == abandonStudyId).StudyCode; // //_studyRepository.Update(t => t.Id == abandonStudyId, u => new DicomStudy() // //{ // // Status = (int)StudyStatus.Abandon // //}); // //_studyRepository.Update(t => t.Id == newStudyId, u => new DicomStudy() // //{ // // Status = (int)StudyStatus.Uploaded, // // StudyCode = code // //}); // //_studyStatusDetailRepository.Add(new StudyStatusDetail // //{ // // Status = (int)StudyStatus.Abandon, // // StudyId = abandonStudyId, // // Note = string.Empty, // // OptUserName = realName, // // OptTime = DateTime.Now // //}); // //_studyStatusDetailRepository.Add(new StudyStatusDetail // //{ // // Status = (int)StudyStatus.Uploaded, // // StudyId = newStudyId, // // Note = string.Empty, // // OptUserName = realName, // // OptTime = DateTime.Now // //}); // //_studyStatusDetailRepository.SaveChanges(); // #endregion // return success; //} //public virtual void ReUploadSameStudy(Guid subjectVisitId, Guid studyId) //{ // //_qcChallengeRepository.Update(t => t.SubjectVisitId == subjectVisitId && t.NeedReUpload == true, u => new QCChallenge() { ReUploadedTime = DateTime.Now, ReUploader = _userInfo.RealName }); // #region 之前整个上传过程操作没有放在一个整体事务 会有脏数据 现在整体一个事务,不会产生,废弃 但是切入AOP 所以保留空方法 // //var study = _studyRepository.FirstOrDefault(t=>t.Id== studyId); // //var status = study.Status; // //if (status == (int)StudyStatus.Uploading) // //{ // // _studyRepository.Update(t => t.Id == studyId, u => new DicomStudy() // // { // // Status = (int)StudyStatus.Uploaded // // }); // //} // #endregion //} ///// ///// 上传完检查后,处理检查 汇总 Series的Modality 更新到检查里面 检查状态 上传人 ///// ///// //public void UploadStudyDeal(Guid studyId) //{ // var seriesModalityList = _dicomSeriesRepository.Where(t => t.StudyId == studyId).Select(u => u.Modality).Distinct(); // string ModaliyStr = string.Join('、', seriesModalityList.ToList()); // var study = _studyRepository.FirstOrDefault(t => t.Id == studyId); // study.Status = (int)StudyStatus.Uploaded; // study.Modalities = ModaliyStr; // _studyRepository.SaveChanges(); //} //public List GetSubjectVisitStudyList(Guid trialId, Guid siteId, Guid subjectId, Guid subjectVisitId) //{ // var query = _studyRepository.Where(t => t.TrialId == trialId && t.SiteId == siteId && t.SubjectId == t.SubjectId && t.SubjectVisitId == subjectVisitId) // .Select(u => new SubjectVisitStudyDTO() { Modalities = u.Modalities, StudyCode = u.StudyCode, StudyId = u.Id, Status = u.Status }); // return query.ToList(); //} ////此处有AOP操作,不要更改为动态Api //public virtual IResponseOutput UpdateStudyStatus(StudyStatusDetailCommand studyStatus) //{ // //注意这里不是用SeqId 主键查询,因为Seq id 是后续加的,为了不改变代码和前端接口参数 // var study = _studyRepository.FirstOrDefault(t => t.Id == studyStatus.StudyId); // //数据库状态,其他人已经操作过了,此时提醒 // if (study.Status > studyStatus.Status) // { // ResponseOutput.NotOk($"当前界面Study:{study.StudyCode} 状态被其他人已变更,不允许该操作,请刷新界面"); // } // ////防止多次调用,更新 没必要 // //if (study.Status == studyStatus.Status) // //{ // // return ResponseOutput.Ok(); // //} // study.Status = studyStatus.Status; // study.UpdateTime = DateTime.Now; // //if (studyStatus.Status == (int)StudyStatus.Uploaded) // //{ // // study.UploadedTime = DateTime.Now; // // study.Uploader = _userInfo.RealName; // //} // //if (study.Status == (int)StudyStatus.QAing) // //{ // // study.DeadlineTime = studyStatus.DeadlineTime; // //} // if (studyStatus.Status == (int)StudyStatus.QAFInishNotPass) // { // study.QAComment = studyStatus.QAComment; // } // return ResponseOutput.Ok(_studyRepository.SaveChanges()); //} //public List GetStudyStatusDetailList(Guid studyId) //{ // return _studyStatusDetailRepository.Where(s => s.StudyId == studyId).OrderByDescending(s => s.OptTime) // .ProjectTo(_mapper.ConfigurationProvider).ToList(); //} //public bool DistributeStudy(StudyReviewerCommand studyReviewer) //{ // //更新Study表中,总的状态 // // 插入中间表 // studyReviewer.StudyList.ForEach(study => // { // var workloadType = 1; // StudyStatus studyStatus = StudyStatus.Distributed; // if (study.Status >= (int)StudyStatus.NeedAd) // { // workloadType = 2; // studyStatus = StudyStatus.AdDistributed; // } // var tempStudy = _studyRepository.FirstOrDefault(s => s.Id == study.StudyId); // tempStudy.Status = (int)studyStatus; // _studyRepository.Update(tempStudy); // _studyReviewerRepository.Add(new StudyReviewer() // { // ReviewerId = studyReviewer.ReviewerId, // StudyId = study.StudyId, // WorkloadType = workloadType, // TrialId = studyReviewer.TrialId, // Status = (int)studyStatus // }); // }); // return _studyReviewerRepository.SaveChanges(); //} //public IResponseOutput EditStudyReviewer(StudyReviewerEditCommand studyReviewerEditCommand) //{ // _studyReviewerRepository.Delete(t => studyReviewerEditCommand.StudyId == t.StudyId); // if (studyReviewerEditCommand.IsDoubleReview) // { // if (studyReviewerEditCommand.ReviewerId1 != null) // { // _studyReviewerRepository.Add( // new StudyReviewer() // { // StudyId = studyReviewerEditCommand.StudyId, // TrialId = studyReviewerEditCommand.TrialId, // ReviewerId = studyReviewerEditCommand.ReviewerId1.Value, // WorkloadType = 1 // }); // } // if (studyReviewerEditCommand.ReviewerId2 != null) // { // _studyReviewerRepository.Add( // new StudyReviewer() // { // StudyId = studyReviewerEditCommand.StudyId, // TrialId = studyReviewerEditCommand.TrialId, // ReviewerId = studyReviewerEditCommand.ReviewerId2.Value, // WorkloadType = 1 // }); // } // if (studyReviewerEditCommand.ReviewerIdForAD != null) // { // _studyReviewerRepository.Add( // new StudyReviewer() // { // StudyId = studyReviewerEditCommand.StudyId, // TrialId = studyReviewerEditCommand.TrialId, // ReviewerId = studyReviewerEditCommand.ReviewerIdForAD.Value, // WorkloadType = 2 // }); // } // if (studyReviewerEditCommand.ReviewerId2 == null || studyReviewerEditCommand.ReviewerId1 == null) // { // _studyRepository.Update(t => t.Id == studyReviewerEditCommand.StudyId, // u => new DicomStudy() // { // Status = (int)StudyStatus.QAFinish // }); // } // } // else // { // if (studyReviewerEditCommand.ReviewerId1 != null) // { // _studyReviewerRepository.Add( // new StudyReviewer() // { // StudyId = studyReviewerEditCommand.StudyId, // TrialId = studyReviewerEditCommand.TrialId, // ReviewerId = studyReviewerEditCommand.ReviewerId1.Value, // WorkloadType = 1 // }); // } // else // { // _studyRepository.Update(t => t.Id == studyReviewerEditCommand.StudyId, // u => new DicomStudy() // { // Status = (int)StudyStatus.QAFinish // }); // } // } // var success = _studyReviewerRepository.SaveChanges(); // return ResponseOutput.Result(success); //} //public List GetReviewerListByTrialId(Guid trialId) //{ // var query = from enrollItem in _enrollRepository // .Where(t => t.TrialId == trialId && t.EnrollStatus >= 10) // join doctorItem in _doctorRepository.AsQueryable() // on enrollItem.DoctorId equals doctorItem.Id into g // from doctor in g.DefaultIfEmpty() // select new // { // ReviewerCode = doctor.ReviewerCode, // FirstName = doctor.FirstName, // LastName = doctor.LastName, // ReviewerId = enrollItem.DoctorId, // ActivelyReading = doctor.ActivelyReading, // }; // return query.Where(s => s.ActivelyReading).Select(s => new ReviewerDistributionDTO // { // ReviewerCode = s.ReviewerCode, // FirstName = s.FirstName, // LastName = s.LastName, // ReviewerId = s.ReviewerId, // }).ToList(); //} //public PageOutput GetDistributeStudyList( // StudyStatusQueryDTO studyStatusQueryDto) //{ // Expression> studyReviewerLambda = x => x.TrialId == studyStatusQueryDto.TrialId; // if (studyStatusQueryDto.ReviewerId != null) // { // studyReviewerLambda = studyReviewerLambda.And(t => t.ReviewerId == studyStatusQueryDto.ReviewerId); // } // if (studyStatusQueryDto.StudyStatus != null) // { // studyReviewerLambda = studyReviewerLambda.And(t => t.Status == studyStatusQueryDto.StudyStatus); // } // var query = from studyReviewer in _studyReviewerRepository.Where(studyReviewerLambda) // join doctor in _doctorRepository.AsQueryable() on studyReviewer.ReviewerId equals doctor.Id // join study in _studyRepository.AsQueryable() on studyReviewer.StudyId equals study.Id // select new DistributeReviewerStudyStatusDTO() // { // Name = doctor.LastName + " / " + doctor.FirstName, // NameCN = doctor.ChineseName, // ReviewerCode = doctor.ReviewerCode, // Status = studyReviewer.Status, // StudyCode = study.StudyCode // }; // return query.ToPagedList(studyStatusQueryDto.PageIndex, // studyStatusQueryDto.PageSize, studyStatusQueryDto.SortField == string.Empty // ? "ReviewerCode" // : studyStatusQueryDto.SortField, studyStatusQueryDto.Asc); //} //public IEnumerable GetRelationVisitList(decimal visitNum, string tpCode) //{ // string tpGroup = tpCode.Substring(tpCode.Length - 3, 3); // var tp = _workloadTPRepository.FirstOrDefault(u => u.TimepointCode == tpCode); // var query = from workloadTp in _workloadTPRepository.Where(u => u.SubjectId == tp.SubjectId // && u.TrialId == tp.TrialId && // u.TimepointCode.Contains(tpGroup)) // join subjectVisit in _subjectVisitRepository.Where(u => u.VisitNum <= visitNum) // on workloadTp.SubjectVisitId equals subjectVisit.Id // select new RelationVisitDTO // { // StudyId = workloadTp.StudyId, // TpCode = workloadTp.TimepointCode, // VisitName = subjectVisit.VisitName // }; // return query.ToList(); //} //public List GetQANoticeList(Guid subjectVisitId) //{ // var query = from noticeUser in _qaNoticeUserRepository.AsQueryable() // .Where(t => t.ToUserId == _userInfo.Id && t.SubjectVisitId == subjectVisitId) // join notice in _qaNoticeRepository.Where(u => u.NeedDeal == true && u.SubjectVisitId == subjectVisitId) on // noticeUser.QANoticeId equals notice.Id // select notice.Id; // var noticeUserList = query.ToList(); // //待处理的消息数量 // var count = noticeUserList.Count; // var list = _qaNoticeRepository.Where(t => t.SubjectVisitId == subjectVisitId) // .ProjectTo(_mapper.ConfigurationProvider).OrderByDescending(t => t.SendTime).ToList(); // list.ForEach(t => t.IsMessageReceiver = count > 0 && noticeUserList.Contains(t.Id) ? t.NeedDeal : false); // return list; //} //public IResponseOutput DealNonDicomFile(Dictionary filePathDic, // ArchiveStudyCommand archiveStudyCommand) //{ // var savedInfo = GetSaveToDicomInfo(archiveStudyCommand.SubjectVisitId); // var dicomStudy = new DicomStudy // { // Id = Guid.NewGuid(), // //SiteId = addtionalInfo.SiteId, // //TrialId = addtionalInfo.TrialId, // //SubjectId = addtionalInfo.SubjectId, // //SubjectVisitId = addtionalInfo.SubjectVisitId, // IsDoubleReview = savedInfo.IsDoubleReview, // Comment = savedInfo.Comment // }; // #region Setting Code // //var last = _studyRepository.Where(s => s.TrialId == addtionalInfo.TrialId) // // .OrderByDescending(c => c.StudyCode).FirstOrDefault(); // //if (last != null) // //{ // // var len = last.StudyCode.Length; // // if (len > 5 && int.TryParse(last.StudyCode.Substring(len - 5, 5), out var num)) // // { // // dicomStudy.StudyCode = "ST" + (++num).ToString().PadLeft(5, '0'); // // } // // else // // { // // return ResponseOutput.NotOk("Generate StudyCode failed"); // // } // //} // //else // //{ // // dicomStudy.StudyCode = "ST" + 1.ToString().PadLeft(5, '0'); // //} // #endregion // var study = _studyRepository.Add(dicomStudy); // var saveFileList = new List(); // foreach (var key in filePathDic.Keys) // { // saveFileList.Add(new NoneDicomFile() { FileName = filePathDic[key], StudyId = study.Id, Path = key }); // } // _noneDicomFileRepository.AddRange(saveFileList); // var success = _noneDicomFileRepository.SaveChanges(); // UpdateStudyStatus(new StudyStatusDetailCommand // { // StudyId = study.Id, // Status = (int)StudyStatus.Uploaded, // Note = string.Empty // }); // return ResponseOutput.Result(success); //} #endregion } }