توثيق المستودع المتنقل وماسح الباركود لأودو (مستودع بلا ورق)
دليل المستودع المتنقل وماسح الباركود لأودو: تثبيت الوحدة والتطبيق وإعداد ماسحات Zebra وHoneywell وDatalogic والخانات وأرقام التحقق وGS1 والباركود والاستلام والتسليم والتحويلات والموجات والدفعات والانتهاء والجرد الدوري والمزامنة دون اتصال والملصقات والتقارير والواجهة والحدود وحل المشكلات.
يشرح الإصدار 1.0.0حُدّث في 29 أكتوبر 2026
ابدأ من هنا
ببساطة: تمنحك هذه الحزمة مستودعًا بلا أوراق على أودو Community: وحدة أودو (
taqnix_wms_barcode) فيها محرك الباركود والعمليات والموجات وعمليات الجرد الدوري وسجل التدقيق، والشيفرة المصدرية بـ Flutter لـتطبيق ماسح للأجهزة الصناعية من Zebra وHoneywell وDatalogic، مع كاميرا الهاتف العادي كخيار بديل (346 اختبار Dart و53 اختبار Kotlin، وشُغّل من البداية إلى النهاية على محاكي iOS مقابل هذه الوحدة؛ ولم يُشغَّل على ماسح صناعي حقيقي، انظر الفصل 31). يستلم المشغّلون ويلتقطون وينقلون ويجردون بزناد الماسح. لا أحد يكتب في حقل نصي.نصيحة: لا تحتاج إلى أي تطبيق من أودو Enterprise. تحل الوحدة محل تطبيق الباركود في Enterprise بالاعتماد على
stock وbarcodes وترميز GS1 اللذين يأتيان أصلًا مع أودو Community.محتويات الحزمة
| البند | ما هو |
|---|---|
taqnix_wms_barcode.zip | وحدة أودو 19: محلّل الباركود (GS1 وEAN وUPC والتعبئة وباركود الوزن والسعر)، ومحرك المسح للاستلام والتسليم والتحويلات الداخلية، والموجات على مسار محسَّن، وعمليات الجرد الدوري، وأرقام التحقق للخانات وتسلسل الالتقاط، والملصقات، وسجل المسح، وواجهة برمجة التطبيق، وترجمة عربية، واختبارات آلية. |
flutter-app-source.zip | مشروع Flutter لتطبيق الماسح على أندرويد (الماسحات الصناعية والكاميرا) وiOS (الكاميرا)، مع اختباراته وملفات README وCHANGELOG وdocs/ARCHITECTURE.md. انظر الفصول من 6 إلى 8 و26. |
documentation/ | هذا الدليل بالإنجليزية (index.html) والعربية (index-ar.html) مع ملفات PDF، والملف API.md للمطورين. |
licensing/ | الرخصة (OPL-1: شراء واحد = شركة واحدة، مع التحديثات). |
preview-images/ | لقطات من شاشات أودو ومن التطبيق. |
changelog.txt | سجل الإصدارات. |
كيف تعمل
| اللحظة | من | ماذا يحدث على الماسح | في أودو |
|---|---|---|---|
| الاستلام | المشغّل | يفتح الاستلام ويمسح خانة التجهيز ثم يمسح المنتجات (كل مسح يضيف وحدة، وباركود الكرتون يضيف الكرتون كله). لا تُطلب الدفعات والأرقام التسلسلية وتواريخ الانتهاء إلا إذا احتاجها المنتج. | تُحفظ عمليات المسح على سطور عملية النقل. لا شيء يتحرك بعد. |
| الاستلام | المشغّل | يضغط اعتماد. إذا كان هناك نقص يسأل الماسح: أمر مؤجل أم لا. | يُعتمد الاستلام وتُنشأ الدفعات، ويُنشأ أمر مؤجل إذا طُلب. |
| التخزين | المشغّل | يفتح عملية التخزين ويمسح المنصة (مسح واحد ينقل الحزمة كلها) وخانة الوجهة، ثم يكتب رقمي التحقق المطبوعين على ملصق الخانة. | يُعتمد تحويل داخلي. تنتقل كميات المنصة في المخزون بدقة. |
| الالتقاط | المشغّل | يفتح تسليمًا أو موجة ويتبع المسار خانة بعد خانة (تظهر الخانة التالية بحروف كهرمانية كبيرة) ويمسح الخانة والمنتج والدفعة. | تحصل سطور الحركة على الكمية الممسوحة؛ ويُرفض الصنف الخاطئ أو الدفعة المنتهية أو الزيادة بصوت إنذار. |
| الجرد | المشغّل | يمسح الرف ثم يمسح ما عليه. لا يعرض الجرد الأعمى الكمية المتوقعة أبدًا. | يحتفظ الجرد بالكمية المتوقعة مجمّدة عند البدء، وبالمخزون الحي وبالانحراف. |
| الاعتماد | المدير | يراجع الفروق في أودو ويعتمد. | تسوية مخزون واحدة لكل سطر، مرة واحدة. |
ببساطة: الغلبة للمستودع. لا تُرفض أبدًا حركة حدثت فعلًا على الأرض بسبب قاعدة مرنة: إذا أخذ المشغّل البضاعة من خانة أخرى، أو أخذ أكثر قليلًا من المطلوب ضمن هامش التسامح لديك، أو زامن بعد ساعتين، فإن الخادم يقبل ذلك ويرفع تنبيهًا ومهمة للمدير (الفصول 12 إلى 18). وحدها الأخطاء الصارمة تُرفض: عملية نقل مغلقة، أو منتج متتبَّع بلا دفعة، أو رقم تسلسلي موجود في المخزون، أو دفعة منتهية، أو التقاط زائد يتجاوز هامش التسامح.
ما تحتاج إليه
| البند | التفاصيل |
|---|---|
| أودو | الإصدار 19.0 Community أو Enterprise. تعتمد الوحدة على المخزون (stock) وproduct وbarcodes وترميز GS1 (barcodes_gs1_nomenclature) وmail. لا تلزم المشتريات ولا المبيعات؛ وتُستخدم استلامات أوامر الشراء عند تثبيت المشتريات. |
| المواقع | الخانات كمواقع مخزون. تعمل المواقع متعددة الخطوات وعدة مستودعات والدفعات والأرقام التسلسلية والحزم ووحدات القياس ذات الباركود كلها؛ فعّل إعدادات المخزون التي تستخدمها (تفعّل الوحدة نوع عملية التحويل الداخلي). |
| العنوان | عنوان https عام لأودو (أو شبكتك الافتراضية الخاصة VPN) تصل إليه الماسحات. الشهادة الموقّعة ذاتيًا لا تعمل في التطبيق. |
| الماسحات | أندرويد 7.0 أو أحدث. الأجهزة الصناعية: Zebra (DataWedge) وHoneywell (Data Intent) وDatalogic (DecodeWedge)، أو أي ماسح يرسل نيّة أو مفاتيح. يعمل أي هاتف أندرويد أو آيفون (iOS 15.5 أو أحدث) بالكاميرا. ولبناء التطبيق: Flutter 3.41. |
| محرك PDF | wkhtmltopdf كأي أودو، لطباعة ملصقات الخانات والحزم. |
ثبّت وحدة أودو
- فُكّ ضغط الحزمة. بداخلها
taqnix_wms_barcode.zip؛ فُكّه لتحصل على المجلدtaqnix_wms_barcode. - انسخ المجلد إلى أحد مجلدات
addons_pathفي خادم أودو وأعد تشغيل أودو. - سجّل الدخول كمدير وفعّل وضع المطوّر ثم افتح التطبيقات واضغط تحديث قائمة التطبيقات.
- أزل مرشح «التطبيقات» وابحث عن Mobile WMS واضغط تثبيت.
# or from the command line ./odoo-bin -c odoo.conf -d YOUR_DATABASE -i taqnix_wms_barcode --stop-after-init
ببساطة: بعد التثبيت تفعّل الوحدة نوع العملية التحويلات الداخلية في كل مستودع (يبقيه أودو مؤرشفًا إلى أن تُفعَّل المواقع المتعددة)، وتختار ترميز GS1 الافتراضي في إعدادات كل شركة. تظهر قائمة إدارة المستودع المتنقل لمستخدمي المجموعة «إدارة المستودع المتنقل / مدير»؛ ويحصل عليها مدير النظام تلقائيًا.
ثبّت التطبيق على الماسحات
ببساطة: التطبيق مشروع Flutter قياسي (Flutter 3.41 مع Dart 3.11، وأندرويد SDK بمستوى API 24 أو أحدث أي أندرويد 7.0، وXcode للآيفون). الحزمة
taqnix_wms_scanner ومعرّف التطبيق ومعرّف الحزمة com.taqnix.wmsscanner والاسم الظاهر Taqnix WMS Scanner. لا يستخدم Firebase ولا خدمة إشعارات: الشيء الوحيد الذي تضبطه هو عنوان أودو لديك.- فُكّ ضغط
flutter-app-source.zipوافتح الطرفية في المجلد. - نزّل الحزم:
flutter pub get. طبقة قاعدة البيانات (Drift) مولَّدة ومضمَّنة أصلًا؛ لا تشغّلdart run build_runner build --delete-conflicting-outputsإلا إذا غيّرت الجداول. وبعد تعديل نصوص التطبيق يعيد الأمرpython3 tool/l10n_src.py && flutter gen-l10nتوليد الترجمات. - افحص المشروع:
flutter analyzeوflutter test(توصَف المجموعة في الفصل 26). - شغّله على جهاز أندرويد موصول أو على محاكٍ:
flutter run --dart-define=SITE_URL=https://odoo.example.com. المتغيرSITE_URLاختياري: وبدونه تعرض شاشة الدخول حقل عنوان الخادم. - ابنِ تطبيق أندرويد للأجهزة الصناعية:
flutter build apk --release --dart-define=SITE_URL=https://odoo.example.com. ثبّت الحزمة APK بواسطة USB أو نظام إدارة الأجهزة (Zebra StageNow وHoneywell Enterprise Provisioner وSOTI...) أو من رابط تنزيل. يُوقَّع APK الإصدار بمفتاح التصحيح إلى أن تنشئandroid/key.propertiesكما في دليل التوقيع القياسي لـ Flutter: افعل ذلك قبل توزيعه. - ابنِ تطبيق الآيفون على جهاز Mac بواسطة Xcode:
flutter build ios --release --dart-define=SITE_URL=https://odoo.example.com(يستخدم الآيفون الكاميرا، انظر الفصل 8). - افتح التطبيق. سجّل الدخول باسم مستخدم وكلمة مرور لمستخدم من المجموعة إدارة المستودع المتنقل / مشغّل. ينزّل التطبيق البيانات الرئيسية (المنتجات وباركود التعبئة والخانات والمنصات والدفعات) ويصبح جاهزًا للمسح، حتى دون شبكة بعد ذلك.
- في الإعدادات ← الماسح تحقق من ملف الماسح (الفصلان 7 و8).
| الإذن | السبب |
|---|---|
INTERNET وACCESS_NETWORK_STATE | التخاطب مع أودو ومعرفة عودة الشبكة. |
CAMERA (اختياري) | المسح بالكاميرا حين لا يوجد ماسح عتادي. |
VIBRATE | الاهتزاز في ملاحظات المسح. |
WAKE_LOCK | تبقى الشاشة مضاءة ما دام التطبيق مفتوحًا. |
<queries> | مصرَّح بها لحزم DataWedge وHoneywell وDatalogic ليسمح أندرويد 11 أو أحدث للتطبيق برؤيتها. |
نصيحة: دون خادم أو جهاز تستطيع تجربة التطبيق على الخادم التجريبي الصغير في المصدر:
python3 tool/fake_server.py --port 8765 (مكتبة بايثون القياسية فقط، و60 منتجًا تجريبيًا واستلامات وتسليم وموجة وجردان، وحسابا الدخول demo / demo وmanager / manager)، ثم flutter run --dart-define=SITE_URL=http://127.0.0.1:8765. وقد تعرض نسخ التصحيح شريطًا رفيعًا اكتب باركودا لإدخاله فوق منطقة المسح (يظهر في لقطات هذا الدليل)؛ أما نسخ الإصدار فلا تعرضه أبدًا. وفي الإعدادات ← اختبار الماسح شريط كهذا دائمًا.نصيحة: كل جهاز يسجّل الدخول يظهر في إدارة المستودع المتنقل ← الإعداد ← الأجهزة مع طرازه والماسح الذي يستخدمه. يستطيع المدير إخراج جهاز من تلك القائمة.
إعداد الماسح: Zebra DataWedge
ببساطة: يستمع التطبيق إلى بث النيّة (broadcast intent) الذي يرسله DataWedge بعد كل مسح. لا يستخدم لوحة المفاتيح على الشاشة ولا يحتاج إلى حقل نص عليه التركيز. تمر كل الماسحات عبر ناقل مسح واحد: الشاشة التي في الأعلى وحدها تتلقى المسح، فلا يصل مسح إلى شاشة مخفية.
ببساطة: يعدّ التطبيق DataWedge بنفسه. حين يكون الإعدادات ← الماسح ← إدارة DataWedge تلقائيا مفعّلًا ينشئ التطبيق ملفًا تعريفيًا اسمه
TaqnixWMS ويحافظ عليه عند بدء التشغيل عبر واجهة DataWedge (CREATE_PROFILE ثم SET_CONFIG واحد)؛ ويفعل الزر إنشاء ملف DataWedge الشيء نفسه عند الطلب. في الملف التعريفي إدخال الباركود مفعّل، وإخراج النيّة مفعّل (الإجراء com.taqnix.wms.SCAN والفئة android.intent.category.DEFAULT والتسليم بث)، وإخراج ضغطات المفاتيح متوقف، وهو مرتبط بـ com.taqnix.wmsscanner لكل أنشطته. يُوقَف مكوّن الماسح حين يذهب التطبيق إلى الخلفية ويعود للعمل حين يرجع، فلا يمسح الزناد لتطبيق آخر. ويمكن تغيير الإجراء في إجراء إخراج DataWedge.ببساطة: يدويًا (DataWedge 8 أو أحدث؛ وهو الطريق حين يدفع نظام إدارة الأجهزة الملف التعريفي):
- افتح تطبيق DataWedge واضغط New profile وسمِّه
TaqnixWMS. - في Associated apps أضف
com.taqnix.wmsscannerمع النشاط*. - في Barcode input أبقِ Enabled وحدّد أنواع الرموز التي تستخدمها: EAN-13 وEAN-8 وUPC-A وUPC-E وCode 128 وGS1-128 وDataMatrix وQR إن كنت تستخدمها في الملصقات.
- في Keystroke output اجعل Enabled متوقفًا: يجب ألا يُكتب المسح في أي مكان.
- في Intent output اجعل Enabled مفعّلًا. الإجراء
com.taqnix.wms.SCAN(أو ما كتبته في التطبيق) والفئةandroid.intent.category.DEFAULTوIntent delivery: Broadcast intent. - اختبر: افتح الإعدادات ← اختبار الماسح في التطبيق واسحب الزناد. يظهر الرمز ونوع الباركود والنيّة الخام على الشاشة.
ببساطة: يقرأ التطبيق حقول DataWedge القياسية (
com.symbol.datawedge.data_string ونوع الملصق، مع أسماء com.motorolasolutions.emdk.datawedge الأقدم أيضًا). ومع تفعيل المسح المتعدد للباركود يصل كل رمز من القراءة نفسها كمسح مستقل.مهم: الملف التعريفي لـ DataWedge والنيّات وحزمة
SET_CONFIG وفق وثائق Zebra وهي مختبرة بالوحدات من جهة التحليل فقط. ولم يشغّلها المؤلف على جهاز Zebra حقيقي (الفصل 31). جرّب أول سحب للزناد على جهازك، وإذا رفض DataWedge الملف التلقائي (يختلف DataWedge 6.x عن 8.x) فاتبع الخطوات اليدوية.إعداد الماسح: Honeywell وDatalogic وغيرهما
ببساطة: في الإعدادات ← الماسح ← ملف الماسح تختار تلقائي أو ملفًا ثابتًا. يقرأ التلقائي الشركة المصنّعة للجهاز: Zebra أو Motorola Solutions أو Symbol تستخدم DataWedge؛ وHoneywell أو Intermec تستخدم نيّة Honeywell؛ وDatalogic تستخدم DecodeWedge؛ وأي جهاز آخر يستخدم الكاميرا. اختر الملف يدويًا إذا اختار التلقائي ملفًا خاطئًا.
| الجهاز | أين | الإعدادات |
|---|---|---|
| Honeywell (EDA وCT وCK وDolphin) | تطبيق Settings > Honeywell Settings > Scanning > Internal scanner > Default profile > Data processing settings | فعّل Data Intent (واجهة Intent API؛ وتسمّيها الصور الأقدم Data Collection Service). يستمع التطبيق إلى com.honeywell.decode.intent.action.EDIT_DATA وcom.honeywell.sample.action.BARCODE_DATA ويقرأ الحقول data (أو dataBytes) وaimId وcodeId وcharset. أوقف Keyboard output أو اترك الوسيط فاعلًا: فمجمّع دفعات المفاتيح أدناه يعمل أيضًا. |
| Datalogic (Memor وSkorpio) | إعدادات ماسح Datalogic > DecodeWedge / Intent Wedge | فعّل Intent output والتسليم بث والإجراء com.datalogic.decodewedge.decode_action والفئة com.datalogic.decodewedge.decode_category. يقرأ التطبيق الحقل النصي com.datalogic.decode.intentwedge.barcode_string (والنوع في ...barcode_type). |
| أي ماسح أندرويد آخر | أداة الشركة المصنّعة ثم الإعدادات ← الماسح | اختر Intent مخصص: اكتب إجراء Intent المخصص واسم بيانات Intent المخصصة التي تحمل الباركود. ينفع أي بث فيه حقل نصي (أو مصفوفة بايتات). |
| ماسحات لوحة المفاتيح | الإعدادات ← الماسح ← ماسحات لوحة المفاتيح | يكتب الماسح الرمز ويضغط Enter. يجمع التطبيق المفاتيح التي تصل بفارق أقل من 50 ملّي ثانية وتنتهي بـ Enter كمسح واحد، ويتجاهل مثل هذه الدفعات داخل حقل نص. لا يحتاج إلى إعداد آخر لكنه أبطأ من النيّة. |
| الهواتف والآيفون | الكاميرا | ماسح الكاميرا (رموز 1D و2D والوضع المستمر والمصباح ونافذة مسح لا تقرأ إلا داخل الإطار). وهو الماسح الوحيد على iOS. |
ببساطة: زر المسح الفعلي. اكتب رموز مفاتيح أندرويد الخاصة به في رموز مفاتيح زر المسح (مفصولة بفواصل، مثل
293, 294؛ وتستخدم بعض أجهزة Zebra 103 و104 وبعض أجهزة Datalogic 291 و292) واختر ما يفعله الزر: لا شيء (العتاد يمسح)، أو فتح الكاميرا، أو بدء مسح برمجي عبر DataWedge. الرموز تتبع الطراز: تحقق منها على جهازك في الإعدادات ← اختبار الماسح الذي يسجّل أحداث مفاتيح الزناد.ببساطة: المكرر. الرمز الذي يصل مرتين خلال 400 ملّي ثانية يُحسب مرة واحدة (يظهر ذلك في عدّاد مكرر مهمل في شاشة الاختبار).
مهم: إعدادات Honeywell وDatalogic ورموز مفاتيح الزناد وفق وثائق الشركات. ولم يشغّلها المؤلف على جهاز حقيقي، وحروف
codeId لدى Honeywell مرتبطة بعدد قليل من أنواع الباركود الشائعة فقط (المصدر الموثوق هو معرّف AIM). انظر الفصل 31.الإعداد الأول في أودو
- افتح المخزون ← الإعداد ← أنواع العمليات وافتح الاستلامات وأوامر التسليم والتحويلات الداخلية وفعّل إدارة المستودع المتنقل في التبويب الجديد الذي يحمل الاسم نفسه (الخيارات في الجدول أدناه).
- أعطِ الخانات باركودها وممرها وقسمها ومستواها وأرقام التحقق (الفصل 10) واطبع ملصقات الخانات (الفصل 24).
- أنشئ مستخدمي فريق المستودع وامنحهم المجموعة «إدارة المستودع المتنقل / مشغّل»؛ ويحصل المشرفون على «إدارة المستودع المتنقل / مدير» (الفصل 22).
- افتح الإعدادات ← إدارة المستودع المتنقل وراجع هامش التسامح وقواعد الانتهاء وحدود الجرد وبادئات الباركود (الفصل 23).
- للمنتجات ذات الدفعة أو الرقم التسلسلي تأكد من ضبط التتبع؛ وفعّل اطلب تاريخ الانتهاء عند الاستلام على المنتجات ذات مدة الصلاحية.
- اطبع باركود المنتجات وسجّل الدخول بالتطبيق.
| خيار نوع العملية | ماذا يفعل |
|---|---|
| إدارة المستودع المتنقل | يظهر نوع العملية في التطبيق ويعمل محرك المسح على عمليات النقل فيه. |
| البلاطة في التطبيق، الترتيب | أي بلاطة في القائمة تعرض عمليات النقل هذه (الاستلامات، عمليات التسليم، التحويلات الداخلية، التقاط، تعبئة) وبأي ترتيب. |
| امسح خانة المصدر / خانة الوجهة | هل يطلب التطبيق الخانة قبل المنتج. |
| تأكيد الخانة بأرقام التحقق | يكتب المشغّل الأرقام المطبوعة على ملصق الخانة (إن كان لها أرقام). |
| طلب الدفعة/الرقم التسلسلي | اسأل عند أول مسح: يطلب الماسح الدفعة بمجرد مسح المنتج. اسأل عند الاعتماد: تُقبل الكمية وتُطلب الدفعة عند اعتماد عملية النقل. |
| تسامح إضافي (%) | كمية فوق الطلب تُقبل لهذا النوع؛ وتُطبَّق القيمة الأكبر بين هذه وهامش تسامح الشركة. |
| الانتقال إلى السطر التالي | ينتقل التطبيق إلى السطر التالي عند اكتمال السطر. |
| سياسة الأمر المؤجل في التطبيق | اسأل المشغّل أو إنشاء أمر مؤجل أو بلا أمر مؤجل، ألغِ المتبقي. |
الخانات وأرقام التحقق ومسار الالتقاط
ببساطة: كل خانة تخزين هي موقع مخزون. افتح إدارة المستودع المتنقل ← الإعداد ← الخانات والعناوين: القائمة قابلة للتحرير، فتستطيع كتابة الباركود وأرقام التحقق والمنطقة والممر والقسم والمستوى لخانات كثيرة بسرعة.
| الحقل | الاستخدام |
|---|---|
| الباركود | ما يظهر على الملصق (Code 128). فريد لكل شركة. يُمسح لتأكيد الخانة. |
| أرقام التحقق | من 2 إلى 4 أرقام مطبوعة في مربع على الملصق. يكتبها المشغّل ليثبت أنه واقف عند الخانة الصحيحة. ولّدها بالإجراء الجماعي توليد أرقام التحقق أو برابط توليد في النموذج (عشوائية ولا تتكرر داخل الممر). |
| المنطقة | منطقة التقاط مثل المبرّد أو سريع الحركة أو الميزانين. يمكن حصر الموجات والجرد في منطقة. |
| الممر والقسم والمستوى | عنوان الخانة. يُرتَّب الممر والقسم ترتيبًا طبيعيًا (2 قبل 10). |
| تسلسل الالتقاط | موضع الخانة على المسار. يُولَّد من الممر والقسم والمستوى بـترتيب متعرّج: يسير الممر الأول من القسم 01 صعودًا، ثم يعود الممر التالي من القسم الأخير، وهكذا، فلا يعود الملتقِط أبدًا بيدين فارغتين. فعّل احتفظ بتسلسل الالتقاط الذي كتبته لحماية رقم كتبته بنفسك. |
نصيحة: يُعاد ترقيم تسلسل الالتقاط عند إنشاء خانة أو تغيير ممرها أو قسمها أو مستواها. استخدم الإجراء الجماعي توليد تسلسل الالتقاط على تحديد لإعادة ترقيم مستودع كامل. أوقف الترتيب المتعرّج في الإعدادات إذا فضّلت أن تسير كل الممرات في الاتجاه نفسه.
الباركود: ما يفهمه الماسح
ببساطة: يمر كل مسح عبر محرك واحد على الخادم (وتُرسل القواعد نفسها إلى التطبيق ليقرأ دون اتصال). يجيب المحرك في أجزاء من الثانية (الفصل 27) ويخبر التطبيق ما هو الباركود.
| الباركود | ماذا يفعل المحرك |
|---|---|
| EAN-13 وEAN-8 وUPC-A وUPC-E وGTIN-14 | يطابق باركود المنتج مع الأصفار البادئة لـ GTIN نفسه (UPC-A الممسوح كـ EAN-13 هو المنتج نفسه)، ويتحقق من رقم التحقق ويوسّع UPC-E. يُبلَّغ عن رقم التحقق الخاطئ على هذا النحو بدلًا من «منتج غير معروف». |
| التعبئة (كرتون، علبة) | باركود وحدة قياس للمنتج (تعبئة أودو 19) يضيف كمية العبوة. وكرتون GTIN-14 غير المسجَّل يعود إلى منتج الوحدة مع تحذير. |
| GS1-128 (AI 01 و02 و10 و21 و13 و15 و17 و30 و37 و310x و320x و00 و91) | يقرأ GTIN والدفعة (10) أو الرقم التسلسلي (21) والانتهاء (17، واليوم 00 يعني نهاية الشهر) وتاريخ الأفضل قبل (15) والعدد (30، 37) والوزن الصافي (310x كغ، و320x رطل يُحوَّل إلى وحدة المنتج) وSSCC للمنصة (00). تُتخطى المعرّفات غير الموجودة في الترميز (11 و20 و240 و400 و420 و92 إلى 99...). |
| الفواصل | تُقبل كلها: حرف FNC1 و# وAlt029 والبادئة ]C1 من الماسح والشكل المقروء (01)...(10)... والمسافات بين العناصر. الدفعة متغيرة الطول المتبوعة بعنصر آخر تحتاج إلى فاصل، كما يشترط معيار GS1. |
| باركود الوزن والسعر | EAN-13 مكوَّن من بادئة من رقمين (21 للوزن و23 للسعر افتراضيًا) ورمز صنف من 5 أرقام و5 أرقام للقيمة ورقم التحقق. يُعثر على المنتج بباركوده مع أصفار في أرقام القيمة؛ والكمية هي الوزن بوحدة المنتج أو السعر مقسومًا على سعر البيع. ولا يحدد الوزن (GS1 310x أو 320x أو باركود وزن) كمية إلا لمنتج يُعدّ بوحدة وزن (كغ أو غ أو رطل...)؛ أما منتج الوحدات فيبقى الوزن معلومة فقط. |
| الخانات والحزم والدفعات والمستندات | باركود الخانة، واسم الحزمة (SSCC لمنصة)، واسم الدفعة، واسم عملية النقل أو مستندها المصدر (رقم أمر الشراء يفتح استلامه)، واسم موجة أو جرد. |
ببساطة: ما الذي يسبق؟ عندما يحتمل الرمز أكثر من معنى يحسم السياق. في الاستلام، الرمز الذي هو باركود منتج واسم دفعة معًا يُعدّ المنتج. في التسليم، قبل مسح أي خانة، الرمز الذي هو خانة يُعدّ الخانة. وفي القائمة تأتي المستندات أولًا.
مهم: الرقم المجرد لا يُقرأ أبدًا كدفعة GS1: لا تُجرَّب قراءة GS1 إلا إذا لم يطابق شيء تمامًا، أو إذا حملت السلسلة فواصل، أو إذا بدأت بـ SSCC أو GTIN.
الاستلامات
- افتح بلاطة الاستلامات واختر عملية النقل (أو امسح رقم أمر الشراء: يفتح استلامه).
- امسح خانة التجهيز إذا كان نوع العملية لديك يطلبها. في الاستلام بـ3 خطوات هذا هو موقع الإدخال.
- امسح المنتجات. كل مسح يضيف وحدة؛ ولوحة الكمية في التطبيق تغيّر المقدار؛ وباركود الكرتون يضيف كمية عبوته.
- للمنتج ذي الدفعة يطلب الماسح الدفعة (أو يقرؤها من باركود GS1). وإذا احتاج المنتج إلى تاريخ انتهاء فإن الماسح يطلبه ما لم يوفره AI 17.
- اضغط اعتماد. عملية النقل غير المكتملة تسأل هل تُنشئ أمرًا مؤجلًا.
| الحالة | جواب الماسح |
|---|---|
| منتج ليس في الاستلام | الخطأ wrong_product وصوت إنذار؛ ولا يتغير شيء. |
| أكثر من المطلوب | يُرفض بـ over_pick ما لم يسمح هامش التسامح؛ وضمن الهامش يُقبل ويُعلَّم. |
| رقم تسلسلي مستلم أو موجود في المخزون | serial_duplicate. |
| دفعة منتهية | lot_expired عندما يكون منع الدفعات المنتهية مفعّلًا. |
| دفعة أو تاريخ انتهاء ناقص | طلب إدخال (needs_lot وneeds_serial وneeds_expiry): يفتح الماسح ورقة الإدخال. |
ببساطة: في التطبيق يبدأ الاستلام بخانة التجهيز (ضع في بحروف كبيرة؛ امسح خانة أخرى لتغييرها) ثم الأصناف؛ ويمكن تحديد خانة وجهة لكل سطر.
التسليم والالتقاط
ببساطة: تأتي سطور التسليم مرتبة على مسار الالتقاط (تسلسل الالتقاط لخانة كل سطر). يعرض الماسح الخانة التالية بحروف كهرمانية كبيرة، ثم المنتج بصورته وعدّادًا مثل الملتقَط: 12 / المطلوب: 20.
- افتح التسليم. يُستلم لك للعمل عليه: لا أحد غيرك يستطيع المسح عليه (يستطيع المدير).
- امسح الخانة. إذا كان للخانة أرقام تحقق يطلبها التطبيق. مسح خانة غير المقترحة مقبول ويُعلَّم بـ
wrong_location. - امسح المنتج (والدفعة). تُقترح الدفعة المحجوزة؛ ودفعة أخرى مقبولة وتُعلَّم بـ
substitute_lot. - عند اكتمال كل السطور يعرض التطبيق نغمة الإنجاز. اضغط اعتماد.
ببساطة: تُحفظ الكميات التي تمسحها على السطور (الكمية الممسوحة) أثناء عملك؛ ولا يُمس حجز أودو. يكتب الاعتماد الكميات المنجزة الفعلية، ويُسقط ما لم يُلتقط ويحرّر حجزه.
التحويلات الداخلية والمنصات
- افتح تحويلًا داخليًا، أو استخدم تحرك حر في التطبيق لنقل المخزون دون أمر.
- امسح خانة المصدر، ثم المنتج (أو المنصة)، ثم خانة الوجهة وأرقام تحققها.
- مسح المنصة (حزمة) ينقل كل محتواها بمسح واحد: كل منتج ودفعة وكمية في الحزمة. وتُرفض المنصة كلها إذا كان فيها منتج ليس في عملية النقل.
- اعتمد. تنتقل الكميات في المخزون بدقة وتحتفظ المنصة بهويتها في خانة الوجهة.
ببساطة: ينشئ التحرك الحر تحويلًا داخليًا ويعتمده لك. إذا نقلت أكثر مما تُظهره الدفاتر، يُقبل النقل (لقد حدث)، ويصبح مخزون الخانة سالبًا، ويحصل المدير على مهمة.
التقاط الموجات على المسار
ببساطة: تجمع الموجة عدة عمليات تسليم (أو تحويلات داخلية من نوع العملية نفسه) ليخدمها ملتقِط واحد في جولة واحدة على المسار المحسَّن، ثم تُعبَّأ الطلبات بعد ذلك.
- افتح إدارة المستودع المتنقل ← عمليات النقل وحدّد عمليات النقل الجاهزة من نوع عملية واحد واختر إجراء ← إنشاء موجة. أو أنشئ موجة واضغط إضافة عمليات نقل: يقترح المعالج عمليات النقل الجاهزة من النوع نفسه التي ليست في موجة أخرى.
- اضغط بدء. يستلم الملتقِط (أو أنت إذا بدأتها) الموجة وكل عمليات نقلها للعمل عليها.
- يفتح الملتقِط الموجة في التطبيق. المحطات هي الخانات مرتبة بتسلسل الالتقاط، وفي كل منها سطور كل الطلبات؛ وتُدمج للعرض سطور المنتج نفسه في الخانة نفسها.
- يذهب مسح الوحدة إلى أول طلب، بحسب الأولوية والموعد النهائي والتاريخ، ما زال يحتاج إلى المنتج؛ وتُوزَّع الكمية الأكبر على الطلبات بالترتيب نفسه.
- اضغط اعتماد: يسأل المعالج ماذا تفعل بعمليات النقل غير المكتملة (أمر مؤجل أو إلغاء المتبقي). عمليات النقل التي بلا أي مسح تغادر الموجة وتبقى مفتوحة.
مهم: اعتماد الموجة إما كله أو لا شيء. إذا تعذّر اعتماد عملية نقل واحدة (مثل نقص دفعة) فلن تُعتمد أي منها، وتذكر الرسالة اسم عملية النقل.
الدفعات والأرقام التسلسلية والانتهاء
| القاعدة | التفاصيل |
|---|---|
| الدفعات | تُنشأ الدفعة عند اعتماد الاستلام (الاسم من المسح والانتهاء من المسح). وتُعاد الدفعة الموجودة. ودفعة التسليم يجب أن تكون موجودة؛ وتُرفض الدفعة غير المعروفة (unknown_lot). |
| الأرقام التسلسلية | وحدة واحدة لكل رقم تسلسلي. يُرفض الرقم التسلسلي نفسه مرتين في عملية نقل، أو رقم تسلسلي موجود في المخزون عند استلامه (serial_duplicate). |
| تاريخ الانتهاء | يُحفظ على الدفعة. عند تثبيت ميزة تواريخ الانتهاء في أودو يُستخدم تاريخها ويبقى متزامنًا؛ وإلا تحتفظ الوحدة بالتاريخ في الحقل تاريخ الانتهاء (المستودع المتنقل) في الدفعة. |
| طلب الانتهاء عند الاستلام | فعّله على المنتج (المنتجات المتتبَّعة بالدفعة). عندها يطلب الماسح تاريخًا لكل دفعة جديدة ما لم يحمله باركود GS1. |
| منتهية | مع منع الدفعات المنتهية يُرفض تسليم أو استلام دفعة منتهية (lot_expired)؛ ويُقبل التحويل الداخلي لدفعة منتهية ويُعلَّم بـ expired_lot، لتتمكن البضاعة المنتهية من الذهاب إلى الحجر. |
| تنتهي قريبًا | الدفعات التي تنتهي خلال عدد الأيام المحدد في الإعدادات تُقبل مع التنبيه expiring_soon. |
| الدفعات المقترحة | يعرض التطبيق حتى خمس دفعات في الخانة، الأقرب انتهاءً أولًا. |
الحزم والمنصات
ببساطة: الحزمة هي حزمة أودو (في أودو 19 النموذج هو
stock.package)؛ واسمها ما يظهر على الملصق. يمكن مسح ملصق منصة بـ SSCC صالح كـ 00 + 18 رقمًا أو كاسم مجرد.| أين | ماذا يفعل مسح الحزمة |
|---|---|
| استلام، حزمة غير معروفة | تُنشأ الحزمة باسم SSCC وتصبح حزمة الوجهة للمنتجات التي تُمسح بعدها. |
| استلام، حزمة موجودة في المخزون | تُرفض (package_in_stock): لا يمكن أن تصل المنصة نفسها مرتين. |
| تسليم أو تحويل داخلي | يُمسح كل محتوى الحزمة دفعة واحدة؛ وتغادر الحزمة مع بضاعتها (التسليم) أو تنتقل إلى خانة الوجهة محتفظة باسمها (التحويل الداخلي). |
الأوامر المؤجلة وهامش التسامح
| السياسة | ماذا يحدث لما لم يُلتقط |
|---|---|
| إنشاء أمر مؤجل | عملية نقل جديدة للكمية المتبقية مع حجزها. وتُعتمد الكميات الممسوحة في عملية النقل الأولى. |
| بلا أمر مؤجل | تُلغى الكمية المتبقية ويُحرَّر حجزها. |
| اسأل | يجيب الخادم بـ needs_backorder_decision مع الكميات المتبقية ولا يغيّر شيئًا (تبقى عمليات المسح). يختار المشغّل ويعتمد مجددًا. |
ببساطة: تأتي السياسة من نوع العملية، ويستطيع التطبيق إرسال سياسة أخرى. الاعتماد ذري: إذا فشل أي شيء (التتبع أو الوجهة أو هامش التسامح) فلا يُكتب شيء. تُقبل الكميات الزائدة على الطلب حتى القيمة الأكبر بين هامش تسامح الشركة وهامش نوع العملية، مع التنبيه
over_pick؛ وما فوق ذلك يكون over_pick خطأ.الجرد الدوري
ببساطة: اجرد خانة أو ممرًا أو منطقة، أو أي شيء يجده المشغّل (حر). لا يعرض الجرد الأعمى الكمية المتوقعة للعادّ أبدًا، لا في التطبيق ولا في أودو. أما الجرد الموجَّه فيعرضها.
- أنشئ جردًا (إدارة المستودع المتنقل ← الجرد الدوري) بنطاقه واضغط بدء العد، أو دع المشغّل ينشئ جردًا في التطبيق. عند البدء تُجمَّد الكمية المتوقعة لكل منتج ودفعة وحزمة ضمن النطاق.
- يمسح المشغّل رفًّا ثم الأصناف، ويكتب الكمية أو يمسحها. الصنف غير المتوقع يُضاف بالكمية التي كانت في الدفاتر في تلك اللحظة.
- إرسال للمراجعة. الأصناف التي توقعتها الدفاتر في خانة جرى جردها ولم يمسحها أحد تُعدّ صفرًا (مفقود). أما الخانات التي لم تُمس أبدًا فلا تُجرد إطلاقًا.
- يراجع المدير الفروق. يبيّن عمود الانحراف ما دخل الخانة أو خرج منها منذ البدء، فلا يُخلط بين استلام وصل أثناء الجرد وبين خسارة. يستطيع المدير تصحيح كمية أو طلب إعادة العد.
- اعتماد وتسجيل. تسوية مخزون واحدة لكل سطر، بالفرق الذي وجده العادّ (المعدود ناقص المتوقع)، فتبقى الحركات التي جرت في الأثناء محفوظة. يصبح الجرد منجزًا ولا يمكن تطبيقه مرتين.
مهم: يجب ألا يكون المدير الذي يعتمد هو من قام بالعد أو إرساله أو تصحيحه، ما لم تسمح بذلك في الإعدادات؛ ولا يمكن تغيير العادّ في جرد بدأ. ولا يستطيع المشغّلون الاعتماد ولا إلغاء جرد قيد المراجعة.
ببساطة: الأعمى يعني أعمى. مع إعداد الشركة يجب أن يعدّ المشغّلون جردًا أعمى (مفعّل افتراضيًا) يكون كل جرد ينشئه مشغّل في التطبيق أعمى مهما أرسل التطبيق. ولا يتلقى المشغّل كمية متوقعة ولا فروقًا عند الإرسال (فقط عدد السطور المعدودة): فالفروق تذهب إلى المديرين. وطوال وجود جرد أعمى مفتوح لدى المشغّل تُخفى أيضًا كميات المخزون للدفعات والمنصات في أجوبة المسح الخاصة به.
ببساطة: في التطبيق. الجرد الذي ما زال مسودة يعرض زر ابدأ الجرد الكبير: يجمّد البدء الكميات المتوقعة (ويعمل دون اتصال أيضًا: يُوضع البدء في الطابور، وتُرفض عمليات المسح إلى أن يبدأ). يمسح المشغّل رفًّا (رفوف الجرد أزرار في الأعلى) ثم الأصناف؛ كل مسح يضيف وحدة، وتغيّر لوحة الأرقام الكمية. يعدّ المشغّل دائمًا جردًا أعمى: لا يرى كمية متوقعة، بل الكميات المعدودة فقط. الرف التالي ينقله إلى رف آخر ومراجعة تنهي العد. ثم ينتظر المشغّل المشرف. يرى المشرف مراجعة الجرد: الرفوف المجرودة والبنود والوحدات، والفروق بالكميات المتوقعة والمعدودة، ويضغط اعتماد الجرد (الدفاتر والفروق تأتي من الخادم، وللمديرين فقط).
العمل دون اتصال والمزامنة
ببساطة: يحتفظ التطبيق على الجهاز بما يحتاج إليه: قواعد GS1 والمنتجات والخانات مع أرقام تحققها والحزم والدفعات الموجودة في المخزون (البيانات الرئيسية، تُحمَّل على صفحات وتُحدَّث تدريجيًا)، وعمليات النقل المفتوحة التي فتحتها. تُفحص عمليات المسح محليًا أولًا، فيصدر الصفير فورًا.
| القاعدة | التفاصيل |
|---|---|
| طابور العمليات | يُحفظ كل تغيير (مسح أو تحديث سطر أو اعتماد أو تحرك حر أو مسح موجة أو جرد) بـ uuid فريد وبـ local_seq لا يرجع إلى الوراء أبدًا، ويُرسل بـ POST /sync على دفعات تصل إلى 100. |
| مكرَّر بلا أثر | يحتفظ الخادم بكل عملية طُبقت. إعادة إرسالها تُجاب بـ duplicate ولا تغيّر شيئًا، فلا يؤدي ضياع الرد إلى عدّ مزدوج. |
| العمليات المرفوضة | العملية المرفوضة تُجاب بـ rejected مع الرمز. وإذا صُحّحت البيانات وأُعيد إرسال العملية فإنها تُنفَّذ من جديد. |
| العمليات المتأخرة | العملية التي يزيد عمرها على 15 دقيقة عند وصولها تُطبَّق (لقد حدثت) وتُعلَّم بـ late_sync مع مهمة للمدير. |
| عدة أجهزة | يُرفض معرّف عملية يعود إلى مستخدم آخر. |
| التغييرات | يسأل التطبيق GET /changes عن عمليات النقل والموجات والجرد التي تغيّرت منذ زيارته الأخيرة. |
ببساطة: على الجهاز. تُخزَّن البيانات الرئيسية (المنتجات وباركود تعبئتها والخانات والمنصات والدفعات) في قاعدة SQLite محلية وتُفهرس في الذاكرة، وتأتي قواعد GS1 من خادمك. يُحلَّل كل مسح على الهاتف بمحلّل Dart خالص ومحلّل GS1، وتُرسم الشاشة من جديد في الإطار نفسه ويصدر الصفير فورًا. ولا يكون POST /resolve على الخادم إلا ملاذًا لرمز لا يعرفه الجهاز، وتتعلم الفهرسة من جوابه. ثم يكتب كل مسح الوثيقة المخزّنة وعملية من صندوق الصادر في معاملة قاعدة بيانات واحدة، فلا يخسر التطبيق الذي يُقتل في تلك اللحظة شيئًا.
| صندوق الصادر في التطبيق | التفاصيل |
|---|---|
| الترتيب | تُرسل العمليات بترتيب local_seq الذي لا يتغير (لا يرجع إلى الوراء، والصف المحذوف لا يعيد رقمه). العملية التي تنتظر موعد إعادة محاولتها تحجب اللاحقة لها. |
| الإرسال | مهلة ثانيتين بعد المسح، ودفعات تصل إلى 100 عملية عبر POST /sync. وإذا رُفضت الدفعة (HTTP 400 أو 413) يضيّق التطبيق الدفعة ليجد العملية المرفوضة. |
| الأجوبة | applied وduplicate تزيلان العملية؛ وrejected تُركَن كمشكلة مع رمزها؛ وخطأ الشبكة يعيد المحاولة بتراجع زمني وعشوائية. والعملية التي كانت قيد الإرسال عند تعطل التطبيق ترجع معلّقة. |
| إعادة التشغيل | يبقى الطابور حيًا بعد إعادة تشغيل التطبيق والهاتف. |
| الوثائق | ما دامت عمليات غير متزامنة فلن يمحو التحديث من الخادم كميات المشغّل. وعملية النقل التي اعتمدتها تختفي من القوائم المفتوحة فورًا وتعود إذا رفض الخادم الاعتماد. |
| الجرد | كميات الجرد مطلقة، فلا تعدّ إعادة الإرسال مرتين. |
ببساطة: تُفتح شاشة حالة المزامنة من أيقونة السحابة أعلى كل شاشة. المسح المرفوض (مثل صنف خاطئ) لا يُحسب مرسَلًا: يظهر كمشكلة يستطيع المشغّل إعادة محاولتها أو إهمالها.
الأصوات والاهتزاز
| الحكم | الصوت | الاهتزاز |
|---|---|---|
مسح سليم (ok) | نغمة حادة | نبضة قصيرة واحدة |
خطأ (error): منتج أو خانة خاطئة، دفعة منتهية، التقاط زائد | صوت إنذار غليظ | نبضتان طويلتان |
اكتمال العملية (complete: انتهاء سطر أو محطة أو وثيقة) | نغمة مزدوجة صاعدة | قصيرة وقصيرة وطويلة |
معلومة (info) | نقرة ناعمة | لا شيء |
ببساطة: الأصوات ملفات قصيرة مولَّدة أصلية للتطبيق (يعيد
python3 tool/make_sounds.py توليدها)، وتُحمَّل مسبقًا عند البدء وتُشغَّل بزمن استجابة منخفض (SoundPool على أندرويد وAVAudioPlayer على iOS). وفي الإعدادات يستطيع كل مشغّل تشغيل الصوت أو إيقافه والاهتزاز والوضع العالي (أعلى مستوى للصوت واهتزاز أطول للأرصفة الصاخبة). أما إعدادا الشركة أصوات المسح على الأجهزة والاهتزاز على الأجهزة فهما القيمتان الافتراضيتان اللتان يرسلهما الخادم فقط.مهم: لم يُقَس على جهاز حقيقي زمن استجابة الصوت ولا قوة الاهتزاز ولا استهلاك البطارية مع بقاء الشاشة مضاءة (الفصل 31).
الأدوار والصلاحيات
| المجموعة | تستطيع |
|---|---|
| إدارة المستودع المتنقل / مشغّل | تسجّل الدخول إلى التطبيق، وتستلم وتلتقط وتنقل وتجرد على أنواع العمليات المفعّل فيها إدارة المستودع المتنقل، وتعمل على عمليات النقل التي استلمتها للعمل عليها، وترى الموجات وعمليات الجرد الحرة وما يخصها. ليس لها وصول إلى شاشات مخزون أودو عبر هذه المجموعة. |
| إدارة المستودع المتنقل / مدير | كل ما يفعله المشغّل، إضافة إلى: إنشاء الموجات وعمليات الجرد وبدئها، واعتماد عمليات الجرد، وتولي عملية نقل، وقراءة سجل المسح والأجهزة والعمليات المتزامنة، وتغيير الخانات وأنواع العمليات. وتشمل صلاحيات مدير المخزون والمواقع المتعددة والدفعات والحزم. |
| القاعدة | التفاصيل |
|---|---|
| استلام العملية للعمل عليها | أول مشغّل يمسح على عملية نقل يستلمها. أما الآخرون (غير المديرين) فيحصلون على claimed. المدير الذي يساعد لا يتولى عملية النقل. حرّرها من التطبيق أو عيّن مشغّلًا آخر في النموذج. |
| الشركات | لكل نموذج قاعدة شركة؛ ويعمل التطبيق في شركة المستخدم. |
| حماية الحقول | الكمية المتوقعة في الجرد مقروءة للمديرين فقط؛ وحالة الموجات وعمليات الجرد ومن اعتمدها لا يمكن كتابتها عبر RPC: الأزرار وحدها تغيّرها. |
الإعدادات
| الإعداد | المعنى |
|---|---|
| قراءة باركود GS1، ترميز GS1 | تفعيل GS1 أو إيقافه؛ واختيار ترميز GS1 آخر. |
| بادئة باركود الوزن والسعر | رقمان لكل منهما، أو فارغ للإيقاف. |
| هامش التسامح في الالتقاط/الاستلام الزائد (%) | الكمية الزائدة على الطلب التي تُقبل وتُعلَّم. 0 يعني لا زيادة. |
| منع الدفعات المنتهية، تنبيه عند انتهاء الدفعة خلال (أيام) | قواعد الانتهاء في الفصل 16. |
| مسار التقاط متعرّج | تناوب الاتجاه في كل ممر. |
| تعليم فرق الجرد عند تجاوز (% ووحدات) | يصبح الفرق أحمر عندما يتجاوز أحدهما. |
| يجب أن يعدّ المشغّلون جردًا أعمى | مفعّل افتراضيًا: لا يستطيع المشغّل إنشاء جرد موجَّه ولا يتلقى كمية متوقعة أو فرقًا. |
| يجوز للمدير اعتماد جرد قام به بنفسه | متوقف افتراضيًا. |
| أصوات المسح، الاهتزاز | القيم الافتراضية للأجهزة. |
| فاصل تحديث التطبيق، العمليات في كل مزامنة | كم مرة يسأل التطبيق عن التغييرات (من 10 ثوانٍ إلى يوم) وحجم الدفعة (من 1 إلى 100). |
| الاحتفاظ بسجل المسح (أيام) | تُحذف الصفوف القديمة كل ليلة؛ و0 يحتفظ بكل شيء. |
الملصقات
ببساطة: حدّد الخانات في الخانات والعناوين واختر طباعة ← ملصقات الخانات (مع أرقام التحقق) واطبع على ورق A4 (ملصقان في الصف، بارتفاع 54 mm). يحمل كل ملصق الاسم والعنوان والمنطقة وباركود Code 128 لباركود الخانة وأرقام التحقق في مربع. تُطبع ملصقات الحزم (SSCC) من الحزمة.
نصيحة: يولّد الخادم صور الباركود ويضمّنها في ملف PDF، فلا تحتاج الطباعة إلى أي اتصال راجع بأودو.
التقارير والتحليل
ببساطة: يُكتب كل تحليل ومسح وعملية من التطبيق في سجل المسح مع المشغّل والجهاز وعملية النقل والباركود والنتيجة (سليم، السطر مكتمل، يحتاج إدخالًا، خطأ، باركود غير معروف، مرفوض) والرمز وزمن استجابة الخادم بالمللي ثانية.
ببساطة: يعطي العرض المحوري معدل الأخطاء لكل مشغّل. وتسرد العمليات المتزامنة ما أرسلته الأجهزة مع الحالة والرمز والتنبيهات. ويعرض سجل نشاط عملية النقل التنبيهات كملاحظات، ويتلقى المدير مهمة واحدة لكل عملية نقل معلَّمة.
تطبيق الجوال
ببساطة: صُمّم التطبيق للقفازات والمستودعات المضيئة: تباين شديد وأهداف لمس كبيرة ورموز الخانات والمنتجات بحروف كبيرة جدًا. الألوان: خلفية أردوازية داكنة (وثمة مظهر فاتح أيضًا في الإعدادات)، والكهرماني للخانة التي تذهب إليها، والأخضر للمطابقة، والأحمر للفرق أو الالتقاط الزائد. يتحدث الإنجليزية والعربية (من اليمين إلى اليسار) بخطي Inter وIBM Plex Sans Arabic المضمَّنين، وكل أيقونة من مجموعة Fluent UI System Icons (
fluentui_system_icons).ببساطة: لا أحد يكتب في حقل نص. يذهب المسح إلى الشاشة التي في الأعلى ويُحلَّل في الذاكرة على الجهاز وتُرسم الشاشة من جديد في الإطار نفسه ويصدر صوته؛ ثم تُكتب الوثيقة وعملية صندوق الصادر في قاعدة البيانات المحلية مباشرة (الفصل 20).
| الشاشة | ماذا تعرض |
|---|---|
| قائمة العمليات | بلاطات للاستلام والتسليم والنقل الداخلي والنقل بين المواقع والتجميع بالدفعات وجرد المخزون، لكل منها عدد عمليات النقل الجاهزة وشارات لما هو لي وما تأخر. وشريط في الأعلى يفتح وثيقة بمسح باركودها (عملية نقل أو موجة أو جرد أو أمر شراء). وتكتمل القائمة بالإعدادات وحالة المزامنة وصف اختبار الماسح. |
| قائمة عمليات النقل | ما هو لي أولًا ثم بحسب الأولوية والموعد؛ أزرار الكل وما هو لي وعاجل؛ بحث بالاسم أو الأصل أو العميل أو مسح وثيقة؛ وشريط تقدم لكل عملية نقل. |
| طرفية المسح | الاستلام والتسليم والالتقاط والتعبئة. هدف ضخم في الأعلى (الخانة التي تذهب إليها، تم تأكيد الخانة، ضع في)، وبطاقة المنتج بصورته، وتم / المطلوب وشريط التقدم، والتوزيع حسب الطلب للموجات، والسطر التالي، وورقة للدفعة والرقم التسلسلي والانتهاء، ولوحة أرقام لكتابة الكمية، والأزرار تراجع والبنود (أو التعبئة) وإنهاء. |
| النقل بين المواقع | نقل حر في ثلاث خطوات تظهر كمؤشر: المصدر والأصناف والوجهة. تنتقل المنصات بمسح واحد. الأزرار تراجع وإعادة ضبط وتأكيد النقل. |
| التجميع بالدفعات | الموجة على مسار الالتقاط: المحطة 1 من 11 مع الممر والخانة بحروف كبيرة، وبطاقة المنتج مع الكمية الموزعة على كل طلب، والتعبئة. |
| جرد المخزون | جرد مسودة بزر ابدأ الجرد؛ والرفوف كأزرار؛ والأصناف المعدودة لكل رف؛ وتراجع والرف التالي ومراجعة؛ ومراجعة الجرد للمشرفين بالفروق واعتماد الجرد. |
| حالة المزامنة | متصل أو غير متصل وآخر مزامنة ومزامنة الآن وطابور العمليات مع إعادة المحاولة والإهمال. |
| الإعدادات واختبار الماسح | ملف الماسح وDataWedge والنيّة المخصصة ومفاتيح الزناد وخيارات الكاميرا والصوت والاهتزاز والوضع العالي والمظهر واللغة والبيانات الرئيسية وتسجيل الخروج. |
ببساطة: أعداد اختبارات التطبيق. في المشروع 346 اختبار Dart (المحلّلات ومحلّل GS1 والمحلّل المحلي والمحركات وأشكال نيّات الماسح لدى الشركات الأربع ودفعات المفاتيح والقنوات الأصلية بنسخ مزيفة وأنماط الملاحظات الصوتية واللمسية ومحرك صندوق الصادر والمزامنة والمستودع عبر مقبس حقيقي وتدفقات الواجهة للطرفية والموجة والجرد والنقل والقائمة والإعدادات وتطابق مفاتيح الإنجليزية والعربية واختبار قياس سرعة التحليل) و53 اختبار Kotlin JVM للطبقة الأصلية (تسطيح الحقول الإضافية وإعداد DataWedge وكشف الشركة المصنّعة ومفاتيح الزناد ومرشحات النيّات ومخزن الأحداث). ونتيجة
flutter analyze نظيفة. بُني التطبيق كحزمة APK للتصحيح على أندرويد، وبُني لمحاكي iOS، وشُغّل من البداية إلى النهاية على محاكي iOS مقابل أودو حقيقي بهذه الوحدة: استلامات بدفعة ورقم تسلسلي وانتهاء من باركود GS1، وتسليم بالتقاط جزئي وأمر مؤجل، وتحويلات بين الخانات، وموجة، وجرد أعمى لمشغّل اعتمده مدير، ومسارات الأخطاء، وتشغيل دون اتصال (أُوقف الخادم، وتراكمت عمليات المسح، وتمت مزامنة صندوق الصادر بعد إعادة التشغيل). أما ما لم يُتحقق منه فمذكور في الفصل 31.ببساطة: لقطات هذا الدليل أُخذت في محاكي iOS على قاعدة بيانات تجريبية. وفي المصدر ملاحظات البنية في
docs/ARCHITECTURE.md (الطبقات ومسار المسح والقواعد وصندوق الصادر والطبقة الأصلية وقائمة ما لم يُتحقق منه).للمطورين: الواجهة البرمجية والمحلّل
ببساطة: تخطَّ هذا الفصل إذا كنت تستخدم المنتج فقط. العقد الكامل في
documentation/API.md.# is the server reachable? (no sign-in)
curl https://odoo.example.com/api/wms/v1/ping
# {"ok": true, "api_version": 1, "server_time": "2026-10-28T08:00:00Z"}
# sign in as a warehouse operator (returns a token, the configuration and the GS1 rules)
curl -X POST https://odoo.example.com/api/wms/v1/auth/login -H 'Content-Type: application/json' \
-d '{"login": "omar", "password": "...", "device": {"id": "TC52-0147", "name": "TC52 dock 1", "platform": "android", "scanner": "zebra"}}'
# what is this barcode? (GS1-128 with GTIN, lot and expiry; the answer says which product, which lot and which date)
curl -X POST https://odoo.example.com/api/wms/v1/resolve -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"barcode": "010629105000040710L2610A\u001d17261118", "context": {"picking_id": 12}}'
# push the queued operations: every operation has a uuid and a local_seq, a repeat changes nothing
curl -X POST https://odoo.example.com/api/wms/v1/sync -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"device_id": "TC52-0147", "ops": [{"uuid": "9d1c...", "type": "scan", "local_seq": 41, "device_time": "2026-10-28T08:01:00Z",
"payload": {"picking_id": 12, "barcode": "6291050000407", "qty": 6, "location_id": 31}}]}'| المجال | نقاط النهاية تحت /api/wms/v1 |
|---|---|
| الجلسة | GET /ping, /config; POST /auth/login, /auth/logout |
| المحلّل | POST /resolve (الباركود والسياق)؛ GET /locations/<barcode>/check?digits=NN |
| القوائم | GET /menu, /pickings, /pickings/<id>, /batches, /batches/<id>, /counts, /counts/<id>, /changes; POST /pickings/<id>/claim, /release, /batches/<id>/start, /claim, /counts/<id>/start |
| العمليات | POST /sync (scan, line_update, validate, move, batch_pick_line, batch_validate, count_line, count_start, count_submit, count_create) أو POST /ops/<type> بالحمولة نفسها |
| ذاكرة العمل دون اتصال | POST /master (cursor, scope: products, locations, packages, lots)، على صفحات |
ببساطة: ترسل المكالمات
Authorization: Bearer <token> واختياريًا Accept-Language. الأخطاء بالشكل {"error": {"code", "message"}} مع حالة HTTP هي 400 أو 401 أو 403 أو 404 أو 409 أو 422. يُحدَّد تسجيل الدخول بـ 8 محاولات خاطئة كل 5 دقائق للعنوان واسم المستخدم نفسيهما.# the engine of the module, in a shell or in your own code
env["wms.barcode.resolver"].resolve("010629105000040710L2610A\x1d17261118", {"picking_id": 12})
# {"hits": [{"type": "product", "id": 9209, "lot_name": "L2610A", "expiration_date": "2026-11-18", ...}, {"type": "lot", "exists": False, ...}],
# "primary": {...}, "gs1": {"parsed": [{"ai": "01", "value": "..."}, ...], "raw": "..."}, "warnings": [], "ms": 2.7}ببساطة: السرعة المقيسة. يحلّل الاختبار الآلي 200 باركود متنوع (منتجات وخانات ودفعات ومنصات وسلاسل GS1 وأرقام أوامر شراء وباركود وزن ورموز غير معروفة) على قاعدة بيانات فيها نحو 2,200 منتج و2,200 خانة و300 دفعة و300 حزمة، ويشترط متوسطًا دون 50 م.ث. في سبع تجارب على حاسوب محمول كان المتوسط بين 3.3 و9.3 م.ث والمئين 95 بين 4.8 و13.3 م.ث. هذه أزمنة من جهة الخادم داخل أودو (الحقل
ms في الجواب)؛ وتضيف الشبكة وطبقة HTTP زمنها الخاص. لم تُقَس قواعد بيانات أكبر. يُبحث عن كل نوع من السجلات باستعلام واحد مفهرس.ببساطة: نقاط الدخول بلغة بايثون على
stock.picking: process_barcode_scan(barcode, location_id, package_id, ...) وaction_mobile_validate(picking_id, lines_data, backorder_policy)؛ وعلى wms.batch.pick: wms_scan وwms_validate؛ وعلى wms.count.session: wms_count_line وwms_submit وaction_apply. تفحص هذه الدوال مجموعة المستخدم بنفسها وتؤدي عملها بصلاحيات مرتفعة بعد الفحوص.الأمان
| الموضوع | ماذا تفعل الوحدة |
|---|---|
| الرموز | يسجّل الجهاز الدخول باسم المستخدم وكلمة المرور ويتلقى رمزًا عشوائيًا؛ ولا يُخزَّن منه إلا بصمة SHA-256. ينتهي الرمز عندما يُؤرشف المستخدم أو يفقد المجموعة أو يُسجَّل خروجه؛ وتُحذف الرموز التي لم تُستخدم منذ 180 يومًا. |
| التفويض | كل دالة عامة تفحص المجموعة والشركة ونوع العملية والاستلام للعمل. لا يُقرَّر شيء من مفتاح سياق أو من حقل يستطيع العميل كتابته. |
| حقول سير العمل | الحالة ومن اعتمد وما طُبِّق والكميات الممسوحة في الجرد لا تتغير إلا بالأزرار أو الواجهة البرمجية، وليس مباشرة أبدًا. |
| المدخلات | يجب أن تكون الكميات أعدادًا منتهية ضمن النطاق، وتُفحص التواريخ، ويُحدّ الباركود بـ 300 حرف، والحمولات بـ 100 عملية في المكالمة؛ وتُرفض NaN واللانهاية. |
| سلامة الجرد | الكميات المتوقعة مجمّدة ومخفية عن المشغّلين؛ والاعتماد متسلسل بقفل على الصف، فلا يُطبَّق الجرد مرتين أبدًا؛ ومن عدّ الجرد أو أرسله أو صحّحه لا يستطيع اعتماده، ولا يمكن تغيير العادّ في جرد بدأ. |
| الشركات | لا يعرض جواب المسح إلا بيانات شركات المستخدم المسجَّل: ويُرفض طلب شركة أخرى في سياق الطلب. |
| التدقيق | يحتفظ سجل المسح والعمليات المتزامنة بمن ومتى وأي جهاز وماذا كان الجواب. |
التحديث
استبدل المجلد بالإصدار الجديد وأعد تشغيل أودو ونفّذ -u taqnix_wms_barcode. تبقى الخانات والتسلسلات والإعدادات والموجات وعمليات الجرد وسجل المسح. حدّث التطبيق على الأجهزة بالبناء الجديد؛ ويتخاطب التطبيق والوحدة بإصدار الواجهة البرمجية 1.
حل المشكلات
| المشكلة | ما العمل |
|---|---|
| لا يستطيع التطبيق الاتصال | افتح https://your-odoo/api/wms/v1/ping على الجهاز: يجب أن يجيب بـ {"ok": true}. تحقق من https والشهادة والعنوان دون شرطة مائلة في آخره وقاعدة البيانات (إذا كان لديك عدة قواعد فاستخدم إعداد dbfilter أو أرسل الترويسة X-Odoo-Database). |
| يقول تسجيل الدخول إن الحساب ليس مشغّلًا | امنح المستخدم المجموعة «إدارة المستودع المتنقل / مشغّل» (أو مدير). |
| عملية النقل ليست في القائمة | يجب أن يكون نوع عمليتها مفعّلًا فيه إدارة المستودع المتنقل، وأن تكون حالتها جاهزة (أو بالانتظار)، وأن تتبع شركة المستخدم. |
| يصفّر الماسح لكن لا يحدث شيء في التطبيق | يجب أن يكون إجراء النيّة في الملف التعريفي للماسح وفي إعدادات التطبيق متطابقًا، وأن يكون التسليم Broadcast، وأن يكون إخراج ضغطات المفاتيح (keystroke output) متوقفًا. |
| المسح يُكتب في حقل | ما زال إخراج ضغطات المفاتيح (DataWedge) أو إدخال لوحة المفاتيح مفعّلًا. |
| باركود غير معروف | تحقق من باركود المنتج (المخزون ← المنتجات) وباركود التعبئة، وهل الرمز GS1 (يقول المحرك رقم التحقق خاطئ عندما يكون الرقم خاطئًا). |
| رقم التحقق مرفوض | الأرقام على الملصق وفي نموذج الخانة؛ والخانة بلا أرقام تقبل أي شيء. |
| رقم تسلسلي أو دفعة مرفوضة | اقرأ الرمز في الجواب: serial_duplicate أو unknown_lot أو lot_expired أو tracking_required. |
| التقاط زائد | ارفع هامش التسامح في الإعدادات أو في نوع العملية، أو اعتمد مع أمر مؤجل. |
| لا يمكن اعتماد الموجة | تذكر الرسالة عملية النقل الفاشلة؛ أصلحها (الدفعة أو الوجهة) واعتمد مجددًا: لم يُكتب شيء. |
| لا يمكن اعتماد جرد | يجب أن يكون الجرد في المراجعة؛ ويجب ألا يكون المعتمد هو العادّ (الإعدادات)؛ وربما اعتمده شخص آخر. |
| تُطبع الملصقات بلا باركود | تحقق من أن wkhtmltopdf يعمل وأن للخانة باركود. |
| تبقى العمليات في الطابور | افتح العمليات المتزامنة لترى رمز المرفوضة ورسالتها. |
| مشكلة الماسح | ما العمل |
|---|---|
| لا يحدث شيء حين أسحب الزناد | افتح الإعدادات ← اختبار الماسح واسحبه. إذا بقي آخر نيّة خام فارغًا فلم تصل النيّة: قارن الإجراء في ملف الماسح بما في التطبيق، وتحقق من أن التسليم بث وأن الملف مرتبط بـ com.taqnix.wmsscanner. |
| زر الزناد لا يمسح | رموز مفاتيح الزر تتبع الطراز: اقرأها في اختبار الماسح واكتبها في رموز مفاتيح زر المسح. |
| يُحسب المسح مرتين | يُهمل المكرر خلال 400 ملّي ثانية. وإذا كان ماسحك يرسل القراءة نفسها بملفين مختلفين (مثل النيّة ولوحة المفاتيح معًا) فأوقف أحدهما. |
| لا تفتح الكاميرا | اسمح للتطبيق باستخدام الكاميرا في إعدادات أندرويد أو iOS. |
الحدود وما لم يُتحقق منه
ببساطة: اقرأ هذا قبل أن تقرر. إنها القائمة الصريحة.
| الموضوع | التفاصيل |
|---|---|
| الماسحات الحقيقية | لم يتوفر للمؤلف أي جهاز Zebra أو Honeywell أو Datalogic. الملف التعريفي لـ DataWedge (SET_CONFIG) ونيّات الشركات الثلاث وحقولها والمسح البرمجي بالزناد ورموز مفاتيح الزناد الافتراضية وفق وثائق الشركات، ومختبرة بالوحدات من جهة التحليل فقط. أما وصول بث حقيقي وسلوك المستقبِل على صورة أندرويد معينة والفروق بين DataWedge 6.x و8.x فيجب تأكيدها على عتادك. جرّب جهازًا واحدًا قبل أن تشتري خمسين. |
| أنواع باركود Honeywell | حروف codeId لدى Honeywell مرتبطة بعدد قليل من الأنواع الشائعة فقط؛ والمصدر الموثوق هو معرّف AIM. |
| الكاميرا والصوت والبطارية | لم يُشغَّل مسح الكاميرا (المصباح ونافذة المسح والوضع المستمر) على جهاز: فمحاكي iOS بلا كاميرا. ولم يُقَس زمن استجابة الأصوات ولا قوة الاهتزاز ولا استهلاك البطارية مع بقاء الشاشة مضاءة ولا سلوك المستقبِل عند إطفاء الشاشة أو في وضع السكون. |
| محاكي أندرويد | تُبنى حزمة APK للتصحيح، لكن المؤلف لم يشغّل التطبيق على محاكي أندرويد ولا على هاتف. شُغّل على محاكي iOS مقابل الوحدة الحقيقية. |
| iOS | لا توجد إضافة ماسح عتادي على iOS: يمسح الآيفون بالكاميرا. |
| باركود الوزن دون اتصال | يُحلَّل EAN-13 المضمَّن فيه الوزن على الجهاز فقط حين يحمل سجل المنتج رمزه (الحقل plu) أو يتضمنه مرجعه الداخلي؛ وإلا حلّله الخادم، أي يحتاج إلى الشبكة. |
| الأرقام التسلسلية | المسحة الواحدة وحدة واحدة. تغيير الدفعة في منتصف سطر يستبدل دفعة ذلك السطر على الجهاز؛ ويقسّم الخادم السطر حين يستلمه. |
| وحدات القياس | تُعرض وحدة القياس غير وحدة المنتج نفسه، لكن الكميات لا تُحوَّل على الجهاز. |
| باركود العبوة في الجرد | مسح باركود عبوة منتج أثناء الجرد ينشئ سطر جرد منفصلًا بدل أن يقع على سطر الحزمة التي تحويها. تُظهر المراجعة حينئذ سطر الحزمة مفقودًا (سالبًا) والسطر المنفصل موجودًا (موجبًا): اقرأهما معًا وصحّحهما قبل الاعتماد. |
| التصنيع | أوامر التصنيع (التقاط المكونات والإنتاج) غير مدعومة. |
| تخطيط الموجات | الموجات تُنشأ يدويًا أو من تحديد. لا يوجد تخطيط آلي للموجات بحسب الوزن أو الحجم أو موعد إغلاق الناقل أو المنطقة. |
| التخزين | خانة الوجهة لسطر ما هي التي تعطيها قواعد التخزين في أودو؛ ولا تضيف الوحدة استراتيجية تخزين خاصة بها. |
| GS1 بلا فواصل | سلسلة GS1 فيها عنصر متغير الطول يتبعه عنصر آخر بلا فاصل غامضة، كما في معيار GS1؛ ويجب أن يرسل الماسح FNC1. |
| الانتهاء | دون ميزة تواريخ الانتهاء في أودو يُحفظ الانتهاء في حقل من هذه الوحدة. أما السلوك مع تثبيت تلك الميزة فيمر عبر مسار الشيفرة نفسه لكنه لم يُختبر في قاعدة بيانات تحتويها. |
| دون اتصال | يعمل التطبيق على ما خزّنه؛ وإنشاء دفعة غير معروفة للخادم ممكن في الاستلامات فقط. ويُمنع عمل جهازين على عملية النقل نفسها بالاستلام للعمل، ولا يُدمجان. |
| الحجم | قِيس المحلّل على قاعدة بيانات فيها نحو 2,200 منتج و2,200 خانة (الفصل 27). لم تُقَس قواعد بيانات أكبر. |
| إصدار أودو | مبني ومختبر على أودو 19.0. |
الدعم
المساعدة في التثبيت وإصلاح الأخطاء مشمولان لمدة 6 أشهر مع تحديثات مدى الحياة. تواصل معنا عبر صفحة السوق التي اشتريت منها الوحدة أو راسل support@taqnix.com مع إصدار أودو ولقطة شاشة.