Просмотр исходного кода

fix(s8): align process dashboard with module code

S8-PROCESS-NODE-MODULE-CODE-ALIGNMENT-EXEC-1:当前阶段 process_node_code 挂起,
Dashboard「流程环节」改由 module_code 驱动;预留字段 / DTO / ResolveProcessNodeCode
函数 / 列表查询入参作未来更细流程节点扩展用。

- S8ManualReportService 三处建单点不再写 ProcessNodeCode(保留 ResolveProcessNodeCode 函数)
- S8DashboardService byProcess GroupBy 切换为 ModuleCode(不再过滤 NULL)
- S8DashboardService dim-trends keySelector "process" 改读 ModuleCode
- S8DashboardPage drill-down 表单/柱子点击 改传 moduleCode
YY968XX 1 месяц назад
Родитель
Сommit
efed940bb7

+ 5 - 2
Web/src/views/aidop/s8/dashboard/S8DashboardPage.vue

@@ -376,14 +376,17 @@ async function loadDetail() {
 	if (beginStr) params.beginTime = beginStr;
 	if (endStr) params.endTime = endStr;
 	if (filter.extra) {
-		if (activePanel.value === 'process') params.processNodeCode = filter.extra;
+		// S8-PROCESS-NODE-MODULE-CODE-ALIGNMENT-EXEC-1:process 维度 drill-down 改传 moduleCode
+		// (后端 byProcess 已切到 module_code 聚合;process_node_code 挂起留给未来细化节点)。
+		if (activePanel.value === 'process') params.moduleCode = filter.extra;
 		if (activePanel.value === 'occurrence') params.deptId = filter.extra;
 		if (activePanel.value === 'responsible') params.deptId = filter.extra;
 	}
 	if (chartDrillValue.value) {
 		if (activePanel.value === 'responsible') params.deptId = findDeptId(chartDrillValue.value, 'responsible');
 		if (activePanel.value === 'occurrence')  params.deptId = findDeptId(chartDrillValue.value, 'occurrence');
-		if (activePanel.value === 'process')     params.processNodeCode = findProcessCode(chartDrillValue.value);
+		// findProcessCode 返回 byProcess.key;后端切换后 key === module_code。
+		if (activePanel.value === 'process')     params.moduleCode = findProcessCode(chartDrillValue.value);
 		if (activePanel.value === 'object')      params.relatedObjectCode = chartDrillValue.value;
 	}
 	try {

+ 11 - 6
server/Plugins/Admin.NET.Plugin.AiDOP/Service/S8/S8DashboardService.cs

@@ -92,7 +92,8 @@ public class S8DashboardService : ITransient
                 x.Severity,
                 x.ResponsibleDeptId,
                 x.OccurrenceDeptId,
-                x.ProcessNodeCode,
+                // S8-PROCESS-NODE-MODULE-CODE-ALIGNMENT-EXEC-1:byProcess 改用 module_code 聚合。
+                x.ModuleCode,
                 x.RelatedObjectCode,
             })
             .ToListAsync();
@@ -141,9 +142,11 @@ public class S8DashboardService : ITransient
                     deptName = deptDict.GetValueOrDefault(g.Key, g.Key.ToString()),
                     count = g.Count(),
                 }),
+            // S8-PROCESS-NODE-MODULE-CODE-ALIGNMENT-EXEC-1:当前阶段「流程环节」按 module_code 聚合
+            // (process_node_code 已挂起,留给未来更细流程节点)。
+            // module_code 已经过 S1-S7 过滤(见 line 87 Where(S8ModuleCode.All.Contains(...))),无需再 NULL 兜底。
             byProcess = list
-                .Where(x => x.ProcessNodeCode != null)
-                .GroupBy(x => x.ProcessNodeCode!)
+                .GroupBy(x => x.ModuleCode)
                 .Select(g => new
                 {
                     key = g.Key,
@@ -206,7 +209,8 @@ public class S8DashboardService : ITransient
             .Select(x => new
             {
                 x.CreatedAt,
-                x.ProcessNodeCode,
+                // S8-PROCESS-NODE-MODULE-CODE-ALIGNMENT-EXEC-1:dim=process 改用 module_code 聚合。
+                x.ModuleCode,
                 x.RelatedObjectCode,
                 x.OccurrenceDeptId,
                 x.ResponsibleDeptId,
@@ -221,10 +225,11 @@ public class S8DashboardService : ITransient
 
         // 按维度取 key 函数
         // S8-DASHBOARD-BYOBJECT-NULL-BUCKET-1:object 维度 NULL/空白统一归入"未关联",与 byObject 口径一致;
-        // process 维度沿用历史"未设置",本次不扩大。
+        // process 维度沿用历史"未设置"作为兜底(理论不会命中:上方 Where 已限定 module_code IN S1-S7)。
+        // S8-PROCESS-NODE-MODULE-CODE-ALIGNMENT-EXEC-1:process 改用 module_code(process_node_code 挂起)。
         Func<dynamic, string> keySelector = dim switch
         {
-            "process"  => r => r.ProcessNodeCode ?? "未设置",
+            "process"  => r => r.ModuleCode ?? "未设置",
             "occDept"  => r => r.OccurrenceDeptId.ToString(),
             "respDept" => r => r.ResponsibleDeptId.ToString(),
             _          => r => NormalizeRelatedObjectCode((string?)r.RelatedObjectCode),   // object

+ 11 - 5
server/Plugins/Admin.NET.Plugin.AiDOP/Service/S8/S8ManualReportService.cs

@@ -19,6 +19,8 @@ public class S8ManualReportService : ITransient
 
     // S8-PROCESS-NODE-S1S7-ALIGN-1:process_node_code 当前阶段对齐 S1-S7 订单主流程。
     // 优先 module_code(已是 S1-S7),其次按 scene_code 反推;都无法识别则 null。
+    // S8-PROCESS-NODE-MODULE-CODE-ALIGNMENT-EXEC-1:保留函数挂起待用——本阶段所有建单点不再调用,
+    // 由 module_code 承担 S1-S7 主流程归属;未来引入更细流程节点(如 S2.PLAN / S6.WO_RELEASE)时恢复使用。
     private static string? ResolveProcessNodeCode(string? sceneCode, string? moduleCode)
     {
         if (!string.IsNullOrWhiteSpace(moduleCode) && S8ModuleCode.All.Contains(moduleCode))
@@ -231,7 +233,9 @@ public class S8ManualReportService : ITransient
             ReporterId = currentUserId,
             ExceptionTypeCode = inferredType,
             ModuleCode = resolvedModule,
-            ProcessNodeCode = ResolveProcessNodeCode(dto.SceneCode.Trim(), resolvedModule),
+            // S8-PROCESS-NODE-MODULE-CODE-ALIGNMENT-EXEC-1:当前阶段 process_node_code 留空,
+            // module_code 承担 S1-S7 主流程归属;process_node_code 留给未来更细流程节点。
+            ProcessNodeCode = null,
             CreatedAt = DateTime.Now,
             IsDeleted = false
         };
@@ -318,8 +322,9 @@ public class S8ManualReportService : ITransient
             // G-01 首版唯一异常类型映射(baseline 已迁后 EQUIP_FAULT 属 S2 制造协同场景)。
             ExceptionTypeCode = "EQUIP_FAULT",
             ModuleCode = resolvedModule,
-            // S8-PROCESS-NODE-S1S7-ALIGN-1:process_node_code 与 module 对齐 S1-S7。
-            ProcessNodeCode = ResolveProcessNodeCode(S8SceneCode.S2, resolvedModule),
+            // S8-PROCESS-NODE-MODULE-CODE-ALIGNMENT-EXEC-1:当前阶段 process_node_code 留空,
+            // module_code 承担 S1-S7 主流程归属;process_node_code 留给未来更细流程节点。
+            ProcessNodeCode = null,
             // 追溯三件套(自动建单必填口径)。
             SourceRuleId = hit.SourceRuleId,
             SourceDataSourceId = hit.DataSourceId,
@@ -400,8 +405,9 @@ public class S8ManualReportService : ITransient
             IsDeleted = false,
             ExceptionTypeCode = hit.ExceptionTypeCode,
             ModuleCode = resolvedModule,
-            // S8-PROCESS-NODE-S1S7-ALIGN-1:process_node_code 与 module 对齐 S1-S7。
-            ProcessNodeCode = ResolveProcessNodeCode(effectiveScene, resolvedModule),
+            // S8-PROCESS-NODE-MODULE-CODE-ALIGNMENT-EXEC-1:当前阶段 process_node_code 留空,
+            // module_code 承担 S1-S7 主流程归属;process_node_code 留给未来更细流程节点。
+            ProcessNodeCode = null,
             SourceRuleId = hit.SourceRuleId,
             SourceDataSourceId = hit.DataSourceId == 0 ? null : hit.DataSourceId,
             SourcePayload = hit.SourcePayload,