Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@
改訂113: 2026-09-23(3.8節:生産計画をマスタCSVの種別 `production-plans` として出力・取込できるようにした(PLAN-04)。キーは製造日・品目コード・工程コード・作業区コード(空欄も1つのキー)で上書きし、ZIPの一括入出力にも含める。参照先・数量・キーの判定を `ProductionPlanPolicy` に移し、単票APIとCSV取込の両方から呼ぶ。取込の権限は単票と同じ `ProductionManage`)
改訂114: 2026-09-23(3.8節・5.2節:同じ製造日・品目・工程で、作業区の範囲が重なる生産計画(作業区なしと作業区あり、上位の段と配下の段)を併存させないようにした。予実は作業区違いの計画を合算するため、全体の計画と内訳の計画が並ぶと二重に数えていた。兄弟の作業区どうしは併存できる。判定は `ProductionPlanPolicy` に置き、単票API(409)とCSV取込(既存との間・ファイル内とも行エラー)の両方から呼ぶ。既に重なって登録されている計画はそのまま残る)
改訂115: 2026-09-23(3.8節・7.2節:生産計画をマスタの一括ZIPの取込・出力から外した(改訂113で含めていた)。生産計画はマスタではなく日々増える業務データで、全期間がZIPに入り、マスタを別環境へ移すと過去の計画まで付いていったため。取込の仕組み(キーで上書き)は引き続きマスタCSVのものを使う。計画のCSV出力は全件をやめ、一覧と同じ絞り込みの `api/production-plans/csv` を追加した。あわせて、3か月分の実績サンプルと同じ期間の生産計画のサンプル `samples/production-plans/` を追加し(`scripts/New-SampleBulkActuals.ps1` が乱数を使わず生成。実績の内容は変えない)、リリースに `samples-production-plans.csv` として添付する。利用者向けガイド(生産管理・ロールと権限など)に生産計画・予実の操作を追記)
改訂116: 2026-09-23(3.8節:実績CSVに出荷指示 `shipping-orders`・出荷判定 `shipment-judgments`・出荷実行 `shipments` を追加した。サンプルの実績で出荷だけが画面操作で、製造から出荷までをCSVだけではたどれなかった。判定と出荷で取込の権限が違うため3種別に分ける。出荷判定の登録・承認を `ShipmentJudgmentsController` から `ShipmentJudgmentService` へ移し、単票APIとCSV取込の両方から呼ぶ。出荷指示は後続のCSVから指すため出荷番号の手入力を許す(`SH〜` は自動採番用として拒否)。サンプル `samples/actual-csv/13〜15` を追加)
参考: みんなのMES(min-MES) https://min-mes.com/ / OSS: https://github.com/mihatama/open-mes-project

---
Expand Down Expand Up @@ -324,7 +325,7 @@ AGV/AMR連携(D-50-20-02)・リサイクル管理(D-50-30-02)・VMI/外
- 監査ログ(実績訂正・検査訂正・マスタ変更等の変更履歴。7.6節)
- **マスタのCSV一括入出力**:各マスタ(品目/MBOM/工順/工程/作業区/設備/設備の保全部品/治工具/ロケーション/検査項目・基準/**検査機・測定器**/工程管理項目/チェックリスト/作業手順書/勤務シフト/スキル・資格/ユーザー/ユーザーのスキル資格)のCSV出力・テンプレート出力・一括取込。取込はコード(自然キー)によるupsertで、他マスタはコードで参照する。文字コードはUTF-8/Shift_JISを自動判別し、出力はExcel互換(UTF-8 BOM+CRLF)。行単位で検証し、**1行でもエラーがあれば全件ロールバック**して行番号付きのエラー一覧を返す。反映せず検証のみ実行するモードを持つ。**参照されている状態のマスタを無効化できないという制約は、単票APIと同じ判定をCSV取込にも通す**(工順から参照中の作業手順書、在籍中の従業員が所属する直など)。片方にしか書かないとCSVから迂回できてしまうため、判定はポリシーへ集約する。なお**マスタの無効化は各マスタ画面から、再有効化はCSV取込の `IsActive` 列から**行う(全マスタ共通。画面に再有効化の導線は持たせていない)
- **生産計画(`production-plans`)は取込の仕組みだけをこれに乗せる**。生産計画はマスタではなく日付を持つ業務データだが、改訂のたびに同じ計画を上書きしたいので、常に新規登録する実績CSVではなくキーで上書きするマスタCSVの取込を使う(A-30-10-01)。キーは `BusinessDate, ProductCode, ProcessCode, WorkCenterCode(任意)` で、同じキーなら計画数量(と `Note` 列があれば備考)を上書きし、無ければ追加する。**`WorkCenterCode` が空の行も1つのキーとして扱い**、同じ製造日・品目・工程の作業区なしの計画を上書きする(二重に追加しない)。計画数量は0以上。ファイル内で同じキーが複数行にあればエラー。取り込んだ後に同じ製造日・品目・工程で作業区の範囲が重なる行(既存の計画との間・ファイル内とも)もエラー。数量とキーの判定は単票API(`api/production-plans`)と共通の `ProductionPlanPolicy` に置く。取込の権限は単票の登録と同じ `ProductionManage`(種別の `WriteRoles`)。取り込み直しても変わらない行は更新日時を動かさない。**マスタではないので一括ZIPの取込・出力には含めない**(日々増えるデータを、マスタの移行や全件出力に巻き込まないため。ZIPに入っていれば取込を拒む)。取込は生産計画画面の計画登録タブから1ファイルずつ行い、出力は一覧と同じ絞り込み(製造日の期間・品目・工程・作業区)の `api/production-plans/csv` で行う
- **実績のCSV一括取込**:試験・移行・教育用に、実績(取引データ)をCSVで一括登録する(`api/actuals/csv/{kind}`。テンプレート出力と取込。対応種別は受入 `receiving`・製造指図 `manufacturing-orders`・段取り実績 `setup-records`・チェックリスト実施 `checklist-records`・部材投入 `consumptions`・生産実績 `production-records`・製造条件データ `data-records`・検査 `inspections`・作業時間 `work-time-records`・製造トラブル報告 `trouble-reports`・設備稼働記録 `equipment-logs`)。マスタCSVと同じく**1行でもエラーがあれば全件ロールバック**し、行番号付きのエラー一覧を返し、検証のみのモードを持つ。マスタCSVとの違いは次のとおり。①**取込は常に新規登録**で既存の実績を更新しない(実績の訂正は理由付きの訂正機能で行う)。②行ごとに**単票APIと同じ業務サービスを通す**(受入は `ReceivingService`、製造指図は `ManufacturingOrderService`、作業指示の実行記録は `WorkOrderExecutionService`、検査は `InspectionService`、作業時間・トラブル報告は `ShopFloorReportService`)——実績は在庫・ロット・状態履歴を連鎖して動かすため、行をエンティティへ直接写すと判定や監査ログが迂回される。③取込の権限は**種別ごとに単票APIと同じロールグループ**(受入は在庫・物流オペレーション)。④行は保存しながら進めるので、後の行は前の行の結果(登録済みロット番号の重複判定など)を前提にでき、検証のみも実際に登録してからロールバックする。他のマスタ・実績はIDではなくコード・番号で参照する。⑤**作業指示は「指図番号+工程順序」で指す**。自動採番の指図番号は取込前に分からないため、製造指図CSVに限り指図番号の手入力を許す(自動採番の形式 `MO〜` と重なる番号は、採番テーブルの連番と後で衝突するため拒否)。製造指図CSVは1行で登録・承認・工程展開まで進められるが、承認は省略できない(展開は承認済みの指図だけ)。⑥**実行記録の記録者は取込を実行したユーザー**とし、作業者を指定する列は持たない(他人名義の実績を作れると、記録者に意味が無くなる)。投入ロットはロット番号で、日時はオフセットの無い値を工場の時刻として読む。生産実績の直は開始日時で決まる。⑦**検査CSVは `InspectionKey` が同じ行を1件の検査指示にまとめる**。キーはファイルの中だけの名前でDBに残さない(検査指示番号は自動採番のままにし、後続のCSVから検査指示を指す必要も無いため)。まとまりに含まれる検査項目がその指示の対象になり、`Judge=true` なら実績に続けて総合判定する(ロットの状態反映・不合格時の不適合起票も単票APIと同じ)
- **実績のCSV一括取込**:試験・移行・教育用に、実績(取引データ)をCSVで一括登録する(`api/actuals/csv/{kind}`。テンプレート出力と取込。対応種別は受入 `receiving`・製造指図 `manufacturing-orders`・段取り実績 `setup-records`・チェックリスト実施 `checklist-records`・部材投入 `consumptions`・生産実績 `production-records`・製造条件データ `data-records`・検査 `inspections`・作業時間 `work-time-records`・製造トラブル報告 `trouble-reports`・設備稼働記録 `equipment-logs`・出荷指示 `shipping-orders`・出荷判定 `shipment-judgments`・出荷実行 `shipments`)。マスタCSVと同じく**1行でもエラーがあれば全件ロールバック**し、行番号付きのエラー一覧を返し、検証のみのモードを持つ。マスタCSVとの違いは次のとおり。①**取込は常に新規登録**で既存の実績を更新しない(実績の訂正は理由付きの訂正機能で行う)。②行ごとに**単票APIと同じ業務サービスを通す**(受入は `ReceivingService`、製造指図は `ManufacturingOrderService`、作業指示の実行記録は `WorkOrderExecutionService`、検査は `InspectionService`、作業時間・トラブル報告は `ShopFloorReportService`、出荷指示・出荷実行は `ShippingService`、出荷判定は `ShipmentJudgmentService`)——実績は在庫・ロット・状態履歴を連鎖して動かすため、行をエンティティへ直接写すと判定や監査ログが迂回される。③取込の権限は**種別ごとに単票APIと同じロールグループ**(受入は在庫・物流オペレーション)。④行は保存しながら進めるので、後の行は前の行の結果(登録済みロット番号の重複判定など)を前提にでき、検証のみも実際に登録してからロールバックする。他のマスタ・実績はIDではなくコード・番号で参照する。⑤**作業指示は「指図番号+工程順序」で指す**。自動採番の指図番号は取込前に分からないため、製造指図CSVに限り指図番号の手入力を許す(自動採番の形式 `MO〜` と重なる番号は、採番テーブルの連番と後で衝突するため拒否)。製造指図CSVは1行で登録・承認・工程展開まで進められるが、承認は省略できない(展開は承認済みの指図だけ)。⑥**実行記録の記録者は取込を実行したユーザー**とし、作業者を指定する列は持たない(他人名義の実績を作れると、記録者に意味が無くなる)。投入ロットはロット番号で、日時はオフセットの無い値を工場の時刻として読む。生産実績の直は開始日時で決まる。⑦**検査CSVは `InspectionKey` が同じ行を1件の検査指示にまとめる**。キーはファイルの中だけの名前でDBに残さない(検査指示番号は自動採番のままにし、後続のCSVから検査指示を指す必要も無いため)。まとまりに含まれる検査項目がその指示の対象になり、`Judge=true` なら実績に続けて総合判定する(ロットの状態反映・不合格時の不適合起票も単票APIと同じ)。⑧**出荷は指示・判定・実行の3種別に分ける**(判定は品質保証、指示と実行は物流の権限で、1種別にまとめると③を満たせない)。出荷指示CSVは出荷番号が同じ行を1件の指示(1行=1品目の明細。同じ品目を2行書けない)にまとめ、後続の判定・実行CSVから番号で指せるよう**出荷番号を必須の手入力**とする(⑤と同じ理由で自動採番の形式 `SH〜` と重なる番号は拒否)。出荷判定CSVは1行=1件の判定で、`Approve=true` なら続けて承認する。出荷実行CSVは出荷番号が同じ行を1回の出荷にまとめ、**承認済みの判定(可・特採)とロットの使用可否は単票APIと同じく出荷実行の処理で判定する**(判定の無い指示を含むファイルは全件取り消し)
- **CSVのZIP一括取込・一括出力**:複数のCSVをまとめたZIPを1回で取り込む(マスタは `POST api/masters/csv/bundle`、実績は `POST api/actuals/csv/bundle`)。**ファイル名の昇順に取り込み、種別はファイル名の最初の「_」より後ろで決める**(`01_work-centers.csv` → `work-centers`。同じ種別を番号違いで複数入れてよい)。CSV以外のファイル(README.md等)は無視する。**全ファイルを1つのトランザクションで処理し、どれか1ファイルでもエラーがあれば全ファイルを取り消す**(後のファイルが前のファイルの登録結果を参照するのでファイルごとに保存はするが、途中まで反映された状態が残るとどこから取り込み直せばよいか分からなくなるため)。エラーが出たファイルより後は処理せず、未処理として名前を返す。**マスタと実績が混ざったZIPは受け付けない**(取込の権限も対象画面も異なるため、別のZIPにする)。取込には**ZIPに含まれる全種別の取込権限**が要り、1種別でも権限が無ければ何も取り込まない。種別が分からないファイルは取り込む前に拒否する。ZIP爆弾対策として、CSVの数・1ファイルと合計の展開後サイズに上限を設け、読みながら数えて超えたら打ち切る。一括出力(`GET api/masters/csv/bundle`)は全マスタを取り込む順の番号付きファイル名でZIPにし、そのまま一括取込に使える(参照を絞っている種別は権限が無ければ含めない。ユーザーはパスワードを出力しないため、新しいDBへ移すときはユーザー系のファイルに初期パスワードを書き足す)。実績の一括出力は持たない
- バーコード/QRスキャン共通コンポーネント(ブラウザのカメラAPI or USB HIDリーダー入力)

Expand Down
4 changes: 2 additions & 2 deletions docs-dev/CodeMap.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
| 受入・受入ロット採番 | D-10-10 | `ReceivingController.cs` `api/receiving` | `Core/Entities/Inventory.cs`: InventoryStock / InventoryTransaction<br>Production.cs: Lot | `/receiving` `Receiving.razor` | `Tests/InventoryTests.cs` |
| 在庫オペレーション(照会・移動・調整・分割/統合・廃棄・期限) | D-10-30 / D-30-10 / D-40-40 | `InventoryController.cs` `api/inventory`<br>更新系(移動・調整・ステータス変更・分割・統合・振替・廃棄・返品・払出戻し)は `Api/Services/LotOperationService.cs`<br>在庫数量の増減そのものは `Api/Services/InventoryService.cs` | Inventory.cs: InventoryStock / InventoryTransaction | `/inventory` `Inventory.razor` | `Tests/InventoryTests.cs` |
| 出庫・ピッキング・工程払出(FEFO自動引当) | D-20-10 / D-20-20 | `PickingOrdersController.cs` `api/picking-orders`<br>作成・実行・取消は `Api/Services/PickingService.cs` | Inventory.cs: PickingOrder / PickingLine | `/picking` `Picking.razor` | `Tests/InventoryTests.cs` |
| 出荷(出荷判定ゲート付き) | D-40 / H-10-10 | `ShippingOrdersController.cs` `api/shipping-orders`<br>作成・出荷実行・取消は `Api/Services/ShippingService.cs` | Inventory.cs: ShippingOrder / ShippingLine | `/shipping` `Shipping.razor`<br>`/print/shipping/{id}` `Print/ShippingSlip.razor` | `Tests/InventoryTests.cs` |
| 出荷(出荷判定ゲート付き) | D-40 / H-10-10 | `ShippingOrdersController.cs` `api/shipping-orders`<br>作成・出荷実行・取消は `Api/Services/ShippingService.cs`<br>CSV:実績CSVの種別 `shipping-orders`・`shipments`(`ActualCsvService.Shipping.cs`。出荷番号は手入力必須、`SH〜` は拒否)。サンプルは `samples/actual-csv/13`〜`15` | Inventory.cs: ShippingOrder / ShippingLine | `/shipping` `Shipping.razor`<br>`/print/shipping/{id}` `Print/ShippingSlip.razor` | `Tests/InventoryTests.cs` |
| 棚卸(スナップショット→実棚→差異→確定) | D-50-10 | `StocktakesController.cs` `api/stocktakes`<br>作成・実棚登録・確定・取消は `Api/Services/StocktakeService.cs` | Inventory.cs: Stocktake / StocktakeLine | `/stocktakes` `Stocktakes.razor`<br>`/print/stocktake/{id}` `Print/StocktakeSheet.razor` | `Tests/InventoryTests.cs` |
| ロケーション・棚番管理 | D-50-20-01 | `LocationsController.cs` `api/locations` | Masters.cs: Location(`WorkCenterId`=所属する資源。**段は問わない**) | `/masters` `Masters/LocationsTab.razor` | `Tests/MasterTests.cs` |
| 倉庫業務進捗管理(**受入は対象外**。指示を持たないため) | D-50-30-07 | `InventoryController.cs` `api/inventory/warehouse-progress?from=&to=`(出庫ピッキング・出荷・在庫移動・棚卸。取消は数えない。期間は**製造日の半開区間**) | 新規エンティティなし(既存の指示を数え直す) | `/warehouse-operations` `Web/Pages/WarehouseOperations.razor` | `Tests/InventoryTests.cs` |
Expand Down Expand Up @@ -93,7 +93,7 @@

| 業務 | MES No | API | エンティティ | 画面 | テスト |
|:--|:--|:--|:--|:--|:--|
| 出荷判定(可/保留/特採・単段階承認) | H-10-10 | `ShipmentJudgmentsController.cs` `api/shipment-judgments` | Quality.cs: ShipmentJudgment | `/shipment-judgments` `ShipmentJudgments.razor`<br>`/print/shipment-judgment/{id}` `Print/ShipmentJudgmentDoc.razor` | `Tests/QualityTests.cs`<br>出荷ゲートは `InventoryTests.cs` |
| 出荷判定(可/保留/特採・単段階承認) | H-10-10 | `ShipmentJudgmentsController.cs` `api/shipment-judgments`<br>登録・承認は `Api/Services/ShipmentJudgmentService.cs`(単票APIと実績CSVの種別 `shipment-judgments` で共通) | Quality.cs: ShipmentJudgment | `/shipment-judgments` `ShipmentJudgments.razor`<br>`/print/shipment-judgment/{id}` `Print/ShipmentJudgmentDoc.razor` | `Tests/QualityTests.cs`<br>出荷ゲートは `InventoryTests.cs` |
| ロットトレーサビリティ(前方・後方追跡) | H-30-10 | `TraceabilityController.cs` `api/traceability`(`/history` は製造・検査・在庫・状態・訂正・**設備稼働**の履歴を返す。製造行には作業者と**直**を並べる。文字列の組み立てはSQLに載せず取り出してから行う) | Production.cs: Lot<br>Execution.cs: MaterialConsumption<br>Maintenance.cs: EquipmentLog | `/traceability` `Traceability.razor`<br>`Web/Shared/TraceTree.razor` | `Tests/QualityTests.cs` |

---
Expand Down
Binary file modified docs/assets/walkthrough/shipment-judgments.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/assets/walkthrough/shipping.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading