Fab Forward Dev/

DDD ドキュメント

集約: 製作指示・作業日報 / Aggregate: Internal Production

バウンデッドコンテキスト: bc-production

ProductionInstruction(製作指示)

ProductionInstruction (集約ルート)
├── → SalesOrder  (受注への参照)
└── WorkReport[]  (作業日報 — 子エンティティ)
プロパティ説明
productionOrderNumberstring指示番号 (SIJI_NO)
orderNumberstring紐付く受注番号
productionStatusProductionStatus指示状況
productionTypeProductionType指示区分
departmentCodestring指示先部署

不変条件 (Invariants)

  • 1 つの受注に対して複数の製作指示が存在可能 (工程別)
  • 作業日報は製作指示の子エンティティ (指示なしの日報は禁止)
  • 製作指示の完了は全日報の作業時間合計で判定しない (手動完了)
  • 完了済み製作指示への日報追加は禁止
  • **工事完了ロック**: 受注の完了日が設定済みの場合、着手・完了・実績削除・指示取消のすべての操作を無効化
  • **取消は完了前のみ**: 完了済み (ステータス >= 完了) の製作指示は取消不可
  • **残数量**: `remainingQty = orderedQty - producedQty` (0 未満にならない)
  • **完了時に累計実績を記録**: `totalProduced = 今回数量 + 前回までの累計`、最終単価・最終日を記録

WorkReport(作業日報)

プロパティ説明
productionOrderNumberstring親の指示番号
employeeCodestring作業者
workDateDate作業日
workStartTimeTime開始時間
workEndTimeTime終了時間
workHoursnumber作業時間 (時間)
amountMoney労務費 (workHours × Employee.chargeRate)

不変条件 (Invariants)

  • `workHours` = 休憩控除済み作業時間。算出: ①深夜跨ぎ時は終了時刻に+24h、②rawMinutes = end - start、③テナント設定の各休憩区間との重複分を控除、④netMinutes = rawMinutes - breakOverlap (0の場合はrawMinutesにフォールバック)、⑤小数時間に変換 (分→時は小数2桁で round-half-up)
  • `amount` = `workHours` × 作業者の時間単価 (社員マスタの chargeRate から自動取得)。ただし更新モード時は保存済み単価が 0 でなければ保存済み単価を使用 (過去の単価レートを保全)
  • 同一作業者の同一日の作業時間合計は 24h を超えない

入力検証

検証条件
工事完了チェック受注の完了日が空であること
担当者必須作業者が選択されていること
指示番号必須空でないこと
作業日必須空でないこと
工程必須工程コードが選択されていること
作業区分必須作業区分 (着手/完了) が入力されていること
指示存在チェック入力された指示番号に対応する製作指示が存在すること

自動入力

  • **フォーム表示時**: 担当者=ログインユーザー、日付=当日
  • **受注番号入力時**: 受注名・納期・得意先名を自動表示
  • **指示番号入力時**: 品名・型式・材質・仕入先・単位・残数量・製作実績数量を自動入力
  • **作業単価**: 担当者の社員マスタの時間単価 (CHARGE レート) を自動取得

コマンド

コマンドガード条件アクション
着手 (Start)入力検証通過 + 作業区分=着手実績を保存、ステータス→着手済
完了 (Complete)工事完了チェック + 入力検証通過 + 作業区分=完了実績を保存、ステータス→完了済、累計実績・最終単価・最終日を記録
実績削除工事完了チェック + 更新モード実績レコードを論理削除
指示取消工事完了チェック + ステータス < 完了済ステータス→取消、取消フラグON

ライフサイクル (State Machine)