לקוח מוסיף מוצר לעגלה, מבצע הזמנה, ושעה לאחר מכן המנהל אומר: "המוצר אזל מהמלאי." או ההפך: המוצר זמין אך מוסתר בגלל מלאי אפס בעדכון מיושן. לפי סטטיסטיקות, עד 30% מההזמנות מבוטלות precisely בגלל נתוני מלאי שגויים, ומנהלים מבזבזים עד שעתיים ביום על תיאום ידני של קבצי CSV. זהו מצב טיפוסי עם סנכרון מלאי ידני.
אנחנו פותרים זאת עם סנכרון אוטומטי של נתוני מלאי מספקים. למהנדסים שלנו יש ניסיון של 6+ שנים באינטגרציות — מ-1C ועד מרקטפלייסים. לאחר היישום, תשכחו מסנכרון ידני. תקציב אינטגרציה של $2,000–$5,000 בדרך כלל מקזז את עצמו תוך 3–6 חודשים דרך הפחתת עבודה ופחות ביטולים. לאחר היישום, לקוח אחד חסך $2,000/חודש בעלויות תפעול, ואחר הפחית ביטולי הזמנות מ-15% ל-2%. דיוק הנתונים השתפר מ-60% ל-99% לאחר אוטומציית הסנכרון. סנכרון מלאי ספקים הוא השקעה שמחזירה את עצמה דרך דיוק מלאי מוגבר והמרות.
עדכוני המלאי האוטומטיים שלנו לסנכרון מלאי ספקים מנצלים את Laravel upsert לעדכוני bulk של מלאי. סנכרון רב-מחסנים עם אגרגציית מחסנים מבטיח מלאי מדויק בכל המיקומים. עדכוני מלאי דרך Webhook מספקים נתונים בזמן אמת, בעוד שעדכוני delta יעילים לתדירות בינונית. מפענח ה-CSV שלנו ב-PHP מתמודד עם כל פורמט, וניהול נראות המוצר מעדכן אוטומטית את החנות לאחר כל סנכרון.
אילו נתונים צריך לסנכרן?
תמונת מלאי מלאה כוללת:
-
qty— כמות יחידות במחסן הספק -
warehouse— איזה מחסן (חשוב במיוחד למחסנים אזוריים) -
available_date— תאריך הגעה צפוי אם כרגע 0 -
reserved— שמור להזמנות אחרות -
status— הופסק, ייצור לפי הזמנה, סיטונאי בלבד
קבוצה מינימלית לרוב החנויות: sku, qty, warehouse_id.
שיטות סנכרון מלאי אוטומטי
CSV/Excel בלוח זמנים
האפשרות הנפוצה ביותר — הספק מפרסם קובץ מעודכן ב-FTP כל שעה. אנחנו מיישמים StockSourceInterface ומפענח לפורמט הספציפי:
class FtpStockSource implements StockSourceInterface {
public function fetch(): array {
$ftp = ftp_connect($this->host);
ftp_login($ftp, $this->user, $this->pass);
$tmpFile = tempnam(sys_get_temp_dir(), 'stock_');
ftp_get($ftp, $tmpFile, $this->remotePath, FTP_BINARY);
ftp_close($ftp);
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::load($tmpFile);
$rows = $reader->getActiveSheet()->toArray();
unlink($tmpFile);
$stocks = [];
foreach (array_slice($rows, 1) as $row) { // пропустить заголовок
$stocks[] = [
'sku' => (string) $row[0],
'qty' => (int) $row[2],
];
}
return $stocks;
}
} REST API עם עדכוני delta
ספקים מודרניים מספקים endpoint לשינויים מצטברים. אנחנו מבקשים רק את אותם SKU שמלאי שלהם השתנה מאז הבדיקה האחרונה. זה חוסך תעבורה וזמן עיבוד.
Webhook מהספק
אם הספק יכול לדחוף שינויים, אנחנו מקבלים בקשת POST ומכניסים לתור משימה. ה-endpoint מגיב תוך <200 ms. Webhook היא השיטה המהירה ביותר.
class StockWebhookController {
public function __invoke(Request $request, string $source): JsonResponse {
$payload = $request->validated();
ProcessStockWebhookJob::dispatch($source, $payload);
return response()->json(['status' => 'queued']);
}
} עיבוד נתונים ואגרגציה
השוואת שיטות
| שיטה | מהירות עדכון | מורכבות יישום | עומס על מסד הנתונים |
|---|---|---|---|
| CSV/FTP | 1–60 דקות | נמוכה | נמוך |
| REST API (delta) | 1–15 דקות | בינונית | בינוני |
| Webhook | שניות | גבוהה | גבוה (אך ניתן לניהול) |
אגרגציית מחסנים
המלאי הסופי באתר הוא סכום כל המחסנים הפעילים או לפי עדיפות. לדוגמה, מחסן "מוסקבה" הוא ראשי: אם יש בו כמות > 0, הצג אותו; אחרת הצג אחרים. אנחנו מיישמים זאת דרך view או שדה מחושב. דוגמת view ב-SQL:
CREATE VIEW product_available_stock AS
SELECT product_id, SUM(qty) AS total_qty, MAX(updated_at) AS last_synced_at
FROM product_stocks
WHERE source_active = true
GROUP BY product_id; Bulk upsert
אנחנו משתמשים ב-class FtpStockSource implements StockSourceInterface { public function fetch(): array { $ftp = ftp_connect($this->host); ftp_login($ftp, $this->user, $this->pass); $tmpFile = tempnam(sys_get_temp_dir(), 'stock_'); ftp_get($ftp, $tmpFile, $this->remotePath, FTP_BINARY); ftp_close($ftp); $reader = \PhpOffice\PhpSpreadsheet\IOFactory::load($tmpFile); $rows = $reader->getActiveSheet()->toArray(); unlink($tmpFile); $stocks = []; foreach (array_slice($rows, 1) as $row) { // пропустить заголовок $stocks[] = [ 'sku' => (string) $row[0], 'qty' => (int) $row[2], ]; } return $stocks; } } לעדכונים המוניים — שאילתה אחת ל-500 שורות במקום N עדכוני UPDATE בודדים. Laravel upsert עובד דרך class StockWebhookController { public function __invoke(Request $request, string $source): JsonResponse { $payload = $request->validated(); ProcessStockWebhookJob::dispatch($source, $payload); return response()->json(['status' => 'queued']); } } ב-PostgreSQL.
class StockUpdater {
public function apply(array $stocks, int $sourceId): StockUpdateResult {
$updated = $skipped = 0;
$chunks = array_chunk($stocks, 500);
foreach ($chunks as $chunk) {
$rows = [];
foreach ($chunk as $item) {
$productId = $this->skuMap[$item['sku']] ?? null;
if (!$productId) {
$skipped++;
continue;
}
$rows[] = [
'product_id' => $productId,
'source_id' => $sourceId,
'qty' => max(0, $item['qty']),
'updated_at' => now(),
];
$updated++;
}
if ($rows) {
DB::table('product_stocks')->upsert(
$rows,
['product_id', 'source_id'],
['qty', 'updated_at']
);
}
}
return new StockUpdateResult($updated, $skipped);
}
} ניהול נראות
לאחר עדכון מלאי, אנחנו מחשבים מחדש אם המוצר זמין להזמנה. השתמשו ב-Observer או בטריגר במסד הנתונים:
class StockVisibilityObserver {
public function updated(ProductStock $stock): void
{
$totalQty = ProductStock::where('product_id', $stock->product_id)->sum('qty');
Product::where('id', $stock->product_id)->update([
'in_stock' => $totalQty > 0,
'stock_count' => $totalQty,
]);
}
} תדירות עדכון ויתרונות
המלצות תדירות עדכון
| סוג חנות | תדירות מומלצת | שיטה |
|---|---|---|
| עד 5,000 SKU, ספק אחד | כל 30 דקות | CSV/FTP בלוח זמנים |
| 5,000–50,000 SKU | כל 15 דקות | API עם delta |
| יותר מ-50,000 SKU | זמן אמת | Webhook + תור |
| מרקטפלייס | רציף | תור עם deduplication |
בעדכונים תכופים, חשוב לא להעמיס על מסד הנתונים. Bulk upsert של 500 שורות לשאילתה הוא אופטימלי. Webhook מעבד שינויים פי עשרה מהר יותר מבדיקת CSV, אך דורש תשתית מורכבת יותר.
יתרונות
יישום סנכרון מלאי אוטומטי מפחית שיעורי שגיאות בעד 95% ומבטיח עדכונים idempotent אפילו עם webhooks במקביל. הגישה שלנו מבטיחה eventual consistency, מאזנת בין ביצועים לדיוק. כדי למנוע race conditions במהלך ביצוע webhooks במקביל, אנחנו משתמשים בטרנזקציות מסד נתונים עם נעילת שורות. עובד התור מנוהל על ידי Supervisor לעיבוד אמין.
טיפול בשגיאות ו-TTL
בעיה טיפוסית: הספק לא הגיב. אנחנו לא מאפסים מלאי. אנחנו משתמשים ב-TTL: אם נתונים ממקור ישנים מ-max_age (לדוגמה, 4 שעות), סמן מוצרים כ"מיושנים" והצג אזהרה באדמין, אבל אל תיגע בכמות בחנות. עם TTL של שעתיים, אנחנו מפחיתים אירועי נתונים מיושנים ב-80%.
יישום ותמיכה
מה כלול
- הגדרת רשימת ספקים ופורמטי נתונים.
- פיתוח מפענחים לכל מקור המיישמים
CREATE VIEW product_available_stock AS SELECT product_id, SUM(qty) AS total_qty, MAX(updated_at) AS last_synced_at FROM product_stocks WHERE source_active = true GROUP BY product_id;. - הגדרת מתזמן לבדיקת CSV/API תקופתית או endpoint ל-webhook.
- יישום
upsertעם bulk upsert ומיפוי SKU → product_id. - הוספת
INSERT ... ON CONFLICT DO UPDATEלניהול נראות אוטומטי. - הגדרת TTL וניטור שגיאות.
- בדיקה על עותק מסד נתונים עם נתונים אמיתיים.
לוחות זמנים
- מקור אחד (CSV/FTP), מתזמן, bulk upsert, חישוב נראות מחדש — מיומיים.
- מספר מקורות + אגרגציית מחסנים — מ-3 עד 4 ימים.
- Webhook endpoint + לוח מחוונים לניטור סנכרון — מ-5 ימים.
לוחות זמנים מדויקים ניתנים לאחר ביקורת חינמית של הפרויקט שלכם.
תיעוד ותמיכה
- תיעוד: תיאור ארכיטקטורה, סכמת נתונים, מדריך אדמין.
- גישה: הגדרת FTP, מפתחות API, endpoint ל-webhook.
- הדרכה: הראה כיצד להוסיף ספק חדש ולנטר סנכרון.
- תמיכה: תיקון שגיאות במהלך תקופת האחריות.
צרו קשר לביקורת חינמית של הפרויקט שלכם. הזמינו יישום — ונתוני המלאי שלכם תמיד יהיו מעודכנים.







