Преглед на файлове

feat(s8): t1c add 3 indexes on ado_s8_exception for order-flow lookup

YY968XX преди 1 месец
родител
ревизия
b5a6001603
променени са 2 файла, в които са добавени 79 реда и са изтрити 0 реда
  1. 76 0
      scripts/migrations/20260512_s8_exception_indexes.sql
  2. 3 0
      server/Plugins/Admin.NET.Plugin.AiDOP/Entity/S8/AdoS8Exception.cs

+ 76 - 0
scripts/migrations/20260512_s8_exception_indexes.sql

@@ -0,0 +1,76 @@
+-- ORDER-FLOW-S8-INTEGRATED-DOMAIN-RESET-1 t1c
+-- Target table: ado_s8_exception
+-- Purpose: add 3 indexes for order-flow related exception queries
+--          (related_object_code aggregation, order_flow_code filter,
+--           related+flow joint lookup for chain drill-down).
+--
+-- Path: A (SugarIndex Attribute in AdoS8Exception.cs) is primary.
+-- This SQL file is path B: aidopdev fallback if CodeFirst skips
+-- pre-existing tables. Idempotent via pre-check SELECT against
+-- INFORMATION_SCHEMA.STATISTICS (MySQL 8 has no CREATE INDEX IF NOT EXISTS).
+--
+-- Usage:
+--   1. Run the 3 pre-check SELECTs below; skip the matching CREATE INDEX
+--      when the SELECT returns >0 rows.
+--   2. Or run the 3 CREATE INDEX statements directly; MySQL will error
+--      "Duplicate key name" if the index already exists, which is safe.
+--   3. This file does NOT touch column types, data rows, or other indexes.
+
+-- =========================================================================
+-- Pre-check (run first; non-destructive)
+-- =========================================================================
+
+-- Pre-check A: idx_s8_exception_related_object_code
+SELECT COUNT(*) AS exists_related_object_code
+FROM INFORMATION_SCHEMA.STATISTICS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME = 'ado_s8_exception'
+  AND INDEX_NAME = 'idx_s8_exception_related_object_code';
+
+-- Pre-check B: idx_s8_exception_order_flow
+SELECT COUNT(*) AS exists_order_flow
+FROM INFORMATION_SCHEMA.STATISTICS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME = 'ado_s8_exception'
+  AND INDEX_NAME = 'idx_s8_exception_order_flow';
+
+-- Pre-check C: idx_s8_exception_related_flow
+SELECT COUNT(*) AS exists_related_flow
+FROM INFORMATION_SCHEMA.STATISTICS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME = 'ado_s8_exception'
+  AND INDEX_NAME = 'idx_s8_exception_related_flow';
+
+-- =========================================================================
+-- Index creation (run each only when its pre-check returned 0)
+-- =========================================================================
+
+-- Index 1: order-by-order aggregation (exceptionCount per order_code).
+-- Columns: tenant_id, factory_id, related_object_code, is_deleted
+CREATE INDEX idx_s8_exception_related_object_code
+ON ado_s8_exception (tenant_id, factory_id, related_object_code, is_deleted);
+
+-- Index 2: order-flow-level filter (chain page baseline / drill-down).
+-- Columns: tenant_id, factory_id, order_flow_code, status, is_deleted
+CREATE INDEX idx_s8_exception_order_flow
+ON ado_s8_exception (tenant_id, factory_id, order_flow_code, status, is_deleted);
+
+-- Index 3: joint key for per-order per-stage lookup.
+-- Columns: tenant_id, factory_id, related_object_code, order_flow_code
+CREATE INDEX idx_s8_exception_related_flow
+ON ado_s8_exception (tenant_id, factory_id, related_object_code, order_flow_code);
+
+-- =========================================================================
+-- Post-check (run after creation; expect 3 rows total)
+-- =========================================================================
+
+SELECT INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS cols
+FROM INFORMATION_SCHEMA.STATISTICS
+WHERE TABLE_SCHEMA = DATABASE()
+  AND TABLE_NAME = 'ado_s8_exception'
+  AND INDEX_NAME IN (
+    'idx_s8_exception_related_object_code',
+    'idx_s8_exception_order_flow',
+    'idx_s8_exception_related_flow'
+  )
+GROUP BY INDEX_NAME;

+ 3 - 0
server/Plugins/Admin.NET.Plugin.AiDOP/Entity/S8/AdoS8Exception.cs

@@ -10,6 +10,9 @@ namespace Admin.NET.Plugin.AiDOP.Entity.S8;
 [SugarIndex("idx_s8_exception_source_rule_code", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(SourceRuleCode), OrderByType.Asc)]
 [SugarIndex("idx_s8_exception_source_object", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(SourceObjectType), OrderByType.Asc, nameof(SourceObjectId), OrderByType.Asc)]
 [SugarIndex("idx_s8_exception_last_detected_at", nameof(LastDetectedAt), OrderByType.Asc)]
+[SugarIndex("idx_s8_exception_related_object_code", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(RelatedObjectCode), OrderByType.Asc, nameof(IsDeleted), OrderByType.Asc)]
+[SugarIndex("idx_s8_exception_order_flow", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(OrderFlowCode), OrderByType.Asc, nameof(Status), OrderByType.Asc, nameof(IsDeleted), OrderByType.Asc)]
+[SugarIndex("idx_s8_exception_related_flow", nameof(TenantId), OrderByType.Asc, nameof(FactoryId), OrderByType.Asc, nameof(RelatedObjectCode), OrderByType.Asc, nameof(OrderFlowCode), OrderByType.Asc)]
 public class AdoS8Exception
 {
     [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true, ColumnDataType = "bigint")]