Publiczne interfejsy API dodatku Inventory Visibility
Uwaga
Azure Active Directory jest teraz Tożsamością Microsoft Entra. Dowiedz się więcej
W tym artykule opisano publiczne interfejsy API udostępniane przez dodatek Widoczność magazynu.
Publiczny interfejs API REST w dodatku Widoczność magazynu przedstawia kilka konkretnych punktów końcowych integracji. Obsługuje on cztery główne typy interakcji:
- Księgowanie dostępnych zmian zapasów w dodatku z systemu zewnętrznego
- Konfigurowanie lub zastępowanie ilości dostępnych zapasów w dodatku z zewnętrznego systemu
- Księgowanie zdarzeń rezerwacji w dodatku z systemu zewnętrznego
- Badanie bieżących ilości dostępnych zapasów z systemu zewnętrznego
W poniższej tabeli przedstawiono obecnie dostępne interfejsy API:
Ścieżka | Metoda | Opis |
---|---|---|
/api/environment/{environmentId}/onhand |
Opublikuj | Tworzenie jednego zdarzenia zmiany dostępnych zapasów |
/api/environment/{environmentId}/onhand/bulk |
Opublikuj | Tworzenie wielu zdarzeń zmiany |
/api/environment/{environmentId}/setonhand/{inventorySystem}/bulk |
Opublikuj | Ustawianie/zastępowanie dostępnych ilości |
/api/environment/{environmentId}/onhand/reserve |
Opublikuj | Tworzenie jednego miękkiego zdarzenia rezerwacji |
/api/environment/{environmentId}/onhand/reserve/bulk |
Opublikuj | Tworzenie wielumiękkich zdarzeń rezerwacji |
/api/environment/{environmentId}/onhand/unreserve |
Opublikuj | Wycofanie jednego miękkiego zdarzenia rezerwacji |
/api/environment/{environmentId}/onhand/unreserve/bulk |
Opublikuj | Wycofanie wielu miękkich zdarzeń rezerwacji |
/api/environment/{environmentId}/onhand/reserve/resyncjob |
Opublikuj | Czyszczenie danych rezerwacji |
/api/environment/{environmentId}/onhand/changeschedule |
Opublikuj | Utwórz jedną zaplanowaną zmianę od ręki |
/api/environment/{environmentId}/onhand/changeschedule/bulk |
Opublikuj | Utwórz wiele zaplanowanych zmian od ręki z datami |
/api/environment/{environmentId}/onhand/indexquery |
Opublikuj | Zapytanie przy użyciu metody post (zalecane) |
/api/environment/{environmentId}/onhand |
Pobierz | Zapytanie przy użyciu metody GET |
/api/environment/{environmentId}/onhand/exactquery |
Opublikuj | Dokładne zapytanie przy użyciu metody POST |
/api/environment/{environmentId}/allocation/allocate |
Opublikuj | Utwórz jedno zdarzenie przydziału |
/api/environment/{environmentId}/allocation/unallocate |
Opublikuj | Utwórz jedno zdarzenie cofnięcia przydziału |
/api/environment/{environmentId}/allocation/reallocate |
Opublikuj | Utwórz jedno zdarzenie ponownego przydziału |
/api/environment/{environmentId}/allocation/consume |
Opublikuj | Tworzenie jednego zdarzenia zużycia |
/api/environment/{environmentId}/allocation/query |
Opublikuj | Wynik alokacji zapytań |
/api/environment/{environmentId}/onhand/productsearch/indexquery |
Opublikuj | Opublikuj zapytanie indeksowe z wyszukiwarką produktów |
/api/environment/{environmentId}/onhand/productsearch/exactquery |
Opublikuj | Opublikuj dokładne zapytanie z wyszukiwarką produktów |
Uwaga
Część ścieżki {environmentId} jest identyfikatorem środowiska w usługach Microsoft Dynamics Lifecycle Services.
API zbiorcze może zwrócić maksymalnie 512 rekordów dla każdego żądania.
Uwierzytelnianie
Token zabezpieczeń platformy służy do wywołania publicznego interfejsu API Widoczność magazynu. Dlatego należy wygenerować token Microsoft Entra przy użyciu aplikacji Microsoft Entra. Następnie należy użyć tokenu Microsoft Entra, aby uzyskać token dostępu z usługi zabezpieczeń.
Procedura uzyskiwania tokenu usługi zabezpieczeń jest następująca.
Zaloguj się do portalu Azure i użyj go, aby znaleźć wartości
clientId
iclientSecret
dla swojej aplikacji Dynamics 365 Supply Chain Management.Pobierz token usługi Microsoft Entra (
aadToken
), przesyłając żądanie HTTP z następującymi właściwościami:URL:
https://login.microsoftonline.com/${aadTenantId}/oauth2/v2.0/token
Metoda:
GET
Treść (dane formularza):
Klucz Wartość client_id ${aadAppId} client_secret ${aadAppSecret} grant_type client_credentials zakres 0cdb527f-a8d1-4bf8-9436-b352c68682b2/.domyślne
Odpowiedź powinna zawierać token Microsoft Entra (
aadToken
). Powinna ona przypominać następujący przykład.{ "token_type": "Bearer", "expires_in": "3599", "ext_expires_in": "3599", "access_token": "eyJ0eX...8WQ" }
Sformułuj żądanie JavaScript Object Notation (JSON) przypominające następujący przykład.
{ "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" }
Należy uwzględnić następujące informacje:
- Wartość
client_assertion
musi być tokenem Microsoft Entra (aadToken
) otrzymanym w poprzednim kroku. - Wartość
context
musi być identyfikatorem środowiska Lifecycle Services, w którym ma zostać wdrożony dodatek. - Ustaw wszystkie inne wartości, tak jak pokazano w przykładzie.
- Wartość
Pobierz token usługi (
access_token
), przesyłając żądanie HTTP z następującymi właściwościami:-
URL:
https://securityservice.operations365.dynamics.com/token
-
Metoda:
POST
-
Nagłówek HTTP: zawiera wersję API. (Klucz to
Api-Version
, a wartość to1.0
.) - Treść: umożliwia dołączenie żądania JSON utworzonego w poprzednim kroku.
Odpowiedź powinna zawierać token dostępu (
access_token
). Musisz użyć tego tokenu do wywołania interfejsu API Widoczność magazynu. Oto przykład.{ "access_token": "{Returned_Token}", "token_type": "bearer", "expires_in": 3600 }
-
URL:
Banknot
Adres URL https://securityservice.operations365.dynamics.com/token
jest ogólnym adresem URL dla usługi zabezpieczeń. Gdy wywołasz adres URL, pierwsza odpowiedź to odpowiedź przekierowywania HTTP z kodem stanu 307
w nagłówkach odpowiedzi oraz wpisem z kluczem „Lokalizacja”, który zawiera docelowy adres URL dla usługi zabezpieczeń. Adres URL jest w następującym formacie: https://gw.{$geo}-il101.gateway.prod.island.powerapps.com/securityservice/token
. Na przykład, jeśli środowisko lokalizuje dane w lokalizacji geograficznej w Stanów Zjednoczonych, adres URL może mieć lokalizację https://gw.us-il101.gateway.prod.island.powerapps.com/securityservice/token
. Jeśli kod stanu odpowiedzi 307 jest dla Ciebie nie do przyjęcia, możesz ręcznie utworzyć rzeczywisty adres URL zgodnie z lokalizacją środowiska FinOps. Najprostszy sposób to otwarcie https://gw.as-il101.gateway.prod.island.powerapps.com/securityservice/token
za pomocą przeglądarki, a następnie skopiowanie adresu na pasku adresu.
Tworzenie zdarzeń zmiany dostępnych zapasów
Istnieją dwa interfejsy API do tworzenia zdarzeń zmiany dostępnych zapasów:
- Tworzenie jednego rekordu:
/api/environment/{environmentId}/onhand
- Tworzenie wielu rekordów:
/api/environment/{environmentId}/onhand/bulk
W poniższej tabeli podsumowano znaczenie poszczególnych pól w treści JSON.
Identyfikator pola | Opis |
---|---|
id |
Unikatowy identyfikator określonego zdarzenia zmiany. Jeśli komunikacja z usługą nie powiedzie się w trakcie księgowania, ten identyfikator służy do zapewnienia, że to samo zdarzenie nie zostanie zliczone dwukrotnie w systemie. |
organizationId |
Identyfikator organizacji połączonej ze zdarzeniem. Wartość jest mapowana na identyfikator organizacji lub obszaru danych w Supply Chain Management. |
productId |
Identyfikator produktu. |
quantities |
Ilość, o którą musi zostać zmieniona dostępna ilość. Jeśli na przykład na półce zostanie dołożonych 10 nowych książek, ta wartość będzie wynosić quantities:{ shelf:{ received: 10 }} . Jeśli trzy książki zostaną usunięte z półki lub sprzedane, ta wartość będzie wynosić quantities:{ shelf:{ sold: 3 }} . |
dimensionDataSource |
Źródło danych wymiarów używanych w zdarzeniu zmiany księgowania i zapytaniu. W przypadku określenia źródła danych można wykorzystać niestandardowe wymiary z określonego źródła danych. Dodatek Widoczność magazynu może używać konfiguracji wymiarów do mapowania niestandardowych wymiarów na ogólne wymiary domyślne. Jeśli nie określiło wartości dimensionDataSource , w zapytaniach można stosować tylko ogólne wymiary podstawowe. |
dimensions |
Dynamiczna para klucz-wartość. Te wartości są mapowane na niektóre wymiary w Supply Chain Management. Można jednak dodać również wymiary niestandardowe (na przykład Źródło), aby wskazać, czy zdarzenie pochodzi z Supply Chain Management, czy z systemu zewnętrznego. |
Uwaga
Jeśli reguła partycji danych jest ustawiona jako Według identyfikator produktu, siteId
i locationId
są wymiarami opcjonalnymi. W przeciwnym razie będą one wymagane. Ta reguła dotyczy także alokacji, rezerwacji wstępnych i zmieniania interfejsów API harmonogramu.
Poniższe podsekcji zawierają przykłady, które pokazują sposób używania tych interfejsów API.
Tworzenie jednego zdarzenia zmiany dostępnych zapasów
Ten interfejs API tworzy jedno zdarzenie zmiany dostępnych zapasów.
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,
},
},
}
W poniższym przykładzie pokazano zawartość przykładowej treści. W tym przykładzie firma ma system punktu sprzedaży (POS), który przetwarza transakcje w sklepie, a tym samym zmiany zapasów. Klient zwrócił do Twojego sklepu czerwoną koszulkę. Aby odzwierciedlić zmianę, publikujesz pojedyncze zdarzenie zmiany dla produktu T-shirt. To zdarzenie spowoduje zwiększenie ilości produktu T-shirt o 1.
{
"id": "Test201",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensionDataSource": "pos",
"dimensions": {
"siteId": "1",
"locationId": "11",
"posMachineId": "0001",
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 1
}
}
}
W poniższym przykładzie pokazano zawartość przykładowej treści bez dimensionDataSource
. W takim przypadku element dimensions
będzie wymiarami bazowymi. Jeśli dimensionDataSource
jest ustawiony, dimensions
mogą być wymiarami źródłowymi danych lub wymiarami bazowymi.
{
"id": "Test202",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensions": {
"siteId": "1",
"locationId": "11",
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 1
}
}
}
Tworzenie wielu zdarzeń zmiany
Ten interfejs API może tworzyć zdarzenia zmian, tak jak może to być interfejs API jednego zdarzenia. Jedyną różnicą jest to, że ten interfejs API może jednocześnie tworzyć wiele rekordów. W związku z tym wartości Path
i Body
są różne. W tym interfejsie API Body
dostarcza tablicę rekordów. Maksymalna dozwolona liczba rekordów wynosi 512. W związku z tym interfejs API masowych zmian dostępnych pod ręką może obsługiwać do 512 zdarzeń zmian jednocześnie.
Na przykład w aplikacji Retail Store POS są przetwarzane następujące dwie transakcje:
- Zamówienie zwrotu jednej czerwonej koszulki
- Jedna transakcja sprzedaży trzech czarnych koszulek
W takim przypadku możesz uwzględnić obie aktualizacje zapasów w jednym wywołaniu 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,
},
},
},
...
]
W poniższym przykładzie pokazano zawartość przykładowej treści.
[
{
"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 }
}
}
]
Ustawianie/zastępowanie dostępnych ilości
Interfejs Ustaw dostępną ilość umożliwia zastąpienie bieżących danych określonego produktu. Ta funkcja jest zazwyczaj używana do aktualizacji inwentaryzacji zapasów. Na przykład podczas codziennego inwentaryzacji sklep może stwierdzić, że rzeczywisty zapas czerwonej koszulki wynosi 100. W związku z tym ilość przychodząca w punkcie sprzedaży musi zostać zaktualizowana do 100, niezależnie od tego, jaka była poprzednia ilość. Ten interfejs API umożliwia zastąpienie istniejącej wartości.
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,
},
...
]
W poniższym przykładzie pokazano zawartość przykładowej treści. Zachowanie tego interfejsu API różni się od zachowania interfejsów API, które opisano w sekcji Tworzenie zdarzeń zmiany dostępnych zapasów we wcześniejszej części tego artykułu. W tym przykładzie ilość produktu T-shirt przybiera wartość 1.
[
{
"id": "Test204",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensionDataSource": "pos",
"dimensions": {
"SiteId": "1",
"LocationId": "11",
"posMachineId": "0001"
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 100
}
}
}
]
Tworzenie zdarzeń rezerwacji
Aby korzystać z interfejsu API rezerwacji, należy włączyć funkcję rezerwacji i dokończyć konfigurację rezerwacji. Aby uzyskać więcej informacji (w tym przepływ danych i przykładowy scenariusz), zobacz Rezerwacje Widoczności magazynu.
Tworzenie jednego zdarzenia rezerwacji
Rezerwacji można dokonać w różnych ustawieniach źródła danych. Aby skonfigurować ten typ rezerwacji, najpierw określ źródło danych w parametrze dimensionDataSource
. Następnie w parametrze dimensions
określ wymiary zgodnie z ustawieniami wymiarów w docelowym źródle danych.
Po wywołaniu interfejsu API rezerwacji można kontrolować walidacje rezerwacji, określając parametr logiczny ifCheckAvailForReserv
w treści żądania. Wartość True
oznacza, że walidacja jest wymagana, podczas gdy wartość False
oznacza, że walidacja nie jest wymagana. Wartością domyślną jest True
.
Aby wycofać rezerwację lub cofnąć rezerwację określonych ilości magazynowych, ustaw ilość na wartość ujemną i ustaw parametr ifCheckAvailForReserv
na False
, aby pominąć weryfikację. Istnieje również dedykowany interfejs API cofania rezerwacji do wykonania tej samej czynności. Różnica polega tylko na sposobu wywoływania tych dwóch interfejsów API. Wycofanie określonego zdarzenia rezerwacji przy użyciu reservationId
z interfejsem API wycofaj rezerwację jest łatwiejsze. Aby uzyskać więcej informacji, zobacz sekcję Wycofanie rezerwacji jednego zdarzenia rezerwacji.
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,
}
W poniższym przykładzie pokazano zawartość przykładowej treści.
{
"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"
}
}
W poniższym przykładzie pokazano odpowiedź pomyślną.
{
"reservationId": "RESERVATION_ID",
"id": "ohre~id-822-232959-524",
"processingStatus": "success",
"message": "",
"statusCode": 200
}
Tworzenie wielu zdarzeń rezerwacji
Ten interfejs API jest wersją masową interfejsu API jednego zdarzenia.
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,
},
...
]
Zdarzenie wycofania rezerwacji
Interfejs API Wycofaj rezerwację służy jako operacja dla zdarzeń Rezerwacja. Umożliwia wycofanie zdarzenia rezerwacji określone przez reservationId
lub zmniejszenie ilości rezerwacji.
Wycofanie jednego zdarzenia rezerwacji
Podczas tworzenia rezerwacji, identyfikator reservationId
zostanie uwzględniony w treści odpowiedzi. Musisz podać taki sam reservationId
, aby anulować rezerwację, i uwzględnić ten sam organizationId
, productId
i dimensions
użyte w wywołaniu interfejsu API rezerwacji. Na koniec należy określić wartość OffsetQty
reprezentującą liczbę towarów, które mają zostać zwolnione z poprzedniej rezerwacji. Rezerwację można w całości lub częściowo wycofać w zależności od podanej wartości OffsetQty
. Jeśli na przykład zarezerwowano 100 jednostek towaru, można określić OffsetQty: 10
, aby cofnąć rezerwację 10 z początkowo zarezerwowanej ilości.
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
}
Poniższy kod pokazuje przykład treści zawartości.
{
"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
}
Poniższy kod pokazuje przykład pomyślnej treści odpowiedzi.
{
"reservationId": "RESERVATION_ID",
"totalInvalidOffsetQtyByReservId": 0,
"id": "ohoe~id-823-11744-883",
"processingStatus": "success",
"message": "",
"statusCode": 200
}
Banknot
W treści odpowiedzi, jeśli OffsetQty
jest mniejsze lub równe ilości rezerwacji, stan processingStatus
będzie „powodzenie” i totalInvalidOffsetQtyByReservId
będzie 0.
Jeśli OffsetQty
jest większe niż zarezerwowana kwota, stan processingStatus
będzie „partialSuccess” i totalInvalidOffsetQtyByReservId
będzie różnicą między OffsetQty
a zarezerwowaną kwotą.
Na przykład, jeśli rezerwacja ma ilość 10 i OffsetQty
ma wartość 12, totalInvalidOffsetQtyByReservId
będzie 2.
Wycofanie wielu zdarzeń rezerwacji
Ten interfejs API jest wersją masową interfejsu API jednego zdarzenia.
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
}
...
]
Czyszczenie danych rezerwacji
Interfejs API wyczyść dane rezerwacji służy do czyszczenia historycznych danych rezerwacji. Treść powinna być listą źródeł danych. Jeśli lista jest pusta, wszystkie źródła danych zostaną wyczyszczone.
Path:
/api/environment/{environmentId}/onhand/reserve/resyncjob
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
[
"iv",
"pos"
]
Zapytanie o dostępne zapasy
Użyj interfejsu API zapytania o dostępne zapasy do pobierania bieżących danych o dostępnych zapasach produktów. Możesz użyć tego interfejsu API, gdy musisz znać stany magazynowe, na przykład, gdy chcesz przejrzeć stany magazynowe produktów w swojej witrynie e-commerce lub gdy chcesz sprawdzić dostępność produktów w różnych regionach lub w pobliskich sklepach i magazynach. Interfejs API aktualnie obsługuje wykonywanie zapytań o maksymalnie 5000 pojedynczych towarów według wartości productID
. W każdym zapytaniu można określić również kilka wartości siteID
i locationID
. Gdy reguła partycji danych jest ustawiona na wartość Według lokalizacji, maksymalny limit jest definiowany przez następujące równanie:
Wartość NumOf(SiteID) × NumOf(LocationID) <= 10 000.
Zapytanie przy użyciu metody POST
Kwerenda według interfejsu API wpisu jest dostępna w dwóch wersjach. W poniższej tabeli przedstawiono różnice.
Interfejs API w wersji 1.0 | Interfejs API w wersji 2.0 |
---|---|
Można utworzyć kwerendę tylko dla jednego identyfikatora organizacji. | Można utworzyć kwerendę dla wielu identyfikatorów organizacji. |
Można utworzyć kwerendę dla maksymalnie 10 000 kombinacji lokalizacji i magazynów. | Można utworzyć kwerendę na więcej niż 10 000 kombinacji identyfikatorów organizacji, lokalizacji i magazynów. Wyniki można zwracać na wielu stronach. |
W poniższych podsekcjach przedstawiono sposób używania każdej wersji interfejsu API.
Kwerenda według wpisu wersji 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,
}
W treści tego żądania dimensionDataSource
to opcjonalny parametr. Jeśli nie jest ustawiony, filters
będą traktowane jako wymiary bazowe.
Parametr returnNegative
określa, czy wyniki zawierają wartości ujemne.
Zapytanie danych przechowywanych według lokalizacji
Ta sekcja ma zastosowanie, gdy reguła partycji danych jest ustawiona na Według lokalizacji.
-
organizationId
powinna być tablicą zawierającą dokładnie jedną wartość. -
productId
może zawierać jedną lub więcej wartości. Jeśli jest to pusta tablica, system zwróci wszystkie produkty z określonych witryn i lokalizacji. W takim przypadkusiteId
ilocationId
nie powinny być puste. -
siteId
ilocationId
używane do partycjonowania. Można określić więcej niż jedną wartośćsiteId
ilocationId
w żądaniu kwerendy o dane na dane zamówienie. Jeśli obie tablice są puste, system zwróci wszystkie witryny i lokalizacje określonych produktów. W takim przypadkuproductId
nie powinno być puste.
Zalecamy używanie parametru groupByValues
w sposób zgodny z konfiguracją indeksu. Więcej informacji można znaleźć w temacie Konfiguracja indeksu dostępnych zapasów.
Dane zapytania przechowywane przez identyfikator produktu
Ta sekcja ma zastosowanie, gdy reguła partycji danych jest ustawiona na Według identyfikator produktu. W takim przypadku wymagane są dwa pola filters
: organizationId
, productId
.
-
organizationId
powinna być tablicą zawierającą dokładnie jedną wartość. -
productId
powinna być tablicą zawierającą przynajmniej jedną wartość.
W przeciwieństwie do przechowywania danych według lokalizacji, jeśli nie zostaną określone wartości dla siteId
i locationId
, informacje o zapasach dla każdego identyfikatora produktu będą agregowane we wszystkich lokalizacjach i/lub lokalizacjach.
Uwaga
Jeśli włączono harmonogram dostępnych zmian i dostępne funkcje (ATP), zapytanie może również zawierać parametr logiczny QueryATP
, który kontroluje, czy wyniki zapytania zawierają informacje ATP. Aby uzyskać więcej informacji i przykładów, zobacz Widoczność zapasów — harmonogramy i zmiany dostępnych zapasów oraz dostępność zapasów.
W poniższym przykładzie pokazano zawartość przykładowej treści. Pokazuje, że można kwerendy dotyczące dostępnych zapasów z wielu lokalizacji (magazynów).
{
"dimensionDataSource": "pos",
"filters": {
"organizationId": ["usmf"],
"productId": ["T-shirt"],
"siteId": ["1"],
"locationId": ["11","12","13"],
"colorId": ["red"]
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
Poniższe przykłady pokazują sposób wykonywania zapytań dla wszystkich produktów w określonej witrynie i w określonej lokalizacji.
{
"filters": {
"organizationId": ["usmf"],
"productId": [],
"siteId": ["1"],
"locationId": ["11"],
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
Kwerenda według wpisu interfejsu API w wersji 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
Format żądania dla wersji API 2.0 jest podobny do formatu wersji 1.0, ale obsługuje również dwa opcjonalne parametry: pageNumber
pageSize
i które pozwalają systemowi podzielić jeden duży wynik na kilka mniejszych dokumentów. Wyniki są sortowane według magazynów (locationId
), a parametry służą do dzielenia wyników na strony:
-
pageSize
Ustala liczbę magazynów (locationId
wartości) zwracanych na każdej stronie. -
pageNumber
Ustala numer strony, która jest zwrócona.
Żądanie tego formatu zwraca dane dotyczące dostępnych zapasów , począwszy od numeru magazynu ({pageNumber} − 1) × {pageSize} i zawiera dane dla następnych {pageSize} magazynów.
Interfejs API w wersji 2.0 odpowiada na dokument, który korzysta z następującej struktury:
{
Value: { # Response same as Api-Version=1.0 }
nextLink: onhand/indexquery?pageNumber={pageNumber+1}&pageSize={pageSize}
}
Gdy żądanie osiągnie ostatni magazyn (locationId
), wartość nextLink
jest pustym ciągiem.
Ponadto w wersji API 2.0 można określić więcej niż jeden identyfikator organizacji w żądaniu. W tym celu należy w filtrze organizationId
dokumentu żądania uwzględnić listę identyfikatorów organizacji rozdzielanych przecinkami. Na przykład "organizationId": ["org1", "org2", "org3"]
.
Zapytanie przy użyciu metody GET
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]
Oto przykładowy adres URL GET. To żądanie GET jest dokładnie takie samo, jak przykładowe księgowanie przedstawione wcześniej.
/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
System nie obsługuje wykonywania zapytań magazynowych w wielu identyfikatorach organizacji za pomocą metody GET.
Dokładne zapytanie pod ręką
Dostępne dokładne zapytania przypominają zwykłe dostępne zapytania, ale umożliwiają określenie hierarchii mapowania między witryną a lokalizacją. Na przykład masz następujące dwie witryny:
- Lokalizacja 1, która jest mapowana na lokalizację A
- Lokalizacja 2, która jest mapowana na lokalizację B
W przypadku zwykłego dostępnego zapytania, jeśli podasz "siteId": ["1","2"]
i "locationId": ["A","B"]
, funkcja Widoczność zasobów automatycznie wyśle zapytanie wynik dla następujących witryn i lokalizacji:
- Ośrodek 1, lokalizacja A
- Ośrodek 1, lokalizacja B
- Ośrodek 2, lokalizacja A
- Ośrodek 2, lokalizacja B
Jak widać, zwykłe dostępne zapytanie nie rozpoznaje, że lokalizacja A istnieje tylko w witrynie 1, a lokalizacja B istnieje tylko w witrynie 2. W związku z tym tworzy nadmiarowe kwerendy. Aby uwzględnić to mapowanie hierarchiczne, można użyć dostępnego dokładnego zapytania i określić mapowania lokalizacji w treści zapytania. W takim przypadku zostaną kwerendy i wyniki zostaną uzyskane tylko dla lokacji 1, lokalizacji A i lokalizacji 2, lokalizacji B.
Kwerenda dokładnych informacji o podpłacie na czas przy użyciu metody księgowania
Dokładne zapytanie o dostępne dane według wpisu interfejsu API jest dostępne w dwóch wersjach. W poniższej tabeli przedstawiono różnice.
Interfejs API w wersji 1.0 | Interfejs API w wersji 2.0 |
---|---|
Można utworzyć kwerendę tylko dla jednego identyfikatora organizacji. | Można utworzyć kwerendę dla wielu identyfikatorów organizacji. |
Dokładne zapytanie o dane o dostępnach umożliwia księguj interfejs API w wersji 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,
}
W treści tego żądania dimensionDataSource
to opcjonalny parametr. Jeśli nie jest ustawiony, dimensions
w filters
będą traktowane jako wymiary bazowe. Istnieją cztery wymagane pola dla elementu filters
: organizationId
, productId
, dimensions
i values
.
-
Element
organizationId
powinien zawierać tylko jedną wartość, ale nadal jest tablicą. -
Element
productId
może zawierać jedną lub więcej wartości. Jeśli jest to pusta tablica, zostaną zwrócone wszystkie produkty. - W tablicy
dimensions
są wymaganesiteId
ilocationId
, tylko i wyłącznie, jeśli reguła partycji danych jest ustawiona na Według lokalizacji. W takim przypadku mogą pojawiać się razem z innymi elementami w dowolnej kolejności. -
values
może zawierać co najmniej jeden odrębnych tu należy do wartości odpowiadającychdimensions
.
dimensions
w filters
będą automatycznie dodane do groupByValues
.
Parametr returnNegative
określa, czy wyniki zawierają wartości ujemne.
W poniższym przykładzie pokazano zawartość przykładowej treści.
{
"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
}
Poniższe przykłady pokazują sposób wykonywania zapytań dla wszystkich produktów w wielu witrynach i lokalizacjach.
{
"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
}
Dokładne zapytanie o dane o podaną wydajność według wpisu interfejsu API w wersji 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,
}
Wersja interfejsu API 2.0 różni się od wersji 1.0 pod następującymi sposobami:
- W
filters
tej sekcji polekeys
jest teraz dostępne, a niedimensions
pole. Tokeys
pole działa podobnie do poladimensions
w wersji 1.0, ale może teraz również dołączyćorganizationId
. Klucze można określać w dowolnej kolejności. - Ta
filters
sekcja nie obsługuje jużorganizationId
tego pola. Zamiast tego można uwzględnić wśródorganizationId
keys
wymiarów w polu (keys: ["organizationId", "siteId", "locationId"]
na przykład)values
i zdefiniować wartości identyfikatorów organizacji na zgodnym stanowisku w polu (na przykładvalues: ["SCM_IV", "iv_contoso_site_1", "iv_contoso_location_1"]
).
Inne pola są identyczne z interfejsem API w wersji 1.0.
Zapytanie w wyszukiwarce produktów
Następujące interfejsy API zapytań o dostępne zapasy zostały ulepszone w celu obsługi wyszukiwania produktów:
Banknot
Kiedy publikujesz zapytanie dotyczące widoczności zapasów, które korzysta z wyszukiwania produktów, użyj parametru żądania productSearch
(z obiektem ProductAttributeQuery
w środku), aby znaleźć lub filtrować według identyfikatora produktu. Nowsze interfejsy API nie obsługują już starszego parametru żądania productid
w treści żądania.
Wymagania wstępne
Aby rozpocząć korzystanie interfejsów API wyszukiwania produktów, Twój system musi spełniać następujące wymagania:
- Musisz mieć uruchomioną aplikację Dynamics 365 Supply Chain Management w wersji 10.0.36 lub nowszej.
- Należy zainstalować i skonfigurować dodatek Widoczność magazynu w wersji 1.2.2.54 lub nowszej w sposób opisany w temacie Instalowanie i ustawianie dodatku Widoczność magazynu.
- Należy zainstalować i skonfigurować usługę wyszukiwania Widoczność magazynu w sposób opisany w temacie Konfigurowanie wyszukiwania produktów dla widoczności magazynu.
Umowa dotycząca wyszukiwania produktów
Umowa dotycząca wyszukiwania produktów określa zasady komunikacji z interfejsami API wyszukiwania produktów. Zapewnia ustandaryzowany sposób opisu możliwości i zachowania funkcji wyszukiwania produktów. Dzięki temu użytkownicy mogą łatwiej zrozumieć, wchodzić w interakcję i tworzyć aplikacje korzystające z interfejsów API widoczności magazynu.
W poniższym przykładzie pokazano przykładową umowę.
{
"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"
}
]
}
]
},
}
W poniższej tabeli przedstawiono pola używane w umowie.
Identyfikator pola | Opis |
---|---|
logicalOperator |
Możliwe wartości to And i Or . Użyj tego pola, aby połączyć wiele warunków lub warunków i filtrów podrzędnych. Zauważ, że subFilters to właściwie obiekt productFilter lub attributeFilter . Dlatego możesz mieć subFilters wewnątrz subFilters . |
conditionOperator |
Możliwe wartości to IsExactly , IsNot , Contains , DoesNotContain , BeginsWith , IsOneOf , GreaterEqual , LessEqual i Between . |
ProductFilter |
Użyj tego pola, aby filtrować produkty według informacji o produkcie. Możesz na przykład zmienić productName w umowie na Company , itemNumber , productSearchName , productType , productName , productDescription , inventoryUnitSymbol , salesUnitSymbol lub purchaseUnitSymbol , aby dopasować się do potrzeb biznesowych. |
AttributeFilter |
Użyj tego pola, aby filtrować produkty według informacji o atrybucie. |
attributeArea |
Możliwe wartości to ProductAttribute , DimensionAttribute i BatchAttribute . |
Zapytanie w wyszukiwarce produktów
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,
}
W poniższym przykładzie pokazano zawartość przykładowej treści.
{
"productSearch": {
"productFilter": {
"conditions": [
{
"conditionOperator": "contains",
"productName": [
"speaker cable"
],
},
],
},
},
"returnNegative": true,
"filters":
{
"organizationId": ["usmf"],
"siteId": ["1"],
"locationId": ["13"],
},
"groupByValues": ["colorid"],
}
W poniższym przykładzie pokazano odpowiedź pomyślną.
[
{
"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
}
}
}
]
Dokładne zapytanie w wyszukiwarce produktów
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,
}
W poniższym przykładzie pokazano zawartość przykładowej treści.
{
"productSearch": {
"productFilter": {
"conditions": [
{
"conditionOperator": "contains",
"productName": [
"speaker cable"
],
},
],
},
},
"filters": {
"organizationId": ["usmf"],
"dimensions": ["siteId", "locationId", "colorid"],
"values" : [
["1", "13", "Black"],
]
},
"groupByValues": [],
"returnNegative": true
}
W poniższym przykładzie pokazano odpowiedź pomyślną.
[
{
"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
}
}
}
]
Dostępność zapasów
Widoczność zapasów można skonfigurować, aby było można zaplanować przyszłe zmiany dostępnych zapasów i obliczyć ilości ATP. ATP to ilość towaru, która jest dostępna i którą można obiecać klientowi w następnym okresie. Użycie kalkulacji ATP może znacznie zwiększyć twoje możliwości realizacji zamówień. Aby uzyskać informacje o tym, jak włączyć tę funkcję i jak wchodzić w interakcję z widocznością zapasów za pośrednictwem interfejsu API po włączeniu tej funkcji, zobacz Harmonogramy zmian widoczności zapasów na bieżąco i dostępne do obiecania.
Alokacja
Interfejsy API związane z alokacją znajdują się w Przydział widoczności zapasów.