مرحباً @Thabang_Makalela
بما أنك تتعامل مع ثلاث خدمات مختلفة (Ride و Food و Collection)، فإن وضع كل هذه المنطق في سير عمل واحد سيؤدي في النهاية إلى لوحة رسم “فوضوية”. العمارة الأكثر قابلية للتوسع هي نمط Router → Service.
العمارة:
-
سير عمل الموجه الرئيسي:
- يستقبل webhook من WhatsApp.
- يتحقق من الموقع.
- يستخدم Switch Node لتحديد الخدمة (Ride مقابل Food مقابل Collection).
- يستخدم Execute Workflow Node لاستدعاء سير عمل فرعي محدد (مثل
Service_Ride_Booking).
- حاسم: مرر حمولة
json الكاملة كمدخل لسير العمل الفرعي.
-
سير عمل الخدمات الفرعية:
- يبدأ كل سير عمل فرعي مع Execute Workflow Trigger.
- يستقبل الموقع، ويقوم بالبحث في Google Sheets، ويتعامل مع منطق الأعمال.
- بما أن الموقع يتم تمريره كمدخل أولي، فإنه يكون متاحاً دائماً في بداية العملية الفرعية.
3 إعجابات
نقطة جيدة حول فصل Router → Service للحفاظ على قابلية الصيانة على المدى الطويل. شيء واحد يستحق الإضافة لأي شخص يريد إعدادًا أبسط في البداية: حتى في سير عمل واحد مسطح (بدون فصل Execute Workflow)، لا تحتاج فعلاً إلى عقد Merge أو Code لنقل الموقع للأمام.
n8n يحافظ على مخرجات كل عقدة متاحة للتنفيذ بأكمله، وليس فقط ما يبدو عليه “العنصر الحالي” عند نقطة معينة. لذا في المصب - بما في ذلك داخل كل فرع Switch - يمكنك الإشارة مباشرة إلى عقدة الحافز الأصلية بدلاً من العنصر الحالي:
{{ $('WhatsApp Trigger').item.json.location.latitude }}
{{ $('WhatsApp Trigger').item.json.location.longitude }}
(استبدل الاسم باسم عقدة الحافز الفعلية لديك). يتم حل هذا بشكل صحيح حتى بعد أن يقوم Find Active Ride / Find Active Order بالكتابة فوق العنصر الحالي، طالما تحافظ على إقران عنصر عادي واحد لواحد على طول الطريق (تجنب عقد Code التي تبني عناصر جديدة تماماً بدون pairedItem، تجنب عقد Merge التي قد تكسر النسب).
إذن: سير عمل واحد + مراجع $('WhatsApp Trigger') يحل مشكلة “الحمولة تتم الكتابة فوقها” بدون أي توجيه إضافي. فصل Router → Service أعلاه لا يزال الخيار الأفضل بمجرد أن تصبح الفروع معقدة بما يكفي لتريد سير عمل فرعي معزول وقابل للاختبار بشكل مستقل.
3 إعجابات
يُعتبر النهج الجيد هو الحفاظ على بيانات webhook الأصلية قبل إرسال سير العمل إلى عقد خاصة بالخدمة. في n8n، يمكن استخدام عقدة Set لتخزين حقول الموقع، أو عقدة Merge لدمج الحمل الأصلي مع نتائج Google Sheets لاحقًا، مما يساعد في الحفاظ على قيم خطوط العرض والطول. سيساعد تنظيم كل فرع خدمة بمعالجة بيانات واضحة أيضًا على جعل سير العمل أسهل للتوسع والتصحيح. بالنسبة للفرق التي تخطط لخدمات متعلقة بالطعام، وجدت أيضًا مصدرًا مفيدًا حول قائمة
Olive Garden التي قد توفر بعض الإلهام.
تعديل صغير لكن مهم في طريقة ('WhatsApp Trigger')$: استخدم .first() بدلاً من .item هنا.
.item يتم حله من خلال إقران العناصر، وفي اللحظة التي تعيد فيها عملية البحث عن Sheets عدداً مختلفاً من العناصر عما أرجعته الحافزة، ينقطع هذا الإقران — تحصل إما على إحداثيات الصف الخاطئة أو خطأ “لا يمكن تحديد العنصر المراد استخدامه”، وعادة ما يظهر لاحقاً عند إضافة فرع، وليس الآن. إن webhook الخاص بـ WhatsApp هو رسالة واحدة لكل تنفيذ، لذا فإن $('WhatsApp Trigger').first().json.location.latitude لا لبس فيه ويبقى صحيحاً بغض النظر عما تفعله الفروع.