namespace Admin.NET.Plugin.AiDOP.SmartOps;
///
/// 指标 → 依赖语义。内容即任务书附录 F。「无」表示不依赖字段类或对象类语义。
///
public static class KpiSemanticDependency
{
public const string None = "无";
private static readonly Dictionary Map = Build();
public static IReadOnlyList For(string metricCode) =>
Map.TryGetValue(metricCode, out var deps) ? deps : [None];
public static bool Contains(string metricCode) => Map.ContainsKey(metricCode);
public static IEnumerable Codes => Map.Keys;
public static IReadOnlyList DistinctSemantics() =>
Map.Values.SelectMany(v => v).Where(v => v != None).Distinct(StringComparer.Ordinal).OrderBy(v => v, StringComparer.Ordinal).ToArray();
private static Dictionary Build()
{
var map = new Dictionary(StringComparer.Ordinal);
void Set(string code, params string[] deps) => map[code] = deps;
void NoneOf(params string[] codes)
{
foreach (var code in codes)
map[code] = [None];
}
NoneOf("S5_L1_001", "S5_L1_003");
Set("S5_L1_002", "S6_REPORT");
Set("S5_L1_004", "INV_BAL_AMOUNT");
NoneOf("S5_L2_001", "S5_L2_002", "S5_L2_003", "S5_L2_004");
Set("S5_L2_005", "INV_LOCATION", "INV_LOT");
Set("S5_L2_006", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
Set("S5_L2_007", "INV_LOCATION", "INV_END_BALANCE");
Set("S5_L2_008", "INV_LOCATION", "INV_LOT");
Set("S5_L2_009", "INV_LOCATION");
Set("S5_L2_010", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
Set("S5_L2_011", "INV_LOCATION", "INV_END_BALANCE");
Set("S5_L2_012", "INV_LOCATION", "INV_LOT");
Set("S5_L2_013", "INV_LOCATION");
Set("S5_L2_014", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
Set("S5_L2_015", "INV_LOCATION", "INV_END_BALANCE");
// INV_LOCATION*:库位缺失时仍可由源事务码得到部分数据,不作为不支持判定。
Set("S5_L3_001", "INV_LOT", "INV_CREATE_USER");
Set("S5_L3_002", "INV_END_BALANCE");
Set("S5_L3_003", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
Set("S5_L3_004", "INV_LOCATION", "INV_END_BALANCE");
Set("S5_L3_005", "INV_LOCATION");
NoneOf("S6_L1_001", "S6_L1_002", "S6_L1_003", "S6_L2_001", "S6_L2_002", "S6_L2_004");
Set("S6_L2_003", "DOC_QTY_CLOSE");
NoneOf("S6_L3_001", "S6_L3_002", "S6_L3_003", "S6_L3_004", "S6_L3_005", "S6_L3_006", "S6_L3_007", "S6_L3_008");
Set("S7_L1_001", "FQC");
NoneOf("S7_L1_002", "S7_L1_003", "S7_L2_001", "S7_L2_002", "S7_L2_003");
Set("S7_L2_004", "INV_LOCATION", "INV_END_BALANCE");
Set("S7_L2_005", "INV_LOCATION", "INV_LOT");
Set("S7_L2_006", "INV_LOCATION");
Set("S7_L2_007", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
Set("S7_L2_008", "INV_LOCATION", "INV_END_BALANCE");
Set("S7_L2_009", "INV_LOCATION", "INV_LOT");
Set("S7_L2_010", "INV_LOCATION");
Set("S7_L2_011", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
Set("S7_L2_012", "INV_LOCATION", "INV_END_BALANCE");
Set("S7_L2_013", "FG_RECEIPT_TIME", "INV_LOT");
NoneOf("S7_L2_014");
Set("S7_L2_015", "INV_LOT", "INV_CREATE_USER");
Set("S7_L2_016", "FG_RECEIPT_TIME", "INV_END_BALANCE");
NoneOf("S9_L1_001", "S9_L1_003", "S9_L1_004", "S9_L1_005");
Set("S9_L1_002", "FQC");
return map;
}
}