πŸͺ Warehouse API

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ складами FBS ΠΈ rFBS

Warehouse API прСдоставляСт инструмСнты для управлСния складами FBS (Fulfillment by Seller) ΠΈ rFBS (regional FBS), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ доставки.

⚠️ Π’Π°ΠΆΠ½ΠΎ: Для получСния списка складов FBO ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ /v1/cluster/list

πŸ“‹ ΠžΠ±Π·ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

ΠœΠ΅Ρ‚ΠΎΠ΄ Endpoint ОписаниС
getWarehousesList() POST /v1/warehouse/list Бписок складов FBS/rFBS
getDeliveryMethods() POST /v1/delivery-method/list ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ доставки склада

🏒 Π’ΠΈΠΏΡ‹ складов

FBS (Fulfillment by Seller)

  • Π’ΠΎΠ²Π°Ρ€Ρ‹ хранятся Π½Π° складС ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π°
  • ΠŸΡ€ΠΎΠ΄Π°Π²Π΅Ρ† сам ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π² слуТбу доставки
  • ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ логистикой

rFBS (regional FBS)

  • РСгиональная схСма FBS
  • Π‘ΠΊΠ»Π°Π΄Ρ‹ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ€Π΅Π³ΠΈΠΎΠ½Π°Ρ… для быстрой доставки
  • ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ логистичСских Π·Π°Ρ‚Ρ€Π°Ρ‚

πŸ“Š ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ сцСнарии использования

1. πŸ” ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка складов

// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ всС доступныС склады
const warehouses = await client.warehouse.getWarehousesList();

console.log(`Доступно складов: ${warehouses.result?.length}`);

warehouses.result?.forEach(warehouse => {
  console.log(`\nπŸ“¦ ${warehouse.name} (ID: ${warehouse.warehouse_id})`);
  console.log(`   Бтатус: ${getStatusText(warehouse.status)}`);
  console.log(`   Π’ΠΈΠΏ: ${warehouse.is_rfbs ? 'rFBS' : 'FBS'}`);
  console.log(`   Π­ΠΊΠΎΠ½ΠΎΠΌ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹: ${warehouse.is_economy ? 'βœ…' : '❌'}`);
  console.log(`   ΠšΠ“Π’ Ρ‚ΠΎΠ²Π°Ρ€Ρ‹: ${warehouse.is_kgt ? 'βœ…' : '❌'}`);
  
  if (warehouse.has_postings_limit) {
    console.log(`   Π›ΠΈΠΌΠΈΡ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΉ: ${warehouse.postings_limit} (ΠΌΠΈΠ½: ${warehouse.min_postings_limit})`);
  }
  
  if (warehouse.working_days?.length) {
    const dayNames = ['Пн', 'Π’Ρ‚', 'Π‘Ρ€', 'Π§Ρ‚', 'ΠŸΡ‚', 'Π‘Π±', 'Вс'];
    const workingDayNames = warehouse.working_days.map(day => dayNames[parseInt(day) - 1]);
    console.log(`   Π Π°Π±ΠΎΡ‡ΠΈΠ΅ Π΄Π½ΠΈ: ${workingDayNames.join(', ')}`);
  }
  
  if (warehouse.first_mile_type) {
    console.log(`   ΠŸΠ΅Ρ€Π²Π°Ρ миля: ${warehouse.first_mile_type.first_mile_type}`);
    if (warehouse.first_mile_type.first_mile_is_changing) {
      console.log(`   ⚠️ Настройки склада ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ`);
    }
  }
});

// Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ функция для статусов
function getStatusText(status: string): string {
  const statusMap = {
    'new': 'πŸ”„ АктивируСтся',
    'created': 'βœ… Активный', 
    'disabled': 'πŸ“ Π’ Π°Ρ€Ρ…ΠΈΠ²Π΅',
    'blocked': '🚫 Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½',
    'disabled_due_to_limit': '⏸️ На ΠΏΠ°ΡƒΠ·Π΅',
    'error': '❌ Ошибка'
  };
  return statusMap[status] || status;
}

2. 🚚 Поиск ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доставки

// ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доставки для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ склада
const deliveryMethods = await client.warehouse.getDeliveryMethods({
  limit: 50,
  offset: 0,
  filter: {
    warehouse_id: 123456,
    status: 'ACTIVE'
  }
});

console.log(`НайдСно ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доставки: ${deliveryMethods.result?.length}`);
if (deliveryMethods.has_next) {
  console.log('⏭️ Π•ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡŽ');
}

deliveryMethods.result?.forEach(method => {
  console.log(`\nπŸš› ${method.name} (ID: ${method.id})`);
  console.log(`   ΠŸΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€: ${method.provider_id}`);
  console.log(`   Бтатус: ${method.status}`);
  console.log(`   ВрСмя сборки: ${method.sla_cut_in} ΠΌΠΈΠ½`);
  console.log(`   Cutoff: ${method.cutoff}`);
  console.log(`   Π‘ΠΊΠ»Π°Π΄: ${method.warehouse_id}`);
  console.log(`   Π‘ΠΎΠ·Π΄Π°Π½: ${method.created_at}`);
  console.log(`   ОбновлСн: ${method.updated_at}`);
});

3. πŸ“ˆ ΠŸΠ°Π³ΠΈΠ½Π°Ρ†ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доставки

async function getAllDeliveryMethods(warehouseId: number) {
  const allMethods = [];
  let offset = 0;
  const limit = 50;
  let hasNext = true;
  
  while (hasNext) {
    const response = await client.warehouse.getDeliveryMethods({
      limit,
      offset,
      filter: {
        warehouse_id: warehouseId,
        status: 'ACTIVE'
      }
    });
    
    if (response.result) {
      allMethods.push(...response.result);
    }
    
    hasNext = response.has_next ?? false;
    offset += limit;
    
    console.log(`πŸ“¦ Π—Π°Π³Ρ€ΡƒΠΆΠ΅Π½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²: ${allMethods.length}`);
    
    // ΠŸΠ°ΡƒΠ·Π° ΠΌΠ΅ΠΆΠ΄Ρƒ запросами
    if (hasNext) {
      await new Promise(resolve => setTimeout(resolve, 100));
    }
  }
  
  return allMethods;
}

// ИспользованиС
const allMethods = await getAllDeliveryMethods(123456);
console.log(`ВсСго ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доставки: ${allMethods.length}`);

4. πŸ“Š Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ ΠΈ Π°Π½Π°Π»ΠΈΠ· складов

// Анализ складов с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°ΠΌΠΈ
const warehouses = await client.warehouse.getWarehousesList();

// АктивныС склады
const activeWarehouses = warehouses.result?.filter(w => w.status === 'created') ?? [];
console.log(`βœ… Активных складов: ${activeWarehouses.length}`);

// rFBS склады  
const rfbsWarehouses = warehouses.result?.filter(w => w.is_rfbs) ?? [];
console.log(`🌐 rFBS складов: ${rfbsWarehouses.length}`);

// Π‘ΠΊΠ»Π°Π΄Ρ‹ с эконом Ρ‚ΠΎΠ²Π°Ρ€Π°ΠΌΠΈ
const economyWarehouses = warehouses.result?.filter(w => w.is_economy) ?? [];
console.log(`πŸ’° Π­ΠΊΠΎΠ½ΠΎΠΌ складов: ${economyWarehouses.length}`);

// Π‘ΠΊΠ»Π°Π΄Ρ‹ с ΠšΠ“Π’
const kgtWarehouses = warehouses.result?.filter(w => w.is_kgt) ?? [];
console.log(`πŸ“¦ ΠšΠ“Π’ складов: ${kgtWarehouses.length}`);

// Π‘ΠΊΠ»Π°Π΄Ρ‹ с Π»ΠΈΠΌΠΈΡ‚Π°ΠΌΠΈ
const limitedWarehouses = warehouses.result?.filter(w => w.has_postings_limit) ?? [];
console.log(`⚠️ Π‘ΠΊΠ»Π°Π΄ΠΎΠ² с Π»ΠΈΠΌΠΈΡ‚Π°ΠΌΠΈ: ${limitedWarehouses.length}`);

// Бтатистика ΠΏΠΎ статусам
const statusStats = warehouses.result?.reduce((acc, w) => {
  acc[w.status || 'unknown'] = (acc[w.status || 'unknown'] || 0) + 1;
  return acc;
}, {} as Record<string, number>);

console.log('\nπŸ“Š Бтатистика складов ΠΏΠΎ статусам:');
Object.entries(statusStats || {}).forEach(([status, count]) => {
  console.log(`   ${getStatusText(status)}: ${count}`);
});

5. πŸ”„ ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ складов

class WarehouseMonitor {
  private previousWarehouses: Map<number, any> = new Map();
  
  async checkWarehouseChanges() {
    const response = await client.warehouse.getWarehousesList();
    const currentWarehouses = response.result || [];
    
    const changes = [];
    
    for (const warehouse of currentWarehouses) {
      const warehouseId = warehouse.warehouse_id!;
      const previous = this.previousWarehouses.get(warehouseId);
      
      if (!previous) {
        changes.push({
          type: 'new',
          warehouse,
          message: `πŸ†• Новый склад: ${warehouse.name}`
        });
      } else if (previous.status !== warehouse.status) {
        changes.push({
          type: 'status_change',
          warehouse,
          previous: previous.status,
          current: warehouse.status,
          message: `πŸ”„ ИзмСнСн статус склада ${warehouse.name}: ${getStatusText(previous.status)} β†’ ${getStatusText(warehouse.status!)}`
        });
      } else if (previous.postings_limit !== warehouse.postings_limit) {
        changes.push({
          type: 'limit_change', 
          warehouse,
          previous: previous.postings_limit,
          current: warehouse.postings_limit,
          message: `πŸ“Š ИзмСнСн Π»ΠΈΠΌΠΈΡ‚ склада ${warehouse.name}: ${previous.postings_limit} β†’ ${warehouse.postings_limit}`
        });
      }
      
      // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΌΠΈΠ»ΠΈ
      if (warehouse.first_mile_type?.first_mile_is_changing) {
        changes.push({
          type: 'first_mile_updating',
          warehouse,
          message: `⚠️ ΠžΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ настройки ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΌΠΈΠ»ΠΈ для склада ${warehouse.name}`
        });
      }
    }
    
    // БохраняСм Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС
    this.previousWarehouses.clear();
    currentWarehouses.forEach(w => {
      if (w.warehouse_id) {
        this.previousWarehouses.set(w.warehouse_id, { ...w });
      }
    });
    
    return changes;
  }
}

// ИспользованиС ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°
const monitor = new WarehouseMonitor();

// ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΠ°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 15 ΠΌΠΈΠ½ΡƒΡ‚
setInterval(async () => {
  try {
    const changes = await monitor.checkWarehouseChanges();
    
    if (changes.length > 0) {
      console.log(`\nπŸ”” ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ: ${changes.length}`);
      changes.forEach(change => console.log(change.message));
      
      // Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ увСдомлСния
      // await sendNotifications(changes);
    }
  } catch (error) {
    console.error('Ошибка ΠΏΡ€ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π΅ складов:', error);
  }
}, 15 * 60 * 1000);

πŸ—οΈ TypeScript Ρ‚ΠΈΠΏΡ‹

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ интСрфСйсы

// Запрос списка складов
interface WarehouseListRequest {
  readonly [key: string]: unknown;
}

// Π‘ΠΊΠ»Π°Π΄ ΠΈΠ· ΠΎΡ‚Π²Π΅Ρ‚Π°
interface Warehouse {
  warehouse_id?: number;
  name?: string;
  status?: 'new' | 'created' | 'disabled' | 'blocked' | 'disabled_due_to_limit' | 'error';
  is_rfbs?: boolean;
  is_economy?: boolean;
  is_kgt?: boolean;
  is_karantin?: boolean;
  has_postings_limit?: boolean;
  postings_limit?: number;
  min_postings_limit?: number;
  working_days?: ('1' | '2' | '3' | '4' | '5' | '6' | '7')[];
  first_mile_type?: WarehouseFirstMileType;
  // ... Π΄Ρ€ΡƒΠ³ΠΈΠ΅ поля
}

// Π’ΠΈΠΏ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΌΠΈΠ»ΠΈ
interface WarehouseFirstMileType {
  first_mile_type?: 'DropOff' | 'Pickup';
  first_mile_is_changing?: boolean;
  dropoff_point_id?: string;
  dropoff_timeslot_id?: number;
}

// Запрос ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доставки
interface WarehouseDeliveryMethodListRequest {
  limit: number; // ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ, 1-50
  offset?: number;
  filter?: DeliveryMethodListRequestFilter;
}

// Π€ΠΈΠ»ΡŒΡ‚Ρ€ для ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доставки
interface DeliveryMethodListRequestFilter {
  warehouse_id?: number;
  provider_id?: number;
  status?: 'NEW' | 'EDITED' | 'ACTIVE' | 'DISABLED';
}

// ΠœΠ΅Ρ‚ΠΎΠ΄ доставки
interface WarehouseDeliveryMethod {
  id?: number;
  name?: string;
  status?: 'NEW' | 'EDITED' | 'ACTIVE' | 'DISABLED';
  warehouse_id?: number;
  provider_id?: number;
  company_id?: number;
  template_id?: number;
  cutoff?: string;
  sla_cut_in?: number;
  created_at?: string;
  updated_at?: string;
}

ΠžΡ‚Π²Π΅Ρ‚Ρ‹ API

// ΠžΡ‚Π²Π΅Ρ‚ списка складов
interface WarehouseListResponse {
  result?: Warehouse[];
}

// ΠžΡ‚Π²Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доставки
interface WarehouseDeliveryMethodListResponse {
  result?: WarehouseDeliveryMethod[];
  has_next?: boolean;
}

⚠️ Π’Π°ΠΆΠ½Ρ‹Π΅ особСнности

Бтатусы складов

Бтатус ОписаниС Π² ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅ ОписаниС
new АктивируСтся Π‘ΠΊΠ»Π°Π΄ Π² процСссС Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ
created Активный Π‘ΠΊΠ»Π°Π΄ Π°ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚
disabled Π’ Π°Ρ€Ρ…ΠΈΠ²Π΅ Π‘ΠΊΠ»Π°Π΄ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½
blocked Π—Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ Π‘ΠΊΠ»Π°Π΄ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ систСмой
disabled_due_to_limit На ΠΏΠ°ΡƒΠ·Π΅ Π‘ΠΊΠ»Π°Π΄ приостановлСн ΠΈΠ·-Π·Π° Π»ΠΈΠΌΠΈΡ‚ΠΎΠ²
error Ошибка Ошибка Π² настройках склада

Π Π°Π±ΠΎΡ‡ΠΈΠ΅ Π΄Π½ΠΈ

Π”Π½ΠΈ Π½Π΅Π΄Π΅Π»ΠΈ прСдставлСны числами:

  • '1' β€” ПонСдСльник
  • '2' β€” Π’Ρ‚ΠΎΡ€Π½ΠΈΠΊ
  • '3' β€” Π‘Ρ€Π΅Π΄Π°
  • '4' β€” Π§Π΅Ρ‚Π²Π΅Ρ€Π³
  • '5' β€” ΠŸΡΡ‚Π½ΠΈΡ†Π°
  • '6' β€” Π‘ΡƒΠ±Π±ΠΎΡ‚Π°
  • '7' β€” Π’ΠΎΡΠΊΡ€Π΅ΡΠ΅Π½ΡŒΠ΅

ΠŸΠ΅Ρ€Π²Π°Ρ миля

  • DropOff β€” доставка Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² Π² Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΏΡ€ΠΈΠ΅ΠΌΠ°
  • Pickup β€” самовывоз Ρ‚ΠΎΠ²Π°Ρ€ΠΎΠ² со склада ΠΏΡ€ΠΎΠ΄Π°Π²Ρ†Π°

Π›ΠΈΠΌΠΈΡ‚Ρ‹ API

  • Бписок складов: Π±Π΅Π· ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ (Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΡΡˆΠΈΡ€ΡƒΡŽΡ‚ΡΡ)
  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ доставки: максимум 50 элСмСнтов Π·Π° запрос
  • Rate limiting: стандартныС Π»ΠΈΠΌΠΈΡ‚Ρ‹ OZON API

πŸ”§ ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

АвтоматичСская настройка складов

class WarehouseManager {
  async optimizeWarehouses() {
    const warehouses = await client.warehouse.getWarehousesList();
    const active = warehouses.result?.filter(w => w.status === 'created') ?? [];
    
    const report = {
      total: warehouses.result?.length ?? 0,
      active: active.length,
      rfbs: active.filter(w => w.is_rfbs).length,
      economy: active.filter(w => w.is_economy).length,
      kgt: active.filter(w => w.is_kgt).length,
      withLimits: active.filter(w => w.has_postings_limit).length,
      recommendations: [] as string[]
    };
    
    // Анализ ΠΈ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ
    if (report.rfbs === 0) {
      report.recommendations.push('🌐 РассмотритС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ rFBS для ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ логистики');
    }
    
    if (report.economy === 0) {
      report.recommendations.push('πŸ’° ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ эконом-склады для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ ассортимСнта');
    }
    
    active.forEach(warehouse => {
      if (warehouse.has_postings_limit && warehouse.postings_limit === warehouse.min_postings_limit) {
        report.recommendations.push(`⚠️ Π‘ΠΊΠ»Π°Π΄ ${warehouse.name} Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° минимальном Π»ΠΈΠΌΠΈΡ‚Π΅`);
      }
      
      if (warehouse.working_days && warehouse.working_days.length < 5) {
        report.recommendations.push(`πŸ“… Π‘ΠΊΠ»Π°Π΄ ${warehouse.name} Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΠ΅Π½Π΅Π΅ 5 Π΄Π½Π΅ΠΉ Π² нСдСлю`);
      }
    });
    
    return report;
  }
}

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΠΌ

class WarehouseAnalytics {
  async generateDashboard() {
    const [warehouses, ...deliveryMethodsPromises] = await Promise.all([
      client.warehouse.getWarehousesList(),
      // ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доставки для ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 5 складов
      ...Array(5).fill(0).map((_, i) => 
        client.warehouse.getDeliveryMethods({
          limit: 10,
          filter: { warehouse_id: i + 1 }
        }).catch(() => ({ result: [], has_next: false }))
      )
    ]);
    
    const dashboard = {
      timestamp: new Date().toISOString(),
      summary: {
        warehouses: warehouses.result?.length ?? 0,
        activeWarehouses: warehouses.result?.filter(w => w.status === 'created').length ?? 0,
        totalDeliveryMethods: deliveryMethodsPromises.reduce((sum, methods) => 
          sum + (methods.result?.length ?? 0), 0)
      },
      alerts: [] as string[],
      metrics: {
        rfbsRatio: 0,
        economyRatio: 0,
        kgtRatio: 0,
        avgWorkingDays: 0
      }
    };
    
    const active = warehouses.result?.filter(w => w.status === 'created') ?? [];
    
    if (active.length > 0) {
      dashboard.metrics.rfbsRatio = active.filter(w => w.is_rfbs).length / active.length;
      dashboard.metrics.economyRatio = active.filter(w => w.is_economy).length / active.length;
      dashboard.metrics.kgtRatio = active.filter(w => w.is_kgt).length / active.length;
      dashboard.metrics.avgWorkingDays = active.reduce((sum, w) => 
        sum + (w.working_days?.length ?? 0), 0) / active.length;
    }
    
    // ГСнСрация Π°Π»Π΅Ρ€Ρ‚ΠΎΠ²
    if (dashboard.summary.activeWarehouses === 0) {
      dashboard.alerts.push('🚨 НСт Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… складов!');
    }
    
    if (dashboard.metrics.avgWorkingDays < 5) {
      dashboard.alerts.push('⚠️ БрСдняя рабочая нСдСля мСньшС 5 Π΄Π½Π΅ΠΉ');
    }
    
    return dashboard;
  }
}

🀝 БвязанныС API

  • FBS API β€” Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ FBS Π·Π°ΠΊΠ°Π·Π°ΠΌΠΈ
  • Delivery FBS API β€” Настройка доставки FBS
  • Prices & Stocks API β€” Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ остатками ΠΏΠΎ складам
  • Analytics API β€” Аналитика ΠΏΠΎ складам

πŸ“ž ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°

Нашли ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈΠ»ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ?

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ рСсурсы:


🏠 Главная докумСнтация πŸ“š ВсС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ