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);
}