Warehouse Analytics & Enterprise Automation

Enterprise-ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ складских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ аналитичСских Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для OZON Warehouse API.

πŸš€ ΠšΠžΠ ΠŸΠžΠ ΠΠ’Π˜Π’ΠΠΠ― ΠΠ’Π’ΠžΠœΠΠ’Π˜Π—ΠΠ¦Π˜Π― β€” ΠŸΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для управлСния складскими сСтями ΠΌΠ°ΡΡˆΡ‚Π°Π±Π° прСдприятия.

🏒 Enterprise классы Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ

WarehouseIntelligenceEngine

Π˜Π½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ систСма Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ складских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ с ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ΠΌ.

import { WarehouseApi } from 'daytona-ozon-seller-api';

/**
 * БистСма ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° складских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ
 * Enterprise Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… складских сСтСй
 */
class WarehouseIntelligenceEngine {
  private warehouseApi: WarehouseApi;
  private analyticsCache: Map<string, AnalyticsData> = new Map();
  private predictionModel: PerformancePredictionModel;
  private alertSystem: WarehouseAlertSystem;
  
  constructor(httpClient: HttpClient, config: IntelligenceConfig) {
    this.warehouseApi = new WarehouseApi(httpClient);
    this.predictionModel = new PerformancePredictionModel(config.mlConfig);
    this.alertSystem = new WarehouseAlertSystem(config.alertConfig);
  }
  
  /**
   * ΠšΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· всСй складской сСти
   * Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ΠΈ планирования
   */
  async performNetworkAnalysis(): Promise<NetworkAnalysisResult> {
    const warehouses = await this.warehouseApi.getWarehousesList();
    
    if (!warehouses.result) {
      throw new Error('НС ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ складской сСти');
    }
    
    const analysisResult: NetworkAnalysisResult = {
      timestamp: new Date().toISOString(),
      totalWarehouses: warehouses.result.length,
      networkHealth: {
        healthy: 0,
        warning: 0,
        critical: 0
      },
      performanceMetrics: {
        averageCapacityUtilization: 0,
        networkResilience: 0,
        operationalEfficiency: 0
      },
      predictedIssues: [],
      optimizationOpportunities: [],
      regionalDistribution: new Map(),
      capacityForecast: []
    };
    
    // ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ склада
    const warehouseAnalyses = await Promise.all(
      warehouses.result.map(warehouse => this.analyzeWarehousePerformance(warehouse))
    );
    
    // АгрСгация Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π°Π½Π°Π»ΠΈΠ·Π°
    warehouseAnalyses.forEach(analysis => {
      // ΠžΡ†Π΅Π½ΠΊΠ° Π·Π΄ΠΎΡ€ΠΎΠ²ΡŒΡ сСти
      switch (analysis.healthStatus) {
        case 'healthy':
          analysisResult.networkHealth.healthy++;
          break;
        case 'warning':
          analysisResult.networkHealth.warning++;
          break;
        case 'critical':
          analysisResult.networkHealth.critical++;
          break;
      }
      
      // РСгиональноС распрСдСлСниС
      const region = this.determineWarehouseRegion(analysis.warehouse);
      const regionCount = analysisResult.regionalDistribution.get(region) || 0;
      analysisResult.regionalDistribution.set(region, regionCount + 1);
    });
    
    // РасчСт ΠΎΠ±Ρ‰ΠΈΡ… ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ
    analysisResult.performanceMetrics = this.calculateNetworkPerformance(warehouseAnalyses);
    
    // ГСнСрация ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·ΠΎΠ² ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ
    analysisResult.predictedIssues = await this.predictPotentialIssues(warehouseAnalyses);
    analysisResult.optimizationOpportunities = this.identifyOptimizations(warehouseAnalyses);
    analysisResult.capacityForecast = this.generateCapacityForecast(warehouseAnalyses);
    
    // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° критичСских ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
    await this.alertSystem.processAnalysisResult(analysisResult);
    
    // ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² для быстрого доступа
    this.cacheAnalysisResult(analysisResult);
    
    return analysisResult;
  }
  
  /**
   * Π“Π»ΡƒΠ±ΠΎΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ склада
   */
  private async analyzeWarehousePerformance(warehouse: Warehouse): Promise<WarehouseAnalysis> {
    const analysis: WarehouseAnalysis = {
      warehouse,
      healthStatus: 'healthy',
      performanceScore: 0,
      deliveryMethods: [],
      capacityMetrics: {
        utilizationRate: 0,
        throughputEfficiency: 0,
        scalabilityIndex: 0
      },
      riskFactors: [],
      recommendations: []
    };
    
    // Анализ статуса ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ
    analysis.healthStatus = this.evaluateWarehouseHealth(warehouse);
    
    // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доставки
    if (warehouse.warehouse_id && warehouse.status === 'created') {
      const deliveryMethods = await this.getDeliveryMethodsWithAnalysis(warehouse.warehouse_id);
      analysis.deliveryMethods = deliveryMethods;
      
      // РасчСт ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π° основС ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доставки
      analysis.performanceScore = this.calculatePerformanceScore(warehouse, deliveryMethods);
      analysis.capacityMetrics = this.calculateCapacityMetrics(warehouse, deliveryMethods);
    }
    
    // Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ рисков
    analysis.riskFactors = this.identifyRiskFactors(warehouse, analysis.deliveryMethods);
    
    // ГСнСрация ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΉ
    analysis.recommendations = this.generateWarehouseRecommendations(analysis);
    
    return analysis;
  }
  
  /**
   * БистСма прогнозирования ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с использованиСм ML
   */
  private async predictPotentialIssues(analyses: WarehouseAnalysis[]): Promise<PredictedIssue[]> {
    const issues: PredictedIssue[] = [];
    
    for (const analysis of analyses) {
      // ΠŸΡ€ΠΎΠ³Π½ΠΎΠ· Π½Π° основС историчСских Π΄Π°Π½Π½Ρ‹Ρ…
      const prediction = await this.predictionModel.predictIssues({
        warehouseId: analysis.warehouse.warehouse_id!,
        currentMetrics: analysis.capacityMetrics,
        riskFactors: analysis.riskFactors,
        historicalData: this.getHistoricalData(analysis.warehouse.warehouse_id!)
      });
      
      if (prediction.issuesProbability > 0.7) {
        issues.push({
          warehouseId: analysis.warehouse.warehouse_id!,
          warehouseName: analysis.warehouse.name || `Π‘ΠΊΠ»Π°Π΄ ${analysis.warehouse.warehouse_id}`,
          issueType: prediction.mostLikelyIssue,
          probability: prediction.issuesProbability,
          estimatedImpact: prediction.estimatedImpact,
          recommendedActions: prediction.recommendedActions,
          timeframe: prediction.timeframe
        });
      }
    }
    
    return issues.sort((a, b) => b.probability - a.probability);
  }
  
  /**
   * АвтоматичСскоС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… возмоТностСй
   */
  private identifyOptimizations(analyses: WarehouseAnalysis[]): Promise<OptimizationOpportunity[]> {
    const opportunities: OptimizationOpportunity[] = [];
    
    // Анализ балансировки Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ складами
    const loadBalancingOpp = this.analyzeLoadBalancing(analyses);
    if (loadBalancingOpp) opportunities.push(loadBalancingOpp);
    
    // ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доставки
    const deliveryOptimizations = this.analyzeDeliveryOptimization(analyses);
    opportunities.push(...deliveryOptimizations);
    
    // РСгиональная оптимизация
    const regionalOpt = this.analyzeRegionalOptimization(analyses);
    if (regionalOpt) opportunities.push(regionalOpt);
    
    // ΠŸΡ€ΠΎΠ³Π½ΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ потрСбности Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ
    const expansionNeeds = this.analyzeExpansionNeeds(analyses);
    if (expansionNeeds) opportunities.push(expansionNeeds);
    
    return Promise.resolve(opportunities.sort((a, b) => b.priority - a.priority));
  }
  
  private evaluateWarehouseHealth(warehouse: Warehouse): 'healthy' | 'warning' | 'critical' {
    // ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ статус
    if (['error', 'blocked'].includes(warehouse.status || '')) {
      return 'critical';
    }
    
    // ΠŸΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅
    if (['disabled_due_to_limit', 'disabled'].includes(warehouse.status || '')) {
      return 'warning';
    }
    
    // Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ для Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… складов
    if (warehouse.status === 'created') {
      const warningFactors = [];
      
      if (warehouse.is_karantin) warningFactors.push('quarantine');
      if (warehouse.has_postings_limit && (warehouse.postings_limit || 0) < 10) {
        warningFactors.push('low_limit');
      }
      if (!warehouse.working_days || warehouse.working_days.length < 5) {
        warningFactors.push('limited_schedule');
      }
      
      return warningFactors.length > 1 ? 'warning' : 'healthy';
    }
    
    return 'warning'; // НовыС ΠΈΠ»ΠΈ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ статусы
  }
  
  private async getDeliveryMethodsWithAnalysis(warehouseId: number): Promise<AnalyzedDeliveryMethod[]> {
    const allMethods: AnalyzedDeliveryMethod[] = [];
    let offset = 0;
    const limit = 50;
    
    do {
      const response = await this.warehouseApi.getDeliveryMethods({
        limit,
        offset,
        filter: { warehouse_id: warehouseId }
      });
      
      if (response.result) {
        const analyzedMethods = response.result.map(method => ({
          ...method,
          analysisData: {
            performanceRating: this.rateMethodPerformance(method),
            reliabilityScore: this.calculateReliabilityScore(method),
            costEfficiencyIndex: this.calculateCostEfficiency(method)
          }
        }));
        
        allMethods.push(...analyzedMethods);
      }
      
      if (!response.has_next) break;
      offset += limit;
    } while (true);
    
    return allMethods;
  }
  
  private rateMethodPerformance(method: WarehouseDeliveryMethod): number {
    let score = 100;
    
    // Π¨Ρ‚Ρ€Π°Ρ„ Π·Π° Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ статус
    if (method.status !== 'ACTIVE') score -= 50;
    
    // ΠžΡ†Π΅Π½ΠΊΠ° SLA
    const sla = method.sla_cut_in || 0;
    if (sla > 240) score -= 20;      // > 4 часов
    else if (sla > 120) score -= 10; // > 2 часов
    else if (sla < 60) score += 10;  // < 1 часа
    
    // Бонус Π·Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ cutoff Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ
    if (method.cutoff) score += 5;
    
    return Math.max(0, Math.min(100, score));
  }
  
  private calculateReliabilityScore(method: WarehouseDeliveryMethod): number {
    // Базовая ΠΎΡ†Π΅Π½ΠΊΠ° надСТности Π½Π° основС статуса
    let score = 50;
    
    switch (method.status) {
      case 'ACTIVE':
        score = 90;
        break;
      case 'NEW':
        score = 60;
        break;
      case 'EDITED':
        score = 70;
        break;
      case 'DISABLED':
        score = 10;
        break;
    }
    
    // Π˜ΡΡ‚ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ надСТности (Ссли доступны)
    const historicalReliability = this.getHistoricalReliability(method.id);
    if (historicalReliability) {
      score = (score + historicalReliability) / 2;
    }
    
    return score;
  }
  
  private calculateCostEfficiency(method: WarehouseDeliveryMethod): number {
    // ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½Π°Ρ ΠΎΡ†Π΅Π½ΠΊΠ° cost-efficiency
    // Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ здСсь Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎ стоимости
    let efficiency = 70;
    
    // Π‘ΠΎΠ»Π΅Π΅ быстрыС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄ΠΎΡ€ΠΎΠΆΠ΅
    const sla = method.sla_cut_in || 120;
    if (sla < 60) efficiency -= 10;  // Быстро Π½ΠΎ Π΄ΠΎΡ€ΠΎΠ³ΠΎ
    if (sla > 240) efficiency += 10; // МСдлСнно но дСшСво
    
    return Math.max(0, Math.min(100, efficiency));
  }
}

// Π’ΠΈΠΏΡ‹ для систСмы Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ
interface NetworkAnalysisResult {
  timestamp: string;
  totalWarehouses: number;
  networkHealth: {
    healthy: number;
    warning: number;
    critical: number;
  };
  performanceMetrics: {
    averageCapacityUtilization: number;
    networkResilience: number;
    operationalEfficiency: number;
  };
  predictedIssues: PredictedIssue[];
  optimizationOpportunities: OptimizationOpportunity[];
  regionalDistribution: Map<string, number>;
  capacityForecast: CapacityForecast[];
}

interface WarehouseAnalysis {
  warehouse: Warehouse;
  healthStatus: 'healthy' | 'warning' | 'critical';
  performanceScore: number;
  deliveryMethods: AnalyzedDeliveryMethod[];
  capacityMetrics: {
    utilizationRate: number;
    throughputEfficiency: number;
    scalabilityIndex: number;
  };
  riskFactors: string[];
  recommendations: string[];
}

interface AnalyzedDeliveryMethod extends WarehouseDeliveryMethod {
  analysisData: {
    performanceRating: number;
    reliabilityScore: number;
    costEfficiencyIndex: number;
  };
}

interface PredictedIssue {
  warehouseId: number;
  warehouseName: string;
  issueType: string;
  probability: number;
  estimatedImpact: 'low' | 'medium' | 'high' | 'critical';
  recommendedActions: string[];
  timeframe: 'immediate' | 'short_term' | 'medium_term' | 'long_term';
}

interface OptimizationOpportunity {
  type: 'load_balancing' | 'delivery_optimization' | 'regional_expansion' | 'cost_reduction';
  title: string;
  description: string;
  priority: number;
  estimatedBenefit: string;
  implementationComplexity: 'low' | 'medium' | 'high';
  requiredActions: string[];
}

interface CapacityForecast {
  period: string;
  expectedDemand: number;
  currentCapacity: number;
  capacityGap: number;
  recommendedActions: string[];
}

БистСма автоматичСских ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ

/**
 * Enterprise систСма ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ ΠΎ состоянии складской сСти
 */
class WarehouseAlertSystem {
  private config: AlertConfig;
  private notificationChannels: NotificationChannel[];
  
  constructor(config: AlertConfig) {
    this.config = config;
    this.notificationChannels = this.initializeChannels(config);
  }
  
  async processAnalysisResult(result: NetworkAnalysisResult): Promise<void> {
    const alerts = this.generateAlerts(result);
    
    for (const alert of alerts) {
      await this.sendAlert(alert);
    }
  }
  
  private generateAlerts(result: NetworkAnalysisResult): WarehouseAlert[] {
    const alerts: WarehouseAlert[] = [];
    
    // ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ сСти
    if (result.networkHealth.critical > 0) {
      alerts.push({
        level: 'critical',
        type: 'network_health',
        title: `ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ складской сСти`,
        message: `${result.networkHealth.critical} склад(ΠΎΠ²) Π² критичСском состоянии`,
        data: result,
        timestamp: new Date().toISOString()
      });
    }
    
    // ΠŸΡ€Π΅Π΄ΡΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ высокой вСроятности
    const highProbabilityIssues = result.predictedIssues.filter(issue => issue.probability > 0.8);
    if (highProbabilityIssues.length > 0) {
      alerts.push({
        level: 'warning',
        type: 'predicted_issues',
        title: `ΠŸΡ€ΠΎΠ³Π½ΠΎΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ высокой вСроятности`,
        message: `${highProbabilityIssues.length} ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ внимания`,
        data: highProbabilityIssues,
        timestamp: new Date().toISOString()
      });
    }
    
    // ВозмоТности ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ высокого ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°
    const highPriorityOptimizations = result.optimizationOpportunities.filter(opp => opp.priority > 8);
    if (highPriorityOptimizations.length > 0) {
      alerts.push({
        level: 'info',
        type: 'optimization_opportunities',
        title: `ВыявлСны возмоТности ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ`,
        message: `${highPriorityOptimizations.length} высокоприоритСтных возмоТностСй ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ`,
        data: highPriorityOptimizations,
        timestamp: new Date().toISOString()
      });
    }
    
    return alerts;
  }
  
  private async sendAlert(alert: WarehouseAlert): Promise<void> {
    const channelsForLevel = this.notificationChannels.filter(
      channel => channel.alertLevels.includes(alert.level)
    );
    
    await Promise.all(
      channelsForLevel.map(channel => this.sendToChannel(channel, alert))
    );
  }
  
  private async sendToChannel(channel: NotificationChannel, alert: WarehouseAlert): Promise<void> {
    try {
      await channel.send(this.formatAlertForChannel(channel, alert));
    } catch (error) {
      console.error(`Failed to send alert to ${channel.type}:`, error);
    }
  }
  
  private formatAlertForChannel(channel: NotificationChannel, alert: WarehouseAlert): string {
    switch (channel.type) {
      case 'slack':
        return this.formatSlackMessage(alert);
      case 'email':
        return this.formatEmailMessage(alert);
      case 'telegram':
        return this.formatTelegramMessage(alert);
      case 'webhook':
        return JSON.stringify(alert);
      default:
        return alert.message;
    }
  }
  
  private formatSlackMessage(alert: WarehouseAlert): string {
    const emoji = {
      'critical': '🚨',
      'warning': '⚠️',
      'info': 'ℹ️'
    };
    
    return `${emoji[alert.level]} *${alert.title}*\n${alert.message}\n_${alert.timestamp}_`;
  }
  
  private formatEmailMessage(alert: WarehouseAlert): string {
    return `
      <h2>${alert.title}</h2>
      <p><strong>Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ:</strong> ${alert.level}</p>
      <p><strong>Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅:</strong> ${alert.message}</p>
      <p><strong>ВрСмя:</strong> ${alert.timestamp}</p>
      <hr>
      <pre>${JSON.stringify(alert.data, null, 2)}</pre>
    `;
  }
  
  private formatTelegramMessage(alert: WarehouseAlert): string {
    const emoji = {
      'critical': '🚨',
      'warning': '⚠️',
      'info': 'ℹ️'
    };
    
    return `${emoji[alert.level]} <b>${alert.title}</b>\n\n${alert.message}\n\n<i>${alert.timestamp}</i>`;
  }
  
  private initializeChannels(config: AlertConfig): NotificationChannel[] {
    const channels: NotificationChannel[] = [];
    
    if (config.slack?.enabled) {
      channels.push(new SlackNotificationChannel(config.slack));
    }
    
    if (config.email?.enabled) {
      channels.push(new EmailNotificationChannel(config.email));
    }
    
    if (config.telegram?.enabled) {
      channels.push(new TelegramNotificationChannel(config.telegram));
    }
    
    if (config.webhook?.enabled) {
      channels.push(new WebhookNotificationChannel(config.webhook));
    }
    
    return channels;
  }
}

// Π’ΠΈΠΏΡ‹ для систСмы ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
interface WarehouseAlert {
  level: 'critical' | 'warning' | 'info';
  type: string;
  title: string;
  message: string;
  data: any;
  timestamp: string;
}

interface AlertConfig {
  slack?: SlackConfig & { enabled: boolean };
  email?: EmailConfig & { enabled: boolean };
  telegram?: TelegramConfig & { enabled: boolean };
  webhook?: WebhookConfig & { enabled: boolean };
}

interface NotificationChannel {
  type: string;
  alertLevels: Array<'critical' | 'warning' | 'info'>;
  send(message: string): Promise<void>;
}

БистСма Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°

/**
 * БСрвис Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° складской сСти
 * Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ„ΠΎΠ½ΠΎΠ²ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, автоматичСски выявляСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹
 */
class ContinuousWarehouseMonitor {
  private warehouseApi: WarehouseApi;
  private intelligenceEngine: WarehouseIntelligenceEngine;
  private isRunning: boolean = false;
  private monitoringInterval: number;
  
  constructor(
    httpClient: HttpClient,
    intelligenceEngine: WarehouseIntelligenceEngine,
    config: MonitoringConfig
  ) {
    this.warehouseApi = new WarehouseApi(httpClient);
    this.intelligenceEngine = intelligenceEngine;
    this.monitoringInterval = config.intervalMinutes * 60 * 1000;
  }
  
  /**
   * Запуск Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°
   */
  async startMonitoring(): Promise<void> {
    if (this.isRunning) {
      console.warn('ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΡƒΠΆΠ΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½');
      return;
    }
    
    this.isRunning = true;
    console.log('πŸ”„ Запуск Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° складской сСти...');
    
    // ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ·
    await this.performMonitoringCycle();
    
    // ΠŸΠ»Π°Π½ΠΈΡ€ΡƒΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ†ΠΈΠΊΠ»Ρ‹
    this.scheduleNextCycle();
  }
  
  /**
   * ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°
   */
  stopMonitoring(): void {
    this.isRunning = false;
    console.log('⏹️ ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ складской сСти остановлСн');
  }
  
  private async performMonitoringCycle(): Promise<void> {
    try {
      console.log(`πŸ“Š Начало Ρ†ΠΈΠΊΠ»Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°: ${new Date().toISOString()}`);
      
      // ΠŸΠΎΠ»Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· сСти
      const analysis = await this.intelligenceEngine.performNetworkAnalysis();
      
      // Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²
      this.logMonitoringResults(analysis);
      
      // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° критичСскиС измСнСния
      await this.checkForCriticalChanges(analysis);
      
      console.log(`βœ… Π¦ΠΈΠΊΠ» ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½: ${new Date().toISOString()}`);
      
    } catch (error) {
      console.error('❌ Ошибка Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°:', error);
      
      // Π£Π²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΠ± ошибкС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°
      await this.notifyMonitoringError(error);
    }
  }
  
  private scheduleNextCycle(): void {
    if (!this.isRunning) return;
    
    setTimeout(() => {
      if (this.isRunning) {
        this.performMonitoringCycle().then(() => {
          this.scheduleNextCycle();
        });
      }
    }, this.monitoringInterval);
  }
  
  private logMonitoringResults(analysis: NetworkAnalysisResult): void {
    const summary = {
      timestamp: analysis.timestamp,
      totalWarehouses: analysis.totalWarehouses,
      healthSummary: {
        healthy: analysis.networkHealth.healthy,
        warning: analysis.networkHealth.warning,
        critical: analysis.networkHealth.critical
      },
      performanceScore: analysis.performanceMetrics.operationalEfficiency,
      predictedIssuesCount: analysis.predictedIssues.length,
      optimizationOpportunitiesCount: analysis.optimizationOpportunities.length
    };
    
    console.log('πŸ“ˆ Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°:', JSON.stringify(summary, null, 2));
  }
  
  private async checkForCriticalChanges(analysis: NetworkAnalysisResult): Promise<void> {
    // Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ для выявлСния критичСских ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
    const previousAnalysis = this.getPreviousAnalysis();
    
    if (previousAnalysis) {
      const criticalChanges = this.identifyCriticalChanges(previousAnalysis, analysis);
      
      if (criticalChanges.length > 0) {
        console.warn('⚠️ ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Ρ‹ критичСскиС измСнСния:', criticalChanges);
        await this.handleCriticalChanges(criticalChanges);
      }
    }
    
    // Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ сравнСния
    this.savePreviousAnalysis(analysis);
  }
  
  private identifyCriticalChanges(previous: NetworkAnalysisResult, current: NetworkAnalysisResult): CriticalChange[] {
    const changes: CriticalChange[] = [];
    
    // Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ количСства критичСских складов
    if (current.networkHealth.critical > previous.networkHealth.critical) {
      changes.push({
        type: 'critical_warehouses_increase',
        severity: 'high',
        description: `ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ критичСских складов ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»ΠΎΡΡŒ с ${previous.networkHealth.critical} Π΄ΠΎ ${current.networkHealth.critical}`,
        impact: 'immediate'
      });
    }
    
    // Π Π΅Π·ΠΊΠΎΠ΅ ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰Π΅ΠΉ эффСктивности
    const efficiencyDrop = previous.performanceMetrics.operationalEfficiency - current.performanceMetrics.operationalEfficiency;
    if (efficiencyDrop > 20) {
      changes.push({
        type: 'efficiency_drop',
        severity: 'medium',
        description: `ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΡƒΠΏΠ°Π»Π° Π½Π° ${efficiencyDrop.toFixed(1)}%`,
        impact: 'short_term'
      });
    }
    
    // ПоявлСниС Π½ΠΎΠ²Ρ‹Ρ… критичСских ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ
    const newCriticalIssues = current.predictedIssues.filter(
      issue => issue.probability > 0.8 && issue.estimatedImpact === 'critical'
    );
    
    if (newCriticalIssues.length > 0) {
      changes.push({
        type: 'new_critical_predictions',
        severity: 'high',
        description: `Появились Π½ΠΎΠ²Ρ‹Π΅ критичСскиС ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·Ρ‹: ${newCriticalIssues.length}`,
        impact: 'medium_term'
      });
    }
    
    return changes;
  }
  
  private async handleCriticalChanges(changes: CriticalChange[]): Promise<void> {
    // ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° экстрСнных ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
    for (const change of changes) {
      if (change.severity === 'high') {
        await this.sendEmergencyNotification(change);
      }
    }
    
    // Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ для дальнСйшСго Π°Π½Π°Π»ΠΈΠ·Π°
    console.log('🚨 ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ измСнСния зафиксированы:', changes);
  }
  
  private async sendEmergencyNotification(change: CriticalChange): Promise<void> {
    // РСализация экстрСнных ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
    console.log('🚨 ЭкстрСнноС ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅:', change.description);
  }
  
  // ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ для сохранСния/Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π°Π½Π°Π»ΠΈΠ·Π°
  private getPreviousAnalysis(): NetworkAnalysisResult | null {
    // РСализация Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΠ· кэша/Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…
    return null; // Π—Π°Π³Π»ΡƒΡˆΠΊΠ°
  }
  
  private savePreviousAnalysis(analysis: NetworkAnalysisResult): void {
    // РСализация сохранСния Π² кэш/Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…
    console.log('πŸ’Ύ Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Π°Π½Π°Π»ΠΈΠ·Π° для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Ρ†ΠΈΠΊΠ»Π°');
  }
  
  private async notifyMonitoringError(error: any): Promise<void> {
    console.error('🚨 ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ ошибка систСмы ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°:', error);
    // Π—Π΄Π΅ΡΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° увСдомлСния администраторам
  }
}

// Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹
interface CriticalChange {
  type: string;
  severity: 'low' | 'medium' | 'high';
  description: string;
  impact: 'immediate' | 'short_term' | 'medium_term' | 'long_term';
}

interface MonitoringConfig {
  intervalMinutes: number;
  alertThresholds: {
    criticalWarehousesThreshold: number;
    efficiencyDropThreshold: number;
    predictionProbabilityThreshold: number;
  };
  emergencyContacts: string[];
}

πŸ“Š БистСма отчСтности ΠΈ Π΄Π°ΡˆΠ±ΠΎΡ€Π΄Ρ‹

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ²

/**
 * Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ² для руководства
 */
class ExecutiveReportGenerator {
  private intelligenceEngine: WarehouseIntelligenceEngine;
  
  constructor(intelligenceEngine: WarehouseIntelligenceEngine) {
    this.intelligenceEngine = intelligenceEngine;
  }
  
  /**
   * Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ СТСнСдСльного ΠΎΡ‚Ρ‡Π΅Ρ‚Π° для руководства
   */
  async generateWeeklyExecutiveSummary(): Promise<ExecutiveReport> {
    const networkAnalysis = await this.intelligenceEngine.performNetworkAnalysis();
    
    const report: ExecutiveReport = {
      reportDate: new Date().toISOString(),
      period: 'weekly',
      executiveSummary: this.createExecutiveSummary(networkAnalysis),
      keyMetrics: this.extractKeyMetrics(networkAnalysis),
      riskAssessment: this.createRiskAssessment(networkAnalysis),
      strategicRecommendations: this.createStrategicRecommendations(networkAnalysis),
      financialImpact: this.estimateFinancialImpact(networkAnalysis),
      nextSteps: this.defineNextSteps(networkAnalysis)
    };
    
    return report;
  }
  
  private createExecutiveSummary(analysis: NetworkAnalysisResult): string {
    const totalWarehouses = analysis.totalWarehouses;
    const healthyPercent = Math.round((analysis.networkHealth.healthy / totalWarehouses) * 100);
    const efficiency = analysis.performanceMetrics.operationalEfficiency;
    
    return `
      Π—Π° ΠΎΡ‚Ρ‡Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ складская ΡΠ΅Ρ‚ΡŒ продСмонстрировала ${efficiency > 75 ? 'Π²Ρ‹ΡΠΎΠΊΡƒΡŽ' : efficiency > 50 ? 'ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ' : 'Π½ΠΈΠ·ΠΊΡƒΡŽ'} ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ (${efficiency.toFixed(1)}%).
      
      Из ${totalWarehouses} складов ${healthyPercent}% находятся Π² Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΌ состоянии. 
      ${analysis.networkHealth.critical > 0 ? `Π’ΠΠ˜ΠœΠΠΠ˜Π•: ${analysis.networkHealth.critical} складов Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΠΌΠ΅ΡˆΠ°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°.` : ''}
      
      БистСма прогнозирования выявила ${analysis.predictedIssues.length} ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, 
      ${analysis.optimizationOpportunities.length} возмоТностСй для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.
      
      ${analysis.optimizationOpportunities.length > 0 ? `РСализация выявлСнных ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ принСсти Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·Ρƒ для бизнСса.` : ''}
    `.trim();
  }
  
  private extractKeyMetrics(analysis: NetworkAnalysisResult): KeyMetrics {
    return {
      networkHealth: {
        overallScore: this.calculateOverallHealthScore(analysis.networkHealth),
        trend: 'improving', // Π—Π΄Π΅ΡΡŒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ сравнСниС с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ΠΎΠΌ
        healthyWarehouses: analysis.networkHealth.healthy,
        totalWarehouses: analysis.totalWarehouses
      },
      performance: {
        operationalEfficiency: analysis.performanceMetrics.operationalEfficiency,
        capacityUtilization: analysis.performanceMetrics.averageCapacityUtilization,
        networkResilience: analysis.performanceMetrics.networkResilience
      },
      predictiveInsights: {
        highRiskIssues: analysis.predictedIssues.filter(issue => issue.probability > 0.8).length,
        totalPredictions: analysis.predictedIssues.length,
        optimizationOpportunities: analysis.optimizationOpportunities.length
      }
    };
  }
  
  private createRiskAssessment(analysis: NetworkAnalysisResult): RiskAssessment {
    const criticalRisks = analysis.predictedIssues.filter(
      issue => issue.estimatedImpact === 'critical' && issue.probability > 0.7
    );
    
    const highRisks = analysis.predictedIssues.filter(
      issue => issue.estimatedImpact === 'high' && issue.probability > 0.6
    );
    
    return {
      overallRiskLevel: this.calculateOverallRiskLevel(analysis),
      criticalRisks: criticalRisks.map(risk => ({
        description: `${risk.warehouseName}: ${risk.issueType}`,
        probability: risk.probability,
        impact: risk.estimatedImpact,
        timeframe: risk.timeframe,
        mitigationActions: risk.recommendedActions
      })),
      emergingRisks: highRisks.map(risk => ({
        description: `${risk.warehouseName}: ${risk.issueType}`,
        probability: risk.probability,
        impact: risk.estimatedImpact,
        timeframe: risk.timeframe
      })),
      riskMitigationStatus: this.assessRiskMitigationStatus(analysis)
    };
  }
  
  private createStrategicRecommendations(analysis: NetworkAnalysisResult): StrategicRecommendation[] {
    const recommendations: StrategicRecommendation[] = [];
    
    // ВысокоприоритСтныС Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ
    const highPriorityOpps = analysis.optimizationOpportunities.filter(opp => opp.priority > 8);
    
    highPriorityOpps.forEach(opp => {
      recommendations.push({
        category: this.categorizePriority(opp.priority),
        title: opp.title,
        description: opp.description,
        expectedBenefit: opp.estimatedBenefit,
        implementationComplexity: opp.implementationComplexity,
        timeline: this.estimateImplementationTimeline(opp.implementationComplexity),
        requiredResources: this.estimateRequiredResources(opp),
        strategicAlignment: this.assessStrategicAlignment(opp)
      });
    });
    
    // ДолгосрочныС стратСгичСскиС Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ
    if (analysis.capacityForecast.some(forecast => forecast.capacityGap > 0)) {
      recommendations.push({
        category: 'strategic',
        title: 'ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ складских мощностСй',
        description: 'ΠŸΡ€ΠΎΠ³Π½ΠΎΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ Π½Π΅Ρ…Π²Π°Ρ‚ΠΊΠ° складских мощностСй Π² срСднСсрочной пСрспСктивС',
        expectedBenefit: 'ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ роста бизнСса ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΡƒΠ·ΠΊΠΈΡ… мСст',
        implementationComplexity: 'high',
        timeline: '6-12 мСсяцСв',
        requiredResources: ['ΠšΠ°ΠΏΠΈΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ инвСстиции', 'Команда ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°', 'ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°'],
        strategicAlignment: 'high'
      });
    }
    
    return recommendations.sort((a, b) => {
      const priorityOrder = { 'critical': 3, 'strategic': 2, 'operational': 1 };
      return priorityOrder[b.category] - priorityOrder[a.category];
    });
  }
}

// Π’ΠΈΠΏΡ‹ для систСмы отчСтности
interface ExecutiveReport {
  reportDate: string;
  period: 'weekly' | 'monthly' | 'quarterly';
  executiveSummary: string;
  keyMetrics: KeyMetrics;
  riskAssessment: RiskAssessment;
  strategicRecommendations: StrategicRecommendation[];
  financialImpact: FinancialImpact;
  nextSteps: NextStep[];
}

interface KeyMetrics {
  networkHealth: {
    overallScore: number;
    trend: 'improving' | 'stable' | 'declining';
    healthyWarehouses: number;
    totalWarehouses: number;
  };
  performance: {
    operationalEfficiency: number;
    capacityUtilization: number;
    networkResilience: number;
  };
  predictiveInsights: {
    highRiskIssues: number;
    totalPredictions: number;
    optimizationOpportunities: number;
  };
}

interface RiskAssessment {
  overallRiskLevel: 'low' | 'medium' | 'high' | 'critical';
  criticalRisks: Array<{
    description: string;
    probability: number;
    impact: string;
    timeframe: string;
    mitigationActions: string[];
  }>;
  emergingRisks: Array<{
    description: string;
    probability: number;
    impact: string;
    timeframe: string;
  }>;
  riskMitigationStatus: 'on-track' | 'behind' | 'at-risk';
}

interface StrategicRecommendation {
  category: 'critical' | 'strategic' | 'operational';
  title: string;
  description: string;
  expectedBenefit: string;
  implementationComplexity: 'low' | 'medium' | 'high';
  timeline: string;
  requiredResources: string[];
  strategicAlignment: 'high' | 'medium' | 'low';
}

interface FinancialImpact {
  currentCosts: number;
  projectedSavings: number;
  investmentRequired: number;
  roi: number;
  paybackPeriod: string;
}

interface NextStep {
  action: string;
  owner: string;
  deadline: string;
  priority: 'high' | 'medium' | 'low';
  dependencies: string[];
}

πŸš€ Быстрый старт Enterprise Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

// Полная настройка enterprise систСмы ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° складов
import { HttpClient } from 'daytona-ozon-seller-api';

async function setupEnterpriseWarehouseMonitoring() {
  // Настройка HTTP ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
  const httpClient = new HttpClient({
    clientId: process.env.OZON_CLIENT_ID!,
    apiKey: process.env.OZON_API_KEY!
  });
  
  // ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ систСмы Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ
  const intelligenceConfig: IntelligenceConfig = {
    mlConfig: {
      predictionThreshold: 0.7,
      historicalDataDays: 30,
      learningRate: 0.1
    },
    alertConfig: {
      slack: {
        enabled: true,
        webhookUrl: process.env.SLACK_WEBHOOK_URL!,
        channel: '#warehouse-alerts',
        alertLevels: ['critical', 'warning']
      },
      email: {
        enabled: true,
        smtpConfig: {
          host: process.env.SMTP_HOST!,
          port: 587,
          secure: false,
          auth: {
            user: process.env.SMTP_USER!,
            pass: process.env.SMTP_PASS!
          }
        },
        recipients: ['warehouse-manager@company.com', 'operations@company.com'],
        alertLevels: ['critical']
      }
    }
  };
  
  // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ основных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²
  const intelligenceEngine = new WarehouseIntelligenceEngine(httpClient, intelligenceConfig);
  const reportGenerator = new ExecutiveReportGenerator(intelligenceEngine);
  
  // Настройка Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°
  const monitoringConfig: MonitoringConfig = {
    intervalMinutes: 30,
    alertThresholds: {
      criticalWarehousesThreshold: 1,
      efficiencyDropThreshold: 15,
      predictionProbabilityThreshold: 0.8
    },
    emergencyContacts: ['+7-xxx-xxx-xxxx']
  };
  
  const monitor = new ContinuousWarehouseMonitor(
    httpClient,
    intelligenceEngine,
    monitoringConfig
  );
  
  // Запуск систСмы
  console.log('πŸš€ Запуск Enterprise систСмы ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° складов...');
  
  // ΠŸΠ΅Ρ€Π²ΠΈΡ‡Π½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ·
  const initialAnalysis = await intelligenceEngine.performNetworkAnalysis();
  console.log('πŸ“Š ΠΠ°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· сСти Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½:', {
    warehouses: initialAnalysis.totalWarehouses,
    health: initialAnalysis.networkHealth,
    performance: initialAnalysis.performanceMetrics.operationalEfficiency
  });
  
  // ГСнСрация ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΎΡ‚Ρ‡Π΅Ρ‚Π°
  const executiveReport = await reportGenerator.generateWeeklyExecutiveSummary();
  console.log('πŸ“ˆ Π˜ΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ²');
  
  // Запуск Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°
  await monitor.startMonitoring();
  
  // ΠŸΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ рСгулярных ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΎΠ²
  setInterval(async () => {
    const report = await reportGenerator.generateWeeklyExecutiveSummary();
    console.log('πŸ“Š Π•ΠΆΠ΅Π½Π΅Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚ сгСнСрирован:', report.reportDate);
  }, 7 * 24 * 60 * 60 * 1000); // ΠšΠ°ΠΆΠ΄ΡƒΡŽ нСдСлю
  
  console.log('βœ… Enterprise систСма ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° складов Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚');
  
  return {
    intelligenceEngine,
    reportGenerator,
    monitor
  };
}

// ΠŸΡ€ΠΈΠΌΠ΅Ρ€ использования
setupEnterpriseWarehouseMonitoring()
  .then(system => {
    console.log('πŸŽ‰ Enterprise систСма Π³ΠΎΡ‚ΠΎΠ²Π° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅');
    
    // БистСма Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ
    // АвтоматичСскиС увСдомлСния, ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ ΠΈ ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·Ρ‹
  })
  .catch(error => {
    console.error('❌ Ошибка запуска систСмы:', error);
  });

πŸ’‘ Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Enterprise Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для OZON Warehouse API ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚:

πŸ” Π˜Π½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΡƒ:

  • ΠŸΡ€Π΅Π΄ΠΈΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ складской сСти
  • АвтоматичСскоС выявлСниС возмоТностСй ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ
  • КомплСксная ΠΎΡ†Π΅Π½ΠΊΠ° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ рисков

🚨 ΠŸΡ€ΠΎΠ°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ увСдомлСния:

  • Многоканальная систСма ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠΉ (Slack, Email, Telegram)
  • НастраиваСмыС ΡƒΡ€ΠΎΠ²Π½ΠΈ критичности
  • АвтоматичСская эскалация ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ

πŸ“Š Π˜ΡΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΡ‚Ρ‡Π΅Ρ‚Π½ΠΎΡΡ‚ΡŒ:

  • Π•ΠΆΠ΅Π½Π΅Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΡ‚Ρ‡Π΅Ρ‚Ρ‹ для руководства
  • ЀинансовыС ΠΎΡ†Π΅Π½ΠΊΠΈ ΠΈ ΠΏΡ€ΠΎΠ³Π½ΠΎΠ·Ρ‹ ROI
  • БтратСгичСскиС Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ

πŸ”„ НСпрСрывный ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³:

  • 24/7 ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ состояния складской сСти
  • АвтоматичСскоС выявлСниС критичСских ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ
  • БистСма Ρ€Π°Π½Π½Π΅Π³ΠΎ прСдупрСТдСния

Π­Ρ‚ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ складскими опСрациями ΠΈΠ· Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Π² ΠΏΡ€ΠΎΠ°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅, обСспСчивая ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ рисков для ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… складских сСтСй.