using Admin.NET.Plugin.AiDOP.Entity; using Admin.NET.Plugin.ApprovalFlow; namespace Admin.NET.Plugin.AiDOP.Infrastructure; /// /// 智慧诊断改善计划正式审批规则:按问题严重度/跨部门选择节点,审批人只认角色编码。 /// public static class SmartOpsImprovementApprovalRules { public const string DeptHeadRole = "SMART_OPS_DEPT_HEAD"; public const string ModuleOwnerRole = "SMART_OPS_MODULE_OWNER"; public const string OpsOwnerRole = "SMART_OPS_OPS_OWNER"; public const string RouteYellow = "yellow"; public const string RouteRed = "red"; public const string RouteGlobal = "global"; public static readonly (string Code, string Name, int OrderNo)[] BaselineRoles = { (DeptHeadRole, "责任部门负责人", 910), (ModuleOwnerRole, "模块负责人", 911), (OpsOwnerRole, "运营负责人", 912), }; public static string RoleName(string code) => BaselineRoles.FirstOrDefault(x => x.Code == code).Name ?? code; public static string NormalizeSeverity(string? raw) { var value = (raw ?? "").Trim().ToLowerInvariant(); return value == "red" ? "red" : "yellow"; } public static bool IsCrossDept(string? moduleCode, bool isCrossDept, string? problemDept) { if (isCrossDept) return true; if (string.Equals(moduleCode?.Trim(), "S9", StringComparison.OrdinalIgnoreCase)) return true; var dept = problemDept ?? ""; return dept.Contains("跨部门", StringComparison.Ordinal) || dept.Contains("跨部门", StringComparison.OrdinalIgnoreCase); } public static string ResolveRoute(string? moduleCode, string? severity, bool isCrossDept, string? problemDept = null) { if (IsCrossDept(moduleCode, isCrossDept, problemDept)) return RouteGlobal; return NormalizeSeverity(severity) == "red" ? RouteRed : RouteYellow; } public static string ResolveRoute(AdoSmartOpsImprovementPlan plan) => ResolveRoute(plan.ModuleCode, plan.ProblemSeverity, plan.IsCrossDept, plan.ProblemDept); public static IReadOnlyList RequiredRoleCodes(string route) => route switch { RouteYellow => new[] { DeptHeadRole }, RouteRed => new[] { DeptHeadRole, OpsOwnerRole }, _ => new[] { DeptHeadRole, ModuleOwnerRole, OpsOwnerRole }, }; public static string MapCompletedStatus(FlowInstanceStatusEnum finalStatus) => finalStatus == FlowInstanceStatusEnum.Approved ? "approved" : "draft"; public static bool IsLegacyInitiatorFallback(string? flowJson) => !string.IsNullOrWhiteSpace(flowJson) && flowJson.Contains("Initiator", StringComparison.Ordinal) && !flowJson.Contains(DeptHeadRole, StringComparison.Ordinal); }