واجهات برمجة التطبيقات (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 المميز للحصول على رمز الوصول المميز من خدمة الأمان.
للحصول على رمز خدمة الأمان، اتبع هذه الخطوات.
قم بتسجيل الدخول إلى مدخل Azure، واستخدمه للبحث عن قيم
clientId
وclientSecret
لتطبيق Dynamics 365 Supply Chain Management الخاص بك.إحضار 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" }
قم بصياغة طلب 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 حيث تريد توزيع الوظيفة الإضافية. - قم بتعيين كافة القيم الأخرى كما هو موضح في المثال.
- يجب أن تكون قيمة
إحضار رمز مميز للوصول (
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 }
- عنوان URL:
ملاحظة
عنوان 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}
}
عندما يصل الطلب إلى المستودع الأخير (locationId
)، nextLink
تكون القيمة عبارة عن سلسلة فارغة.
يتيح لك الإصدار 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
الأقدم في نص الطلب.
المتطلبات الأساسية
قبل أن تتمكن من بدء استخدام واجهات برمجة التطبيقات للبحث عن المنتج، يجب أن يلبي نظامك المتطلبات التالية:
- يجب أن تقوم بتشغيل Dynamics 365 Supply Chain Management الإصدار 10.0.36 أو إصدار لاحق.
- يجب تثبيت وإعداد الإصدار 1.2.2.54 أو إصدار أحدث من رؤية المخزون كما هو موضح في تثبيت وإعداد رؤية المخزون.
- يجب تثبيت وإعداد خدمة البحث لرؤية المخزون كما هو موضح في إعداد منتج البحث لرؤية المخزون.
عقد البحث عن المنتج
يحدد عقد البحث عن المنتج قواعد الاتصال بواجهات برمجة التطبيقات للبحث عن المنتج. فهو يوفر طريقة موحدة لوصف إمكانات وسلوك إمكانات البحث عن المنتج. لذلك، يمكن للمستخدمين فهم التطبيقات التي تستهلك واجهات برمجة تطبيقات رؤية المخزون والتفاعل معها وإنشائها بسهولة أكبر.
يظهر المثال التالي نموذج عقد العينة.
{
"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 . |
الاستعلام باستخدام البحث عن المنتج (API)
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) الخاصة بها بعد تمكين الميزة، راجع جداول التغييرات الفعلية لرؤية المخزون والمتوفر حسب التعهد.
التوزيع
توجد واجهات برمجة التطبيقات المتعلقة بالتخصيص في تخصيص رؤية المخزون.
الملاحظات
https://aka.ms/ContentUserFeedback.
قريبًا: خلال عام 2024، سنتخلص تدريجيًا من GitHub Issues بوصفها آلية إرسال ملاحظات للمحتوى ونستبدلها بنظام ملاحظات جديد. لمزيد من المعلومات، راجعإرسال الملاحظات وعرضها المتعلقة بـ