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

feat(kpi): 3 个人效 KPI 月度维度化 + 自动跑批 + 筛选路由 (server 1.0.292)

S5_L1_003/S6_L2_003/S7_L1_003 成品/物料/工单人效按 biz_month 维度化:
- 1.0.292.sql:3 维度配置幂等固化,读各自 dwd_*_efficiency(与 SUMMARY 同源),SupportedDimensions=[biz_month]、RATIO_OF_SUMS,动态绑定当前汇总;铁律=人数为月度全岗总数(count gw)、每月 1 行、绝不分摊/复制/兜底 headcount。
- S5/S6/S7 转换服务:SUMMARY 成功后触发对应月度 DIMENSION 跑批(月末派生 biz_month,复用 KpiDimensionRunService,无 per-KPI 服务)。
- SmartOpsFilter.cs:3 码纳入配置化维度受管,筛选走维度结果,NO_DATA/版本不匹配不回落 Atomic。
不改人效业务公式;缺月人数时 metric_value=NULL 落 —,不伪造。
YY968XX 1 неделя назад
Родитель
Сommit
4e0372b4ce

+ 6 - 3
server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -11,9 +11,9 @@
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <Copyright>Admin.NET</Copyright>
     <Description>Admin.NET ͨ��Ȩ�޿���ƽ̨</Description>
-    <AssemblyVersion>1.0.291</AssemblyVersion>
-    <FileVersion>1.0.291</FileVersion>
-    <Version>1.0.291</Version>
+    <AssemblyVersion>1.0.292</AssemblyVersion>
+    <FileVersion>1.0.292</FileVersion>
+    <Version>1.0.292</Version>
   </PropertyGroup>
 
   <ItemGroup>
@@ -271,6 +271,9 @@
     <None Update="UpdateScripts\1.0.290.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="UpdateScripts\1.0.292.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 
   <ItemGroup>

+ 59 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.292.sql

@@ -0,0 +1,59 @@
+-- AIDOP-S567-HUMAN-EFFICIENCY-AND-S6-DASHBOARD-CLOSEOUT-1:3 个人效 KPI 月度维度配置生产固化(幂等)。
+-- S5_L1_003 物料仓储人效 / S6_L2_003 工单制造人效 / S7_L1_003 成品仓储人效。
+-- 铁律:人数为月度全岗总数(count gw),dwd 每 biz_month 仅 1 行,只支持 biz_month,绝不分摊/复制 headcount。
+-- 各 DIMENSION_SQL 与对应 SUMMARY 同源(读同一 dwd_*_efficiency),仅按 biz_month 输出标准维度契约;未改业务公式。
+-- 动态绑定当前生效 SUMMARY(不写死 Id);已有当前生效维度配置则跳过(NOT EXISTS IsCurrent=1)。幂等:重复执行影响行 0。
+
+-- ───────── S5_L1_003 物料仓储人效(月 · biz_month · RATIO_OF_SUMS)─────────
+INSERT INTO ado_smart_ops_kpi_dimension_config
+  (`TenantId`,`MetricCode`,`ModuleCode`,`SummaryConfigId`,`SummaryConfigVersion`,`DimensionConfigVersion`,
+   `DataSourceCode`,`SqlScript`,`AggregationType`,`SupportedDimensionsJson`,`TimeoutSeconds`,`PublishStatus`,`IsCurrent`,`BusinessSqlSource`,`ChangeRemark`,`Remark`,`CreatedBy`,`CreatedAt`)
+SELECT s.`TenantId`,'S5_L1_003','S5',s.`Id`,s.`VersionNo`,1,'MDP_LOCAL',
+'SELECT STR_TO_DATE(CONCAT(biz_month, ''-01''), ''%Y-%m-%d'') AS value_date, ''BIZ_MONTH'' AS dimension_type,
+       biz_month AS dimension_code, CONCAT(SUBSTRING(biz_month, 1, 4), ''年'', SUBSTRING(biz_month, 6, 2), ''月'') AS dimension_name,
+       efficiency AS metric_value, online_qty AS numerator, warehouse_headcount AS denominator,
+       online_qty AS sum_value, warehouse_headcount AS sample_count, CONCAT(''S5_L1_003:'', biz_month) AS source_key
+FROM dwd_t8_material_warehouse_efficiency
+WHERE tenant_id = @tenant_id AND factory_id = @factory_id AND source_ztid = @ztid AND biz_month = DATE_FORMAT(@biz_date, ''%Y-%m'')
+GROUP BY biz_month',
+'RATIO_OF_SUMS','["biz_month"]',60,'PUBLISHED',1,'SUMMARY S5_L1_003 同源 dwd_t8_material_warehouse_efficiency 月度全仓管人效(不分摊)','生产固化:物料仓储人效按月度维度','S5_L1_003 维度配置生产初始化','system',NOW()
+FROM ado_smart_ops_kpi_calc_config s
+WHERE s.`MetricCode`='S5_L1_003' AND s.`IsCurrent`=1 AND s.`PublishStatus`='PUBLISHED'
+  AND NOT EXISTS (SELECT 1 FROM ado_smart_ops_kpi_dimension_config d WHERE d.`MetricCode`='S5_L1_003' AND d.`TenantId`=s.`TenantId` AND d.`IsCurrent`=1)
+LIMIT 1;
+
+-- ───────── S6_L2_003 工单制造人效(月 · biz_month · RATIO_OF_SUMS)─────────
+INSERT INTO ado_smart_ops_kpi_dimension_config
+  (`TenantId`,`MetricCode`,`ModuleCode`,`SummaryConfigId`,`SummaryConfigVersion`,`DimensionConfigVersion`,
+   `DataSourceCode`,`SqlScript`,`AggregationType`,`SupportedDimensionsJson`,`TimeoutSeconds`,`PublishStatus`,`IsCurrent`,`BusinessSqlSource`,`ChangeRemark`,`Remark`,`CreatedBy`,`CreatedAt`)
+SELECT s.`TenantId`,'S6_L2_003','S6',s.`Id`,s.`VersionNo`,1,'MDP_LOCAL',
+'SELECT STR_TO_DATE(CONCAT(biz_month, ''-01''), ''%Y-%m-%d'') AS value_date, ''BIZ_MONTH'' AS dimension_type,
+       biz_month AS dimension_code, CONCAT(SUBSTRING(biz_month, 1, 4), ''年'', SUBSTRING(biz_month, 6, 2), ''月'') AS dimension_name,
+       efficiency AS metric_value, done_count AS numerator, production_headcount AS denominator,
+       done_count AS sum_value, production_headcount AS sample_count, CONCAT(''S6_L2_003:'', biz_month) AS source_key
+FROM dwd_t8_work_order_mfg_efficiency
+WHERE tenant_id = @tenant_id AND factory_id = @factory_id AND source_ztid = @ztid AND biz_month = DATE_FORMAT(@biz_date, ''%Y-%m'')
+GROUP BY biz_month',
+'RATIO_OF_SUMS','["biz_month"]',60,'PUBLISHED',1,'SUMMARY S6_L2_003 同源 dwd_t8_work_order_mfg_efficiency 月度全生产人效(不分摊)','生产固化:工单制造人效按月度维度','S6_L2_003 维度配置生产初始化','system',NOW()
+FROM ado_smart_ops_kpi_calc_config s
+WHERE s.`MetricCode`='S6_L2_003' AND s.`IsCurrent`=1 AND s.`PublishStatus`='PUBLISHED'
+  AND NOT EXISTS (SELECT 1 FROM ado_smart_ops_kpi_dimension_config d WHERE d.`MetricCode`='S6_L2_003' AND d.`TenantId`=s.`TenantId` AND d.`IsCurrent`=1)
+LIMIT 1;
+
+-- ───────── S7_L1_003 成品仓储人效(月 · biz_month · RATIO_OF_SUMS)─────────
+INSERT INTO ado_smart_ops_kpi_dimension_config
+  (`TenantId`,`MetricCode`,`ModuleCode`,`SummaryConfigId`,`SummaryConfigVersion`,`DimensionConfigVersion`,
+   `DataSourceCode`,`SqlScript`,`AggregationType`,`SupportedDimensionsJson`,`TimeoutSeconds`,`PublishStatus`,`IsCurrent`,`BusinessSqlSource`,`ChangeRemark`,`Remark`,`CreatedBy`,`CreatedAt`)
+SELECT s.`TenantId`,'S7_L1_003','S7',s.`Id`,s.`VersionNo`,1,'MDP_LOCAL',
+'SELECT STR_TO_DATE(CONCAT(biz_month, ''-01''), ''%Y-%m-%d'') AS value_date, ''BIZ_MONTH'' AS dimension_type,
+       biz_month AS dimension_code, CONCAT(SUBSTRING(biz_month, 1, 4), ''年'', SUBSTRING(biz_month, 6, 2), ''月'') AS dimension_name,
+       efficiency AS metric_value, shipment_qty AS numerator, warehouse_headcount AS denominator,
+       shipment_qty AS sum_value, warehouse_headcount AS sample_count, CONCAT(''S7_L1_003:'', biz_month) AS source_key
+FROM dwd_t8_finished_warehouse_efficiency
+WHERE tenant_id = @tenant_id AND factory_id = @factory_id AND source_ztid = @ztid AND biz_month = DATE_FORMAT(@biz_date, ''%Y-%m'')
+GROUP BY biz_month',
+'RATIO_OF_SUMS','["biz_month"]',60,'PUBLISHED',1,'SUMMARY S7_L1_003 同源 dwd_t8_finished_warehouse_efficiency 月度全仓管人效(不分摊)','生产固化:成品仓储人效按月度维度','S7_L1_003 维度配置生产初始化','system',NOW()
+FROM ado_smart_ops_kpi_calc_config s
+WHERE s.`MetricCode`='S7_L1_003' AND s.`IsCurrent`=1 AND s.`PublishStatus`='PUBLISHED'
+  AND NOT EXISTS (SELECT 1 FROM ado_smart_ops_kpi_dimension_config d WHERE d.`MetricCode`='S7_L1_003' AND d.`TenantId`=s.`TenantId` AND d.`IsCurrent`=1)
+LIMIT 1;

+ 2 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/AidopKanbanController.SmartOpsFilter.cs

@@ -15,6 +15,8 @@ public partial class AidopKanbanController
             "S7_L1_001",
             // 剩余 8 KPI 第一批 5 个 FULLY(日期/月 + 真实业务维度)
             "S5_L1_001", "S5_L1_002", "S5_L1_004", "S6_L2_002", "S7_L1_002",
+            // 3 个人效 KPI(月度 biz_month,RATIO_OF_SUMS,月度全岗人数不分摊)
+            "S5_L1_003", "S6_L2_003", "S7_L1_003",
         };
 
     private sealed record DashboardValuesBundle(

+ 14 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/FinishedWarehouse/S7MdpSyncTransformService.cs

@@ -365,6 +365,20 @@ ON DUPLICATE KEY UPDATE
             ? await UpsertKpiValueAsync("S7_L1_003", option.MonthlyPeriodEnd, dispatch.MetricValue, now, option)
             : 0;
         sub.DenominatorStatus = dispatch.DenominatorStatus;
+
+        // 调度:SUMMARY 成功/NO_DATA 后触发人效月度 DIMENSION 跑批(月度:@biz_date=月末派生 biz_month)。
+        if (dispatch.ShouldUpsert)
+        {
+            try
+            {
+                await _dimensionRun.RunDimensionAsync(
+                    "S7_L1_003", ModuleCode, option.TargetTenantId, option.MonthlyPeriodEnd, batchId, triggerType, ct);
+            }
+            catch (Exception ex)
+            {
+                _logger.LogWarning(ex, "S7_L1_003 维度跑批异常(不影响汇总链路)");
+            }
+        }
         return sub;
     }
 

+ 14 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Manufacturing/S6MdpSyncTransformService.cs

@@ -267,6 +267,20 @@ ON DUPLICATE KEY UPDATE
             ? await UpsertKpiValueAsync("S6_L2_003", option.MonthlyPeriodEnd, dispatch.MetricValue, now, option, L2ValueTable)
             : 0;
         sub.DenominatorStatus = dispatch.DenominatorStatus;
+
+        // 调度:SUMMARY 成功/NO_DATA 后触发人效月度 DIMENSION 跑批(月度:@biz_date=月末派生 biz_month)。
+        if (dispatch.ShouldUpsert)
+        {
+            try
+            {
+                await _dimensionRun.RunDimensionAsync(
+                    "S6_L2_003", ModuleCode, option.TargetTenantId, option.MonthlyPeriodEnd, batchId, triggerType, ct);
+            }
+            catch (Exception ex)
+            {
+                _logger.LogWarning(ex, "S6_L2_003 维度跑批异常(不影响汇总链路)");
+            }
+        }
         return sub;
     }
 

+ 14 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/MaterialWarehouse/S5MdpSyncTransformService.cs

@@ -401,6 +401,20 @@ ON DUPLICATE KEY UPDATE
             ? await UpsertKpiValueAsync("S5_L1_003", option.MonthlyPeriodEnd, dispatch.MetricValue, now, option)
             : 0;
         sub.DenominatorStatus = dispatch.DenominatorStatus;
+
+        // 调度:SUMMARY 成功/NO_DATA 后触发人效月度 DIMENSION 跑批(月度:@biz_date=月末派生 biz_month,与 SUMMARY 同月)。
+        if (dispatch.ShouldUpsert)
+        {
+            try
+            {
+                await _dimensionRun.RunDimensionAsync(
+                    "S5_L1_003", ModuleCode, option.TargetTenantId, option.MonthlyPeriodEnd, batchId, triggerType, ct);
+            }
+            catch (Exception ex)
+            {
+                _logger.LogWarning(ex, "S5_L1_003 维度跑批异常(不影响汇总链路)");
+            }
+        }
         return sub;
     }