Oversell / Reallocate — 売越し・再引き当て
ルーティング確定後に 売越し(システム上は在庫があったが、店舗で実物欠品 / 汚損 / 先行販売 等で実際には出荷できない)が起きたとき、該当の引き当て結果に 売越しフラグ を立て、同じ出荷元の別の在庫ロケーション へ再引き当て(再ルーティング)します。
Base URL
https://api.lmile.io· 認証x-ingest-secretヘッダー または operator JWT(Authorization: Bearer)(詳細) ·shopはリクエストボディに含めます(API キーで呼ぶ場合は省略できます)
/api/routing/oversell//api/routing/reallocateは機械間 secret(x-ingest-secret)と倉庫スタッフの operator JWT のどちらでも呼べます(系統はヘッダの有無で明示判別。詳細)。operator JWT 経由は操作スタッフを記録します。
エンドポイント
POST
/api/routing/oversell
引き当て結果に売越しフラグを立てる
POST
/api/routing/reallocate
売越し結果を同一出荷元の別メンバーへ再引き当て
入力フィールドは camelCase(
routingOrderId/lineInstanceNo)です。
POST /api/routing/oversell
routingOrderId の applied な引き当て結果に売越しフラグ(oversold = true)を立てます。barcode / locationId / lineInstanceNo で対象を絞り込めます(未指定なら注文の applied 全件)。
リクエスト
POST https://api.lmile.io/api/routing/oversell
x-ingest-secret: {INGEST_SECRET}
Content-Type: application/json{
"shop": "demo-store.myshopify.com",
"routingOrderId": "0f1e2d3c-4b5a-6789-0abc-def123456789",
"barcode": "1234567890123",
"locationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"reason": "店舗で実物欠品"
}ボディパラメータ
shop
string
✓
店舗ドメイン(API キーで呼ぶ場合は省略できます)
routingOrderId
string (uuid)
✓
対象の routing order id
barcode
string
対象 barcode で絞り込み
locationId
string (uuid)
引き当て先在庫ロケーション(selected_location_id)で絞り込み
lineInstanceNo
number
販売単位番号で絞り込み
reason
string
売越し理由(oversold_reason に記録)
レスポンス
marked
売越しフラグを立てた decision 件数(既に oversold の行・applied でない行は対象外)
挙動
対象は
decision_status = appliedかつoversold = falseの行のみ。oversold = true/oversold_at/oversold_reasonを更新します。既に売越し済の行は二重マークしません(
markedに含まれない)。フラグを立てただけでは引き当ては変わりません。実際の振り直しは
/api/routing/reallocateを呼びます。
POST /api/routing/reallocate
routingOrderId の 売越し(oversold) な引き当て結果を、同一出荷元の別の在庫ロケーション へ再ルーティングします。旧結果は superseded にし後継へリンク、出荷指示を再構築して再 dispatch します。
リクエスト
ボディパラメータ
shop
string
✓
店舗ドメイン(API キーで呼ぶ場合は省略できます)
routingOrderId
string (uuid)
✓
再引き当て対象の routing order id
レスポンス
ok
入力・認証が妥当で、かつ dispatch 送信が失敗しなかったことを示す。再引き当て先の在庫が無くても(status: no_stock / unresolvedReallocations > 0 / skipped > 0)ok: true のまま返ります。ok: false になるのは入力不正(400)・注文不在(404)・dispatch 送信失敗(status: failed)のみ。再引き当ての成否は ok ではなく status / unresolvedReallocations / skipped で判定してください
reallocated
再引き当てした unit 数(旧 decision を superseded にし後継を生成した数)
unresolvedReallocations
再引き当てしたが他に在庫が無く引き当て不能だった unit 数(unroutableLines 行き)
skipped
出荷元 / barcode 情報を欠く旧 decision で再引き当て不能だった数(oversold のまま据え置き)
status
再構築後の注文ステータス(dispatched / routed / failed / no_stock)
shippingInstruction
現在の applied 結果(健全分 + 再引き当て分)から再構築した出荷指示
dispatches
引き当て先ロケーションごとの再送結果配列(Dispatch Config の per-location 設定で送信)
売越し対象が無い場合は { "ok": true, "routingOrderId": "...", "reallocated": 0, "note": "no oversold decisions" } を返します。
挙動・冪等性
再引き当ては 同一出荷元のメンバー在庫ロケーション内で行い、売越しになった在庫ロケーションは候補から除外します。同 barcode の売越し location はすべて除外対象です。
在庫量を尊重するため
(出荷元, barcode)単位でまとめて再配分します(複数 unit の二重引き当てを防止)。旧 decision は
decision_status = supersededにしsuperseded_by_decision_idで後継へリンク。新 decision はapplied。明細単位のproperties(Routing のlines[].properties)は旧 decision から後継へ引き継がれ、再構築後の出荷指示にも含まれます。出荷指示は
(shop, idempotencyKey)で upsert されるため、再 dispatch は同一行を更新します(Idempotency)。別メンバーにも在庫が無ければ該当 unit は
unroutableLines(no_stock_anywhere)。全 unit 不能ならstatus = no_stock、dispatch は skip。再引き当て不能(
no_stock/unresolvedReallocations/skipped)は HTTP エラーにせず200+ok: trueで返します(行単位の結果として表現し silent skip しない)。ok: falseは入力不正・注文不在・dispatch 送信失敗に限ります。在庫が見つかるまで現場で確保 → 再度/api/routing/reallocateを呼ぶ運用を前提とします。
エラー
エンドポイント固有:
400
routingOrderId 欠落
{ "ok": false, "error": "routingOrderId required" }
404
routing order が存在しない(reallocate)
{ "ok": false, "error_kind": "not_found", "error": "routing order not found" }
共通エラー(401 / 400 / 403 / 405 / 500 / 503)は Error Codes を参照。
データモデル
sot.lm_routing_decisions— 売越し列oversold/oversold_at/oversold_reason、再引き当てリンクsuperseded_by_decision_id。出荷元はfulfillment_source_location_id、引き当て先はselected_location_id。sot.lm_fulfillment_source_members— 再引き当ての候補プール(同一出荷元の在庫ロケーション)。sot.lm_shipping_instructions— 再 dispatch ログ(delivery_status。UNIQUEshop + idempotency_key)。
Last updated
Was this helpful?