| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- using Admin.NET.Plugin.AiDOP.Entity;
- using Admin.NET.Plugin.ApprovalFlow;
- namespace Admin.NET.Plugin.AiDOP.Infrastructure;
- /// <summary>
- /// 智慧诊断改善计划正式审批规则:按问题严重度/跨部门选择节点,审批人只认角色编码。
- /// </summary>
- 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<string> 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);
- }
|