Shelf Inventory — 棚在庫
棚(シェルフ)に置かれた商品の在庫を、棚コード × barcode 単位で増減する API です。入庫(receive)で qty を増やし、ピック(pick)で減らします。棚から棚へ動かす・barcode を付け替える(move)、数えた数に合わせて 1 セルを直す(adjust)もあります。sot.lm_shelf_inventory の qty 集約行を更新し、同一トランザクションで増減ログ(sot.lm_shelf_inventory_logs)を追記します。商品参照は barcode のみ(Shopify 非依存)です。
Base URL
https://api.lmile.io· 認証x-ingest-secretヘッダー または operator JWT(Authorization: Bearer)(詳細) ·shopはリクエストボディに含めます(API キーで呼ぶ場合は省略できます)
棚在庫は qty 集約モデル(1 行 =
(shop, location, shelfCode, barcode)の合計数量)です。同一棚に複数 barcode は不可(先に入庫した barcode が棚を占有)、同一 barcode を複数棚に分散させるのは可。フィールドは camelCase(routing 系と同じ)。
エンドポイント
POST
/api/shelf/inventory/receive
棚への入庫(qty 増)
lm_shelf_inventory / lm_shelf_inventory_logs
POST
/api/shelf/inventory/pick
棚からのピック(qty 減)
lm_shelf_inventory / lm_shelf_inventory_logs
POST
/api/shelf/inventory/move
同じ拠点内で棚→棚へ動かす / barcode を付け替える
lm_shelf_inventory / lm_shelf_inventory_logs
POST
/api/shelf/inventory/adjust
1 セルの数量を絶対値で直す(0 で棚から削除)
lm_shelf_inventory / lm_shelf_inventory_logs
POST
/api/shelf/inventory/condition-move
同じ棚・同じ商品の数を、商品状態(良品 ⇄ 良品以外)の間で動かす
lm_shelf_inventory / lm_shelf_condition_stock / lm_shelf_inventory_logs
POST /api/shelf/inventory/receive
棚コード × barcode の在庫を qty だけ増やします。対象行が無ければ新規作成します。
リクエスト
POST https://api.lmile.io/api/shelf/inventory/receive
x-ingest-secret: {INGEST_SECRET}
Content-Type: application/jsonPOST /api/shelf/inventory/pick
棚コード × barcode の在庫を qty だけ減らします。在庫が不足する操作(qty が負になる)は 409 insufficient_shelf_qty で reject します(新規行は作りません)。
リクエスト
ボディパラメータ
receive / pick 共通です。
shop
string
✓
店舗ドメイン(API キーで呼ぶ場合は省略できます)
locationId
string (uuid)
✓
出荷元ロケーション(shop に実在が必須)
shelfCode
string
✓
棚コード(最大 32 文字)。形式 ^[A-Z0-9]+(-[A-Z0-9]+)+$ かつ英字を 1 文字以上含む。大文字へ正規化してから照合します
barcode
string
✓
商品 barcode(sot.products.barcode)
qty
number (int)
✓
増減数量(正の整数)。receive は +qty、pick は -qty
レスポンス
reason
receive / pick
delta
適用した符号付き増減(receive は +qty / pick は -qty)
qtyBefore / qtyAfter
適用前 / 適用後の棚在庫数量
rowId
在庫行 id(sot.lm_shelf_inventory.id)
挙動・冪等性
原子性: qty 更新と増減ログ追記は write RPC
lm_shelf_inventory_applyが同一トランザクション・行ロック下で実行します(部分適用なし)。MFC の拠点だけが対象: 棚ごとの在庫を持つのは MFC(
location_typeがmfc、またはmfc_enabledの拠点)だけです。それ以外の拠点(店舗など)に棚の行を新しく作る操作(receiveと、Inventory Levels 以外の棚への書き込み全般)は422 not_self_inventory_locationで reject します。既にある行を減らすpickは止めません。店舗の在庫は取り込み元(POS など)の数をそのまま使います。同一棚 複数商品の禁止: 同一棚に qty > 0 の別 barcode 行が既にあると
409 shelf_occupied_by_different_barcode(占有中の barcode を返却)。在庫不足:
pickで qty が負になる操作は409 insufficient_shelf_qty(available/requestedを返却)。対象行が無いpickは在庫 0 とみなして同じく不足扱い。引き当て済みの数を下回る
pick: 減らした結果、その商品の棚の合計が注文に引き当て済みの数を上回る状態から下回る状態に変わるpickは409 shelf_qty_below_activeです(何も変わりません)。現場アプリの集荷・確保は「その 1 点」を引き当て済みから除いて判定するので止まりません。すでに下回っている在庫を減らす操作は止めません。非冪等: 増減は自然冪等ではありません。冪等キーは持たないため、リトライ時はクライアント側で適用済みかを確認してください(既存 routing write の secure / oversell と同方針)。
増減はすべて
sot.lm_shelf_inventory_logsに append-only で記録されます(delta/qty_after/reason/operator)。
POST /api/shelf/inventory/move
同じ拠点の中で、棚コード × barcode の在庫を qty だけ別のセルへ動かします。棚を変える(棚移動)か、barcode を変える(付け替え)かのどちらかに使います。移動元 −qty と移動先 +qty を同じトランザクションで反映し、増減ログを 2 行(reason: relocate)追記します。
リクエスト
ボディパラメータ
shop
string
✓
店舗ドメイン(API キーで呼ぶ場合は省略できます)
locationId
string (uuid)
✓
拠点(shop に実在が必須)。移動元と移動先は同じ拠点
fromShelfCode / toShelfCode
string
✓
移動元 / 移動先の棚コード(形式は receive と同じ。大文字へ正規化)
fromBarcode / toBarcode
string
✓
移動元 / 移動先の barcode。同じなら棚移動、違えば付け替え
qty
number (int)
✓
動かす数量(正の整数)
レスポンス
挙動・冪等性
移動元の数量が足りないと
409 insufficient_shelf_qtyです(何も変わりません)。付け替え(barcode が違う)で、移動元の商品の棚の合計が注文に引き当て済みの数を下回ると
409 shelf_qty_below_activeです(何も変わりません)。例: 棚に 3 個あり 2 個が注文に引き当て済みのとき、2 個以上を別の barcode へ付け替えることはできません。同じ barcode の棚移動は合計が変わらないので対象外です。すでに下回っている在庫を減らす操作は止めません。移動元が 0 になった行は残しません(履歴はログに残ります)。
非冪等(差分): 同じリクエストを再送すると二重に動きます。リトライ時は適用済みかを確認してください。
反映のあとに販売可能数を再計算し、出荷元在庫の通知を送ります(同じ barcode の棚移動は合計が変わらないので通知は出ません)。
POST /api/shelf/inventory/adjust
1 セル(棚コード × barcode)の数量を、数えた数(絶対値)に合わせます。qty を 0 にすると棚から削除します。増減があったときだけ増減ログ(reason: stocktake)を追記します。
リクエスト
ボディパラメータ
shop
string
✓
店舗ドメイン(API キーで呼ぶ場合は省略できます)
locationId
string (uuid)
✓
拠点(shop に実在が必須)
shelfCode
string
✓
棚コード(形式は receive と同じ。大文字へ正規化)
barcode
string
✓
商品 barcode
qty
number (int)
✓
新しい数量(0 以上の整数)。0 で棚から削除
レスポンス
挙動・冪等性
減らした結果、その商品の棚の合計が注文に引き当て済みの数を下回ると
409 shelf_qty_below_activeです(何も変わりません)。例: 棚に 3 個あり 2 個が注文に引き当て済みのとき、qtyを 1 にはできません。増やす操作は対象外です。すでに下回っている在庫を実数に直す操作は止めません(再計算と監査が拾います)。冪等(絶対値): 同じ値の再送は
delta: 0で何もしません(ログも書きません)。qty: 0は行を残しません。無い行に0を送っても行は作りません。反映のあとに販売可能数を再計算し、出荷元在庫の通知を送ります。
POST /api/shelf/inventory/condition-move
同じ棚・同じ barcode の数を、商品状態の間で動かします。良品(shop の既定の状態。通常は A)は棚在庫そのもの、良品以外(アウトレット・展示用・不良品・検品中など)は状態ごとの数として別に持ちます。良品以外の数は販売可能数に入りません(注文の引き当て対象外)。良品を減らす・増やすと、同じトランザクションで販売可能数を再計算します。
状態の一覧は agent_read.inventory_condition_codes にあります(shop ごと。is_default が良品)。
リクエスト
ボディパラメータ
shop
string
✓
店舗ドメイン(API キーで呼ぶ場合は省略できます)
locationId
string (uuid)
✓
拠点(shop に実在が必須。MFC のみ)
shelfCode
string
✓
棚コード(形式は receive と同じ。大文字へ正規化)
barcode
string
✓
商品 barcode
qty
number (int)
✓
動かす数量(正の整数)
fromCondition
string
動かす元の状態コード。省略すると良品
toCondition
string
動かす先の状態コード。省略すると良品。fromCondition と同じ値は不可
レスポンス
from / to
動かす元 / 先の状態と、その棚での前後の数量。isDefault: true が良品
changed
販売可能数が変わった商品(良品が動いたときだけ。良品以外の間の移動は空)
挙動・冪等性
良品を減らすとき、その商品の棚の合計が注文に引き当て済みの数を下回る移動は
409 shelf_qty_below_activeです(何も変わりません)。例: 棚に 3 個あり 2 個が引き当て済みのとき、2 個を不良品にはできません。すでに下回っている在庫を減らす操作は止めません。元の数が足りないと
409 insufficient_shelf_qty(良品)/409 insufficient_condition_qty(良品以外)です。0 になった行は残しません。良品以外の行は増減ログ(
reason: condition_move)に状態コード付きで残ります。棚の行は MFC の拠点にだけ作れます(
422 not_self_inventory_location)。非冪等(差分): 同じリクエストを再送すると二重に動きます。
良品が動いたときは、販売可能数の再計算のあとに出荷元在庫の通知を送ります。
エラー
エンドポイント固有:
422
棚コード形式不正
{ "ok": false, "error_kind": "invalid_shelf_code", "error": "shelfCode must match ...", "shelfCode": "SA_A_13" }
422
locationId が shop に存在しない
{ "ok": false, "error_kind": "location_unresolved", "error": "location_id not found for shop" }
422
locationId が MFC ではない拠点に棚の行を作ろうとした
{ "ok": false, "error_kind": "not_self_inventory_location", "error": "not_self_inventory_location: shelf inventory is only kept at MFC locations (location=...)" }
409
同一棚に別 barcode が占有中
{ "ok": false, "error_kind": "shelf_occupied_by_different_barcode", "error": "...", "occupyingBarcodes": [{ "barcode": "...", "qty": 2 }] }
409
pick で在庫不足
{ "ok": false, "error_kind": "insufficient_shelf_qty", "error": "...", "available": 1, "requested": 3 }
409
pick で、減らした結果が注文に引き当て済みの数を下回る
{ "ok": false, "error_kind": "shelf_qty_below_active", "error": "...", "shelfTotal": 3, "shelfTotalAfter": 1, "active": 2 }
409
move で移動元の数量が不足
{ "ok": false, "error_kind": "insufficient_shelf_qty", "error": "...", "shelfCode": "SA-A-13", "barcode": "...", "available": 1, "requested": 3 }
409
adjust / move(付け替え)で、減らした結果が注文に引き当て済みの数を下回る
{ "ok": false, "error_kind": "shelf_qty_below_active", "error": "...", "shelfCode": "SA-A-13", "barcode": "...", "shelfTotal": 3, "shelfTotalAfter": 1, "active": 2 }
409
condition-move で良品以外の元の数が不足
{ "ok": false, "error_kind": "insufficient_condition_qty", "error": "...", "condition": "C", "available": 1, "requested": 3 }
409
condition-move で良品を減らした結果が注文に引き当て済みの数を下回る
{ "ok": false, "error_kind": "shelf_qty_below_active", "error": "...", "shelfTotal": 3, "shelfTotalAfter": 1, "active": 2 }
422
condition-move の状態コードが shop に無い / 無効
{ "ok": false, "error_kind": "condition_unresolved", "error": "...", "condition": "ZZZ" }
共通エラー(401 / 400 / 403 / 405 / 500 / 503)は Error Codes を参照。
データモデル
sot.lm_shelf_condition_stock— 棚 × barcode × 商品状態の数(良品以外だけ)。UNIQUE (shop, location_id, shelf_code, barcode, condition_code)/qty > 0。販売可能数に入りません。読み取り view:agent_read.shelf_stock(良品と良品以外を 1 つにしたもの。is_default_conditionで区別)sot.lm_shelf_inventory— 棚在庫の qty 集約行。UNIQUE (shop, location_id, shelf_code, barcode)/qty >= 0。商品参照は barcode のみ。location_id→sot.locations。読み取り view:public.lm_v_shelf_inventory(内部 service / 管理用途。agent_read.*には露出しません)sot.lm_shelf_inventory_logs— 棚在庫の増減ログ(append-only)。delta(<> 0)/qty_after(>= 0)/reason(receive/pick/adjust/oversell_receive/stocktake/relocate)/operator(operator JWT 経由のみ非 null)。本 API が出すのはreceive/pick/relocate(move)/stocktake(adjust)
Last updated
Was this helpful?