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

fix(s8): align supply detail totals with stage summary

YY968XX 1 месяц назад
Родитель
Сommit
36f7d83e60

+ 1 - 1
Web/package.json

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

+ 5 - 0
Web/src/views/aidop/s8/api/s8MonitoringApi.ts

@@ -120,16 +120,21 @@ export interface S8ProductionTrendData {
 	summary: S8DeliveryTrendSummary;
 }
 
+// S8-SUPPLY-PAGE-TYPE-TOTAL-ALIGN-1:trend day 扩为 11 类,与左侧 S3/S4/S5 stage summary 对齐
 export interface S8SupplyTrendDay {
 	date: string;
 	rawDate: string;
 	supplierEtaIssue: number;
 	supplierShipIssue: number;
+	supplierDeliveryDelayWarning: number;
 	warehouseReceiptAbnormal: number;
 	iqcIssue: number;
 	warehousePutawayIssue: number;
 	workOrderKittingAbnormal: number;
 	workOrderIssueAbnormal: number;
+	purchaseExecutionDelay: number;
+	materialStockAbnormal: number;
+	inventoryTurnoverAbnormal: number;
 	total: number;
 }
 

+ 19 - 0
Web/src/views/aidop/s8/api/s8SupplyMonitoringApi.ts

@@ -64,6 +64,25 @@ const SUPPLY_ANOMALY_SPECS = [
 		totalCellCode: 'SUPPLY_ANOMALY_PURCHASE_EXECUTION_DELAY',
 		analysisCellCode: 'SUPPLY_CAT_PURCHASE_EXECUTION_DELAY',
 	},
+	// S8-SUPPLY-PAGE-TYPE-TOTAL-ALIGN-1:补齐 S3/S5 缺失明细类型,与左侧 stage summary 对齐。
+	{
+		key: 'supplier-delivery-delay-warning',
+		label: '供应商交付延期预警',
+		totalCellCode: 'SUPPLY_ANOMALY_SUPPLIER_DELIVERY_DELAY_WARNING',
+		analysisCellCode: 'SUPPLY_CAT_SUPPLIER_DELIVERY_DELAY_WARNING',
+	},
+	{
+		key: 'material-stock-abnormal',
+		label: '物料库存异常',
+		totalCellCode: 'SUPPLY_ANOMALY_MATERIAL_STOCK_ABNORMAL',
+		analysisCellCode: 'SUPPLY_CAT_MATERIAL_STOCK_ABNORMAL',
+	},
+	{
+		key: 'inventory-turnover-abnormal',
+		label: '库存周转异常',
+		totalCellCode: 'SUPPLY_ANOMALY_INVENTORY_TURNOVER_ABNORMAL',
+		analysisCellCode: 'SUPPLY_CAT_INVENTORY_TURNOVER_ABNORMAL',
+	},
 ] as const;
 
 const EMPTY_SUMMARY: S8MonitoringSummary = { total: 0, red: 0, yellow: 0, green: 0, timeout: 0, byModule: [] };

+ 13 - 8
Web/src/views/aidop/s8/monitoring/S8MonitoringSupplyPage.vue

@@ -33,7 +33,7 @@
 				<aside class="anomaly-monitor__sidebar glass-panel">
 					<div class="section-title">
 						<div class="section-title__bar" />
-						<h2 class="section-title__text">供应异常类型</h2>
+						<h2 class="section-title__text">供应异常明细</h2>
 						</div>
 
 					<div class="anomaly-monitor__type-list">
@@ -215,14 +215,19 @@ const STAGE_META_FALLBACK = [
 	{ code: 'S5', title: '质量检测', icon: DataAnalysis as Component, metricLabel: '异常发生情况' },
 ] as const;
 
+// S8-SUPPLY-PAGE-TYPE-TOTAL-ALIGN-1:fallback 与后端 specs 对齐为 11 类,与左侧 S3/S4/S5 合计一致。
 const ANOMALY_TYPES_FALLBACK: ReadonlyArray<{ key: string; label: string }> = [
-	{ key: 'supplier-reply-delay', label: '供应商回复交期异常' },
-	{ key: 'supplier-ship-fault',  label: '供应商发货异常' },
-	{ key: 'warehouse-receipt',    label: '仓库收货异常' },
-	{ key: 'iqc-inspection',       label: 'IQC检验异常' },
-	{ key: 'warehouse-shelving',   label: '仓库上架入库异常' },
-	{ key: 'work-order-prepare',   label: '仓库工单备料异常' },
-	{ key: 'work-order-issue',     label: '仓库工单发料异常' },
+	{ key: 'supplier-reply-delay',             label: '供应商回复交期异常' },
+	{ key: 'supplier-ship-fault',              label: '供应商发货异常' },
+	{ key: 'supplier-delivery-delay-warning',  label: '供应商交付延期预警' },
+	{ key: 'warehouse-receipt',                label: '仓库收货异常' },
+	{ key: 'iqc-inspection',                   label: 'IQC检验异常' },
+	{ key: 'warehouse-shelving',               label: '仓库上架入库异常' },
+	{ key: 'work-order-prepare',               label: '仓库工单备料异常' },
+	{ key: 'work-order-issue',                 label: '仓库工单发料异常' },
+	{ key: 'purchase-execution-delay',         label: '采购执行延期' },
+	{ key: 'material-stock-abnormal',          label: '物料库存异常' },
+	{ key: 'inventory-turnover-abnormal',      label: '库存周转异常' },
 ];
 
 // S8-PROD-SUPPLY-TREND-CHART-REPLACE-DUPLICATE-SECTION-1:原 SUPPLY_CATEGORY_ICONS / CATEGORY_DEFS_FALLBACK 仅服务被替换的多维分析区,已移除。

+ 12 - 8
Web/src/views/aidop/s8/monitoring/components/S8SupplyTrendChart.vue

@@ -64,15 +64,19 @@ const avgText = computed(() => {
 });
 const todayText = computed(() => String(summary.value?.todayValue ?? 0));
 
-// 7 类完整元数据;按近 7 日总量选 Top5 非零展示,避免视觉拥挤。
+// S8-SUPPLY-PAGE-TYPE-TOTAL-ALIGN-1:11 类完整元数据,与左侧 S3/S4/S5 合计对齐;按近 N 日总量 Top5 非零展示,避免视觉拥挤。
 const ALL_SERIES_META = [
-	{ key: 'supplierEtaIssue',         name: '供应商交期异常', color: '#7bd0ff' },
-	{ key: 'supplierShipIssue',        name: '供应商发货异常', color: '#ffc107' },
-	{ key: 'warehouseReceiptAbnormal', name: '仓库收货异常',   color: '#ff9d6c' },
-	{ key: 'iqcIssue',                 name: 'IQC 检验异常',   color: '#88fd54' },
-	{ key: 'warehousePutawayIssue',    name: '仓库上架异常',   color: '#c084fc' },
-	{ key: 'workOrderKittingAbnormal', name: '工单备料异常',   color: '#f87171' },
-	{ key: 'workOrderIssueAbnormal',   name: '工单发料异常',   color: '#34d399' },
+	{ key: 'supplierEtaIssue',             name: '供应商交期异常',     color: '#7bd0ff' },
+	{ key: 'supplierShipIssue',            name: '供应商发货异常',     color: '#ffc107' },
+	{ key: 'supplierDeliveryDelayWarning', name: '供应商交付延期预警', color: '#fb7185' },
+	{ key: 'warehouseReceiptAbnormal',     name: '仓库收货异常',       color: '#ff9d6c' },
+	{ key: 'iqcIssue',                     name: 'IQC 检验异常',       color: '#88fd54' },
+	{ key: 'warehousePutawayIssue',        name: '仓库上架异常',       color: '#c084fc' },
+	{ key: 'workOrderKittingAbnormal',     name: '工单备料异常',       color: '#f87171' },
+	{ key: 'workOrderIssueAbnormal',       name: '工单发料异常',       color: '#34d399' },
+	{ key: 'purchaseExecutionDelay',       name: '采购执行延期',       color: '#a78bfa' },
+	{ key: 'materialStockAbnormal',        name: '物料库存异常',       color: '#60a5fa' },
+	{ key: 'inventoryTurnoverAbnormal',    name: '库存周转异常',       color: '#facc15' },
 ] as const;
 
 type SeriesMeta = typeof ALL_SERIES_META[number];

+ 3 - 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.116</AssemblyVersion>
-    <FileVersion>1.0.116</FileVersion>
-    <Version>1.0.116</Version>
+    <AssemblyVersion>1.0.117</AssemblyVersion>
+    <FileVersion>1.0.117</FileVersion>
+    <Version>1.0.117</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 4 - 2
server/Plugins/Admin.NET.Plugin.AiDOP/Controllers/S8/AdoS8MonitoringController.cs

@@ -49,8 +49,10 @@ public class AdoS8MonitoringController : ControllerBase
         => Ok(await _svc.GetProductionTrendAsync(tenantId, factoryId, days, period));
 
     /// <summary>
-    /// S8-PROD-SUPPLY-TREND-CHART-REPLACE-DUPLICATE-SECTION-1:Supply 页近 N 日供应异常趋势。
-    /// 口径 module_code IN (S3,S4,S5) AND exception_type_code IN 7 类供应异常。
+    /// S8-SUPPLY-PAGE-TYPE-TOTAL-ALIGN-1:Supply 页近 N 日供应异常趋势。
+    /// 口径 module_code IN (S3,S4,S5) AND exception_type_code IN 11 类供应异常
+    /// (供应商回复交期 / 供应商发货 / 供应商交付延期预警 / 仓库收货 / IQC 检验 / 仓库上架 /
+    /// 仓库工单备料 / 仓库工单发料 / 采购执行延期 / 物料库存 / 库存周转)。
     /// </summary>
     [HttpGet("supply-trend")]
     public async Task<IActionResult> GetSupplyTrendAsync(long tenantId = 1, long factoryId = 1, int days = 7, string? period = null)

+ 8 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Dto/S8/AdoS8Dtos.cs

@@ -385,11 +385,19 @@ public class AdoS8SupplyTrendDayDto
     public string RawDate { get; set; } = string.Empty;
     public int SupplierEtaIssue { get; set; }
     public int SupplierShipIssue { get; set; }
+    /// <summary>供应商交付延期预警(SUPPLIER_DELIVERY_DELAY_WARNING)当日计数</summary>
+    public int SupplierDeliveryDelayWarning { get; set; }
     public int WarehouseReceiptAbnormal { get; set; }
     public int IqcIssue { get; set; }
     public int WarehousePutawayIssue { get; set; }
     public int WorkOrderKittingAbnormal { get; set; }
     public int WorkOrderIssueAbnormal { get; set; }
+    /// <summary>采购执行延期(PURCHASE_EXECUTION_DELAY)当日计数</summary>
+    public int PurchaseExecutionDelay { get; set; }
+    /// <summary>物料库存异常(MATERIAL_STOCK_ABNORMAL)当日计数</summary>
+    public int MaterialStockAbnormal { get; set; }
+    /// <summary>库存周转异常(INVENTORY_TURNOVER_ABNORMAL)当日计数</summary>
+    public int InventoryTurnoverAbnormal { get; set; }
     public int Total { get; set; }
 }
 

+ 51 - 32
server/Plugins/Admin.NET.Plugin.AiDOP/Service/S8/S8MonitoringService.cs

@@ -544,10 +544,14 @@ public class S8MonitoringService : ITransient
     }
 
     /// <summary>
-    /// S8-PROD-SUPPLY-TREND-CHART-REPLACE-DUPLICATE-SECTION-1:Supply 页近 N 日供应异常趋势。
-    /// 口径:module_code IN (S3,S4,S5) AND exception_type_code IN 7 类(SUPPLIER_ETA_ISSUE / SUPPLIER_SHIP_ISSUE
-    /// / WAREHOUSE_RECEIPT_ABNORMAL / IQC_ISSUE / WH_PUTAWAY_ISSUE / WORK_ORDER_KITTING_ABNORMAL / WORK_ORDER_ISSUE_ABNORMAL);
-    /// 时间字段 created_at;不排除 CLOSED;按日聚合,缺失日期补 0;days 限 1-30。
+    /// S8-SUPPLY-PAGE-TYPE-TOTAL-ALIGN-1:Supply 页近 N 日供应异常趋势。
+    /// 口径:module_code IN (S3,S4,S5) AND exception_type_code IN 11 类
+    /// (SUPPLIER_ETA_ISSUE / SUPPLIER_SHIP_ISSUE / SUPPLIER_DELIVERY_DELAY_WARNING /
+    /// WAREHOUSE_RECEIPT_ABNORMAL / IQC_ISSUE / WH_PUTAWAY_ISSUE /
+    /// WORK_ORDER_KITTING_ABNORMAL / WORK_ORDER_ISSUE_ABNORMAL /
+    /// PURCHASE_EXECUTION_DELAY / MATERIAL_STOCK_ABNORMAL / INVENTORY_TURNOVER_ABNORMAL);
+    /// 时间字段 created_at;不排除 CLOSED;按日聚合,缺失日期补 0;days 限 1-30;
+    /// Total = 11 个字段之和(避免历史 bucket.Count 含未承载类型导致 total 与图线不一致)。
     /// </summary>
     public async Task<AdoS8SupplyTrendDto> GetSupplyTrendAsync(long tenantId = 1, long factoryId = 1, int days = 7, string? period = null)
     {
@@ -571,9 +575,10 @@ public class S8MonitoringService : ITransient
         var supplyModules = new[] { "S3", "S4", "S5" };
         var supplyTypes = new[]
         {
-            "SUPPLIER_ETA_ISSUE", "SUPPLIER_SHIP_ISSUE", "WAREHOUSE_RECEIPT_ABNORMAL",
-            "IQC_ISSUE", "WH_PUTAWAY_ISSUE", "WORK_ORDER_KITTING_ABNORMAL", "WORK_ORDER_ISSUE_ABNORMAL",
-            "PURCHASE_EXECUTION_DELAY"
+            "SUPPLIER_ETA_ISSUE", "SUPPLIER_SHIP_ISSUE", "SUPPLIER_DELIVERY_DELAY_WARNING",
+            "WAREHOUSE_RECEIPT_ABNORMAL", "IQC_ISSUE", "WH_PUTAWAY_ISSUE",
+            "WORK_ORDER_KITTING_ABNORMAL", "WORK_ORDER_ISSUE_ABNORMAL",
+            "PURCHASE_EXECUTION_DELAY", "MATERIAL_STOCK_ABNORMAL", "INVENTORY_TURNOVER_ABNORMAL"
         };
 
         var rows = await _rep.AsQueryable()
@@ -591,25 +596,33 @@ public class S8MonitoringService : ITransient
         {
             var d = from.AddDays(i);
             var bucket = byDate.TryGetValue(d, out var list) ? list : new();
-            var s1 = bucket.Count(r => r.ExceptionTypeCode == "SUPPLIER_ETA_ISSUE");
-            var s2 = bucket.Count(r => r.ExceptionTypeCode == "SUPPLIER_SHIP_ISSUE");
-            var s3 = bucket.Count(r => r.ExceptionTypeCode == "WAREHOUSE_RECEIPT_ABNORMAL");
-            var s4 = bucket.Count(r => r.ExceptionTypeCode == "IQC_ISSUE");
-            var s5 = bucket.Count(r => r.ExceptionTypeCode == "WH_PUTAWAY_ISSUE");
-            var s6 = bucket.Count(r => r.ExceptionTypeCode == "WORK_ORDER_KITTING_ABNORMAL");
-            var s7 = bucket.Count(r => r.ExceptionTypeCode == "WORK_ORDER_ISSUE_ABNORMAL");
+            var sEta  = bucket.Count(r => r.ExceptionTypeCode == "SUPPLIER_ETA_ISSUE");
+            var sShip = bucket.Count(r => r.ExceptionTypeCode == "SUPPLIER_SHIP_ISSUE");
+            var sDdw  = bucket.Count(r => r.ExceptionTypeCode == "SUPPLIER_DELIVERY_DELAY_WARNING");
+            var whR   = bucket.Count(r => r.ExceptionTypeCode == "WAREHOUSE_RECEIPT_ABNORMAL");
+            var iqc   = bucket.Count(r => r.ExceptionTypeCode == "IQC_ISSUE");
+            var whP   = bucket.Count(r => r.ExceptionTypeCode == "WH_PUTAWAY_ISSUE");
+            var woK   = bucket.Count(r => r.ExceptionTypeCode == "WORK_ORDER_KITTING_ABNORMAL");
+            var woI   = bucket.Count(r => r.ExceptionTypeCode == "WORK_ORDER_ISSUE_ABNORMAL");
+            var ped   = bucket.Count(r => r.ExceptionTypeCode == "PURCHASE_EXECUTION_DELAY");
+            var msa   = bucket.Count(r => r.ExceptionTypeCode == "MATERIAL_STOCK_ABNORMAL");
+            var ita   = bucket.Count(r => r.ExceptionTypeCode == "INVENTORY_TURNOVER_ABNORMAL");
             dayList.Add(new AdoS8SupplyTrendDayDto
             {
-                Date                       = d.ToString("MM/dd"),
-                RawDate                    = d.ToString("yyyy-MM-dd"),
-                SupplierEtaIssue           = s1,
-                SupplierShipIssue          = s2,
-                WarehouseReceiptAbnormal   = s3,
-                IqcIssue                   = s4,
-                WarehousePutawayIssue      = s5,
-                WorkOrderKittingAbnormal   = s6,
-                WorkOrderIssueAbnormal     = s7,
-                Total                      = bucket.Count,
+                Date                          = d.ToString("MM/dd"),
+                RawDate                       = d.ToString("yyyy-MM-dd"),
+                SupplierEtaIssue              = sEta,
+                SupplierShipIssue             = sShip,
+                SupplierDeliveryDelayWarning  = sDdw,
+                WarehouseReceiptAbnormal      = whR,
+                IqcIssue                      = iqc,
+                WarehousePutawayIssue         = whP,
+                WorkOrderKittingAbnormal      = woK,
+                WorkOrderIssueAbnormal        = woI,
+                PurchaseExecutionDelay        = ped,
+                MaterialStockAbnormal         = msa,
+                InventoryTurnoverAbnormal     = ita,
+                Total                         = sEta + sShip + sDdw + whR + iqc + whP + woK + woI + ped + msa + ita,
             });
         }
 
@@ -666,14 +679,20 @@ public class S8MonitoringService : ITransient
             },
             "SUPPLY" => new (string, string, string)[]
             {
-                ("supplier-reply-delay",   "供应商回复交期异常", "SUPPLIER_ETA_ISSUE"),
-                ("supplier-ship-fault",    "供应商发货异常",     "SUPPLIER_SHIP_ISSUE"),
-                ("warehouse-receipt",      "仓库收货异常",       "WAREHOUSE_RECEIPT_ABNORMAL"),
-                ("iqc-inspection",         "IQC 检验异常",       "IQC_ISSUE"),
-                ("warehouse-shelving",     "仓库上架入库异常",   "WH_PUTAWAY_ISSUE"),
-                ("work-order-prepare",     "仓库工单备料异常",   "WORK_ORDER_KITTING_ABNORMAL"),
-                ("work-order-issue",       "仓库工单发料异常",   "WORK_ORDER_ISSUE_ABNORMAL"),
-                ("purchase-execution-delay", "采购执行延期",     "PURCHASE_EXECUTION_DELAY"),
+                // S8-SUPPLY-PAGE-TYPE-TOTAL-ALIGN-1:SUPPLY 大屏明细 11 类,与左侧 S3/S4/S5 stage summary 对齐。
+                // 新增 SUPPLIER_DELIVERY_DELAY_WARNING (S3) / MATERIAL_STOCK_ABNORMAL (S5) / INVENTORY_TURNOVER_ABNORMAL (S5),
+                // 显示名沿用 DB type_name 既有命名,不改 ado_s8_exception_type.type_name。
+                ("supplier-reply-delay",           "供应商回复交期异常",   "SUPPLIER_ETA_ISSUE"),
+                ("supplier-ship-fault",            "供应商发货异常",       "SUPPLIER_SHIP_ISSUE"),
+                ("supplier-delivery-delay-warning","供应商交付延期预警",   "SUPPLIER_DELIVERY_DELAY_WARNING"),
+                ("warehouse-receipt",              "仓库收货异常",         "WAREHOUSE_RECEIPT_ABNORMAL"),
+                ("iqc-inspection",                 "IQC 检验异常",         "IQC_ISSUE"),
+                ("warehouse-shelving",             "仓库上架入库异常",     "WH_PUTAWAY_ISSUE"),
+                ("work-order-prepare",             "仓库工单备料异常",     "WORK_ORDER_KITTING_ABNORMAL"),
+                ("work-order-issue",               "仓库工单发料异常",     "WORK_ORDER_ISSUE_ABNORMAL"),
+                ("purchase-execution-delay",       "采购执行延期",         "PURCHASE_EXECUTION_DELAY"),
+                ("material-stock-abnormal",        "物料库存异常",         "MATERIAL_STOCK_ABNORMAL"),
+                ("inventory-turnover-abnormal",    "库存周转异常",         "INVENTORY_TURNOVER_ABNORMAL"),
             },
             _ => Array.Empty<(string, string, string)>(),
         };