| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- using Admin.NET.Plugin.AiDOP.Entity.S8.OrderFlow;
- namespace Admin.NET.Plugin.AiDOP.SeedData;
- /// <summary>
- /// ORDER-FLOW-S8-INTEGRATED-DOMAIN-RESET-1 t2b:ORDER_REVIEW_PLAN_CALC 阶段 L2 子节点种子。
- /// 20 单 × 5 子节点 = 100 行;SO-2026-001 按 PPT 第 2 页真值;其余 19 单按 (orderIdx, substepIdx)
- /// 派生 multiplier,确定性、可重入,无随机数 / DateTime.Now。
- /// </summary>
- [IncreSeed]
- public class S8OrderFlowSubstepSeedData : ISqlSugarEntitySeedData<AdoS8OrderFlowSubstep>
- {
- public IEnumerable<AdoS8OrderFlowSubstep> HasData() => S8OrderFlowSubstepDataset.BuildSubsteps();
- }
- internal static class S8OrderFlowSubstepDataset
- {
- internal const long SubstepIdBase = 1329909120000L;
- internal const string FlowCode = "ORDER_REVIEW_PLAN_CALC";
- /// <summary>L2 五子节点固定顺序与 PI 基线工时。</summary>
- internal static readonly (string Code, string Name, decimal PiHours)[] L2Def =
- {
- ("OPINION_REVIEW", "意见评审", 8m),
- ("OPINION_FEEDBACK", "意见反馈", 12m),
- ("SECOND_REVIEW", "二次评审", 8m),
- ("LEADER_REVIEW", "领导意见", 10m),
- ("CONTRACT_SEAL", "合同盖章", 2m),
- };
- /// <summary>SO-2026-001 PPT 第 2 页 L2 真值:actual_hours / status,与 L2Def 同序。</summary>
- private static readonly (decimal Actual, string Status)[] Ppt001L2 =
- {
- (14.4m, "red"),
- (14.2m, "yellow"),
- ( 7.0m, "green"),
- (12.0m, "yellow"),
- ( 2.0m, "green"),
- };
- /// <summary>
- /// 19 个非 PPT 单的 L2 派生 multiplier 桶。
- /// bucketIdx = (idx - 2 + substepIdx) mod 5,对应 5 种 (multiplier, status) 组合。
- /// status 满足:multiplier ≤ 1.00 = green;1.00 < multiplier ≤ 1.25 = yellow;> 1.25 = red。
- /// </summary>
- private static readonly (decimal Mult, string Status)[] L2Buckets =
- {
- (0.90m, "green"),
- (1.10m, "yellow"),
- (1.40m, "red"),
- (1.00m, "green"),
- (1.20m, "yellow"),
- };
- public static IEnumerable<AdoS8OrderFlowSubstep> BuildSubsteps()
- {
- long seq = 0;
- foreach (var spec in S8OrderFlowDataset.Specs)
- {
- var orderId = S8OrderFlowDataset.OrderIdBase + spec.Idx;
- var isPpt = spec.OrderCode == "SO-2026-001";
- var scenario = isPpt ? "PPT" : "DEMO";
- for (var i = 0; i < L2Def.Length; i++)
- {
- var (code, name, piHours) = L2Def[i];
- decimal actual;
- string status;
- if (isPpt)
- {
- actual = Ppt001L2[i].Actual;
- status = Ppt001L2[i].Status;
- }
- else
- {
- var bucketIdx = ((spec.Idx - 2) + i) % L2Buckets.Length;
- var bucket = L2Buckets[bucketIdx];
- actual = decimal.Round(piHours * bucket.Mult, 1);
- status = bucket.Status;
- }
- yield return new AdoS8OrderFlowSubstep
- {
- Id = SubstepIdBase + (++seq),
- OrderId = orderId,
- OrderCode = spec.OrderCode,
- OrderFlowCode = FlowCode,
- SubstepCode = code,
- SubstepName = name,
- PiHours = piHours,
- ActualHours = actual,
- Status = status,
- SortNo = i + 1,
- ScenarioCode = scenario,
- DataSource = "SEED",
- TenantId = 1,
- FactoryId = 1,
- CreatedAt = S8OrderFlowDataset.CreatedAt,
- UpdatedAt = null,
- IsDeleted = false,
- };
- }
- }
- }
- /// <summary>OPINION_REVIEW 在 100 行 substep 中的全局 substep_id(供 unit seed 反查 FK)。</summary>
- public static long OpinionReviewSubstepId(int orderIdx)
- {
- // 每单 5 个 substep,OPINION_REVIEW 是第 1 个(sort_no=1)。
- // seq 顺序:(idx=1 的 5 个) → (idx=2 的 5 个) → ...
- // 第 idx 单的 OPINION_REVIEW seq = (idx - 1) * 5 + 1。
- return SubstepIdBase + (orderIdx - 1) * 5L + 1L;
- }
- }
|