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