| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- using Microsoft.AspNetCore.Http;
- using Microsoft.Extensions.Options;
- namespace Admin.NET.Plugin.ApprovalFlow.Service;
- /// <summary>
- /// 审批流审计服务 — 仅做请求审计日志,不用于核心审批推进
- /// </summary>
- public class SysApprovalService : ITransient
- {
- private readonly SqlSugarRepository<ApprovalFlowRecord> _approvalFlowRep;
- private readonly SqlSugarRepository<ApprovalFormRecord> _approvalFormRep;
- private readonly ApprovalFlowService _approvalFlowService;
- private static List<string>? _cachedRoutes;
- private static DateTime _cacheTime = DateTime.MinValue;
- private static readonly TimeSpan CacheDuration = TimeSpan.FromMinutes(5);
- public SysApprovalService(
- SqlSugarRepository<ApprovalFlowRecord> approvalFlowRep,
- SqlSugarRepository<ApprovalFormRecord> approvalFormRep,
- ApprovalFlowService approvalFlowService)
- {
- _approvalFlowRep = approvalFlowRep;
- _approvalFormRep = approvalFormRep;
- _approvalFlowService = approvalFlowService;
- }
- /// <summary>
- /// 匹配审批流程(审计模式 — 仅记录,不阻断)
- /// </summary>
- [NonAction]
- public async Task MatchApproval(HttpContext context)
- {
- var path = context.Request.Path.ToString();
- var segments = path.Split('/', StringSplitOptions.RemoveEmptyEntries);
- if (segments.Length < 3 || !segments[0].Equals("api", StringComparison.OrdinalIgnoreCase))
- return;
- var funcName = segments[1];
- var typeName = segments[2];
- var routes = await GetCachedRoutes();
- if (!routes.Any(r =>
- {
- var parts = r.Split('/');
- return parts.Length >= 2
- && parts[0].Equals(funcName, StringComparison.OrdinalIgnoreCase)
- && parts[1].Equals(typeName, StringComparison.OrdinalIgnoreCase);
- }))
- return;
- var approvalFlow = new ApprovalFlowRecord
- {
- FormName = funcName,
- CreateTime = DateTime.Now,
- };
- await _approvalFlowRep.InsertAsync(approvalFlow);
- var approvalForm = new ApprovalFormRecord
- {
- FlowId = approvalFlow.Id,
- FormName = funcName,
- FormType = typeName,
- CreateTime = DateTime.Now,
- };
- await _approvalFormRep.InsertAsync(approvalForm);
- }
- /// <summary>
- /// 带缓存的路由列表,避免每个请求都查数据库 (B1 fix)
- /// </summary>
- private async Task<List<string>> GetCachedRoutes()
- {
- if (_cachedRoutes != null && DateTime.Now - _cacheTime < CacheDuration)
- return _cachedRoutes;
- _cachedRoutes = await _approvalFlowService.FormRoutes();
- _cacheTime = DateTime.Now;
- return _cachedRoutes;
- }
- /// <summary>
- /// 清除路由缓存(发布/更新流程时调用)
- /// </summary>
- [NonAction]
- public static void InvalidateRouteCache()
- {
- _cachedRoutes = null;
- }
- }
|