Veřejná rozhraní API Viditelnost zásob
Poznámka
Azure Active Directory je nyní Microsoft Entra ID. Další informace
Tento článek popisuje veřejná API, která jsou poskytována doplňkem Viditelnost zásob.
Veřejné rozhraní REST API doplňku Viditelnost zásob představuje několik konkrétních koncových bodů pro integraci. Podporuje čtyři hlavní typy interakce:
- Odesílání změn zásob na skladě do doplňku z externího systému
- Nastavení nebo přepsání množství zásob na skladě v doplňku z externího systému
- Odesílání událostí rezervace do doplňku z externího systému
- Dotazování na aktuální množství zásob na skladě z externího systému
V následující tabulce jsou uvedeny rozhraní API, které jsou aktuálně k dispozici:
Cesta | Metoda | Popis |
---|---|---|
/api/environment/{environmentId}/onhand |
Zveřejnit | Vytvoří jednu událost změny ve skladu |
/api/environment/{environmentId}/onhand/bulk |
Zveřejnit | Vytvoří více změnových událostí |
/api/environment/{environmentId}/setonhand/{inventorySystem}/bulk |
Zveřejnit | Nastaví/přepíše množství na skladě |
/api/environment/{environmentId}/onhand/reserve |
Zveřejnit | Vytvoření jedné události předběžné rezervace |
/api/environment/{environmentId}/onhand/reserve/bulk |
Zveřejnit | Vytvoří více událostí předběžné rezervace |
/api/environment/{environmentId}/onhand/unreserve |
Zveřejnit | Vrátí jednu událost předběžné rezervace |
/api/environment/{environmentId}/onhand/unreserve/bulk |
Zveřejnit | Vrátí více událostí předběžné rezervace |
/api/environment/{environmentId}/onhand/reserve/resyncjob |
Zveřejnit | Čištění dat rezervace |
/api/environment/{environmentId}/onhand/changeschedule |
Zveřejnit | Vytvoří jednu plánovanou změnu ve skladu |
/api/environment/{environmentId}/onhand/changeschedule/bulk |
Zveřejnit | Vytvoří více změn ve skladu s daty |
/api/environment/{environmentId}/onhand/indexquery |
Zveřejnit | Dotaz pomocí metody POST (doporučeno) |
/api/environment/{environmentId}/onhand |
Získat | Dotaz pomocí metody GET |
/api/environment/{environmentId}/onhand/exactquery |
Zveřejnit | Přesný dotaz pomocí metody POST |
/api/environment/{environmentId}/allocation/allocate |
Zveřejnit | Vytvoří jednu událost přidělení |
/api/environment/{environmentId}/allocation/unallocate |
Zveřejnit | Vytvoří jednu událost zrušení přidělení |
/api/environment/{environmentId}/allocation/reallocate |
Zveřejnit | Vytvoří jednu událost změny přidělení |
/api/environment/{environmentId}/allocation/consume |
Zveřejnit | Vytvoří jednu událost spotřeby |
/api/environment/{environmentId}/allocation/query |
Zveřejnit | Dotaz na výsledek přidělení |
/api/environment/{environmentId}/onhand/productsearch/indexquery |
Zveřejnit | Odeslat indexový dotaz s vyhledáváním produktů |
/api/environment/{environmentId}/onhand/productsearch/exactquery |
Zveřejnit | Odeslat přesný dotaz s vyhledáváním produktů |
Poznámka
Součástí cesty {environmentId} je ID prostředí v Microsoft Dynamics Lifecycle Services.
Hromadné API může vrátit maximálně 512 záznamů pro každý požadavek.
Ověřování
Token zabezpečení platformy se používá k volání veřejného API Viditelnosti zásob. Proto musíte token Microsoft Entra vygenerovat pomocí vaší aplikace Microsoft Entra. Poté musíte token Microsoft Entra použít k získání přístupového tokenu od služby zabezpečení.
Chcete-li získat token služby zabezpečení, postupujte takto:
Přihlaste se na portál Azure a použijte jej k vyhledání hodnot
clientId
aclientSecret
pro vaši aplikaci Dynamics 365 Supply Chain Management.Načtěte token Microsoft Entra (
aadToken
) odesláním požadavku HTTP s následujícími vlastnostmi:Adresa URL:
https://login.microsoftonline.com/${aadTenantId}/oauth2/v2.0/token
Metoda:
GET
Obsah těla (údaje formuláře):
Klíč Hodnota id klienta ${aadAppId} tajný klíč klienta ${aadAppSecret} typ grantu client_credentials rozsah 0cdb527f-a8d1-4bf8-9436-b352c68682b2/.default
V odpovědi byste měli obdržet token Microsoft Entra (
aadToken
). Výsledek by měl vypadat podobně jako v následujícím příkladu.{ "token_type": "Bearer", "expires_in": "3599", "ext_expires_in": "3599", "access_token": "eyJ0eX...8WQ" }
Formulujte požadavek JSON (JavaScript Object Notation), který se podobá následujícímu příkladu.
{ "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" }
Mějte na paměti následující body:
- Hodnotou
client_assertion
musí být token Microsoft Entra (aadToken
), který jste obdrželi v předchozím kroku. - Hodnota
context
musí být ID prostředí Lifecycle Services, do kterého chcete doplněk nasadit. - Nastavte všechny ostatní hodnoty, jak je znázorněno v příkladu.
- Hodnotou
Načtěte přístupový token (
access_token
) odesláním požadavku HTTP s následujícími vlastnostmi:-
Adresa URL:
https://securityservice.operations365.dynamics.com/token
-
Metoda:
POST
-
Záhlaví HTTP: Včetně verze API. (Klíč je
Api-Version
a hodnota je1.0
.) - Obsah těla: Zahrňte požadavek JSON, který jste vytvořili v předchozím kroku.
V odpovědi byste měli obdržet přístupový token (
access_token
). Tento token musíte použít jako nosný token pro volání rozhraní API doplňku Viditelnost zásob. Následuje příklad.{ "access_token": "{Returned_Token}", "token_type": "bearer", "expires_in": 3600 }
-
Adresa URL:
Poznámka
Adresa URL https://securityservice.operations365.dynamics.com/token
je obecná adresa URL pro bezpečnostní službu. Když zavoláte adresu URL, první odpovědí je odpověď přesměrování http se stavovým kódem 307
v hlavičkách odpovědi a záznam s klíčem „Umístění“, který obsahuje cílovou adresu URL pro službu zabezpečení. Adresa URL je v tomto formátu: https://gw.{$geo}-il101.gateway.prod.island.powerapps.com/securityservice/token
. Pokud se například vaše prostředí nachází v geografické oblasti USA, adresa URL může být https://gw.us-il101.gateway.prod.island.powerapps.com/securityservice/token
. Pokud pro vás stavový kód odpovědi 307 není přijatelný, můžete ručně vytvořit skutečnou adresu URL podle umístění vašeho prostředí FinOps. Nejjednodušší způsob je otevřít https://gw.as-il101.gateway.prod.island.powerapps.com/securityservice/token
v prohlížeči a poté zkopírovat adresu do adresního řádku.
Vytvoření událostí změn ve skladu
Existují dvě rozhraní API pro vytváření událostí skladových změn:
- Vytvoření jednoho záznamu:
/api/environment/{environmentId}/onhand
- Vytvoření více záznamů:
/api/environment/{environmentId}/onhand/bulk
Následující tabulka sumarizuje význam každého pole v těle JSON.
ID pole | Popis |
---|---|
id |
Jedinečné ID pro konkrétní událost změny. Pokud se opakované odeslání provádí kvůli selhání služby, toto ID se používá k zajištění toho, že stejná událost nebude v systému započítána dvakrát. |
organizationId |
Identifikátor organizace spojené s událostí. Tato hodnota se mapuje na organizaci nebo ID datové oblasti v Supply Chain Management. |
productId |
Identifikátor produktu. |
quantities |
Množství, o které se musí změnit skladové množství. Pokud je například do police přidáno 10 nových knih, bude tato hodnota quantities:{ shelf:{ received: 10 }} . Pokud budou tři knihy odstraněny z police nebo prodány, bude tato hodnota quantities:{ shelf:{ sold: 3 }} . |
dimensionDataSource |
Zdroj dat dimenzí použitých v události změny publikování změny a dotazu. Pokud zadáte zdroj dat, můžete použít vlastní dimenze ze zadaného zdroje dat. Viditelnost zásob může konfiguraci dimenze použít k mapování vlastních dimenzí na obecné výchozí dimenze. Pokud není zadána hodnota dimensionDataSource , můžete ve svých dotazech použít pouze obecné základní dimenze. |
dimensions |
Dynamický pár klíč/hodnota. Hodnoty jsou namapovány na některé dimenze v Supply Chain Management. Můžete však také přidat vlastní dimenze (např .Zdroj) k označení, zda událost pochází ze Supply Chain Management nebo z externího systému. |
Poznámka
Pokud je vaše pravidlo datového oddílu nastaveno na Podle ID produktu, siteId
a locationId
jsou volitelné dimenze. Jinak jsou to povinné dimenze. Toto pravidlo platí také pro rozhraní API pro alokaci, předběžnou rezervaci a plán změn.
Následující podčásti poskytují příklady, které ukazují, jak tato rozhraní API používat.
Vytvoří jednu událost změny ve skladu
Toto API vytvoří jednu událost změny ve skladu.
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,
},
},
}
Následující příklad ukazuje ukázkový obsah těla. V tomto příkladu má společnost systém POS (pokladní místo), který zpracovává transakce v obchodě, a tedy změny zásob. Zákazník vrátil do vašeho obchodu červené tričko. Pro tuto změnu zaúčtujete jednu událost změny pro produkt Tričko. Tato událost zvýší množství 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
}
}
}
Následující příklad ukazuje ukázkový obsah těla bez dimensionDataSource
. V tomto případě bude dimensions
základní dimenze. Pokud je nastavena hodnota dimensionDataSource
, dimensions
může být buď dimenze zdroje dat, nebo základní dimenze.
{
"id": "Test202",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensions": {
"siteId": "1",
"locationId": "11",
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 1
}
}
}
Vytvoří více změnových událostí
Toto rozhraní API může vytvářet události změn, stejně jako rozhraní API pro jednu událost. Jediný rozdíl je, že toto rozhraní API může vytvářet více záznamů současně. Proto se hodnoty Path
a Body
liší. U tohoto API obsahuje Body
pole záznamů. Maximální počet záznamů je 512. Rozhraní API pro hromadné změny množství na skladě proto může podporovat až 512 událostí změn najednou.
Například POS v maloobchodě zpracoval následující dvě transakce:
- Jedna vratka jednoho červeného trička
- Jedna prodejní transakce tří černých triček
V tomto případě můžete zahrnout obě aktualizace zásob do jednoho volání 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,
},
},
},
...
]
Následující příklad ukazuje ukázkový obsah těla.
[
{
"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 }
}
}
]
Nastavení/přepis množství na skladě
API Set on-hand přepíše aktuální data pro zadaný produkt. Tato funkce se obvykle používá k aktualizaci počítání zásob. Například během denního počítání zásob může obchod zjistit, že skutečné zásoby červených triček na skladě jsou 100. Proto musí být příchozí množství POS aktualizováno na 100 bez ohledu na to, jaké bylo předchozí množství. Toto rozhraní API můžete použít k přepsání stávající hodnoty.
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,
},
...
]
Následující příklad ukazuje ukázkový obsah těla. Chování tohoto rozhraní API se liší od chování těch API, která jsou popsána v části Vytvoření událostí změn ve skladu dříve v tomto článku. V této ukázce bude množství produktu T-shirt nastaveno na 1.
[
{
"id": "Test204",
"organizationId": "usmf",
"productId": "T-shirt",
"dimensionDataSource": "pos",
"dimensions": {
"SiteId": "1",
"LocationId": "11",
"posMachineId": "0001"
"colorId": "red"
},
"quantities": {
"pos": {
"inbound": 100
}
}
}
]
Vytvoření rezervačních událostí
Chcete-li použít API Reserve, musíte zapnout funkci rezervace a dokončit konfiguraci rezervace. Další informace (včetně datového toku a ukázkového scénáře) viz Rezervace viditelnosti zásob.
Vytvoření jedné rezervační události
Je možné provést rezervaci proti různým nastavením zdroje dat. Chcete -li konfigurovat tento typ rezervace, nejprve zadejte zdroj dat v parametru dimensionDataSource
. Poté v parametru dimensions
zadejte kóty podle nastavení dimenzí v cílovém zdroji dat.
Když zavoláte rezervační rozhraní API, můžete řídit ověření rezervace zadáním logické hodnoty parametru ifCheckAvailForReserv
v těle požadavku. Hodnota True
znamená, že je vyžadováno ověření, zatímco hodnota False
znamená, že ověření není vyžadováno. Výchozí hodnota je typu True
.
Pokud chcete vrátit rezervaci nebo zrušit rezervaci zadaného množství zásob, nastavte množství na zápornou hodnotu a nastavte parametr ifCheckAvailForReserv
na False
pro přeskočení ověření. K dispozici je také vyhrazené nerezervované API, které dělá totéž. Rozdíl je pouze ve způsobu volání těchto dvou API. Je snazší zvrátit konkrétní událost rezervace pomocí reservationId
s API unreserve. Další informace naleznete v části Zrušit jednu událost rezervace.
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,
}
Následující příklad ukazuje ukázkový obsah těla.
{
"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"
}
}
Následující příklad ukazuje úspěšnou odpověď.
{
"reservationId": "RESERVATION_ID",
"id": "ohre~id-822-232959-524",
"processingStatus": "success",
"message": "",
"statusCode": 200
}
Vytvoření více rezervačních událostí
Toto API je hromadná verze API pro jednu událost.
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,
},
...
]
Vrácení událostí rezervace
Rozhraní API Unreserve slouží jako operace vrácení pro události Rezervace. Poskytuje způsob, jak vrátit událost rezervace specifikovanou pomocí reservationId
nebo snížení rezervovaného množství.
Vrátí jednu rezervační událost
Když je vytvořena rezervace, reservationId
budou zahrnuty v těle odpovědi. Musíte poskytnout stejné reservationId
ke zrušení rezervaci a zahrnout stejné organizationId
, productId
a dimensions
použité se pro volání rozhraní API rezervace. Nakonec zadejte hodnotu OffsetQty
, která představuje počet položek, které mají být uvolněny z předchozí rezervace. Rezervace může být buď zcela, nebo částečně stornována v závislosti na specifikaci OffsetQty
. Například pokud bylo rezervováno 100 jednotek položek, můžete určit OffsetQty: 10
ke zrušení rezervace 10 z původní rezervované částky.
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
}
Následující kód ukazuje příklad obsahu těla.
{
"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
}
Následující kód ukazuje příklad těla úspěšné odpovědi.
{
"reservationId": "RESERVATION_ID",
"totalInvalidOffsetQtyByReservId": 0,
"id": "ohoe~id-823-11744-883",
"processingStatus": "success",
"message": "",
"statusCode": 200
}
Poznámka
V těle odpovědi, kdy OffsetQty
je menší nebo rovno rezervovanému množství, processingStatus
bude „success“ a totalInvalidOffsetQtyByReservId
bude 0.
Pokud je OffsetQty
větší než rezervovaná částka, processingStatus
bude „partialSuccess“ a totalInvalidOffsetQtyByReservId
bude rozdíl mezi OffsetQty
a rezervovaným množstvím.
Například, pokud má rezervace množství 10 a OffsetQty
má hodnotu 12, totalInvalidOffsetQtyByReservId
by bylo 2.
Vrátí více rezervačních událostí
Toto API je hromadná verze API pro jednu událost.
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
}
...
]
Čištění dat rezervace
Rozhraní API vyčištění dat rezervace se používá k vyčištění historických dat rezervací. Tělo má být seznam zdrojů dat. Pokud je seznam prázdný, všechny zdroje dat budou vyčištěny.
Path:
/api/environment/{environmentId}/onhand/reserve/resyncjob
Method:
Post
Headers:
Api-Version="1.0"
Authorization="Bearer $access_token"
ContentType:
application/json
Body:
[
"iv",
"pos"
]
Dotaz na zásoby na skladě
Rozhraní API Query on-hand (dotaz na zásoby na skladě) se používá k načítání aktuálních skladových dat vašich produktů. Toto rozhraní API můžete použít, kdykoli potřebujete znát skladové zásoby, například když chcete zkontrolovat stav zásob produktů na webu elektronického obchodu nebo když chcete zkontrolovat dostupnost produktu v různých regionech nebo v okolních obchodech a skladech. Toto rozhraní API aktuálně podporuje dotazování až 5000 jednotlivých položek podle hodnoty productID
. V každém dotazu také může být zadáno více hodnot siteID
a locationID
. Když je vaše pravidlo datového oddílu nastaveno na Podle umístění, maximální limit je definován následující rovnicí:
NumOf(SiteID) × NumOf(LocationID) <= 10 000.
Dotaz pomocí metody POST
Dotaz prostřednictvím rozhraní API je k dispozici ve dvou verzích. V následující tabulce jsou uvedeny rozdíly.
API verze 1.0 | API verze 2.0 |
---|---|
Lze dotazovat pouze jedno ID organizace. | Může se dotazovat na více ID organizací. |
Dokáže dotazovat až 10 000 kombinací lokalit a skladů. | Dokáže dotazovat více než 10 000 kombinací ID organizací, webů a skladů. Může vrátit výsledky na více stránkách. |
Následující podsekce ukazují, jak používat jednotlivé verze API.
Dotaz poštou verze 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,
}
V těle této žádosti, dimensionDataSource
je volitelný parametr. Pokud není nastaven, s parametrem filters
bude zacházeno jako se základními dimenzemi.
Parametr returnNegative
určuje, zda výsledky obsahují záporné položky.
Dotaz na data uložená podle umístění
Tato část platí, když je vaše pravidlo datového oddílu nastaveno na Podle umístění.
-
organizationId
musí být pole obsahující právě jednu hodnotu. -
productId
může obsahovat jednu nebo více hodnot. Pokud je pole prázdné, systém vrátí všechny produkty zadaných lokalit a míst. V takovém případěsiteId
alocationId
nesmí být prázdné. -
siteId
alocationId
se používají k rozdělení. V požadavku Dotaz na zásoby na skladě můžete zadat více než jednu hodnotusiteId
alocationId
. Pokud jsou obě pole prázdná, systém vrátí všechny lokality a místa zadaných produktů. V takovém případěproductId
nesmí být prázdné.
Doporučujeme použít parametr groupByValues
způsobem, který je konzistentní s vaší konfigurací indexu. Další informace najdete v tématu Konfigurace indexu zásob na skladě.
Dotazování na uložená data podle ID produktu
Tato část platí, když je vaše pravidlo datového oddílu nastaveno na Podle ID produktu. V tomto případě jsou vyžadována dvě pole filters
: organizationId
, productId
.
-
organizationId
musí být pole obsahující právě jednu hodnotu. -
productId
musí být pole obsahující alespoň jednu hodnotu.
Na rozdíl od ukládání dat podle umístění, pokud nezadáte hodnoty pro siteId
a locationId
, budou informace o skladových zásobách pro každé ID produktu agregovány na všech lokalitách nebo místech.
Poznámka
Pokud jste povolili časový plán změn ve skladu a funkce Lze slíbit, váš dotaz může také zahrnovat logický parametr QueryATP
, který řídí, zda výsledky dotazu obsahují informace funkce Lze slíbit. Další informace a příklady najdete v tématu Plány změn ve skladu Viditelnosti zásob a funkce Lze slíbit.
Následující příklad ukazuje ukázkový obsah těla. Ukazuje, že můžete dotazovat na zásoby na skladě z více míst (skladů).
{
"dimensionDataSource": "pos",
"filters": {
"organizationId": ["usmf"],
"productId": ["T-shirt"],
"siteId": ["1"],
"locationId": ["11","12","13"],
"colorId": ["red"]
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
Následující příklad ukazuje, jak dotazovat všechny produkty na konkrétním pracovišti a umístění.
{
"filters": {
"organizationId": ["usmf"],
"productId": [],
"siteId": ["1"],
"locationId": ["11"],
},
"groupByValues": ["colorId", "sizeId"],
"returnNegative": true
}
Dotaz postem API verze 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
Formát požadavku pro API verze 2.0 je podobný jako u verze 1.0, ale podporuje také dva volitelné parametry: pageNumber
a pageSize
, které umožňují systému rozdělit jeden velký výsledek na několik menší dokumenty. Výsledky jsou seřazeny podle skladu (locationId
) a k rozdělení výsledků na stránky se používají parametry následovně:
-
pageSize
určuje počet skladů (hodnotylocationId
), které jsou vráceny na každé stránce. -
pageNumber
určuje číslo stránky, které je vráceno.
Požadavek v tomto formátu vrátí data o skladu počínaje číslem skladu ({pageNumber} − 1) × {pageSize} a zahrnuje data pro další {pageSize} sklady.
API verze 2.0 odpoví dokumentem, který používá následující strukturu:
{
Value: { # Response same as Api-Version=1.0 }
nextLink: onhand/indexquery?pageNumber={pageNumber+1}&pageSize={pageSize}
}
Když požadavek dorazí do posledního skladu (locationId
), je hodnota nextLink
prázdný řetězec.
API verze 2.0 vám také umožňuje zadat více než jedno ID organizace v požadavku. Chcete-li tak učinit, zahrňte seznam ID organizací oddělených čárkami do organizationId
filtru dokumentu požadavku. Například "organizationId": ["org1", "org2", "org3"]
.
Dotaz pomocí 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]
Zde je ukázka adresy URL. Tento GET požadavek je přesně stejný jako ukázka POST, která byla uvedena dříve.
/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
Systém nepodporuje dotazování inventáře přes více ID organizací pomocí metody GET.
Přesný dotaz na zásoby na skladě
Přesné dotazy na zásoby na skladě se podobají běžným dotazům na zásoby na skladě, ale umožňují vám určit hierarchii mapování mezi webem a umístěním. Například máte následující dvě lokality:
- Lokalita 1, která je mapována na umístění A
- Lokalita 2, která je mapována na umístění B
Pro běžný dotaz na zásoby na skladě, pokud zadáte "siteId": ["1","2"]
a "locationId": ["A","B"]
, Viditelnost inventáře se automaticky dotáže na výsledek pro následující lokality a umístění:
- Lokalita 1, umístění A
- Lokalita 1, umístění B
- Lokalita 2, umístění A
- Lokalita 2, umístění B
Jak vidíte, běžný dotaz na zásoby na skladě nerozpozná, že umístění A existuje pouze na lokalitě 1 a umístění B existuje pouze na lokalitě 2. Proto vytváří nadbytečné dotazy. Chcete-li se přizpůsobit tomuto hierarchickému mapování, můžete použít přesný dotaz a určit mapování umístění v těle dotazu. V tomto případě zadáte dotaz a obdržíte výsledky pouze pro web 1, umístění A a web 2, umístění B.
Přesný dotaz na ruku pomocí metody post
Přesný dotaz prostřednictvím post API je dostupný ve dvou verzích. V následující tabulce jsou uvedeny rozdíly.
API verze 1.0 | API verze 2.0 |
---|---|
Lze dotazovat pouze jedno ID organizace. | Může se dotazovat na více ID organizací. |
Přesný dotaz na poštu API verze 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,
}
V těle této žádosti, dimensionDataSource
je volitelný parametr. Pokud není nastaven, s dimensions
ve filters
bude zacházeno jako se základními dimenzemi. K dispozici jsou čtyři povinná pole pro filters
: organizationId
, productId
, dimensions
, a values
.
-
organizationId
by měl obsahovat pouze jednu hodnotu, ale stále je to pole. -
productId
může obsahovat jednu nebo více hodnot. Pokud je prázdné pole, budou vráceny všechny produkty. - V poli
dimensions
jsousiteId
alocationId
povinné tehdy a pouze tehdy, když vaše pravidlo rozdělení dat je nastaveno na Podle umístění. V takovém případě se mohou se objevit s dalšími prvky v libovolném pořadí. -
values
může obsahovat jednu nebo více různých n-tic hodnot odpovídajícíchdimensions
.
dimensions
ve filters
bude automaticky přidáno do groupByValues
.
Parametr returnNegative
určuje, zda výsledky obsahují záporné položky.
Následující příklad ukazuje ukázkový obsah těla.
{
"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
}
Následující příklad ukazuje, jak dotazovat všechny produkty na konkrétním pracovišti a umístění.
{
"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
}
Přesný dotaz po ruce verze API 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,
}
API verze 2.0 se liší od verze 1.0 v následujících ohledech:
- Sekce
filters
má nyní místokeys
poledimensions
. Polekeys
funguje jako poledimensions
ve verzi 1.0, ale nyní může zahrnovat takéorganizationId
. Klíče můžete zadat v libovolném pořadí. - Sekce
filters
již nepodporuje poleorganizationId
. Místo toho můžete zahrnoutorganizationId
mezi dimenze v polikeys
(napříkladkeys: ["organizationId", "siteId", "locationId"]
) a definovat hodnoty ID organizace na odpovídající pozici v polivalues
pole (napříkladvalues: ["SCM_IV", "iv_contoso_site_1", "iv_contoso_location_1"]
).
Ostatní pole jsou shodná s API verze 1.0.
Dotaz s vyhledáváním produktů
Následující rozhraní API pro dotazování jsou vylepšena tak, aby podporovala vyhledávání produktů:
Poznámka
Když odešlete dotaz na viditelnost zásob, který používá vyhledávání produktů, použijte parametr požadavku productSearch
(s objektem ProductAttributeQuery
uvnitř) k vyhledání nebo filtrování podle ID produktu. Novější rozhraní API již nepodporují starší parametr požadavku productid
v těle požadavku.
Předpoklady
Než budete moci začít používat rozhraní API vyhledávání produktů, váš systém musí splňovat následující požadavky:
- Musíte používat Dynamics 365 Supply Chain Management 10.0.36 nebo novější.
- Musí být nainstalována a nastavena Viditelnost zásob verze 1.2.2.54 podle popisu v tématu Instalace a nastavení doplňku Viditelnost zásob.
- Služba vyhledávání Viditelnost zásob musí být nainstalována a nastavena podle popisu v tématu Nastavení vyhledávání produktu pro Viditelnost zásob.
Smlouva vyhledávání produktu
Smlouva o vyhledávání produktů definuje pravidla pro komunikaci s rozhraními API pro vyhledávání produktů. Poskytuje standardizovaný způsob popisu schopností a chování možností vyhledávání produktů. Uživatelé tak mohou snadněji porozumět, pracovat s a vytvářet aplikace, které využívají rozhraní API Viditelnost zásob.
Následující příklad ukazuje ukázkovou smlouvu.
{
"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"
}
]
}
]
},
}
V následující tabulce jsou popsána pole, která jsou použita ve smlouvě.
ID pole | Popis |
---|---|
logicalOperator |
Hodnoty pole jsou And a Or . Toto pole použijte k připojení více podmínek nebo podmínek a dílčích filtrů. Pole subFilters je ve skutečnosti objekt productFilter nebo attributeFilter . Proto můžete mít subFilters uvnitř subFilters . |
conditionOperator |
Možné hodnoty jsou IsExactly , IsNot , Contains , DoesNotContain , BeginsWith , IsOneOf , GreaterEqual , LessEqual a Between . |
ProductFilter |
Toto pole použijte k filtrování produktů podle informací souvisejících s produktem. Můžete například změnit productName ve smlouvě na Company , itemNumber , productSearchName , productType , productName , productDescription , inventoryUnitSymbol , salesUnitSymbol nebo purchaseUnitSymbol podle potřeb vaší firmy. |
AttributeFilter |
Toto pole použijte k filtrování produktů podle informací souvisejících s atributem. |
attributeArea |
Hodnoty pole jsou ProductAttribute , DimensionAttribute a BatchAttribute . |
Dotaz s vyhledáváním produktů
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,
}
Následující příklad ukazuje ukázkový obsah těla.
{
"productSearch": {
"productFilter": {
"conditions": [
{
"conditionOperator": "contains",
"productName": [
"speaker cable"
],
},
],
},
},
"returnNegative": true,
"filters":
{
"organizationId": ["usmf"],
"siteId": ["1"],
"locationId": ["13"],
},
"groupByValues": ["colorid"],
}
Následující příklad ukazuje úspěšnou odpověď.
[
{
"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
}
}
}
]
Přesný dotaz s vyhledáváním produktů
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,
}
Následující příklad ukazuje ukázkový obsah těla.
{
"productSearch": {
"productFilter": {
"conditions": [
{
"conditionOperator": "contains",
"productName": [
"speaker cable"
],
},
],
},
},
"filters": {
"organizationId": ["usmf"],
"dimensions": ["siteId", "locationId", "colorid"],
"values" : [
["1", "13", "Black"],
]
},
"groupByValues": [],
"returnNegative": true
}
Následující příklad ukazuje úspěšnou odpověď.
[
{
"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
}
}
}
]
Lze slíbit (ATP)
Viditelnost zásob vám umožní naplánovat budoucí změny ve skladu a vypočítat množství, které lze slíbit. ATP (Lze slíbit) je množství položky, které je k dispozici a může být odběrateli přislíbena v příštím období. Použití výpočtu ATP může výrazně zvýšit vaši schopnost plnění objednávky. Informace o tom, jak povolit tuto funkci a jak interagovat s Viditelností zásob prostřednictvím jejího rozhraní API po aktivaci funkce, naleznete v tématu Plány změn ve skladu Viditelnosti zásob a funkce Lze slíbit.
Přidělení
API související s přidělením se nacházejí v přidělování Viditelnosti zásob.