S8DashboardCellConfigSeedData.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. namespace Admin.NET.Plugin.AiDOP;
  2. /// <summary>
  3. /// S8 大屏卡片配置基线种子(灌入 ado_s8_dashboard_cell_config)。
  4. /// 全局基线:tenant_id=0 / factory_id=0;覆盖 4 个大屏的全部稳定锚点卡片。
  5. /// 依赖 S8ExceptionTypeSeedData:EXCEPTION_TYPE 绑定的 exception_type_code 必须先存在。
  6. /// G-09 一期:补齐 UI 配置字段(icon/layout_area/display_mode/remark),
  7. /// 让新装环境跑 SeedData 即可获得完整渲染配置;现有环境通过手工 INSERT SQL 灌入同样数据。
  8. /// G-09 三期 F-CLEAN-1:show_in_sidebar 当前不参与 cell→layout 派生,SeedData 不再写入;Entity/DB 列保留。
  9. /// </summary>
  10. [IncreSeed]
  11. public class S8DashboardCellConfigSeedData : ISqlSugarEntitySeedData<Entity.S8.AdoS8DashboardCellConfig>
  12. {
  13. public IEnumerable<Entity.S8.AdoS8DashboardCellConfig> HasData()
  14. {
  15. var ct = DateTime.Parse("2026-04-18 00:00:00");
  16. long seq = 1329908200001L;
  17. var list = new List<Entity.S8.AdoS8DashboardCellConfig>();
  18. // ── OVERVIEW 页面 ──
  19. // S1-S7 模块卡(7 张,CUSTOM 聚合,layout_area=MODULES, display_mode=STAGE_CARD)
  20. // S8-DASHBOARD-P0-CATEGORY-SEED-FIX-1:标题与侧栏菜单业务名 + S8ModuleCode.Label 对齐。
  21. var overviewModules = new (string code, string title, string icon)[]
  22. {
  23. ("S1", "S1 产销协同", "Checked"),
  24. ("S2", "S2 制造协同", "TrendCharts"),
  25. ("S3", "S3 供应协同", "ShoppingBag"),
  26. ("S4", "S4 采购执行", "Tools"),
  27. ("S5", "S5 物料仓储", "DataAnalysis"),
  28. ("S6", "S6 生产执行", "Box"),
  29. ("S7", "S7 成品仓储", "Van"),
  30. };
  31. var sort = 100;
  32. foreach (var (m, title, icon) in overviewModules)
  33. list.Add(Custom(seq++, "OVERVIEW", $"OVERVIEW_{m}", title, "OPEN_COUNT", "LAST_24H", sort++, ct,
  34. icon: icon, layoutArea: "MODULES", displayMode: "STAGE_CARD"));
  35. // 部门效率聚合
  36. list.Add(Aggregate(seq++, "OVERVIEW", "OVERVIEW_BY_DEPT", "部门异常聚合", "ALL", "OPEN_COUNT", "LAST_24H", "OWNER", sort++, ct,
  37. icon: "DataAnalysis", layoutArea: "SIDEBAR", displayMode: "DEPT_CLUSTER"));
  38. // 类别异常卡(5 张,按场景聚合,layout_area=ANALYSIS, display_mode=CATEGORY_CARD)
  39. var overviewCats = new (string code, string title, string icon)[]
  40. {
  41. ("OVERVIEW_CAT_ORDER_REVIEW", "订单评审异常", "DataAnalysis"),
  42. ("OVERVIEW_CAT_PRODUCT_DESIGN", "产品设计异常", "ShoppingBag"),
  43. ("OVERVIEW_CAT_MATERIAL_PURCHASE","物料采购异常", "Tools"),
  44. ("OVERVIEW_CAT_BODY_PRODUCTION", "主体生产异常", "Van"),
  45. ("OVERVIEW_CAT_FINAL_ASSEMBLY", "总装交付异常", "Van"),
  46. };
  47. foreach (var (code, title, icon) in overviewCats)
  48. list.Add(Aggregate(seq++, "OVERVIEW", code, title, "ALL", "FREQUENCY", "LAST_7D", "OWNER", sort++, ct,
  49. icon: icon, layoutArea: "ANALYSIS", displayMode: "CATEGORY_CARD"));
  50. // 整体响应效能 + 状态统计条(CUSTOM,无 icon)
  51. list.Add(Custom(seq++, "OVERVIEW", "OVERVIEW_OVERALL_EFFICIENCY", "整体响应效能", "CLOSE_RATE", "LAST_7D", sort++, ct,
  52. icon: null, layoutArea: "SIDEBAR", displayMode: "CUSTOM"));
  53. list.Add(Custom(seq++, "OVERVIEW", "OVERVIEW_STATUS_BAR", "状态统计条", "OPEN_COUNT", "TODAY", sort++, ct,
  54. icon: null, layoutArea: "ANALYSIS", displayMode: "CUSTOM"));
  55. // ── DELIVERY 页面 ──
  56. // S8-DASHBOARD-P0-CATEGORY-SEED-FIX-1:模块卡标题与 S8ModuleCode.Label 对齐。
  57. sort = 100;
  58. list.Add(Custom(seq++, "DELIVERY", "DELIVERY_S1", "S1 产销协同", "OPEN_COUNT", "LAST_24H", sort++, ct,
  59. icon: "Checked", layoutArea: "MODULES", displayMode: "STAGE_CARD"));
  60. list.Add(Custom(seq++, "DELIVERY", "DELIVERY_S7", "S7 成品仓储", "OPEN_COUNT", "LAST_24H", sort++, ct,
  61. icon: "Van", layoutArea: "MODULES", displayMode: "STAGE_CARD"));
  62. // 异常类型卡(3 张:sidebar compact,OPEN_COUNT 总数)
  63. list.Add(ExceptionType(seq++, "DELIVERY", "DELIVERY_ANOMALY_ORDER_CHANGE", "订单变更", "ORDER_CHANGE", "OPEN_COUNT", "LAST_24H", sort++, ct,
  64. icon: "Checked", layoutArea: "SIDEBAR", displayMode: "CATEGORY_COMPACT"));
  65. list.Add(ExceptionType(seq++, "DELIVERY", "DELIVERY_ANOMALY_DELIVERY_DELAY", "交期延迟", "DELIVERY_DELAY", "OPEN_COUNT", "LAST_24H", sort++, ct,
  66. icon: "Van", layoutArea: "SIDEBAR", displayMode: "CATEGORY_COMPACT"));
  67. list.Add(ExceptionType(seq++, "DELIVERY", "DELIVERY_ANOMALY_STOCK_PENDING", "入库待发", "PENDING_SHIPMENT", "OPEN_COUNT", "LAST_24H", sort++, ct,
  68. icon: "Van", layoutArea: "SIDEBAR", displayMode: "CATEGORY_COMPACT"));
  69. // 异常多维分析卡(3 张:analysis 大卡,FREQUENCY/AVG_DURATION/CLOSE_RATE)
  70. list.Add(ExceptionType(seq++, "DELIVERY", "DELIVERY_CAT_ORDER_CHANGE", "订单变更多维分析", "ORDER_CHANGE", "FREQUENCY", "LAST_7D", sort++, ct,
  71. icon: "Checked", layoutArea: "ANALYSIS", displayMode: "CATEGORY_CARD"));
  72. list.Add(ExceptionType(seq++, "DELIVERY", "DELIVERY_CAT_DELIVERY_DELAY", "交期延迟多维分析", "DELIVERY_DELAY", "AVG_DURATION", "LAST_7D", sort++, ct,
  73. icon: "Van", layoutArea: "ANALYSIS", displayMode: "CATEGORY_CARD"));
  74. list.Add(ExceptionType(seq++, "DELIVERY", "DELIVERY_CAT_STOCK_PENDING", "入库待发多维分析", "PENDING_SHIPMENT", "CLOSE_RATE", "LAST_7D", sort++, ct,
  75. icon: "Van", layoutArea: "ANALYSIS", displayMode: "CATEGORY_CARD"));
  76. list.Add(Custom(seq++, "DELIVERY", "DELIVERY_STATUS_BAR", "状态统计条", "OPEN_COUNT", "TODAY", sort++, ct,
  77. icon: null, layoutArea: "ANALYSIS", displayMode: "CUSTOM"));
  78. // ── PRODUCTION 页面 ──
  79. // S8-DASHBOARD-P0-CATEGORY-SEED-FIX-1:模块卡标题与 S8ModuleCode.Label 对齐。
  80. sort = 100;
  81. list.Add(Custom(seq++, "PRODUCTION", "PRODUCTION_S2", "S2 制造协同", "OPEN_COUNT", "LAST_24H", sort++, ct,
  82. icon: "TrendCharts", layoutArea: "MODULES", displayMode: "STAGE_CARD"));
  83. list.Add(Custom(seq++, "PRODUCTION", "PRODUCTION_S6", "S6 生产执行", "OPEN_COUNT", "LAST_24H", sort++, ct,
  84. icon: "Box", layoutArea: "MODULES", displayMode: "STAGE_CARD"));
  85. list.Add(ExceptionType(seq++, "PRODUCTION", "PRODUCTION_ANOMALY_EQUIPMENT_FAULT", "设备异常", "EQUIP_FAULT", "OPEN_COUNT", "LAST_24H", sort++, ct,
  86. icon: "Tools", layoutArea: "SIDEBAR", displayMode: "CATEGORY_COMPACT"));
  87. // S8-DEPRECATED-EXCEPTION-TYPE-MIGRATE-1:MATERIAL_SHORTAGE→MFG_MATERIAL_ABNORMAL / QUALITY_DEFECT→MFG_QUALITY_ABNORMAL。
  88. list.Add(ExceptionType(seq++, "PRODUCTION", "PRODUCTION_ANOMALY_MATERIAL_FAULT", "物料异常", "MFG_MATERIAL_ABNORMAL", "OPEN_COUNT", "LAST_24H", sort++, ct,
  89. icon: "Box", layoutArea: "SIDEBAR", displayMode: "CATEGORY_COMPACT"));
  90. list.Add(ExceptionType(seq++, "PRODUCTION", "PRODUCTION_ANOMALY_QUALITY_FAULT", "质量异常", "MFG_QUALITY_ABNORMAL", "OPEN_COUNT", "LAST_24H", sort++, ct,
  91. icon: "TrendCharts", layoutArea: "SIDEBAR", displayMode: "CATEGORY_COMPACT"));
  92. list.Add(ExceptionType(seq++, "PRODUCTION", "PRODUCTION_CAT_EQUIPMENT_FAULT", "设备异常多维分析", "EQUIP_FAULT", "FREQUENCY", "LAST_7D", sort++, ct,
  93. icon: "Tools", layoutArea: "ANALYSIS", displayMode: "CATEGORY_CARD"));
  94. list.Add(ExceptionType(seq++, "PRODUCTION", "PRODUCTION_CAT_MATERIAL_FAULT", "物料异常多维分析", "MFG_MATERIAL_ABNORMAL", "AVG_DURATION", "LAST_7D", sort++, ct,
  95. icon: "Box", layoutArea: "ANALYSIS", displayMode: "CATEGORY_CARD"));
  96. list.Add(ExceptionType(seq++, "PRODUCTION", "PRODUCTION_CAT_QUALITY_FAULT", "质量异常多维分析", "MFG_QUALITY_ABNORMAL", "CLOSE_RATE", "LAST_7D", sort++, ct,
  97. icon: "TrendCharts", layoutArea: "ANALYSIS", displayMode: "CATEGORY_CARD"));
  98. list.Add(Custom(seq++, "PRODUCTION", "PRODUCTION_STATUS_BAR", "状态统计条", "OPEN_COUNT", "TODAY", sort++, ct,
  99. icon: null, layoutArea: "ANALYSIS", displayMode: "CUSTOM"));
  100. // ── SUPPLY 页面 ──
  101. // S8-DASHBOARD-P0-CATEGORY-SEED-FIX-1:模块卡标题与 S8ModuleCode.Label 对齐。
  102. sort = 100;
  103. list.Add(Custom(seq++, "SUPPLY", "SUPPLY_S3", "S3 供应协同", "OPEN_COUNT", "LAST_24H", sort++, ct,
  104. icon: "ShoppingBag", layoutArea: "MODULES", displayMode: "STAGE_CARD"));
  105. list.Add(Custom(seq++, "SUPPLY", "SUPPLY_S4", "S4 采购执行", "OPEN_COUNT", "LAST_24H", sort++, ct,
  106. icon: "Tools", layoutArea: "MODULES", displayMode: "STAGE_CARD"));
  107. list.Add(Custom(seq++, "SUPPLY", "SUPPLY_S5", "S5 物料仓储", "OPEN_COUNT", "LAST_24H", sort++, ct,
  108. icon: "DataAnalysis", layoutArea: "MODULES", displayMode: "STAGE_CARD"));
  109. // 供应域 7 类异常:类型卡(sidebar) + 分析卡(analysis)
  110. var supplyTypes = new (string typeCode, string anchor, string title, string icon)[]
  111. {
  112. ("SUPPLIER_ETA_ISSUE", "SUPPLIER_REPLY_DELAY", "供应商回复交期异常", "ShoppingBag"),
  113. ("SUPPLIER_SHIP_ISSUE", "SUPPLIER_SHIP_FAULT", "供应商发货异常", "Van"),
  114. // S8-DEPRECATED-EXCEPTION-TYPE-MIGRATE-1:WH_INBOUND_ISSUE→WAREHOUSE_RECEIPT_ABNORMAL /
  115. // WH_KIT_ISSUE→WORK_ORDER_KITTING_ABNORMAL / WH_ISSUE_OUT_ISSUE→WORK_ORDER_ISSUE_ABNORMAL。
  116. ("WAREHOUSE_RECEIPT_ABNORMAL", "WAREHOUSE_RECEIPT", "仓库收货异常", "Box"),
  117. ("IQC_ISSUE", "IQC_INSPECTION", "IQC 检验异常", "DataAnalysis"),
  118. ("WH_PUTAWAY_ISSUE", "WAREHOUSE_SHELVING", "仓库上架入库异常", "Document"),
  119. ("WORK_ORDER_KITTING_ABNORMAL", "WORK_ORDER_PREPARE", "工单备料异常", "Promotion"),
  120. ("WORK_ORDER_ISSUE_ABNORMAL", "WORK_ORDER_ISSUE", "工单发料异常", "Tools"),
  121. };
  122. foreach (var (typeCode, anchor, title, icon) in supplyTypes)
  123. list.Add(ExceptionType(seq++, "SUPPLY", $"SUPPLY_ANOMALY_{anchor}", title, typeCode, "OPEN_COUNT", "LAST_24H", sort++, ct,
  124. icon: icon, layoutArea: "SIDEBAR", displayMode: "CATEGORY_COMPACT"));
  125. foreach (var (typeCode, anchor, title, icon) in supplyTypes)
  126. list.Add(ExceptionType(seq++, "SUPPLY", $"SUPPLY_CAT_{anchor}", $"{title}多维分析", typeCode, "FREQUENCY", "LAST_7D", sort++, ct,
  127. icon: icon, layoutArea: "ANALYSIS", displayMode: "CATEGORY_CARD"));
  128. list.Add(Custom(seq++, "SUPPLY", "SUPPLY_STATUS_BAR", "状态统计条", "OPEN_COUNT", "TODAY", sort++, ct,
  129. icon: null, layoutArea: "ANALYSIS", displayMode: "CUSTOM"));
  130. return list;
  131. }
  132. // F-CLEAN-1:show_in_sidebar 在 Phase 2/3 当前模型下不参与 cell→layout 派生
  133. // (前端 effectiveSidebarTypes 仅按 layout_area+display_mode 过滤,DTO 也不映射该字段),
  134. // 因此 SeedData 不再写入。Entity/DB 列保留以避免 schema 破坏,待未来重新定义语义或下版本统一 DROP。
  135. private static Entity.S8.AdoS8DashboardCellConfig Custom(
  136. long id, string pageCode, string cellCode, string cellTitle,
  137. string statMetric, string timeWindow, int sortNo, DateTime ct,
  138. string? icon = null, string layoutArea = "ANALYSIS", string displayMode = "CATEGORY_CARD",
  139. string? remark = null) =>
  140. new()
  141. {
  142. Id = id,
  143. TenantId = 0,
  144. FactoryId = 0,
  145. PageCode = pageCode,
  146. CellCode = cellCode,
  147. CellTitle = cellTitle,
  148. BindingType = "CUSTOM",
  149. ExceptionTypeCode = null,
  150. AggregateScope = null,
  151. StatMetric = statMetric,
  152. TimeWindow = timeWindow,
  153. FilterExpression = null,
  154. DeptGroupBy = "OWNER",
  155. Enabled = true,
  156. SortNo = sortNo,
  157. Icon = icon,
  158. LayoutArea = layoutArea,
  159. DisplayMode = displayMode,
  160. Remark = remark,
  161. CreatedAt = ct,
  162. };
  163. private static Entity.S8.AdoS8DashboardCellConfig ExceptionType(
  164. long id, string pageCode, string cellCode, string cellTitle,
  165. string exceptionTypeCode, string statMetric, string timeWindow, int sortNo, DateTime ct,
  166. string? icon = null, string layoutArea = "ANALYSIS", string displayMode = "CATEGORY_CARD",
  167. string? remark = null) =>
  168. new()
  169. {
  170. Id = id,
  171. TenantId = 0,
  172. FactoryId = 0,
  173. PageCode = pageCode,
  174. CellCode = cellCode,
  175. CellTitle = cellTitle,
  176. BindingType = "EXCEPTION_TYPE",
  177. ExceptionTypeCode = exceptionTypeCode,
  178. AggregateScope = null,
  179. StatMetric = statMetric,
  180. TimeWindow = timeWindow,
  181. FilterExpression = null,
  182. DeptGroupBy = "OWNER",
  183. Enabled = true,
  184. SortNo = sortNo,
  185. Icon = icon,
  186. LayoutArea = layoutArea,
  187. DisplayMode = displayMode,
  188. Remark = remark,
  189. CreatedAt = ct,
  190. };
  191. private static Entity.S8.AdoS8DashboardCellConfig Aggregate(
  192. long id, string pageCode, string cellCode, string cellTitle,
  193. string aggregateScope, string statMetric, string timeWindow, string deptGroupBy,
  194. int sortNo, DateTime ct,
  195. string? icon = null, string layoutArea = "ANALYSIS", string displayMode = "CATEGORY_CARD",
  196. string? remark = null) =>
  197. new()
  198. {
  199. Id = id,
  200. TenantId = 0,
  201. FactoryId = 0,
  202. PageCode = pageCode,
  203. CellCode = cellCode,
  204. CellTitle = cellTitle,
  205. BindingType = "AGGREGATE",
  206. ExceptionTypeCode = null,
  207. AggregateScope = aggregateScope,
  208. StatMetric = statMetric,
  209. TimeWindow = timeWindow,
  210. FilterExpression = null,
  211. DeptGroupBy = deptGroupBy,
  212. Enabled = true,
  213. SortNo = sortNo,
  214. Icon = icon,
  215. LayoutArea = layoutArea,
  216. DisplayMode = displayMode,
  217. Remark = remark,
  218. CreatedAt = ct,
  219. };
  220. }