Ver código fonte

feat(s8): t2c seed order flow procurement pivot and baseline snapshot

YY968XX 1 mês atrás
pai
commit
8ac0193c80

+ 88 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/SeedData/S8OrderFlowProcurementPivotSeedData.cs

@@ -0,0 +1,88 @@
+using Admin.NET.Plugin.AiDOP.Entity.S8.OrderFlow;
+
+namespace Admin.NET.Plugin.AiDOP.SeedData;
+
+/// <summary>
+/// ORDER-FLOW-S8-INTEGRATED-DOMAIN-RESET-1 t2c:S8 订单执行链路材料采购透视表 baseline 种子。
+/// 3 materials (XX/YY/ZZ) × 4 suppliers (A/B/C/TOTAL) × 4 specs (L4.5*11.2/MT2*6.3/MT1*5.4/TOTAL) = 48 行。
+/// YY 16 单元为 PPT 第 4 页真值;XX/ZZ 16 单元各自按确定性 multiplier 派生(无随机 / 无 Now)。
+/// status 在 seed 时确定,不允许 service/前端动态重判;按 cycle_days 三档阈值固化(≤15 green / 15..20 yellow / &gt;20 red)。
+/// order_id / order_code 全部 NULL(baseline 行)。
+/// </summary>
+[IncreSeed]
+public class S8OrderFlowProcurementPivotSeedData : ISqlSugarEntitySeedData<AdoS8OrderFlowProcurementPivot>
+{
+    public IEnumerable<AdoS8OrderFlowProcurementPivot> HasData() => S8OrderFlowProcurementPivotDataset.BuildRows();
+}
+
+internal static class S8OrderFlowProcurementPivotDataset
+{
+    internal const long PivotIdBase = 1329909140000L;
+
+    internal static readonly string[] Suppliers = { "A", "B", "C", "TOTAL" };
+    internal static readonly string[] Specs = { "L4.5*11.2", "MT2*6.3", "MT1*5.4", "TOTAL" };
+
+    /// <summary>YY (PPT 第 4 页) 真值矩阵 [supplierIdx, specIdx];保留 3 位小数精度。</summary>
+    private static readonly decimal[,] YyCycleDays =
+    {
+        // L4.5*11.2 | MT2*6.3 | MT1*5.4 | TOTAL
+        { 14.800m,   11.000m,  11.000m,  13.000m  }, // A
+        { 14.050m,   17.150m,  17.150m,  15.600m  }, // B
+        { 14.050m,   23.925m,  23.850m,  20.100m  }, // C
+        { 14.500m,   17.400m,  14.800m,  15.300m  }, // TOTAL
+    };
+
+    /// <summary>派生 XX / ZZ 单元值的 multiplier。XX 偏低、ZZ 偏高,便于 DEMO 拉开差异。</summary>
+    private const decimal XxMultiplier = 0.85m;
+    private const decimal ZzMultiplier = 1.10m;
+
+    public static IEnumerable<AdoS8OrderFlowProcurementPivot> BuildRows()
+    {
+        long seq = 0;
+        foreach (var (material, scenario, mult) in new[]
+        {
+            ("XX", "DEMO", XxMultiplier),
+            ("YY", "PPT",  1.0m),
+            ("ZZ", "DEMO", ZzMultiplier),
+        })
+        {
+            for (var s = 0; s < Suppliers.Length; s++)
+            {
+                for (var p = 0; p < Specs.Length; p++)
+                {
+                    var rawCycle = YyCycleDays[s, p];
+                    var cycleDays = material == "YY"
+                        ? rawCycle
+                        : decimal.Round(rawCycle * mult, 3);
+
+                    yield return new AdoS8OrderFlowProcurementPivot
+                    {
+                        Id = PivotIdBase + (++seq),
+                        OrderId = null,
+                        OrderCode = null,
+                        MaterialCode = material,
+                        SupplierCode = Suppliers[s],
+                        SpecCode = Specs[p],
+                        CycleDays = cycleDays,
+                        Status = ClassifyStatus(cycleDays),
+                        ScenarioCode = scenario,
+                        DataSource = "SEED",
+                        TenantId = 1,
+                        FactoryId = 1,
+                        CreatedAt = S8OrderFlowDataset.CreatedAt,
+                        UpdatedAt = null,
+                        IsDeleted = false,
+                    };
+                }
+            }
+        }
+    }
+
+    /// <summary>fixture 级 status 分类(seed-time once),运行期不再重算。</summary>
+    private static string ClassifyStatus(decimal cycleDays)
+    {
+        if (cycleDays <= 15.0m) return "green";
+        if (cycleDays <= 20.0m) return "yellow";
+        return "red";
+    }
+}

+ 48 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/SeedData/S8OrderFlowSnapshotSeedData.cs

@@ -0,0 +1,48 @@
+using Admin.NET.Plugin.AiDOP.Entity.S8.OrderFlow;
+
+namespace Admin.NET.Plugin.AiDOP.SeedData;
+
+/// <summary>
+/// ORDER-FLOW-S8-INTEGRATED-DOMAIN-RESET-1 t2c:S8 订单执行链路 BASELINE_PPT 聚合快照种子。
+/// 单条记录:snapshot_code = CHAIN_AGGREGATE_BASELINE / scope_code = BASELINE_PPT / scenario = PPT。
+/// stage_snapshots_json 含 5 阶段 PPT 第 1 页真值。onTimeRate 是整数百分比(59/96/85/89/96)。
+/// service 层 baseline 读取协议:scope_code=BASELINE_PPT → 取本表行;CURRENT_FILTERED → 实时聚合。
+/// </summary>
+[IncreSeed]
+public class S8OrderFlowSnapshotSeedData : ISqlSugarEntitySeedData<AdoS8OrderFlowSnapshot>
+{
+    internal const long SnapshotIdBase = 1329909150000L;
+
+    public IEnumerable<AdoS8OrderFlowSnapshot> HasData()
+    {
+        yield return new AdoS8OrderFlowSnapshot
+        {
+            Id = SnapshotIdBase + 1,
+            TenantId = 1,
+            FactoryId = 1,
+            SnapshotCode = "CHAIN_AGGREGATE_BASELINE",
+            ScopeCode = "BASELINE_PPT",
+            TotalOrders = 105,
+            TotalCustomers = 5,
+            AvgResponseMinutes = 91.2m,
+            AvgProcessingMinutes = 1060.5m,
+            AvgLossMinutes = 1472.5m,
+            StageSnapshotsJson = StageSnapshotsJson,
+            ScenarioCode = "PPT",
+            DataSource = "SEED",
+            CreatedAt = S8OrderFlowDataset.CreatedAt,
+            UpdatedAt = null,
+            IsDeleted = false,
+        };
+    }
+
+    /// <summary>BASELINE_PPT 5 阶段聚合 JSON(顺序:评审/排产/测算 → 产品设计 → 材料采购 → 本体生产 → 总装发货)。</summary>
+    private const string StageSnapshotsJson =
+        "[" +
+        "{\"orderFlowCode\":\"ORDER_REVIEW_PLAN_CALC\",\"orderFlowName\":\"评审/排产/测算\",\"kpiAvgDays\":5.0,\"actualAvgDays\":6.2,\"onTimeRate\":59,\"green\":0,\"yellow\":0,\"red\":0,\"pending\":0}," +
+        "{\"orderFlowCode\":\"PRODUCT_DESIGN\",\"orderFlowName\":\"产品设计\",\"kpiAvgDays\":3.0,\"actualAvgDays\":2.6,\"onTimeRate\":96,\"green\":0,\"yellow\":0,\"red\":0,\"pending\":0}," +
+        "{\"orderFlowCode\":\"MATERIAL_PURCHASE\",\"orderFlowName\":\"材料采购\",\"kpiAvgDays\":14.0,\"actualAvgDays\":15.5,\"onTimeRate\":85,\"green\":0,\"yellow\":0,\"red\":0,\"pending\":0}," +
+        "{\"orderFlowCode\":\"BODY_PRODUCTION\",\"orderFlowName\":\"本体生产\",\"kpiAvgDays\":6.0,\"actualAvgDays\":6.7,\"onTimeRate\":89,\"green\":0,\"yellow\":0,\"red\":0,\"pending\":0}," +
+        "{\"orderFlowCode\":\"FINAL_ASSEMBLY_DELIVERY\",\"orderFlowName\":\"总装发货\",\"kpiAvgDays\":3.0,\"actualAvgDays\":2.9,\"onTimeRate\":96,\"green\":0,\"yellow\":0,\"red\":0,\"pending\":0}" +
+        "]";
+}