Parcourir la source

feat(kpi): migrate S5_L1_004 to CONFIG_SQL + fix calc-config panel unwrap

- S5_L1_004 品类物料库存周转: LEGACY_TVF -> CONFIG_SQL (MDP_LOCAL, reads
  dwd_t8_material_inventory_turnover AVG(turnover_days)); TVF retained as
  data-prep; v1 kept as rollback; result equivalent to legacy (both NO_DATA).
- fix: KPI calc-config panel/run-log/business-input unwrap missed the .result
  layer of the response envelope, leaving version list / current engine / run
  history empty and throwing render errors (kpiMaster.vue, KpiRunLog.vue,
  KpiBusinessInput.vue).
- bump version Web 2.4.265 / server 1.0.282
YY968XX il y a 1 semaine
Parent
commit
77963eaadc

+ 1 - 1
Web/package.json

@@ -1,7 +1,7 @@
 {
 {
   "name": "admin.net",
   "name": "admin.net",
   "type": "module",
   "type": "module",
-  "version": "2.4.264",
+  "version": "2.4.265",
   "packageManager": "pnpm@10.32.1",
   "packageManager": "pnpm@10.32.1",
   "lastBuildTime": "2026.03.15",
   "lastBuildTime": "2026.03.15",
   "description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",
   "description": "Admin.NET 站在巨人肩膀上的 .NET 通用权限开发框架",

+ 2 - 1
Web/src/views/aidop/kanban/components/KpiBusinessInput.vue

@@ -94,7 +94,8 @@ const STATUS_META: Record<string, { label: string; type: 'info' | 'warning' | 's
 const statusMeta = computed(() => STATUS_META[model.businessInputStatus] || STATUS_META.PENDING_BUSINESS_FIELDS);
 const statusMeta = computed(() => STATUS_META[model.businessInputStatus] || STATUS_META.PENDING_BUSINESS_FIELDS);
 
 
 function unwrap(res: any) {
 function unwrap(res: any) {
-	return (res as any)?.data ?? res;
+	// service 拦截器返回完整 axios 响应,res.data 为统一信封 {code,type,message,result},需再取 result
+	return (res as any)?.data?.result ?? (res as any)?.data ?? res;
 }
 }
 
 
 function apply(d: any) {
 function apply(d: any) {

+ 2 - 1
Web/src/views/aidop/kanban/components/KpiRunLog.vue

@@ -63,7 +63,8 @@ const pageSize = ref(20);
 const statusFilter = ref('');
 const statusFilter = ref('');
 
 
 function unwrap(res: any) {
 function unwrap(res: any) {
-	return (res as any)?.data ?? res;
+	// service 拦截器返回完整 axios 响应,res.data 为统一信封 {code,type,message,result},需再取 result
+	return (res as any)?.data?.result ?? (res as any)?.data ?? res;
 }
 }
 
 
 function statusType(s: string): 'success' | 'info' | 'danger' {
 function statusType(s: string): 'success' | 'info' | 'danger' {

+ 2 - 1
Web/src/views/aidop/kanban/kpiMaster.vue

@@ -568,7 +568,8 @@ FROM dwd_example
 WHERE tenant_id = @tenant_id AND factory_id = @factory_id AND biz_date = @biz_date AND source_ztid = @ztid`;
 WHERE tenant_id = @tenant_id AND factory_id = @factory_id AND biz_date = @biz_date AND source_ztid = @ztid`;
 
 
 function unwrapRes(res: any) {
 function unwrapRes(res: any) {
-	return (res as any)?.data ?? res;
+	// service 拦截器返回完整 axios 响应,res.data 为统一信封 {code,type,message,result},需再取 result
+	return (res as any)?.data?.result ?? (res as any)?.data ?? res;
 }
 }
 
 
 function newDraft() {
 function newDraft() {

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

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

+ 27 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.282.sql

@@ -0,0 +1,27 @@
+-- AIDOP-S567-KPI-T8-SQL-CONFIG-MIGRATION-1:S5_L1_004 品类物料库存周转 收口迁移 CONFIG_SQL。
+-- 背景:S5/S6/S7 现有 9 个 KPI 中 8 个已是 CONFIG_SQL/MDP_LOCAL(读已准备好的 dwd_t8_*),
+--       唯 S5_L1_004 仍 LEGACY_TVF(1.0.279.sql 当时判定"不迁",本批经 CTO 拍板按范式 A 收口)。
+-- 范式 A(与 8 个兄弟一致):TVF dbo.Rep_总账_存货_V3 保留为数据准备(BuildS5L1004 写 dwd_t8_material_inventory_turnover),
+--       最终汇总(AVG(turnover_days))改由 MDP_LOCAL CONFIG_SQL 读该 dwd,不扩执行器、不直连 T8、不改任何业务公式。
+-- 等价性:legacy 现状 = AVG(turnover_days),当前 turnover_days 全 NULL → legacy 实跑 NO_DATA;
+--       CONFIG_SQL AVG(turnover_days) 同为 NO_DATA(逐项等价,见验收对账)。
+-- 表列 PascalCase(EnableUnderLine=false);租户=AIDOP 运行租户 797403760988229。
+-- 幂等:先把 v1 IsCurrent 置 0(保留 PUBLISHED 作回滚),再 INSERT ... WHERE NOT EXISTS 建 v2;重复执行影响行 0。
+-- 绑定参数由运行时注入:@tenant_id/@factory_id/@biz_date/@ztid(月度 KPI @biz_date=月末,DATE_FORMAT 取 YYYY-MM)。
+
+-- ① v1 LEGACY_TVF 退出当前生效(保留为回滚版本,PublishStatus 仍 PUBLISHED)
+UPDATE ado_smart_ops_kpi_calc_config
+SET `IsCurrent` = 0
+WHERE `MetricCode` = 'S5_L1_004' AND `TenantId` = 797403760988229 AND `VersionNo` = 1 AND `IsCurrent` = 1;
+
+-- ② v2 CONFIG_SQL 成为当前生效:读本地 dwd 月行 turnover_days 均值(排除 NULL),MDP_LOCAL 只读执行器
+INSERT INTO ado_smart_ops_kpi_calc_config
+  (`TenantId`,`MetricCode`,`ModuleCode`,`VersionNo`,`CalcEngineType`,`DataSourceCode`,`SqlScript`,`TimeoutSeconds`,`PublishStatus`,`IsCurrent`,`Remark`,`CreatedBy`,`CreatedAt`)
+SELECT 797403760988229,'S5_L1_004','S5',2,'CONFIG_SQL','MDP_LOCAL',
+'SELECT ROUND(AVG(turnover_days), 4) AS metric_value, COUNT(*) AS numerator_value
+FROM dwd_t8_material_inventory_turnover
+WHERE tenant_id = @tenant_id AND factory_id = @factory_id
+  AND biz_month = DATE_FORMAT(@biz_date, ''%Y-%m'') AND source_ztid = @ztid
+  AND turnover_days IS NOT NULL',
+30,'PUBLISHED',1,'CONFIG_SQL:读 dwd 月行 turnover_days 均值(排除 NULL),1:1 复刻 legacy AVG(turnover_days);TVF 仅作数据准备;turnover_days 全 NULL 时→NO_DATA,与 legacy 现状同为 NO_DATA','system',NOW()
+FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM ado_smart_ops_kpi_calc_config WHERE `MetricCode`='S5_L1_004' AND `TenantId`=797403760988229 AND `VersionNo`=2);