מנהלים מבלים עד שעתיים ביום במעבר בין לוחות הבקרה של Ozon, Wildberries ו-Yandex.Market. לפי הנתונים שלנו, סנכרון ידני מוביל לאובדן של 15–20% מההזמנות ועד 80% מהביקורות השליליות עקב עיכובים. אוטומציה מפחיתה סיכונים אלה לאפס, וזמן עיבוד ההזמנה הממוצע יורד מ-5 דקות ל-30 שניות, וחוסך למפעילים עד 450–650 דולר בחודש. לוח בקרה מאוחד להזמנות פותר זאת: הוא אוסף את כל ההזמנות מהאתר ומהמרקטים לממשק אחד. המנהל עובד בחלון אחד — רואה הזמנות חדשות, משנה סטטוסים, מדפיס תוויות ללא מעבר בין פלטפורמות. החזר השקעה לפתרון כזה הוא בממוצע 2–3 חודשים הודות להפחתת עלויות העבודה של מחלקת המכירות. יש לנו ניסיון של 12+ שנים בפיתוח אתרים ויותר מ-50 אינטגרציות מוצלחות למרקטים.
למה לוח בקרה מאוחד להזמנות?
ייצוא ידני של הזמנות — מפעילים מעתיקים נתונים מחמישה לוחות בקרה, עושים שגיאות במספרים, מאבדים הזמנות. הזמנות FBS עם מועדי הרכבה קצרים (4 שעות ב-Ozon) נעלמות מעין. כפילויות וקונפליקטים — אותה הזמנה עשויה להיווצר פעמיים אם ה-API של המרקט מחזיר נתונים שוב. הפתרון שלנו משתמש בתבנית Repository להסרת כפילויות וב-Adapter לאחד נתונים ממקורות שונים. זה מבטיח עיבוד של עד 1000 הזמנות בדקה ללא אובדן. השוו: טיפול ידני דורש 2–3 מפעילים, לוח הבקרה האוטומטי מתמודד לבד — פי 10 מהר יותר. חלון הזמנות אחד המשלב Ozon, Wildberries, Yandex.Market והאתר נותן שליטה מלאה על כל התהליכים.
איך אנו מסנכרנים הזמנות ללא אובדן?
הסנכרון מבוסס על מערכת ה-Queue של Laravel. כל מרקט נסרק בתדירות קבועה (בדרך כלל כל 5–15 דקות). כל ההזמנות החדשות והמשונות ממופות לפורמט משותף ונשמרות מקומית. לאמינות, אנו מתעדים כל ריצה ומנסים שוב אוטומטית במקרה של כשל. מושג התורים מתואר ב-Laravel Queues.
כך נראית מחלקת הסנכרון המרכזית:
// Периодически подтягиваем заказы со всех маркетплейсов class MarketplaceOrdersSyncJob implements ShouldQueue { public function handle(): void { $adapters = [ 'ozon' => app(OzonAdapter::class), 'wb' => app(WildberriesAdapter::class), 'ym' => app(YandexMarketAdapter::class), ]; foreach ($adapters as $source => $adapter) { try { $lastSync = SyncLog::where('source', $source)->max('synced_at') ?? now()->subHours(24); $orders = $adapter->getOrdersSince($lastSync); foreach ($orders as $rawOrder) { $unified = $adapter->toUnifiedOrder($rawOrder); Order::updateOrCreate( ['source' => $source, 'source_order_id' => $unified->sourceOrderId], $unified->toArray() ); } SyncLog::create(['source' => $source, 'synced_at' => now(), 'count' => count($orders)]); } catch (Exception $e) { Log::error("Sync failed for {$source}", ['error' => $e->getMessage()]); } } } } הסרת כפילויות בהזמנות מבטלת כפילויות — לוח בקרה מאוחד
ללא הסרת כפילויות, בקשה חוזרת ל-API (עקב תקלת רשת) יוצרת הזמנה כפולה. אנו משתמשים ב-// Периодически подтягиваем заказы со всех маркетплейсов class MarketplaceOrdersSyncJob implements ShouldQueue { public function handle(): void { $adapters = [ 'ozon' => app(OzonAdapter::class), 'wb' => app(WildberriesAdapter::class), 'ym' => app(YandexMarketAdapter::class), ]; foreach ($adapters as $source => $adapter) { try { $lastSync = SyncLog::where('source', $source)->max('synced_at') ?? now()->subHours(24); $orders = $adapter->getOrdersSince($lastSync); foreach ($orders as $rawOrder) { $unified = $adapter->toUnifiedOrder($rawOrder); Order::updateOrCreate( ['source' => $source, 'source_order_id' => $unified->sourceOrderId], $unified->toArray() ); } SyncLog::create(['source' => $source, 'synced_at' => now(), 'count' => count($orders)]); } catch (Exception $e) { Log::error("Sync failed for {$source}", ['error' => $e->getMessage()]); } } } } ייחודי לכל הזמנה בתוך מרקט, כך ש-source_order_id פשוט מעדכן את הרשומה הקיימת. זה מונע כפילויות גם בקריאות חוזרות. הפאנל של Laravel React הבנוי על עיקרון זה מטפל באמינות באלפי הזמנות ביום.
פונקציונליות לוח הבקרה
רשימת הזמנות
- סינון לפי מקור (אתר, Ozon, WB, Yandex.Market)
- סינון לפי סטטוס, תאריך, סכום
- חיפוש לפי מספר הזמנה, שם לקוח, SKU
- מחוון דחיפות (הזמנות FBS עם זמן הרכבה קצר — רקע אדום)
- פעולות קבוצתיות: אישור מספר הזמנות, הדפסת תוויות
function OrdersDashboard() { const [filters, setFilters] = useState({ source: 'all', status: 'all', search: '' }); const { data, isLoading } = useQuery({ queryKey: ['orders', filters], queryFn: () => fetchOrders(filters), refetchInterval: 60_000, // обновление каждую минуту }); return ( <div> <OrderFilters filters={filters} onChange={setFilters} /> {/* Счётчики по источникам */} <div className="grid grid-cols-5 gap-3 mb-6"> {['site', 'ozon', 'wb', 'ym'].map(source => ( <SourceCounter key={source} source={source} count={data?.counts[source] ?? 0} /> ))} </div> <OrdersTable orders={data?.orders ?? []} loading={isLoading} onStatusChange={handleStatusChange} /> </div> ); } function SourceCounter({ source, count }: { source: string; count: number }) { const labels = { site: 'Сайт', ozon: 'Ozon', wb: 'WB', ym: 'Яндекс.Маркет' }; return ( <div className={cn('rounded-xl p-4 border', sourceColors[source])}> <p className="text-2xl font-bold">{count}</p> <p className="text-sm text-gray-600">{labels[source]}</p> </div> ); } כרטיס הזמנה
- נתוני לקוח ומשלוח מלאים
- רשימת מוצרים עם תמונות
- כפתורי פעולה לפי סטטוס (אישור, ביטול, שליחה להרכבה)
- הדפסת תווית / מסמך העברה
- היסטוריית שינויי סטטוס עם חותמות זמן
הדפסת תוויות
כל מרקט דורש פורמט תווית משלו. אנו בוחרים תבנית אוטומטית לפי המקור:
public function printLabel(Order $order): Response { if ($order->source === 'ozon') { $label = $this->ozon->getPostingLabel($order->source_order_id); return response($label, 200, ['Content-Type' => 'application/pdf']); } if ($order->source === 'wb') { $label = $this->wb->getLabel($order->source_order_id); return response($label, 200, ['Content-Type' => 'application/pdf']); } // Для сайта генерируем сами $pdf = PDF::loadView('labels.order', compact('order')); return $pdf->stream("order-{$order->number}.pdf"); } להדפסה בכמות גדולה, ניתן לבחור מספר הזמנות וללחוץ על "הדפס תוויות" — המערכת מייצרת PDF אחד עם כל התוויות.
התראות על הזמנות חדשות
התראות בזמן אמת דרך WebSocket (Laravel Echo / Pusher) — כשהזמנה חדשה מגיעה מכל מרקט, לוח הבקרה מתעדכן אוטומטית ומציג התראה toast. המפעיל יכול להתחיל לעבוד על ההזמנה מיד ללא רענון הדף.
סקירת תהליך
- ניתוח — אנו חוקרים את ה-API של המרקטים שלך, מתעדים שדות לסנכרון.
- עיצוב — תכנון מבנה מסד נתונים, מערכת תורים, סכמת התראות.
- יישום — כתיבת מתאמים, ממשק, לוגיקת סנכרון.
- בדיקות — בדיקה עם הזמנות לדוגמה, סימולציה של תקלות רשת, קונפליקטי נתונים.
- פריסה — פריסה על האירוח שלך או השרת שלנו, הגדרת ניטור.
| שלב | משך | תוצאה |
|---|---|---|
| ניתוח | 1-2 ימים | מסמך מפרט אינטגרציה |
| עיצוב | 2-3 ימים | סכמת מסד נתונים, מפרט API |
| יישום | 10-14 ימים | פאנל מוכן עם נתוני בדיקה |
| בדיקות | 3-4 ימים | פרוטוקול בדיקות, תיקוני באגים |
| פריסה | 2 ימים | פאנל עובד, מדריך למפעיל |
השוואת גישות לניהול הזמנות
| קריטריון | ניהול ידני | לוח בקרה אוטומטי |
|---|---|---|
| זמן עיבוד הזמנה | 5 דקות | 30 שניות |
| מספר מפעילים | 2-3 | 1 |
| סיכון לאובדן הזמנות | 15-20% | 0% |
| תדירות שגיאות | גבוהה | מינימלית |
| חיסכון בעלויות | $?/חודש | עד 450–650 דולר/חודש |
ציר זמן ומה כלול
לוח בקרה ל-3 מרקטים עם סנכרון והדפסת תוויות: 20–28 ימי עבודה. אנו עובדים במחיר קבוע, המחושב באופן אישי. כולל:
- אינטגרציה של עד 4 מקורות (אתר + 3 מרקטים)
- ממשק אינטרנט עם רשימת הזמנות, סינונים, חיפוש ומונה
- הדפסת תוויות לכל מרקט
- מערכת התראות (WebSocket + דוא"ל)
- תיעוד ניהול
- הדרכת מפעילים (שעה)
- אחריות סנכרון — 6 חודשים
פרטי אינטגרציה טכניים
במהלך היישום אנו מגדירים:
- תורי Laravel עם Supervisor
- מנגנון חידוש טוקן (OAuth2 refresh)
- תיעוד כל בקשות ה-API למרקטים
- ניטור דרך Grafana + Prometheus
- גיבוי מסד נתוני ההזמנות
טעויות אינטגרציה נפוצות
- פגות טוקן — רוב המרקטים מנפיקים טוקנים בתוקף של 24 שעות. אנו מחדשים אותם אוטומטית דרך מנגנון refresh.
- הבדלי אזורי זמן — הזמנה שנוצרה ב-23:59 שעון מוסקבה עשויה להופיע כמחרת. אנו ממירים הכל ל-UTC.
- כפילויות בניסיונות חוזרים — אם ה-API נכשל, הבקשה חוזרת, ועלולה ליצור כפילויות. אנו משתמשים ב-
updateOrCreateלהסרת כפילויות.
קבלו ייעוץ לפרויקט שלכם — נעזור להעריך ציר זמן ועלות. צרו קשר לקבלת חישוב מפורט.







