واجهات برمجة التطبيقات (API) العامة لـ ‏‫رؤية المخزون‬

ملاحظة

أصبح Azure Active Directory الآن Microsoft Entra ID. معرفة المزيد

يصف هذا المقال واجهات برمجة التطبيقات العامة التي يتم توفيرها بواسطة "رؤية المخزون".

تقدم واجهة برمجة التطبيقات العامة لـ REST الخاصة بالوظيفة الإضافية لرؤية المخزون العديد من نقاط التكامل الخاصة. ويدعم أربعة أنواع من التفاعلات الرئيسية:

  • ترحيل تغييرات المخزون الفعلية إلى الوظيفة الإضافية من نظام خارجي
  • تعيين أو تجاوز كميات المخزون الفعلي في الوظيفة الإضافية من نظام خارجي
  • ترحيل أحداث الحجز إلى الوظيفة الإضافية من نظام خارجي
  • الاستعلام عن الكميات الفعلية الحالية من نظام خارجي

يسرد الجدول التالي واجهات برمجة التطبيقات المتوفرة حاليًا:

المسار الأسلوب ‏‏الوصف‬
/api/environment/{environmentId}/onhand نشر إنشاء حدث تغيير واحد مباشر
/api/environment/{environmentId}/onhand/bulk نشر إنشاء أحداث تغيير متعددة
/api/environment/{environmentId}/setonhand/{inventorySystem}/bulk نشر تعيين/تجاوز الكميات المتاحة
/api/environment/{environmentId}/onhand/reserve نشر إنشاء حدث حجز مرن واحد
/api/environment/{environmentId}/onhand/reserve/bulk نشر إنشاء أحداث حجز مرن متعددة
/api/environment/{environmentId}/onhand/unreserve نشر حدث حجز مرن واحد
/api/environment/{environmentId}/onhand/unreserve/bulk نشر أحداث حجز مرن متعددة
/api/environment/{environmentId}/onhand/reserve/resyncjob نشر تنظيف بيانات الحجز
/api/environment/{environmentId}/onhand/changeschedule نشر إنشاء تغيير فعلي مجدول
/api/environment/{environmentId}/onhand/changeschedule/bulk نشر إنشاء تغييرات فعلية متعددة بتواريخ
/api/environment/{environmentId}/onhand/indexquery نشر الاستعلام باستخدام أسلوب الترحيل (موصى به)
/api/environment/{environmentId}/onhand إحضار الاستعلام باستخدام أسلوب الحصول
/api/environment/{environmentId}/onhand/exactquery نشر الاستعلام الدقيق باستخدام أسلوب الترحيل
/api/environment/{environmentId}/allocation/allocate نشر إنشاء حدث تخصيص واحد
/api/environment/{environmentId}/allocation/unallocate نشر إنشاء حدث إلغاء تخصيص واحد
/api/environment/{environmentId}/allocation/reallocate نشر إنشاء حدث إعادة تخصيص واحد
/api/environment/{environmentId}/allocation/consume نشر إنشاء حدث استهلاك واحد
/api/environment/{environmentId}/allocation/query نشر نتيجة تخصيص استعلام
/api/environment/{environmentId}/onhand/productsearch/indexquery نشر نشر استعلام الفهرس مع البحث عن المنتج
/api/environment/{environmentId}/onhand/productsearch/exactquery نشر نشر استعلام دقيق مع البحث عن المنتج

ملاحظة

جزء {environmentId} من المسار هو معرف البيئة في Microsoft Dynamics Lifecycle Services.

يمكن لواجهة برمجة التطبيقات المجمعة إرجاع 512 سجلاً كحد أقصى لكل طلب.

المصادقة

يتم استخدام رمز أمان النظام الأساسي لاستدعاء واجهة برمجة التطبيقات العامة لرؤية المخزون. ولذلك، يجب إنشاء رمز Microsoft Entra المميز باستخدام تطبيق Microsoft Entra. يجب استخدام رمز Microsoft Entra المميز للحصول على رمز الوصول المميز من خدمة الأمان.

للحصول على رمز خدمة الأمان، اتبع هذه الخطوات.

  1. قم بتسجيل الدخول إلى مدخل Azure، واستخدمه للبحث عن قيم clientId وclientSecret لتطبيق Dynamics 365 Supply Chain Management الخاص بك.

  2. إحضار Microsoft Entra رمز مميز (aadToken) عن طريق إرسال طلب HTTP بالخصائص التالية:

    • عنوان URL:https://login.microsoftonline.com/${aadTenantId}/oauth2/v2.0/token

    • الأسلوبGET

    • محتوي النص الأساسي (بيانات النموذج):

      المفتاح قيمة
      client_id ${aadAppId}
      client_secret ${aadAppSecret}
      grant_type client_credentials
      النطاق 0cdb527f-a8d1-4bf8-9436-b352c68682b2(افتراضية)

    يجب أن تتلقى رمز Microsoft Entra المميز (aadToken) في الاستجابة. يجب أن تشبه المثال التالي.

    {
        "token_type": "Bearer",
        "expires_in": "3599",
        "ext_expires_in": "3599",
        "access_token": "eyJ0eX...8WQ"
    }
    
  3. قم بصياغة طلب JavaScript Object Notation ‏(JSON) يشبه المثال التالي.

    {
        "grant_type": "client_credentials",
        "client_assertion_type": "aad_app",
        "client_assertion": "{Your_Microsoft EntraToken}",
        "scope": "https://inventoryservice.operations365.dynamics.com/.default",
        "context": "{$LCS_environment_id}",
        "context_type": "finops-env"
    }
    

    لاحظ النقاط التالية:

    • يجب أن تكون قيمة client_assertion رمز Microsoft Entra المميز (aadToken) الذي استلمته في الخطوة السابقة.
    • يجب أن تكون قيمة context معرف بيئة Lifecycle Services حيث تريد توزيع الوظيفة الإضافية.
    • قم بتعيين كافة القيم الأخرى كما هو موضح في المثال.
  4. إحضار رمز مميز للوصول (access_token) عن طريق إرسال طلب HTTP بالخصائص التالية:

    • عنوان URL:https://securityservice.operations365.dynamics.com/token
    • الأسلوبPOST
    • رأس HTTP: تضمين إصدار API. (المفتاح هو Api-Version، والقيمة هي 1.0.)
    • محتوي النص الأساسي: تضمين طلب JSON الذي قمت بإنشاءه في الخطوة السابقة.

    يجب أن تتلقى رمز المميز للوصول (access_token) في الاستجابة. يجب عليك استخدام هذا الرمز المميز كرمز لحامله لاستدعاء واجهة برمجة تطبيقات رؤية المخزون. وفيما يلي مثال على ذلك.

    {
        "access_token": "{Returned_Token}",
        "token_type": "bearer",
        "expires_in": 3600
    }
    

ملاحظة

عنوان https://securityservice.operations365.dynamics.com/token URL هو عنوان URL عام لخدمة الأمان. عند استدعاء عنوان URL، تكون الاستجابة الأولى عبارة عن استجابة إعادة توجيه http مع رمز الحالة 307 في رؤوس الاستجابة، وإدخال بالمفتاح "الموقع" الذي يحتوي على عنوان URL الهدف لخدمة الأمان. عنوان URL بهذا التنسيق: https://gw.{$geo}-il101.gateway.prod.island.powerapps.com/securityservice/token. على سبيل المثال، إذا تم تحديد موقع بيئتك في الموقع الجغرافي للولايات المتحدة، فقد يكون عنوان URL هو https://gw.us-il101.gateway.prod.island.powerapps.com/securityservice/token. إذا كان رمز حالة الاستجابة 307 غير مقبول بالنسبة لك، فيمكنك إنشاء عنوان URL الفعلي يدويًا وفقًا لموقع بيئة FinOps الخاص بك. إن أبسط طريقة هي فتح https://gw.as-il101.gateway.prod.island.powerapps.com/securityservice/token باستخدام المستعرض الخاص بك، ثم انسخ العنوان في شريط العناوين.

إنشاء أحداث التغيير المتاحة

هناك نوعان من واجهات برمجة التطبيقات لإنشاء أحداث التغيير المتاحة:

  • إنشاء سجل واحد: /api/environment/{environmentId}/onhand
  • إنشاء سجلات متعددة: /api/environment/{environmentId}/onhand/bulk

يلخص الجدول التالي معنى كل حقل في نص JSON.

معرف الحقل Description
id معرف فريد لحدث التغيير المحدد. إذا حدثت إعادة الإرسال بسبب فشل الخدمة ، فسيتم استخدام هذا المعرف لضمان عدم احتساب نفس الحدث مرتين في النظام.
organizationId معرّف المؤسسة المرتبطة بالحدث. يتم تعيين هذه القيمة إلى مؤسسة أو معرّف منطقة البيانات في Supply Chain Management.
productId معرف المنتج.
quantities الكمية التي يجب تغيير الكمية المتوفرة بها. على سبيل المثال، إذا تمت إضافة 10 كتب جديدة إلى الرف، ستكون هذه القيمة quantities:{ shelf:{ received: 10 }}. إذا تمت إزالة ثلاثة كتب من الرف أو بيعها، ستكون هذه القيمة quantities:{ shelf:{ sold: 3 }}.
dimensionDataSource مصدر البيانات الخاص بالابعاد المستخدمة في حدث تغيير الترحيل والاستعلام. إذا قمت بتحديد مصدر البيانات ، يمكنك استخدام الابعاد المخصصة من مصدر البيانات المحدد. يمكن أن تستخدم رؤية المخزون تكوين البعد لتعيين الأبعاد المخصصة إلى الأبعاد الافتراضية العامة. إذا لم يتم تحديد قيمة dimensionDataSource، يمكنك فقط استخدام الأبعاد الأساسية العامة في استعلاماتك.
dimensions زوج قيمة مفتاح ديناميكي. يتم تعيين القيم لبعض الأبعاد في Supply Chain Management. ومع ذلك، يمكنك أيضا إضافة أبعاد مخصصة (على سبيل المثال، المصدر) للإشارة إلى ما إذا كان الحدث قادما من Supply Chain Management أو نظام خارجي.

ملاحظة

إذا تم تعيين قاعدة تقسيم البيانات لديك إلى حسب معرف المنتج، يكون siteId وlocationId من الأبعاد الاختيارية. وإلا فهي الأبعاد المطلوبة. تنطبق هذه القاعدة أيضًا على واجهات برمجة تطبيقات التخصيص والاحتياطي المبدئي وتغيير الجدول الزمني.

توفر الأقسام الفرعية التالية أمثلة تظهر كيفية استخدام واجهات برمجة التطبيقات هذه.

إنشاء حدث تغيير واحد مباشر

تنشئ واجهة برمجة التطبيقات هذه حدثًا فرديًا للتغيير.

Path:
    /api/environment/{environmentId}/onhand
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    {
        id: string,
        organizationId: string,
        productId: string,
        dimensionDataSource: string, # Optional
        dimensions: {
            [key:string]: string,
        },
        quantities: {
            [dataSourceName:string]: {
                [key:string]: number,
            },
        },
    }

يظهر المثال التالي نموذج محتوى النص الأساسي. في هذا المثال، يكون لدى الشركة نظام نقطة البيع (POS) الذي يقوم بمعالجة الحركات داخل المتجر التالي تغييرات المخزون. أرجع العميل قميصًا أحمرًا لمتجرك. لتوضيح التغيير، يمكنك نشر حدث تغيير لمنتج القميص. هذا الحدث سيزيد من كمية منتج القميص بمعدل 1.

{
    "id": "Test201",
    "organizationId": "usmf",
    "productId": "T-shirt",
    "dimensionDataSource": "pos",
    "dimensions": {
        "siteId": "1",
        "locationId": "11",
        "posMachineId": "0001",
        "colorId": "red"
    },
    "quantities": {
        "pos": {
            "inbound": 1
        }
    }
}

يظهر المثال التالي نموذج محتوى النص الأساسي دون dimensionDataSource. في هذه الحالة، فإن dimensions سيكون الأبعاد الأساسية. إذا تم تعيين dimensionDataSource، فإن dimensions يمكن أن يكون إما أبعاد مصدر البيانات أو الأبعاد الأساسية.

{
    "id": "Test202",
    "organizationId": "usmf",
    "productId": "T-shirt",
    "dimensions": {
        "siteId": "1",
        "locationId": "11",
        "colorId": "red"
    },
    "quantities": {
        "pos": {
            "inbound": 1
        }
    }
}

إنشاء أحداث تغيير متعددة

يمكن لواجهة برمجة التطبيقات هذه إنشاء احداث تغيير، تمامًا كما هو الحدث المفرد API. الفرق الوحيد هو أنه يمكن لواجهة برمجة التطبيقات هذه إنشاء سجلات متعددة في نفس الوقت. التالي، يختلف القيمتان Pathو Body. بالنسبة لواجهة برمجة التطبيقات هذه، يوفر Body مجموعة من السجلات. الحد الأقصى لعدد السجلات هو 512. لذلك، يمكن لواجهة برمجة التطبيقات المجمعة للتغيير الفعلي دعم ما يصل إلى 512 تغييرًا للأحداث في المرة الواحدة.

على سبيل المثال، تمت معالجة جهاز POS الخاص بمتجر البيع بالتجزئة بالحركتين التاليتين:

  • أمر إرجاع واحد لقميص واحد باللون الأحمر
  • حركة مبيعات واحدة بثلاثة قمصان سوداء

في هذه الحالة، يمكنك تضمين كل من تحديثات المخزون في أحد استدعاءات API.

Path:
    /api/environment/{environmentId}/onhand/bulk
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    [
        {
            id: string,
            organizationId: string,
            productId: string,
            dimensionDataSource: string, # Optional
            dimensions: {
                [key:string]: string,
            },
            quantities: {
                [dataSourceName:string]: {
                    [key:string]: number,
                },
            },
        },
        ...
    ]

يظهر المثال التالي نموذج محتوى النص الأساسي.

[
    {
        "id": "Test203",
        "organizationId": "usmf",
        "productId": "T-shirt",
        "dimensionDataSource": "pos",
        "dimensions": {
            "SiteId": "Site1",
            "LocationId": "11",
            "posMachineId": "0001"
            "colorId": "red"
        },
        "quantities": {
            "pos": { "inbound": 1 }
        }
    },
    {
        "id": "Test204",
        "organizationId": "usmf",
        "productId": "T-shirt",
        "dimensions": {
            "siteId": "1",
            "locationId": "11",
            "colorId": "black"
        },
        "quantities": {
            "pos": { "outbound": 3 }
        }
    }
]

تعيين/تجاوز الكميات المتاحة

تتجاوز تعيين واجهة برمجة تطبيقات المتاحة البيانات الحالية للمنتج المحدد. إعادة ما يتم استخدام هذه الوظيفة لإجراء تحديثات جرد المخزون. على سبيل المثال، أثناء جرد المخزون اليومي، قد يجد المتجر أن المخزون الفعلي الفعلي لقميص أحمر هو 100. بالتالي، يجب تحديث كمية نقطه البيع الواردة إلى 100 بغض النظر عن ما كانت عليه الكمية السابقة. يمكنك استخدام API هذا لتجاوز القيمة الموجودة.

Path:
    /api/environment/{environmentId}/setonhand/{inventorySystem}/bulk
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    [
        {
            id: string,
            organizationId: string,
            productId: string,
            dimensionDataSource: string, # Optional
            dimensions: {
                [key:string]: string,
            },
            quantities: {
                [dataSourceName:string]: {
                    [key:string]: number,
                },
            },
            modifiedDateTimeUTC: datetime,
        },
        ...
    ]

يظهر المثال التالي نموذج محتوى النص الأساسي. يختلف سلوك واجهة برمجة التطبيقات هذه عن سلوك واجهات برمجة التطبيقات الموضحة في قسم إنشاء أحداث تغيير متاحة لاحقًا في هذا المقال. في هذ النموذج، سيتم تعيين كمية منتج القميص إلى 1.

[
    {
        "id": "Test204",
        "organizationId": "usmf",
        "productId": "T-shirt",
        "dimensionDataSource": "pos",
        "dimensions": {
            "SiteId": "1",
            "LocationId": "11",
            "posMachineId": "0001"
            "colorId": "red"
        },
        "quantities": {
            "pos": {
                "inbound": 100
            }
        }
    }
]

إنشاء أحداث الحجز

لاستخدام واجهة برمجة تطبيقات الحجز ، يجب عليك تشغيل ميزة الحجز وإكمال تكوين الحجز. لمزيد من المعلومات (بما في ذلك تدفق البيانات ونموذج السيناريو)، راجع حجوزات رؤية المخزون.

إنشاء حدث حجز واحد

يمكن إجراء الحجز مقابل إعدادات مصدر بيانات مختلفة. لتكوين هذا النوع من الحجز ، حدد أولا مصدر البيانات في معلمة dimensionDataSource. ثم، في معلمة dimensions، حدد الأبعاد وفقاً لإعدادات البعد في مصدر البيانات الهدف.

عند استدعاء API للحجز، يمكنك التحكم في التحقق من صحة الحجز عن طريق تحديد المعلمة المنطقية ifCheckAvailForReserv في النص الأساسي للطلب. تعني القيمة True أن التحقق من الصحة مطلوب، بينما تعني القيمة False أن التحقق من الصحة غير مطلوب. القيمة الافتراضية هي True.

إذا كنت ترغب في إلغاء حجز أو إبطال حجز كميات مخزون محددة، فقم بتعيين الكمية على قيمة سالبة، وقم بتعيين معلمة ifCheckAvailForReserv إلى False لتخطي عملية التحقق من الصحة. يوجد أيضا أونريسيرفي مخصص لواجهه برمجه التطبيقات (API) للقيام بنفس الاجراء. الفرق فقط هو الطريقة التي يتم بها استدعاء APIs. من الأسهل عكس حدث حجز معين باستخدام reservationId بواسطة غير متحفظ واجهة برمجة التطبيقات. لمزيد من المعلومات، راجع مقطع حدث حجز واحد.

Path:
    /api/environment/{environmentId}/onhand/reserve
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    {
        id: string,
        organizationId: string,
        productId: string,
        dimensionDataSource: string,
        dimensions: {
            [key:string]: string,
        },
        quantityDataSource: string, # optional
        quantities: {
            [dataSourceName:string]: {
                [key:string]: number,
            },
        },
        modifier: string,
        quantity: number,
        ifCheckAvailForReserv: boolean,
    }

يظهر المثال التالي نموذج محتوى النص الأساسي.

{
    "id": "reserve-0",
    "organizationId": "SCM_IV",
    "productId": "iv_contoso_product",
    "quantity": 1,
    "quantityDataSource": "iv",
    "modifier": "softReservOrdered",
    "ifCheckAvailForReserv": true,
    "dimensions": {
        "siteId": "iv_contoso_site",
        "locationId": "iv_contoso_location",
        "colorId": "red",
        "sizeId": "small"
    }
}

يوضح المثال التالي استجابه ناجحه.

{
    "reservationId": "RESERVATION_ID",
    "id": "ohre~id-822-232959-524",
    "processingStatus": "success",
    "message": "",
    "statusCode": 200
}

إنشاء أحداث حجز متعددة

واجهة برمجة التطبيقات هذه هي إصدار مجمع من واجهة برمجة تطبيقات الحدث الواحد.

Path:
    /api/environment/{environmentId}/onhand/reserve/bulk
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    [
        {
            id: string,
            organizationId: string,
            productId: string,
            dimensionDataSource: string,
            dimensions: {
                [key:string]: string,
            },
            quantityDataSource: string, # optional
            quantities: {
                [dataSourceName:string]: {
                    [key:string]: number,
                },
            },
            modifier: string,
            quantity: number,
            ifCheckAvailForReserv: boolean,
        },
        ...
    ]

أحداث الحجز العكسي

ال غير احتياطي واجهة برمجة التطبيقات بمثابة عملية عكسية ل الحجز الأحداث. ويوفر طريقه للغاء حدث حجز محدد بواسطة reservationId أو لتقليل كميه الحجز.

عكس حدث حجز واحد

وعند إنشاء عمليه حجز ، reservationId سيتم تضمينها في نص الاستجابة. ويجب عليك توفير نفسه reservationId لإلغاء الحجز، وإدراجه organizationId, productId, و dimensions يستخدم لاستدعاء API الحجز. وأخيرا ، قم بتحديد OffsetQty القيمة التي تمثل عدد الأصناف التي سيتم تحريرها من عمليه الحجز السابقة. يمكن ان يتم عكس الحجز بالبالكامل أو جزئيا بناء علي المحدد OffsetQty. علي سبيل المثال ، إذا تم حجز الوحدات 100 الخاصة بالأصناف ، يمكنك تحديد OffsetQty: 10 لأونريسيرفي 10 من المبلغ المحجوز المبدئي.

Path:
    /api/environment/{environmentId}/onhand/unreserve
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    {
        id: string,
        organizationId: string,
        productId: string,
        reservationId: string,
        dimensions: {
            [key:string]: string,
        },
        OffsetQty: number
    }

يُظهر الكود التالي مثالاً لمحتوى الجسم.

{
    "id": "unreserve-0",
    "organizationId": "SCM_IV",
    "productId": "iv_contoso_product",
    "reservationId": "RESERVATION_ID",
    "dimensions": {
        "siteid":"iv_contoso_site",
        "locationid":"iv_contoso_location",
        "ColorId": "red",
        "SizeId": "small"
    },
    "OffsetQty": 1
}

يوضح الكود التالي مثالاً لهيئة استجابة ناجحة.

{
    "reservationId": "RESERVATION_ID",
    "totalInvalidOffsetQtyByReservId": 0,
    "id": "ohoe~id-823-11744-883",
    "processingStatus": "success",
    "message": "",
    "statusCode": 200
}

إشعار

في جسد الاستجابة ، متى OffsetQty أقل من أو يساوي كمية الحجز, processingStatus سيكون "ناجح" و totalInvalidOffsetQtyByReservId سيكون 0.

لو OffsetQty أكبر من المبلغ المحجوز, processingStatus سيكون "partialSuccess" و totalInvalidOffsetQtyByReservId سيكون الفرق بين OffsetQty والمبلغ المحجوز.

على سبيل المثال ، إذا كان الحجز يحتوي على كمية 10, و OffsetQty لديها قيمة 12, totalInvalidOffsetQtyByReservId سيكون 2.

عكس أحداث الحجز المتعددة

واجهة برمجة التطبيقات هذه هي إصدار مجمع من واجهة برمجة تطبيقات الحدث الواحد.

Path:
    /api/environment/{environmentId}/onhand/unreserve/bulk
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    [      
        {
            id: string,
            organizationId: string,
            productId: string,
            reservationId: string,
            dimensions: {
                [key:string]: string,
            },
            OffsetQty: number
        }
        ...
    ]

تنظيف بيانات الحجز

يتم استخدام واجهة API لـ تنظيف بيانات الحجز لتنظيف بيانات الحجز التاريخية. يجب أن يكون النص عبارة عن قائمة بمصادر البيانات. إذا كانت القائمة فارغة، سيتم تنظيف كافة مصادر البيانات.

Path:
    /api/environment/{environmentId}/onhand/reserve/resyncjob
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    [      
        "iv",
        "pos"
    ]

الاستعلام المتاح

استخدم واجهة برمجة تطبيقات الاستعلام المتاح لجلب بيانات المخزون الحالية الفعلية لمنتجاتك. يمكنك استخدام واجهة برمجة التطبيقات هذه عندما يجب معرفة الأسهم، مثل عندما ترغب في مراجعة مستويات مخزون المنتج على موقع الويب الخاص بالتجارة إلكترونية، أو عندما ترغب في التحقق من توفر المنتجات عبر المناطق أو في المتاجر القريبة والمستودعات. تدعم واجهه برمجه التطبيقات حاليا الاستعلام حتى 5000 صنفا فرديا حسب قيمة productID. يمكن أيضًا تحديد قيم siteID وlocationID المتعددة في كل استعلام. عند تعيين قاعدة تقسيم البيانات لديك إلى حسب الموقع، يتم تحديد الحد الأقصى بالمعادلة التالية:

NumOf(SiteID) × NumOf(LocationID)= < 10,000.

الاستعلام باستخدام أسلوب الترحيل

يتوفر الاستعلام عن طريق post API في إصدارين. ويوجز الجدول التالي الاختلافات.

الإصدار 1.0 من واجهة برمجة التطبيقات API الإصدار 2.0
يمكن الاستعلام عن معرف مؤسسة واحد فقط. يمكنه الاستعلام عن معرفات مؤسسات متعددة.
يمكنه الاستعلام عن ما يصل إلى 10000 مجموعة من المواقع والمستودعات. يمكنه الاستعلام عن أكثر من 10000 مجموعة من معرفات المؤسسة والمواقع والمستودعات. يمكن إرجاع النتائج في صفحات متعددة.

توضح الأقسام الفرعية التالية كيفية استخدام كل إصدار من إصدارات API.

الاستعلام عن طريق الإصدار 1.0 من واجهة برمجة تطبيقات البريد

Path:
    /api/environment/{environmentId}/onhand/indexquery
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    {
        dimensionDataSource: string, # Optional
        filters: {
            organizationId: string[],
            productId: string[],
            siteId: string[],
            locationId: string[],
            [dimensionKey:string]: string[],
        },
        groupByValues: string[],
        returnNegative: boolean,
    }

في الجزء الأساسي من هذا الطلب، تُعد المعلمة dimensionDataSource معلمة اختيارية. وإذا لم يتم تعيينه، فسوف تتم معاملة filters كـ أبعاد أساسية.

تتحكم المعلمة returnNegative فيما إذا كانت النتائج تحتوي على إدخالات سالبة أم لا.

الاستعلام عن البيانات المخزنة حسب الموقع

ينطبق هذا القسم عند تعيين قاعدة تقسيم البيانات لديك إلى حسب الموقع.

  • organizationId يجب أن يكون مصفوفة تحتوي على قيمة واحدة بالضبط.
  • يمكن أن يحتوي productId على قيمة واحدة أو أكثر. إذا كانت مصفوفة فارغة، فسيقوم النظام بإرجاع جميع المنتجات للمواقع والأماكن المحددة. في هذه الحالة، يجب ألا يكون siteId وlocationId فارغين.
  • siteId وlocationId يتم استخدامهما للتقسيم. يمكنك تحديد أكثر من قيمة siteId وlocationId واحدة في طلب الاستعلام المتاح‬. إذا كانت كلتا المصفوفتين فارغين، فسيقوم النظام بإرجاع كل المواقع والأماكن الخاصة بالمنتجات المحددة. في هذه الحالة، يجب ألا يكون productId فارغًا.

نوصي باستخدام معلمة groupByValues بطريقة تتوافق مع تكوين المؤشر الخاص بك. لمزيد من المعلومات، راجع تكوين مؤشر الكمية المتاحة.

الاستعلام عن البيانات المخزنة بواسطة معرف المنتج

ينطبق هذا القسم عند تعيين قاعدة تقسيم البيانات لديك إلى حسب معرف المنتج. في هذه الحالة، يلزم وجود حقلين filters: organizationId، productId.

  • organizationId يجب أن يكون مصفوفة تحتوي على قيمة واحدة بالضبط.
  • productId يجب أن يكون مصفوفة تحتوي على قيمة واحدة على الأقل.

بخلاف تخزين البيانات حسب الموقع، إذا لم تحدد قيمًا لكل من siteId وlocationId، سيتم تجميع معلومات المخزون لكل معرف منتج عبر جميع المواقع و/أو الأماكن.

ملاحظة

إذا قمت بتمكين الميزتين جدولة التغييرات الفعلية والمتاحة للتعهد (ATP)، فيمكن أن يتضمن استعلامك أيضًا المعلمة المنطقية QueryATP، والتي تتحكم في ما إذا كانت نتائج الاستعلام تتضمن معلومات ATP أم لا. لمزيد من المعلومات والأمثلة، راجع جداول التغيير الفعلي لرؤية المخزون والمتوفر حسب التعهد.

يظهر المثال التالي نموذج محتوى النص الأساسي. وهو يوضح انه يمكنك الاستعلام عن المخزون الفعلي من مواقع متعددة (المستودعات).

{
    "dimensionDataSource": "pos",
    "filters": {
        "organizationId": ["usmf"],
        "productId": ["T-shirt"],
        "siteId": ["1"],
        "locationId": ["11","12","13"],
        "colorId": ["red"]
    },
    "groupByValues": ["colorId", "sizeId"],
    "returnNegative": true
}

يوضح المثال التالي كيفية الاستعلام عن جميع المنتجات في موقع وموقع معين.

{
    "filters": {
        "organizationId": ["usmf"],
        "productId": [],
        "siteId": ["1"],
        "locationId": ["11"],
    },
    "groupByValues": ["colorId", "sizeId"],
    "returnNegative": true
}

الاستعلام عن طريق الإصدار 2.0 من واجهة برمجة التطبيقات

Path:
    /api/environment/{environmentId}/onhand/indexquery?pageNumber={pageNumber}&pageSize={pageSize}
Method:
    Post
Headers:
    Api-Version="2.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    # Same as version 1.0

يشبه تنسيق الطلب لإصدار API 2.0 تنسيق الإصدار 1.0 ، ولكنه يدعم أيضا معلمتين اختياريتين: pageNumber و pageSize ، مما يسمح للنظام بتقسيم نتيجة واحدة كبيرة إلى عدة مستندات أصغر. يتم فرز النتائج حسب المستودع (locationId) ، ويتم استخدام المعلمات كما يلي لتقسيم النتائج إلى صفحات:

  • pageSize يحدد عدد المستودعات (locationId القيم) التي يتم إرجاعها في كل صفحة.
  • pageNumber يحدد رقم الصفحة التي تم إرجاعها.

يرجع طلب بهذا التنسيق بيانات المخزون الفعلي بدءا من رقم المستودع ({pageNumber} − 1) × {pageSize} ويتضمن بيانات للمستودعات التالية {pageSize} .

يستجيب الإصدار 2.0 من API بمستند يستخدم البنية التالية:

{
    Value: { # Response same as Api-Version=1.0 }
    nextLink: onhand/indexquery?pageNumber={pageNumber+1}&pageSize={pageSize}
}

عندما يصل الطلب إلى المستودع الأخير (locationIdnextLink تكون القيمة عبارة عن سلسلة فارغة.

يتيح لك الإصدار 2.0 من API أيضا تحديد أكثر من معرف مؤسسة واحد في طلبك. للقيام بذلك، قم بتضمين قائمة مفصولة بفواصل لمعرفات المؤسسات في organizationId عامل تصفية مستند الطلب. على سبيل المثال، "organizationId": ["org1", "org2", "org3"].

الاستعلام باستخدام أسلوب الحصول

Path:
    /api/environment/{environmentId}/onhand
Method:
    Get
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Query(Url Parameters):
    groupBy
    returnNegative
    [Filters]

هذا نموذج لعنوان URL للحصول. طلب الحصول هذا مماثل تمامًا لعينة المشاركة التي تم توفيرها مسبقًا.

/api/environment/{environmentId}/onhand?organizationId=SCM_IV&productId=iv_contoso_product&siteId=iv_contoso_site&locationId=iv_contoso_location&colorId=red&groupBy=colorId,sizeId&returnNegative=true

لا يدعم النظام الاستعلام عن المخزون عبر معرفات مؤسسات متعددة باستخدام طريقة GET.

الاستعلام الدقيق المتاح

وتشبه الاستعلامات الفعلية الاستعلامات الفعلية الدورية، ولكنها تتيح لك تحديد التسلسل الهرمي للتعيين بين الموقع والمكان. على سبيل المثال، لديك الموقعين التاليين:

  • الموقع 1، الذي تم تعيينه للمكان A
  • الموقع 2، الذي تم تعيينه للمكان B

بالنسبة للاستعلام الفعلي العادي، إذا قمت بتحديد "siteId": ["1","2"] و "locationId": ["A","B"]، ستقوم إمكانية رؤية المخزون تلقائيًا بالاستعلام عن نتيجة المواقع والمواقف التالية:

  • الموقع 1، المكان A
  • الموقع 1، المكان B
  • الموقع 2، المكان A
  • الموقع 2، المكان B

كما ترى، لا تتعرف الاستعلام الفعلي العادي على هذا الموقع في المكان 1، ويوجد المكان B فقط في الموقع 2. ولذلك، فإنه يقوم بإنشاء الاستعلامات المكررة. لاستيعاب هذا التعيين الهرمي، يمكنك استخدام استعلام بعين الكمية الفعلية وتحديد تعيينات الموقع في النص الأساسي للاستعلام. في هذه الحالة، ستقوم بالاستعلام عن النتائج وتلقيها للموقع 1 فقط، والمكان A والموقع 2، المكان B.

استعلام دقيق فعلي باستخدام طريقة الترحيل

يتوفر الاستعلام الدقيق الفعلي عن طريق post API في نسختين. ويوجز الجدول التالي الاختلافات.

الإصدار 1.0 من واجهة برمجة التطبيقات API الإصدار 2.0
يمكن الاستعلام عن معرف مؤسسة واحد فقط. يمكنه الاستعلام عن معرفات مؤسسات متعددة.

استعلام دقيق فعلي عن طريق الإصدار 1.0 من واجهة برمجة التطبيقات

Path:
    /api/environment/{environmentId}/onhand/exactquery
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    {
        dimensionDataSource: string, # Optional
        filters: {
            organizationId: string[],
            productId: string[],
            dimensions: string[],
            values: string[][],
        },
        groupByValues: string[],
        returnNegative: boolean,
    }

في الجزء الأساسي من هذا الطلب، تُعد المعلمة dimensionDataSource معلمة اختيارية. إذا لم يتم تعيينه، فسوف تتم معاملة dimensions في filters بصفتها أبعاد أساسية. توجد أربعة حقول مطلوبه لـ filters: organizationId، وproductId، وdimensions، وvalues.

  • يجب أن يحتوي organizationId على قيمة واحدة فقط، لكنها لا تزال مجموعة.
  • يمكن أن يحتوي productId على قيمة واحدة أو أكثر. إذا كان فارغًا، فسيتم إرجاع كافة المنتجات.
  • في مصفوفة dimensions، يكون siteId وlocationId مطلوبين في حالة وفقط في حالة تعيين قاعدة تقسيم البيانات إلى حسب الموقع. وفي هذه الحالة، يمكن أن تظهر مع العناصر الأخرى بأي ترتيب.
  • يمكن أن تحتوي values على واحد أو أكثر من مجموعات القيم المميزة المقابلة لـ dimensions.

ستتم إضافة dimensions في filters تلقائيًا إلى groupByValues.

تتحكم المعلمة returnNegative فيما إذا كانت النتائج تحتوي على إدخالات سالبة أم لا.

يظهر المثال التالي نموذج محتوى النص الأساسي.

{
    "dimensionDataSource": "pos",
    "filters": {
        "organizationId": ["SCM_IV"],
        "productId": ["iv_contoso_product"],
        "dimensions": ["siteId", "locationId", "colorId"],
        "values" : [
            ["iv_contoso_site", "iv_contoso_location", "red"],
            ["iv_contoso_site", "iv_contoso_location", "blue"],
        ]
    },
    "groupByValues": ["colorId", "sizeId"],
    "returnNegative": true
}

يوضح المثال التالي كيفية الاستعلام عن جميع المنتجات في مواقع وأماكن متعددة.

{
    "filters": {
        "organizationId": ["SCM_IV"],
        "productId": [],
        "dimensions": ["siteId", "locationId"],
        "values" : [
            ["iv_contoso_site_1", "iv_contoso_location_1"],
            ["iv_contoso_site_2", "iv_contoso_location_2"],
        ]
    },
    "groupByValues": ["colorId", "sizeId"],
    "returnNegative": true
}

استعلام دقيق فعلي عن طريق الإصدار 2.0 من واجهة برمجة التطبيقات

Path:
    /api/environment/{environmentId}/onhand/exactquery
Method:
    Post
Headers:
    Api-Version="2.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    {
        dimensionDataSource: string, # Optional
        filters: {
            productId: string[],
            keys: string[],
            values: string[][],
        },
        groupByValues: string[],
        returnNegative: boolean,
    }

يختلف الإصدار 2.0 من API عن الإصدار 1.0 بالطرق التالية:

  • يحتوي المقطع filters الآن على keys حقل بدلا من حقل dimensions . keys يعمل الحقل مثل dimensions الحقل في الإصدار 1.0 ، ولكن يمكن أن يتضمن organizationId الآن أيضا. يمكنك تحديد المفاتيح بأي ترتيب.
  • لم filters يعد القسم يدعم الحقل organizationId . بدلا من ذلك، يمكنك التضمين organizationId من بين الأبعاد في keys الحقل (على سبيل المثال، keys: ["organizationId", "siteId", "locationId"]) وتحديد قيم معرف المؤسسة في موضع المطابقة في values الحقل (على سبيل المثال، values: ["SCM_IV", "iv_contoso_site_1", "iv_contoso_location_1"]).

الحقول الأخرى مطابقة ل API الإصدار 1.0.

الاستعلام باستخدام البحث عن المنتج (API)

تم تحسين واجهات برمجة التطبيقات (API) الخاصة بالاستعلام المباشر التالية لدعم البحث عن المنتج:

ملاحظة

عندما تقوم بنشر استعلام رؤية المخزون الذي يستخدم البحث عن المنتج، استخدم productSearch معلمة الطلب (مع الكائن ProductAttributeQuery بالداخل) للبحث أو التصفية حسب مُعرف المنتج. لم تعد واجهات برمجة التطبيقات الأحدث تدعم معلمة الطلب productid الأقدم في نص الطلب.

المتطلبات الأساسية

قبل أن تتمكن من بدء استخدام واجهات برمجة التطبيقات للبحث عن المنتج، يجب أن يلبي نظامك المتطلبات التالية:

عقد البحث عن المنتج

يحدد عقد البحث عن المنتج قواعد الاتصال بواجهات برمجة التطبيقات للبحث عن المنتج. فهو يوفر طريقة موحدة لوصف إمكانات وسلوك إمكانات البحث عن المنتج. لذلك، يمكن للمستخدمين فهم التطبيقات التي تستهلك واجهات برمجة تطبيقات رؤية المخزون والتفاعل معها وإنشائها بسهولة أكبر.

يظهر المثال التالي نموذج عقد العينة.

{
    "productFilter": {
        "logicalOperator": "And",
        "conditions": [
            {
                "conditionOperator": "Contains",
                "productName": [
                    "Deluxe"
                ],
            },
        ],
        "subFilters": [
            {
                "conditions": [
                    {
                        "conditionOperator": "IsExactly",
                        "productType": [
                            "Item"
                        ]
                    }
                ]
            }
        ]
    },
    "attributeFilter": {
        "logicalOperator": "Or",
        "conditions": [
            {
                "attributeName": "Weight Limit",
                "attributeTypeName":"PoundDomain",
                "attributeArea": " ProductAttribute",
                "attributeValues": [
                    "370"
                ],
                "conditionOperator": "GreaterEqual"
            }
        ],
        "subFilters": [
            {
                "conditions": [
                    {
                        "attributeName": "Weight Limit",
                        "attributeTypeName":"PoundDomain",
                        "attributeArea": " ProductAttribute",
                        "attributeValues": [
                            "330"
                        ],
                        "conditionOperator": "LessEqual"
                    }
                ]
            }
        ]
    },
}

يصف الجدول التالي الحقول المستخدمة في العقد.‬

معرف الحقل ‏‏الوصف‬
logicalOperator والقيم المحتملة هي And و Or. استخدم هذا الحقل لربط عدة شروط أو شروط وعوامل تصفية فرعية. لاحظ أن subFilters هو في الواقع كائن productFilter أو attributeFilter. لذلك، يمكن أن يكون لديك subFilters داخل subFilters.
conditionOperator والقيم المحتملة هي IsExactly وIsNot وContains وDoesNotContain وBeginsWith وIsOneOf وGreaterEqual وLessEqual وBetween.
ProductFilter استخدم هذا الحقل لتصفية المنتجات حسب المعلومات المتعلقة بالمنتج. على سبيل المثال، يمكنك التغيير productName في العقد في Company أو itemNumber أو productSearchName أو productType أو productName أو productDescription أو inventoryUnitSymbol أو salesUnitSymbol أو purchaseUnitSymbol لتناسب احتياجات عملك.
AttributeFilter استخدم هذا الحقل لتصفية المنتجات حسب المعلومات المتعلقة بالسمة.
attributeArea والقيم المحتملة هي ProductAttribute و DimensionAttribute وBatchAttribute.
Path:
    /api/environment/{environmentId}/onhand/productsearch/indexquery
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    {
        productSearch: {ProductAttributeQuery contract object inherited from Product Search}
            dimensionDataSource: string, # Optional
            filters: {
                organizationId: string[],
                siteId: string[],
                locationId: string[],
                [dimensionKey:string]: string[],
            },
            groupByValues: string[],
            returnNegative: boolean,
    }

يظهر المثال التالي نموذج محتوى النص الأساسي.

{
    "productSearch": {
        "productFilter": {
            "conditions": [
                {
                    "conditionOperator": "contains",
                    "productName": [
                        "speaker cable"
                    ],
                },
            ],
        },
    },
    "returnNegative": true, 
    "filters": 
    {
        "organizationId": ["usmf"], 
        "siteId": ["1"], 
        "locationId": ["13"],
    },
    "groupByValues": ["colorid"],
}

يوضح المثال التالي استجابه ناجحه.

[
    {
        "productId": "M0030",
        "dimensions": {
            "ColorId": "White",
            "siteid": "1",
            "locationid": "13"
        },
        "quantities": {
            "fno": {
                "arrived": 0,
                "availordered": 20,
                "onorder": 5,
                "ordered": 20,
                "physicalinvent": 0,
                "reservordered": 0,
                "reservphysical": 0,
                "orderedsum": 20,
                "softreserved": 0
            },
            "iv": {
                "ordered": 0,
                "softreserved": 0,
                "softreservphysical": 0,
                "softreservordered": 0,
                "total ordered": 20,
                "total on order": 5,
                "availabletoreserve": 20,
                "totalavailable": 20,
                "totalordered": 20,
                "totalonorder": 5
            },
            "pos": {
                "inbound": 0,
                "outbound": 0
            },
            "@iv": {
                "@allocated": 0
            }
        }
    },
    {
        "productId": "M0030",
        "dimensions": {
            "ColorId": "Black",
            "siteid": "1",
            "locationid": "13"
        },
        "quantities": {
            "fno": {
                "arrived": 0,
                "availordered": 3,
                "ordered": 3,
                "physicalinvent": 0,
                "reservordered": 0,
                "reservphysical": 0,
                "orderedsum": 3,
                "softreserved": 0
            },
            "iv": {
                "ordered": 0,
                "softreserved": 0,
                "softreservphysical": 0,
                "softreservordered": 0,
                "total ordered": 3,
                "availabletoreserve": 3,
                "totalavailable": 3,
                "totalordered": 3
            },
            "pos": {
                "inbound": 0,
                "outbound": 0
            },
            "@iv": {
                "@allocated": 0
            }
        }
    }
]
Path:
    /api/environment/{environmentId}/onhand/productsearch/exactquery
Method:
    Post
Headers:
    Api-Version="1.0"
    Authorization="Bearer $access_token"
ContentType:
    application/json
Body:
    {
        productSearch: {ProductAttributeQuery contract object inherited from Product Search}
            dimensionDataSource: string, # Optional
            filters: {
                organizationId: string[],
                dimensions: string[],
                values: string[][],
            },
            groupByValues: string[],
            returnNegative: boolean,
    }

يظهر المثال التالي نموذج محتوى النص الأساسي.

{
    "productSearch": {
        "productFilter": {
            "conditions": [
                {
                    "conditionOperator": "contains",
                    "productName": [
                        "speaker cable"
                    ],
                },
            ],
        },
    },
    "filters": {
        "organizationId": ["usmf"],
        "dimensions": ["siteId", "locationId", "colorid"],
        "values" : [
            ["1", "13", "Black"],
        ]
    },
    "groupByValues": [],
    "returnNegative": true
}

يوضح المثال التالي استجابه ناجحه.

[
    {
        "productId": "M0030",
        "dimensions": {
            "ColorId": "Black",
            "siteid": "1",
            "locationid": "13"
        },
        "quantities": {
            "fno": {
                "arrived": 0,
                "availordered": 3,
                "ordered": 3,
                "physicalinvent": 0,
                "reservordered": 0,
                "reservphysical": 0,
                "orderedsum": 3,
                "softreserved": 0
            },
            "iv": {
                "ordered": 0,
                "softreserved": 0,
                "softreservphysical": 0,
                "softreservordered": 0,
                "total ordered": 3,
                "availabletoreserve": 3,
                "totalavailable": 3,
                "totalordered": 3
            },
            "pos": {
                "inbound": 0,
                "outbound": 0
            },
            "@iv": {
                "@allocated": 0
            }
        }
    }
]

متوفر حسب التعهد

يمكنك إعداد رؤية المخزون للسماح بجدولة التغييرات الفعلية المستقبلية وحساب الكميات المتوفرة حسب التعهد (ATP). إن التوفر حسب التعهد (ATP) هو كمية الصنف المتوفرة ويمكن التعهد بها لعميل في الفترة التالية. قد يؤدي استخدام حساب الكميات المتوفرة حسب التعهد (ATP) إلى زيادة قدرة تنفيذ الطلبات بشكل كبير. للحصول على معلومات حول كيفية تمكين هذه الميزة، وكيفية التفاعل مع رؤية المخزون من خلال واجهة برمجة التطبيقات (API) الخاصة بها بعد تمكين الميزة، راجع جداول التغييرات الفعلية لرؤية المخزون والمتوفر حسب التعهد.

التوزيع

توجد واجهات برمجة التطبيقات المتعلقة بالتخصيص في تخصيص رؤية المخزون.