//using System; //using Castle.DynamicProxy; //using IRaCIS.Core.Application.Contracts.Dicom.DTO; //using IRaCIS.Core.Infra.EFCore; //using System.Linq; //using IRaCIS.Core.Domain.Models; //using IRaCIS.Core.Domain.Share; //namespace IRaCIS.Core.API.Utility.AOP //{ //#pragma warning disable // public class QANoticeAOP : IInterceptor // { // private readonly IRepository _qaNoticeRepository; // private readonly IRepository _studyRepository; // private readonly IRepository _userTrialRepository; // private readonly IRepository _userTrialSiteRepository; // private readonly IUserInfo _userInfo; // public QANoticeAOP(IRepository qaNoticeRepository, // IUserInfo userInfo, IRepository studyRepository, IRepository userTrialRepository, IRepository userTrialSiteRepository) // { // _qaNoticeRepository = qaNoticeRepository; // _studyRepository = studyRepository; // _userTrialRepository = userTrialRepository; // _userTrialSiteRepository = userTrialSiteRepository; // _userInfo = userInfo; // } // public void Intercept(IInvocation invocation) // { // //处理拦截的方法 // invocation.Proceed(); // if (invocation.Method.Name == "UpdateStudyStatus") // { // var studyStatus = invocation.Arguments[0] as StudyStatusDetailCommand; // var study = _studyRepository.FirstOrDefault(t=>t.Id==studyStatus.StudyId); // if (study.Status == (int)StudyStatus.Uploaded) // { // _qaNoticeRepository.Add(new QANotice() // { // TrialId = study.TrialId, // SubjectVisitId = study.Id, // FromUser = _userInfo.RealName, // FromUserId = _userInfo.Id, // FromUserType = _userInfo.UserTypeShortName, // NoticeTypeEnum = NoticeType.NotNeedNotice, // NeedDeal = false, // StudyStatusStr = "Uploaded", // Message = $"IC : {_userInfo.RealName} has uploaded {study.StudyCode} ", // SendTime = DateTime.Now, // }); // } // #region 处理QA通知模块 // //查询项目的参与者 和 负责site下IC用户 // var trialUserList = _userTrialRepository.Where(t => t.TrialId == study.TrialId).ToList(); // // 找到该study 关联Site 下的IC // var crcList = _userTrialSiteRepository.Where(t => // t.SiteId == study.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == study.TrialId).ToList(); // var qaList = trialUserList.Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).ToList(); // var pm = trialUserList.FirstOrDefault(t => t.User.UserTypeEnum == UserTypeEnum.ProjectManager); // // IC =>QA // if (studyStatus.Status == (int)StudyStatus.QARequested) // { // //找出当前操作的IC // //PM 或者admin可以代替IC角色 不能从IC列表中查询用户 // //var currentCRC = trialUserList.First(t => t.UserId == _userInfo.Id); // var notice = new QANotice() // { // TrialId = study.TrialId, // SubjectVisitId = study.Id, // FromUser = _userInfo.RealName, // FromUserId = _userInfo.Id, // FromUserType = _userInfo.UserTypeShortName, // //FromUser = currentCRC.UserRealName, // //FromUserId = _userInfo.Id, // //FromUserType = currentCRC.UserType, // NoticeTypeEnum = NoticeType.CRC_RequestToQA_NoticeQA, // NeedDeal = true, // StudyStatusStr = "QA Requested", // Message = // $"IC -> QA : {_userInfo.RealName} request QA {study.StudyCode} , Inquiry can be performed! ", // SendTime = DateTime.Now, // }; // qaList.ForEach(t => notice.QANoticeUserList.Add(new QANoticeUser() // { // QANoticeId = notice.Id, // SubjectVisitId = study.Id, // ToUser = t.User.LastName + " / " + t.User.FirstName, // ToUserId = t.UserId, // ToUserType = t.User.UserTypeRole.UserTypeShortName // })); // _qaNoticeRepository.Add(notice); // //DealRequestToQA(study.Id); // var needDealNoticeList = _qaNoticeRepository.AsQueryable() // .Where(t => t.SubjectVisitId == study.Id && t.NeedDeal && t.NoticeTypeEnum == NoticeType.CRC_RequestToQA_NoticeQA).ToList(); // needDealNoticeList.ForEach(t => // { // t.NeedDeal = false; // t.DealTime = DateTime.Now; // _qaNoticeRepository.Update(t); // }); // } // // QA =>IC 向IC推送消息影像有问题 同时作为 requestToQA 的边界 // else if (studyStatus.Status == (int)StudyStatus.QAing) // { // //找出当前操作的QA 如果是pm 或者admin 代替操作 此时会有问题 所以 谁代替,就以谁的名义执行 // //var currentQA = qaList.First(t => t.UserId == _userInfo.Id); // //var currentQA = trialUserList.First(t => t.UserId == _userInfo.Id); // //在项目IC列表中筛选出 负责该study关联 site的IC // var siteCRCList = _userTrialSiteRepository.Where(t => // t.SiteId == study.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == study.TrialId).ToList(); // //查询项目的参与者 和 负责site下IC用户 // var notice = new QANotice() // { // TrialId = study.TrialId, // SubjectVisitId = study.Id, // //FromUser = currentQA.UserRealName, // //FromUserId = _userInfo.Id, // //FromUserType = currentQA.UserType, // FromUser = _userInfo.RealName, // FromUserId = _userInfo.Id, // FromUserType = _userInfo.UserTypeShortName, // NoticeTypeEnum = NoticeType.QA_InQA_NoticeCRC, // NeedDeal = true, // StudyStatusStr = "In QA", // Message = $"QA -> IC : {_userInfo.RealName} inquiry {study.StudyCode} ", // SendTime = DateTime.Now, // }; // siteCRCList.ForEach(t => notice.QANoticeUserList.Add(new QANoticeUser() // { // QANoticeId = notice.Id, // SubjectVisitId = study.Id, // ToUser = t.User.LastName + " / " + t.User.FirstName, // ToUserId = t.UserId, // ToUserType = t.UserTypeRole.UserTypeShortName // })); // //添加 发送给IC的消息 消息和IC是 一对多 // _qaNoticeRepository.Add(notice); // //处理 消息 标记已处理 // var needDealNoticeList = _qaNoticeRepository.AsQueryable() // .Where(t => t.SubjectVisitId == study.Id && t.NeedDeal && // (t.NoticeTypeEnum == NoticeType.CRC_RequestToQA_NoticeQA || // t.NoticeTypeEnum == NoticeType.CRC_ReUpload_NoticeQA || // t.NoticeTypeEnum == NoticeType.CRC_QARecordDialogPost_NoticeQA)).ToList(); // needDealNoticeList.ForEach(t => // { // t.NeedDeal = false; // t.DealTime = DateTime.Now; // _qaNoticeRepository.Update(t); // }); // } // // QA =>QA 给自己的消息 通知需要匿名化 同时作为 requestToQA 的边界 // else if (studyStatus.Status == (int)StudyStatus.QAFinish) // { // //找出当前操作的QA 如果是pm 或者admin 代替操作 此时会有问题 所以 谁代替,就以谁的名义执行 // //var currentQA = qaList.First(t => t.UserId == _userInfo.Id); // //var currentQA = trialUserList.First(t => t.UserId == _userInfo.Id); // //发送给当前项目QA列表 // var notice = new QANotice() // { // TrialId = study.TrialId, // SubjectVisitId = study.Id, // //FromUser = currentQA.UserRealName, // //FromUserId = _userInfo.Id, // //FromUserType = currentQA.UserType, // FromUser = _userInfo.RealName, // FromUserId = _userInfo.Id, // FromUserType = _userInfo.UserTypeShortName, // NoticeTypeEnum = NoticeType.QA_QAPass_NoticeQA, // NeedDeal = true, // StudyStatusStr = "QA-Passed", // Message = // $"QA -> QA : {_userInfo.RealName} inquiry {study.StudyCode} finished,Anonymization can be performed!", // SendTime = DateTime.Now, // }; // qaList.ForEach(t => notice.QANoticeUserList.Add(new QANoticeUser() // { // QANoticeId = notice.Id, // SubjectVisitId = study.Id, // ToUser = t.User.LastName+" / "+t.User.FirstName, // ToUserId = t.UserId, // ToUserType = t.User.UserTypeRole.UserTypeShortName // })); // _qaNoticeRepository.Add(notice); // //处理 消息 标记已处理 存在意外情况 qa发给IC的 但是qa里面设置了 通过或者不通过 此时qa发送的消息也设置为已处理 // var needDealNoticeList = _qaNoticeRepository.AsQueryable() // .Where(t => t.SubjectVisitId == study.Id && t.NeedDeal && // (t.NoticeTypeEnum == NoticeType.CRC_RequestToQA_NoticeQA || // t.NoticeTypeEnum == NoticeType.CRC_ReUpload_NoticeQA || // t.NoticeTypeEnum == NoticeType.CRC_QARecordDialogPost_NoticeQA || // t.NoticeTypeEnum == NoticeType.QA_QARecordDialogPost_NoticeCRC || // t.NoticeTypeEnum == NoticeType.QA_InQA_NoticeCRC || // t.NoticeTypeEnum == NoticeType.QA_AddQARecord_NoticeCRC)).ToList(); // needDealNoticeList.ForEach(t => // { // t.NeedDeal = false; // t.DealTime = DateTime.Now; // _qaNoticeRepository.Update(t); // }); // } // // QA =>IC 暂时不用发送消息给IC 因为IC 暂时没有入口回复 同时作为 requestToQA 的边界 // else if (studyStatus.Status == (int)StudyStatus.QAFInishNotPass) // { // _qaNoticeRepository.Add(new QANotice() // { // TrialId = study.TrialId, // SubjectVisitId = study.Id, // FromUser = _userInfo.RealName, // FromUserId = _userInfo.Id, // FromUserType = _userInfo.UserTypeShortName, // NoticeTypeEnum = NoticeType.NotNeedNotice, // NeedDeal = false, // StudyStatusStr = "QA-Failed", // Message = $"QA : {_userInfo.RealName} set {study.StudyCode} QA-Failed !", // SendTime = DateTime.Now, // }); // //处理 消息 标记已处理 // var needDealNoticeList = _qaNoticeRepository.AsQueryable() // .Where(t => t.SubjectVisitId == study.Id && t.NeedDeal && // (t.NoticeTypeEnum == NoticeType.CRC_RequestToQA_NoticeQA || // t.NoticeTypeEnum == NoticeType.CRC_ReUpload_NoticeQA || // t.NoticeTypeEnum == NoticeType.CRC_QARecordDialogPost_NoticeQA || // t.NoticeTypeEnum == NoticeType.QA_QARecordDialogPost_NoticeCRC || // t.NoticeTypeEnum == NoticeType.QA_InQA_NoticeCRC || // t.NoticeTypeEnum == NoticeType.QA_AddQARecord_NoticeCRC)).ToList(); // needDealNoticeList.ForEach(t => // { // t.NeedDeal = false; // t.DealTime = DateTime.Now; // _qaNoticeRepository.Update(t); // }); // } // #endregion // } // else if (invocation.Method.Name == "ReUploadSameStudy") // { // var studyId = Guid.Parse(invocation.Arguments[0].ToString()); // var study = _studyRepository.FirstOrDefault(t => t.Id == studyId); // var status = study.Status; // //处理IC 重传时 QA消息 // if (status == (int)StudyStatus.QAing) // { // //查询项目的参与者 和 负责site下IC用户 // var trialUserList = _userTrialRepository.Where(t => t.TrialId == study.TrialId).ToList(); // // 找到该study 关联Site 下的IC // var crcList = _userTrialSiteRepository.Where(t => // t.SiteId == study.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == study.TrialId).ToList(); // var qaList = trialUserList.Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).ToList(); // //IC =>QA IC的职能被PM 或者admin代替 // //if (_userInfo.UserTypeEnumInt == (int)UserType.ClinicalResearchCoordinator) // { // //PM 或者admin可以代替IC角色 不能从IC列表中查询用户 // //var currentCRC = trialUserList.First(t => t.UserId == _userInfo.Id); // var notice = new QANotice() // { // TrialId = study.TrialId, // SubjectVisitId = study.Id, // //FromUser = currentCRC.UserRealName, // //FromUserId = _userInfo.Id, // //FromUserType = currentCRC.UserType, // FromUser = _userInfo.RealName, // FromUserId = _userInfo.Id, // FromUserType = _userInfo.UserTypeShortName, // NoticeTypeEnum = NoticeType.CRC_ReUpload_NoticeQA, // NeedDeal = true, // Message = $"IC -> QA :{_userInfo.RealName} has reuploaded {study.StudyCode} , Need to be inquiry again", // SendTime = DateTime.Now // }; // qaList.ForEach(t => notice.QANoticeUserList.Add(new QANoticeUser() // { // QANoticeId = notice.Id, // SubjectVisitId = study.Id, // ToUser = t.User.LastName+" / "+t.User.FirstName, // ToUserId = t.UserId, // ToUserType = t.User.UserTypeRole.UserTypeShortName // })); // _qaNoticeRepository.Add(notice); // //这里作为 QA 设置 Inqa 状态的回复 或者QA和IC对话的 // var needDealNoticeList = _qaNoticeRepository.Where(t => t.SubjectVisitId == study.Id && t.NeedDeal // && (t.NoticeTypeEnum == NoticeType.QA_InQA_NoticeCRC || t.NoticeTypeEnum == NoticeType.QA_QARecordDialogPost_NoticeCRC)) // .ToList(); // needDealNoticeList.ForEach(t => // { // t.NeedDeal = false; // t.DealTime = DateTime.Now; // _qaNoticeRepository.Update(t); // }); // } // } // else // { // //不是QAing 的重传 不发送qa消息 // return; // } // } // else if (invocation.Method.Name == "DicomAnonymize") // { // var studyId = Guid.Parse(invocation.Arguments[0].ToString()); // var study = _studyRepository.FirstOrDefault(t => t.Id == studyId); // #region 处理QA通知 匿名化完毕 通知PM // //查询项目的参与者 和 负责site下IC用户 // var trialUserList = _userTrialRepository.Where(t => t.TrialId == study.TrialId).ToList(); // // 找到该study 关联Site 下的IC // var crcList = _userTrialSiteRepository.Where(t => // t.SiteId == study.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == study.TrialId).ToList(); // var qaList = trialUserList.Where(t => t.User.UserTypeEnum == UserTypeEnum.IQC).ToList(); // // // var pm = trialUserList.FirstOrDefault(t => t.User.UserTypeEnum == UserTypeEnum.ProjectManager); // //找出当前操作的QA 如果是pm 或者admin 代替操作 此时会有问题 所以 谁代替,就以谁的名义执行 // //var currentQA = trialUserList.First(t => // // t.UserTypeEnum == UserType.IQC && t.UserId == _userInfo.Id); // //var currentQA = trialUserList.First(t => t.UserId == _userInfo.Id); // var notice = new QANotice() // { // TrialId = study.TrialId, // SubjectVisitId = study.Id, // //FromUser = currentQA.UserRealName, // //FromUserId = _userInfo.Id, // //FromUserType = currentQA.UserType, // FromUser = _userInfo.RealName, // FromUserId = _userInfo.Id, // FromUserType = _userInfo.UserTypeShortName, // NoticeTypeEnum = NoticeType.QA_Anonymized_NoticeQA, // NeedDeal = true, // StudyStatusStr = "Anonymized", // //Message = $"QA -> PM :{_userInfo.RealName} has anonymized {study.StudyCode} ,Forward can be performed!!", // Message = $"QA -> QA :{_userInfo.RealName} has anonymized {study.StudyCode} ,Forward can be performed!!", // SendTime = DateTime.Now, // }; // //notice.QANoticeUserList.Add(new QANoticeUser() // //{ // // QANoticeId = notice.Id, // // StudyId = study.Id, // // ToUser = pm.UserRealName, // // ToUserId = pm.UserId, // // ToUserType = pm.UserType // //}); // qaList.ForEach(t => notice.QANoticeUserList.Add(new QANoticeUser() // { // QANoticeId = notice.Id, // SubjectVisitId = study.Id, // ToUser = t.User.LastName+" / "+t.User.FirstName, // ToUserId = t.UserId, // ToUserType = t.User.UserTypeRole.UserTypeShortName // })); // _qaNoticeRepository.Add(notice); // var needDealNoticeList = _qaNoticeRepository.AsQueryable() // .Where(t => t.SubjectVisitId == study.Id && t.NeedDeal && (t.NoticeTypeEnum == NoticeType.QA_QAPass_NoticeQA)).ToList(); // needDealNoticeList.ForEach(t => // { // t.NeedDeal = false; // t.DealTime = DateTime.Now; // _qaNoticeRepository.Update(t); // }); // #endregion // } // else if (invocation.Method.Name == "ForwardStudy") // { // var studyId = Guid.Parse(invocation.Arguments[0].ToString()); // var study = _studyRepository.FirstOrDefault(t => t.Id == studyId); // //匿名化操作产生的消息 设置为已经处理 // _qaNoticeRepository.Add(new QANotice() // { // TrialId = study.TrialId, // SubjectVisitId = study.Id, // //FromUser = currentQA.UserRealName, // //FromUserId = _userInfo.Id, // //FromUserType = currentQA.UserType, // FromUser = _userInfo.RealName, // FromUserId = _userInfo.Id, // FromUserType = _userInfo.UserTypeShortName, // NoticeTypeEnum = NoticeType.NotNeedNotice, // NeedDeal = false, // StudyStatusStr = "Forwarded", // //Message = $"PM :{_userInfo.RealName} has forwarded {study.StudyCode} !", // Message = $"QA :{_userInfo.RealName} has forwarded {study.StudyCode} !", // SendTime = DateTime.Now, // }); // var needDealList = _qaNoticeRepository.Where(t => // t.SubjectVisitId == study.Id && t.NeedDeal && t.NoticeTypeEnum == NoticeType.QA_Anonymized_NoticeQA).ToList(); // needDealList.ForEach(t => // { // t.NeedDeal = false; // t.DealTime = DateTime.Now; // _qaNoticeRepository.Update(t); // }); // } // var success = _qaNoticeRepository.SaveChanges(); // if (!success) // { // throw new Exception("Send QA message failed"); // } // } // } //}