KpiSemanticDependency.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. namespace Admin.NET.Plugin.AiDOP.SmartOps;
  2. /// <summary>
  3. /// 指标 → 依赖语义。内容即任务书附录 F。「无」表示不依赖字段类或对象类语义。
  4. /// </summary>
  5. public static class KpiSemanticDependency
  6. {
  7. public const string None = "无";
  8. private static readonly Dictionary<string, string[]> Map = Build();
  9. public static IReadOnlyList<string> For(string metricCode) =>
  10. Map.TryGetValue(metricCode, out var deps) ? deps : [None];
  11. public static bool Contains(string metricCode) => Map.ContainsKey(metricCode);
  12. public static IEnumerable<string> Codes => Map.Keys;
  13. public static IReadOnlyList<string> DistinctSemantics() =>
  14. Map.Values.SelectMany(v => v).Where(v => v != None).Distinct(StringComparer.Ordinal).OrderBy(v => v, StringComparer.Ordinal).ToArray();
  15. private static Dictionary<string, string[]> Build()
  16. {
  17. var map = new Dictionary<string, string[]>(StringComparer.Ordinal);
  18. void Set(string code, params string[] deps) => map[code] = deps;
  19. void NoneOf(params string[] codes)
  20. {
  21. foreach (var code in codes)
  22. map[code] = [None];
  23. }
  24. NoneOf("S5_L1_001", "S5_L1_003");
  25. Set("S5_L1_002", "S6_REPORT");
  26. Set("S5_L1_004", "INV_BAL_AMOUNT");
  27. NoneOf("S5_L2_001", "S5_L2_002", "S5_L2_003", "S5_L2_004");
  28. Set("S5_L2_005", "INV_LOCATION", "INV_LOT");
  29. Set("S5_L2_006", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
  30. Set("S5_L2_007", "INV_LOCATION", "INV_END_BALANCE");
  31. Set("S5_L2_008", "INV_LOCATION", "INV_LOT");
  32. Set("S5_L2_009", "INV_LOCATION");
  33. Set("S5_L2_010", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
  34. Set("S5_L2_011", "INV_LOCATION", "INV_END_BALANCE");
  35. Set("S5_L2_012", "INV_LOCATION", "INV_LOT");
  36. Set("S5_L2_013", "INV_LOCATION");
  37. Set("S5_L2_014", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
  38. Set("S5_L2_015", "INV_LOCATION", "INV_END_BALANCE");
  39. // INV_LOCATION*:库位缺失时仍可由源事务码得到部分数据,不作为不支持判定。
  40. Set("S5_L3_001", "INV_LOT", "INV_CREATE_USER");
  41. Set("S5_L3_002", "INV_END_BALANCE");
  42. Set("S5_L3_003", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
  43. Set("S5_L3_004", "INV_LOCATION", "INV_END_BALANCE");
  44. Set("S5_L3_005", "INV_LOCATION");
  45. NoneOf("S6_L1_001", "S6_L1_002", "S6_L1_003", "S6_L2_001", "S6_L2_002", "S6_L2_004");
  46. Set("S6_L2_003", "DOC_QTY_CLOSE");
  47. 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");
  48. Set("S7_L1_001", "FQC");
  49. NoneOf("S7_L1_002", "S7_L1_003", "S7_L2_001", "S7_L2_002", "S7_L2_003");
  50. Set("S7_L2_004", "INV_LOCATION", "INV_END_BALANCE");
  51. Set("S7_L2_005", "INV_LOCATION", "INV_LOT");
  52. Set("S7_L2_006", "INV_LOCATION");
  53. Set("S7_L2_007", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
  54. Set("S7_L2_008", "INV_LOCATION", "INV_END_BALANCE");
  55. Set("S7_L2_009", "INV_LOCATION", "INV_LOT");
  56. Set("S7_L2_010", "INV_LOCATION");
  57. Set("S7_L2_011", "INV_LOCATION", "INV_LOT", "INV_CREATE_USER");
  58. Set("S7_L2_012", "INV_LOCATION", "INV_END_BALANCE");
  59. Set("S7_L2_013", "FG_RECEIPT_TIME", "INV_LOT");
  60. NoneOf("S7_L2_014");
  61. Set("S7_L2_015", "INV_LOT", "INV_CREATE_USER");
  62. Set("S7_L2_016", "FG_RECEIPT_TIME", "INV_END_BALANCE");
  63. NoneOf("S9_L1_001", "S9_L1_003", "S9_L1_004", "S9_L1_005");
  64. Set("S9_L1_002", "FQC");
  65. return map;
  66. }
  67. }