S8OrderFlowProductDesignDrawingSeedData.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. using Admin.NET.Plugin.AiDOP.Entity.S8.OrderFlow;
  2. namespace Admin.NET.Plugin.AiDOP.SeedData;
  3. /// <summary>
  4. /// S8-ORDER-CHAIN-PRODUCT-DESIGN-PPT-STATIC-AND-SINGLE-ORDER-ALIGN-1:S8 订单链路产品设计阶段基准业务初始化数据种子。
  5. /// 20 单 × 63 图号;按业务口径修正:
  6. /// 1) COUNT(DISTINCT drawing_no) = 63;STANDARD=52 / NON_STANDARD=11
  7. /// 2) SUM(product_quantity ALL) = 382;STANDARD=357 / NON_STANDARD=25
  8. /// 3) PRODUCT_DESIGN 阶段统一 KPI=3 天:STANDARD 与 NON_STANDARD 的 kpi_days 均为 3
  9. /// 4) NON_STANDARD 图号 actual_days 全部 > 3 → is_achieved=false / status='red'
  10. /// 5) STANDARD 51 张图号 actual_days ≤ 3 → is_achieved=true / status='green';1 张超期 actual=4.50 → red
  11. /// 6) AVG(actual_days WHERE product_type='STANDARD') 落在 [1.17, 1.21]
  12. /// 7) AVG(actual_days WHERE product_type='NON_STANDARD') 落在 [9.25, 9.31]
  13. /// 图号编码:常规 D-{OrderCode}-G{NN};非标 D-{OrderCode}-X{NN}(绑定 SO-2026-001..020 真实 OrderCode)。
  14. /// 责任人字段承载具体设计师姓名(产品设计阶段基准业务初始化数据,6 人按全表全局递增序号 seq 循环分配,确保 6 桶全覆盖)。
  15. /// 默认基线展示(顶部 2.5 / 98 + 分类汇总 354/28/382 PPT 口径)由 snapshot 表与前端基线数据共同支撑;
  16. /// 本表负责单订单态与多订单态的图号粒度真实数据。
  17. /// </summary>
  18. [IncreSeed]
  19. public class S8OrderFlowProductDesignDrawingSeedData
  20. : ISqlSugarEntitySeedData<AdoS8OrderFlowProductDesignDrawing>
  21. {
  22. public IEnumerable<AdoS8OrderFlowProductDesignDrawing> HasData()
  23. => S8OrderFlowProductDesignDrawingDataset.BuildDrawings();
  24. }
  25. internal static class S8OrderFlowProductDesignDrawingDataset
  26. {
  27. /// <summary>图号 id 基址(与其他 S8 种子号段隔离)。</summary>
  28. internal const long IdBase = 1329909130000L;
  29. internal const string ProductTypeStandard = "STANDARD";
  30. internal const string ProductTypeNonStandard = "NON_STANDARD";
  31. /// <summary>常规产品 KPI(天)。PRODUCT_DESIGN 阶段统一标准。</summary>
  32. internal const decimal StandardKpiDays = 3.00m;
  33. /// <summary>非标产品 KPI(天)。与常规产品同阶段标准。</summary>
  34. internal const decimal NonStandardKpiDays = 3.00m;
  35. /// <summary>产品设计阶段基准业务初始化数据:设计师姓名清单(6 人按全表全局递增序号 seq 循环分配,sort_no 仅为订单内序号,无法保证 6 桶全覆盖)。</summary>
  36. private static readonly string[] Designers =
  37. {
  38. "李海峰",
  39. "陈思远",
  40. "王明华",
  41. "赵建国",
  42. "刘振宇",
  43. "周启明",
  44. };
  45. /// <summary>
  46. /// 每订单 (常规图号数, 非标图号数)。20 行合计 52 / 11;其中 4 单 4 图、16 单 3 图。
  47. /// 非标集中在大客户、P1 优先级与 in_progress 订单上,与业务直觉一致。
  48. /// </summary>
  49. private static readonly (int StdCount, int NonStdCount)[] PerOrderConfig =
  50. {
  51. // SO-2026-001..005
  52. (3, 1), (3, 1), (3, 1), (3, 0), (3, 0),
  53. // SO-2026-006..010
  54. (2, 1), (2, 1), (2, 1), (3, 0), (3, 0),
  55. // SO-2026-011..015
  56. (3, 0), (2, 1), (3, 0), (3, 0), (3, 0),
  57. // SO-2026-016..020
  58. (3, 0), (2, 1), (2, 1), (2, 1), (2, 1),
  59. };
  60. /// <summary>52 张常规图号 spec:合计 actual_days=61.88、qty=357、1 张超期 (qty=3)。</summary>
  61. private static readonly DrawingSpec[] StandardSequence = BuildStandardSequence();
  62. /// <summary>11 张非标图号 spec:合计 actual_days=102.08、qty=25;全部 actual_days &gt; 3 → 全部不达标 red。</summary>
  63. private static readonly DrawingSpec[] NonStandardSequence = BuildNonStandardSequence();
  64. /// <summary>单张图号的回卷规格:actual_days / quantity / is_achieved / status。</summary>
  65. internal readonly record struct DrawingSpec(decimal ActualDays, int Quantity, bool IsAchieved, string Status);
  66. private static DrawingSpec[] BuildStandardSequence()
  67. {
  68. // 52 张分布:24×(1.13, qty=7) + 24×(1.12, qty=7) + 2×(1.13, qty=6) + 1×(1.12, qty=6) + 1×(4.50, qty=3, red)
  69. // actual_days 合计 = 24×1.13 + 24×1.12 + 2×1.13 + 1×1.12 + 4.50
  70. // = 27.12 + 26.88 + 2.26 + 1.12 + 4.50 = 61.88 → avg 1.190 (在 [1.17, 1.21])
  71. // quantity 合计 = 24×7 + 24×7 + 2×6 + 1×6 + 3 = 168 + 168 + 12 + 6 + 3 = 357
  72. var seq = new DrawingSpec[52];
  73. for (var i = 0; i < 24; i++) seq[i] = new DrawingSpec(1.13m, 7, true, "green");
  74. for (var i = 24; i < 48; i++) seq[i] = new DrawingSpec(1.12m, 7, true, "green");
  75. seq[48] = new DrawingSpec(1.13m, 6, true, "green");
  76. seq[49] = new DrawingSpec(1.13m, 6, true, "green");
  77. seq[50] = new DrawingSpec(1.12m, 6, true, "green");
  78. // 唯一一张超期常规图号:actual=4.50 > kpi=3 → (4.5-3)/3 = 0.50 > 0.20 → red
  79. seq[51] = new DrawingSpec(4.50m, 3, false, "red");
  80. return seq;
  81. }
  82. private static DrawingSpec[] BuildNonStandardSequence()
  83. {
  84. // 11 张分布:5×(8.34, qty=1) + 4×(8.34, qty=2) + 2×(13.51, qty=6)
  85. // actual_days 合计 = 9×8.34 + 2×13.51 = 75.06 + 27.02 = 102.08 → avg 9.28 (在 [9.25, 9.31])
  86. // quantity 合计 = 5×1 + 4×2 + 2×6 = 5 + 8 + 12 = 25
  87. // 非标 KPI=3 后,所有 actual_days ≥ 8.34 > 3 → 全部 is_achieved=false / status='red'
  88. var seq = new DrawingSpec[11];
  89. for (var i = 0; i < 5; i++) seq[i] = new DrawingSpec(8.34m, 1, false, "red");
  90. for (var i = 5; i < 9; i++) seq[i] = new DrawingSpec(8.34m, 2, false, "red");
  91. seq[9] = new DrawingSpec(13.51m, 6, false, "red");
  92. seq[10] = new DrawingSpec(13.51m, 6, false, "red");
  93. return seq;
  94. }
  95. public static IEnumerable<AdoS8OrderFlowProductDesignDrawing> BuildDrawings()
  96. {
  97. int stdCursor = 0, nonStdCursor = 0;
  98. long seq = 0;
  99. for (var i = 0; i < S8OrderFlowDataset.Specs.Length; i++)
  100. {
  101. var orderSpec = S8OrderFlowDataset.Specs[i];
  102. var (stdN, nonStdN) = PerOrderConfig[i];
  103. // 图号粒度计划开始 = release_at + 5 天(ORDER_REVIEW KPI=5 天结束后进入 PRODUCT_DESIGN)。
  104. // 所有图号同基准开始,actualEnd 由 actualDays 派生,保证 actualEnd - actualStart 严格等于 actualDays。
  105. var plannedStart = S8OrderFlowDataset.ReleaseBase.AddDays(5);
  106. var sortNo = 0;
  107. for (var g = 0; g < stdN; g++)
  108. {
  109. sortNo++;
  110. var spec = StandardSequence[stdCursor++];
  111. yield return BuildDrawing(
  112. seq: ++seq,
  113. orderSpec: orderSpec,
  114. sortNo: sortNo,
  115. drawingNo: $"D-{orderSpec.OrderCode}-G{g + 1:D2}",
  116. productType: ProductTypeStandard,
  117. kpiDays: StandardKpiDays,
  118. plannedStart: plannedStart,
  119. spec: spec);
  120. }
  121. for (var x = 0; x < nonStdN; x++)
  122. {
  123. sortNo++;
  124. var spec = NonStandardSequence[nonStdCursor++];
  125. yield return BuildDrawing(
  126. seq: ++seq,
  127. orderSpec: orderSpec,
  128. sortNo: sortNo,
  129. drawingNo: $"D-{orderSpec.OrderCode}-X{x + 1:D2}",
  130. productType: ProductTypeNonStandard,
  131. kpiDays: NonStandardKpiDays,
  132. plannedStart: plannedStart,
  133. spec: spec);
  134. }
  135. }
  136. }
  137. private static AdoS8OrderFlowProductDesignDrawing BuildDrawing(
  138. long seq,
  139. S8OrderFlowDataset.OrderSpec orderSpec,
  140. int sortNo,
  141. string drawingNo,
  142. string productType,
  143. decimal kpiDays,
  144. DateTime plannedStart,
  145. DrawingSpec spec)
  146. {
  147. // 计划区间按 KPI 推算;非标 KPI 与常规 KPI 同阶段标准 3 天,但非标设计周期允许 actual_days 较长。
  148. var plannedEnd = plannedStart.AddDays((double)kpiDays);
  149. var actualStart = plannedStart;
  150. var actualEnd = actualStart.AddDays((double)spec.ActualDays);
  151. var responsible = Designers[(seq - 1) % Designers.Length];
  152. return new AdoS8OrderFlowProductDesignDrawing
  153. {
  154. Id = IdBase + seq,
  155. TenantId = 1,
  156. FactoryId = 1,
  157. OrderCode = orderSpec.OrderCode,
  158. DrawingNo = drawingNo,
  159. ProductType = productType,
  160. ProductQuantity = spec.Quantity,
  161. ResponsiblePerson = responsible,
  162. PlannedStartDate = plannedStart,
  163. PlannedEndDate = plannedEnd,
  164. ActualStartDate = actualStart,
  165. ActualEndDate = actualEnd,
  166. KpiDays = kpiDays,
  167. ActualDays = spec.ActualDays,
  168. IsAchieved = spec.IsAchieved,
  169. Status = spec.Status,
  170. SortNo = sortNo,
  171. IsDeleted = false,
  172. CreateTime = S8OrderFlowDataset.CreatedAt,
  173. UpdateTime = null,
  174. };
  175. }
  176. }