库存可见性现有库存更改计划与可承诺

本文介绍如何设置现有库存更改计划功能来计划未来的现有库存更改并计算可承诺 (ATP) 数量。 ATP 是可用的并且可以在下一个期间向客户承诺的物料数量。 使用此计算可以大大提高您的订单履行能力。

对于很多制造商、零售商或经销商来说,仅仅知道目前的现有量是不够的。 他们必须对未来的可用性具有完全的可见性。 未来可用性应考虑未来的供给、未来的需求和 ATP。

ATP 数量的计算度量

ATP 计算度量是一个预定义的计算度量,通常用于查找当前可用的现有数量。 供应数量是修饰符类型为添加的那些实际度量的数量总和,而需求数量是修饰符类型为减法的那些实际度量的数量总和。

您可以添加多个计算度量值来计算多个 ATP 数量。 但是,所有 ATP 计算度量值的不同实际度量总数应小于 9。

重要

计算的度量是实际度量的构成部分。 其公式只能包含不重复的实际度量,而不能包含计算的度量。

例如,您设置以下计算度量值:

On-hand-available = (PhysicalInvent + OnHand + Unrestricted + QualityInspection + Inbound) – (ReservPhysical + SoftReservePhysical + Outbound)

总和 (PhysicalInvent + OnHand + Unrestricted + QualityInspection + Inbound) 代表供应,总和 (ReservPhysical + SoftReservePhysical + Outbound) 代表需求。 因此,计算度量值可以这样理解:

On-hand-available = 供应需求

您可以添加另一个计算度量以计算现有实际 ATP 数量。

On-hand-physical = (PhysicalInvent + OnHand + Unrestricted + QualityInspection + Inbound) – (Outbound)

在这两个 ATP 计算度量中存在八种不同的物理度量:PhysicalInventOnHandUnrestrictedQualityInspectionInboundReservPhysicalSoftReservePhysicalOutbound

有关计算度量值的详细信息,请参阅计算度量值

在 UI 版本 2 中打开并设置现有量更改计划和 ATP

当您使用库存可见性 UI 版本 2 时,本部分适用。

您必须设置一个或多个计算度量值来计算 ATP 数量,然后才能够使用 ATP。 您还必须启用功能并在 Microsoft Power Apps 中配置 ATP 设置。

按照以下步骤在 Power Apps 中启用现有库存更改计划功能并配置 ATP 设置。

  1. 登录到 Power Apps,打开库存可见性应用。

  2. 在导航窗格上,选择功能管理

  3. 可承诺磁贴上,选择管理

  4. 启用功能选项设置为 True 以打开 ATP 功能。

  5. 180 天计划选项设置为 True 以支持更长的 ATP 计划期间(180 天)。

    重要提示

    默认情况下,ATP 功能仅限 7 天。 7 天 ATP 功能和 180 天 ATP 功能是分开的,互相独立。 当您打开 180 天 ATP 功能时,您使用 7 天 ATP 功能创建或修改的计划更改将不会生效。 如果您已使用 7 天 ATP 功能并希望迁移到 180 天功能,我们建议您在启用 180 天功能后删除旧数据并重新发布现有更改计划。

  6. 最大计划期间(天)字段设置为用户可以查看和提交计划现有量更改的天数。 查询存货信息的用户将从当前日期开始,获取定义的期间中每天的现有数量、计划现有量更改和 ATP。 此字段的最大值为 180 天。 默认情况下,它设置为 30 天。 因此,您可以计划从今天起最多 30 天内的更改。

    重要提示

    计划期间包括当前日期。 因此,用户可以计划从当前日期(提交更改的日期)到(计划期间 - 1)天之间的任何时间发生的现有库存更改。

  7. 计划度量部分中,设置计划度量。 您可以使用现有的计算度量作为计划度量,也可以创建新度量。 当您查询库存可见性时,将根据组件实际度量的计划更改为定义的计算度量提供 ATP 值。 在计划度量部分中,在工具栏上选择新的现有量更改计划配置 V2 以为 ATP 添加新的计算度量绑定。 计算度量是您要用来查找当前可用的现有数量的度量。 有关如何创建计算度量的信息,请参阅计算度量

    重要提示

    默认 ATP 计算公式仅供参考。 您可以修改和添加其他数据源和实际度量,以便为您的业务设置正确的 ATP 计算。

  8. ATP 索引集配置部分中,设置您的 ATP 索引。 ATP 索引类似于产品索引层次结构,允许您按特定维度对查询结果进行分组。 例如,如果将 ColorIdSizeId 设置为您的 ATP 索引集,查询结果将按颜色和大小分组。 您可以有多个索引集。

    重要提示

    默认 ColorIdSizeId 索引仅供参考。 您可以删除维度并添加其他维度。

  9. 选择保存

  10. 配置完所有必需的设置后,在导航窗格上的管理员设置下选择更新配置

有关详细信息,请参阅完成和更新配置

在 UI 版本 1 中打开并设置现有量更改计划和 ATP

当您使用库存可见性 UI 版本 1 时,本部分适用。

按照以下步骤在 Power Apps 中启用现有库存更改计划功能并配置 ATP 设置。

  1. 登录到 Power Apps,打开库存可见性应用。

  2. 打开管理页面。

  3. 功能管理选项卡上,打开可承诺功能。

  4. 选择 ATP 设置选项卡。

  5. 当您查询库存可见性时,它将提供一个包含您在此处添加的每个 ATP 计算度量值的结果。 选择添加可为 ATP 添加新的计算度量值。

  6. 设置以下字段:

    • 数据源 - 选择与计算度量关联的数据源。
    • 计算度量 - 选择与所选数据源关联的您要用于查找当前可用现有数量的计算度量。
    • 计划期间 – 输入用户在使用所选计算度量值时可以查看和提交计划现有库存更改的天数。 查询存货信息的用户将从当前日期开始,获取此期间中每天的现有库存数量、计划现有库存更改和 ATP。 选择 1 到 7 之间的一个整数。

    重要

    计划期间包括当前日期。 因此,用户可以计划从当前日期(提交更改的日期)到(计划期间 - 1)天之间的任何时间发生的现有库存更改。

  7. 选择保存

  8. 重复步骤 5 到 7,直到您添加了 ATP 所需的所有计算度量值。

  9. 完成配置所有必需设置后,选择更新配置

现有库存更改计划和 ATP 计算的工作原理

现有库存更改计划确定计划现有库存更改的预期日期和数量。 您可以向库存可见性提交现有量更改计划,前提是日期在计划期间设置定义的期间内(请参阅本文的启用和设置功能一节)。 查询存货信息的用户将获取该期间中每天的现有库存数量、计划现有库存更改和 ATP。

计划更改最初不会提交,因此不会影响系统中的实际现有库存数量。 要提交更改,您必须提交现有库存更改事件,该事件将更新实际可用的现有库存数量。 然后,您必须通过提交匹配的负数量的现有库存更改计划来还原计划更改。

例如,您下了一个购买 10 辆自行车的订单,预期明天到达。 因此,您提交现有库存更改计划,入站数量为 10,日期为明天。 第二天订单到达时,您将自行车添加到实际现有库存中。 然后,您必须向系统提交此更改以更新实际现有库存数量。 要提交更改,您提交一个入站数量为 10 的现有库存更改事件。 然后,您通过提交入站数量为 -10 的现有库存更改计划来还原计划更改。

当您在库存可见性中查询现有库存数量和 ATP 数量时,将返回计划期间中每天的以下信息:

  • 日期 – 将应用结果的日期。 时区为协调世界时 (UTC)。
  • 现有库存数量 – 指定日期的实际现有库存数量。 此计算根据为库存可见性配置的 ATP 计算度量进行。
  • 计划供应 – 截至指定日期尚未实际可供立即消耗或装运的所有计划入站数量的总和。
  • 计划需求 – 截至指定日期尚未消耗或装运的所有计划出站数量的总和。
  • ATP 数量 - 从指定日期到计划期间结束可用的预计最小现有数量。 此数量包括所有计划的数量调整。 这是可在当前日期承诺的可在当天交货或消耗的的最大数量。

例如,如果当前日期为 2022 年 2 月 1 日,计划期间为 7,用户可以提交预计从 2022 年 2 月 1 日到 2 月 7 日之间发生的计划现有库存更改。 举例来说,在这种情况下,2 月 3 日的 ATP 数量是根据该日的现有库存数量以及从 2 月 3 日到 2 月 7 日的计划数量计算的。

示例

以下示例显示一系列计划数量更改如何影响库存可见性报告的现有库存数量和 ATP 数量。 另外还显示了如何提交计划更改、承诺计划更改如何影响结果,以及如果未提交计划更改可能会发生的情况。

此示例中的结果显示预计的现有库存值。 此值包含用于说明目的但在查询库存可见性时实际并未报告的所有计划更新。

  1. 在 Power Apps 中的库存可见性应用的 ATP 设置页面上为您的系统配置以下设置:

    • 计划度量 - 此处添加了名为现有量的计算度量。 它的计算方式为现有量 = 供应需求
    • 最大计划期间(天) - 该值设置为 7
    • ATP 索引集配置 - 此处添加了 ColorIdSizeId
  2. 下列情况也适用:

    • 当前日期是 2022 年 2 月 1 日。
    • 当前的现有库存数量为 20。
  3. 对于当前日期(2022 年 2 月 1 日),您将计划需求数量 3 提交到库存可见性。 因此,预计的现有库存数量是 17。 下表显示了结果。

    日期 现有量 计划供应 计划需求 预计现有库存 ATP
    2022-02-01 20 3 17 17
    2022-02-02 20 17 17
    2022-02-03 20 17 17
    2022-02-04 20 17 17
    2022-02-05 20 17 17
    2022-02-06 20 17 17
    2022-02-07 20 17 17
  4. 在当前日期(2022 年 2 月 1 日),您为 2022 年 2 月 3 日提交计划供应数量 10。 下表显示了结果。

    日期 现有量 计划供应 计划需求 预计现有库存 ATP
    2022-02-01 20 3 17 17
    2022-02-02 20 17 17
    2022-02-03 20 10 27 27
    2022-02-04 20 27 27
    2022-02-05 20 27 27
    2022-02-06 20 27 27
    2022-02-07 20 27 27
  5. 在当前日期(2022 年 2 月 1 日),您提交以下计划数量更改:

    • 2022 年 2 月 4 日的需求数量为 15
    • 2022 年 2 月 5 日的供应数量为 1
    • 2022 年 2 月 6 日的供应数量为 3

    下表显示了结果。

    日期 现有量 计划供应 计划需求 预计现有库存 ATP
    2022-02-01 20 3 17 12
    2022-02-02 20 17 12
    2022-02-03 20 10 27 12
    2022-02-04 20 15 12 12
    2022-02-05 20 1 13 13
    2022-02-06 20 3 16 16
    2022-02-07 20 16 16
  6. 在当前日期(2022 年 2 月 1 日),您装运计划需求数量 3。 因此,您必须提交此更改,让它反映在实际现有库存数量中。 要提交更改,您提交一个出站数量为 3 的现有库存更改事件。 然后,您通过提交出站数量为 -3 的现有库存更改计划来还原计划更改。 下表显示了结果。

    日期 现有量 计划供应 计划需求 预计现有库存 ATP
    2022-02-01 17 0 17 12
    2022-02-02 17 17 12
    2022-02-03 17 10 27 12
    2022-02-04 17 15 12 12
    2022-02-05 17 1 13 13
    2022-02-06 17 3 16 16
    2022-02-07 17 16 16
  7. 第二天(2022 年 2 月 2 日),计划期间前移一天。 下表显示了结果。

    日期 现有量 计划供应 计划需求 预计现有库存 ATP
    2022-02-02 17 17 12
    2022-02-03 17 10 27 12
    2022-02-04 17 15 12 12
    2022-02-05 17 1 13 13
    2022-02-06 17 3 16 16
    2022-02-07 17 16 16
    2022-02-08 17 16 16
  8. 但是,两天后(2022 年 2 月 4 日),为 2 月 3 日计划的供应数量 10 仍未到达。 下表显示了结果。

    日期 现有量 计划供应 计划需求 预计现有库存 ATP
    2022-02-04 17 15 2 2
    2022-02-05 17 1 3 3
    2022-02-06 17 3 6 6
    2022-02-07 17 6 6
    2022-02-08 17 6 6
    2022-02-09 17 6 6
    2022-02-10 17 6 6

    如您所见,计划(但不承诺)现有库存更改不会影响实际现有库存数量。

通过 API 提交更改计划、更改事件和 ATP 查询

您可以使用以下应用程序编程接口 (API) URL 提交现有库存更改计划、更改事件和查询。

路径 方法 Description
/api/environment/{environmentId}/onhand/changeschedule POST 创建一个计划现有库存更改。
/api/environment/{environmentId}/onhand/changeschedule/bulk POST 创建多个计划现有库存更改。
/api/environment/{environmentId}/onhand POST 创建一个现有库存更改事件。
/api/environment/{environmentId}/onhand/bulk POST 创建多个更改事件。
/api/environment/{environmentId}/onhand/indexquery POST 使用 POST 方法查询。
/api/environment/{environmentId}/onhand GET 使用 GET 方法查询。
/api/environment/{environmentId}/onhand/exactquery POST 使用 POST 方法进行精确查询。

有关详细信息,请参阅库存可见性公共 API

创建一个现有库存更改计划

通过向相关 库存可见性服务 URL 提交 POST 请求来创建现有变更计划。 您还可以提交批量请求。

仅当计划日期在当前日期和当前计划期间结束日期之间时,才可以创建现有库存更改计划。 日期/时间格式应为年-月-日(例如 2022-02-01)。 时间格式必须只精确到天。

此 API 用于创建一个现有库存更改计划。

Path:
    /api/environment/{environmentId}/onhand/changeschedule
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,
        },
        quantitiesByDate: {
            [datetime:datetime]: {
                [dataSourceName:string]: {
                    [key:string]: number,
                },
            },
        },
    }

以下示例显示不带 dimensionDataSource 的示例正文内容。

{
    "id": "id-bike-0001",
    "organizationId": "usmf",
    "productId": "Bike",
    "dimensions": {
        "SiteId": "1",
        "LocationId": "11",
        "ColorId": "Red",
        "SizeId": "Small"
    },
    "quantitiesByDate": {
        "2022-02-01": {
            "pos": {
                "inbound": 10
            }
        }
    }
}

创建多个现有库存更改计划

此 API 可以同时创建多个记录。 此 API 和单事件 API 的唯二差异是 PathBody 值。 对于此 API,Body 提供一组记录。 最大记录数为 512。 因此,现有库存更改计划批量 API 一次最多可以支持 512 项计划更改。

Path:
    /api/environment/{environmentId}/onhand/changeschedule/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
            quantitiesByDate: {
                [datetime:datetime]: {
                    [dataSourceName:string]: {
                        [key:string]: number,
                    },
                },
            },
        },
        ...
    ]

以下示例显示示例正文内容。

[
    {
        "id": "id-bike-0001",
        "organizationId": "usmf",
        "productId": "Bike",
        "dimensions": {
            "SiteId": "1",
            "LocationId": "11",
            "ColorId": "Red",
            "SizeId": "Small"
        },
        "quantitiesByDate": {
            "2022-02-01": {
                "pos": {
                    "inbound": 10
                }
            }
        }
    },
    {
        "id": "id-car-0002",
        "organizationId": "usmf",
        "productId": "Car",
        "dimensions": {
            "SiteId": "1",
            "LocationId": "11",
            "ColorId": "Red",
            "SizeId": "Small"
        },
        "quantitiesByDate": {
            "2022-02-05": {
                "pos": {
                    "outbound": 10
                }
            }
        }
    }
]

创建现有库存更改事件

通过向相关 库存可见性服务 URL 提交 POST 请求来进行现有变更事件(请参阅 通过 API 提交变更计划、变更事件和 ATP 查询 部分的开头)。

注释

现有更改事件不是 ATP 功能独有的,而是标准库存可见性 API 的一部分。 之所以包含此示例,是因为在您使用 ATP 时事件是相关的。 现有库存更改事件类似于现有库存更改预留,但事件消息必须发送到不同的 API URL,并且事件在消息正文中使用 quantities 而不是 quantityByDate。 有关库存可见性 API 的现有库存更改事件和其他功能的详细信息,请参阅库存可见性公共 API

以下示例显示包含单个现有库存更改事件的请求正文。

{
    "id": "id-bike-0001",
    "organizationId": "usmf",
    "productId": "Bike",
    "dimensions": {
        "SiteId": "1",
        "LocationId": "11",
        "SizeId": "Big",
        "ColorId": "Red"
    },
    "quantities": {
        "pos": {
            "inbound": 10.0
        }
    }
}

查询计划现有库存更改和 ATP 结果

您可以通过向适当的 API URL 提交 POST 请求或 GET 请求来查询计划现有库存更改和 ATP 结果(请参阅通过 API 提交更改计划、更改事件和 ATP 查询一节)。

如果您想要查询计划现有库存更改和 ATP 结果,在您的请求中将 QueryATP 设置为 true。 默认情况下,查询返回从今天开始所有 ATP 相关的数据。 您可以指定 ATPFromDateATPToDate 来缩小结果范围。 (“结束”和“开始”日期只用于筛选结果。它们不会影响 ATP 的计算方式。)

  • 如果您使用 GET 方法提交请求,请在 URL 中设置此参数。
  • 如果您使用 POST 方法提交请求,请在请求正文中设置此参数。

注释

无论请求正文中的 returnNegative 参数是设置为 true 还是 false,当您查询计划现有库存更改和 ATP 时,结果都将包含负值。 将包括这些负值,因为如果仅计划需求订单,或者如果供应数量小于需求数量,计划现有库存更改数量将为负数。 如果不包括负值,结果会令人困惑。 有关此选项以及它如何适用于其他类型的查询的详细信息,请参阅库存可见性公共 API

使用 POST 方法查询

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,
    }

以下示例显示如何使用 POST 方法创建可以提交到库存可见性的索引查询请求正文。

{
    // OnHand Index Query fields
    "filters": {
        "organizationId": ["usmf"],
        "productId": ["Bike"],
        "SiteId": ["1"],
        "LocationId": ["11"]
    },
    "groupByValues": ["ColorId", "SizeId"],
    "returnNegative": true,

    // ATP related fields
    "QueryATP":true,
    "ATPFromDate": "2022-02-01",
    "ATPToDate": "2022-02-10",
}

使用 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]

以下示例显示如何作为 GET 请求创建索引查询请求 URL。

https://inventoryservice.{RegionShortName}-il301.gateway.prod.island.powerapps.com/api/environment/{EnvironmentId}/onhand?organizationId=usmf&productId=Bike&SiteId=1&LocationId=11&groupBy=ColorId,SizeId&returnNegative=true&QueryATP=true&ATPToDate=2022-02-01&ATPToDate=2022-02-10

GET 请求的结果与上一个示例中 POST 请求的结果完全相同。

使用 POST 方法进行精确查询

若要设置精确查询,请将 ATP 相关的字段添加到查询正文。 有关详细信息,请参阅使用 post 方法进行精确查询

{
    // Exact query fields
    // ...

    // ATP related fields
    "QueryATP":true,
    "ATPFromDate": "2022-02-01",
    "ATPToDate": "2022-02-10",
}

查询结果示例

前面的任何查询示例都可能生成以下回复。 对于此示例,系统配置了以下设置:

  • ATP 计算度量值:iv.onhand = pos.inbound – pos.outbound
  • 计划期间:7

以下是回复正文的示例。

[
    {
        "quantitiesByDate": {
            "2022-02-02T00:00:00": {
                "pos": {
                    "outbound": 5,
                    "inbound": 0,
                },
                "iv": {
                    "onhand": -5,
                },
            },
            "2022-02-06T00:00:00": {
                "pos": {
                    "inbound": 7,
                    "outbound": 0,
                },
                "iv": {
                    "onhand": 7,
                },
            }
        },
        "atpQuantities": {
            "2022-02-01T00:00:00Z": {
                "iv": {
                    "onhand": 5.0
                }
            },
            "2022-02-02T00:00:00Z": {
                "iv": {
                    "onhand": 5.0
                }
            },
            "2022-02-03T00:00:00Z": {
                "iv": {
                    "onhand": 5.0
                }
            },
            "2022-02-04T00:00:00Z": {
                "iv": {
                    "onhand": 5.0
                }
            },
            "2022-02-05T00:00:00Z": {
                "iv": {
                    "onhand": 5.0
                }
            },
            "2022-02-06T00:00:00Z": {
                "iv": {
                    "onhand": 12.0
                }
            },
            "2022-02-07T00:00:00Z": {
                "iv": {
                    "onhand": 12.0
                }
            }
        },
        "productId": "Bike ",
        "dimensions": {
            "ColorId": "Red",
            "SizeId": "Big",
            "siteid": "1",
            "locationid": "11"
        },
        "quantities": {
            "pos": {
                "inbound": 10.0,
                "outbound": 0,
            },
            "iv": {
                "onhand": 10.0,
            }
        }
    }
]