πͺ Warehouse API
πͺ 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 β ΠΠ½Π°Π»ΠΈΡΠΈΠΊΠ° ΠΏΠΎ ΡΠΊΠ»Π°Π΄Π°ΠΌ
π ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ°
ΠΠ°ΡΠ»ΠΈ ΠΎΡΠΈΠ±ΠΊΡ ΠΈΠ»ΠΈ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ»ΡΡΡΠΈΡΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ?
- π Π‘ΠΎΠ·Π΄Π°ΡΡ Issue
- π§ Pull Request
- π¬ GitHub Discussions
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ:
- π ΠΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ OZON
- β Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ SDK
- π¦ NPM ΠΏΠ°ΠΊΠ΅Ρ
π ΠΠ»Π°Π²Π½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ | π ΠΡΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ |