SmartOpsImprovementApprovalRules.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using Admin.NET.Plugin.AiDOP.Entity;
  2. using Admin.NET.Plugin.ApprovalFlow;
  3. namespace Admin.NET.Plugin.AiDOP.Infrastructure;
  4. /// <summary>
  5. /// 智慧诊断改善计划正式审批规则:按问题严重度/跨部门选择节点,审批人只认角色编码。
  6. /// </summary>
  7. public static class SmartOpsImprovementApprovalRules
  8. {
  9. public const string DeptHeadRole = "SMART_OPS_DEPT_HEAD";
  10. public const string ModuleOwnerRole = "SMART_OPS_MODULE_OWNER";
  11. public const string OpsOwnerRole = "SMART_OPS_OPS_OWNER";
  12. public const string RouteYellow = "yellow";
  13. public const string RouteRed = "red";
  14. public const string RouteGlobal = "global";
  15. public static readonly (string Code, string Name, int OrderNo)[] BaselineRoles =
  16. {
  17. (DeptHeadRole, "责任部门负责人", 910),
  18. (ModuleOwnerRole, "模块负责人", 911),
  19. (OpsOwnerRole, "运营负责人", 912),
  20. };
  21. public static string RoleName(string code) =>
  22. BaselineRoles.FirstOrDefault(x => x.Code == code).Name ?? code;
  23. public static string NormalizeSeverity(string? raw)
  24. {
  25. var value = (raw ?? "").Trim().ToLowerInvariant();
  26. return value == "red" ? "red" : "yellow";
  27. }
  28. public static bool IsCrossDept(string? moduleCode, bool isCrossDept, string? problemDept)
  29. {
  30. if (isCrossDept) return true;
  31. if (string.Equals(moduleCode?.Trim(), "S9", StringComparison.OrdinalIgnoreCase)) return true;
  32. var dept = problemDept ?? "";
  33. return dept.Contains("跨部门", StringComparison.Ordinal) || dept.Contains("跨部门", StringComparison.OrdinalIgnoreCase);
  34. }
  35. public static string ResolveRoute(string? moduleCode, string? severity, bool isCrossDept, string? problemDept = null)
  36. {
  37. if (IsCrossDept(moduleCode, isCrossDept, problemDept)) return RouteGlobal;
  38. return NormalizeSeverity(severity) == "red" ? RouteRed : RouteYellow;
  39. }
  40. public static string ResolveRoute(AdoSmartOpsImprovementPlan plan) =>
  41. ResolveRoute(plan.ModuleCode, plan.ProblemSeverity, plan.IsCrossDept, plan.ProblemDept);
  42. public static IReadOnlyList<string> RequiredRoleCodes(string route) =>
  43. route switch
  44. {
  45. RouteYellow => new[] { DeptHeadRole },
  46. RouteRed => new[] { DeptHeadRole, OpsOwnerRole },
  47. _ => new[] { DeptHeadRole, ModuleOwnerRole, OpsOwnerRole },
  48. };
  49. public static string MapCompletedStatus(FlowInstanceStatusEnum finalStatus) =>
  50. finalStatus == FlowInstanceStatusEnum.Approved ? "approved" : "draft";
  51. public static bool IsLegacyInitiatorFallback(string? flowJson) =>
  52. !string.IsNullOrWhiteSpace(flowJson)
  53. && flowJson.Contains("Initiator", StringComparison.Ordinal)
  54. && !flowJson.Contains(DeptHeadRole, StringComparison.Ordinal);
  55. }