チョコレート卸向け納品計画システム 業務フロー設計
全体フロー図
[1. 発注受付] → [2. 在庫確認] → [3. 自動計算] → [4. 計画確認] → [5. 納品実行]
↓ ↓ ↓ ↓ ↓
pending 在庫チェック processing 計画調整 completed
在庫減算
1. 発注受付フロー
1.1 デパートからの発注
画面: 発注管理 (/orders)
アクション:
- 「新規発注」ボタンをクリック
- 発注情報を入力
- デパート名(選択式)
- 商品(選択式)
- 数量(個数)
- 希望納品日
- 「登録」ボタンで発注を追加
データ更新:
Order {
id: 自動採番
department: 入力値
productCode: 入力値
quantity: 入力値
desiredDeliveryDate: 入力値
status: "pending" // 初期ステータス
createdAt: 現在時刻
}
画面表示:
- 発注一覧に新規発注が追加される
- ステータスは「処理待ち」(黄色バッジ)
2. 在庫確認フロー
2.1 在庫の確認
画面: 在庫管理 (/inventory)
確認項目:
- 対象商品の在庫数
- 各ロットの賞味期限
- 発注数量に対する過不足
在庫不足の場合:
- 「在庫追加」ボタンで新規在庫を登録
- 入力項目:
- 商品(選択式)
- ロット番号
- 賞味期限
- ケース数
データ更新:
Inventory {
id: 自動採番
productCode: 入力値
lotNumber: 入力値
expiryDate: 入力値
cases: 入力値
createdAt: 現在時刻
}
3. 自動計算フロー
3.1 計算の実行
画面: 自動計算 (/calculate)
実行条件:
- status = “pending” の発注が1件以上存在
計算処理:
ステップ1: 在庫確認
- 発注商品ごとに在庫を取得
- 必要ケース数を算出
必要ケース数 = 発注数量 ÷ ケース入数(切り上げ)
ステップ2: 賞味期限チェック
- 各ロットの賞味期限を確認
- ルール「納品時30日以上」を適用
納品可能 = (賞味期限 - 納品日) >= 30日
ステップ3: 納品日計算
- 希望納品日を基準
- デパート別ルールを適用
- 高島屋: 火曜・金曜のみ
- 伊勢丹: 月曜・木曜のみ
- 三越: 水曜・土曜のみ
- 最も近い納品可能日を選定
ステップ4: ロット割り当て
- ルール「賞味期限優先」を適用
- 賞味期限が近いロットから使用
- ルール「1回最大20ケース」を適用
- 20ケースを超える場合は複数回に分割
ステップ5: 計画生成
DeliveryPlan {
id: 自動採番
deliveryDate: 計算された納品日
department: 発注のデパート名
productCode: 発注の商品コード
productName: 商品名
cases: 割り当てケース数
lotNumber: 使用ロット
expiryDate: ロットの賞味期限
warning: 警告メッセージ(該当時)
orderId: 元の発注ID
}
発注ステータス更新:
Order.status = "pending" → "processing"
計算ログ出力: 各ステップで処理内容をログに記録
4. 納品計画確認フロー
4.1 計画の確認
画面: 納品計画 (/delivery-plan)
表示内容:
- 納品日別の計画一覧
- 使用ロットと賞味期限
- 警告がある場合は目立つ表示
4.2 計画の調整(将来機能)
- 納品日の変更
- 使用ロットの変更
- ケース数の調整
4.3 計画の承認
アクション:
- 内容を確認
- 「計画を承認」ボタンをクリック
- 確認ダイアログで最終確認
データ更新:
DeliveryPlan.status = "draft" → "approved"
5. 納品実行フロー
5.1 納品の実行
画面: 納品計画 (/delivery-plan)
アクション:
- 「納品実行」ボタンをクリック
- 実行確認ダイアログ
処理内容:
在庫の減算
計画の各行に対して:
対象ロットのケース数 -= 計画のケース数
if (ロットのケース数 == 0) {
ロットを削除
}
発注ステータス更新
Order.status = "processing" → "completed"
Order.completedAt = 現在時刻
納品実績の記録
DeliveryHistory {
id: 自動採番
planId: 納品計画ID
orderId: 発注ID
deliveryDate: 納品日
actualDeliveryDate: 実際の納品日(通常は計画と同じ)
cases: 納品ケース数
executedAt: 実行時刻
executedBy: 実行者(将来の認証機能で)
}
5.2 Excel出力
アクション:
- 「Excel出力」ボタンで納品指示書を生成
- 含まれる情報:
- 納品日
- デパート名・住所
- 商品詳細
- ケース数・個数
- ロット番号
- 賞味期限
ステータス遷移図
発注ステータス
[pending]
↓
自動計算実行
↓
[processing]
↓
納品実行
↓
[completed]
納品計画ステータス(将来機能)
[draft]
↓
計画承認
↓
[approved]
↓
納品実行
↓
[delivered]
データ連携
発注 → 計算 → 計画 → 実績
Order (発注)
↓ 参照
DeliveryPlan (計画)
↓ 参照
DeliveryHistory (実績)
Inventory (在庫)
↓ 参照
DeliveryPlan (計画)
↓ 減算
Inventory (在庫更新)
エラーハンドリング
在庫不足エラー
発生タイミング: 自動計算時
条件:
総在庫ケース数 < 必要ケース数
対応:
- エラーログを表示
- 不足ケース数を明示
- 計算を中断
- 在庫追加を促す
賞味期限エラー
発生タイミング: 自動計算時
条件:
すべてのロットで (賞味期限 - 納品日) < 30日
対応:
- 警告ログを表示
- 該当ロットを明示
- 計算は続行(警告付き計画を生成)
納品日エラー
発生タイミング: 自動計算時
条件:
希望納品日から1ヶ月以内に納品可能日が見つからない
対応:
- エラーログを表示
- デパートの納品可能曜日を明示
- 代替日の提案
画面遷移パターン
通常フロー
発注管理 → 在庫管理 → 自動計算 → 納品計画
↑ ↓
└──────────── Excel出力 ─────────────┘
エラー時フロー
自動計算 → エラー検出 → 在庫管理(在庫追加)→ 自動計算(再実行)
業務ルール詳細
1. 賞味期限優先ルール
ロットを賞味期限の昇順(古い順)でソート
古いロットから順に割り当て
2. 納品時30日以上ルール
if ((expiryDate - deliveryDate) < 30) {
該当ロットをスキップ
警告を記録
}
3. デパート別納品曜日ルール
const deliveryRules = {
"高島屋": [2, 5], // 火曜・金曜
"伊勢丹": [1, 4], // 月曜・木曜
"三越": [3, 6], // 水曜・土曜
"大丸": [1, 3, 5], // 月水金
}
希望納品日から最も近い納品可能曜日を選定
4. 1回最大20ケースルール
if (必要ケース数 > 20) {
複数の納品計画に分割
分割数 = Math.ceil(必要ケース数 / 20)
各回の納品日は納品可能曜日で分散
}
将来の拡張機能
フェーズ2
- 発注の編集・キャンセル機能
- 納品計画の手動調整
- 複数倉庫対応
フェーズ3
- 配送業者との連携
- 配送トラッキング
- 自動発注アラート
フェーズ4
- AI需要予測
- 最適在庫レベル提案
- 季節変動分析
文書終わり