diff --git a/IRaCIS.Core.Application/BusinessFilter/LegacyController/TrialResourceFilter.cs b/IRaCIS.Core.Application/BusinessFilter/LegacyController/TrialResourceFilter.cs
deleted file mode 100644
index d05790c3c..000000000
--- a/IRaCIS.Core.Application/BusinessFilter/LegacyController/TrialResourceFilter.cs
+++ /dev/null
@@ -1,196 +0,0 @@
-using IRaCIS.Core.Application.Helper;
-using IRaCIS.Core.Domain.Share;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Filters;
-using Microsoft.Extensions.Localization;
-using System.Text.RegularExpressions;
-using ZiggyCreatures.Caching.Fusion;
-using static IRaCIS.Core.Domain.Share.StaticData;
-
-namespace IRaCIS.Core.Application.Filter;
-
-///
-/// 主要为了 处理项目结束 锁库,不允许操作
-///
-public class TrialResourceFilter : Attribute, IAsyncResourceFilter
-{
- private readonly IUserInfo _userInfo;
- private readonly IFusionCache _fusionCache;
- public IStringLocalizer _localizer;
- private readonly IRepository _trialRepository;
- private readonly List _trialOptList = new List();
-
-
- public TrialResourceFilter(IFusionCache fusionCache, IRepository trialRepository, IStringLocalizer localizer, IUserInfo userInfo, string trialOpt = null, string trialOpt2 = null, string trialOpt3 = null)
- {
- _fusionCache = fusionCache;
- _userInfo = userInfo;
- _localizer = localizer;
- _trialRepository = trialRepository;
-
- if (!string.IsNullOrWhiteSpace(trialOpt)) _trialOptList.Add(trialOpt.Trim());
- if (!string.IsNullOrWhiteSpace(trialOpt2)) _trialOptList.Add(trialOpt2.Trim());
- if (!string.IsNullOrWhiteSpace(trialOpt3)) _trialOptList.Add(trialOpt3.Trim());
-
- }
-
- //优先选择异步的方法
- public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
- {
- // var typeFilter = context.ActionDescriptor.EndpointMetadata.Where(t => t.GetType() == typeof(TypeFilterAttribute)).Select(t => (TypeFilterAttribute)t).ToList().FirstOrDefault();
- //var _trialOptList= typeFilter.Arguments.Select(t => t.ToString()).ToList();
-
- // 获取当前请求的 Host 信息
- var requestHost = context.HttpContext.Request.Host;
-
- // 检查请求是否来自 localhost:6100
- if (requestHost.Host == "localhost" && (requestHost.Port == 6100|| requestHost.Port==3305))
- {
- await next.Invoke();
-
- return;
- }
-
- #region 处理新的用户类型,不能操作项目相关接口
-
- // 后期列举出具体的类型,其他任何用户类型,都不允许操作
- if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA && _userInfo.RequestUrl.ToLower() != "TrialDocument/userConfirm".ToLower())
- {
- //---对不起,您的账户没有操作权限。
- context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_NoAccessPermission"]));
-
- return;
- }
-
- #endregion
-
-
-
- //TrialId 传递的途径多种,可能在path 可能在body 可能在数组中,也可能在对象中,可能就在url
- var trialIdStr = string.Empty;
-
- if (!string.IsNullOrWhiteSpace(context.HttpContext.Request.Query["trialId"]))
- {
- trialIdStr = context.HttpContext.Request.Query["trialId"];
- }
-
- //先尝试从path中取TrialId
- else if (context.RouteData.Values.Keys.Any(t => t.Contains("trialId")))
- {
- var index = context.RouteData.Values.Keys.ToList().IndexOf("trialId");
- trialIdStr = context.RouteData.Values.Values.ToList()[index] as string;
- }
- else if (context.HttpContext.Request.Headers["Referer"].ToString().Contains("trialId"))
- {
- var headerStr = context.HttpContext.Request.Headers["Referer"].ToString();
-
- var trialIdIndex = headerStr.IndexOf("trialId");
-
-
- var matchResult = Regex.Match(headerStr.Substring(trialIdIndex), @"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}");
-
- if (matchResult.Success)
- {
- trialIdStr = matchResult.Value;
- }
- else
- {
- //---正则取请求Refer 中trialId 失败,请联系开发人员核查
- context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_ReferTrialIdFailed"]));
- }
-
- }
- else
- {
- #region body 中取数据
-
- //设置可以多次读
- context.HttpContext.Request.EnableBuffering();
- var reader = new StreamReader(context.HttpContext.Request.Body);
- var contentFromBody = await reader.ReadToEndAsync();
- //读取后,流的位置还原
- context.HttpContext.Request.Body.Seek(0, SeekOrigin.Begin);
- //context.HttpContext.Request.Body.Position = 0;
-
- //找到参数位置在字符串中的索引
- var trialIdIndex = contentFromBody.IndexOf("\"TrialId\"", StringComparison.OrdinalIgnoreCase);
-
- if (trialIdIndex > -1)
- {
- // (?<="trialId" *: *").*?(?=",)
-
- //使用正则 [0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}
-
- var matchResult = Regex.Match(contentFromBody.Substring(trialIdIndex), @"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}");
-
- if (matchResult.Success)
- {
- //有可能匹配错误 "trialId":"","documentId":"b8180000-3e2c-0016-9fe0-08da33f96236" 从缓存里面验证下
-
- trialIdStr = matchResult.Value;
-
- var trialStatusStr = await _fusionCache.GetOrSetAsync(CacheKeys.Trial(trialIdStr), _ => CacheHelper.GetTrialStatusAsync(Guid.Parse(trialIdStr), _trialRepository), TimeSpan.FromDays(7));
-
- if (string.IsNullOrWhiteSpace(trialStatusStr))
- {
-
- //数据库 检查该项目Id不对
- context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_ReferTrialIdFailed"]));
-
- return;
- }
- }
- else
- {
- //---正则取请求Refer 中trialId 失败,请联系开发人员核查
- context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_ReferTrialIdFailed"]));
-
- return;
- }
-
- //使用字符串取 如果是swagger 可能有时取的不对 因为空格的原因
- //trialIdStr = contentFromBody.Substring(trialIdIndex + "TrialId".Length + 4, 3
- }
-
- #endregion
- }
-
- //通过path 或者body 找到trialId 了
- if (!string.IsNullOrWhiteSpace(trialIdStr))
- {
- var trialStatusStr = await _fusionCache.GetOrSetAsync(CacheKeys.Trial(trialIdStr), _ => CacheHelper.GetTrialStatusAsync(Guid.Parse(trialIdStr), _trialRepository), TimeSpan.FromDays(7));
-
- // 这里是统一拦截 项目有关的操作允许情况(特殊的地方,比如项目配置(有的在多种状态(初始化,ongoing)都可以操作,有的仅仅在Initializing)还有 项目添加和更新,不走这里,特殊处理,不然在这里显得很乱,判断是哪个接口)
- if (trialStatusStr == StaticData.TrialState.TrialOngoing || _trialOptList.Any(t => t == TrialOpt.BeforeOngoingCantOpt))
- {
-
- await next.Invoke();
-
- }
- // 项目停止、或者完成 不允许操作
- else
- {
- //---本次请求被配置规则拦截:项目状态处于进行中时,才允许操作,若此处逻辑有误,请联系开发人员修改
- context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_InterceptedProjectStatusRule"]));
-
- }
-
- }
- //添加项目 签名系统文档的时候 不做拦截 但是更新项目 签名项目文档的时候需要拦截
- else if (_trialOptList.Any(t => t == TrialOpt.AddOrUpdateTrial || t == TrialOpt.SignSystemDocNoTrialId))
- {
- await next.Invoke();
- }
-
- else
- {
- //如果项目相关接口没有传递trialId 会来到这里,提醒,以便修改
-
- //---该接口参数中,没有传递项目编号,请核对。
- context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_MissingProjectNumber"]));
- }
-
-
- }
-}
diff --git a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
index ec3b62da9..4a9ef91de 100644
--- a/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
+++ b/IRaCIS.Core.Application/IRaCIS.Core.Application.xml
@@ -13038,11 +13038,6 @@
参考处理链接: https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/error-handling?view=aspnetcore-8.0
-
-
- 主要为了 处理项目结束 锁库,不允许操作
-
-
用户登录错误 限制登录
diff --git a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicineQuestionService.cs b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicineQuestionService.cs
index 05a21b55a..9eb7ead4c 100644
--- a/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicineQuestionService.cs
+++ b/IRaCIS.Core.Application/Service/Reading/MedicalAudit/ReadingMedicineQuestionService.cs
@@ -244,7 +244,7 @@ namespace IRaCIS.Core.Application.Service
///
///
[HttpPost]
- [TypeFilter(typeof(TrialResourceFilter))]
+ [TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task AddOrUpdateReadingMedicineTrialQuestion(ReadingMedicineTrialQuestionAddOrEdit inDto)
{
var existsQuery = _readingMedicineTrialQuestionRepository