構築例一覧へ戻る
構築例 12 / Build Example
Example 12 / 12

B2Bサイト向け在庫管理システム(WMS)

B2Bサイト(EC)を運営する事業者の倉庫在庫について、「どの品目(個体)が、どの場所に、いつ時点で、いくつあるか/あるはずか」に答え続けるシステム。入荷予定・荷受け・入荷検品・流通加工・棚入れ・ロケーション管理・ロット期限・棚卸・引当ルール・販売可能数の配分・予実を扱います。在庫量は保存せず、勘定パターンで記録した移動から都度導出するため、現在だけでなく過去や将来の時点の在庫も同じ仕組みで答えられます。

フロントエンド
React 18 + TypeScript + Vite + Tailwind(ハンディターミナル想定の画面を含む)
バックエンド
Express REST API + TypeScript(インメモリ)/ JWT・MFA・サービスアカウント
設計トレース
UMLによる分析設計手順書 → 業務要件 → 業務シナリオ → アクティビティ図 / ユースケース図 / クラス図 / 状態遷移図 / シーケンス図 → 実装 → テスト
勘定パターン 予実績管理 入荷・検品・棚入れ ロケーション管理 ロット・消費期限 棚卸 追跡率100%
設計モデル / Design Models

2014年の概念モデルから、26ユースケース・36エンティティへ。

出発点は、テクノロジックアートの「UMLによる分析設計手順書」(2014年)に収められた在庫管理の例題です。手順書の概念モデル・ユースケース図・論理アーキテクチャを業務要件に展開し、手順書に記載のない事項は物流実務の一般的な要件で補いました。そこから単一の真実源(SSoT)を作り、アクティビティ図18・ユースケース26・クラス図(7パッケージ)・状態遷移図7・シーケンス図26を生成しています。モデル検証は エラー0・警告0(品質スコア98.4)です。

原典:在庫管理概念モデル(2014年) Source Model
在庫管理概念モデル(UMLによる分析設計手順書 2014年)
手順書の在庫管理概念モデル。保有・移動・物流取引(勘定パターン)、品目と個体、ロケーション、予定と実績、検討中の論点(緑のノート)までが描かれています。これを入力として、以降のモデルを生成しました。 原寸で開く ↗
ユースケース図(26 UC) Use Case Diagram
在庫管理システム ユースケース図
WMS利用者(倉庫担当者)・OMS利用者・発注先・マネージャ・クライアント・隣接システムなどのアクターと UC-001〜UC-026 の関係。枠内をスクロールして全体を確認できます。 原寸で開く ↗
クラス図 俯瞰(36クラス) Overview
クラス図 俯瞰(36クラス)
36クラスを、在庫勘定(品目・在庫勘定)と倉庫オペレーション(ロケーション・入荷・引当・棚卸)、共通基盤の7パッケージにまとめて俯瞰。 原寸で開く ↗
パッケージ別クラス図 / By Package

各パッケージの詳細なクラス図です。クリックすると原寸で開きます(数字はエンティティ数)。

本ページは、手順書からのモデル駆動開発の概要と、生成したアプリケーションの操作マニュアルをまとめたものです。画面・ボタンの名前は実装のとおりで、画面の例はデモデータ(約60日分)を使って操作したときのものです。

  • 対象システム: 在庫管理システム(B2Bサイト向け WMS)
  • 構成: フロントエンド(React + TypeScript)+ バックエンド(Express REST API)
  • 設計トレース: 業務要件 → 業務シナリオ → アクティビティ図 / ユースケース図 / クラス図 / 状態遷移図 → 実装(UC-001〜UC-026、BR-001〜BR-018 は設計書と共通)

01手順書からの生成

入力は「UMLによる分析設計手順書」(2014年4月18日、テクノロジックアート)の本文と図です。登場人物・ロール図、業務パッケージ図、発注処理のアクティビティ図、ユースケース図とユースケース記述例、在庫管理概念モデル、勘定パターン、論理アーキテクチャ図、論理WMSコンポーネント図を読み取り、実務レベルの業務要件に整理しました。

手順書の作業範囲は「概念モデル」「ユースケース図(部分)」「ユースケース記述例」「論理アーキテクチャのドラフト」までで、業務フローは発注処理の1例のみ、非機能要求の詳細化は行われていません。手順書に記載のない事項は【補完】と明記して物流実務の一般的な要件で補い、図に付された検討中の論点(「引当ルールとは何か?」など)は未決事項として整理したうえで、実装上の判断を記録しています。

システム化の対象は、論理WMSコンポーネント図の在庫業務コンポーネント(ロケーション管理・在庫管理・荷受管理・引当)と、論理アーキテクチャ図の中心にある予実績管理です。受注・出荷・発注は隣接コンポーネントとして扱い、API(サービスアカウント)でつなぎます。

成果物数量
ユースケース(API と業務画面を実装)26
エンティティ(汎用の一覧・詳細画面と CRUD API)36
状態遷移図7
ビジネスルール18
アクティビティ図 / シーケンス図18 / 26
テスト(単体42・API 51・E2E 2)95(全件合格)

1.1 設計の中心:勘定パターン

手順書の概念モデルのとおり、Fowler の勘定パターンで在庫を記録します。

勘定パターン本システム役割
Account保有品目×保有者×ロケーション(×ロット)の口座。期首在庫・安全在庫量を持つ
Entry移動予定/実績 × 受入/払出。数量は正、符号は受払区分
Transaction物流取引2件以上の移動を束ね、予実区分×品目ごとに数量合計ゼロを保証
時点 t の在庫量 = 期首在庫 + 受入実績 − 払出実績 + 受入予定の残数 − 払出予定の残数
  • 在庫量は保存しません。在庫量を書き換える API はなく、数量はすべて物流取引で変わります(BR-001・BR-002)。
  • 予定は実績で上書きせず、予実の対応付けで残数を求めます(BR-003)。訂正は逆仕訳です(BR-011)。
  • 棚入れ・商品移動・一括移動・関連付け・CSV取込は、すべて同じ格納チェックを通ります(BR-004)。

1.2 設計からの読み替え(実装上の判断)

箇所実装理由
受入実績の記録入荷検品で入荷検品場へ受入実績、棚入れは格納先へのロケーション移動検品済の商品だけが在庫になり(BR-006)、流通加工とクロスドックも在庫勘定の上で表せる
期首在庫期首日付の在庫調整取引(相手方:調整勘定)として記録在庫量を書き換えない(BR-001)。訂正は逆仕訳
商品状態品目(SKU)には持たず、シリアル管理品は個体、それ以外は保有の在庫状態区分で持つ。状態の変化は区分間の移動品目単位では SKU 全体が一斉に状態を変えてしまうため
引当の実行主体(手順書で未決)本システムに引当 API を置き、受注・出荷管理から呼ぶ在庫の数量を変えられるのを在庫管理に限るため

02はじめに

区分機能
入荷発注先による入荷予定の登録・分納、入荷連絡の記録、荷受け(パレット・ボックス・ラベル印刷)、入荷検品、流通加工、棚入れ、クロスドック、入荷進捗
保管ロケーションと商品の関連付け(最大格納数)、商品移動、ロケーション一括移動、CSV 取込、ロット・消費期限の管理と警告リスト
棚卸棚卸指示、実数の登録、差分リスト・再カウント、確定(差異を在庫調整として記録)
在庫在庫照会(見込在庫・過去時点の在庫)、要約在庫、CSV 出力、期首在庫・安全在庫の登録、CSV 一括取込、販売可能数の配分、引当ルール
管理予実(受注・出荷・発注・荷受・ロケーション移動・在庫の予定と実績、在庫推移)、発注依頼、マスタ管理、監査ログ(改ざん検知)
ロール(利用権限区分)主な仕事
倉庫担当者(WMS)入荷連絡の記録、荷受け・検品・流通加工・棚入れ、ロケーション管理、ロット・消費期限、棚卸の実数登録。担当倉庫の分だけを扱う
OMS利用者(OMS)期首在庫・安全在庫の登録、在庫 CSV 取込、販売可能数の配分、引当ルール
発注先(発注先)自社の注文書(PO)に対する入荷予定の登録・分納。自社分だけを参照
マネージャ・棚卸責任者(WMS)予実の確認、棚卸指示と確定、発注依頼、全倉庫の照会
クライアント(OMS)在庫の確認と発注依頼
システム管理者(WMS)マスタ・利用者の管理、監査ログ

03起動とログイン

# ① バックエンド(REST API / ポート 4000)
cd app/backend
npm install            # 初回のみ
cp .env.example .env   # 初回のみ(そのままでも動きます)
npm run dev            # 起動時に約60日分のデモデータを作成

# ② フロントエンド(画面 / ポート 5173)
cd app/frontend
npm install && npm run dev

ブラウザで http://localhost:5173/ を開きます。Docker の場合は docker compose up --build で http://localhost:8089/ に起動します。デモ用アカウントのパスワードはすべて Wms-Demo-2026! です。

ログイン画面
ログイン画面
  • パスワードを5回続けて間違えると、30分間ロックされます。多要素認証を有効にした環境では、認証アプリの確認コード(TOTP)も求められます。
  • 左のサイドバーはロールに応じて表示されるメニューが変わります(使えない機能は出ません)。画面タイトルの下にはその画面で守られている業務ルール、枠の見出しには設計書のユースケース番号が表示されます。

04業務の流れ

順担当操作
1クライアント・マネージャ在庫を確認し、必要なら発注を依頼する(発注管理が注文書を発行)
2発注先注文書(PO)に対して入荷予定を登録する。分けて納める場合は分納する
3倉庫担当者発注先からの入荷連絡(EDI・メール・電話)を記録する
4倉庫担当者荷受けを登録し、荷受票・検品ラベルを印刷する
5倉庫担当者ボックスごとに検品する(数量・ロット・期限、シリアル管理品はシリアル番号)
6倉庫担当者必要なら流通加工(タグ付け・セット組みなど)を記録する
7倉庫担当者格納先を読み取り、格納チェックを通して棚入れする。入荷待ちの注文があればクロスドックする
8倉庫担当者補充・再配置のため商品を移動する。ロットの期限を管理する
9マネージャ → 倉庫担当者 → マネージャ棚卸を指示・開始し、実数を登録して、差異を確定する
10マネージャ予実と在庫推移を確認し、安全在庫を割る見込みがあれば発注などを検討する

引当と出荷確定は、受注・出荷管理システムから API で行います(本システムの画面にはありません)。

05ダッシュボード

ロールに応じて、見える範囲の情報だけを表示します。安全在庫割れの品目、30日以内に安全在庫を割る見込の品目、未完了・遅延の入荷予定、期限切れ・期限間近のロット、棚卸の開始や入荷差異などの通知が並びます。

ダッシュボード(マネージャ)
ダッシュボード(マネージャ)

06在庫照会(UC-001〜003)

在庫量は保存している値ではなく、期首在庫と移動(受入・払出)から計算した値です(BR-001)。保有(品目×ロケーション×ロット×在庫状態)ごとに、在庫量・引当済・引当可能数・安全在庫量・最終移動を表示します。倉庫担当者には担当倉庫の在庫だけが表示されます。

在庫一覧
在庫一覧

「見込在庫の時点」に日付を入れると、その時点の在庫量の列が加わります。未来の日付では受入予定・払出予定を加えた見込み、過去の日付では移動の記録から再現した在庫です(UC-002)。

見込在庫(2週間後)
見込在庫(2週間後)
在庫状況一覧(要約在庫)
在庫状況一覧(要約在庫:品目別・倉庫別・保有者別)

07入荷予定(UC-008〜010, 015)

入荷予定・荷受け・検品・棚入れは、すべて注文書(PO)をキーにつながっています(BR-007)。

  • 入荷予定の登録(発注先) — 自社宛ての注文書を選び、入荷予定日・予定数量・ロット番号・期限を入力します。同じ注文書の予定の合計が発注数を超える場合は登録できません。発注先には自社の注文書・入荷予定だけが表示されます(BR-010)。
  • 入荷進捗 — 予定数・検品数・棚入れ数・状態と、遅延・差異・予定外の印を表示します。
  • 入荷連絡の記録(倉庫担当者) — EDI連絡・電子メール連絡・電話連絡を記録し、状態が「連絡受領」になります。
  • 分納・予定外入荷・取消 — 分割後の数量の合計は予定数と一致させます(BR-003)。取消は削除せず「取消」として残ります(BR-011)。
入荷予定の登録(発注先)
入荷予定の登録(発注先)
入荷予定の詳細と入荷連絡
入荷予定の詳細と入荷連絡

08荷受け・検品・流通加工・棚入れ(UC-011〜014)

ハンディターミナルでの利用を想定した画面で、読取 → 確認 → 確定の順に進めます。ボックスの状態は「入荷済 → チェック済 → 入庫済」と進みます。

8.1 荷受け

注文書のバーコードを読み取り、パレットID・箱ごとの入数・ロット番号・外観ダメージを入力して「荷受け登録」を押すと、荷受票とボックスごとの検品ラベルが表示され、印刷できます。

荷受票・検品ラベル
荷受票・検品ラベル

8.2 入荷検品

ボックスIDを読み取り、検品数量・ロット・期限・破損の有無、シリアル管理品はシリアル番号(検品数量と同じ数)を入力して「検品確定」を押します。

入荷検品
入荷検品
  • 検品数量が入荷検品場の在庫に「検品済」として入ります。検品前の商品は在庫に入らず、引当もされません(BR-006)。
  • ロットが未登録なら登録され、ラベルの期限がロットの消費期限の初期値になります(BR-018)。シリアル管理品は個体として登録されます(BR-017)。
  • 数量不足・過剰などの差異はボックスと入荷予定に印がつき、通知されます。

8.3 流通加工と棚入れ

棚入れの前に、チラシ挿入・包装・タグ付け・セット組み・セット解体などの流通加工を記録できます。完了すると在庫状態区分が「検品済」から「流通加工処理済」へ移ります。棚入れでは格納先を選んだ時点で格納チェックが行われ(BR-004)、最大格納数の超過・混載不可・保管方法の不一致などがあれば理由が表示されます。

流通加工と棚入れ
流通加工と棚入れ
棚入れする品目に入荷待ちの注文があると、注文番号と数量が表示されます。「クロスドック」を押すと、その注文に入荷検品場の在庫を引き当て、棚入れせずに出荷へまわします(BR-008)。

09ロケーション(UC-016〜019)

棚・パレット・ピッキングカートにアドレスを振り、どの商品がどこにあるかを管理します。関連付け・商品移動・一括移動・CSV取込は、すべて同じ格納チェックを通ります(BR-004)。

タブ内容
関連付け(UC-016)商品とロケーション、最大格納数を関連付ける。在庫量が最大格納数を超える場合や混載できない場合はエラー(BR-005)
商品移動(UC-017)移動元と移動先を選び、数量と理由で移動。払出と受入が1つの物流取引として記録される。引当可能数を超える数量は移動できない(BR-012)
一括移動(UC-018)棚単位・パレット単位で全品目をまとめて移動。1品目でも格納できなければ全体を中止
CSV取込(UC-019)行ごとに格納チェックを通して関連付け。エラーの行は行番号と理由を表示し、同じファイルを取り込み直しても結果は変わらない
商品移動
商品移動
ロケーション一括移動
ロケーション一括移動

10ロット・消費期限(UC-020)

ロットは品目×ロット番号で1つだけあり、消費期限の正しい値をロットが持ちます(BR-018)。在庫のあるロットを期限の近い順に表示し、在庫状態区分ごとの数量と、期限切れ(赤)・期限間近(黄)を示します。期限切れのロットは引当の対象になりません。

ロット一覧
ロット一覧
消費期限警告リスト・期限切れリスト
消費期限警告リスト・期限切れリスト(印刷・CSV出力)

11棚卸(UC-021〜023)

棚卸差異は、棚卸責任者(マネージャ)の承認を経て在庫調整の取引として記録します。在庫量を直接書き換えることはありません(BR-009)。棚卸指示の状態は「登録 → 開始 → 結果登録中 → 確定」と進みます。

  1. 棚卸指示(マネージャ): 倉庫・対象ゾーン・基準時点・実施期間を登録し、開始すると倉庫担当者に通知されます。
  2. 実数の登録(倉庫担当者): ロケーション・品目を読み取り、実数を入力します。差異(実数 − システム在庫量)が表示されます。
  3. 確定(マネージャ): 差分リストで差異を確認し、必要なら再カウントを指示してから確定します。
棚卸結果の登録
棚卸結果の登録
棚卸結果差分リスト
棚卸結果差分リスト
再カウント待ちの結果があると確定できません。自分がカウントした結果を自分で確定する場合は、確定理由が必須です(職務分掌)。

12予実(UC-024)

受注・出荷・発注・荷受・ロケーション移動・在庫の予定と実績を、品目ごとに「実績 / 予定」で並べて表示します(BR-014)。行を押すと、その品目の在庫推移(過去30日の実績と30日先までの見込)がグラフで表示され、安全在庫を割る見込みがあれば、その日付と対応を促すメッセージが出ます。

予実
予実
在庫推移
在庫推移(破線は見込、点線は安全在庫量)

13在庫計画(UC-004〜007)

タブ内容
期首在庫・安全在庫(UC-004)期首在庫は保有の値を直接書かず、期首日付の在庫調整取引として記録。すでにある場合は逆仕訳してから記録し直す
在庫CSV一括取込(UC-005)行ごとに検証し、エラーの行は行番号と理由を表示。同じ行は二重に取り込まない(BR-015)
販売可能数の配分(UC-006)販売先ごとの配分比率(合計100%)で引当可能数を配分し、受注管理へ提供。配分比率は権限外には「***」で表示
引当ルール(UC-007)先入先出・先期限先出・ロット指定・ピッキング棚優先・同一ゾーン優先。対象が具体的なルールほど優先
販売可能数の配分
販売可能数の配分
引当ルール
引当ルール

14在庫確認・発注依頼(UC-026)

品目を選ぶと引当可能数の合計と安全在庫量、発注が必要かどうかの目安が表示されます。数量・入荷倉庫などを入れて「発注を依頼する」を押すと、発注管理が注文書を発行し、その番号が表示されます。発行された注文書は、発注先が入荷予定を登録するときに選べるようになります。

在庫確認・発注依頼
在庫確認・発注依頼

15データ(全エンティティ)と監査ログ

設計モデルのすべてのエンティティを分類ごとに一覧できます。詳細画面では参照先へのリンクと、このデータを参照している関連データ(ドリルダウン)の件数を表示します。マスタ・利用者の登録・編集はシステム管理者だけが行い、マスタは削除せず無効化します(BR-011)。

個体の詳細(シリアル管理品)
個体の詳細(シリアル管理品)

物流取引・在庫調整・棚卸確定・引当と配分の変更・マスタ変更・権限変更・CSV取込・ログインなどを、誰が・いつ・何を・なぜ行ったかとともに追記専用で記録します(BR-016)。「改ざん検知」でハッシュの連鎖を最初から検証できます。

監査ログ
監査ログ

16業務ルールと状態遷移

16.1 業務ルール

番号ルール画面での現れ方
BR-001在庫量は期首在庫と移動から計算する値で、直接書き換えない在庫量を入力する画面はない。期首在庫も取引として記録
BR-002物流取引の移動の数量の合計はゼロ移動・棚入れ・加工は、必ず払出と受入の組で記録
BR-003予定を実績で上書きせず、対応付けて残す予実・入荷進捗で予定と実績・予定残を並べて見られる
BR-004 / 005格納はすべて同じ格納チェックを通り、最大格納数を超えない棚入れ・移動・一括移動・関連付け・CSV取込で同じ理由のエラー
BR-006検品前の商品は棚入れ・引当しない検品前のボックスは棚入れ・クロスドック・加工完了ができない
BR-007入荷は注文書(PO)をキーにトラッキング入荷予定・荷受け・検品・棚入れがすべて PO でつながる
BR-008入荷待ちの注文はクロスドック棚入れ画面の「入荷待ちの注文があります」
BR-009棚卸差異は棚卸責任者が確定し、在庫調整として記録確定はマネージャのみ。自分で数えた結果の確定には理由が必要
BR-010利用権限区分ごとに使える機能と見える範囲を制御メニュー・データの出し分け。発注先は自社分のみ
BR-011記録は削除・上書きせず、訂正は逆の移動、取消は取消状態取消・無効化はできても削除はできない
BR-012同時操作でも引当可能数・格納上限を超えない移動数量が引当可能数を超えるとエラー
BR-013引当は払出予定、出荷確定で払出実績在庫一覧の「引当済」「引当可能数」
BR-014 / 015予定と実績を予実算 I/F で通知、CSV 取込は冪等予実画面、取込結果の行番号と理由
BR-016重要な操作を追記専用で記録監査ログと改ざん検知
BR-017 / 018商品の状態は個体・在庫状態区分で持ち、ロットは品目×ロット番号で一意在庫照会の「在庫状態」、ロットでの期限更新

16.2 主な状態遷移

対象状態の流れ
入荷予定予定 → 連絡受領 → 荷受中 → 検品済 → 一部完了/完了(予定・連絡受領から取消)
入荷ボックス入荷済(荷受け)→ チェック済(検品)→ 入庫済(棚入れ・クロスドック)
個体(シリアル管理品)検品済 → 流通加工処理済 → 加工処理済 → 出荷済 → 返品済 →(再検品で)検品済
棚卸指示登録 → 開始 → 結果登録中 → 確定(登録・開始の間はキャンセル可)
引当引当済(払出予定)→ 出荷済(払出実績)。出荷前なら解除

17品質とトレーサビリティ

17.1 テスト

種別対象件数
単体在庫勘定・格納チェック・状態遷移・認証42
APIユースケース API(UC-001〜026)・権限と参照範囲・汎用 CRUD・共通51
E2E(API レベル)発注依頼 → 入荷 → 出荷 → 棚卸 → 予実の通し業務、デモデータの健全性(全取引が保存則を満たすこと)2

95件すべて合格しています。

17.2 トレーサビリティ行列

追跡レベルカバレッジ
業務シナリオ(役割の振る舞い)→ アクティビティ100%(25/25)
アクティビティのアクション → ユースケース100%(85/85)
ユースケース → エンティティ / シーケンス図 / セキュリティ各 100%(26/26)
ユースケース → API / バックエンドコード / テスト各 100%(26/26)
ユースケース → 画面96.2%(25/26。UC-025 は隣接システム向けの API 専用)
ビジネスルール → テスト100%(18/18)
End-to-End 完全追跡100%(26/26)

18制約事項

  • データはメモリ上に保持します。バックエンドを再起動すると、デモデータ(約60日分)を作り直します。
  • 引当・出荷確定・予実の通知は、受注・出荷管理システムから API(サービスアカウント)で行います。発注の登録・実施は発注管理システムが行い、デモではスタブで代用しています。
  • ハンディターミナル・インテリジェントカート・ラベルプリンタとの機器連携は、画面の読取欄と印刷までです。
  • 棚卸でシリアル管理品が多かった場合は、個体を特定できないため数量だけを調整します(シリアル番号の照合は未実装)。
  • ブラウザでの E2E テストは未実施です(E2E は API レベル)。多要素認証の登録画面はなく、API で登録します。
  • 性能・可用性の目標値は、元の手順書で未整理のため設定していません。

本マニュアルは uml-workflow-v3 で生成したアプリケーションの実装に基づいています。