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
20 changes: 19 additions & 1 deletion Spec.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions docs-dev/CodeMap.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@
|:--|:--|:--|:--|:--|:--|
| 工程管理項目マスタ(指示値・許容範囲。版数付き) | B-30-30-04 | `ControlItemsController.cs` `api/control-items`<br>展開時のスナップショット取得は `WorkOrdersController.ControlItems` `api/work-orders/{id}/control-items` | Masters.cs: ControlItem(対象品目・工程は持たない)/ **RoutingControlItem**(工順の工程への紐付け。展開はこの紐付けどおり。紐付け中は無効化できない:`MasterDeactivationPolicy`)<br>Production.cs: **WorkOrderControlItem**(展開時点の指示値。判定・表示はこちらを使い、マスタ現在値を参照しない) | `/masters` `Masters/ControlItemsTab.razor`<br>工順への紐付けは `Masters/Products/ProductRoutingEditor.razor` | `Tests/MasterTests.cs` / `MasterCsvTests.cs` / `ProductionTests.cs` |
| 検査機・測定器マスタ/校正管理 | C-20-50-03 | `InspectionDevicesController.cs` `api/inspection-devices`<br>校正の記録は `POST {id}/calibrations`(次回期限は校正周期から自動)/期限接近は `GET expiring?withinDays=` | Masters.cs: InspectionDevice(現在の校正状態)/InspectionDeviceCalibration(実施履歴) | `/masters` `Masters/InspectionDevicesTab.razor` | `Tests/MasterTests.cs` / `MasterCsvTests.cs` |
| 検査項目・基準マスタ | C-10-10 | `InspectionItemsController.cs` `api/inspection-items` | Masters.cs: InspectionItem | `/masters` `Masters/InspectionItemsTab.razor` | `Tests/MasterTests.cs` |
| 検査指示・実績・判定・成績書 | C-20 | `InspectionOrdersController.cs` `api/inspection-orders`(発行・実績・判定の処理は `Api/Services/InspectionService.cs`。実績登録時に**検査機の校正期限を判定**:`InspectionDeviceCalibrationPolicy`) | `Core/Entities/Quality.cs`<br>InspectionOrder / InspectionOrderItem(**発行時点の基準スナップショット**。判定・成績書はこちらを使い、マスタ現在値を参照しない:Spec.md 5.7) / InspectionResult / **InspectionResultCorrection**(訂正前の記録。詳細画面・成績書に表示) | `/inspections` `Inspections.razor`<br>`/inspections/{id}` `InspectionDetail.razor`<br>`/print/inspection/{id}` `Print/InspectionCertificate.razor` | `Tests/QualityTests.cs` |
| 検査項目・基準マスタ | C-10-10 | `InspectionItemsController.cs` `api/inspection-items`<br>対象品目/工程の意味(**「かつ」で組み合わせ、空は問わない**)と登録時の制約は `Api/Policies/InspectionItemPolicy.cs`(単票API・マスタCSV・検査指示の発行で共通) | Masters.cs: InspectionItem | `/masters` `Masters/InspectionItemsTab.razor` | `Tests/MasterTests.cs` |
| 検査指示・実績・判定・成績書 | C-20 | `InspectionOrdersController.cs` `api/inspection-orders`(発行・実績・判定の処理は `Api/Services/InspectionService.cs`。実績登録時に**検査機の校正期限を判定**:`InspectionDeviceCalibrationPolicy`。発行できるロットの状態・判定前の指示の重複は `InspectionLotPolicy`。合否(手の指定は自動判定と食い違えば拒否。訂正も同じ)とサンプリング数(判定の下限)は `InspectionJudgmentPolicy`。取消はロットを**発行前のステータス**へ戻す) | `Core/Entities/Quality.cs`<br>InspectionOrder / InspectionOrderItem(**発行時点の基準スナップショット**。判定・成績書はこちらを使い、マスタ現在値を参照しない:Spec.md 5.7) / InspectionResult / **InspectionResultCorrection**(訂正前の記録。詳細画面・成績書に表示) | `/inspections` `Inspections.razor`<br>`/inspections/{id}` `InspectionDetail.razor`<br>`/print/inspection/{id}` `Print/InspectionCertificate.razor` | `Tests/QualityTests.cs` |
| 不適合・逸脱管理(特採・廃棄・保留) | C-30 / B-40-30 | `NonconformanceController.cs` `api/nonconformances`<br>記録・対応指示・承認と不適合の連鎖は `Api/Services/NonconformanceService.cs` | Quality.cs: NonconformanceReport | `/nonconformances` `Nonconformances.razor` | `Tests/QualityTests.cs` |
| 品質分析(不良理由別・品目別・工程別・**直別**・期間別) | C-40-10 | `QualityAnalysisController.cs` `api/quality/summary` | Execution.cs: ProductionDefect(不良理由別の内訳)<br>ProductionRecord.`ShiftId`(**記録時に固定**。集計で引き直さない) | `/quality-analysis` `QualityAnalysis.razor`<br>`Web/Shared/BarMeter.razor` | `Tests/QualityTests.cs` |
| 不良理由マスタ | C-40-10-01 | `DefectReasonsController.cs` `api/defect-reasons` | Masters.cs: DefectReason | `/masters` `Masters/DefectReasonsTab.razor` | `Tests/MasterTests.cs` / `MasterCsvTests.cs` |
Expand Down
4 changes: 2 additions & 2 deletions docs/masters.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,11 +180,11 @@ MBOMは、実績入力の**バックフラッシュ**(部材の自動消費)
|---|---|
| 検査項目コード / 名称 | 基本情報 |
| 検査種別 | 受入検査/工程内検査/完成品検査/サンプル検査 |
| 対象品目 / 対象工程 | 適用範囲。未指定なら広く適用されます |
| 対象品目 / 対象工程 | 適用範囲。指定した方は一致が必要で、両方指定すると「その品目のその工程」だけに使われます。未指定の方は問いません。対象工程を指定できるのは工程内検査だけで、受入・完成品・サンプル検査は対象品目が必須です |
| 規格値 下限 / 上限 | 測定値の合否をこの範囲で自動判定します |
| 基準値 | 目標値(表示用) |
| 検査方法 | 目視、ノギスなどの記述 |
| サンプリング数 | 参考値 |
| サンプリング数 | 判定に必要な最低サンプル数。この数だけサンプル番号の違う実績がそろうまで総合判定できません(多く測るのは構いません) |

<div class="note">
<p>上限・下限のどちらも設定していない項目は<strong>自動判定できません</strong>。
Expand Down
25 changes: 21 additions & 4 deletions docs/quality.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,21 @@ next_title: 品質保証

発行すると検査指示番号が採番され(`IN20260501-0001`)、**対象ロットの在庫ステータスが「検査待ち」になります**。

<div class="warn">
<p>次のロットには検査指示を発行できません(サンプル検査を除く。サンプル検査はロットを拘束しません)。</p>
<ul>
<li><strong>保留・廃棄予定</strong>のロット。保留の解除は不適合の処置で行います</li>
<li><strong>不良</strong>のロット。ただし<strong>再検査</strong>は発行できます</li>
<li><strong>判定前の検査指示が既にある</strong>ロット。その指示を判定するか取り消してから発行します</li>
</ul>
<p>工程内検査は、取り消した作業指示には発行できません。対象ロットを指定する場合は、その作業指示の品目のロットに限ります。</p>
</div>

<div class="note">
<p><strong>再検査</strong>は、そのロットの直近の判定済みの検査をやり直すものです。検査項目は元の検査から引き継がれ、規格値はいまの基準の版が使われます。
判定済みの検査が無いロットには発行できません。</p>
</div>

<div class="note">
<p><strong>検査項目は自動で選ばれます。</strong> マスタ管理 → 検査項目・基準 に登録された項目のうち、
検査種別・対象品目・対象工程が合致するものが検査指示に組み込まれます。
Expand Down Expand Up @@ -70,7 +85,8 @@ next_title: 品質保証
<ol class="steps">
<li><strong>測定値</strong>を入力します。規格値の範囲と照合して、合否が<strong>自動判定</strong>されます。</li>
<li>数値でない検査は<strong>定性記録</strong>に文字で記入します。</li>
<li>自動判定できない項目(規格値が未設定の項目)は、<strong>判定(手動)</strong>で合格/不合格を選びます。</li>
<li>自動判定できない項目(規格値が未設定の項目)は、<strong>判定(手動)</strong>で合格/不合格を選びます。
測定値と規格値で合否が決まる項目は、手動の判定で変えることはできません(規格外の品を使う場合は、不適合の特採で処置します)。</li>
<li><strong>検査実績を登録</strong>を押します。</li>
</ol>

Expand All @@ -84,7 +100,7 @@ next_title: 品質保証

### 総合判定する

**全検査項目の実績を登録してから** 判定します。
**全検査項目の実績を登録してから** 判定します。サンプリング数が決まっている項目は、その数だけサンプル番号の違う実績がそろっている必要があります。

<ol class="steps">
<li>必要なら<strong>グレード</strong>を入力します(検査結果で出荷先や等級が変わる製品向け。任意)。</li>
Expand Down Expand Up @@ -115,7 +131,8 @@ next_title: 品質保証
誤って発行した検査指示は **検査指示を取消** で取り消せます(承認済み・取消済みは不可)。

<div class="note">
<p>取消すと、その指示のために<strong>検査待ちで拘束していたロットが解放され、正常に戻ります</strong>。
<p>取消すと、その指示のために<strong>検査待ちで拘束していたロットが、発行する前のステータスに戻ります</strong>。
通常は正常に戻りますが、不良ロットの再検査を取り消した場合は不良に戻ります。
判定が済んでいる指示を取り消しても、ロットの現在のステータスはそのままです。</p>
</div>

Expand All @@ -132,7 +149,7 @@ next_title: 品質保証
訂正内容と理由は監査ログに記録されます。

<div class="warn">
<p><strong>承認済みの検査は訂正できません。</strong> また、判定済みの検査を訂正した場合は、
<p><strong>承認済み・取消済みの検査は訂正できません。</strong> また、判定済みの検査を訂正した場合は、
もう一度<strong>総合判定をやり直す</strong>必要があります。</p>
</div>

Expand Down
10 changes: 5 additions & 5 deletions samples/master-csv/12_inspection-items.csv
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Code,Name,TargetProductCode,TargetProcessCode,Type,LowerLimit,UpperLimit,StandardValue,Method,SamplingCount,IsActive
INS-01,ハウジング内径,SF-2000,PR-10,InProcess,49.95,50.05,50,ノギス,5,true
INS-02,ハウジング外観,SF-2000,PR-10,InProcess,,,,目視,3,true
INS-03,鋳造品 受入外観,RM-3001,,Receiving,,,,目視,10,true
INS-04,吐出量測定,FG-1000,PR-40,FinalProduct,19,21,20,流量計,1,true
INS-05,気密試験,FG-1000,PR-40,FinalProduct,,,,加圧0.5MPa 60秒保持,1,true
INS-01,ハウジング内径,SF-2000,PR-10,InProcess,49.95,50.05,50,ノギス,2,true
INS-02,ハウジング外観,SF-2000,PR-10,InProcess,,,,目視,1,true
INS-03,鋳造品 受入外観,RM-3001,,Receiving,,,,目視,1,true
INS-04,吐出量測定,FG-1000,,FinalProduct,19,21,20,流量計,1,true
INS-05,気密試験,FG-1000,,FinalProduct,,,,加圧0.5MPa 60秒保持,1,true
INS-06,保管サンプル外観,FG-1000,,Sample,,,,目視,1,true
10 changes: 5 additions & 5 deletions src/MesApp.Api/Controllers/InspectionItemsController.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using MesApp.Api.Localization;
using MesApp.Api.Policies;
using MesApp.Core.Abstractions;
using MesApp.Core.Contracts.Masters;
using MesApp.Core.Entities;
Expand All @@ -12,6 +13,7 @@ namespace MesApp.Api.Controllers;
/// <summary>
/// 検査項目・基準マスタ(Spec.md 5.1 InspectionItem。C-10-10)。
/// 基準の更新(C-10-10-03)では版数を自動インクリメントする。
/// 対象品目・対象工程の意味と組み合わせの制約は <see cref="InspectionItemPolicy"/>。
/// </summary>
[ApiController]
[Route("api/inspection-items")]
Expand Down Expand Up @@ -134,11 +136,9 @@ public Task<IActionResult> Deactivate(int id, CancellationToken ct) =>
{
return ApiText.T("存在しない対象工程IDです。");
}
if (request.LowerLimit is not null && request.UpperLimit is not null && request.LowerLimit > request.UpperLimit)
{
return ApiText.T("規格値の下限が上限を超えています。");
}
return null;
// 判定条件はマスタCSV取込と共通(片方だけ通る状態を作らない。Spec.md 7.4)
return InspectionItemPolicy.CheckDefinition(request.Type, request.TargetProductId, request.TargetProcessId,
request.LowerLimit, request.UpperLimit, request.StandardValue);
}

/// <summary>
Expand Down
39 changes: 39 additions & 0 deletions src/MesApp.Api/Localization/ApiText.en.resx
Original file line number Diff line number Diff line change
Expand Up @@ -2016,4 +2016,43 @@
<data name="工程管理項目 '{0}' は品目 {1} の工順から紐付けられているため無効化できません。" xml:space="preserve">
<value>Control item '{0}' cannot be deactivated because it is linked from the routing of item {1}.</value>
</data>
<data name="基準値が規格値の範囲の外にあります。" xml:space="preserve">
<value>The standard value is outside the specification limits.</value>
</data>
<data name="工程内検査の基準には対象品目か対象工程を指定してください。" xml:space="preserve">
<value>Specify a target item or a target process for an in-process inspection criterion.</value>
</data>
<data name="対象工程を指定できるのは工程内検査の基準だけです。" xml:space="preserve">
<value>Only in-process inspection criteria can specify a target process.</value>
</data>
<data name="受入・完成品・サンプル検査の基準には対象品目を指定してください。" xml:space="preserve">
<value>Specify a target item for receiving, final product, and sample inspection criteria.</value>
</data>
<data name="検査項目 '{0}' はこの検査に使えません(無効、検査種別が違う、または対象の品目・工程が合いません)。" xml:space="preserve">
<value>Inspection item '{0}' cannot be used for this inspection (it is inactive, has a different inspection type, or its target item or process does not match).</value>
</data>
<data name="ロット '{0}' には判定前の検査指示 {1} があります。判定するか取り消してから発行してください。" xml:space="preserve">
<value>Lot '{0}' already has inspection order {1} awaiting judgment. Judge or cancel it before issuing another.</value>
</data>
<data name="在庫ステータスが「{0}」のロット '{1}' には検査指示を発行できません(不良ロットは再検査のみ。保留は不適合の処置で解除してください)。" xml:space="preserve">
<value>An inspection order cannot be issued for lot '{1}' with stock status "{0}" (defective lots allow reinspection only; release holds through nonconformance disposition).</value>
</data>
<data name="検査項目 '{0}' の測定値 {1} は規格値による判定が「{2}」です。判定を手で変えることはできません(規格外の品を使う場合は不適合の特採で処置してください)。" xml:space="preserve">
<value>The measured value {1} for inspection item '{0}' is judged "{2}" by the specification limits. The judgment cannot be changed manually (use a nonconformance concession to use out-of-spec products).</value>
</data>
<data name="検査項目 '{0}' はサンプリング数 {1} に対して実績が {2} サンプルです。サンプリング数以上の実績を登録してから判定してください。" xml:space="preserve">
<value>Inspection item '{0}' requires {1} samples but has results for {2}. Register results for at least the sampling count before judging.</value>
</data>
<data name="取消済みの作業指示 {0} には工程内検査を発行できません。" xml:space="preserve">
<value>An in-process inspection cannot be issued for canceled work order {0}.</value>
</data>
<data name="ロット '{0}' は作業指示 {1} の品目のロットではありません。" xml:space="preserve">
<value>Lot '{0}' is not a lot of the item of work order {1}.</value>
</data>
<data name="ロット '{0}' には判定済みの検査が無いため再検査できません。" xml:space="preserve">
<value>Lot '{0}' cannot be reinspected because it has no judged inspection.</value>
</data>
<data name="取消済みの検査は訂正できません。" xml:space="preserve">
<value>A canceled inspection cannot be corrected.</value>
</data>
</root>
Loading
Loading