Sdílet prostřednictvím


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:

  1. Přihlaste se na portál Azure a použijte jej k vyhledání hodnot clientId a clientSecret pro vaši aplikaci Dynamics 365 Supply Chain Management.

  2. 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"
    }
    
  3. 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.
  4. 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íč jeApi-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
    }
    

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 a locationId nesmí být prázdné.
  • siteId a locationId se používají k rozdělení. V požadavku Dotaz na zásoby na skladě můžete zadat více než jednu hodnotu siteId a locationId. 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ů (hodnoty locationId ), 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 jsou siteId a locationId 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ích dimensions.

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ísto keys pole dimensions . Pole keys funguje jako pole dimensions 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 pole organizationId . Místo toho můžete zahrnout organizationId mezi dimenze v poli keys (například keys: ["organizationId", "siteId", "locationId"]) a definovat hodnoty ID organizace na odpovídající pozici v poli values pole (například values: ["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:

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.
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
            }
        }
    }
]
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.