SmartOpsImprovementApproverGuard.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. using Admin.NET.Core;
  2. using Admin.NET.Plugin.AiDOP.Entity;
  3. using Admin.NET.Plugin.AiDOP.Infrastructure;
  4. namespace Admin.NET.Plugin.AiDOP.SmartOps;
  5. /// <summary>
  6. /// 提交前校验正式审批角色在当前租户可解析,禁止静默跳过。
  7. /// </summary>
  8. public sealed class SmartOpsImprovementApproverGuard : ITransient
  9. {
  10. private readonly ISqlSugarClient _db;
  11. public SmartOpsImprovementApproverGuard(ISqlSugarClient db) => _db = db;
  12. public async Task EnsureResolvableAsync(AdoSmartOpsImprovementPlan plan)
  13. {
  14. var tenantId = plan.TenantId ?? 0;
  15. SmartOpsTrustedScopeRules.EnsureBusinessTenant(tenantId);
  16. var route = SmartOpsImprovementApprovalRules.ResolveRoute(plan);
  17. var missing = new List<string>();
  18. foreach (var code in SmartOpsImprovementApprovalRules.RequiredRoleCodes(route))
  19. {
  20. var role = await _db.Queryable<SysRole>()
  21. .ClearFilter<ITenantIdFilter>()
  22. .FirstAsync(r => r.TenantId == tenantId && r.Code == code && r.Status == StatusEnum.Enable);
  23. var label = SmartOpsImprovementApprovalRules.RoleName(code);
  24. if (role == null)
  25. {
  26. missing.Add($"{label}({code})角色不存在或已停用");
  27. continue;
  28. }
  29. var userIds = await _db.Queryable<SysUserRole>()
  30. .ClearFilter()
  31. .Where(x => x.RoleId == role.Id)
  32. .Select(x => x.UserId)
  33. .ToListAsync();
  34. var hasMember = userIds.Count > 0 && await _db.Queryable<SysUser>()
  35. .ClearFilter()
  36. .AnyAsync(u => userIds.Contains(u.Id) && u.TenantId == tenantId && u.Status == StatusEnum.Enable);
  37. if (!hasMember)
  38. missing.Add($"{label}({code})没有启用成员");
  39. }
  40. if (missing.Count > 0)
  41. throw Oops.Oh("无可解析审批人,已拒绝提交:" + string.Join(";", missing));
  42. }
  43. }