diff --git a/IRaCIS.Core.API/_ServiceExtensions/AutofacModuleSetup.cs b/IRaCIS.Core.API/_ServiceExtensions/AutofacModuleSetup.cs index 9869271d4..6a11b1fb3 100644 --- a/IRaCIS.Core.API/_ServiceExtensions/AutofacModuleSetup.cs +++ b/IRaCIS.Core.API/_ServiceExtensions/AutofacModuleSetup.cs @@ -1,7 +1,6 @@ using Autofac; using Autofac.Extras.DynamicProxy; using IRaCIS.Core.Application; -using IRaCIS.Core.Application.AOP; using IRaCIS.Core.Application.BackGroundJob; using IRaCIS.Core.Infra.EFCore; using Microsoft.AspNetCore.Http; diff --git a/IRaCIS.Core.Application/AOP/AsyncInterceptor.cs b/IRaCIS.Core.Application/AOP/AsyncInterceptor.cs deleted file mode 100644 index d08f1649f..000000000 --- a/IRaCIS.Core.Application/AOP/AsyncInterceptor.cs +++ /dev/null @@ -1,97 +0,0 @@ -using Castle.DynamicProxy; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Text; -using System.Threading.Tasks; - -namespace IRaCIS.Core.Application.AOP -{ - public abstract class AsyncInterceptorBase : IInterceptor - { - public AsyncInterceptorBase() - { - } - - public void Intercept(IInvocation invocation) - { - BeforeProceed(invocation); - invocation.Proceed(); - if (IsAsyncMethod(invocation.MethodInvocationTarget)) - { - invocation.ReturnValue = InterceptAsync((dynamic)invocation.ReturnValue, invocation); - } - else - { - AfterProceedSync(invocation); - } - } - - private bool CheckMethodReturnTypeIsTaskType(MethodInfo method) - { - var methodReturnType = method.ReturnType; - if (methodReturnType.IsGenericType) - { - if (methodReturnType.GetGenericTypeDefinition() == typeof(Task<>) || - methodReturnType.GetGenericTypeDefinition() == typeof(ValueTask<>)) - return true; - } - else - { - if (methodReturnType == typeof(Task) || - methodReturnType == typeof(ValueTask)) - return true; - } - return false; - } - - private bool IsAsyncMethod(MethodInfo method) - { - bool isDefAsync = Attribute.IsDefined(method, typeof(AsyncStateMachineAttribute), false); - bool isTaskType = CheckMethodReturnTypeIsTaskType(method); - bool isAsync = isDefAsync && isTaskType; - - return isAsync; - } - - protected object ProceedAsyncResult { get; set; } - - - private async Task InterceptAsync(Task task, IInvocation invocation) - { - await task.ConfigureAwait(false); - await AfterProceedAsync(invocation, false); - } - - private async Task InterceptAsync(Task task, IInvocation invocation) - { - ProceedAsyncResult = await task.ConfigureAwait(false); - await AfterProceedAsync(invocation, true); - return (TResult)ProceedAsyncResult; - } - - private async ValueTask InterceptAsync(ValueTask task, IInvocation invocation) - { - await task.ConfigureAwait(false); - await AfterProceedAsync(invocation, false); - } - - private async ValueTask InterceptAsync(ValueTask task, IInvocation invocation) - { - ProceedAsyncResult = await task.ConfigureAwait(false); - await AfterProceedAsync(invocation, true); - return (TResult)ProceedAsyncResult; - } - - protected virtual void BeforeProceed(IInvocation invocation) { } - - protected virtual void AfterProceedSync(IInvocation invocation) { } - - protected virtual Task AfterProceedAsync(IInvocation invocation, bool hasAsynResult) - { - return Task.CompletedTask; - } - } -} diff --git a/IRaCIS.Core.Application/AOP/QANoticeAOP.cs b/IRaCIS.Core.Application/AOP/QANoticeAOP.cs deleted file mode 100644 index 0e80ae3a4..000000000 --- a/IRaCIS.Core.Application/AOP/QANoticeAOP.cs +++ /dev/null @@ -1,499 +0,0 @@ -//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 = $"CRC : {_userInfo.RealName} has uploaded {study.StudyCode} ", -// SendTime = DateTime.Now, -// }); -// } - -// #region 处理QA通知模块 - -// //查询项目的参与者 和 负责site下CRC用户 -// var trialUserList = _userTrialRepository.Where(t => t.TrialId == study.TrialId).ToList(); - -// // 找到该study 关联Site 下的CRC - -// 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); - - - - -// // CRC =>QA -// if (studyStatus.Status == (int)StudyStatus.QARequested) -// { -// //找出当前操作的CRC -// //PM 或者admin可以代替CRC角色 不能从CRC列表中查询用户 -// //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 = -// $"CRC -> 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 =>CRC 向CRC推送消息影像有问题 同时作为 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); - -// //在项目CRC列表中筛选出 负责该study关联 site的CRC -// var siteCRCList = _userTrialSiteRepository.Where(t => -// t.SiteId == study.SiteId && t.User.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator && t.TrialId == study.TrialId).ToList(); - -// //查询项目的参与者 和 负责site下CRC用户 - - - -// 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 -> CRC : {_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 -// })); - -// //添加 发送给CRC的消息 消息和CRC是 一对多 -// _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发给CRC的 但是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 =>CRC 暂时不用发送消息给CRC 因为CRC 暂时没有入口回复 同时作为 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; - -// //处理CRC 重传时 QA消息 - -// if (status == (int)StudyStatus.QAing) -// { -// //查询项目的参与者 和 负责site下CRC用户 -// var trialUserList = _userTrialRepository.Where(t => t.TrialId == study.TrialId).ToList(); - -// // 找到该study 关联Site 下的CRC - -// 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(); - -// //CRC =>QA CRC的职能被PM 或者admin代替 -// //if (_userInfo.UserTypeEnumInt == (int)UserType.ClinicalResearchCoordinator) -// { -// //PM 或者admin可以代替CRC角色 不能从CRC列表中查询用户 -// //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 = $"CRC -> 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和CRC对话的 -// 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下CRC用户 -// var trialUserList = _userTrialRepository.Where(t => t.TrialId == study.TrialId).ToList(); - -// // 找到该study 关联Site 下的CRC - -// 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"); -// } -// } - - -// } -//} \ No newline at end of file diff --git a/IRaCIS.Core.Application/AOP/TrialStatusAutofacAOP.cs b/IRaCIS.Core.Application/AOP/TrialStatusAutofacAOP.cs deleted file mode 100644 index e1523b6d9..000000000 --- a/IRaCIS.Core.Application/AOP/TrialStatusAutofacAOP.cs +++ /dev/null @@ -1,89 +0,0 @@ -using Castle.DynamicProxy; -using EasyCaching.Core; -using IRaCIS.Application.Contracts; -using IRaCIS.Core.Domain.Share; - -namespace IRaCIS.Core.Application.AOP -{ - public class TrialStatusAutofacAOP : IAsyncInterceptor - { - private readonly IEasyCachingProvider _provider; - - public TrialStatusAutofacAOP(IEasyCachingProvider provider) - { - _provider = provider; - } - - - - public void InterceptAsynchronous(IInvocation invocation) - { - invocation.Proceed(); - } - - //这里AOP 处理两个方法 分别是 项目的添加和更新、项目状态的变更 - - public void InterceptAsynchronous(IInvocation invocation) - { - - - //处理拦截的方法 - invocation.Proceed(); - - - - dynamic result = invocation.ReturnValue; - - //接口成功了,才修改缓存 - if (!result.IsSuccess) - { - return; - } - - #region 处理项目列表的查询 在前端界面已经在某个界面,但是服务器重置了,此时没有缓存项目信息,接口不能正确返回,因故采用,启动时查询,每天查询一次,缓存一天,然后项目添加、更改状态时,及时更新 - - //if (invocation.Method.Name == "GetTrialList") - //{ - // //在此 将当前查询的项目Id 和对应的项目状态进行缓存 - // dynamic result = invocation.ReturnValue; - // foreach (var item in result.CurrentPageData) - // { - // _provider.Remove(item.Id.ToString()); - // _provider.Set(item.Id.ToString(), item.TrialStatusStr.ToString(), TimeSpan.FromDays(1)); - // } - //} - - #endregion - - if (invocation.Method.Name == "AddOrUpdateTrial") - { - //如果是添加 那么将对应的初始状态加进去 更新状态是单独操作的 - - var trialModel = (invocation.Arguments[0] as TrialCommand).IfNullThrowConvertException(); - if (trialModel.Id == null || trialModel.Id == Guid.Empty) - { - _provider.Set(result.Data.Id.ToString(), StaticData.TrialState.TrialOngoing, TimeSpan.FromDays(1)); - } - - - } - // 更新缓存 - else if (invocation.Method.Name == "UpdateTrialStatus") - { - //项目状态更新,也需要及时更新 - _provider.Set(invocation.Arguments[0].ToString(), invocation.Arguments[1].ToString(), TimeSpan.FromDays(1)); - - ////Test参数是否符合要求 - //var tt = invocation.Arguments[0].ToString(); - //var cc = _provider.Get(invocation.Arguments[0].ToString()); - - } - - } - - public void InterceptSynchronous(IInvocation invocation) - { - invocation.Proceed(); - } - } -} \ No newline at end of file diff --git a/IRaCIS.Core.Application/BusinessFilter/LogActionFilter.cs b/IRaCIS.Core.Application/BusinessFilter/LogActionFilter.cs deleted file mode 100644 index 64f11585b..000000000 --- a/IRaCIS.Core.Application/BusinessFilter/LogActionFilter.cs +++ /dev/null @@ -1,81 +0,0 @@ -//using System.Diagnostics; -//using IRaCIS.Application.Interfaces; -//using IRaCIS.Application.Contracts; -//using IRaCIS.Core.Infra.EFCore; -//using IRaCIS.Core.Infrastructure.Extention; -//using Microsoft.AspNetCore.Mvc; -//using Microsoft.AspNetCore.Mvc.Filters; -//using Microsoft.Extensions.Logging; -//using Newtonsoft.Json; - -//namespace IRaCIS.Core.Application.Filter -//{ - -// [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] -// public class LogFilter : Attribute -// { -// } -// public class LogActionFilter : IAsyncActionFilter -// { -// private readonly ILogService _logService; -// private readonly IUserInfo _userInfo; -// private readonly ILogger _logger; - -// public LogActionFilter(ILogService logService, IUserInfo userInfo , ILogger logger) -// { -// _logService = logService; -// _userInfo = userInfo; -// _logger = logger; -// } - -// public Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) -// { - -// if (context.ActionDescriptor.EndpointMetadata!=null&& context.ActionDescriptor.EndpointMetadata.Any(m => m.GetType() == typeof(LogFilter))) -// { -// return LogAsync(context, next); -// } -// return next(); -// } - -// public async Task LogAsync(ActionExecutingContext context, ActionExecutionDelegate next) -// { -// var sw = new Stopwatch(); -// sw.Start(); - -// dynamic actionResult = (await next()).Result; -// sw.Stop(); -// var args = JsonConvert.SerializeObject(context.ActionArguments); -// var result = JsonConvert.SerializeObject(actionResult?.Value); - -// var attr = (ApiExplorerSettingsAttribute)context.ActionDescriptor.EndpointMetadata.FirstOrDefault(m => m.GetType() == typeof(ApiExplorerSettingsAttribute)); -// var groupName = attr?.GroupName; -// var res = actionResult?.Value as IResponseOutput; -// var input = new SystemLogDTO -// { -// ClientIP = string.Empty, -// OptUserId = _userInfo.Id, -// OptUserName = _userInfo.UserName, -// ApiPath = context.ActionDescriptor.AttributeRouteInfo.Template.ToLower(), -// Params = args, -// Result = result, -// RequestTime = DateTime.Now, -// ElapsedMilliseconds = sw.ElapsedMilliseconds, -// Status =res?.IsSuccess?? false, -// Message = res?.ErrorMessage, -// LogCategory = groupName -// }; - -// try -// { -// _logService.SaveLog2Db(input); -// } -// catch (Exception ex) -// { - -// _logger.LogError(ex.Message); -// } - -// } -// } -//} diff --git a/IRaCIS.Core.Application/BusinessFilter/TrialAuditFilter.cs b/IRaCIS.Core.Application/BusinessFilter/TrialAuditFilter.cs deleted file mode 100644 index a614a1e6d..000000000 --- a/IRaCIS.Core.Application/BusinessFilter/TrialAuditFilter.cs +++ /dev/null @@ -1,1575 +0,0 @@ -//using IRaCIS.Application.Contracts; -//using IRaCIS.Core.Application.Contracts.Dicom.DTO; -//using IRaCIS.Core.Application.Contracts.DTO; -//using IRaCIS.Core.Infra.EFCore; -//using IRaCIS.Core.Domain.Models; -//using IRaCIS.Core.Domain.Share; -//using IRaCIS.Core.Infrastructure.Extention; -//using Microsoft.AspNetCore.Mvc.Filters; -//using Microsoft.EntityFrameworkCore; -//using Microsoft.Extensions.Logging; -//using IRaCIS.Core.Infrastructure; -//using IRaCIS.Core.Application.Contracts; - -//namespace IRaCIS.Core.Application.Filter -//{ -//#pragma warning disable CS8618 - -//#pragma warning disable CS8062 -// //by zhouhang 2021.08 - - -//审计类型大类 -using Microsoft.AspNetCore.Mvc.Filters; - -public enum AuditType -{ - TrialAudit = 0, - SubjectAudit = 1, - StudyAudit = 2 -} - -//具体审计操作 -public enum AuditOptType -{ - //DeleteTrial = 2, - AddOrUpdateTrial = 0, - - AddTrialSiteSurvey = 1, - - //参与人员 - AddTrialStaff = 3, - DeleteTrailStaff = 4, - - //Site - AddTrialSite = 5, - DeleteTrialSite = 6, - - //Site CRC - AddTrialSiteCRC = 7, - DeleteTrialSiteCRC = 8, - - //访视计划 - AddOrUpdateTrialVisitPlanItem = 9, - DeleteTrialVisitPlanItem = 10, - ConfirmTrialVisitPlan = 11, - - //项目模板 - AddOrUpdateTrialTemplate = 12, - DeleteTrialTemplate = 13, - - //subject 访视计划 - AddOrUpdateSubjectOutPlanVisit = 14, - DeleteSubjectOutPlanVisit = 15, - SetSVExecuted = 16, - - AddOrUpdateSubject = 17, - DeleteSubject = 18, - - //影像上传 - UploadImage = 19, - - //变更QA状态 比如设置为QA中 QA结束通过、不通过 - ChangeStudyStatus = 20, - - //匿名化 - Anonymized = 22, - - //转发 - Forwarded = 24 -} - -[AttributeUsage(AttributeTargets.Method)] -public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilter -{ - private readonly AuditType _auditType; - private readonly AuditOptType _auditOptType; - public TrialAuditAttribute(AuditType auditType, AuditOptType auditOptType) - { - _auditType = auditType; - _auditOptType = auditOptType; - } - public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) - { - await next(); - - } -} - -// [AttributeUsage(AttributeTargets.Method)] -// public class TrialAuditAttribute : Attribute,/*IActionFilter, */IAsyncActionFilter -// { -// private readonly AuditType _auditType; -// private readonly AuditOptType _auditOptType; -// public IDictionary _actionArguments; - -// #region 根据不同接口构造的属性 - -// private TrialAuditAttribute _attr; - -// private string _userIdStr; - -// private string _userRealName; - -// private IRepository _auditRepository; - -// private TrialUser _userTrial; - -// private TrialSiteUser _userTrialSite; - -// private VisitStage _visitPlan; - -// //private QATrialTemplate _qATrailTemplate; - -// private Subject _subject; - -// private SubjectVisit _subjectVisit; - -// private TrialSite _trialSite; - -// private DicomStudy _study; - -// private IRepository _studyRepository; - -// //private IRaCISDBContext _dbContext; - -// //private IDbContextTransaction transaction; - - -// #endregion - -// public TrialAuditAttribute(AuditType auditType, AuditOptType auditOptType) -// { -// _auditType = auditType; -// _auditOptType = auditOptType; -// } - - -// #region 同步版本 废弃 - -// //public void OnActionExecuted(ActionExecutedContext executedcontext) -// //{ - -// // //上传影像接口返回值类型特殊 需要单独处理 -// // if (_attr._auditOptType == AuditOptType.UploadImage) -// // { -// // //接口参数 -// // var archiveStudyInfo = (ArchiveStudyCommand)_actionArguments.Values.ToList()[0]; - -// // //接口返回结果 因为上传成功和不成功 泛型类型不一样 -// // dynamic archive = executedcontext.Result; -// // if (archive == null) -// // { -// // var logger = (ILogger)executedcontext.HttpContext.RequestServices.GetService( -// // typeof(ILogger)); - -// // logger.LogError("影像上传,OnActionExecuted Reuslt 为null"); -// // return; -// // } -// // var archiveResult = (IResponseOutput)archive.Value; - - - -// // if (archiveResult.IsSuccess) -// // { -// // _studyRepository = (IRepository)executedcontext.HttpContext.RequestServices.GetService( -// // typeof(IRepository)); - -// // var successResult = (IResponseOutput)archiveResult; - -// // _study = _studyRepository.GetAll().First(t => -// // t.Id == successResult.Data.ArchivedDicomStudies.ToList()[0].Id); - -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _study.TrialId, -// // SubjectId = _study.SubjectId, -// // StudyId = _study.Id, -// // AuditType = (int)AuditType.StudyAudit, -// // Note = $"{ _userRealName} 动作变更了 { _study.StudyCode} 检查状态为 {DealStudyStatus(_study.Status)} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); - -// // _auditRepository.SaveChanges(); -// // } - -// // return; -// // } - -// // //接口返回结果 -// // dynamic actionResult = executedcontext.Result; -// // var result = (IResponseOutput)actionResult.Value;//此处审计只涉及到添加更新和删除, 统一了相关接口的返回结果,才能在此强制转换 - - - -// // switch (_attr._auditType) -// // { -// // //项目审计 -// // case AuditType.TrialAudit: - -// // switch (_attr._auditOptType) -// // { -// // //项目的添加和更新接口 -// // case AuditOptType.AddOrUpdateTrial: - -// // //接口参数 -// // var trialInfo = (TrialCommand)_actionArguments.Values.ToList()[0]; - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // //判断是添加还是更新 -// // TrialId = trialInfo.Id == null ? Guid.Parse(result.Data) : trialInfo.Id.Value, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = trialInfo.Id == null ? $"{ _userRealName} 添加了项目 {trialInfo.Code} " : $"{ _userRealName} 更新了项目 {trialInfo.Code} 基本信息 ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; -// // //添加项目运维人员 -// // case AuditOptType.AddTrialStaff: - -// // //接口参数 -// // var trialUsers = (List)_actionArguments.Values.ToList()[0]; - -// // if (result.IsSuccess) -// // { - -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = trialUsers[0].TrialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 添加了项目运维人员 {string.Join(',', trialUsers.Select(t => t.UserRealName).ToList())} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; - -// // //添加研究中心 -// // case AuditOptType.AddTrialSite: -// // //接口参数 -// // var trialSites = (List)_actionArguments.Values.ToList()[0]; - -// // if (result.IsSuccess) -// // { -// // //查询site信息 -// // var siteIds = trialSites.Select(t => t.SiteId).ToList(); -// // var _siteRepository = (IRepository)executedcontext.HttpContext.RequestServices.GetService(typeof(IRepository)); -// // var siteNames = _siteRepository.Where(t => siteIds.Contains(t.Id)).Select(u => u.SiteName); - -// // _auditRepository.Add(new TrialAudit() -// // { -// // //判断是添加还是更新 -// // TrialId = trialSites[0].TrialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 添加了项目研究中心 {string.Join(',', siteNames)} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; - -// // //研究中心添加运维人员 -// // case AuditOptType.AddTrialSiteCRC: -// // //接口参数 -// // var trialSiteCRCs = (List)_actionArguments.Values.ToList()[0]; - -// // if (result.IsSuccess) -// // { -// // //查询site信息 -// // var _siteRepository = (IRepository)executedcontext.HttpContext.RequestServices.GetService(typeof(IRepository)); -// // var siteName = _siteRepository.GetAll().First(t => t.Id == trialSiteCRCs[0].SiteId).SiteName; - -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = trialSiteCRCs[0].TrialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 为{ siteName } 添加了运维人员 {string.Join(',', trialSiteCRCs.Select(t => t.UserRealName).ToList())}", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; - -// // //删除项目运维人员 -// // case AuditOptType.DeleteTrailStaff: - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _userTrial.TrialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 移除了项目参与人员 {_userTrial.UserRealName} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; -// // //删除项目site -// // case AuditOptType.DeleteTrialSite: - -// // if (result.IsSuccess) -// // { -// // //查询site信息 -// // var _siteRepository = (IRepository)executedcontext.HttpContext.RequestServices.GetService(typeof(IRepository)); -// // var siteName = _siteRepository.GetAll().First(t => t.Id == _trialSite.SiteId).SiteName; - -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _trialSite.TrialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 移除了研究中心 {siteName} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; -// // //删除项目Site CRC -// // case AuditOptType.DeleteTrialSiteCRC: - -// // if (result.IsSuccess) -// // { -// // //查询site信息 -// // var _siteRepository = (IRepository)executedcontext.HttpContext.RequestServices.GetService(typeof(IRepository)); -// // var siteName = _siteRepository.GetAll().First(t => t.Id == _userTrial.SiteId).SiteName; - -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _userTrial.TrialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 移除了 {siteName} 的运维人员 {_userTrial.UserRealName} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } -// // break; - -// // //添加访视计划Item -// // case AuditOptType.AddOrUpdateTrialVisitPlanItem: -// // //接口参数 -// // var visitPlanItem = (VisitPlanCommand)_actionArguments.Values.ToList()[0]; - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = visitPlanItem.TrialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = visitPlanItem.Id == null ? $"{ _userRealName} 添加了访视计划项 {visitPlanItem.VisitName} " : $"{ _userRealName} 更新了访视计划项为 {visitPlanItem.VisitName} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; -// // //删除访视计划Item -// // case AuditOptType.DeleteTrialVisitPlanItem: - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _visitPlan.TrialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 移除了访视计划项 {_visitPlan.VisitName} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } -// // break; - -// // //确认了访视计划 -// // case AuditOptType.ConfirmTrialVisitPlan: -// // var trialId = (Guid)_actionArguments.Values.ToList()[0]; - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = trialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 确认了访视计划,不允许修改 ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; -// // //添加了QA模板 -// // case AuditOptType.AddOrUpdateTrialTemplate: -// // //接口参数 -// // var trialQATemplate = (TrialQATemplateAddCommand)_actionArguments.Values.ToList()[0]; - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { - -// // TrialId = trialQATemplate.TrialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = trialQATemplate.Id == null ? $"{ _userRealName} 添加了QA模板 {trialQATemplate.Name} " : $"{ _userRealName} 更新了QA模板 {trialQATemplate.Name} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - - -// // break; -// // //删除项目模板 -// // case AuditOptType.DeleteTrialTemplate: - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { - -// // TrialId = _qATrailTemplate.TrialId, -// // SubjectId = Guid.Empty, -// // AuditType = (int)AuditType.TrialAudit, -// // Note = $"{ _userRealName} 移除了QA模板 {_qATrailTemplate.Name} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } -// // break; - -// // } - -// // break; -// // //受试者审计 -// // case AuditType.SubjectAudit: - - -// // switch (_attr._auditOptType) -// // { -// // // 添加或者更新受试者 -// // case AuditOptType.AddOrUpdateSubject: - -// // //接口参数 -// // var subject = (SubjectCommand)_actionArguments.Values.ToList()[0]; - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = subject.TrialId, -// // SubjectId = subject.Id == null ? Guid.Parse(result.Data) : subject.Id.Value, -// // AuditType = (int)AuditType.SubjectAudit, -// // Note = subject.Id == null ? $"{ _userRealName} 添加了受试者 {subject.LastName + subject.FirstName} 并初始化了访视计划" : $"{ _userRealName} 对受试者 { subject.LastName + subject.FirstName} 信息进行了更新 ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; -// // // 删除受试者 -// // case AuditOptType.DeleteSubject: -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _subject.TrialId, -// // SubjectId = _subject.Id, -// // AuditType = (int)AuditType.SubjectAudit, -// // Note = $"{ _userRealName} 移除了受试者 {_subject.LastName + _subject.FirstName} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; -// // // 受试者计划外访视 -// // case AuditOptType.AddOrUpdateSubjectOutPlanVisit: - -// // //接口参数 -// // var subjectVisit = (SubjectVisitCommand)_actionArguments.Values.ToList()[0]; - -// // if (result.IsSuccess) -// // { -// // var _subjectRepository = -// // (IRepository)executedcontext.HttpContext.RequestServices.GetService( -// // typeof(IRepository)); - -// // _subject = _subjectRepository.FirstOrDefault(t => t.Id == subjectVisit.SubjectId); - -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _subject.TrialId, -// // SubjectId = _subject.Id, -// // AuditType = (int)AuditType.SubjectAudit, -// // Note = subjectVisit.Id == null ? $"{ _userRealName} 为受试者 {_subject.LastName + _subject.FirstName} 添加了计划外访视 {subjectVisit.VisitName}" : $"{ _userRealName} 更新受试者 {_subject.LastName + _subject.FirstName} 计划外访视{subjectVisit.VisitName}", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; -// // // 删除计划外访视 -// // case AuditOptType.DeleteSubjectOutPlanVisit: - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _subjectVisit.TrialId, -// // SubjectId = _subject.Id, -// // AuditType = (int)AuditType.SubjectAudit, -// // Note = $"{ _userRealName} 移除了受试者{_subject.LastName + _subject.FirstName} 计划外访视 {_subjectVisit.VisitName} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; -// // // 人工设置已执行 -// // case AuditOptType.SetSVExecuted: - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _subjectVisit.TrialId, -// // SubjectId = _subject.Id, -// // AuditType = (int)AuditType.SubjectAudit, -// // Note = $"{ _userRealName} 将受试者 {_subject.LastName + _subject.FirstName} 访视 {_subjectVisit.VisitName} 设置为已执行 ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - - -// // break; -// // } - -// // break; - -// // //检查审计 -// // case AuditType.StudyAudit: -// // _studyRepository = -// // (IRepository)executedcontext.HttpContext.RequestServices.GetService( -// // typeof(IRepository)); - -// // switch (_attr._auditOptType) -// // { - -// // case AuditOptType.ChangeStudyStatus: - -// // //接口参数 -// // var studyStatusInfo = (StudyStatusDetailCommand)_actionArguments.Values.ToList()[0]; - -// // _study = _studyRepository.FirstOrDefault(t => t.Id == studyStatusInfo.StudyId); - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _study.TrialId, -// // SubjectId = _study.SubjectId, -// // StudyId = _study.Id, -// // AuditType = (int)AuditType.StudyAudit, -// // Note = $"{ _userRealName} 动作变更了 { _study.StudyCode} 检查状态为 {DealStudyStatus(_study.Status)} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - -// // break; - -// // case AuditOptType.Anonymized: - -// // case AuditOptType.Forwarded: - -// // //接口参数 -// // var studyId = (Guid)_actionArguments.Values.ToList()[0]; - -// // _study = _studyRepository.FirstOrDefault(t => t.Id == studyId); - -// // if (result.IsSuccess) -// // { -// // _auditRepository.Add(new TrialAudit() -// // { -// // TrialId = _study.TrialId, -// // SubjectId = _study.SubjectId, -// // StudyId = _study.Id, -// // AuditType = (int)AuditType.StudyAudit, -// // Note = $"{ _userRealName} 动作变更了 { _study.StudyCode} 检查状态为 {DealStudyStatus(_study.Status)} ", -// // Detail = string.Empty, -// // OptUserId = Guid.Parse(_userIdStr), -// // OptUser = _userRealName, -// // OptTime = DateTime.Now -// // }); -// // } - - -// // break; -// // } - -// // break; - -// // } - -// // _auditRepository.SaveChanges(); - -// //} - - -// //public void OnActionExecuting(ActionExecutingContext context) -// //{ -// // //_dbContext = (IRaCISDBContext)context.HttpContext.RequestServices.GetService(typeof(IRaCISDBContext)); - - -// // _actionArguments = context.ActionArguments; - -// // _attr = (TrialAuditAttribute)context.ActionDescriptor.EndpointMetadata.First(m => m.GetType() == typeof(TrialAuditAttribute)); - -// // _userIdStr = context.HttpContext.User.Claims.First(t => t.Type == "id")?.Value ?? Guid.Empty.ToString(); -// // _userRealName = context.HttpContext.User.Claims.First(t => t.Type == "realName")?.Value ?? string.Empty; - -// // //获取接口仓储 -// // _auditRepository = (IRepository)context.HttpContext.RequestServices.GetService(typeof(IRepository)); - - - -// // switch (_attr._auditType) -// // { -// // //项目审计 -// // case AuditType.TrialAudit: - -// // switch (_attr._auditOptType) -// // { -// // //删除项目运维人员 -// // case AuditOptType.DeleteTrailStaff: - -// // // 删除项目Site CRC -// // case AuditOptType.DeleteTrialSiteCRC: - -// // //接口参数 -// // var userTrialId = (Guid)_actionArguments.Values.ToList()[0]; - -// // var _userTrialRepository = -// // (IRepository)context.HttpContext.RequestServices.GetService( -// // typeof(IRepository)); - -// // _userTrial = _userTrialRepository.GetAll().First(t => t.Id == userTrialId); -// // break; - - -// // //删除项目site -// // case AuditOptType.DeleteTrialSite: - -// // //接口参数 -// // var trialSiteId = (Guid)_actionArguments.Values.ToList()[0]; - -// // var _TrialsiteRepository = -// // (IRepository)context.HttpContext.RequestServices.GetService( -// // typeof(IRepository)); - -// // _trialSite = _TrialsiteRepository.GetAll().First(t => t.Id == trialSiteId); -// // break; - -// // case AuditOptType.DeleteTrialVisitPlanItem: - -// // //接口参数 -// // var visitPlanId = (Guid)_actionArguments.Values.ToList()[0]; - -// // var _visitPlanRepository = -// // (IRepository)context.HttpContext.RequestServices.GetService( -// // typeof(IRepository)); - -// // _visitPlan = _visitPlanRepository.GetAll().First(t => t.Id == visitPlanId); - -// // break; -// // case AuditOptType.DeleteTrialTemplate: - -// // //接口参数 -// // var qATrailTemplateId = (Guid)_actionArguments.Values.ToList()[0]; -// // var _qATrailTemplateRepository = -// // (IRepository)context.HttpContext.RequestServices.GetService( -// // typeof(IRepository)); - -// // _qATrailTemplate = _qATrailTemplateRepository.GetAll() -// // .FirstOrDefault(t => t.Id == qATrailTemplateId); - -// // break; - -// // } - -// // break; - -// // //受试者审计 -// // case AuditType.SubjectAudit: - -// // switch (_auditOptType) -// // { -// // case AuditOptType.DeleteSubject: -// // //接口参数 -// // var subjectId = (Guid)_actionArguments.Values.ToList()[0]; - -// // var _subjectRepository = -// // (IRepository)context.HttpContext.RequestServices.GetService( -// // typeof(IRepository)); - -// // _subject = _subjectRepository.FirstOrDefault(t => t.Id == subjectId); - -// // break; - -// // case AuditOptType.DeleteSubjectOutPlanVisit: -// // case AuditOptType.SetSVExecuted: - -// // //接口参数 -// // var subjectVisitId = (Guid)_actionArguments.Values.ToList()[0]; - -// // var _subjectVisitRepository = -// // (IRepository)context.HttpContext.RequestServices.GetService( -// // typeof(IRepository)); - -// // _subjectVisit = _subjectVisitRepository.FirstOrDefault(t => t.Id == subjectVisitId); - -// // _subjectRepository = -// // (IRepository)context.HttpContext.RequestServices.GetService( -// // typeof(IRepository)); - -// // _subject = _subjectRepository.FirstOrDefault(t => t.Id == _subjectVisit.SubjectId); - -// // break; -// // } -// // break; - - -// // //检查审计 -// // case AuditType.StudyAudit: - -// // switch (_attr._auditOptType) -// // { -// // case AuditOptType.UploadImage: - -// // break; -// // } -// // break; - -// // } - -// //} -// #endregion - -// public static string DealStudyStatus(int status) -// { - -// var message = string.Empty; -// switch (status) -// { -// case (int)StudyStatus.Uploaded: -// message = "Uploaded"; -// break; - -// case (int)StudyStatus.QARequested: - -// message = "QA Requested"; -// break; -// case (int)StudyStatus.QAing: - -// message = "In QA"; -// break; - -// //case (int)StudyStatus.Abandon: -// // message = "Study has abandon"; -// // break; - -// case (int)StudyStatus.QAFinish: -// message = "QA Completed Passed"; -// break; - -// case (int)StudyStatus.QAFInishNotPass: -// message = "QA Completed Failed"; -// break; - -// case (int)StudyStatus.Anonymizing: -// message = "Anonymizing"; -// break; - -// case (int)StudyStatus.Anonymized: -// message = "Anonymized"; -// break; - -// case (int)StudyStatus.AnonymizeFailed: -// message = "Anonymize Failed"; -// break; - -// case (int)StudyStatus.Forwarding: -// message = "Forwarding"; -// break; - -// case (int)StudyStatus.Forwarded: -// message = "Forwarded "; -// break; - -// case (int)StudyStatus.ForwardFailed: -// message = "Forward Failed "; -// break; -// } - -// return message; -// } - -// public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) -// { -// // 开启AOP事务(审计消息记录和 添加更新记录 在一个事务里面,不再是分开的事务) -// //var _dbContext = (IRaCISDBContext)context.HttpContext.RequestServices.GetService(typeof(IRaCISDBContext)); - -// //var strategy = _dbContext.Database.CreateExecutionStrategy(); - -// var _dbContext = (IRaCISDBContext)context.HttpContext.RequestServices.GetService(typeof(IRaCISDBContext)); - -// var strategy = _dbContext.Database.CreateExecutionStrategy(); - -// await strategy.Execute(async () => -// { -// var currentTransaction = _dbContext.Database.CurrentTransaction; - -// var transaction = currentTransaction ?? _dbContext.Database.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted); - -// #region 执行方法前 - -// _actionArguments = context.ActionArguments; - -// _attr = (TrialAuditAttribute)context.ActionDescriptor.EndpointMetadata.First(m => m.GetType() == typeof(TrialAuditAttribute)); - -// _userIdStr = context.HttpContext.User.Claims.First(t => t.Type == "id")?.Value ?? Guid.Empty.ToString(); -// _userRealName = context.HttpContext.User.Claims.First(t => t.Type == "realName")?.Value ?? string.Empty; - -// //获取接口仓储 -// _auditRepository = (IRepository)context.HttpContext.RequestServices.GetService(typeof(IRepository)); - -// switch (_attr._auditType) -// { -// //项目审计 -// case AuditType.TrialAudit: - -// switch (_attr._auditOptType) -// { -// //删除项目运维人员 -// case AuditOptType.DeleteTrailStaff: - -// //接口参数 -// var userTrial = (Guid)_actionArguments.Values.ToList()[0]; - -// var _userTrialRepository = -// (IRepository)context.HttpContext.RequestServices.GetService( -// typeof(IRepository)); - -// _userTrial = _userTrialRepository.AsQueryable().Include(t => t.User).FirstOrDefault(t => t.Id == userTrial); -// break; - -// // 删除项目Site CRC -// case AuditOptType.DeleteTrialSiteCRC: - -// //接口参数 -// var userTrialSiteId = (Guid)_actionArguments.Values.ToList()[0]; - -// var _userTrialSiteRepository = -// (IRepository)context.HttpContext.RequestServices.GetService( -// typeof(IRepository)); - -// _userTrialSite = _userTrialSiteRepository.AsQueryable().Include(t => t.User).FirstOrDefault(t => t.Id == userTrialSiteId); -// break; - - -// //删除项目site -// case AuditOptType.DeleteTrialSite: - -// //接口参数 -// var trialSiteId = (Guid)_actionArguments.Values.ToList()[0]; - -// var _TrialsiteRepository = -// (IRepository)context.HttpContext.RequestServices.GetService( -// typeof(IRepository)); - -// _trialSite = _TrialsiteRepository.AsQueryable().Include(t => t.Site).FirstOrDefault(t => t.Id == trialSiteId); -// break; - -// case AuditOptType.DeleteTrialVisitPlanItem: - -// //接口参数 -// var visitPlanId = (Guid)_actionArguments.Values.ToList()[0]; - -// var _visitPlanRepository = -// (IRepository)context.HttpContext.RequestServices.GetService( -// typeof(IRepository)); - -// _visitPlan = _visitPlanRepository.FirstOrDefault(t => t.Id == visitPlanId).IfNullThrowException(); - -// break; -// case AuditOptType.DeleteTrialTemplate: - - - -// break; - -// } - -// break; - -// //受试者审计 -// case AuditType.SubjectAudit: - -// switch (_auditOptType) -// { -// case AuditOptType.DeleteSubject: -// //接口参数 -// var subjectId = (Guid)_actionArguments.Values.ToList()[0]; - -// var _subjectRepository = -// (IRepository)context.HttpContext.RequestServices.GetService( -// typeof(IRepository)); - -// _subject = _subjectRepository.FirstOrDefault(t => t.Id == subjectId).IfNullThrowException(); - -// break; - -// case AuditOptType.DeleteSubjectOutPlanVisit: -// case AuditOptType.SetSVExecuted: - -// //接口参数 -// var subjectVisitId = (Guid)_actionArguments.Values.ToList()[0]; - -// var _subjectVisitRepository = -// (IRepository)context.HttpContext.RequestServices.GetService( -// typeof(IRepository)); - -// _subjectVisit = _subjectVisitRepository.FirstOrDefault(t => t.Id == subjectVisitId).IfNullThrowException(); - -// _subjectRepository = -// (IRepository)context.HttpContext.RequestServices.GetService( -// typeof(IRepository)); - -// _subject = _subjectRepository.FirstOrDefault(t => t.Id == _subjectVisit.SubjectId).IfNullThrowException(); - -// break; -// } -// break; - - -// //检查审计 -// case AuditType.StudyAudit: - -// switch (_attr._auditOptType) -// { -// case AuditOptType.UploadImage: - -// break; -// } -// break; - -// } - -// #endregion - -// //获取实际执行方法next() 的结果 -// ActionExecutedContext executedcontext = await next(); - -// #region 方法执行后 - -// //上传影像接口返回值类型特殊 需要单独处理 -// if (_attr._auditOptType == AuditOptType.UploadImage) -// { - -// //接口参数 -// var archiveStudyInfo = (ArchiveStudyCommand)_actionArguments.Values.ToList()[0]; - -// if (executedcontext.Exception != null) -// { -// var logger = (ILogger)executedcontext.HttpContext.RequestServices.GetService( -// typeof(ILogger)); - -// logger!.LogError("影像上传 中间发生异常", executedcontext.Exception.StackTrace); - -// return; -// } - -// //接口返回结果 因为上传成功和不成功 泛型类型不一样 -// dynamic archive = executedcontext.Result; - - -// var archiveResult = (IResponseOutput)archive.Value; - -// if (archiveResult.IsSuccess) -// { - - -// _studyRepository = (IRepository)executedcontext.HttpContext.RequestServices.GetService(typeof(IRepository)); - -// _auditRepository = (IRepository)context.HttpContext.RequestServices.GetService(typeof(IRepository)); - -// var successResult = (IResponseOutput)archiveResult; - -// var studyList = _studyRepository.Where(t => t.SubjectVisitId == successResult.Data.ArchivedDicomStudies.ToList()[0].SubjectVisitId).ToList(); - -// studyList.ForEach(study => -// { -// var mes = study.Status == (int)StudyStatus.Uploaded ? "上传了" : "重传了"; -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = study.TrialId, -// SubjectId = study.SubjectId, -// StudyId = study.Id, -// AuditType = (int)AuditType.StudyAudit, -// //Note = $"{ _userRealName} 动作变更了 { _study.StudyCode} 检查状态为 {DealStudyStatus(_study.Status)} ", -// Note = $"{ _userRealName} {mes} { study.StudyCode} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// }); - - - -// _auditRepository.SaveChanges(); - -// transaction.Commit(); - -// return; - -// } - - -// } - -// //接口返回结果 -// if (executedcontext.Result is null) -// { -// throw new BusinessValidationFailedException(executedcontext.Exception.Message); -// } -// dynamic actionResult = executedcontext.Result; - -// //此处审计只涉及到添加更新和删除, 统一了相关接口的返回结果,才能在此强制转换 -// //var result = (IResponseOutput)actionResult.Value; - -// var result = (IResponseOutput)actionResult.Value; - - -// switch (_attr._auditType) -// { -// //项目审计 -// case AuditType.TrialAudit: - -// switch (_attr._auditOptType) -// { -// //项目的添加和更新接口 -// case AuditOptType.AddOrUpdateTrial: - -// //接口参数 -// var trialInfo = (TrialCommand)_actionArguments.Values.ToList()[0]; - -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// //判断是添加还是更新 -// TrialId = trialInfo.Id == null ? Guid.Parse(result.Data) : trialInfo.Id.Value, -// SubjectId = Guid.Empty, -// AuditType = (int)AuditType.TrialAudit, -// Note = trialInfo.Id == null ? $"{ _userRealName} 添加了项目 {trialInfo.TrialCode} " : $"{ _userRealName} 更新了项目 {trialInfo.TrialCode} 基本信息 ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; -// //添加项目运维人员 -// case AuditOptType.AddTrialStaff: - -// //接口参数 -// var trialUsers = (TrialUserAddCommand[])_actionArguments.Values.ToList()[0]; - -// if (result.IsSuccess) -// { - -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = trialUsers[0].TrialId, -// SubjectId = Guid.Empty, -// AuditType = (int)AuditType.TrialAudit, -// //Note = $"{ _userRealName} 添加了项目运维人员 {string.Join(',', trialUsers.Select(t => t.UserRealName).ToList())} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; - -// //添加研究中心 -// case AuditOptType.AddTrialSite: -// //接口参数 -// var trialSites = (List)_actionArguments.Values.ToList()[0]; - -// if (result.IsSuccess) -// { -// //查询site信息 -// var siteIds = trialSites.Select(t => t.SiteId).ToList(); -// var _siteRepository = (IRepository)executedcontext.HttpContext.RequestServices.GetService(typeof(IRepository)); -// var siteNames = _siteRepository.Where(t => siteIds.Contains(t.Id)).Select(u => u.SiteName); - -// _auditRepository.Add(new TrialAudit() -// { -// //判断是添加还是更新 -// TrialId = trialSites[0].TrialId, -// SubjectId = Guid.Empty, -// AuditType = (int)AuditType.TrialAudit, -// Note = $"{ _userRealName} 添加了项目研究中心 {string.Join(',', siteNames)} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; - -// //研究中心添加运维人员 -// case AuditOptType.AddTrialSiteCRC: -// //接口参数 -// var trialSiteCRCs = (List)_actionArguments.Values.ToList()[0]; - -// if (result.IsSuccess) -// { -// //查询site信息 -// var _siteRepository = (IRepository)executedcontext.HttpContext.RequestServices.GetService(typeof(IRepository)); -// var siteName = _siteRepository.FirstOrDefault(t => t.Id == trialSiteCRCs[0].SiteId).IfNullThrowException().SiteName; - -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = trialSiteCRCs[0].TrialId, -// SubjectId = Guid.Empty, -// AuditType = (int)AuditType.TrialAudit, -// Note = $"{ _userRealName} 为{ siteName } 添加了运维人员 {string.Join(',', trialSiteCRCs.Select(t => t.UserRealName).ToList())}", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; - -// //删除项目运维人员 -// case AuditOptType.DeleteTrailStaff: - -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = _userTrial.TrialId, -// SubjectId = Guid.Empty, -// AuditType = (int)AuditType.TrialAudit, -// Note = $"{ _userRealName} 移除了项目参与人员 {_userTrial.User.LastName + " / " + _userTrial.User.FirstName} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; -// //删除项目site -// case AuditOptType.DeleteTrialSite: - -// if (result.IsSuccess) -// { -// //查询site信息 -// var _siteRepository = (IRepository)executedcontext.HttpContext.RequestServices.GetService(typeof(IRepository)); -// var siteName = _siteRepository.FirstOrDefault(t => t.Id == _trialSite.SiteId).IfNullThrowException().SiteName; - -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = _trialSite.TrialId, -// SubjectId = Guid.Empty, -// AuditType = (int)AuditType.TrialAudit, -// Note = $"{ _userRealName} 移除了研究中心 {siteName} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; -// //删除项目Site CRC -// case AuditOptType.DeleteTrialSiteCRC: - -// if (result.IsSuccess) -// { -// //查询site信息 -// var _siteRepository = (IRepository)executedcontext.HttpContext.RequestServices.GetService(typeof(IRepository)); -// var siteName = _siteRepository.FirstOrDefault(t => t.Id == _userTrialSite.SiteId).IfNullThrowException().SiteName; - -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = _userTrialSite.TrialId, -// SubjectId = Guid.Empty, -// AuditType = (int)AuditType.TrialAudit, -// Note = $"{ _userRealName} 移除了 {siteName} 的运维人员 {_userTrialSite.User.UserName} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } -// break; - -// //添加访视计划Item -// case AuditOptType.AddOrUpdateTrialVisitPlanItem: -// //接口参数 -// var visitPlanItem = (VisitPlanCommand)_actionArguments.Values.ToList()[0]; - -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = visitPlanItem.TrialId, -// SubjectId = Guid.Empty, -// AuditType = (int)AuditType.TrialAudit, -// Note = visitPlanItem.Id == null ? $"{ _userRealName} 添加了访视计划项 {visitPlanItem.VisitName} " : $"{ _userRealName} 更新了访视计划项为 {visitPlanItem.VisitName} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; -// //删除访视计划Item -// case AuditOptType.DeleteTrialVisitPlanItem: - -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = _visitPlan.TrialId, -// SubjectId = Guid.Empty, -// AuditType = (int)AuditType.TrialAudit, -// Note = $"{ _userRealName} 移除了访视计划项 {_visitPlan.VisitName} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } -// break; - -// //确认了访视计划 -// case AuditOptType.ConfirmTrialVisitPlan: -// var trialId = (Guid)_actionArguments.Values.ToList()[0]; - -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = trialId, -// SubjectId = Guid.Empty, -// AuditType = (int)AuditType.TrialAudit, -// Note = $"{ _userRealName} 确认了访视计划,不允许修改 ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; -// //添加了QA模板 -// case AuditOptType.AddOrUpdateTrialTemplate: -// //接口参数 - -// if (result.IsSuccess) -// { - -// } - - -// break; -// //删除项目模板 -// case AuditOptType.DeleteTrialTemplate: - -// if (result.IsSuccess) -// { - -// } -// break; - -// } - -// break; -// //受试者审计 -// case AuditType.SubjectAudit: - - -// switch (_attr._auditOptType) -// { -// // 添加或者更新受试者 -// case AuditOptType.AddOrUpdateSubject: - -// //接口参数 -// var subject = (SubjectCommand)_actionArguments.Values.ToList()[0]; - -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = subject.TrialId, -// SubjectId = subject.Id == null ? Guid.Parse(result.Data) : subject.Id.Value, -// AuditType = (int)AuditType.SubjectAudit, -// Note = subject.Id == null ? $"{ _userRealName} 添加了受试者 {subject.ShortName } 并初始化了访视计划" : $"{ _userRealName} 对受试者 { subject.ShortName } 信息进行了更新 ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; -// // 删除受试者 -// case AuditOptType.DeleteSubject: -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = _subject.TrialId, -// SubjectId = _subject.Id, -// AuditType = (int)AuditType.SubjectAudit, -// Note = $"{ _userRealName} 移除了受试者 {_subject.LastName + _subject.FirstName} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; -// // 受试者计划外访视 -// case AuditOptType.AddOrUpdateSubjectOutPlanVisit: - -// //接口参数 -// var subjectVisit = (SubjectVisitCommand)_actionArguments.Values.ToList()[0]; - -// if (result.IsSuccess) -// { -// var _subjectRepository = -// (IRepository)executedcontext.HttpContext.RequestServices.GetService( -// typeof(IRepository)); - -// _subject = _subjectRepository.FirstOrDefault(t => t.Id == subjectVisit.SubjectId).IfNullThrowException(); - -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = _subject.TrialId, -// SubjectId = _subject.Id, -// AuditType = (int)AuditType.SubjectAudit, -// Note = subjectVisit.Id == null ? $"{ _userRealName} 为受试者 {_subject.LastName + _subject.FirstName} 添加了计划外访视 {subjectVisit.VisitName}" : $"{ _userRealName} 更新受试者 {_subject.LastName + _subject.FirstName} 计划外访视{subjectVisit.VisitName}", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; -// // 删除计划外访视 -// case AuditOptType.DeleteSubjectOutPlanVisit: - -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = _subjectVisit.TrialId, -// SubjectId = _subject.Id, -// AuditType = (int)AuditType.SubjectAudit, -// Note = $"{ _userRealName} 移除了受试者{_subject.LastName + _subject.FirstName} 计划外访视 {_subjectVisit.VisitName} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; -// // 人工设置已执行 -// case AuditOptType.SetSVExecuted: - -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = _subjectVisit.TrialId, -// SubjectId = _subject.Id, -// AuditType = (int)AuditType.SubjectAudit, -// Note = $"{ _userRealName} 将受试者 {_subject.LastName + _subject.FirstName} 访视 {_subjectVisit.VisitName} 设置为已执行 ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - - -// break; -// } - -// break; - -// //检查审计 -// case AuditType.StudyAudit: -// _studyRepository = -// (IRepository)executedcontext.HttpContext.RequestServices.GetService( -// typeof(IRepository)); - -// switch (_attr._auditOptType) -// { - -// case AuditOptType.ChangeStudyStatus: - -// //接口参数 -// var studyStatusInfo = (StudyStatusDetailCommand)_actionArguments.Values.ToList()[0]; - -// _study = _studyRepository.FirstOrDefault(t => t.Id == studyStatusInfo.StudyId).IfNullThrowException(); - -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = _study.TrialId, -// SubjectId = _study.SubjectId, -// StudyId = _study.Id, -// AuditType = (int)AuditType.StudyAudit, -// Note = $"{ _userRealName} 动作变更了 { _study.StudyCode} 检查状态为 {DealStudyStatus(_study.Status)} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - -// break; - -// case AuditOptType.Anonymized: - -// case AuditOptType.Forwarded: - -// //接口参数 -// var studyId = (Guid)_actionArguments.Values.ToList()[0]; - -// _study = _studyRepository.FirstOrDefault(t => t.Id == studyId).IfNullThrowException(); - -// if (result.IsSuccess) -// { -// _auditRepository.Add(new TrialAudit() -// { -// TrialId = _study.TrialId, -// SubjectId = _study.SubjectId, -// StudyId = _study.Id, -// AuditType = (int)AuditType.StudyAudit, -// Note = $"{ _userRealName} 动作变更了 { _study.StudyCode} 检查状态为 {DealStudyStatus(_study.Status)} ", -// Detail = string.Empty, -// OptUserId = Guid.Parse(_userIdStr), -// OptUser = _userRealName, -// OptTime = DateTime.Now -// }); -// } - - -// break; -// } - -// break; - -// } - -// _auditRepository.SaveChanges(); - -// #endregion - - -// //提交事务 Commit transaction if all commands succeed, transaction will auto-rollback when disposed if either commands fails -// transaction.Commit(); -// } -// ); - - - - - - - - - -// } -// } -//} - - - - diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml index a6823ddca..d521a226a 100644 --- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml +++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml @@ -11042,7 +11042,7 @@ 构造函数注入 - + 构造函数注入 diff --git a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs index ed67989ba..826a94852 100644 --- a/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs +++ b/IRaCIS.Core.Application/Service/TrialSiteUser/TrialSiteService.cs @@ -348,7 +348,6 @@ namespace IRaCIS.Core.Application.Services /// 删除 项目 下某一site [HttpDelete("{id:guid}/{trialId:guid}")] - [TrialAudit(AuditType.TrialAudit, AuditOptType.DeleteTrialSite)] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] [Obsolete] public async Task DeleteTrialSite(Guid id) diff --git a/IRaCIS.Core.Application/Service/Visit/SubjectService.cs b/IRaCIS.Core.Application/Service/Visit/SubjectService.cs index aa51292bb..cacda9104 100644 --- a/IRaCIS.Core.Application/Service/Visit/SubjectService.cs +++ b/IRaCIS.Core.Application/Service/Visit/SubjectService.cs @@ -26,7 +26,6 @@ namespace IRaCIS.Application.Services /// state:1-访视中,2-出组。0-全部 /// - [TrialAudit(AuditType.SubjectAudit, AuditOptType.AddOrUpdateSubject)] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] //[Authorize(Policy = IRaCISPolicy.PM_APM_CRC_QC)] public async Task> AddOrUpdateSubject([FromBody] SubjectCommand subjectCommand)