MissingKpiPipelineContractTests.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using Xunit;
  2. namespace Admin.NET.Plugin.AiDOP.Tests.SmartOps;
  3. public class MissingKpiPipelineContractTests
  4. {
  5. [Fact]
  6. public void S3MaterialTurnover_UsesTenantScopedInboundAndIssueFacts()
  7. {
  8. var source = ReadSource("Supply", "S3MdpSyncTransformService.cs");
  9. Assert.Contains("MetricCode = \"S3_L1_004\"", source);
  10. Assert.Contains("h.tenant_id=@TenantId", source);
  11. Assert.Contains("h.lbs IN ('采购入库','生产领料')", source);
  12. Assert.Contains("NULLIF(SUM(issue_qty), 0)", source);
  13. Assert.Contains("GlobalRunGate.WaitAsync", source);
  14. Assert.Contains("GlobalRunGate.Release", source);
  15. }
  16. [Fact]
  17. public void S9QualityReturnRate_UsesS7BusinessTransactionsAndPpmScale()
  18. {
  19. var source = ReadSource("FinishedWarehouse", "S7MdpSyncTransformService.cs");
  20. Assert.Contains("result.MergeSub(\"S9_L1_001\"", source);
  21. Assert.Contains("h.lbs IN ('销售退货','销售出库')", source);
  22. Assert.Contains("* 1_000_000m", source);
  23. Assert.Contains("option, \"S9\")", source);
  24. }
  25. [Fact]
  26. public void GenericDashboard_UsesLatestValuePerMetric()
  27. {
  28. var source = ReadSource("Controllers", "AidopKanbanController.Generic.cs");
  29. Assert.Contains("v2.metric_code=v.metric_code", source);
  30. Assert.DoesNotContain("is_deleted=0 AND biz_date=@d", source);
  31. }
  32. [Fact]
  33. public void S5StageKpis_UseReceiptAndIqcFacts()
  34. {
  35. var source = ReadSource("MaterialWarehouse", "S5MdpSyncTransformService.cs");
  36. Assert.Contains("result.MergeSub(\"S5_L2_001\"", source);
  37. Assert.Contains("result.MergeSub(\"S5_L2_003\"", source);
  38. Assert.Contains("source_table='PurOrdRctMaster'", source);
  39. Assert.Contains("FINSPESTARTDATE", source);
  40. Assert.Contains("ado_s9_kpi_value_l2_day", source);
  41. Assert.DoesNotContain("COPY_PARENT_VALUE", source);
  42. }
  43. [Fact]
  44. public void S6WorkOrderCycle_GroupsByWorkOrderNotOrder()
  45. {
  46. var source = ReadSource("Manufacturing", "S6MdpSyncTransformService.cs");
  47. Assert.Contains("result.MergeSub(\"S6_L2_001\"", source);
  48. Assert.Contains("group by rwnoid", source);
  49. Assert.Contains("NO_COMPLETED_WORK_ORDER", source);
  50. Assert.Contains("L2ValueTable", source);
  51. }
  52. [Fact]
  53. public void S8Snapshot_UsesExceptionTableAndKeepsNullTimeliness()
  54. {
  55. var source = ReadSource("Service/S8", "S8KpiSnapshotService.cs");
  56. Assert.Contains("FROM ado_s8_exception", source);
  57. Assert.Contains("S8_L1_001", source);
  58. Assert.Contains("S8_L1_002", source);
  59. Assert.Contains("avgHours > 0 ? avgHours : null", source);
  60. Assert.DoesNotContain("metric_value=0", source);
  61. }
  62. private static string ReadSource(string folder, string fileName)
  63. {
  64. var dir = new DirectoryInfo(AppContext.BaseDirectory);
  65. while (dir != null)
  66. {
  67. var candidate = Path.Combine(
  68. dir.FullName,
  69. "server",
  70. "Plugins",
  71. "Admin.NET.Plugin.AiDOP",
  72. folder,
  73. fileName);
  74. if (File.Exists(candidate)) return File.ReadAllText(candidate);
  75. dir = dir.Parent;
  76. }
  77. throw new FileNotFoundException(fileName);
  78. }
  79. }