---
title: 通过移动应用程序更新 Shopify 库存
date: 2025-04-01
categories:
  - data-integration
  - etl
tags:
  - "#mapforce"
description: 以下是一个实际案例，展示了如何使用MapForce中的GraphQL支持，为Shopify商店开发一款移动应用程序，用于更新库存信息。
---
Status: #blog

Tags:  #mapforce #shopify

Categories: [data-integration](/blog/zh/category/data-integration.md) | [etl](/blog/zh/category/etl.md) 
# 通过移动应用程序更新 Shopify 库存

使用Shopify作为电商平台的一个优势在于，它提供了强大的库存管理功能。然而，实时维护准确的库存记录可能具有挑战性，尤其对于那些在库存盘点或补货时依赖手动数据录入的商家来说。

手持条码扫描仪是提高库存盘点速度和准确性的绝佳解决方案，但许多店铺主往往缺乏一种便捷的方式，可以将扫描仪的数据直接连接到Shopify系统。如果没有适当的集成，员工可能仍然需要手动将扫描到的数据输入到Shopify系统中，这会抵消条码扫描仪原本应该带来的部分效率提升。

让我们来看一个实际案例，即如何开发一款具有条形码扫描功能的移动应用程序，该应用程序能够直接与Shopify集成，实现实时库存管理。
![适用于Shopify的移动应用程序](/blog/images/Shopify-updating_inventory.jpg)


<!--more-->
Shopify tracks key inventory metrics, including the quantity on hand at each location, the number of items committed to existing orders, and the availability for new orders. Keeping these numbers accurate is important to prevent overselling or accumulating inactive, non-moving stock.

保持库存准确性的一种有效方法是定期进行库存盘点或循环盘点。一款移动应用程序，可以让你快速更新 Shopify 商店中每种产品的实际库存数量，可以简化这个流程，从而提高效率并降低人工盘点成本。

使用[Altova Data Platform](https://www.altova.com/zh/data-platform)中的产品，我们可以创建一个工作流程，利用手持扫描仪收集条形码数据，并将其实时映射到Shopify平台。
## Shopify 和 GraphQL 

Shopify 已经采用 GraphQL API 来与外部数据进行交互，无论是用于提取数据进行分析，还是，在我们的案例中，用于导入数据以进行库存管理。有关 Shopify GraphQL API 的工作原理以及如何连接到它们，请参阅我们之前的文章：[从 Shopify 导出数据](/blog/zh/2025/03/exporting-products-from-shopify-as-csv.md)。
## Shopify 库存管理应用的开发需求与设计

我们的工作流程将使用一系列 Altova 产品协同工作：

- MobileTogether Designer：用于构建条形码扫描应用程序的工具
- MobileTogether 服务器：用于托管移动设备上的应用程序
- MapForce – 适用于 [将应用程序中的数据映射到 Shopify 系统](https://www.altova.com/zh/mapforce/convert-shopify-graphql)
- MapForce Server：用于在服务器上执行数据映射
- FlowForce 服务器：用于工作流程编排，并将映射关系以 Web 服务形式提供

设计过程始于 MobileTogether，这是 Altova 提供的低代码应用开发框架，用于构建以数据为中心的应用程序。该框架提供全面的支持，用于构建能够[存储和处理来自手持条码扫描仪的数据](https://www.altova.com/zh/mobiletogether/mobile-scanner-apps)的应用程序。

在 Shopify 平台，可能会存在很多 [产品](https://help.shopify.com/en/manual/products), 并且，每个产品可能包含一个或多个产品 [变体](https://help.shopify.com/en/manual/products/variants). 在内部，每一种产品型号都只有一个 [库存项目](https://shopify.dev/docs/api/admin-graphql/latest/objects/InventoryItem). 一个库存项目可以有多个... (后续内容缺失，请提供完整句子以便翻译。) [库存水平](https://shopify.dev/docs/api/admin-graphql/latest/objects/InventoryLevel): 每个产品对应一个库存等级 [地点](https://shopify.dev/docs/api/admin-graphql/latest/objects/Location). 这些位置代表了商家开展业务的地理位置，例如零售商店或仓库。您可以了解更多关于这些对象之间的关系 [这里](https://shopify.dev/docs/apps/build/orders-fulfillment/inventory-management-apps/manage-quantities-states#inventory-object-relationships).

因此，为了更新某个产品变体的数量，我们需要修改（在GraphQL术语中，修改指的是更新）特定库存项在特定地点的库存水平。考虑到这一点，我们可以在MobileTogether Designer中启动应用程序的工作流程，首先要求用户选择我们要统计库存项的地点：

![Shopify 库存管理应用的启动](/blog/images/shopify-location.png)


为了填充 Shopify 商店的地点信息表，我们将使用 MapForce 进行数据映射，从而查询所有地点的信息。

![选择 Shopify 门店位置](/blog/images/shopify-locations.png)

以下是我们将用于 Shopify/GraphQL Web 请求组件（位于左侧）的 GraphQL 查询语句：

`{`

    `locations(first: 100) {`

        `nodes {`

            `id`

            `name`

        `}`

    `}`

`}`

接下来，我们将把这个映射关系部署到 MapForce Server 上，并使用 [FlowForce Server](https://www.altova.com/zh/flowforceserver)，将其作为 Web 服务提供

![FlowForce 的工作设置](/blog/images/flowforce-job.png)

请务必将此任务以 Web 服务的方式通过 HTTP(S) 协议对外开放

![FlowForce 作为 Web 服务](/blog/images/flowforce-service-locations.png)

接下来，在 MobileTogether Designer 中，为第一个应用程序页面添加一个新的 FlowForce 作业，将其作为新的页面来源。 

![FlowForce 集成于 MobileTogether 中](/blog/images/flowforce-mobiletogether.png)

请注意，该URL应指向FlowForce服务器的主机名，除非FlowForce服务器和MobileTogether服务器运行在同一台机器上，在这种情况下，可以使用localhost。此外，虽然在我们的示例中，我们将在本地机器上使用http协议，但在任何生产环境中，出于安全考虑，您绝对应该使用https协议。

现在，如果我们要在 MobileTogether 环境中测试我们的应用程序 [应用程序模拟器](https://www.altova.com/zh/mobiletogether/app-simulator) 我们会看到类似这样的情况：

![模拟器中的库存管理应用程序](/blog/images/simulated-app.png)

在确定位置后，我们将配置应用程序的下一页面，该页面会要求用户输入条形码和数量。这些信息将被传递到后续的 MapForce 映射流程。这个流程会更新与该条形码对应的商品的库存数量。


![Shopify 数据映射](/blog/images/shopify-mapping.png)

在这里，我们使用 Shopify 的第一个 GraphQL Web 服务调用，通过该调用来查找给定条形码对应的商品 ID

`query ($query: String = null) {`

    `productVariants(first: 1, query: $query) {`

        `nodes {`

            `id`

            `barcode`

            `inventoryItem {`

                `id`

            `}`

        `}`

    `}`

`}`

然后，Shopify 的第二个 Web 服务调用会将更新库存数量的请求发送出去

mutation InventorySet($input: InventorySetQuantitiesInput!) {

    `inventorySetQuantities(input: $input) {`

        `inventoryAdjustmentGroup {`

            `createdAt`

            `reason`

            `referenceDocumentUri`

            `changes {`

                `name`

                `delta`

            `}`

        `}`

        `userErrors {`

            `field`

            `message`

        `}`

    `}`

`}`

然后，可以将在之前的流程中定义的映射关系，在另一个 FlowForce 任务中使用

![FlowForce 移动应用的工作参数](/blog/images/FlowForce-job-parameters.png)

我们可以将其作为Web服务通过HTTP协议对外提供

![第二项 FlowForce 服务](/blog/images/flowforce-service2.png)

让我们使用这个映射关系，它现在已作为 HTTP 服务部署在 MobileTogether Designer 中移动应用程序的第二个页面上

![移动设备库存应用程序的第二页](/blog/images/app-page2.png)

在这里，我们将之前选择的地点显示出来，并提示用户输入条形码和数量。点击“更新数量”按钮时，会触发一个事件，该事件将调用 FlowForce 服务器的 HTTP 服务：

![通过HTTP调用FlowForce任务](/blog/images/flowforce-http-service.png)

请再次注意，URL 应该指向 FlowForce 服务器的主机名，除非 FlowForce 服务器和 MobileTogether 服务器运行在同一台机器上。

我们将展示突变的结果，具体内容将在移动应用程序的第三个页面上

![库存更新步骤](/blog/images/updating-inventory.png)

...点击“继续”按钮后，我们会返回到第二页，在那里可以输入新的条形码和数量，以便进行下一个库存项目的检查。

完整的流程可能如下所示。

选择地点：

![库存管理应用，第一步](/blog/images/step1.png)

请输入条形码和数量（可通过扫描仪输入） 

![库存管理应用，第二步](/blog/images/step2.png)

更新并获取确认： 

![库存管理应用，第三步](/blog/images/step3.png)

## 接下来会怎样？

现在，我们的条形码扫描应用程序已经准备就绪，它将会 [部署到 MobileTogether 服务器](https://www.altova.com/zh/data-platform) 因此，它可以运行在移动设备上。该应用程序适用于配备内置硬件条码扫描器的移动设备，用户只需按下一个按钮即可扫描并输入条形码。此外，MobileTogether 还支持 [外部无线条码扫描器](https://www.altova.com/zh/mobiletogether/mobile-scanner-apps#config) (例如 Zebra 或 Datalogic) 这样的设备，可以集成到移动应用程序的工作流程中。

MapForce 与 Shopify 的数据映射功能包含在随软件一同提供的 MapForce 示例项目中（文件名为 Shopify_UpdateInventory.mfd）。您可以输入您自己的 Shopify 商店名称和访问令牌，以试用该功能。


本示例中使用的所有 Altova 产品均可供试用 [免费试用](https://www.altova.com/zh/download), 而 MobileTogether Designer 是一款免费软件。